@sema-agent/client-core 0.70.2 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,10 +32,10 @@
32
32
  * ── `mcp[]` 条目与 `wiring_manifest` 第三段**同一只读器**─────────────────────────────────────
33
33
  * `lastLegMcp.mcp[]` 是该腿 `wiring_manifest.mcp[]` 的逐字回放(server S-297),本视图直接调
34
34
  * {@link projectMcpSection} —— 同一形、同一判据、同一缺席律;三端渲这两处用同一个
35
- * {@link WiringManifestMcpEntry},不会出现「活体腿一种形、账本回放另一种形」。
35
+ * {@link WiringManifestMcpEntryView},不会出现「活体腿一种形、账本回放另一种形」。
36
36
  */
37
37
  import type { AgentClient } from '@sema-agent/sdk';
38
- import { type WiringManifestMcpEntry } from './adapter/downstream/eventToSdkMessage.js';
38
+ import { type WiringManifestMcpEntryView } from './adapter/downstream/eventToSdkMessage.js';
39
39
  /** 面板 `servers[]` 一行(sdk `McpServerStatus` 的窄读;开集键不透传,逐键挑)。 */
40
40
  export interface McpPanelServerView {
41
41
  /** 配置名(引擎产的标识,非用户内容)。 */
@@ -59,7 +59,7 @@ export interface McpPanelLastLegView {
59
59
  /** 写账本副本的钟(ISO;**不是** materialize 时刻 `asOf`,两者不比)。 */
60
60
  at: string;
61
61
  /** 该腿 `wiring_manifest.mcp[]` 逐字 —— 与活体腿的第三段同一只读器、同一形。 */
62
- mcp: WiringManifestMcpEntry[];
62
+ mcp: WiringManifestMcpEntryView[];
63
63
  }
64
64
  /** `GET /v1/sessions/:id/mcp` 的读视图(缺席语义见文件顶注)。 */
65
65
  export interface McpPanelView {
@@ -107,3 +107,16 @@ export declare function fetchMcpPanel(client: Pick<AgentClient, 'sessions'>, ses
107
107
  export declare function mcpPanelLastLegDetail(view: McpPanelView | undefined, opts: {
108
108
  reachable: boolean;
109
109
  }): string;
110
+ /**
111
+ * CC-19(0.71.0;cli L-335 归包):**引擎侧 MCP 在场三值**,只从本包的面板视图求(不自拼第二份判据、不发第二次请求)。
112
+ * · `'present'`:`servers[]` 非空(这台部署此刻 materialize 出的引擎侧连接有行)/ `lastLegMcp` 在场(最近一条腿申报过名册)/
113
+ * `lastLegMcpUnreadable`(引擎送了一份读不懂的 = 有东西)/ `degraded`(materialize 超时,`servers: []` 此时**不等于**没有);
114
+ * · `'absent'`:视图读得出 ∧ 以上全不成立 = **正面事实**「引擎侧没有 MCP」;
115
+ * · `'unknown'`:`view === undefined`(传输失败 / 体读不出 / 空 sessionId,`fetchMcpPanel` 刻意三形同形)—— 本包**说不出**。
116
+ * 🔴 宿主义务:`'unknown'` **不许**渲成 CC 那句「一台 MCP 都没配」(「不知道」不渲成 0);有引擎接线的端在 `'unknown'` 上
117
+ * 开面板,让 {@link mcpPanelLastLegDetail} 铸的「未观测」那一句自己说话;CC 逐字那句只在**壳侧零行 ∧ `'absent'`** 时出。
118
+ * 🔴 为什么不能拿 `mcpPanelLastLegDetail` 有没有出一行当在场判据:它对**任何**视图都出一句(在场 / 未观测 / 不报 / 读不出),
119
+ * 老引擎与新会话同样出「不报」—— 拿行数判在场恒真。在场只能问视图本身的键。
120
+ */
121
+ export type McpEngineLegPresence = 'present' | 'absent' | 'unknown';
122
+ export declare function mcpEngineLegPresence(view: McpPanelView | undefined): McpEngineLegPresence;
package/dist/mcpPanel.js CHANGED
@@ -127,3 +127,16 @@ export function mcpPanelLastLegDetail(view, opts) {
127
127
  */
128
128
  const _mcpPanelShapePin = (p) => p;
129
129
  void _mcpPanelShapePin;
130
+ export function mcpEngineLegPresence(view) {
131
+ if (view === undefined)
132
+ return 'unknown';
133
+ if (view.servers.length > 0)
134
+ return 'present';
135
+ if (view.lastLegMcp !== undefined)
136
+ return 'present';
137
+ if (view.lastLegMcpUnreadable === true)
138
+ return 'present';
139
+ if (view.degraded === true)
140
+ return 'present';
141
+ return 'absent';
142
+ }
@@ -49,7 +49,7 @@ export interface McpConfigLike {
49
49
  headers?: Record<string, string>;
50
50
  allowTools?: string[];
51
51
  /**
52
- * **透明键**(settings-schema 1.9.0 `McpServerSpec.toolFaces`,`z.unknown()`;core 7.8.0 design/388
52
+ * **透明键**(settings-schema 1.9.0 引入 `McpServerSpec.toolFaces`,`z.unknown()`,2.0.0 同形〔2026-09-16 核 dist/types.d.ts〕;core 7.8.0 design/388
53
53
  * 片 1 F7 / server ≥7.66.0)—— 这台 server 的 per-tool 面覆盖层,键 = 工具**裸名**,值形
54
54
  * `{ family?, pathTarget?, renderHints?, ruleFace? }`(表的属主是 core,见 sdk `McpToolFace`)。
55
55
  *
@@ -22,7 +22,7 @@
22
22
  * ⇒ 与 `engineNoticeCodes.ts` / `autoModeUnavailable.ts` 同一条处置:**按真字节镜像,把代价交给
23
23
  * 门** —— `run-model-capability-probe-test.mjs` 的 A 段对实装 devDep core 双向等值对账,
24
24
  * 上游加一个方言这里当天先红。
25
- * ⚠️ **settings-schema 那边取不到这张表,别去那儿找**:`ModelEntry.compat` 在 1.10.0 上是
25
+ * ⚠️ **settings-schema 那边取不到这张表,别去那儿找**:`ModelEntry.compat` 在 1.10.0 引入、2.0.0 仍是(2026-09-16 核 dist/types.d.ts)
26
26
  * **parse-transparent 的 `z.unknown()`**,它的 JSDoc 逐字写着「the SHAPE and the VOCABULARY …
27
27
  * are the consuming side's single point — this package deliberately does NOT restate that table」。
28
28
  * 那一格刻意不复述词表,所以「从 settings-schema import 闭集」这条路在型面上不存在。
@@ -22,7 +22,7 @@
22
22
  * ⇒ 与 `engineNoticeCodes.ts` / `autoModeUnavailable.ts` 同一条处置:**按真字节镜像,把代价交给
23
23
  * 门** —— `run-model-capability-probe-test.mjs` 的 A 段对实装 devDep core 双向等值对账,
24
24
  * 上游加一个方言这里当天先红。
25
- * ⚠️ **settings-schema 那边取不到这张表,别去那儿找**:`ModelEntry.compat` 在 1.10.0 上是
25
+ * ⚠️ **settings-schema 那边取不到这张表,别去那儿找**:`ModelEntry.compat` 在 1.10.0 引入、2.0.0 仍是(2026-09-16 核 dist/types.d.ts)
26
26
  * **parse-transparent 的 `z.unknown()`**,它的 JSDoc 逐字写着「the SHAPE and the VOCABULARY …
27
27
  * are the consuming side's single point — this package deliberately does NOT restate that table」。
28
28
  * 那一格刻意不复述词表,所以「从 settings-schema import 闭集」这条路在型面上不存在。
package/dist/seam.d.ts CHANGED
@@ -9,7 +9,8 @@
9
9
  import type { ModelUsage, SDKMessage } from '@sema-agent/agent-types';
10
10
  import type { EngineTurnUsage } from './adapter/downstream/turnUsageToModelUsage.js';
11
11
  import type { RunCostReconcile } from './adapter/downstream/terminalToSdkResult.js';
12
- import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntry } from './adapter/downstream/eventToSdkMessage.js';
12
+ import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, ContextUsageSectionView } from './adapter/downstream/eventToSdkMessage.js';
13
+ import type { ToolRosterView, ToolRosterDeltaView } from './toolRoster.js';
13
14
  /**
14
15
  * `AbortSignal` 的结构型(B3 扩容,SEAM-GAP-4)。
15
16
  *
@@ -533,7 +534,7 @@ export type ChromeEvent = {
533
534
  * ⚠️ **只有 live 腿有本帧**(server 7.69.0 亲读:durable/bg 腿把它喂给 rewind 锚而不入账本)
534
535
  * ⇒ replay/resume 上映射表是空的;那时正解是**不画分割线**,不是回退成「画在最后一条」。
535
536
  */
536
- | MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent
537
+ | MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | ToolDisclosureChromeEvent | ToolProgressChromeEvent | ToolRosterDeltaChromeEvent | ContextUsageChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent
537
538
  /**
538
539
  * B-078 / L-208(0.65.0):design/172 流内审批协议的**两条帧**。修前它们在标准管线上落
539
540
  * `dropped('unsupported_arm')`,壳自己另接一份 ⇒ 只走包管线的宿主(desktop/web)拿不到
@@ -585,7 +586,13 @@ export interface WiringManifestChromeEvent {
585
586
  * 🔴 **`errorCode` 按开集分支**(十词 + `http_<status>` 形),`switch` 必须带 `default` 臂;
586
587
  * 远端错误**自由文本**(`error`)上游就不投,宿主也拿不到 —— 可操作的因由在 `errorCode`。
587
588
  */
588
- mcp?: readonly WiringManifestMcpEntry[];
589
+ mcp?: readonly WiringManifestMcpEntryView[];
590
+ /** CC-08 ①(0.71.0):第四段 —— 这条腿开跑那一刻的工具名册快照(`toolRoster.ts` 读器;之后的变更走 `tool_roster_delta`)。 */
591
+ tools?: ToolRosterView;
592
+ /** CC-08 ①:第五段 —— hook 族(family / owner / observational?)。 */
593
+ hooks?: readonly WiringManifestHookEntryView[];
594
+ /** CC-08 ①:第六段 —— LSP 接缝(在场 iff 解析出了 manager 席;`mounted` 与 `lane` 禁合读)。 */
595
+ lsp?: WiringManifestLspSeamView;
589
596
  /** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
590
597
  eventId?: string;
591
598
  }
@@ -665,6 +672,11 @@ export interface WiringManifestChromeEvent {
665
672
  * 「半段已被 idle-flush 提交」那一形由 `committedPrefixLen` / `committedPrefixDiverged` 如实
666
673
  * 交代,不是把启发式悄悄换掉了。
667
674
  */
675
+ /** {@link TextSegmentEndChromeEvent.committedRows} 的一行:该 uuid 的文本行替换后应有的正文(端逐行写回)。 */
676
+ export interface TextSegmentCommittedRow {
677
+ uuid: string;
678
+ text: string;
679
+ }
668
680
  export interface TextSegmentEndChromeEvent {
669
681
  kind: 'text_segment_end';
670
682
  laneProof: LaneProof;
@@ -704,6 +716,21 @@ export interface TextSegmentEndChromeEvent {
704
716
  * 恒在场(本包每条 leader 段边界都带);它**不是** wire 键 —— `eventId` 才是引擎铸的事件身份。
705
717
  */
706
718
  segmentId: string;
719
+ /**
720
+ * CC-16(0.71.0):本段身份窗口里、段边界**之前**已提交的文本行 uuid(按序;与 `ThinkingSegmentEndChromeEvent.committedUuids`
721
+ * 同律)。`[]` = 本包判定本窗口零已提交行(在场但空);整键缺席 = 本包零经手(形 f),说不出。
722
+ * 端义务:`committedPrefixDiverged` ⇒ **按 {@link committedRows} 逐行写回**(包已算好每行最终正文;别拿 `content` 整行换首行);
723
+ * 不再自己数窗口里过境的行、不再对多行段整发放弃。常态段的定稿行在轮换之后才提交 ⇒ 不在列(它的正文已是权威)。
724
+ */
725
+ committedUuids?: readonly string[];
726
+ /** 末条兼容位;零行时缺席。 */
727
+ committedUuid?: string;
728
+ /**
729
+ * CC-16(0.71.0):端要**写回**的最终正文,按行(与 `committedUuids` 同序)。只在 `committedPrefixDiverged` ∧ 本窗口有已提交行时在场:
730
+ * 首行 = 前段定稿前缀 + `content`,其余行 `''`。🔴 端按行写、零算术 —— 别自己拿 `content` 整行换首行:提交行可能是
731
+ * 「上一段已封存的定稿 + 本段那截」一条(封存只换字节不切消息),整行换会把上一段的权威正文一起删。
732
+ */
733
+ committedRows?: readonly TextSegmentCommittedRow[];
707
734
  /** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
708
735
  eventId?: string;
709
736
  }
@@ -731,6 +758,74 @@ export interface TextSegmentEndChromeEvent {
731
758
  * ③ 三键全缺席 ⇒ 照旧只当对账/定界,拿 `content` 再渲一行 = 同一段上屏两遍。
732
759
  * ④ 缺席 ≠ 段没结束:只有会报块结束的引擎才发它;按整条流判有没有边界帧。
733
760
  */
761
+ /**
762
+ * CC-08(0.71.0;sdk 9.6.0 `tool_disclosure`,core design/393 S3 第二缝):这条腿的工具**名字占位普查**。
763
+ * additive 臂(`required: false`):不接 = 看不见普查,不属「已发生的行为丢失」。
764
+ */
765
+ /**
766
+ * CC-08 ①(0.71.0;sdk `tool_roster_delta`,server ≥7.70.0 LIVE only):运行期工具名册**增量**。收到 = 收到一份完整名册
767
+ * (server 判不出形整帧不发);`fromDigest` 对不上不是拒绝,记 skew 后整只替换;durable/resume 不落账 ⇒ 重连按
768
+ * `wiring_manifest.tools` 快照重同步。additive 臂(`required: false`)。
769
+ */
770
+ export interface ToolRosterDeltaChromeEvent {
771
+ kind: 'tool_roster_delta';
772
+ laneProof: LaneProof;
773
+ /** 已窄读的增量;宿主拿它喂 `applyToolRosterDelta`(与手上名册比 digest)。 */
774
+ delta: ToolRosterDeltaView;
775
+ eventId?: string;
776
+ }
777
+ /**
778
+ * CC-08 ③(0.71.0;sdk `context_usage` + `sections` core 7.18.0 #790):每个压缩边界报一次,宿主按**最后一条**取当前值。
779
+ * 🔴 `usedTokens > compactAtTokens` 就是引擎自己喂 shouldCompact 的谓词,别重算;`windowTokens` 是 autocompact 窗不是模型上下文大小;
780
+ * 🔴 `sections[].tokens` 与 `usedTokens` **不是同一坐标系,禁相减**、禁拿一段比 `compactAtTokens`;`sections` 整键缺席 = 这条腿没装配出段 IR,不是各段为零。
781
+ */
782
+ export interface ContextUsageChromeEvent {
783
+ kind: 'context_usage';
784
+ laneProof: LaneProof;
785
+ usedTokens?: number;
786
+ windowTokens?: number;
787
+ compactAtTokens?: number;
788
+ sections?: readonly ContextUsageSectionView[];
789
+ eventId?: string;
790
+ }
791
+ export interface ToolDisclosureChromeEvent {
792
+ kind: 'tool_disclosure';
793
+ laneProof: LaneProof;
794
+ /** 哪条策略判的:core 闭三词 `always` / `never` / `auto`,**按开集读**(core 加一档要能穿过你的 default 臂)。 */
795
+ policy: string;
796
+ /** `auto` 档下候选集必须够到的窗口百分比。🔴 缺席 = 两档下根本没查过阈值,**不是**默认百分比。 */
797
+ thresholdPercent?: number;
798
+ /** 这条腿上每一个以名字占位的工具名(prepare 期冻结,已排序)。**全量快照:整只替换**;`[]` = 普查坏到只剩空壳。 */
799
+ deferred: readonly string[];
800
+ /** 此刻已被激活的延迟工具名(引擎当下状态;已排序;恒 ⊆ deferred)。**全量快照:整只替换**。 */
801
+ activated: readonly string[];
802
+ /** core 铸的事件身份;wire 未必带 ⇒ 缺席时本键不在场。 */
803
+ eventId?: string;
804
+ }
805
+ /**
806
+ * CC-08(0.71.0;sdk 9.6.0 `tool_progress`;DV-741 clay C-R50 裁「一帧两拍」入 divergence 册,本包按裁定形投):
807
+ * 一只**仍在跑**的工具调用的进度 tick。Bash 类每 ≥1 s 一拍带输出尾巴三键;其他工具 30 s 一拍只带 `elapsedSeconds`。
808
+ * additive 臂(`required: false`)。
809
+ */
810
+ export interface ToolProgressChromeEvent {
811
+ kind: 'tool_progress';
812
+ laneProof: LaneProof;
813
+ /** 与它自己的 `tool_start` / `tool_end` join 得上的 id。 */
814
+ toolCallId: string;
815
+ /** `tool_start` 的值逐字同源。 */
816
+ toolName: string;
817
+ /** 已经跑了多少整秒(向下取整、跨帧单调、一次调用一个原点)。🔴 **缺席不是 0**;🔴 不等于 `tool_end` 的 duration。 */
818
+ elapsedSeconds?: number;
819
+ /** 命令至今写出来的尾巴(stdout/stderr 交错,引擎按尾部行数封顶)—— 一块活面板,不是日志。
820
+ * 🔴 **UNTRUSTED RAW**(与 `tool_end.output` 同类;server 已脱敏一次):宿主可再封顶展示,**绝不**回喂模型。 */
821
+ output?: string;
822
+ /** 至今观察到的换行数(≥ 尾巴自己的行数)。只在 `output` 在场时铸。 */
823
+ totalLines?: number;
824
+ /** 至今观察到的字节数(尾巴封顶之前计)。只在 `output` 在场时铸。 */
825
+ totalBytes?: number;
826
+ /** core 铸的事件身份;wire 未必带 ⇒ 缺席时本键不在场。 */
827
+ eventId?: string;
828
+ }
734
829
  export interface ThinkingSegmentEndChromeEvent {
735
830
  kind: 'thinking_segment_end';
736
831
  laneProof: LaneProof;
package/dist/seam.js CHANGED
@@ -78,6 +78,28 @@ const CHROME_ARM_TABLE = {
78
78
  required: false,
79
79
  duty: '可选:渲引擎通告(按 code+detail,message 仅 fallback;未知 code 也必须渲不许丢;durable 重放按 eventId 幂等;harvest 的 moved/escalated 并列呈现绝不相减)',
80
80
  },
81
+ tool_roster_delta: {
82
+ required: false,
83
+ duty: 'CC-08(0.71.0):运行期名册增量。拿 `delta` 喂 `applyToolRosterDelta` 与手上那份比 digest:对不上记一次 skew 后**整只替换**(不是拒绝);' +
84
+ '本臂 LIVE only,重连后按 `wiring_manifest.tools` 快照重同步,别等补发的 delta。不接 = 名册停在快照,不属行为丢失。',
85
+ },
86
+ context_usage: {
87
+ required: false,
88
+ duty: 'CC-08(0.71.0):每个压缩边界一条,按**最后一条**取当前值;`usedTokens > compactAtTokens` 是引擎的 shouldCompact 谓词,别重算;`windowTokens` 是 autocompact 窗,' +
89
+ '别渲成模型上下文大小;🔴 `sections[].tokens` 与 `usedTokens` 不同坐标系,**禁相减**、禁拿一段比 `compactAtTokens`;`sections` 整键缺席 = 没装配出段 IR,不是各段为零。',
90
+ },
91
+ tool_disclosure: {
92
+ required: false,
93
+ duty: 'CC-08(0.71.0):这条腿的工具名字占位普查。`deferred` / `activated` 都是**全量快照,整只替换**(不做增量合并);' +
94
+ '`policy` 按开集读;`thresholdPercent` 缺席 = 两档下没查过阈值,**不是**默认百分比,别拿一个编出来的默认值渲成一条真的阈值;' +
95
+ '`[]` 的 deferred = 普查坏到只剩空壳,按「没有可用普查」处置。不接 = 看不见普查,不属行为丢失。',
96
+ },
97
+ tool_progress: {
98
+ required: false,
99
+ duty: 'CC-08(0.71.0,C-R50 一帧两拍):按 `toolCallId` 挂到那张工具卡上;`elapsedSeconds` 缺席不是 0、不等于 tool_end 的 duration;' +
100
+ '`output` 在场 = 命令尾巴窗口(活面板,不是日志;`totalLines`/`totalBytes` 与它同进同退),🔴 它是 UNTRUSTED RAW,可再封顶展示、**绝不回喂**模型;' +
101
+ '子代工具的进度不在这条臂上(三键断闸),fleet 面板另有口。不接 = 看不见进度,不属行为丢失。',
102
+ },
81
103
  thinking_segment_end: {
82
104
  // CC-02(0.68.3):与 text_segment_end 同一类目的后果 —— server 7.77.0 起不接 = 未脱敏的推理字节留在
83
105
  // 本地转录里(b2 形上那条明文思考行已经渲过 = 已发生的行为)⇒ `required: true`,理由同上臂。
@@ -133,7 +155,7 @@ const CHROME_ARM_TABLE = {
133
155
  '🔴 **单位 = JS 字符串长度(UTF-16 代码单元),不是 UTF-8 字节、也不是几条消息**' +
134
156
  '(按 UTF-8 字节截会在非 ASCII 正文上截错位置把凭据留在屏上;按消息丢会连合并在同一条消息里的上一段定稿一起删掉),' +
135
157
  '照抄 `已committed正文.slice(0, 长度 - committedPrefixLen) + content`;按**增量拼文**计长、不是 content 上的偏移;④三键全缺席 ⇒ 照旧只当对账/定界,拿 content 再渲一行 = 同一段上屏两遍;⑤`segmentId`(恒在场)= 段身份,与本段已过境的 committed 文本行顶层 `_sema_segment_id` 同值 —— 换掉已提交那截时认行的钥匙是**两把**:行 uuid ∧ 段身份(按字节相等找行会被同后缀的独立行冒充)。' +
136
- '🔴 缺席只表示「没报」,绝不等于「段没结束」——要退回自家启发式必须按整条流判、不按单帧判',
158
+ '🔴 缺席只表示「没报」,绝不等于「段没结束」——要退回自家启发式必须按整条流判、不按单帧判;⑥`committedUuids[]`(0.71.0 起,在场 = 本窗口已提交行按序、`[]` = 零行、整键缺席 = 本包说不出):`committedPrefixDiverged` ⇒ **按 `committedRows[]` 逐行写回正文**(包已算好:首行 = 前段定稿前缀 + content、其余行空;别整行换首行,提交行可能带上一段定稿),端不再自己数窗口里过境的行,也不再对多行段整发放弃;`committedUuid` = 末条兼容位。',
137
159
  },
138
160
  };
139
161
  /**
@@ -211,4 +211,25 @@ export interface ToolRosterDeltaSummary {
211
211
  * 🔴 帧本身判不出形 => **什么都没发生**:原样交回入参那一份(不清空 —— 清空会把一次读不懂的帧
212
212
  * 变成一次「所有工具都没挂」)。
213
213
  */
214
+ /** CC-08(0.71.0):一帧 `tool_roster_delta` 的**视图**(不应用、不比对 digest —— 那是持名册的宿主的事)。 */
215
+ export interface ToolRosterDeltaView {
216
+ /** 这一帧假定消费端手上那份名册的 digest。对不上 = 记 skew 后整只替换,不是拒绝。 */
217
+ fromDigest: string;
218
+ /** 变更**之后**的整只名册(位置信息一律从它读)。 */
219
+ roster: ToolRosterView;
220
+ /** 三个两两不相交的名字列表;读不出(半张名单)⇒ 整键缺席,名册照交。 */
221
+ summary?: ToolRosterSummaryView;
222
+ }
223
+ /** CC-08(0.71.0):`tool_roster_delta.summary` —— 三个两两不相交的名字列表(`changed` 里那个名字的新行在 `roster` 里)。 */
224
+ export interface ToolRosterSummaryView {
225
+ added: readonly string[];
226
+ removed: readonly string[];
227
+ changed: readonly string[];
228
+ }
229
+ /**
230
+ * CC-08(0.71.0):`tool_roster_delta.delta` → 视图;`fromDigest` 非空串 ∧ `roster` 读得出才成形,否则 `undefined`
231
+ * (server 判不出 core 的形就整帧不发,所以本层读不出 = 坏帧,由投影口报 malformed)。
232
+ * 宿主拿它喂 {@link applyToolRosterDelta}(那只吃 raw,这里给的是已窄读的同形;两只读法同源 `readRoster`)。
233
+ */
234
+ export declare function projectToolRosterDelta(delta: unknown): ToolRosterDeltaView | undefined;
214
235
  export declare function applyToolRosterDelta(held: ToolRosterView | undefined, delta: unknown): ToolRosterDeltaApplication;
@@ -224,15 +224,20 @@ function readSummary(raw) {
224
224
  return { added, removed, changed };
225
225
  }
226
226
  /**
227
- * `tool_roster_delta` → 新的持有状态。**纯函数**(不改入参)。
228
- *
229
- * 🔴 `fromDigest` 对不上**不是拒绝**(契约里唯一的硬话):携带的整只名册无论如何都是新状态,
230
- * 只有 `summary` 变得不可用。拒绝换会让消费端永远抱着一份过期名册 —— 比一次 skew 坏得多。
231
- * 🔴 手上**没有**名册(首帧就是 delta)同样算 `skew`:没有可比的 digest 就是比不出来,而
232
- * 「比不出来」不许被读成「对上了」。
233
- * 🔴 帧本身判不出形 => **什么都没发生**:原样交回入参那一份(不清空 —— 清空会把一次读不懂的帧
234
- * 变成一次「所有工具都没挂」)。
227
+ * CC-08(0.71.0):`tool_roster_delta.delta` → 视图;`fromDigest` 非空串 ∧ `roster` 读得出才成形,否则 `undefined`
228
+ * (server 判不出 core 的形就整帧不发,所以本层读不出 = 坏帧,由投影口报 malformed)。
229
+ * 宿主拿它喂 {@link applyToolRosterDelta}(那只吃 raw,这里给的是已窄读的同形;两只读法同源 `readRoster`)。
235
230
  */
231
+ export function projectToolRosterDelta(delta) {
232
+ const d = obj(delta);
233
+ if (d === undefined)
234
+ return undefined;
235
+ const roster = readRoster(d.roster);
236
+ if (roster === undefined || typeof d.fromDigest !== 'string' || d.fromDigest.length === 0)
237
+ return undefined;
238
+ const summary = readSummary(d.summary);
239
+ return { fromDigest: d.fromDigest, roster, ...(summary !== undefined ? { summary } : {}) };
240
+ }
236
241
  export function applyToolRosterDelta(held, delta) {
237
242
  const d = obj(delta);
238
243
  const next = d !== undefined ? readRoster(d.roster) : undefined;
@@ -19,11 +19,11 @@
19
19
 
20
20
  | 项 | 值 | 真源 |
21
21
  |---|---|---|
22
- | 本包 | `@sema-agent/client-core` **0.70.2**(本批发布版 = patch,零型面变化:🔴 CC-18 `agents[].skills` 两条孪生帽退役 —— 条数帽(修前 11+ 技能的 agent 静默丢技能)与技能名字长度过滤(修前长名技能被误报「未加载」);射程止于这两条,agent 自己的名字帽与 skill content 帽上游仍判故不退;`MAX_AGENT_SKILLS` 常量退役但保留导出,随下一个 minor 删;§41 / 41y 两条)|
23
- | peer:wire 契约 | `@sema-agent/sdk` **>=8.4.0**(value-level,非 type-only;**0.60.0 抬版**,四条硬理由见 §24a 与 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 注;上一次是 0.59.0 的 `>=8.3.0`)。🔴 支持窗同批收到 **engine ≥7.64.0**:sdk 8.4.0 与 7.63.0 及以前的 wire **不同窗** | `package.json` `peerDependencies` |
24
- | peer:会话词汇表 | `@sema-agent/agent-types` **>=0.2.0**(type-only,零运行时) | 同上 |
22
+ | 本包 | `@sema-agent/client-core` **0.71.0**(本批发布版 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
23
+ | peer:wire 契约 | `@sema-agent/sdk` **>=9.6.0**(value-level,非 type-only;**0.71.0 抬版**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
24
+ | peer:会话词汇表 | `@sema-agent/agent-types` **>=0.3.0**(type-only,零运行时;0.71.0 抬版:devDep 与 peer 同步,type-superset 门 ④ 撞名预警对着 0.3.0 的 .d.ts 求值) | 同上 |
25
25
  | runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
26
- | 公开导出面 | **986** 个运行期符号(+ 44 个测试钩;= 0.70.0 未发布版的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS`);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
26
+ | 公开导出面 | **986** 个运行期符号(+ 44 个测试钩;= 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS`);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
27
27
  | 常驻门 | 以 `scripts/gates-manifest.json` 的 `suites` 长度为准(**本档不抄这个数**) | `scripts/gates-manifest.json`;`npm test` 的名单等值门与它逐名对账 |
28
28
  | 沿革档 | 0.29.0 起建 `CHANGELOG.md`;更早批次记账在 `src/index.ts` 文件头 + `docs/REFACTOR-LEDGER.md` | — |
29
29
 
@@ -135,7 +135,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
135
135
  `WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
136
136
  **4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
137
137
 
138
- 986 项的内部构成(帮助端估读表大小;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**299** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
138
+ 986 项的内部构成(帮助端估读表大小;0.71.0 −2 常量 `MAX_AGENT_SKILLS` / `DECIDE_WORKFLOW_HOST_NOT_PARKED` +2 函数 `projectToolRosterDelta` / `mcpEngineLegPresence`;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**297** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
139
139
  (矩阵、键集、env 名、锚串)而非可调用物;**6** 项是 PascalCase 运行期值
140
140
  (`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError`);
141
141
  **41** 项是 `*For(sessionKey, …)` 的 per-session 变体(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
@@ -158,8 +158,8 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
158
158
  | 12 | **workflow 与后台工作视图** | 21 | `projectWorkflowRun` · `readWorkflowResumeAdmissionIncomplete`(0.68.3 CC-05:core 7.18.0 `resumeAdmissionIncomplete` 在场 = 不是 resume 基,与 `readWorkflowParks` 同一条投影义务)· `createLiveWorkflowSource` · `ensureWorkflowActivityLedger` · `readWorkflowActivityLedger` · `stopWorkflowActivityLedger` · `resetWorkflowActivityLedgers` · `createBackgroundView` · `projectBackgroundView` · `recordWorkflowAgentTaskId` · `agentDisplayStatus` | 活过一个 turn 的长任务读面:workflow run + 跨 session 后台任务归一表(`assistant.tasks` 与 fleet SSE **两源独立降级**) | `src/workflow.ts`、`src/workflowClient.ts`、`src/workflowMonitor.ts`、`src/agentSession/backgroundView.ts`(+ 纯类型 `src/agentSession/contract.ts`) |
159
159
  | 13 | **座位 IPC 契约** | 34 | `LOCAL_SESSIONS_SPEC` · `SEAT_METHOD_NAMES` · `SEAT_EVENT_TYPES` · `isLocalSessionEvent` · `isToolPermissionRequest` · `toolPermissionRequestId` · `SEAT_VALIDATOR_KEY_COVERAGE` · `SEAT_SEND_MESSAGE_KEY_ORIGINS`(0.62.0:座位载荷**逐键出身**登记 —— 每个位要么写明转投哪个引擎请求位、要么写明为什么不上 wire;常驻门对**装在盘上的** sdk 型面逐名核,详见 §26③)| desktop↔web 座位 IPC 契约的**单一真源**(此前两边各一份、名字零重合 ⇒ 编译器永远不会告诉你它们漂了)。🔴 加 verb 忘了加 `LOCAL_SESSIONS_SPEC` **不报错**:preload 不注册 channel、渲染端读到 `undefined` | `src/seatContract.ts`(**零 import**,纯类型 + 常量 + 纯谓词)。🔴 **证据等级标注(0.42.0,test [5087] 的「语料**种类**缺口」/ cli [5088] 认领件)**:该文件里所有以「CC 如何如何」为形的断言(`212 methods` / `854-channel census` / 方法名逐字保留 / `fQe` 逐字段对照 / 一切 `.vite/build/index.chunk-*.js` 坐标)**证据等级 = 桌面 unpack,本地语料库不可复验** —— 本仓手边可复验的参照语料**只覆盖终端 CLI 形态**的静态产物,拿它去 grep 桌面壳里的符号只会零命中,而零命中在这里**既不证真也不证伪**。复核这些断言**不得**拿本仓语料当反证 |
160
160
  | 14 | **宿主端口与会话槽** | 41 | `installHost` · `installHostFor` · `installCoreValuePorts` + 十读口 + 三存在性口(0.69.0 CC-07:core 值级面端口注入,Node 宿主装配根装、浏览器 lane 恒缺席)· `hostPortMisses(For)` · `DEFAULT_SESSION_KEY` · `hostEnv` · `unrefTimer` · `parseLocaleTag` / `pickUiLanguage`(#244 F4 族D A-028.20:locale tag 手术单源 + UI 语言判定;与 `resolveRegionHint` 双出口成文 —— 语言偏好域 en/zh ≠ 地址可达域 cn/intl/unknown,`zh-Hant` 前者 zh 后者 intl 是设计)· `engineNamespaceKeyFor` / `mergeSessionMapRecord` / `mergeEngineEntry`(A-028.12:会话 id 映射单一键形 + merge 判定;存储经 `SessionMapStorePort` 归端 —— cli 文件锁/原子写,web localStorage)| 进程/端级装配层(settings/fs/queue/timers/session/log/probe),与 per-turn 的 `AdapterContext` **分层**。头注的判定规则:**这个能力每 turn 都会变吗?** 会 ⇒ `ctx`;不会 ⇒ `installHost` | `src/host.ts`、`src/hostEnv.ts`、`src/sessionSlot.ts`、`src/unrefTimer.ts`、`src/env/{localeGeo,localeTag,uiLanguage}.ts`、`src/sessionMap.ts` |
161
- | 15 | **控制面与传输** | 122 | `ControlRouter`(+ `ControlSafetyError`)· `fetchMcpPanel`(0.69.0:经 sdk `sessions.mcp` 取体 + 投视图,不裸 fetch)· `projectMcpPanel` + `mcpPanelLastLegDetail`(0.68.2 CC-03:`GET /v1/sessions/:id/mcp` 面板体防御读视图 + `lastLegMcp` 一行措辞铸点;缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable`、禁与 `servers[]` 对账)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/readFacePosture.ts` |
162
- | 16 | **引擎词汇表与包自检** | 91 | `readSkillsListingTruncated`(0.70.0 CC-04:`skills.listing_truncated` 事实读器,§39)· `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
161
+ | 15 | **控制面与传输** | 123 | `mcpEngineLegPresence`(0.71.0 CC-19:引擎侧 MCP 在场三值,只从面板视图求;§42)· `ControlRouter`(+ `ControlSafetyError`)· `fetchMcpPanel`(0.69.0:经 sdk `sessions.mcp` 取体 + 投视图,不裸 fetch)· `projectMcpPanel` + `mcpPanelLastLegDetail`(0.68.2 CC-03:`GET /v1/sessions/:id/mcp` 面板体防御读视图 + `lastLegMcp` 一行措辞铸点;缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable`、禁与 `servers[]` 对账)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/readFacePosture.ts` |
162
+ | 16 | **引擎词汇表与包自检** | 90 | `readSkillsListingTruncated`(0.70.0 CC-04:`skills.listing_truncated` 事实读器,§39)· `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
163
163
 
164
164
  🔴 **`engineErrorCodes` 的开集纪律**(该文件头注逐字):这些 `ReadonlySet` / 前缀谓词一律是**识别表**,
165
165
  回答的是「我认不认得这个码」,**绝不是**「合法码只有这些」。消费点 `switch` **必须留 `default`**,
@@ -232,7 +232,7 @@ type EventProjection =
232
232
  🔴 栏内只写**成员**;反例/对照臂(终态那两条之类)一律写到栏外去,否则会被读成成员。 -->
233
233
 
234
234
  `meta`(流首帧身份信号,SDK/传输层自消费)· `file_link` / `prompt_assembled` / `model_usage` /
235
- `context_usage` / `config_assembled`(引擎可观测/审计面,CC transcript 无对位物)·
235
+ `config_assembled`(引擎可观测/审计面,CC transcript 无对位物;context_usage 自 0.71.0 CC-08 ③ 起**进切片**为 chrome 臂,不再在本表,见 §42)·
236
236
  `needs_review`(壳消费的是 `done{status:'needs_review'}` 终帧,事件形重复且更早)·
237
237
  `compaction_outcome`(压缩**非 compacted 结局**报告;CC transcript 无对位物,见 §7 缺口 **P-6**)·
238
238
  `tool_approval` / `tool_approval_complete`(**不是丢帧**:它们走
@@ -4621,7 +4621,7 @@ an argument」。audience 答另一问:这条事实**说给谁听**。
4621
4621
  **签名**
4622
4622
 
4623
4623
  ```ts
4624
- ENGINE_NOTICE_CODES: readonly string[] // 59 码,顺序同源(core 7.19.0 +3;0.70.0)
4624
+ ENGINE_NOTICE_CODES: readonly string[] // 64 码,顺序同源(core 7.20.0 +5;0.71.0)
4625
4625
  ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>
4626
4626
  noticeAudienceOf(code: unknown): 'user' | 'operator'
4627
4627
  engineNoticeInCatalog(code: unknown): boolean
@@ -7997,7 +7997,7 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
7997
7997
  | 件 | 一句话 | 端要做什么 |
7998
7998
  |---|---|---|
7999
7999
  | S-1 🔴 **型面 BREAKING(唯一)** | **CC-04 `SKILL_CAPS` 只剩 `content`**:`items` / `name` / `description` 三键退役。server 7.78.1 `validateUserSkills` 直读 dist 已无条数帽、无长度帽(7.78.0 及以前仍有);core 7.19.0 `<skills>` 清单按字节预算自己裁描述 / 退 name-only 并发 `skills.listing_truncated`。`skillCommandsToSpecs` / `cloudSkillsToSpecs` 不再在第 10 条断开(此前静默丢弃零留痕);`toCappedSpec` 不再预截 name / description | 读 `SKILL_CAPS.items/.name/.description` 的端**删**(cli `skillsWireOverflow` 与本版同窗退役);别在端里复刻一个条数帽或长度帽 —— 那是在一道已不存在的门下面静默切字节 |
8000
- | S-2 | **`readSkillsListingTruncated(notice)`**:清单裁切的唯一留痕读口(五必填 / 三可选 / 派生 `laneClamped?`) | 运维面 / 折叠行读它渲「N 条只列名、M 条没上清单、是车道 clamp 还是部署比例」;不自己数「发了几条上了几条」,不对 `message` 做等值匹配 |
8000
+ | S-2 | **`readSkillsListingTruncated(notice)`**:清单裁切的唯一留痕读口(五必填 / 三可选 / 派生 `laneClamped?`)。🔧 **0.71.0 改口**:core 7.20.0 删 `requestedBudgetBytes`(8 KiB 天花板退役,声明比例即实际)⇒ `requestedBudgetBytes?` 与派生 `laneClamped?` **整只退役**,视图只剩 `budgetBytes` = 在场预算 | 运维面 / 折叠行读它渲「N 条只列名、M 条没上清单」;**只读 `budgetBytes`**,不再分「车道 clamp / 部署比例」(那个区分随天花板一起消亡);不自己数、不对 `message` 做等值匹配 |
8001
8001
  | S-3 | `ENGINE_NOTICE_CODES` +3 = 五十九码(`classifier.role_defaulted` / `classifier.contract_broken` / `skills.listing_truncated`,operator);devDep core `~7.19.0` | 开集透传照旧;渲运维面的端按受众表分流 |
8002
8002
  | S-4 | **CC-15** `thinking_segment_end` 形 (a) 透传 `committedUuids: []`(在场但空 = 本包判定本段零已提交行);形 (f) 零经手仍整键缺席;`committedUuid` 兼容位不变 | 读法改口:`Array.isArray(committedUuids)` 在场即以它为准(`[]` = 零行,不再数窗口里过境的行);整键缺席才是「包说不出」 |
8003
8003
  | S-5 | `skillListingBudgetFraction` / `skillListingMaxDescChars` 两旋钮 | **本包零动作**:它们是 server `task-settings`(部署面)键,不在 `TaskRequest` 装配矩阵上;端不透传 |
@@ -8018,7 +8018,7 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
8018
8018
  ### 39y. 🔴 三端升级必读(固定段式,[C295];本批**三条**)
8019
8019
 
8020
8020
  1. 🔴 **技能条数帽 / 长度帽在端里一律删**:`SKILL_CAPS` 只剩 `content`;凡自己复刻「≤10 条」「name ≤64」「description ≤1024」或以 `SKILL_CAPS.items` 算「溢出了几条」的端(cli `skillsWireOverflow`)与本版同窗退役 —— server 7.78.1 全受理,引擎清单自己裁并通告。
8021
- 2. **清单裁切只从 `skills.listing_truncated` 读**:`readSkillsListingTruncated(notice)` 给八格事实 + `laneClamped?`;运维面据此分「调 `skillListingBudgetFraction` 有用(部署比例)」与「调了也没用(车道 clamp)」;别自己数条数。
8021
+ 2. **清单裁切只从 `skills.listing_truncated` 读**:`readSkillsListingTruncated(notice)` 给事实格;别自己数条数。🔧 0.71.0 改口:`laneClamped?` / `requestedBudgetBytes?` 已随 core 7.20.0 退役,调 `skillListingBudgetFraction` 现在**双向生效**(无天花板),运维面只读 `budgetBytes`。
8022
8022
  3. **CC-15 读法改口**:`thinking_segment_end.committedUuids` 在场即以它为准(`[]` = 本段零已提交行),整键缺席才是「包说不出」;为形 (a) 自建的过境行计数臂删。
8023
8023
 
8024
8024
  **到期复核(0.70.0 发后当拍记)**:① core 7.20.0 预告([7334] ③a)删 `skills.listing_truncated.detail.requestedBudgetBytes`(8 KiB 天花板退役后请求预算即实际预算)⇒ `readSkillsListingTruncated` 该键可选、`laneClamped` 只在它在场时派生,到货零改即缺席;随 7.20.0 提货批把 `laneClamped` 派生位整只删。② §37y ③ 「交互车道 `adapt()` 不经去重不受影响」是包视角的车道假设:cli 交互车道实际也经 `runStream`(durable-seq 去重在那里),server 7.77.0 的 `reasoning_end` id 复用在交互车道**同样**把权威段当重放丢(test [7335] B-125 实证);包侧去重律不变、零改,根因修在 server 7.78.1(唯一 id)。**已知边界改口**:凡经 `runStream` 的车道(cli 两车道皆是)在 server <7.78.1 上都收不到 `reasoning_end`。
@@ -8077,3 +8077,64 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
8077
8077
  2. **`missing` 那条 warning 现在可以照字面信**:它只含真没加载的技能名;修前名字超 64 的已加载技能也在里面。
8078
8078
 
8079
8079
  **包侧缺口:** ① `MAX_AGENT_SKILLS` 常量删除随下一个 minor;② 其余同 §40。
8080
+
8081
+ ## §42 🆕 0.71.0 提货批(core 7.20.0 闭集 +5 / `laneClamped` 退役 / CC-16 文本面归属交全 / CC-08 五件 / peer sdk >=9.6.0)
8082
+
8083
+ ### 42a. 本节速览(core 半场,已落 main)
8084
+
8085
+ | 件 | 一句话 | 端要做什么 |
8086
+ |---|---|---|
8087
+ | S-1 🔴 **型面 BREAKING** | `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?` / `laneClamped?` 两键(core 7.20.0 #818 删 detail 键,本包是唯一真消费方;派生位没有输入 ⇒ 整只退役,不留恒 false);老引擎 7.19.0 仍发该键时视图**不铸不派生** | 读这两键的端删;运维面只读 `budgetBytes` |
8088
+ | S-2 | `ENGINE_NOTICE_CODES` +5 = 六十四码(`config.task_root_not_canonical` / `config.execution_env_capability_invalid` / `config.forward_sink_failed` / `memory.restore_withheld` / `agents.listing_truncated`,均 operator;顺序同源);devDep core `~7.20.0` | 开集透传照旧;`agents.listing_truncated` 与 `skills.listing_truncated` 同族,detail 形本包**暂不出读器**(候消费场景) |
8089
+ | S-3 | core 7.20.0 其余:`RECOMMENDED_SENSITIVE_ASK_PATTERNS` 删 / `writeProtectionCheck` 返 Promise / 四个写保护类型 / `canonicalPathIsAuthoritative` / `ClassifierSeat` | **n/a**(本包零镜像、不驱动 gate、不实现 adapter;`ClassifierSeat.defaulted?` 候 sdk 出键) | 零动作 |
8090
+ | S-5 🔴 **型面 BREAKING** | **peer sdk 地板 `>=9.6.0`**(`tool_disclosure` / `tool_progress` 两帧型 + `readRootCandidate` 自 9.6.0 起);**peer agent-types `>=0.2.0` → `>=0.3.0`**(devDep 同步;type-superset 门 CC 撞名预警对 0.3.0 求值,零撞名) | 装 sdk 9.6.0+ / agent-types 0.3.0+ |
8091
+ | S-6 | **CC-08 ① `tool_disclosure` chrome 臂**:`policy` 开集 / `thresholdPercent?` 缺席≠默认 / `deferred[]` `activated[]` 全量快照整只替换 | 要渲「哪些工具以名字占位、哪些已激活」的端接;不接零动作(`required: false`) |
8092
+ | S-7 | **CC-08 ⑤ `tool_progress` chrome 臂**(C-R50 一帧两拍):按 `toolCallId` 挂卡;Bash 类带 `output` 尾巴 + `totalLines`/`totalBytes` 同进同退;其他只 `elapsedSeconds` | 渲活面板的端接;🔴 `output` 是 UNTRUSTED RAW,可再封顶展示、**绝不回喂**模型;`elapsedSeconds` 缺席不是 0 |
8093
+ | S-9 | **CC-08 ① `wiring_manifest` 切片新带 `tools?` / `hooks?` / `lsp?`**;`tool_roster_delta` 帧 → chrome 臂(`delta` 已窄读) | 渲名册/hook/LSP 面的端接;`tool_roster_delta` 到手喂 `applyToolRosterDelta`,digest 对不上整只替换;重连按 `wiring_manifest.tools` 快照重同步 |
8094
+ | S-10 | **CC-08 ③ `context_usage` chrome 臂**(三标量 + `sections?`) | HUD 按最后一条取值;🔴 `sections[].tokens` 与 `usedTokens` 禁相减;`windowTokens` 别渲成模型上下文大小 |
8095
+ | S-11 🔴 **型面 BREAKING** | **`WiringManifestMcpEntry` → `WiringManifestMcpEntryView`**(同名影子收敛 + 编译期钉) | 两边都 import 的端改名;只 import 本包的端零动作 |
8096
+ | S-12 🔴 **型面 BREAKING** | **`MAX_AGENT_SKILLS` 删** | 0.70.2 起已零读点;仍 import 的端删 |
8097
+ | S-14 🔴 **型面 BREAKING** | **CC-20 `decide.workflow_host_not_parked` 退役**:常量 `DECIDE_WORKFLOW_HOST_NOT_PARKED` 删、`DECIDE_WORKFLOW_LANE_CODES` 三员 → 两员、`decideRefusalFromError` 对该码返 `null`(server 7.72.0 起永不再发) | 仍 import 该常量或按该码分支的端删;§30h「三条出路」读作两条 |
8098
+ | S-15 🔴 **子流面** | **`wiring_manifest` 三键子流断闸 + 身份透传**:投影口透 `parentToolCallId` / `sourceTaskId` / `bgAgentId`(在场非串 ⇒ `malformed`),臂按三键任一在场断闸(修前只判 `parentToolCallId`) | 端零动作;此前若在壳侧按 `sourceTaskId` 自滤子代 `wiring_manifest` 的可删(包已断闸,leader 面只见 leader 快照) |
8099
+ | S-16 🔴 **子流面** | **三键身份空串透传**:五臂共用读器三键在场即抄(含 `''`),与 `text_end` 投影和 `isSubFlowSegmentEnd`「键在场 = 子代帧」同律;`eventId` 非空才带 | 端零动作;别把 `sourceTaskId === ''` 读成主流 |
8100
+ | S-13 | **CC-19 `mcpEngineLegPresence(view)`**(cli L-335 归包):引擎侧 MCP 在场三值 `present` / `absent` / `unknown`,只从 `projectMcpPanel` 视图求 | 壳侧自算的 presence 删改调;🔴 `unknown`(视图读不出)不许渲成「一台 MCP 都没配」,有引擎接线的端开面板让「未观测」句说话;CC 那句只在壳侧零行 ∧ `absent` 时出 |
8101
+ | S-8 | **`ToolApprovalFrame.readRootCandidate?`**(#803):在场 = 根外读 ask 附「把 `dir` 加为本会话读目录」候选,`clearsThisAsk: true` | 审批卡按在场渲一格「add-dir」动作,`dir` 原样回传显完整;缺席 = 今日行为 |
8102
+ | S-4 🔴 **安全面** | **CC-16 `text_segment_end.committedUuids[]`**:本段身份窗口里段边界**之前**已提交的文本行 uuid 按序(`[]` = 零行在场但空;整键缺席 = 零经手形 f)+ `committedUuid` 末条兼容位;常态段定稿行在轮换之后提交 ⇒ 不在列 | **端义务改口**:`committedPrefixDiverged` ⇒ 按 `committedRows[]` **逐行写回**(包已算好:首行 = 前段定稿前缀 + `content`、其余行 `''`;🔴 别整行换首行 —— 提交行可能是「上一段定稿 + 本段那截」一条,整行换会删上一段权威正文;多行跨界时包同批清掉本段未提交的原始尾巴、补差账按写回后的屏同步,端写回后转录 = 权威正文恰一次);删自建的「本窗口过境行」跟踪与 `=== 1` 歧义闸;多行跨界段不再整发放弃 |
8103
+
8104
+ ### 42z. 逐键处置表(0.71.0,core 半场)
8105
+
8106
+ | # | 键 / 面 | 处置 | 坐标 / 理由 |
8107
+ |---|---|---|---|
8108
+ | 1 | `skills.listing_truncated.detail.requestedBudgetBytes` 删 | **consumed(退役两键)** | `src/engineNoticeCodes.ts` 的 `#readSkillsListingTruncated`;码册门 G2 改口「在场不铸不派生」 |
8109
+ | 2 | `ENGINE_NOTICE_CODES` +5 | **consumed** | 同文件;码册门 A 双向等值(实装 core 7.20.0)+ G8 |
8110
+ | 3 | `agents.listing_truncated` detail | **pending(候消费场景)** | 与 skills 同族;端要渲 roster 裁切面时再出读器 |
8111
+ | 4 | `ClassifierSeat.defaulted?` | **候 sdk 出键** | 不在 wire 上 |
8112
+ | 5 | 其余(G1/G6/G7 各件) | **n/a** | [7357] ⑦ |
8113
+ | 7 | `tool_disclosure` 帧(四键) | **consumed(chrome 臂)** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `#toolDisclosureProjection`;`src/adapt/arms.ts` 的 `#toolDisclosureArm`;`src/seam.ts` 臂表;门 tool-disclosure-progress-projection A/C/D/E |
8114
+ | 8 | `tool_progress` 帧(七键,一帧两拍) | **consumed(chrome 臂;C-R50 裁定形)** | 同上 `#toolProgressProjection` / `#toolProgressArm`;门 B/C/D/E |
8115
+ | 9 | `ToolApprovalFrame.readRootCandidate?` | **consumed(镜像 +1)** | `src/hitl/toolApprovalWire.ts` 的 `#TOOL_APPROVAL_FRAME_KEYS_MIRROR`;门 approval-frame-keys |
8116
+ | 10 | `APPROVAL_CARD_KEYS`(sdk 9.6.0) | **n/a(两版相同)** | 卡腿零动作 |
8117
+ | 11 | `wiring_manifest.tools` / `.hooks[]` / `.lsp` | **consumed(切片三键)** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `#wiringManifestSupersetBody` + `#projectHooksSection` / `#projectLspSection`;tools 读器 `src/toolRoster.ts` 的 `#projectToolRoster`;门 wiring F |
8118
+ | 12 | `tool_roster_delta` 帧 | **consumed(chrome 臂;此前 unsupported_arm 有痕)** | `#projectToolRosterDelta`(`src/toolRoster.ts`);`src/adapt/arms.ts` 的 `#toolRosterDeltaArm`;门 wiring G |
8119
+ | 13 | `context_usage`(三标量 + `sections[]`) | **consumed(chrome 臂;此前 not_in_slice)** | `#contextUsageProjection`;`#contextUsageArm`;门 wiring H |
8120
+ | 14 | `WiringManifestMcpEntry` 同名影子 | **consumed(改名 View + 编译期钉)** | `#_mcpEntryViewPin`;门 wiring I + typeshape |
8121
+ | 15 | `MAX_AGENT_SKILLS` | **removed** | `src/agentsWireCaps.ts`;公面基线 −1 |
8122
+ | 16 | 引擎侧 MCP 在场三值(cli L-335) | **consumed(归包)** | `src/mcpPanel.ts` 的 `#mcpEngineLegPresence`;门 mcp-panel-projection K1–K7 |
8123
+ | 17 | `decide.workflow_host_not_parked`(server 7.72.0 退役) | **removed(CC-20)** | `src/engineErrorCodes.ts` / `src/decideReceipt.ts`;census 门登记退役词;decide-receipt 门 E 段两码 |
8124
+ | 6 | `text_segment_end.committedUuids[]` / `committedUuid` / `committedRows[]` | **consumed(CC-16;committedRows 发车前对抗复审补)** | `src/adapt/textStream.ts` 的 `#committedTextRows`(铸行登记含 `sealedPrefix` / 替换交全 / 轮换清);`src/adapt/arms.ts` 的 `#textSegmentEndArm` 透传;`src/seam.ts` 臂表义务 ⑥ + `#TextSegmentCommittedRow`;门 TSA Z1–Z8 |
8125
+ | 18 | `wiring_manifest` 三键身份 | **consumed(断闸 + 透传)** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `#identityOrMalformed`(五臂共用);`src/adapt/arms.ts` 的 `#wiringManifestArm`;门 wiring J1–J5 |
8126
+ | 19 | 三键身份空串 | **consumed(在场即抄)** | 同 `#identityOrMalformed`;门 tool-disclosure B8 / D2 |
8127
+
8128
+ ### 42y. 🔴 三端升级必读(固定段式,[C295];本批起草,发车时补全)
8129
+
8130
+ 1. 🔴 **`text_segment_end` 归属交全(CC-16)**:`committedUuids[]` 在场即以它为准 —— `committedPrefixDiverged` ⇒ 按 `committedRows[]` 逐行写回正文(🔴 别自己整行换首行)。两形:**(a)** 提交行 = 「上一段定稿 + 本段那截」同一行时,该行最终正文 = 上一段正文(该行里已封存那截,逐字)+ 本段权威 `content`,其余行 `''`;**(b)** `committedRows` 在场 ⇔ `committedPrefixDiverged === true` ∧ `committedUuids.length > 0`,在场时与 `committedUuids` 长度相等、顺序一一对应(`committedRows[i].uuid === committedUuids[i]`),绝不只给其一;b1 形(前缀对得上)只有 `committedUuids`;`[]` = 本窗口零已提交行;整键缺席才是「包说不出」。自建的「本窗口过境行」跟踪与 `=== 1` 歧义闸可删,多行跨界段不再整发放弃。
8131
+ 2. **`SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?` / `laneClamped?`**:运维面只读 `budgetBytes`。
8132
+ 3. **peer sdk `>=9.6.0`**;两条新 chrome 臂 `tool_disclosure` / `tool_progress` 均 `required: false`,渲的端接、不渲零动作;🔴 `tool_progress.output` 绝不回喂模型。
8133
+ 4. **审批卡 `readRootCandidate`**:在场渲一格 add-dir 动作,`dir` 原样回传;缺席不渲。
8134
+ 5. 🔴 **两个型面改名/删除**:`WiringManifestMcpEntry` → `WiringManifestMcpEntryView`(两边都 import 的端改名);`MAX_AGENT_SKILLS` 删(仍 import 的端删)。
8135
+ 6. **名册增量与上下文用量**:`tool_roster_delta` 喂 `applyToolRosterDelta`(digest 对不上整只替换、重连按快照重同步);`context_usage` 按最后一条取值,`sections[].tokens` 与 `usedTokens` 禁相减。
8136
+ 7. **引擎侧 MCP 在场改读 `mcpEngineLegPresence(view)`**:壳侧自算的三值删;`unknown` 开面板不渲零。
8137
+ 8. 🔴 **`decide.workflow_host_not_parked` 已退役**:仍 import `DECIDE_WORKFLOW_HOST_NOT_PARKED` 或按该码分支的端删;`decideRefusalFromError` 对它返 `null`(机器行原样上屏)。
8138
+ 9. **子流断闸补齐**:`wiring_manifest` 三键断闸 + 五臂三键空串透传(S-15 / S-16);壳侧对这些臂自建的 `sourceTaskId` 过滤可删。
8139
+
8140
+ **包侧缺口:** ① `agents.listing_truncated` detail 读器候消费场景(by-design:无消费方不出读器);② `ClassifierSeat.defaulted?` 候 sdk 出键(by-design:上游未出);③ CC-06 B-081 包侧半场(窗 09-22);④ CC-24 export-liveness 门(窗 09-20);⑤ CC-25 §NNz 机读门 + 三已发版本落点 + FROZEN 腿判据(窗 09-22);⑥ CC-26 `as unknown as` 铸出口棘轮(窗 09-22)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/client-core",
3
- "version": "0.70.2",
3
+ "version": "0.71.0",
4
4
  "description": "Client-side session runtime shared by every sema human client (TUI / web / desktop): sema wire frames (AgentEvent) -> CC session vocabulary (SDKMessage) with dual-plane output (transcript/chrome), deterministic transcript ids, lane discipline as a type, and the notification/dedup ledgers. Every CC-skin shape is collected here so the wire itself stays neutral. Renamed from @sema-agent/wire-cc-adapter (0.1.x).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -30,13 +30,13 @@
30
30
  "diff": "^9.0.0"
31
31
  },
32
32
  "peerDependencies": {
33
- "@sema-agent/agent-types": ">=0.2.0",
34
- "@sema-agent/sdk": ">=9.4.0"
33
+ "@sema-agent/agent-types": ">=0.3.0",
34
+ "@sema-agent/sdk": ">=9.6.0"
35
35
  },
36
36
  "devDependencies": {
37
- "@sema-agent/agent-types": "^0.2.0",
38
- "@sema-agent/core": "~7.19.0",
39
- "@sema-agent/sdk": "^9.4.0",
37
+ "@sema-agent/agent-types": "^0.3.0",
38
+ "@sema-agent/core": "~7.20.0",
39
+ "@sema-agent/sdk": "^9.6.0",
40
40
  "@sema-agent/settings-schema": "^2.0.0",
41
41
  "esbuild": "^0.27.4",
42
42
  "typescript": "^6.0.2"