/** * [ref](core 5.60.0)—— `McpServerSpec.contentOrigin` 的**闭词表单一属主**。 * * core 给 MCP 条目开了一个**内容出处声明**座位:一台 server 的整套工具的结果算 `"local"`(部署自己 * 写的)/ `"execution"`(执行环境产物,`execIsExternalContent` 仍能收紧)/ `"external"`(第三方内容, * 显式 PIN —— 它同时**取消** `trustedTools` 的按名豁免)。缺席 = pre-378 逐字节现行为(协议命名空间 * 一律判 external,fail-closed)。它只影响**记忆写治理**(会话污染标记),core 明写「no gate/policy/ * roster effect」——与审批门、角色表、工具白名单都无关。 * * ## 为什么值得一个自己的模块 * 本仓有**两个**平面会拿到这个键(部署面 center 下发 / 请求面 body),两边都要判「词在不在表里」。 * 一条安全轴上的判据有两份实现,就是其中一份将来漂开的方式(`mcpInjectionHonored` 顶注里那句 * 「判据只有一只谓词,不许两处各判一半」的同款理由)。⇒ 表与谓词都只有这一份。 * * ## 闭集纪律(CLAUDE.md:安全轴上未知词必须是**编译**错误) * 下面两条 `AssertNever` 是**双向**钉: * · core 给 `ToolContentOrigin` 加词而本表没跟 ⇒ `_ContentOriginCovers` 残余非 never ⇒ tsc 红; * · 本表写错/写多一个词 ⇒ `_ContentOriginNoStray` 残余非 never ⇒ tsc 红。 * 单向钉挡不住第二种(手滑把 `"local"` 打成 `"locale"` 只会让一个合法声明被静默拒),所以两条都要。 */ import type { ToolContentOrigin } from "@sema-agent/core"; /** 编译期断言:`T` 必须收敛到 `never`(有残余 ⇒ tsc 红)。 */ type AssertNever = T; /** core `ToolContentOrigin` 的执法副本 —— **唯一**一份(见模块头注)。 */ export declare const CONTENT_ORIGIN_WORDS: readonly ["local", "execution", "external"]; type ContentOriginWord = (typeof CONTENT_ORIGIN_WORDS)[number]; type _ContentOriginCovers = AssertNever>; type _ContentOriginNoStray = AssertNever>; /** (占位使用,防 noUnusedLocals;类型别名零运行时。) */ export type ContentOriginWordTableGuards = [_ContentOriginCovers, _ContentOriginNoStray]; /** * 词表内?—— 两个平面共用的**那一只**谓词。 * * 🔴 严判:非串(数字 / 布尔 / null / 对象)与大小写不符(`"LOCAL"`)一律**不在词表内**。core 的 * `ToolContentOrigin` 是字面量联合,不做规范化;本层替它「宽容一下」等于自造第二份值域语义,而这条 * 轴上宽容的方向恰好是**放宽信任**(把一个写坏的声明当成 `"local"` 读)。 */ export declare function isContentOriginWord(v: unknown): v is ToolContentOrigin; /** 坏值的**可打印**摘要(进 400 文案 / warn 元数据)——中和 + 截长,绝不把任意长度的调用方输入原样回显。 */ export declare function describeBadContentOrigin(v: unknown): string; export {}; //# sourceMappingURL=mcp-content-origin.d.ts.map