@sema-agent/client-core 0.72.6 → 0.72.8
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.
- package/CHANGELOG.md +25 -0
- package/README.md +1 -1
- package/dist/adapt/arms.js +4 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +8 -0
- package/dist/adapter/activeRunSelfHeal.js +28 -15
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +8 -0
- package/dist/adapter/downstream/eventToSdkMessage.js +16 -1
- package/dist/adapter/runStream.d.ts +18 -0
- package/dist/adapter/runStream.js +27 -1
- package/dist/engineNoticeCodes.d.ts +17 -1
- package/dist/engineNoticeCodes.js +37 -1
- package/dist/request/taskRequest.d.ts +30 -0
- package/dist/request/taskRequest.js +79 -3
- package/dist/seam.d.ts +3 -1
- package/docs/INTEGRATION-CLIENTS.md +69 -9
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,31 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.72.8(2026-09-18)
|
|
53
|
+
|
|
54
|
+
> 主题:**清账三票**(CC-39③ server 7.84.0 S-405 `memory:"off"` 请求键 / CC-43 cli L-372 ③ `Model output error:` 中性臂 / CC-44 cli L-380 注入件撞活 run 自动 steer 零卡)。**patch**:型面纯 additive(+2 常量 +4 函数,公面 971 → 977;`ActiveRunSelfHealDeps.submissionOrigin?` 可选席;零 wire 新键 —— `memory` 键由 server 7.84.0 铸,本包只发;peer 不动)。接入面 §55。
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **`memory: "off"` 请求键**(CC-39③;server [7506] S-405 / 契约 §12.7 / core #863 W3):`REQUEST_FIELD_MATRIX` 加 `memory` 行(interactive + print,live 门),`TaskRequestInput.memory?: 'off'`,`buildTaskRequest` stamp;常量 **`MEMORY_OFF`** + 意图位片段 **`memoryOffDeclarationField(declared)`**(`false` ⇒ 整键缺席 = 记忆照常挂的唯一写法)+ 入口投影 **`memoryOffDeclared({ flag?, settingsMemory? })`**(cli [7510]:`--memory off` 旗恰 `'off'` ∨ settings CC 形 `memory: { enabled: false }` 严格 false ⇒ true;三端同判,壳零自判;🔴 旗在场非 `'off'` / `enabled` 在场非布尔 / 段非对象 ⇒ 响亮拒 `TypeError` —— 异源对抗复审一轮 [medium] 真修:入口投影不把打错字的收紧声明降级成缺席,否则片段函数删键、`buildTaskRequest` 无从校验)。🔴 与 `memoryCapture`(会话级采集面关)**同形、不同轴、可并存**:`memory` = 「这一次别给我记忆」(请求级整面关,零记录,终局状态词 `disabled`);坏拼写(含 `{ enabled: false }` 对象形)本层**响亮拒** `TypeError`,与 server 400 `request.field_invalid` 同律,不静默删键。两键同发时 capture 的单向记录不落 —— 不许拿 `memory:"off"` 当隐私声明。无能力位,老 server 400 / 更老 worker 静默忽略 ⇒ 本层不预判版本。pure 门 ⑤b 段 +70 格(红先绿后)。异源对抗复审第二轮两条 [medium] 真修:`buildTaskRequest` 对 `memory` / `memoryCapture` **只读一次**(校验与 stamp 共用同一次读取;带 getter 的入参第一次 `'off'` 第二次 `'OFF'` 曾让收紧声明静默丢失);memory 一族拒绝文本改用**粗分类**(`typeof` / null / array,不读 `Symbol.toStringTag` 与构造器名 —— 调用方可控的串不进错误展示)。typeshape `unknownExport` 347 → 349(`memoryOffDeclared` 两只 `unknown` 入参,负控锚同批)。
|
|
59
|
+
- **`runStream` 第二条中性臂 `Model output error:`**(CC-43;cli L-372 ③ 包侧正位):core 三 brain 的 malformed tool-call 一族(`tool call argument(s) not valid JSON …` / `tool call(s) arrived with no tool name and cannot be executed …`,brain 用 ` | ` 连)以 `done{status:'failed', errorMessage}` 收口时,行身份从 `API Error:` 换成 **`Model output error:`**(这一族零 provider 请求失败,该做的是调小请求 / 抬 output cap / 换说法重问,不是查网络);`isApiErrorMessage` 行类旗不变;busy / 治理两臂优先(结构位赢过文本锚);**只锚 core 原句共同前缀**,近似词不改身份(误报方向相反、代价一样)。导出 **`MODEL_OUTPUT_ERROR_PREFIX`** / **`isModelOutputErrorText(text)`** / **`isModelOutputErrorRowText(text)`**(与 `isGovernanceStopRowText` 互斥)。identity-copy 门 G1c 段 +10 格(红先绿后)。cli 1.0.119 归约器 `retagModelOutputErrorRow` 到货即退成直通。
|
|
60
|
+
- **`ActiveRunSelfHealDeps.submissionOrigin?: 'user' | 'injected'`**(CC-44;cli L-380):`'injected'`(plan-review 回执 / cron 唤醒 / task 通知等系统件)撞活 run 时**不呈三选卡、直接 steer 恰一次**(零卡)⇒ `running-steered` ⇒ 宿主按 `steerFollowIntent` 续听(L-379 闭环);不依赖 `offerRunningChoice` 口;没有正文 / 没有 steer 动词 ⇒ 零卡零动作 `not-parked`(注入行渲 not-delivered);cancel 永不自动打;**不碰**「用户选过 Do nothing」登记表;缺席 / `'user'` ⇒ 逐字节同旧。与 `activeRunSelfHealRow` 的 `origin` 是同一个词,宿主两处传同值。reopen 门 ③z 段 +7 格(红先绿后)。
|
|
61
|
+
|
|
62
|
+
## 0.72.7(2026-09-18)
|
|
63
|
+
|
|
64
|
+
> 主题:**core 7.22.0 提货**(发车帖 [7502] / 提货单 [7503] @client-core 三条;CC-42)。**patch**:型面纯 additive(一个 `_sema_` 超集键 + 通告闭集 +1 + 读器 +1 + 三词闭集 +1;公面 969 → 971;peer 不动;devDep core `~7.22.0`)。接入面 §54。
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
|
|
68
|
+
- **`ENGINE_NOTICE_CODES` +1 = 六十六码**(顺序同源):`mcp.server_redialed`(紧跟 `mcp.revocation_probe_failed`;operator)—— 宿主请这条 run 重拨一台 MCP server 的结果,**一个码管两个方向**(`outcome` 是数据不是两种事件);去重单位 = **每次尝试**,永不按 run 折叠。事实读器 **`readMcpServerRedialed(notice)`** ⇒ `{ server, outcome, added, removed, reason?, sessionId, runId }`:`outcome` 按三词闭集 **`MCP_REDIAL_OUTCOMES`**(`reconnected` / `refused` / `not_declared`,core `McpReconnectResult.outcome` 逐字)读,词表外整只缺席;`added` / `removed` 是**计数**(非负整数)不是工具名;必填格缺一整只缺席;`reason` 开集透传只渲不分支。码册门 G8b 六十六 + G10 八格(红先绿后)。
|
|
69
|
+
- **`wiring_manifest.readDeny` 第九段进切片 ⇒ `_sema_readDeny?: { builtinTiers: string[] }`** + chrome `wiring_manifest.readDeny?`(core #889 C-R60:内置敏感文件读 deny 表出厂 OFF,manifest 新格 = **实质激活档位**,按 `READ_DENY_BUILTIN_TIERS` 顺序、每行都被排除的档位不列名;挨着 `writeProtection`,进 `configFingerprint`)。🔴 缺席 = **没有内置行判这条腿**(未配置部署 / 老 server),**不是**「没有读被 deny 判」(部署与任务级 `readDenyPatterns` 是另一套来源,刻意不上报);空数组铸点**永不发出** ⇒ 判畸形段缺席;档位词**开集**透传(闭集 `ReadDenyBuiltinTier` 五员归 core,本包不手抄);成员非非空串 / 非对象 ⇒ 段缺席其余段照投;多余成员不过境。type-superset +1 = 54;wiring 门 M 段 13 格(红先绿后)。
|
|
70
|
+
|
|
71
|
+
### Notes(零动作,写出来免得被读成漏接)
|
|
72
|
+
|
|
73
|
+
- `SafetyAxis.shell?: boolean`(与 `irreversible` 互斥)、`ParentSpecSeat.memoryOff?: true` 与 `createSubagentResume` deps `currentClamps.memoryOff?: true`:本包不读这三位(ask 门族按 `gateKind` 分臂,不读 `safetyAxis` 成员;resume-clamp 形不镜像)⇒ 零动作;`SAFETY_AXIS_VOCABULARY` 早列 `shell`,零闭集变化。
|
|
74
|
+
- 新导出四个(`McpReconnectResult` / `autoRunOnRecommendationEffective` / `RETENTION_CASCADE_DOMAINS` / `RETENTION_CASCADE_EXEMPT`):本包零 core 值级 import ⇒ n/a;`McpReconnectResult.outcome` 的三词在本包以 `MCP_REDIAL_OUTCOMES` 字面镜像(通告读器用)。`ReadDenyBuiltinTier` 首登记五员零变化、`AUTO_MODE_UNAVAILABLE_CAUSES` 不变 ⇒ 零动作。
|
|
75
|
+
- CC-30(MCP 会话内重连消费口):core 半场 #857 已到,等 server S-381 挂 `POST /v1/sessions/:id/mcp/reconnect`(server [7500] 排 7.84.0)。CC-34:server [7501] 反转对位承诺,根治归 core #897,本包升级腿零改动候。
|
|
76
|
+
|
|
52
77
|
## 0.72.6(2026-09-18)
|
|
53
78
|
|
|
54
79
|
> 主题:**steer 之后谁续听那条 run**(cli L-379 P1 包侧半场;server 7.81.0 S-384 副作用 [7495] ④′)。**patch**:型面纯 additive(+1 函数 `steerFollowIntent` + `activeRunSelfHealRow` 第五个可选参;公面 968 → 969;零 wire 键;peer 不动)。接入面 §53。
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ Renamed from **`@sema-agent/wire-cc-adapter`** (0.1.x, deprecated — see *Migra
|
|
|
35
35
|
|
|
36
36
|
## Scope
|
|
37
37
|
|
|
38
|
-
**Version:** 0.72.
|
|
38
|
+
**Version:** 0.72.8
|
|
39
39
|
|
|
40
40
|
- **Today** — the adapter seam, the whole `adapt()` pipeline (all 14 A-layer arms plus the
|
|
41
41
|
B/D/E tool-card layers), the notification/caps/model families, the adapter kernel (stream driver
|
package/dist/adapt/arms.js
CHANGED
|
@@ -375,6 +375,8 @@ const wiringManifestArm = function* (m) {
|
|
|
375
375
|
const hasWriteProtection = typeof writeProtection === 'object' && writeProtection !== null;
|
|
376
376
|
const autoConsolidation = m._sema_autoConsolidation;
|
|
377
377
|
const hasAutoConsolidation = typeof autoConsolidation === 'object' && autoConsolidation !== null;
|
|
378
|
+
const readDeny = m._sema_readDeny;
|
|
379
|
+
const hasReadDeny = typeof readDeny === 'object' && readDeny !== null;
|
|
378
380
|
const hasTools = typeof tools === 'object' && tools !== null;
|
|
379
381
|
const hasHooks = Array.isArray(hooks);
|
|
380
382
|
const hasLsp = typeof lsp === 'object' && lsp !== null;
|
|
@@ -383,7 +385,7 @@ const wiringManifestArm = function* (m) {
|
|
|
383
385
|
// S-124(0.59.0):🔴 `Array.isArray` 判在场,**不判 `.length`** —— `mcp: []` 是「这条腿一台都
|
|
384
386
|
// 没申报」这句正面事实,按长度判会把它和「老 mint 没报」折成同一件事(core 顶注点名的读法)。
|
|
385
387
|
const hasMcp = Array.isArray(mcp);
|
|
386
|
-
if (!hasGate && !hasAuto && !hasMcp && !hasTools && !hasHooks && !hasLsp && !hasWriteProtection && !hasAutoConsolidation)
|
|
388
|
+
if (!hasGate && !hasAuto && !hasMcp && !hasTools && !hasHooks && !hasLsp && !hasWriteProtection && !hasAutoConsolidation && !hasReadDeny)
|
|
387
389
|
return;
|
|
388
390
|
yield chrome({
|
|
389
391
|
kind: 'wiring_manifest',
|
|
@@ -396,6 +398,7 @@ const wiringManifestArm = function* (m) {
|
|
|
396
398
|
...(hasLsp ? { lsp: lsp } : {}),
|
|
397
399
|
...(hasWriteProtection ? { writeProtection: writeProtection } : {}),
|
|
398
400
|
...(hasAutoConsolidation ? { autoConsolidation: autoConsolidation } : {}),
|
|
401
|
+
...(hasReadDeny ? { readDeny: readDeny } : {}),
|
|
399
402
|
...(typeof m.eventId === 'string' && m.eventId.length > 0 ? { eventId: m.eventId } : {}),
|
|
400
403
|
});
|
|
401
404
|
};
|
|
@@ -274,6 +274,14 @@ export interface ActiveRunSelfHealDeps {
|
|
|
274
274
|
signal?: AbortSignal;
|
|
275
275
|
/** cancel 之后等 claim 释放的窗口(ms,缺省 {@link CANCEL_RELEASE_WAIT_MS});测试用它把窗调小。 */
|
|
276
276
|
cancelReleaseWaitMs?: number;
|
|
277
|
+
/**
|
|
278
|
+
* 被拒提交的**出身**(0.72.8 CC-44;cli L-380)。`'injected'` = 系统注入件(plan-review 回执 / cron 唤醒 / task 通知),
|
|
279
|
+
* **不是人写的、也不该问人**:撞活 run 时不呈三选卡,直接 steer(零卡)⇒ 结局 `running-steered` ⇒ 宿主按
|
|
280
|
+
* {@link steerFollowIntent} 续听(L-379)。没有正文 / 没有 steer 动词 ⇒ 零动作 `not-parked`(注入行渲 not-delivered)。
|
|
281
|
+
* 缺席 / `'user'` ⇒ 逐字节同旧(三选卡照呈)。与 {@link activeRunSelfHealRow} 的 `origin` 是同一个词,宿主两处传同一个值。
|
|
282
|
+
* 🔴 注入形**不碰**「用户选过 Do nothing」的登记表:那张表记的是人的决定,系统件不替他改、也不被它挡。
|
|
283
|
+
*/
|
|
284
|
+
submissionOrigin?: RejectedSubmissionOrigin;
|
|
277
285
|
/** 本会话的引擎 sessionId —— durable run 动词逐次透传(见 {@link DurableRunCallOpts.session})。
|
|
278
286
|
* 缺席 = 退化成今天的「server 记一条迁移告警后放行」,enforcement 到站后那条腿会整体 404。 */
|
|
279
287
|
sessionId?: string;
|
|
@@ -897,7 +897,9 @@ async function cancelAndConfirmRelease(taskId, durable, durableGet, deps) {
|
|
|
897
897
|
async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps) {
|
|
898
898
|
const notParked = { kind: 'not-parked', taskId, status };
|
|
899
899
|
const offer = deps?.offerRunningChoice;
|
|
900
|
-
|
|
900
|
+
// CC-44(0.72.8):系统注入件不问人 —— 不需要呈卡口;canSteer 不成立时零卡零动作。
|
|
901
|
+
const injected = deps?.submissionOrigin === 'injected';
|
|
902
|
+
if (typeof offer !== 'function' && !injected)
|
|
901
903
|
return notParked;
|
|
902
904
|
const text = typeof deps?.deniedMessage === 'string' ? deps.deniedMessage : '';
|
|
903
905
|
// 🔴 **只取来判在场,绝不裸调**(二次评审 R7 [high]):真 SDK 的 `RunsResource` 方法体走
|
|
@@ -909,6 +911,8 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
|
|
|
909
911
|
const canCancel = typeof runs?.cancel === 'function' && typeof runs?.get === 'function';
|
|
910
912
|
if (!canSteer && !canCancel)
|
|
911
913
|
return notParked;
|
|
914
|
+
if (injected && !canSteer)
|
|
915
|
+
return notParked;
|
|
912
916
|
// ── 存活对账腿(Inkglow-1085 P0b②):出卡前对 wire 直供的 running 补一发 runs.get 真查 ────────
|
|
913
917
|
// 409 终帧的 `activeTaskStatus` 是引擎 claim/store 的 best-effort 投影 —— claim 指着一条早已终结
|
|
914
918
|
// 甚至已不存在的 run 时,它会**每次都**回送同一个错的 running(幽灵),用户按 wire 读数拿到的
|
|
@@ -954,28 +958,37 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
|
|
|
954
958
|
// ── 已呈现登记(Inkglow-1085 P0b①):同 (sessionKey,taskId) 用户选过「Do nothing」⇒ 不再整卡
|
|
955
959
|
// 重弹,给 `alreadyOffered` 判别位让端降级渲一行(登记语义与清口见 runningChoiceDeclined 顶注)。
|
|
956
960
|
const declineKey = runningChoiceDeclineKey(deps?.sessionId, taskId);
|
|
957
|
-
if (runningChoiceDeclined.has(declineKey)) {
|
|
961
|
+
if (!injected && runningChoiceDeclined.has(declineKey)) {
|
|
958
962
|
return { kind: 'not-parked', taskId, status, alreadyOffered: true };
|
|
959
963
|
}
|
|
960
964
|
let choice = 'wait';
|
|
961
965
|
let offerDelivered = false;
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
966
|
+
if (injected) {
|
|
967
|
+
// CC-44:系统件不问人 —— canSteer 已在上面证过(动词在场 ∧ 有正文)。cancel 永不自动打(反钉纪律不变)。
|
|
968
|
+
choice = 'steer';
|
|
965
969
|
}
|
|
966
|
-
|
|
967
|
-
|
|
970
|
+
else if (typeof offer === 'function') {
|
|
971
|
+
try {
|
|
972
|
+
choice = (await offer({ taskId, status, canSteer, canCancel })) ?? 'wait';
|
|
973
|
+
offerDelivered = true;
|
|
974
|
+
}
|
|
975
|
+
catch {
|
|
976
|
+
choice = 'wait'; // 呈卡腿出意外 = 用户没做决定 ⇒ 零动作(绝不掉进破坏性分支)
|
|
977
|
+
}
|
|
968
978
|
}
|
|
969
979
|
// wait = 用户看过卡并选择留着它(呈现层把 Esc/空答也收口成 wait —— 同样是「这次不动它」的表态);
|
|
970
980
|
// steer/cancel = 用户重新表了态 ⇒ 清登记。呈卡腿抛错那次**不**登记(用户没看到卡)。
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
rememberDeclinedOffer
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
981
|
+
// 注入形不碰这张表(它记的是人的决定)。
|
|
982
|
+
if (!injected) {
|
|
983
|
+
if (choice === 'wait') {
|
|
984
|
+
// (对抗复审 [medium] 轻形采纳)FIFO 有界:长命桌面/多会话宿主不许无界长住(叶
|
|
985
|
+
// {@link rememberDeclinedOffer},与 L-93 两选卡共用同一条上界)。
|
|
986
|
+
if (offerDelivered)
|
|
987
|
+
rememberDeclinedOffer(declineKey);
|
|
988
|
+
}
|
|
989
|
+
else {
|
|
990
|
+
runningChoiceDeclined.delete(declineKey);
|
|
991
|
+
}
|
|
979
992
|
}
|
|
980
993
|
if (choice === 'steer' && canSteer && runs?.steer !== undefined) {
|
|
981
994
|
try {
|
|
@@ -246,6 +246,14 @@ export interface WiringManifestAutoConsolidationView {
|
|
|
246
246
|
/** 恒 `true`(构造期门拒掉了「武装但跑不起来」);在场即武装。 */
|
|
247
247
|
onRecommendation: true;
|
|
248
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* core 7.22.0 #889 C-R60(0.72.7 CC-42):`wiring_manifest.readDeny` 第九段 —— 这条腿**内置敏感文件读 deny 表**的实质激活档位
|
|
251
|
+
* (`READ_DENY_BUILTIN_TIERS` 顺序;每行都被排除掉的档位不列名)。挨着 `writeProtection`,按 operator / governance 投影;进 `configFingerprint`。
|
|
252
|
+
*/
|
|
253
|
+
export interface WiringManifestReadDenyView {
|
|
254
|
+
/** 非空;档位词**开集**透传(闭集 `ReadDenyBuiltinTier` 五员归 core,本包不手抄 —— 上游加档位不判畸形)。 */
|
|
255
|
+
builtinTiers: readonly string[];
|
|
256
|
+
}
|
|
249
257
|
/**
|
|
250
258
|
* CC-08(0.71.0):`wiring_manifest.hooks[]` 一行(sdk 9.6.0 `WiringManifestHookEntry`)—— 这条腿挂了哪些 hook 族、
|
|
251
259
|
* 由 spec 还是 deps 拥有、是否只是观察性的。开集透传 `family` / `owner`;`observational` never-false。
|
|
@@ -1222,7 +1222,8 @@ function wiringManifestSupersetBody(ev) {
|
|
|
1222
1222
|
const lsp = projectLspSection(ev.lsp);
|
|
1223
1223
|
const writeProtection = projectWriteProtectionSection(ev.writeProtection);
|
|
1224
1224
|
const autoConsolidation = projectAutoConsolidationSection(ev.autoConsolidation);
|
|
1225
|
-
|
|
1225
|
+
const readDeny = projectReadDenySection(ev.readDeny);
|
|
1226
|
+
if (modelGate === undefined && autoMode === undefined && mcp === undefined && tools === undefined && hooks === undefined && lsp === undefined && writeProtection === undefined && autoConsolidation === undefined && readDeny === undefined)
|
|
1226
1227
|
return undefined;
|
|
1227
1228
|
return {
|
|
1228
1229
|
...(modelGate !== undefined ? { _sema_modelGate: modelGate } : {}),
|
|
@@ -1233,6 +1234,7 @@ function wiringManifestSupersetBody(ev) {
|
|
|
1233
1234
|
...(lsp !== undefined ? { _sema_lsp: lsp } : {}),
|
|
1234
1235
|
...(writeProtection !== undefined ? { _sema_writeProtection: writeProtection } : {}),
|
|
1235
1236
|
...(autoConsolidation !== undefined ? { _sema_autoConsolidation: autoConsolidation } : {}),
|
|
1237
|
+
...(readDeny !== undefined ? { _sema_readDeny: readDeny } : {}),
|
|
1236
1238
|
};
|
|
1237
1239
|
}
|
|
1238
1240
|
/** 🔴 缺席 = 没编译出判官(第三态),**不折 `spelling-only`**;`targetView` 不在二词 / 非对象 ⇒ 段缺席;多余成员不过境。 */
|
|
@@ -1253,6 +1255,19 @@ function projectAutoConsolidationSection(raw) {
|
|
|
1253
1255
|
return undefined;
|
|
1254
1256
|
return { onRecommendation: true };
|
|
1255
1257
|
}
|
|
1258
|
+
/** 🔴 缺席 = **没有内置行判这条腿**(出厂 OFF 的未配置部署 / 老 server <7.22.0 承载版)—— **不是**「没有读被 deny 判」:部署与任务级
|
|
1259
|
+
* `readDenyPatterns` 是另一套来源,刻意不上报。空数组铸点**永不发出**(「关」与「开到什么都不判」是一件事)⇒ 判畸形段缺席;
|
|
1260
|
+
* 成员非非空串 / 非对象 ⇒ 段缺席(其余段照投);多余成员不过境;数组是新拷贝。 */
|
|
1261
|
+
function projectReadDenySection(raw) {
|
|
1262
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
1263
|
+
return undefined;
|
|
1264
|
+
const tiers = raw.builtinTiers;
|
|
1265
|
+
if (!Array.isArray(tiers) || tiers.length === 0)
|
|
1266
|
+
return undefined;
|
|
1267
|
+
if (!tiers.every((t) => typeof t === 'string' && t.length > 0))
|
|
1268
|
+
return undefined;
|
|
1269
|
+
return { builtinTiers: [...tiers] };
|
|
1270
|
+
}
|
|
1256
1271
|
function projectHooksSection(raw) {
|
|
1257
1272
|
if (!Array.isArray(raw))
|
|
1258
1273
|
return undefined;
|
|
@@ -157,6 +157,24 @@ export declare const RUN_BLOCKED_MESSAGE_PREFIX = "Run blocked";
|
|
|
157
157
|
* 各写一份正则必漂(记忆 `machine-readable-signal-not-visual-anchor`)。
|
|
158
158
|
*/
|
|
159
159
|
export declare function isGovernanceStopRowText(text: string): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* 第二条中性臂的前缀(0.72.8 CC-43;cli L-372 ③ 包侧正位):**模型这一轮的输出**坏了 —— core 三个 brain
|
|
162
|
+
* (anthropic / openai / open-responses)把 `tool_use` 参数不是合法 JSON(最常见成因 = 输出被 max_tokens
|
|
163
|
+
* 截断在参数中间)/ tool call 没带工具名 收成一句错误、run 以 `done{status:'failed', errorMessage}` 收口。
|
|
164
|
+
* 这一族**没有一个 provider 请求失败过**:渲成 `API Error:` 把人指去查网络 / key / 配额,而该做的是调小请求、
|
|
165
|
+
* 抬 output cap 或换个说法重问。与治理臂同律:身份换,行类旗(`isApiErrorMessage`)不换。
|
|
166
|
+
*/
|
|
167
|
+
export declare const MODEL_OUTPUT_ERROR_PREFIX = "Model output error";
|
|
168
|
+
/**
|
|
169
|
+
* 这条终态错误文本是不是「模型输出问题」(⇒ 中性行 `Model output error:`)。
|
|
170
|
+
* 🔴 **只锚 core 原句的共同前缀,不做模糊匹配**:三个 brain 各带各的终止原因字段名(`stop_reason` /
|
|
171
|
+
* `finish_reason` / `status`)⇒ 只锚括号前那一段;`JSON` / `not valid` 这类词在别的错误里到处都是,放宽一个字
|
|
172
|
+
* 就会把真的传输 / 服务端错误改渲成「模型输出问题」—— 方向相反、代价一样大。core 换句子 ⇒ 本锚当场失效 ⇒
|
|
173
|
+
* 行回落 `API Error:`(开集兜底,不误报)。两句锚 = 同一铸点的两个分支(参数非 JSON / 无工具名),brain 用 ` | ` 连。
|
|
174
|
+
*/
|
|
175
|
+
export declare function isModelOutputErrorText(text: string): boolean;
|
|
176
|
+
/** 这一行是不是「模型输出问题」行(渲染面 / 归约面的谓词;与铸点同源,端别自抄前缀字面)。与 {@link isGovernanceStopRowText} 互斥。 */
|
|
177
|
+
export declare function isModelOutputErrorRowText(text: string): boolean;
|
|
160
178
|
/**
|
|
161
179
|
* 终态是不是治理/契约面的(⇒ 中性行),而不是 provider/HTTP 面的(⇒ 保留 `API Error:`)。
|
|
162
180
|
*
|
|
@@ -169,6 +169,29 @@ export function isGovernanceStopRowText(text) {
|
|
|
169
169
|
const t = text.trimStart();
|
|
170
170
|
return t.startsWith(`${RUN_STOPPED_MESSAGE_PREFIX}:`) || t.startsWith(`${RUN_BLOCKED_MESSAGE_PREFIX}`);
|
|
171
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* 第二条中性臂的前缀(0.72.8 CC-43;cli L-372 ③ 包侧正位):**模型这一轮的输出**坏了 —— core 三个 brain
|
|
174
|
+
* (anthropic / openai / open-responses)把 `tool_use` 参数不是合法 JSON(最常见成因 = 输出被 max_tokens
|
|
175
|
+
* 截断在参数中间)/ tool call 没带工具名 收成一句错误、run 以 `done{status:'failed', errorMessage}` 收口。
|
|
176
|
+
* 这一族**没有一个 provider 请求失败过**:渲成 `API Error:` 把人指去查网络 / key / 配额,而该做的是调小请求、
|
|
177
|
+
* 抬 output cap 或换个说法重问。与治理臂同律:身份换,行类旗(`isApiErrorMessage`)不换。
|
|
178
|
+
*/
|
|
179
|
+
export const MODEL_OUTPUT_ERROR_PREFIX = 'Model output error';
|
|
180
|
+
/**
|
|
181
|
+
* 这条终态错误文本是不是「模型输出问题」(⇒ 中性行 `Model output error:`)。
|
|
182
|
+
* 🔴 **只锚 core 原句的共同前缀,不做模糊匹配**:三个 brain 各带各的终止原因字段名(`stop_reason` /
|
|
183
|
+
* `finish_reason` / `status`)⇒ 只锚括号前那一段;`JSON` / `not valid` 这类词在别的错误里到处都是,放宽一个字
|
|
184
|
+
* 就会把真的传输 / 服务端错误改渲成「模型输出问题」—— 方向相反、代价一样大。core 换句子 ⇒ 本锚当场失效 ⇒
|
|
185
|
+
* 行回落 `API Error:`(开集兜底,不误报)。两句锚 = 同一铸点的两个分支(参数非 JSON / 无工具名),brain 用 ` | ` 连。
|
|
186
|
+
*/
|
|
187
|
+
export function isModelOutputErrorText(text) {
|
|
188
|
+
return (text.includes('tool call argument(s) not valid JSON') ||
|
|
189
|
+
text.includes('tool call(s) arrived with no tool name and cannot be executed'));
|
|
190
|
+
}
|
|
191
|
+
/** 这一行是不是「模型输出问题」行(渲染面 / 归约面的谓词;与铸点同源,端别自抄前缀字面)。与 {@link isGovernanceStopRowText} 互斥。 */
|
|
192
|
+
export function isModelOutputErrorRowText(text) {
|
|
193
|
+
return text.trimStart().startsWith(`${MODEL_OUTPUT_ERROR_PREFIX}:`);
|
|
194
|
+
}
|
|
172
195
|
/**
|
|
173
196
|
* 终态是不是治理/契约面的(⇒ 中性行),而不是 provider/HTTP 面的(⇒ 保留 `API Error:`)。
|
|
174
197
|
*
|
|
@@ -801,7 +824,10 @@ async function* runStreamInner(events, ctx, handle = {}) {
|
|
|
801
824
|
? // blocked 的 errText 自己就以 `Run blocked` 开头(见上方 errText 构造),再套一层
|
|
802
825
|
// `Run stopped:` 会变成两个前缀叠字;其余治理码用中性前缀 + 引擎原话。
|
|
803
826
|
`${isGovernanceStopRowText(errText) ? errText : `${RUN_STOPPED_MESSAGE_PREFIX}: ${errText}`}${maxTokHint}`
|
|
804
|
-
:
|
|
827
|
+
: isModelOutputErrorText(errText)
|
|
828
|
+
? // 0.72.8 CC-43:第二条中性臂 —— 模型输出坏了(core 原句锚),不是 API 错误;busy / 治理两臂优先(结构位赢过文本锚)。
|
|
829
|
+
`${MODEL_OUTPUT_ERROR_PREFIX}: ${errText}${maxTokHint}`
|
|
830
|
+
: `API Error: ${errText}${maxTokHint}`;
|
|
805
831
|
yield {
|
|
806
832
|
session_id: ctx.sessionId ?? '',
|
|
807
833
|
uuid: `err-${Date.now().toString(36)}`,
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
/** 一条通告是**说给谁听**的。两值,刻意不设第三值(见模块顶注)。 */
|
|
55
55
|
export type NoticeAudience = 'user' | 'operator';
|
|
56
56
|
/**
|
|
57
|
-
* 引擎**成文码册**的逐字镜像(core `ENGINE_NOTICE_CODES`,**7.20.1
|
|
57
|
+
* 引擎**成文码册**的逐字镜像(core `ENGINE_NOTICE_CODES`,**7.22.0 = 六十六码**(7.20.1 六十五 + 7.22.0 一枚 `mcp.server_redialed`(#857,operator;governance-codes.js 元组紧跟 `mcp.revocation_probe_failed`);7.20.0 六十四 + 7.20.1 一枚 `config.write_protection_target_view_absent`;7.19.0 五十九 + 7.20.0 五枚:`config.task_root_not_canonical` / `config.execution_env_capability_invalid` / `config.forward_sink_failed` / `memory.restore_withheld` / `agents.listing_truncated`,均 operator);顺序同源)。
|
|
58
58
|
* 🔴 这是一份**抄件**,不是本包的意见 —— 改它必须同 commit 附 core 坐标,且门会先红。
|
|
59
59
|
* ⚠️ `EngineNotice.code` 的型面在上游**故意留 `string`**(宿主把自己的通告转发进同一个水槽是
|
|
60
60
|
* 被支持的形),所以本表是**判据**不是型 —— 别拿它去窄化那个字段。
|
|
@@ -226,3 +226,19 @@ export interface SkillsListingTruncatedFactsView {
|
|
|
226
226
|
* 🔴 `kept` 照带不重算:引擎已在铸点算过;本包再算一遍 = 第二份公式,上游改口那天两边各走各的。
|
|
227
227
|
*/
|
|
228
228
|
export declare function readSkillsListingTruncated(notice: unknown): SkillsListingTruncatedFactsView | undefined;
|
|
229
|
+
/** `McpReconnectResult.outcome` 三词(core `src/core/mcp.ts` 逐字);无处置表 —— 成员资格就是全部意义。 */
|
|
230
|
+
export declare const MCP_REDIAL_OUTCOMES: readonly string[];
|
|
231
|
+
/** {@link readMcpServerRedialed} 的读数(core `engine-notice.d.ts` 的 `detail` 逐字同形)。 */
|
|
232
|
+
export interface McpServerRedialedFactsView {
|
|
233
|
+
server: string;
|
|
234
|
+
outcome: string;
|
|
235
|
+
/** 重拨相对于此前挂载**多**了几个命名空间化工具(计数)。 */
|
|
236
|
+
added: number;
|
|
237
|
+
/** 同上,**少**了几个。失败重拨 ⇒ 该 server 的工具全部撤走,这一格就是撤走的数目。 */
|
|
238
|
+
removed: number;
|
|
239
|
+
/** 非 `reconnected` 时的因由(已中性化、封长);渲染用,不分支。 */
|
|
240
|
+
reason?: string;
|
|
241
|
+
sessionId: string;
|
|
242
|
+
runId: string;
|
|
243
|
+
}
|
|
244
|
+
export declare function readMcpServerRedialed(notice: unknown): McpServerRedialedFactsView | undefined;
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
* 出现在本包源码或产物里 => 当场红。
|
|
53
53
|
*/
|
|
54
54
|
/**
|
|
55
|
-
* 引擎**成文码册**的逐字镜像(core `ENGINE_NOTICE_CODES`,**7.20.1
|
|
55
|
+
* 引擎**成文码册**的逐字镜像(core `ENGINE_NOTICE_CODES`,**7.22.0 = 六十六码**(7.20.1 六十五 + 7.22.0 一枚 `mcp.server_redialed`(#857,operator;governance-codes.js 元组紧跟 `mcp.revocation_probe_failed`);7.20.0 六十四 + 7.20.1 一枚 `config.write_protection_target_view_absent`;7.19.0 五十九 + 7.20.0 五枚:`config.task_root_not_canonical` / `config.execution_env_capability_invalid` / `config.forward_sink_failed` / `memory.restore_withheld` / `agents.listing_truncated`,均 operator);顺序同源)。
|
|
56
56
|
* 🔴 这是一份**抄件**,不是本包的意见 —— 改它必须同 commit 附 core 坐标,且门会先红。
|
|
57
57
|
* ⚠️ `EngineNotice.code` 的型面在上游**故意留 `string`**(宿主把自己的通告转发进同一个水槽是
|
|
58
58
|
* 被支持的形),所以本表是**判据**不是型 —— 别拿它去窄化那个字段。
|
|
@@ -103,6 +103,8 @@ export const ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
103
103
|
'delegation.ask_unresolvable',
|
|
104
104
|
'mcp.injection_dropped',
|
|
105
105
|
'mcp.revocation_probe_failed',
|
|
106
|
+
// core 7.22.0 #857(0.72.7 提货批 CC-42):宿主请这条 run 重拨一台 MCP server 的结果;一个码管两个方向。
|
|
107
|
+
'mcp.server_redialed',
|
|
106
108
|
'workflow.governance_key_stripped',
|
|
107
109
|
'workflow.agent_option_ignored',
|
|
108
110
|
'memory.session_polluted',
|
|
@@ -190,6 +192,7 @@ export const ENGINE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
190
192
|
'delegation.ask_unresolvable': 'user',
|
|
191
193
|
'mcp.injection_dropped': 'user',
|
|
192
194
|
'mcp.revocation_probe_failed': 'operator',
|
|
195
|
+
'mcp.server_redialed': 'operator',
|
|
193
196
|
'workflow.governance_key_stripped': 'operator',
|
|
194
197
|
'workflow.agent_option_ignored': 'operator',
|
|
195
198
|
'memory.session_polluted': 'user',
|
|
@@ -435,3 +438,36 @@ export function readSkillsListingTruncated(notice) {
|
|
|
435
438
|
...(sessionId !== undefined ? { sessionId } : {}),
|
|
436
439
|
};
|
|
437
440
|
}
|
|
441
|
+
// ══════════════════════════════════════════════════════════════════════════════════════════════
|
|
442
|
+
// 0.72.7 提货批(core 7.22.0 #857)—— `mcp.server_redialed` 的**事实窄读器**
|
|
443
|
+
// ══════════════════════════════════════════════════════════════════════════════════════════════
|
|
444
|
+
// 宿主请这条 run **重拨**一台 MCP server(run 句柄动词 `reconnectMcpServer`;server 侧的会话腿动词候 S-381),
|
|
445
|
+
// 结果一条 operator 通告。**一个码管两个方向**:`outcome` 是数据不是两种事件;去重单位 = **每次尝试**,永不按 run
|
|
446
|
+
// 折叠(折掉第二条会藏起「它还是没起来」那条)。`added` / `removed` 是**计数**,不是 server 自报的工具名(工具名是
|
|
447
|
+
// server 自著文本,operator 行不是披露通道)。规矩同 {@link readMcpInjectionDrop}:只认自己那一个码;必填格缺一 ⇒
|
|
448
|
+
// 整只缺席;分支键 `outcome` 按闭集读;`reason` 开集透传(非 reconnected 时才有,且**永不是唯一机读事实**)。
|
|
449
|
+
/** `McpReconnectResult.outcome` 三词(core `src/core/mcp.ts` 逐字);无处置表 —— 成员资格就是全部意义。 */
|
|
450
|
+
export const MCP_REDIAL_OUTCOMES = Object.freeze(['reconnected', 'refused', 'not_declared']);
|
|
451
|
+
export function readMcpServerRedialed(notice) {
|
|
452
|
+
if (typeof notice !== 'object' || notice === null || Array.isArray(notice))
|
|
453
|
+
return undefined;
|
|
454
|
+
const n = notice;
|
|
455
|
+
if (n.code !== 'mcp.server_redialed')
|
|
456
|
+
return undefined;
|
|
457
|
+
const d = n.detail;
|
|
458
|
+
if (typeof d !== 'object' || d === null || Array.isArray(d))
|
|
459
|
+
return undefined;
|
|
460
|
+
const o = d;
|
|
461
|
+
const str = (v) => (typeof v === 'string' && v.length > 0 ? v : undefined);
|
|
462
|
+
const count = (v) => (typeof v === 'number' && Number.isInteger(v) && v >= 0 ? v : undefined);
|
|
463
|
+
const server = str(o.server);
|
|
464
|
+
const outcome = typeof o.outcome === 'string' && MCP_REDIAL_OUTCOMES.includes(o.outcome) ? o.outcome : undefined;
|
|
465
|
+
const added = count(o.added);
|
|
466
|
+
const removed = count(o.removed);
|
|
467
|
+
const sessionId = str(o.sessionId);
|
|
468
|
+
const runId = str(o.runId);
|
|
469
|
+
if (server === undefined || outcome === undefined || added === undefined || removed === undefined || sessionId === undefined || runId === undefined)
|
|
470
|
+
return undefined;
|
|
471
|
+
const reason = str(o.reason);
|
|
472
|
+
return { server, outcome, added, removed, ...(reason !== undefined ? { reason } : {}), sessionId, runId };
|
|
473
|
+
}
|
|
@@ -96,6 +96,11 @@ export interface TaskRequestInput {
|
|
|
96
96
|
* 一个 400 回来。JS 调用方(本包是发出去的 npm 公开面)绕过型面时由构造器再判一次值。
|
|
97
97
|
*/
|
|
98
98
|
memoryCapture?: 'off';
|
|
99
|
+
/**
|
|
100
|
+
* 「这一次别给我记忆」的**请求级整面关**(CC-39③;server §12.7 姊妹键)。单成员闭集 `'off'`,缺席 = 记忆照常挂。
|
|
101
|
+
* 型面同 {@link TaskRequestInput.memoryCapture}:给它一个宽串型等于邀请调用方发一个 400 回来;JS 调用方由构造器再判一次值。
|
|
102
|
+
*/
|
|
103
|
+
memory?: 'off';
|
|
99
104
|
/** rewind 三件(E18);端自己判空。 */
|
|
100
105
|
rewind?: Record<string, unknown>;
|
|
101
106
|
/** 仓库坐标串(scan/code-review 场景;今日唯一供给方 web 的 Repository 输入=url/`owner/name` 串。
|
|
@@ -172,6 +177,31 @@ export declare const MEMORY_CAPTURE_OFF: "off";
|
|
|
172
177
|
export declare function memoryCaptureDeclarationField(declared: boolean): {
|
|
173
178
|
memoryCapture: 'off';
|
|
174
179
|
} | Record<string, never>;
|
|
180
|
+
/** `memory: "off"` 的唯一字面(server §12.7;core #863 W3)。 */
|
|
181
|
+
export declare const MEMORY_OFF: "off";
|
|
182
|
+
/**
|
|
183
|
+
* 「这一次别给我记忆」的**意图位** → 提交腿的 spread-ready 片段(CC-39③,0.72.8;与 {@link memoryCaptureDeclarationField} 同律)。
|
|
184
|
+
* 🔴 `false` ⇒ 整键缺席(= 记忆照常挂的唯一写法),不是 `{ memory: undefined }`、更不是某个「on」值。
|
|
185
|
+
* 🔴 本层只答「下一条提交带不带这一键」,不答「这次真的没挂记忆面」:后者只有引擎知道(老 server 400 / 更老 worker 静默忽略);
|
|
186
|
+
* 终局 memory 状态词 `disabled`(不是 `no-spec`)才是引擎的答案,端别拿这一位去渲「已关」。
|
|
187
|
+
* 🔴 两键同发(`memoryCapture:"off"` + `memory:"off"`)时 capture 的单向记录**不落**(core 只在挂引擎时记)—— 契约 §12.7 写真话,
|
|
188
|
+
* 不许拿 `memory:"off"` 当隐私声明;要「别记住我」用 memoryCapture 那一键。
|
|
189
|
+
*/
|
|
190
|
+
export declare function memoryOffDeclarationField(declared: boolean): {
|
|
191
|
+
memory: 'off';
|
|
192
|
+
} | Record<string, never>;
|
|
193
|
+
/**
|
|
194
|
+
* 端的两个入口 → 「这一次别给我记忆」的**意图位**(cli [7510]:发口投影归包,三端同判、壳零自判)。
|
|
195
|
+
* · `flag`:CLI 旗 `--memory <word>` 的原词 —— **只认恰 `'off'`**(单成员闭集;`'on'` / 大小写 / 带空格一律不认,
|
|
196
|
+
* 那些拼法上 wire 会被 server 400,而本层不替它买路也不替它编);
|
|
197
|
+
* · `settingsMemory`:settings 的 CC 形 `memory` 段 —— **只认严格 `{ enabled: false }`**(`"false"` / `0` / 缺席 = 沉默不是关,
|
|
198
|
+
* 与 core `ParentSpecSeat.memoryOff` 只从显式 `enabled: false` 铸同律)。
|
|
199
|
+
* 任一成立 ⇒ `true`;其余 / 坏形 / 非对象入参 ⇒ `false`(= 键缺席,记忆照常挂)。喂给 {@link memoryOffDeclarationField}。
|
|
200
|
+
*/
|
|
201
|
+
export declare function memoryOffDeclared(input: {
|
|
202
|
+
flag?: unknown;
|
|
203
|
+
settingsMemory?: unknown;
|
|
204
|
+
} | null | undefined): boolean;
|
|
175
205
|
export declare function buildTaskRequest(input: TaskRequestInput, lane: RequestLane): TaskRequestLike;
|
|
176
206
|
/** `applyLiveRequestDefaults` 的宿主输入(端解析好的值,同样零取值方式)。 */
|
|
177
207
|
export interface LiveDefaultsInput {
|
|
@@ -51,6 +51,12 @@ export const REQUEST_FIELD_MATRIX = [
|
|
|
51
51
|
// 在飞的 run,本键管「本会话的下一次新提交」。非 live 的 verb(parked / 终态 / 他副本)回
|
|
52
52
|
// 409 `steering.not_running` 并**指路本键** —— 端没有本键就接不住那条指路。
|
|
53
53
|
{ field: 'memoryCapture', lanes: ['interactive', 'print'], live: true, why: '本会话永远不进长期记忆的**声明形**(server §12.4 body 键,单成员闭集 "off");两条车道都是提交面 ⇒ 都能声明。与 memoryWrite:false 不是一个轴(那是「本 run 只读平面」)。⚠️ parked 续跑腿结构性拿不到声明(决策/续跑端点从持久 body 重建 spec),那是引擎侧事实,不是本层的漏' },
|
|
54
|
+
// ── memory:"off"(CC-39③,0.72.8;server 7.84.0 S-405 / core #863 W3)────────────────────────
|
|
55
|
+
// 🔴 契约 §12.7 姊妹键:`memoryCapture` = 「记忆照常用,但别记住我」(会话级采集面关,一次性);`memory` =
|
|
56
|
+
// 「这一次别给我记忆」(请求级整面关:不挂 # Memory 段 / 索引 / 三只记忆工具 / 写准入;零记录,可逐请求开关)。
|
|
57
|
+
// 同形、不同轴、可并存;两键共用同一只拼写判据(400 `request.field_invalid` 两腿同句)。缺席 = 记忆照常挂。
|
|
58
|
+
// 无能力位(7.78.1–7.83.x 只能 trial-by-400)⇒ 本层不预判 server 版本,照发。子代地板(ParentSpecSeat.memoryOff)归 core。
|
|
59
|
+
{ field: 'memory', lanes: ['interactive', 'print'], live: true, why: '这一次运行不挂记忆面的**请求级**开关(server §12.7 body 键,单成员闭集 "off");两条车道都是提交面 ⇒ 都能声明。与 memoryCapture(采集面)不是一个轴、可并存;与 memoryWrite:false(只读平面)也不是一个轴' },
|
|
54
60
|
// ── print 独有(§8-5 认定的**有理由**的差异)──────────────────────────────────────────────
|
|
55
61
|
{ field: 'finalVerification', lanes: ['print'], live: true, why: 'P1-1 终验:无人值守车道才需要引擎自证;交互 REPL 由人当场看结果。#106 裁 B(让位+告知)后交互面默认关' },
|
|
56
62
|
{ field: 'limits', lanes: ['print'], live: true, why: 'P2-3-b:`-p` 的预算护栏(--max-* flag 族),交互 REPL 由人随时 Esc' },
|
|
@@ -122,6 +128,13 @@ const PERMISSION_FACE_KEY = 'permissions';
|
|
|
122
128
|
* `toString` 与 `constructor` 都抛错,而**构造错误文本时抛错**会把「拒」这个判决换成一个面目全非的
|
|
123
129
|
* 异常。判决是拒,描述只是线索,取不到就报 unreadable。
|
|
124
130
|
*/
|
|
131
|
+
/**
|
|
132
|
+
* 拒绝文本用的**粗分类**(0.72.8 异源复审第二轮 [medium] 真修):只用 `typeof` / null / array 三个固定词,**不**读
|
|
133
|
+
* `Symbol.toStringTag`、也不读 prototype 的 constructor 名 —— 那两样都是**调用方可控**的串,对象可以借它们把敏感内容
|
|
134
|
+
* 带进错误展示 / 日志。memory 一族(隐私 / 记忆面声明)的拒绝路径一律走它;`shapeTag` 留给 settings.resolved 那类
|
|
135
|
+
* 载体形诊断(那里报的是构造器名这一线索,与本族的「只报形状不回显值」纪律不同)。
|
|
136
|
+
*/
|
|
137
|
+
const coarseShape = (v) => v === null ? 'typeof=object / null' : Array.isArray(v) ? 'typeof=object / array' : `typeof=${typeof v}`;
|
|
125
138
|
const shapeTag = (v) => {
|
|
126
139
|
try {
|
|
127
140
|
const proto = Object.getPrototypeOf(v);
|
|
@@ -447,13 +460,69 @@ export const MEMORY_CAPTURE_OFF = 'off';
|
|
|
447
460
|
export function memoryCaptureDeclarationField(declared) {
|
|
448
461
|
return declared ? { memoryCapture: MEMORY_CAPTURE_OFF } : {};
|
|
449
462
|
}
|
|
463
|
+
/** `memory: "off"` 的唯一字面(server §12.7;core #863 W3)。 */
|
|
464
|
+
export const MEMORY_OFF = 'off';
|
|
465
|
+
/**
|
|
466
|
+
* 「这一次别给我记忆」的**意图位** → 提交腿的 spread-ready 片段(CC-39③,0.72.8;与 {@link memoryCaptureDeclarationField} 同律)。
|
|
467
|
+
* 🔴 `false` ⇒ 整键缺席(= 记忆照常挂的唯一写法),不是 `{ memory: undefined }`、更不是某个「on」值。
|
|
468
|
+
* 🔴 本层只答「下一条提交带不带这一键」,不答「这次真的没挂记忆面」:后者只有引擎知道(老 server 400 / 更老 worker 静默忽略);
|
|
469
|
+
* 终局 memory 状态词 `disabled`(不是 `no-spec`)才是引擎的答案,端别拿这一位去渲「已关」。
|
|
470
|
+
* 🔴 两键同发(`memoryCapture:"off"` + `memory:"off"`)时 capture 的单向记录**不落**(core 只在挂引擎时记)—— 契约 §12.7 写真话,
|
|
471
|
+
* 不许拿 `memory:"off"` 当隐私声明;要「别记住我」用 memoryCapture 那一键。
|
|
472
|
+
*/
|
|
473
|
+
export function memoryOffDeclarationField(declared) {
|
|
474
|
+
return declared ? { memory: MEMORY_OFF } : {};
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* 端的两个入口 → 「这一次别给我记忆」的**意图位**(cli [7510]:发口投影归包,三端同判、壳零自判)。
|
|
478
|
+
* · `flag`:CLI 旗 `--memory <word>` 的原词 —— **只认恰 `'off'`**(单成员闭集;`'on'` / 大小写 / 带空格一律不认,
|
|
479
|
+
* 那些拼法上 wire 会被 server 400,而本层不替它买路也不替它编);
|
|
480
|
+
* · `settingsMemory`:settings 的 CC 形 `memory` 段 —— **只认严格 `{ enabled: false }`**(`"false"` / `0` / 缺席 = 沉默不是关,
|
|
481
|
+
* 与 core `ParentSpecSeat.memoryOff` 只从显式 `enabled: false` 铸同律)。
|
|
482
|
+
* 任一成立 ⇒ `true`;其余 / 坏形 / 非对象入参 ⇒ `false`(= 键缺席,记忆照常挂)。喂给 {@link memoryOffDeclarationField}。
|
|
483
|
+
*/
|
|
484
|
+
export function memoryOffDeclared(input) {
|
|
485
|
+
if (typeof input !== 'object' || input === null)
|
|
486
|
+
return false;
|
|
487
|
+
// 🔴 异源对抗复审 [medium] 真修:入口投影**不许**把打错字的收紧声明降级成「缺席」—— 那样片段函数删键、`refuseBadMemoryOff`
|
|
488
|
+
// 无从校验,用户以为关了、这次运行照常挂上记忆面。旗在场但不是 'off' ⇒ 响亮拒(与 buildTaskRequest 同律,不回显值)。
|
|
489
|
+
const flag = input.flag;
|
|
490
|
+
if (flag !== undefined && flag !== null && flag !== MEMORY_OFF) {
|
|
491
|
+
throw new TypeError(`memoryOffDeclared: --memory 旗只接受字面量 \'off\' 或缺席 —— 收到 ${coarseShape(flag)}。上游是单成员闭集(没有 "on"),` +
|
|
492
|
+
'打错字的关闭声明若被折成缺席,这一次运行会照常挂上记忆面而声明人不会知道。错误文本只报形状,不回显值。');
|
|
493
|
+
}
|
|
494
|
+
let fromSettings = false;
|
|
495
|
+
const sm = input.settingsMemory;
|
|
496
|
+
if (sm !== undefined && sm !== null) {
|
|
497
|
+
if (typeof sm !== 'object' || Array.isArray(sm)) {
|
|
498
|
+
throw new TypeError(`memoryOffDeclared: settings 的 memory 段必须是对象 —— 收到 ${coarseShape(sm)}。`);
|
|
499
|
+
}
|
|
500
|
+
const enabled = sm.enabled;
|
|
501
|
+
// CC 形 `memory: { enabled }`:缺席 = 沉默(不是关);在场必须是布尔 —— "false" / 0 是打错字的收紧声明,同样响亮拒。
|
|
502
|
+
if (enabled !== undefined && typeof enabled !== 'boolean') {
|
|
503
|
+
throw new TypeError(`memoryOffDeclared: settings memory.enabled 在场时必须是布尔 —— 收到 ${coarseShape(enabled)}。`);
|
|
504
|
+
}
|
|
505
|
+
fromSettings = enabled === false;
|
|
506
|
+
}
|
|
507
|
+
return flag === MEMORY_OFF || fromSettings;
|
|
508
|
+
}
|
|
509
|
+
const refuseBadMemoryOff = (v) => {
|
|
510
|
+
if (v === undefined || v === null)
|
|
511
|
+
return;
|
|
512
|
+
if (v === 'off')
|
|
513
|
+
return;
|
|
514
|
+
throw new TypeError('buildTaskRequest: memory 只接受字面量 `\'off\'` 或缺席(undefined/null)—— ' +
|
|
515
|
+
`收到 ${coarseShape(v)}。这一位是**请求级整面开关**(「这一次别给我记忆」),上游是**单成员闭集**(没有 ` +
|
|
516
|
+
'`"on"`,`{ enabled: false }` 对象形也不是 wire 拼法)且对坏拼写**响亮拒**(server 400 `request.field_invalid`)。' +
|
|
517
|
+
'本层若静默删键,这一次运行会照常挂上记忆面而声明人不会知道 —— 与 memoryCapture 同一条纪律。错误文本只报形状,不回显值。');
|
|
518
|
+
};
|
|
450
519
|
const refuseBadMemoryCapture = (v) => {
|
|
451
520
|
if (v === undefined || v === null)
|
|
452
521
|
return;
|
|
453
522
|
if (v === 'off')
|
|
454
523
|
return;
|
|
455
524
|
throw new TypeError('buildTaskRequest: memoryCapture 只接受字面量 `\'off\'` 或缺席(undefined/null)—— ' +
|
|
456
|
-
`收到 ${
|
|
525
|
+
`收到 ${coarseShape(v)}。这一位是**会话级隐私声明**(「本会话永远不进长期记忆」),` +
|
|
457
526
|
'上游是**单成员闭集**(没有 `"on"`)且对坏拼写**响亮拒**(core `config.memory_capture_spelling` / ' +
|
|
458
527
|
'server 400 `request.field_invalid`)。本层若把坏值静默删键,请求会照发、引擎会照常采集,' +
|
|
459
528
|
'而声明人不会知道自己的 opt-out 丢了 —— 把一条隐私请求按打字错误静默丢掉是**禁的方向**。' +
|
|
@@ -462,7 +531,12 @@ const refuseBadMemoryCapture = (v) => {
|
|
|
462
531
|
export function buildTaskRequest(input, lane) {
|
|
463
532
|
const live = input.live;
|
|
464
533
|
// ⑤ 响亮拒排在最前面:一条打错字的隐私声明绝不许被后面任何一条「不 stamp」路径吞掉。
|
|
465
|
-
|
|
534
|
+
// 🔴 只读一次(异源复审第二轮 [medium] 真修):校验与 stamp 共用**同一次读取**。带 getter / proxy 的入参在两次读取之间可以
|
|
535
|
+
// 变值 —— 第一次 'off' 过了校验、第二次 'OFF' 在 stamp 处被折成缺席,一条收紧声明就这样静默丢了。
|
|
536
|
+
const memoryCaptureIn = input.memoryCapture;
|
|
537
|
+
const memoryIn = input.memory;
|
|
538
|
+
refuseBadMemoryCapture(memoryCaptureIn);
|
|
539
|
+
refuseBadMemoryOff(memoryIn);
|
|
466
540
|
/** stamp 门:字段在本车道的表里 ∧(非 live-gated ∨ 本次是 live 车道)∧ 值非空。 */
|
|
467
541
|
const on = (field, value) => {
|
|
468
542
|
if (value === undefined || value === null)
|
|
@@ -541,9 +615,11 @@ export function buildTaskRequest(input, lane) {
|
|
|
541
615
|
: {}),
|
|
542
616
|
...(on('oneShot', input.oneShot) && input.oneShot === true ? { oneShot: true } : {}),
|
|
543
617
|
// ⑤ 单成员闭集:值**恰是** `'off'` 才 stamp。表外拼写在上面已经**响亮拒**(见 `refuseBadMemoryCapture`)。
|
|
544
|
-
...(on('memoryCapture',
|
|
618
|
+
...(on('memoryCapture', memoryCaptureIn) && memoryCaptureIn === 'off'
|
|
545
619
|
? { memoryCapture: 'off' }
|
|
546
620
|
: {}),
|
|
621
|
+
// CC-39③:姊妹键同律(值恰是 'off' 才 stamp;坏拼写已在上面响亮拒)。
|
|
622
|
+
...(on('memory', memoryIn) && memoryIn === 'off' ? { memory: 'off' } : {}),
|
|
547
623
|
...(Object.keys(settingsOut).length > 0 ? { settings: settingsOut } : {}),
|
|
548
624
|
};
|
|
549
625
|
return out;
|
package/dist/seam.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
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, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, ContextUsageSectionView } from './adapter/downstream/eventToSdkMessage.js';
|
|
12
|
+
import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView, ContextUsageSectionView } from './adapter/downstream/eventToSdkMessage.js';
|
|
13
13
|
import type { ToolRosterView, ToolRosterDeltaView } from './toolRoster.js';
|
|
14
14
|
/**
|
|
15
15
|
* `AbortSignal` 的结构型(B3 扩容,SEAM-GAP-4)。
|
|
@@ -597,6 +597,8 @@ export interface WiringManifestChromeEvent {
|
|
|
597
597
|
writeProtection?: WiringManifestWriteProtectionView;
|
|
598
598
|
/** core 7.21.0 / server 7.82.0(0.72.4 CC-35):第八段 —— 记忆自动整理武装(present-iff 武装 ∧ operator 面;🔴 缺席 = indeterminate,不折 false)。 */
|
|
599
599
|
autoConsolidation?: WiringManifestAutoConsolidationView;
|
|
600
|
+
/** core 7.22.0 #889(0.72.7 CC-42):第九段 —— 内置读 deny 表的实质激活档位(present-iff 有内置行判;🔴 缺席 = 没有这条腿,不是「没有读被 deny 判」)。 */
|
|
601
|
+
readDeny?: WiringManifestReadDenyView;
|
|
600
602
|
/** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
601
603
|
eventId?: string;
|
|
602
604
|
}
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.72.
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.72.8**(本批发布版 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 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
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
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
|
-
| 公开导出面 | **
|
|
26
|
+
| 公开导出面 | **977** 个运行期符号(+ 45 个测试钩;= 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 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`(四个单码常量 🔧 0.72.0 退役)/`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`(两个探针常量 🔧 0.72.0 退役)/`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.72.0 退役);`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
|
|
|
@@ -121,7 +121,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
121
121
|
|
|
122
122
|
## §2 公共导出面地图(按域)
|
|
123
123
|
|
|
124
|
-
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**
|
|
124
|
+
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**977** 项)。
|
|
125
125
|
> 本节**不逐名抄**,只给「域 → 承重导出 → 用途 → 实现锚」。承重导出 = 一个端为了让这个域干活
|
|
126
126
|
> **必须**直接调到的那几个符号;其余是它们的类型、变体与辅助位。
|
|
127
127
|
> 单一入口:`import { … } from '@sema-agent/client-core'`(`exports` 只有 `.` 一个;
|
|
@@ -145,21 +145,21 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
145
145
|
`WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
|
|
146
146
|
**4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
977 项的内部构成(帮助端估读表大小;0.72.8 +2 常量 +4 函数(CC-39③ / CC-43);0.72.7 +1 常量 +1 函数(CC-42);0.72.6 +1 函数(CC-40);0.72.5 +1 常量 +5 函数(CC-31);0.72.3 +1 常量(CC-39①);0.72.2 +1 函数(CC-37);0.72.1 +1 常量 +3 函数(CC-33);0.72.0 −23 常量 −16 函数(CC-32 退役批);0.71.3 +4 常量 +5 函数(CC-06);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):**284** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
|
|
149
149
|
(矩阵、键集、env 名、锚串)而非可调用物;**6** 项是 PascalCase 运行期值
|
|
150
150
|
(`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError`);
|
|
151
151
|
**37** 项是 `*For(sessionKey, …)` 的 per-session 变体(0.72.0 −4:`clearArmedGateFor` / `onGateArmedFor` / `registerArmedGateFromQuestionIdFor` / `notePlanReviewAnsweredIfDecisiveFor` 退出公面)(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
|
|
152
152
|
|
|
153
|
-
### 2b. 域图(16 域,逐域计数之和 =
|
|
153
|
+
### 2b. 域图(16 域,逐域计数之和 = 977)
|
|
154
154
|
|
|
155
155
|
| # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
|
|
156
156
|
|---|---|---|---|---|---|
|
|
157
|
-
| 1 | **适配内核(下行主链)** |
|
|
157
|
+
| 1 | **适配内核(下行主链)** | 60 | `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`(0.72.8 CC-43:runStream 第二条中性臂 —— core malformed tool-call 一族的行身份;§55)· `readEffectiveReasoning` · `readEffectiveMemoryScopes`(0.71.3 CC-06:终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` 的窄读器,§45)· `isSubFlowSegmentEnd` · `SEGMENT_END_IDENTITY_KEYS` · `droppedWhySentence`(0.69.2 CC-13:三件出公面,§38)· `adapt` · `createWireToCcAdapter` · `runStream` · `eventToSdkMessage` · `terminalToSdkResult` · `SEMA_SEGMENT_ID_KEY`(0.68.2 CC-01:committed assistant 文本行顶层段身份键的唯一字面量出处,壳只读)· `projectMcpSection`(0.68.2 CC-03:`wiring_manifest.mcp[]` 与 `/mcp` 面板 `lastLegMcp.mcp[]` 共用的同一只条目读器)· `readRunCostFacts`(0.66.0:终局成本事实的**唯一读器** —— `TaskStats.costBreakdown` / `nested` 逐键窄读 + 对账三段(own/nested/compaction)与两个「没定价」判别位;终帧的两个超集键与 chrome 臂 `run_cost_reconciled` **共用它**,两面不会各算各的,详见 §31c)· `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`(0.68.0 / L-247:**core 终局因由**闭集,四词 `completed|failed|blocked|paused`)· `RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`RUN_TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇的**单铸谓词**,0.68.0 随 L-247 **两表分源**更名 —— `killed` 属 server run 行状态面、`paused` 属 core 因由面,合成一张会让两边加词时都读不出该改哪儿;`blocked` 是 agent 自报终态,`suspended`/`needs_review` 刻意不在表里,详见 §33b / §30j)· `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(0.68.0 / L-244:子代用量下界位的**自有名**与唯一判据,与终帧 `_sema_usage_lower_bound` 分名,详见 §33g) · `turnUsageToModelUsage` · `isRunStreamActive` · `ADAPTER_DIVERGENCES` · `readRunTerminal` / `runTerminalCode` / `runTerminalGateKind` / `runTerminalGateToolName` / `isReviewPark` / `REVIEW_PARK_GATE_KINDS`(0.60.0 / engine ≥7.64.0:一次 run **怎么结束的**唯一读器 —— 终局从八个平面键换成一条带标因由 `terminal`,四臂 + `unknown` 防御臂 + `plane` 两代字节标;🔴 不认识的终态词绝不折成成功、本包不提供「因由→五词 status」的兼容投影,详见 §24b)| 引擎 SSE `AgentEvent` → 端要渲的**双面输出**:transcript(`SDKMessage`)+ chrome(瞬态 `ChromeEvent`)。**本包存在的理由** | `src/adapt.ts`、`src/adapt/{arms,wireShapes,panelTasks}.ts`(经 `adapt.ts` 再导出)、`src/adapter/runStream.ts`、`src/adapter/downstream/*`、`src/adapter/types.ts`、`src/runTerminal.ts` |
|
|
158
158
|
| 2 | **seam 公共契约** | 2(其余为 type-only) | `CHROME_ARMS` · `deriveTranscriptId` | 公共词汇 + **id 确定性不变量**(同一条流重放 ⇒ 同一串 id)。`CHROME_ARMS` = 端「我要消费哪些 chrome 臂」的对照清单 | `src/seam.ts` |
|
|
159
159
|
| 3 | **HITL 决断卡链**(§4/§5 主战场) | 160 | `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor` · `waitForGateArmed(For)`/`onGateArmed`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey(For)`/`notePlanReviewAnswered(For)`/`notePlanReviewAnsweredIfDecisive`(A-024.4 plan 呈现分代) · `toolEndOutputText` · `isAskTool` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `surfaceRuleArmNotSent` / `RULE_NOT_SENT_WARN_TEXT` + `surfaceRuleArmRejected` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`isAskTool`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`src/gateOutcome.ts` |
|
|
160
160
|
| 4 | **子代 wire + 面板侧信道台账** | 86 | `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + `noteBgOwnerAbsence` 留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `noteBgOwnerAbsence`(#242 批 3 [4000] Q3=B:tail/taskOutput·taskStop/subagentOutput 三腿台账缺席即诚实缺席**绝不回落在飞 run**,缺席 warn 留痕每 (腿,taskId) 一条)· `clearBgTerminalFacts`(#242 批 3 扫码修:复活=新周期,旧周期终态事实作废——fleetLedger 复活两腿按尾段清账,factsAccepted 方向核不再拿上周期终态当先例)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
|
|
161
161
|
| 5 | **fleet 投影** | 38 | `createFleetLedger` · `projectTasks` · `projectWorkflows` · `projectFleetAgentRows` · `readEngineActiveBgTasks` · `FLEET_TASK_VIEW_KEYS` · `escapeDisplayControlChars`(不可见字符可见化,行标签/描述消毒的共享底座)· `capForDisplay`(0.62.0:呈前**消毒 + 封长**的共用铸点 —— 先转义、后按转义结果封长,截点避开半截转义 token 与合法代理对;本包该族四处此前各写一份、其中三份顺序是反的,详见 §26⑦)· `wireCycleSeq`(0.38.0 提货补投的 #261 §2 两位之一,另一位 `wireRetiredBy` 🔧 0.72.0 退出公面:代际号 = SendMessage 复活即 +1,**缺席 ≠ 第一代**;`retiredBy` 在场 = 这条终态是对账腿从 durable run 行投影出来的、**不是**发布方亲报 —— 幽灵行与正常收尾唯一的 wire 判据。两位都只在场才落键) | 老 `fleetClient` 那一刀的成品:**帧体归库、连接归端** —— 端持 SSE 连接,库做行投影 + 保留台账 | `src/fleet/fleetProjection.ts`、`src/fleet/fleetLedger.ts`、`src/fleetAgentPanelProjection.ts`、`src/fleetTaskDesc.ts` |
|
|
162
|
-
| 6 | **请求装配(上行唯一构造口)** |
|
|
162
|
+
| 6 | **请求装配(上行唯一构造口)** | 13 | `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`(0.72.8 CC-39③:`memory:"off"` 请求级整面关的意图位片段;§55)· `buildTaskRequest` · `REQUEST_FIELD_MATRIX` · `unregisteredRequestKeys` · `applyLiveRequestDefaults` · `taskNotificationToPrintFrame` | 两条车道(`interactive`/`print`)出站请求的**唯一**构造器;`unregisteredRequestKeys` 是可执行门 —— 端偷带一个未登记键上 wire 就红 | `src/request/taskRequest.ts`、`src/request/printNotification.ts` |
|
|
163
163
|
| 7 | **通知与 outstanding 台账** | 52 | `noteOwnWorkflowRun`(0.72.2 CC-37:own 台账显式登记口,adapter workflow lane 门在 own-run 正向证明下同拍调;§49)· `installNotificationQueuePort` · `normalizeTaskNotification` · `taskNotificationDedupKeyFromWire` · `registerOutstandingBgTask` / `registerOutstandingWorkflowRun` · `notificationQueuePortMisses` · `subscribeOutstandingWorkflows` · `outstandingDeliverableWorkflowCount` | `task_notification` 归一 + 去重 + 投递进宿主命令队列的**一把闸**;`outstandingDeliverableWorkflowCount()` 是 headless `-p` 的**退出门** · `classifyPeerNotification` / `renderPeerFrameTranscriptText` / `parsePeerFrameText` / `peerFrameDisplayName` + 三张闭集表(design/385,0.54.0:同一条 `task_notification` 车道上三条**引擎注入帧**的类型化投影 —— 判别位=载体在场而非 summary 文本,详见 §17) | `src/notifications.ts`(11 个 module 台账) |
|
|
164
164
|
| 8 | **工具结果卡** | 24 | `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
|
|
165
165
|
| 9 | **能力/旋钮 wire 门族** | 97 | `AGENT_MEMORY_WORDS`(0.72.3 CC-39①:`memory: user|project|local` 三词;`projectAgentsForWire` 把它们同映射为 `agents[].memory = { scopes:[agent:<type>], writeScope }`;§50)· `skillBaseDirOf`(0.72.1 CC-33:`SkillSpec.baseDir` 窄读 = server 顶层门同一只结构判据;`skillCommandsToSpecs` 第三参 `{ toolsRunHere }` 只在本机车道带;§48)· `projectAgentsForWire` / `awaitTaskAgentsWire` · `hooksForWire` · `mcpConfigsToSpecs` · `ultracodeForRequest` · `resolveWebSearch` + `buildWebSearchEnv` · `attachmentsForRequest` · `projectEffectiveBody` · `classifySelfOrchestrationRefusal` / `stripSelfOrchestrationIntent` / `projectWorkflowsGate` / `SELF_ORCHESTRATION_RETRY_WITHOUT`(S-81,server 7.57.0:上面两条 stamp 腿的**背面** —— 半配置多租户形态下 server 把带 `selfOrchestration` / `settings.ultracode` 的提交 501 拒掉,判型/去键/caps 闸三处都是判定不是文案,详见 §13) · `engineCapsGeneration`(0.60.0,异源对抗复审 [medium] 逼出:caps 探测的**当代号**读口 —— 代际闸在 probe **返回之后**才跑,而宿主的读面 tee 是在 probe **内部**落地的 ⇒ 一次慢的旧探测能把上一台引擎的读数写回来。宿主在**起探测那一刻**抓号、tee 时交回 `{generation}`,陈旧那一发整只丢掉;不传 = 逐字节同行为,详见 §24e)| 逐功能的「引擎有没有这个能力 + 这个字段怎么上 wire」投影器,由 `buildTaskRequest` 组装。🔴 `hooksForWire()` 是 **fail-closed**:无 `SettingsPort` ⇒ 返回 `undefined`(信任门,不是取值) | 17 个 `src/*WireCaps.ts` + `src/scratchpadWireCaps.ts`、`src/hooksWireCaps.ts`、`src/goalStopHook.ts`、`src/websearch/searchProviderPresets.ts`、`src/selfOrchestrationDenial.ts`(S-81 拒绝判定层) |
|
|
@@ -169,7 +169,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
169
169
|
| 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 桌面壳里的符号只会零命中,而零命中在这里**既不证真也不证伪**。复核这些断言**不得**拿本仓语料当反证 |
|
|
170
170
|
| 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` |
|
|
171
171
|
| 15 | **控制面与传输** | 131 | `steerFollowIntent`(0.72.6 CC-40:steer 后续听意图三态 tail / after-decision / after-wake,按 `SteerReceipt.delivery` 判;§53)· `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail` + `WEB_SEARCH_BACKEND_NONE`(0.72.5 CC-31:`capabilities.webSearch.backend` 四态读面 —— 键缺席 = 老引擎判不了 ≠ `none` = 引擎明说没有默认后端;与 `sqlEngineCapability` / `writeProtectionCapability` 同构;§52)· `resumeContextUnavailableFromError` / `resumeContextUnavailableContent`(0.72.1 CC-33:409 `conflict.resume_context_unavailable` 读数 `{ code, staleAfterSec?, runId? }` + 三句人话;§48)· `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/webSearchBackendCapability.ts`、`src/readFacePosture.ts` |
|
|
172
|
-
| 16 | **引擎词汇表与包自检** |
|
|
172
|
+
| 16 | **引擎词汇表与包自检** | 93 | `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`(0.72.7 CC-42:通告 `mcp.server_redialed` 事实读器,outcome 三词闭集、added/removed 计数;§54)· `RESUME_CONTEXT_UNAVAILABLE`(0.72.1 CC-33;不进两个 resume 闭集:不可等、也不是换参数)· `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` · `resumeReopenFromError` / `resumeReopenContent`(0.71.3 CC-06:resume reopen 族三码闭集 + 读口 + 三句,§45)· `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`)|
|
|
173
173
|
|
|
174
174
|
🔴 **`engineErrorCodes` 的开集纪律**(该文件头注逐字):这些 `ReadonlySet` / 前缀谓词一律是**识别表**,
|
|
175
175
|
回答的是「我认不认得这个码」,**绝不是**「合法码只有这些」。消费点 `switch` **必须留 `default`**,
|
|
@@ -4631,7 +4631,7 @@ an argument」。audience 答另一问:这条事实**说给谁听**。
|
|
|
4631
4631
|
**签名**
|
|
4632
4632
|
|
|
4633
4633
|
```ts
|
|
4634
|
-
ENGINE_NOTICE_CODES: readonly string[] //
|
|
4634
|
+
ENGINE_NOTICE_CODES: readonly string[] // 66 码,顺序同源(core 7.22.0 +1 mcp.server_redialed;0.72.7)
|
|
4635
4635
|
ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>
|
|
4636
4636
|
noticeAudienceOf(code: unknown): 'user' | 'operator'
|
|
4637
4637
|
engineNoticeInCatalog(code: unknown): boolean
|
|
@@ -8462,3 +8462,63 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
|
|
|
8462
8462
|
3. peer sdk >=9.6.0 / agent-types >=0.3.0 不动;零 wire 键。
|
|
8463
8463
|
|
|
8464
8464
|
**包侧缺口:** ① CC-41 leader `needs_human` + `result.conflict` 渲染面(0.72.7);② CC-39②③(memory-status `consolidation?` 切片判定 / `REQUEST_FIELD_MATRIX` memory 行;候 server 片1b);③ CC-30 MCP 会话内重连消费口(候 core #857 + server S-381);④ CC-34 `permission_denials` 自动升级验证(候 server S-394);⑤ CC-36 托管 MCP 活性三态读口(候 core #874 + server 转发半场);⑥ `staleAfterSec` / `runId` 经 sdk 到端(候 sdk 出键);⑦ `Capabilities.webSearch` 经 sdk 声明(候 sdk 出键);⑧ `agents.listing_truncated` detail 读器候消费场景(by-design);⑨ `ClassifierSeat.defaulted?` 候 sdk 出键(by-design);⑩ §NNz「declined 键真零命中」机读第二刀(候形式化)。
|
|
8465
|
+
|
|
8466
|
+
## §54 🆕 0.72.7 core 7.22.0 提货(CC-42:通告码 66 `mcp.server_redialed` + `wiring_manifest.readDeny` 第九段;patch)
|
|
8467
|
+
|
|
8468
|
+
> **patch**:型面纯 additive(`_sema_readDeny` 超集键 + 通告闭集 +1 + `readMcpServerRedialed` / `MCP_REDIAL_OUTCOMES` 两导出;公面 969 → 971;peer 不动;devDep core `~7.22.0`)。提货单 [7503] @client-core 三条:① 型面三件 ② 通知码镜像 +1 ③ 新导出四个;本包按 wire 形读,server 承载版(7.84.0 候)到货前老 server 上两段恒缺席、老码不出现。
|
|
8469
|
+
|
|
8470
|
+
### 54a. 处置表
|
|
8471
|
+
|
|
8472
|
+
| # | 面 | 本包做了什么 | 端要做什么 |
|
|
8473
|
+
|---|---|---|---|
|
|
8474
|
+
| S-1 | **`mcp.server_redialed`**(operator;`detail: { server, outcome, added, removed, reason?, sessionId, runId }`;去重 = 每次尝试) | `ENGINE_NOTICE_CODES` 镜像 +1(紧跟 `mcp.revocation_probe_failed`)+ audience operator;事实读器 `readMcpServerRedialed(notice)`(`outcome` 按 `MCP_REDIAL_OUTCOMES` 三词闭集读,词表外整只缺席;`added` / `removed` 非负整数计数;`reason` 开集只渲不分支) | 运维通知面按 operator 渲;**每次尝试一条**不折叠(第二条可能说「它还是没起来」);渲 `outcome` 与两个计数,**不**把计数当工具名;措辞用引擎 `message`(单铸律) |
|
|
8475
|
+
| S-2 | **`wiring_manifest.readDeny?: { builtinTiers }`**(#889;present-iff 有内置行判;进 `configFingerprint`) | 切片第九段 `_sema_readDeny` + chrome `wiring_manifest.readDeny?`;空数组 / 成员非非空串 / 非对象 ⇒ 段缺席其余段照投;档位词开集原序透传;多余成员不过境 | 渲「内置读 deny 档位:credentials, …」当且仅当键在场;🔴 **缺席不渲「未开 / 没有读 deny」**(缺席 = 没有内置行判这条腿;`readDenyPatterns` 另一套来源不上报);要老姿态的部署写 `readDenyBuiltinTiers: ["credentials","browser","wallet","agent-config"]`(运维事,端只渲) |
|
|
8476
|
+
| S-3 | `SafetyAxis.shell?` / `ParentSpecSeat.memoryOff?` / `currentClamps.memoryOff?` | **零动作**:本包不读该三位(ask 门族按 `gateKind` 分臂;resume-clamp 形不镜像) | 零动作;若端自己读 `safetyAxis`,`shell` 与 `irreversible` 互斥、读在场永不读缺席 |
|
|
8477
|
+
| S-4 | 新导出四个 / `ReadDenyBuiltinTier` 首登记 / `AUTO_MODE_UNAVAILABLE_CAUSES` 不变 | **n/a**(零 core 值级 import;三词以字面镜像) | 零动作 |
|
|
8478
|
+
| S-5 | #857 引擎半场到位 ⇒ CC-30 / #897 ⇒ CC-34 | **pending**:CC-30 等 server S-381 会话腿动词(7.84.0 候);CC-34 等 core #897 三铸点 + server 透传 | 候 |
|
|
8479
|
+
|
|
8480
|
+
### 54z. 逐键处置表
|
|
8481
|
+
|
|
8482
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
8483
|
+
|---|---|---|---|
|
|
8484
|
+
| 1 | `mcp.server_redialed` + `detail` 七键 | **consumed(镜像 +1 + 读器)** | `src/engineNoticeCodes.ts` `#ENGINE_NOTICE_CODES` / `#NOTICE_AUDIENCE` / `#readMcpServerRedialed` / `#MCP_REDIAL_OUTCOMES`;码册门 G8b 66 + G10 八格 |
|
|
8485
|
+
| 2 | `wiring_manifest.readDeny.builtinTiers` | **consumed(切片第九段)** | `src/adapter/downstream/eventToSdkMessage.ts` `#projectReadDenySection`;`src/adapt/arms.ts` `#wiringManifestArm`;`docs/type-superset.json` `_sema_readDeny`;wiring 门 M 段 13 格 |
|
|
8486
|
+
| 3 | `SafetyAxis.shell` / `memoryOff` 两 typeKey | **declined** | 本包不读该三位 |
|
|
8487
|
+
| 4 | core 导出 +4 | **n/a** | 端口注入,零 core 值级 import |
|
|
8488
|
+
|
|
8489
|
+
### 54y. 🔴 三端升级必读(固定段式,[C295])
|
|
8490
|
+
|
|
8491
|
+
1. 换钉 `^0.72.7`:operator 通知面加 `mcp.server_redialed`(每次尝试一条;`readMcpServerRedialed` 取 outcome + 两计数);operator 面板从 chrome `wiring_manifest.readDeny` 渲激活档位,缺席不渲「未开」。
|
|
8492
|
+
2. `ENGINE_NOTICE_CODES` 66,码册镜像随包;`SafetyAxis.shell` / `memoryOff` 端零动作。
|
|
8493
|
+
3. peer sdk >=9.6.0 / agent-types >=0.3.0 不动;server <7.84.0 上两段恒缺席。
|
|
8494
|
+
|
|
8495
|
+
**包侧缺口:** ① CC-41 leader `needs_human` + `result.conflict` 渲染面(0.72.8);② CC-30 MCP 会话内重连消费口(core #857 已到;候 server S-381 / 7.84.0);③ CC-34 `permission_denials` 自动升级验证(候 core #897 + server 透传);④ CC-39②③(memory-status `consolidation?` 切片判定 / `REQUEST_FIELD_MATRIX` memory 行;候 server 片1b);⑤ CC-36 托管 MCP 活性三态读口(候 core #874 随 #857 定形 7.22.x);⑥ `staleAfterSec` / `runId` 经 sdk 到端(候 sdk 出键);⑦ `Capabilities.webSearch` 经 sdk 声明(候 sdk 出键);⑧ `agents.listing_truncated` detail 读器候消费场景(by-design);⑨ `ClassifierSeat.defaulted?` 候 sdk 出键(by-design);⑩ §NNz「declined 键真零命中」机读第二刀(候形式化)。
|
|
8496
|
+
|
|
8497
|
+
## §55 🆕 0.72.8 清账三票(CC-39③ `memory:"off"` 请求键 / CC-43 `Model output error:` 中性臂 / CC-44 注入件自动 steer;patch)
|
|
8498
|
+
|
|
8499
|
+
> **patch**:型面纯 additive(+2 常量 +4 函数,公面 971 → 977;`ActiveRunSelfHealDeps.submissionOrigin?` 可选席;零 wire 新键 —— `memory` 键由 server 7.84.0 [7506] S-405 铸,本包只发;peer 不动)。三票来源:server [7506] ④ @client-core(`memory:"off"` 读口/发口)/ cli [7504] @client-core ②(L-372 ③ 包侧正位)/ cli [7504] L-380(归层半场)。
|
|
8500
|
+
|
|
8501
|
+
### 55a. 处置表
|
|
8502
|
+
|
|
8503
|
+
| # | 面 | 本包做了什么 | 端要做什么 |
|
|
8504
|
+
|---|---|---|---|
|
|
8505
|
+
| S-1 | **`TaskRequestBody.memory?: "off"`**(server ≥7.84.0;单成员闭集;契约 §12.7 与 `memoryCapture` 姊妹键) | **consumed(发口)**:`REQUEST_FIELD_MATRIX` 加 `memory` 行(两车道,live 门);`buildTaskRequest` 值恰 `'off'` 才 stamp,坏拼写(含 `{ enabled: false }`)响亮拒 `TypeError`;`memoryOffDeclarationField(declared)` 意图位片段;`MEMORY_OFF`;**`memoryOffDeclared({ flag?, settingsMemory? })`**(cli [7510]:`--memory off` 旗恰 `'off'` ∨ settings CC 形 `memory: { enabled: false }` 严格 false ⇒ true,三端同判;🔴 旗在场非 `'off'` / `enabled` 在场非布尔 / 段非对象 ⇒ 响亮拒 `TypeError` 不回显值 —— 入口投影不把打错字的收紧声明降级成缺席) | 端只交两个入口的原值:`buildTaskRequest({ …, ...memoryOffDeclarationField(memoryOffDeclared({ flag, settingsMemory })) }, lane)`,零自判;🔴 别拿这一位渲「已关」(引擎的答案是终局 memory 状态词 `disabled`);🔴 别把它当隐私声明(要「别记住我」用 `memoryCaptureDeclarationField`);老 server 400 `request.field_invalid` / 更老 worker 静默忽略 —— 端如实渲那条 400,不预判 |
|
|
8506
|
+
| S-2 | core 三 brain 的 malformed tool-call 一族以 `done{failed, errorMessage}` 收口 | **consumed**:`runStream` 第二条中性臂,行身份 `Model output error: <引擎原话>`(`isApiErrorMessage` 行类旗不变;busy / 治理两臂优先;只锚 core 原句两句,近似词仍 `API Error:`);导出 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText` | 渲染面把 `isModelOutputErrorRowText(text)` 与 `startsWithApiErrorPrefix` / `isGovernanceStopRowText` 同等对待(错误行 chrome;不进 compact 摘要、不给 banner model 挣分);cli 归约器 `retagModelOutputErrorRow` 退成直通(行已带新前缀 ⇒ 幂等零变);`-p` 提交腿的 typed HTTP 错误臂不归本臂(那是提交时错误,不是 run 中途) |
|
|
8507
|
+
| S-3 | 系统注入件撞活 run(409 `conflict.session_active_run`) | **consumed**:`ActiveRunSelfHealDeps.submissionOrigin: 'injected'` ⇒ 不呈三选卡、直接 steer 恰一次 ⇒ `running-steered` ⇒ `steerFollowIntent` 续听;无正文 / 无 steer 动词 ⇒ `not-parked` 零动作;不碰拒卡登记表;`'user'` / 缺席逐字节同旧 | 注入件提交路径把 `submissionOrigin: 'injected'` 传进 `attemptActiveRunSelfHeal` 的 deps(与 `activeRunSelfHealRow(…, 'injected')` 同一个词),`deniedMessage` = 注入件正文;用户形三选卡照旧;续听按 §53 |
|
|
8508
|
+
|
|
8509
|
+
### 55z. 逐键处置表
|
|
8510
|
+
|
|
8511
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
8512
|
+
|---|---|---|---|
|
|
8513
|
+
| 1 | `TaskRequestBody.memory` | **consumed(发口)** | `src/request/taskRequest.ts` `#REQUEST_FIELD_MATRIX` `memory` 行 / `#memoryOffDeclarationField` / `#memoryOffDeclared` / `#refuseBadMemoryOff`;pure 门 ⑤b 55 格 |
|
|
8514
|
+
| 2 | `done.result.errorMessage`(core malformed tool-call 一族) | **consumed(身份换)** | `src/adapter/runStream.ts` `#isModelOutputErrorText` / `#MODEL_OUTPUT_ERROR_PREFIX`;identity-copy 门 G1c 10 格 |
|
|
8515
|
+
| 3 | 409 `conflict.session_active_run` × 注入件 | **consumed(分臂)** | `src/adapter/activeRunSelfHeal.ts` `#runningChoiceArm` `injected` 分支;reopen 门 ③z 7 格 |
|
|
8516
|
+
| 4 | 终局 `stats` 两片脱敏(server 7.84.0 响应字节变) | **零动作** | 本包 `stats` 键集不变、不读那两片文本 |
|
|
8517
|
+
|
|
8518
|
+
### 55y. 🔴 三端升级必读(固定段式,[C295])
|
|
8519
|
+
|
|
8520
|
+
1. 换钉 `^0.72.8`:提交腿加 `memoryOffDeclarationField(memoryOffDeclared({ flag, settingsMemory }))`(有 `--memory off` / settings `memory.enabled` 入口的端);注入件路径传 `submissionOrigin: 'injected'`;渲染面认 `isModelOutputErrorRowText`。
|
|
8521
|
+
2. 不接线的端零变化:`memory` 键缺席、三选卡照旧、`API Error:` 行只在 core 那两句上换身份。
|
|
8522
|
+
3. peer sdk >=9.6.0 / agent-types >=0.3.0 不动;server <7.84.0 对 `memory:"off"` 回 400(端如实渲)。
|
|
8523
|
+
|
|
8524
|
+
**包侧缺口:** ① CC-41 leader `needs_human` + `result.conflict` 渲染面(0.72.9);② CC-30 MCP 会话内重连消费口(core #857 已到;候 server S-381);③ CC-34 `permission_denials` 自动升级验证(候 core #897 + server 透传);④ CC-39②(memory-status `consolidation?` 切片判定;候 server S-403);⑤ CC-36 托管 MCP 活性三态读口(候 core #874);⑥ `staleAfterSec` / `runId` 经 sdk 到端(候 sdk 出键);⑦ `Capabilities.webSearch` / `TaskRequestBody.memory` / `WiringManifest.readDeny` 经 sdk 声明(候 sdk 出键);⑧ `agents.listing_truncated` detail 读器候消费场景(by-design);⑨ `ClassifierSeat.defaulted?` 候 sdk 出键(by-design);⑩ §NNz「declined 键真零命中」机读第二刀(候形式化)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.72.
|
|
3
|
+
"version": "0.72.8",
|
|
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",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@sema-agent/agent-types": "^0.3.0",
|
|
38
|
-
"@sema-agent/core": "~7.
|
|
38
|
+
"@sema-agent/core": "~7.22.0",
|
|
39
39
|
"@sema-agent/sdk": "^9.6.0",
|
|
40
40
|
"@sema-agent/settings-schema": "^2.0.0",
|
|
41
41
|
"esbuild": "^0.27.4",
|