/** * [ref](core 5.50 [ref] 提货件)—— mid-turn MCP 撤销台账:`RunnerDeps.mcpRevocations` 席的宿主实现。 * * 语义(与 core 契约对表,types.d.ts `RunnerDeps.mcpRevocations` 注): * · 权威单点在宿主 —— core 每次 MCP dispatch 前**同步**探 `isRevoked(serverName)`,从不缓存答案。 * · 本台账记「中心**曾发布为 enabled、后从 enabled 集移除**」的服务器名。MCP mount 是 boot-baked * (`resolveMcpServers` 只在启动期跑),所以**删除向**在 5.50 前只能等 restart 才生效——这正是 * [ref] 要消的窗:治理面最要紧的动作(撤销一条对外通道)现在即时生效,restart 信号的 * 删除向豁免见 `restart-signal.ts` 的 mcp 特判(`mcpRevocationLive` 前提,fail-closed:席没接线 * 的部署保持旧的 restart 语义)。 * · **重现恢复是指纹判,不是名字判**(codex F1,confirmed):被撤的名字回到 enabled 集时,只有当 * 它的条目指纹与 **baseline(boot mount 真身)逐字相同**才解除撤销——重加同名**不同址/不同配置** * 的条目,复活的会是 boot-frozen 的旧 mount(新配置要 restart 才装上),那是把已撤下的旧端点在 * restart 窗口内重新放行(fail-open)。指纹不匹配 ⇒ 名字保持 revoked 直到 restart 收敛。 * · **baseline 只由 boot bake 拍铸**(codex F2,confirmed):它必须是「实际 mount 的集合」——迟到 * boot 采用/refresh 拍的候选集都不是 mount 真身,不得铸 baseline。`hasBaseline()` 是 restart 豁免 * 的第二道门(boot 超时形:mount=env 集,中心撤销语义整个不适用,豁免必须关死走旧 restart 语义)。 * · **域缺席(null)不动**:中心停止发布 mcp 域 ≠ 逐服务器撤销指令(fingerprint 上 null↔非 null * 自会签 restart);域在场但 `servers: []` 是明确的「清空」指令 ⇒ 全撤。 * · baseline 之后新增再删除的名字照 revoke(它从未 mount,isRevoked=true 无 mount 可拒=无害, * fail-closed 向);这类名字重加时因无 baseline 指纹**不解除**——同样无害,restart 收敛。 * * 纯内存、同步、无 I/O —— 每副本各自持有(mount 也是副本各自的,天然同界)。进程重启即清零: * 重启后按新配置 mount,台账语义自洽。 */ /** `RunnerDeps.mcpRevocations` 的结构超集(isRevoked 同签名,core 结构类型直接受用)。 */ export interface McpRevocationLedger { /** core 每次 MCP dispatch 前同步探询;true = 该服务器已被中心从 enabled 集移除(或改形候 restart)。 */ isRevoked(serverName: string): boolean; /** 配置拍喂当拍 ENABLED 服务器条目(name→指纹,插入序=发布序);`null` = mcp 域未发布(不动)。 * `isBaseline: true` 只允许 boot bake 拍传——铸 mount 真身;已铸后再传按普通拍处理(幂等防误用)。 */ applyEnabledEntries(entries: ReadonlyMap | null, opts?: { isBaseline?: boolean; }): void; /** true = boot bake 拍真铸过 baseline(mount 真身在案)。restart 豁免的第二道门:false 时豁免必须 * 关死(boot 超时/纯 env 形:中心集≠mount 集,撤销腿承接不了删除)。 */ hasBaseline(): boolean; /** 诊断投影:当前被撤销名单(字典序)。 */ view(): { revoked: string[]; }; } export declare function createMcpRevocationLedger(onChange?: (ev: { revoked: string[]; restored: string[]; }) => void): McpRevocationLedger; /** 一拍 EffectiveConfig 的 ENABLED MCP 服务器条目表(`resolveMcpServers` 同判据:`enabled !== false`; * 值=整条目的 key 排序 JSON 指纹,Map 插入序=发布序);mcp 域缺席 ⇒ `null`(台账不动)。 * 指纹序列化器 = restart-signal 的 `stableStringify`([ref] 2026-08-31 起同源:此前本文件持一份**逐字相同**的 * 私有复刻 `fingerprintOf`,两份在全部输入上字节恒等,合并零行为差,golden 钉 test/canonical-json-golden.test.ts)。 * 两处指纹仍只在各自域内自比、不跨域比对——同源只是去掉一份多余的复刻,不引入跨域约束;也**不**改用 * `src/canonical-json.ts`(undefined 值键语义不同,见 restart-signal.ts 该函数顶注)。 */ export declare function enabledMcpEntries(mcp: { servers: Array<{ name: string; enabled?: boolean; }>; } | undefined): ReadonlyMap | null; //# sourceMappingURL=mcp-revocation.d.ts.map