@sema-agent/client-core 0.83.6 → 0.84.1
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 +176 -0
- package/README.md +20 -13
- package/dist/abortableSleep.d.ts +10 -0
- package/dist/abortableSleep.js +37 -0
- package/dist/adapt/wireShapes.js +3 -2
- package/dist/adapter/activeRunSelfHeal.js +7 -7
- package/dist/adapter/downstream/eventToSdkMessage.js +6 -2
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +1 -0
- package/dist/adapter/downstream/terminalToSdkResult.js +10 -5
- package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
- package/dist/adapter/downstream/wiringManifestView.js +1 -0
- package/dist/agentSession/engineAgentRegistryRead.d.ts +18 -0
- package/dist/agentSession/engineAgentRegistryRead.js +167 -0
- package/dist/agentsWireCaps.js +10 -1
- package/dist/attachmentsWireCaps.js +2 -2
- package/dist/controlRouter.js +1 -1
- package/dist/decideFailureNote.d.ts +2 -1
- package/dist/decideFailureNote.js +5 -3
- package/dist/detachWire.d.ts +1 -0
- package/dist/detachWire.js +13 -5
- package/dist/displayUntrusted.js +114 -18
- package/dist/engineAgentAbsence.d.ts +37 -0
- package/dist/engineAgentAbsence.js +142 -0
- package/dist/engineErrorCodes.d.ts +2 -0
- package/dist/engineErrorCodes.js +9 -5
- package/dist/engineNoticeCodes.d.ts +43 -0
- package/dist/engineNoticeCodes.js +118 -5
- package/dist/engineWireSdk.d.ts +2 -0
- package/dist/fleet/fleetProjection.js +3 -2
- package/dist/frozenSet.d.ts +1 -0
- package/dist/frozenSet.js +20 -0
- package/dist/handsSeam.d.ts +3 -0
- package/dist/handsSeam.js +19 -0
- package/dist/hitl/askGateWire.d.ts +1 -1
- package/dist/hitl/askGateWire.js +1 -1
- package/dist/hitl/hitlHostSurface.js +1 -1
- package/dist/hitl/parkResolver.d.ts +1 -0
- package/dist/hitl/parkResolver.js +9 -3
- package/dist/hitl/planReviewWire.d.ts +30 -3
- package/dist/hitl/planReviewWire.js +139 -32
- package/dist/hitl/sessionPolicyDeliverable.d.ts +2 -0
- package/dist/hitl/sessionPolicyDeliverable.js +14 -3
- package/dist/hitl/sessionPolicyWire.d.ts +40 -0
- package/dist/hitl/sessionPolicyWire.js +210 -0
- package/dist/hitl/toolApprovalWire.js +2 -2
- package/dist/index.d.ts +24 -13
- package/dist/index.js +13 -13
- package/dist/liveInitToolFace.js +28 -10
- package/dist/model/catalogLoader.js +3 -3
- package/dist/model/tierVocabulary.js +1 -1
- package/dist/request/taskRequest.js +15 -5
- package/dist/resumeRefusalCopy.d.ts +11 -0
- package/dist/resumeRefusalCopy.js +39 -1
- package/dist/rewindWireCaps.d.ts +0 -1
- package/dist/seam.d.ts +2 -1
- package/dist/seatContract.js +2 -2
- package/dist/systemReminderTag.d.ts +5 -0
- package/dist/systemReminderTag.js +20 -9
- package/dist/toolResult.js +2 -6
- package/dist/toolRoster.d.ts +16 -0
- package/dist/toolRoster.js +46 -5
- package/dist/wireErrorTriage.js +1 -11
- package/dist/workflowClient.js +4 -3
- package/dist/workflowMonitor.d.ts +1 -1
- package/docs/INTEGRATION-CLIENTS.md +701 -37
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,182 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.84.1(2026-09-28)
|
|
53
|
+
|
|
54
|
+
> 主题:**patch** —— 九件同发,零 BREAKING。① `<system-reminder>` 开标签**定位口**(与剥离 / 解包同一个判定);② detach durable-off 400 的**纯判定**(不带进程门,任何宿主都能调);③ 服务端自铸通告码进码册与受众表(`instructions.source_changed` 从运维面回到用户面)+ 它的事实读器 + **按码派发**的 typed 通告事实口;④ 停泊审批决断撞 422 `parked_resume.startup_failed` 时的读口、成因分说的一句话与「同一个决定不重发、deny 照开」判定,决断失败先按码分类再扫词;⑤ 会话规则记录里有引擎拒启名字的会话:**窄撤销动词**(必交这台部署一跑的工具名册)与启动失败**出路句**;⑥ plan-review 编排三口与两只能力探针收**注入 client**(浏览器同源中继宿主零凭证形);⑦ 终帧 CC 形 `permission_denials` 收入参只被传输层脱敏过的拒绝(带脱敏标记);⑧ 凭据读法两处放行收口;⑨ 门夹具第二批换现役形 + 扁平终帧棘轮 + 权威信封标签对账门。根公面运行期导出 1260 → 1275(+15);公面类型 +18;超集键 +1 `_sema_tool_input_redacted`;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.33.1` 不变。🔴 编译期零改动,但已发导出有几处**可观察的行为变化**,Changed 里逐条写了谁要跟:① `noticeAudienceOf('instructions.source_changed')` `operator` → `user`;② `engineNoticeInCatalog` 对两枚服务端自铸码 `false` → `true`;③ `CONFIG_REFUSAL_CODES` 七员 → 八员;④ 终帧 `permission_denials` 收只被传输层脱敏的行、`_sema_permission_denials_absent` 在只剩这一类时不再落下;⑤ `detachDurableOffHint` 读属性抛错时不再外抛、改回 `null`;⑥ `displayUntrusted` 系地址豁免的判法(输出字节与 0.83.4 不同);⑦ 停泊腿遇 422 `parked_resume.startup_failed` 不再判「门已决」(码优先);⑧ `decidePlanReview` 决断撞上请求时限那一臂的结局正文(两条路同一句「已送出、时限内没有答复」,不再说「连不上」;注入 client 的 `timeoutMs` 要求见接入文档 §108a-9)。另 `readReadRootGrantNotice` 入参型放宽为 `unknown`(非破坏)。按原样字节断言过的测试请改按「不含值」写。
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **`findSystemReminderOpenTag(text, from?)`** ⇒ `SystemReminderOpenTagSpan | null`(型 `SystemReminderOpenTagSpan = { readonly start: number; readonly end: number }`)(CC-210):引擎 `<system-reminder>` 信封的**开标签定位口**,给自己按开标签把消息切成「信封块 / 正文」的宿主(历史回放拆分、转录搜索这一类),不必再自持一份开标签文法。接入文档 **§108a O-1 / 108a-1**。
|
|
59
|
+
- 从 `from`(缺席 = 0)起找下一枚开标签,回它的 UTF-16 起止(`end` 为开标签后一位,`text.slice(start, end)` 恰是那枚开标签);没有回 `null`。
|
|
60
|
+
- 只认引擎铸的两形:裸 `<system-reminder>`,或恰一个 22 位 base64url `mark` 属性的 `<system-reminder mark="…">`。与 `stripSystemReminderBlocks` / `unwrapSystemReminder` 走**同一个**判定(本版起三只口认开标签是一份实现),所以三口对「哪一处是开标签」永远同答。
|
|
61
|
+
- 串尾截断的开标签(标签名半截、属性值半截、少收引号或 `>`)不认;只认 `start ≥ from` 的那一枚(`from` 落在一枚开标签内部时,那一枚不认)。
|
|
62
|
+
- 与块上下文无关:块正文里的字面开标签、没闭合的开标签、嵌套的内层开标签都认 —— 配闭标签、处置截断块是宿主的循环(剥离口的块语义见接入文档 §104 的 104a-1)。
|
|
63
|
+
- 线性:单次调用一趟扫到命中或串尾;`from` 前移逐枚找完整串,总开销线性。
|
|
64
|
+
- 入参不抛:`text` 非串 ⇒ `null`(不强转);`from` 不是 0 到 `text.length` 之间的整数(负数、小数、`NaN`、`Infinity`、非数)⇒ `null`。
|
|
65
|
+
- **`isDetachDurableOff400(err)`** ⇒ `boolean`(CC-219):这一枚错误是不是对 `x-detach-on-disconnect` 头的拒绝 —— 部署没有耐久 run 账本(没有 run store 或这次提交没有会话)时,提交答 400。判据只有两条:`status === 400`(数字),`message` 是串且含本包的锚句常量 `DETACH_DURABLE_OFF_400_ANCHOR`。接入文档 **§108a DT-1 / 108a-2**。
|
|
66
|
+
- **不认错误码**:这条拒绝带的码是通用前置条件码,同一条提交路上与 detach 头无关的拒绝也用它(比如 device 部署首轮没有会话、cascade 没配梯子);按码判会把那些提交当成「去头重发」的对象。
|
|
67
|
+
- 不读进程台账:浏览器 / 桌面这类从不 arm 终端 detach 台账的宿主也能用同一个判定。`detachDurableOffHint(err)` 本版起就是「头确已发出(`isDetachArmed()`)∧ 本判定」(差别见 Changed)。
|
|
68
|
+
- **一律不抛**:非对象、缺字段、`message` 不是串 ⇒ `false`;读 `status` / `message` 时 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy ⇒ `false`(不外抛、不重试读)。每个属性至多读一次,先读 `status`,不是 400 就不读 `message`。它通常跑在宿主的 `catch` 里 —— 判定自己再抛,会把原本那一枚错误遮掉。
|
|
69
|
+
- **服务端自铸通告码进码册与受众表**(CC-213):服务端自 7.101.0 起经同一条通告通道投它自己铸的码,这些码不在引擎的码册里 —— 修前 `engineNoticeInCatalog` 对它们答「册外」、`noticeAudienceOf` 回落 `operator`,按受众分发的端把一条给用户看的通告投进了运维面。新公面表 `SERVER_NOTICE_AUDIENCE`(冻结对象,码 → 受众),两行:`instructions.source_changed`(`user`)/ `memory.layer_locked_legacy`(`operator`);`engineNoticeInCatalog` 与 `noticeAudienceOf` 同认(先查引擎镜像表,再查本表,两表之外仍保守判 `operator`;查表按自有属性)。本表**不并进**引擎镜像的 `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE`(那两张照旧与引擎码册逐码相等),两表零交集。接入文档 **§108a N-1 / N-2**。
|
|
70
|
+
- **`readInstructionsSourceChanged(notice)`**(CC-213):`instructions.source_changed`(同一会话这一次运行读的项目指令文件与上一次运行读的不是同一份)的事实读器,视图 `InstructionsSourceChangedFactsView { previous: string | null; current: string | null; sessionId: string }`。`previous` / `current` 是指令文件的相对路径,`null` = 那一次运行没有项目指令文件(真读数);三格必填,键缺席、空串、非串非 `null` ⇒ 整只 `undefined`(「不知道」不折成 `null` 或空串)。只认自己那一个码,敌意取值器不抛。接入文档 **§108a N-3**。
|
|
71
|
+
- **按码派发的通告事实口 `readEngineNoticeFacts(notice)`**(CC-214):一条通告 → 按 `code` 判别的联合 `EngineNoticeFacts`(每臂 `{ code, audience, facts }`,`facts` 是那个码的读器视图,`audience` = `noticeAudienceOf(code)`);表里没有这个码 / 读器判不成形 / 坏入参 ⇒ `undefined`,不抛。派发表 `ENGINE_NOTICE_FACT_READERS`(冻结对象,码 → 读器)覆盖本包全部七只事实读器、八个码:`mcp.injection_dropped` / `delegation.ask_unresolvable` / `config.durable_gate_unavailable` / `instructions.source_changed` / `approval.read_root_granted` / `approval.read_root_grant_rejected`(受众 `user`,**只有这六个属用户面**;后两码同是 `readReadRootGrantNotice`,视图按 `outcome` 判别)与 `skills.listing_truncated` / `mcp.server_redialed`(受众 `operator`,只属运维面)。`code` 与 `detail` 各只读一次,读器拿到的是这两只读数的快照。新具名型 `EngineNoticeFactsCode` / `EngineNoticeFactsOf<K>` / `EngineNoticeFacts`。接入文档 **§108a D-1 / D-2**。
|
|
72
|
+
- **停泊审批决断 422 `parked_resume.startup_failed` 的读口、一句话与判定**(CC-225):码常量 `PARKED_RESUME_STARTUP_FAILED`;读口 `parkedResumeStartupFromError(err, decision?)` → `ParkedResumeStartupDetail { code; cause; taskId?; resendable: false; denyStaysOpen: true } | null`(只认 `errorCode` 串,不看状态数字、不读正文、不要求 SDK 错误类);措辞 `parkedResumeStartupContent(detail)`。这枚码有两种成因:续跑没起来(被停泊的代理会话没了,或引擎拒了这次决断本身,如答案挂错了问题);停在一只「代理从发起它的任务继承来的工具」上的批准,而这台服务端交不出那只工具(同一个批准永远不会成,只能拒掉或等服务端升级)。**服务端回体上没有能分开两者的字段** ⇒ 本包只按调用方自己发的决断方向排除:`decision: 'deny'` ⇒ `cause: 'resume_rejected'`(第二种成因只对批准出);批准或未声明 ⇒ `cause: 'undetermined'`,那一句把两条出路都摆出来。判定恒定:同一个决定不自动重发(`resendable: false`),deny 照开(`denyStaysOpen: true`)。两句都不替引擎断言卡还在(第一种成因里一形行已不可再决),都指路「重取待决列表」。新具名型 `ParkedResumeStartupDecision` / `ParkedResumeStartupCause` / `ParkedResumeStartupDetail`。接入文档 **§108a P-1–P-3 / 108a-3**。
|
|
73
|
+
- **会话规则记录里有引擎拒启名字的会话:出路**(CC-229):会话规则记录里一旦有一条引擎会拒的名字(引擎退役名,或含 `__` 而不以协议前缀开头的名字),这条会话此后每一跑都在准备阶段以 `config.legacy_tool_name` 失败、模型一次都调不到。0.83.6 起本包在**写之前**扣下这两类;本版补上**已经写进去**那一侧。接入文档 **§108a E-1–E-6 / 108a-4–108a-6**。
|
|
74
|
+
- **`removeRefusedSessionRules(facade, sessionId, roster, opts?)`** —— 窄撤销动词:读当前记录 → 只拿掉 `toolDeny` / `toolAllow` 里引擎会拒启、**且名字不在 `roster` 里**的条目 → 带版本号整份回写。`roster` = 这台部署上一跑的工具名册(`wiring_manifest` 经 `projectToolRoster` 读出的那一份):引擎那道审计先看名字在不在这一跑的名册里(每行的名 ∪ 别名,原样比、分大小写),在就放行 —— 部署自己挂了一只恰叫退役名的工具(或别名)时,那一条是**生效的**限制,撤了就是把 deny 撤成 allow,所以名册里有的名字一条不碰。名册缺席(`undefined` / `null`)或读不了 ⇒ 结局 `roster_required`,一条不撤、一个请求都不发;读得懂的空名册照常判。因这一码启动失败的那一跑在交出装配清单之前就停了,名册要取自这条会话 / 这台部署上过了准备阶段的一跑。其余桶与条目逐字节原样、序不变;白名单被拿空时留成在场的空列表(一个也不放行 —— 丢掉它才是放宽)。命令桶与目录桶不进引擎那道名字审计,一字不动。撞上并发键只重读重写一次;不读能力位、不按版本猜。结局八臂:`roster_required`(`why`:`absent` / `unreadable`)/ `removed`(带新版本号与撤掉的条目)/ `nothing_to_remove` / `loosen_forbidden`(引擎把这次删除判成放宽:这台引擎上只有运营方能从会话规则记录里删条目,记录不变)/ `conflict` / `read_failed` / `write_refused` / `write_unconfirmed`(写发出去了但裁决没到手或回执对不上 —— 可能已经生效;再调一次就是核对,生效了会答 `nothing_to_remove`)。
|
|
75
|
+
- **`sessionPolicyRemovalNotice(outcome)`** —— 八臂各一句用户面话(唯一措辞真源):放宽被拒那句点明「这台引擎上只有运营方能删」,写不定那句说「可能已经生效」,名册那两句说清为什么要名册,其余失败句说「什么都没改」;撤成那一句**按撤掉的桶分说**(撤 deny:不解开任何挂着的工具,要按现名拦就新加一条 deny;撤 allow:不放行任何新东西,白名单拿空即一个都不放行,要按现名放行就把现名加回白名单);不回显任何规则串或引擎原文。
|
|
76
|
+
- **`legacyToolNameFailureNoteOf(code)`** —— 一跑以 `config.legacy_tool_name` 启动失败时的出路句;只按码判(别的码 ⇒ `undefined`)。句子列出那一条可能在的四处(这条会话的规则记录 / 随跑发送的设置 / 父会话的规则记录 / 部署自己的工具规则)—— 引擎的拒因里没有层位,句子不断言一定在会话规则记录里;不点名谁能删(新旧引擎答案不同,撤销动词的结局会如实说出这一台的答案);不回显名字(引擎自己的错误原文已点名)。
|
|
77
|
+
- **`isEngineRefusedToolName(name)`** —— 引擎准备期按名字拒启的判据本体(退役名表按原字节查;含 `__` 且不以任一协议前缀开头,区分大小写)。它比 `sessionPolicyDeliverable` 的 `legacy_tool_name` 判词**宽**:` foo__bar`(首尾空白)、`foo__*`(带通配)在判词里先落了别的成因,可引擎照样拒启 —— 撤销动词用的是本体。适合给「本会话规则」可见段标坏行。
|
|
78
|
+
- **`CONFIG_LEGACY_TOOL_NAME`**(`'config.legacy_tool_name'`)码常量。
|
|
79
|
+
- 公面类型 +3:`SessionPolicyRemovalOutcome` / `SessionPolicyRemovedEntry` / `SessionPolicyRosterRequiredWhy`。
|
|
80
|
+
- **plan-review 编排收注入 client**(CC-209;接入文档 §7 P-28 的 plan-review 半场)。浏览器同源中继宿主没有合法的引擎目标可装(`EngineWireTarget.token` 只收串,装不进 `{ mode: 'same-origin-relay' }`),此前只能采本包的纯判定、在端侧重建整条决断编排。现在三口各收一个可选的注入连线,宿主把自己构造的 `AgentClient`(中继形即可)交进来。接入文档 **§108a W-1–W-6**:
|
|
81
|
+
- `decidePlanReview(taskId, decision, permissionModeAfter?, opts?)` 第四参 `DecidePlanReviewOptions`:`wire: { client, capsBaseUrl? }` —— 给了就**只**用它(决断 POST 与决后回拉都经它;已装的引擎目标一个字不读,混用 = 把决断发到另一个部署);`reason` —— 随决断上送的理由(`PlanReviewRequest.reason`;任一决断都可带;trim,空白 / 非串 ⇒ 键不落,超 4096 字符截到 4096 并留一行 debug —— 超长会被服务端 413 打回,丢的是整次决断);`onOutcome` —— 结局交回宿主(见下)。请求体键序 `decision` → `reason` → `permissionModeAfter`;不带理由时体逐字节同旧。`default` 撞 400 `request.field_conflict` 的去键重发保留 `reason`。
|
|
82
|
+
- `armPlanReviewApproval(result, sessionKey?, opts?)` 的 `opts` +2 可选位 `wire` / `onOutcome`:给了 `wire` ⇒ 在场判看它(client 不可用 ⇒ 不出卡,`false` + error 留痕 —— 不出一张答不出去的卡),CC-46 三选卡的版本证据从 `wire.capsBaseUrl`(= 宿主 `kickEngineCapsProbe` 用的那把 baseUrl)读,不给 ⇒ `unknown` ⇒ 老两选卡,**不**回落已装目标的 baseUrl;responder 递交决断时把 `wire` / `onOutcome` 原样带给 `decidePlanReview`。
|
|
83
|
+
- `reopenPlanReviewCard` 的 `ReopenPlanReviewOpts` +2 可选位 `wire` / `onOutcome`:缺省投递口从此经注入 client 投递;于是**非默认会话槽给了 `wire` 就不必再自带 `deliverDecision`**(两者都缺席时照旧拒开)。canonical 复用臂(`mintFreshQuestionId: false` 且首呈卡的作答口仍绑着)沿用首呈那一次给的连线,本位不生效(与 `deliverDecision` 同一成文例外,命中留一行 debug)。
|
|
84
|
+
- 注入的 client 不可用(不是对象 / 缺 `assistant.planReview` 或 `runs.get`)⇒ 一个字节都没送出去:结局 `not_sent`,专句「the engine client supplied by the host cannot send it」,绝不回落已装目标。
|
|
85
|
+
- 新型 `PlanReviewWire` / `PlanReviewWireClient`(结构型:`assistant.planReview` + `runs.get`,`AgentClient` 直接满足)/ `PlanReviewDeliveryOptions` / `DecidePlanReviewOptions` / `PlanReviewDecisionOutcome` / `ArmPlanReviewOptions`(`armPlanReviewApproval` 第三参的命名形,字段与此前的内联对象逐字相同 + 两个新可选位)。运行期导出零新增。
|
|
86
|
+
- **决断结局交回宿主**(CC-209):`onOutcome(outcome)` 与队列口 `enqueueMetaPrompt` **并行**(不是二选一):每次被在飞闩放行的决断恰回调一次,载荷 `{ taskId, dispatchNo, decision, effect, detail, tail, prompt, status? }` —— 前四键与队列项机读位 `_sema_planReviewOutcome` 同源,`prompt` 与队列项 `value` 逐字节相同,`detail` 是结局正文、`tail` 是尾句,`status` 是措辞所依据的任务状态(回拉读到的,次之决断 200 体自带的;都没读到 = 键不落)。被闩拒的那次不回调(与「不铸号、不投结局」同律);本地拒发(零 POST)也回调(`effect: 'not_sent'`);回调抛只留一行 debug,不影响队列投递与 promise 落定。**队列口缺席而宿主接了回调 ⇒ 不再打 error 级「MISSED」留痕**(改一行 debug);两条通道都没有才照旧 error 级。没有模型提示注入通道的宿主(浏览器)据此渲自己的回执。
|
|
87
|
+
- **两只能力探针收注入 client**(CC-209):`EngineProbeOpts.client`(`EngineProbeClient` = `capabilities` + `scenarioCapabilities` 两只动词,`AgentClient` 直接满足)。给了 ⇒ `engineSupportsTaskAgents` / `probeScenarioTools` 直接用它,`baseUrl` / `authToken` / `principal` / `fetchImpl` 都不用来构造(不读);`timeoutMs`(3 s / 2 s 缺省)是**独立落定**的截止:到点即答「不知道」并中止底层请求 —— 注入 client 的读重试在退避 / `Retry-After` 睡眠期间不看取消信号,只中止会被拖过预算。失败分类不变(`undefined` / `null`)。建议给注入 client `maxRetries: 0`(本包自构造的 client 同此)。
|
|
88
|
+
- **`_sema_permission_denials[]._sema_tool_input_redacted?: true`**(CC-235,超集位;`SemaPermissionDenial` +1 可选成员,CC 数组同一条目同值):在场 ⇒ 该条 `tool_input` 是同一条流 `tool_start` 帧上的入参,但到达客户端之前已被传输层脱敏 —— 它是那次调用入参的**脱敏视图,不是原值**;拿 `tool_input` 重跑、比对或生成放行规则之前先读它。只在 `true` 时在场,绝不铸 `false`;在场时 `_sema_tool_input_source` 恒为 `'tool_start'`。判据是字面记号(`«redacted` 前缀 / 叶值恰等于两个占位串;多认不少认 —— 入参里本来就含这些字面的调用也会被盖,方向只多一句「可能不是原值」)。接入文档 **§108a PD-2**。
|
|
89
|
+
|
|
90
|
+
### Changed
|
|
91
|
+
|
|
92
|
+
- `stripSystemReminderBlocks` / `unwrapSystemReminder` 的开标签识别改走与定位口同一个判定函数。行为不变:与 0.83.3 冻结实现的定种子对拍、§104 的正负样本照旧逐字节同。
|
|
93
|
+
- `detachDurableOffHint` 改为包 `isDetachDurableOff400`。
|
|
94
|
+
- 🔴 **`detachDurableOffHint` 遇到读属性会抛错的错误对象不再抛**(CC-219):`status` / `message` 的 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy,此前(已 arm 时)原样抛出,本版起回 `null`(「不是那一枚 400」)。其余输入的返回值逐字不变(门里冻结改前实现逐条对拍);`message` 此前读两次、本版起至多读一次(只有带计数 getter 的对象看得出)。**谁要跟**:按「会抛」写的测试改锚为回 `null`;端上包着它的 try/catch 从此不再因这类对象触发。四端产品源码零改动。
|
|
95
|
+
- 🔴 **`readReadRootGrantNotice(notice)` 的入参型放宽为 `unknown`**(CC-214;此前 `{ code?, detail? } | null | undefined`):与本模块其余事实读器同型,派发口因此对派发表逐行做编译期入参检查。读法与返回值不变。**谁要跟**:零改动 —— 任何实参照旧可传;只有拿它的形参型做类型推导的代码会看到 `unknown`。
|
|
96
|
+
- 🔴 **`noticeAudienceOf('instructions.source_changed')` 由 `operator`(回落)改为 `user`**(CC-213)。**谁要跟**:按 `noticeAudienceOf` 分发的端不改代码即跟着走 —— 这条通告从运维面挪到用户面;若为它写过运维面专属行,那一行跟着挪。按「受众 `operator`」写的判据改锚。`memory.layer_locked_legacy` 的受众仍是 `operator`(此前是回落得来,本版起是表上写明)。接入文档 **§108a N-2 / 108a′**。
|
|
97
|
+
- 🔴 **`engineNoticeInCatalog` 对两枚服务端自铸码(`instructions.source_changed` / `memory.layer_locked_legacy`)由 `false` 改为 `true`**(CC-213)。**谁要跟**:按 `engineNoticeInCatalog` 决定「渲不渲」的端,这两枚码从「只落调试」变成「册内通用行」,不改代码即跟着走;按「这两枚码册外 / 只落调试」写的判据改锚。接入文档 **§108a N-2 / 108a′**。
|
|
98
|
+
- 🔴 **决断失败码优先于「门早已决」扫词臂**(CC-225):修前,停泊审批决断撞 422 `parked_resume.startup_failed` 时,包内停泊审批腿按失败文字扫「门已决」词表(`no pending checkpoint` / `resolved` / `already` / `not found`)——被停泊的代理会话没了那一形,引擎原句恰是「Parked resume did not complete: parked resume failed — the approval is no longer redeemable: Session not found: <id>」,命中 `not found` ⇒ 判成「这张卡早被别处决了」、静默重连一轮,失败文字(连同本码那一句)不上失败面,连续命中后以一句坐标失配的话收场。本版起这枚码先按码分类:不重连,失败文字带本码那一句收场。没有机读码、或别的码的失败,扫词臂照旧。新公面判定 `isCodeClassifiedGateFailure(code)`:这枚决断失败码自己说清了处置、失败文字不许再按那张词表扫(= `isGateStandingErrorCode` 的两码 ∪ 本码);本码**不**进 `isGateStandingErrorCode`(会话没了那一形门已不在)。**谁要跟**:走包内停泊腿的终端零改动即得;端侧自有「门已决」判据链的,在扫词之前问这一口;按「这一形会重连一轮」写的判据作废。接入文档 **§108a P-5**。
|
|
99
|
+
- **四个决断出口的失败文字补上 422 那一句**(CC-225):审批卡两条腿(批准 / 拒绝)、提问卡腿(作答 = 带答案的批准 / 空作答 = 拒绝)、中断撤卡(拒绝)撞 `parked_resume.startup_failed` 时,失败文字(结局 `reason`、宿主日志、中断撤卡上屏的那一行)在原句之后补 ` — <那一句>`,按这一次发的决断方向选句;别的码 / 无码时失败文字逐字节不变。补句不含本包「门早已决」扫词表里的词。**谁要跟**:按失败文字整串断言本码的格多出那一段;别的码零改动。接入文档 **§108a P-4**。
|
|
100
|
+
- `sessionPolicyDeliverable` 的 `legacy_tool_name` 臂改为调用 `isEngineRefusedToolName`(同一张镜像表、同一判序,判决与话一字不变)。
|
|
101
|
+
- 🔴 **配置拒绝识别表 `CONFIG_REFUSAL_CODES` +1 员 `config.legacy_tool_name`(七员 → 八员,排在最后)**(CC-229),与前缀判定 `isConfigRefusalCode` 一致(前缀谓词本来就认它)。**谁要跟**:按成员数或逐员逐序断言这张表的测试改锚;按 `.has` 判的端零改动。
|
|
102
|
+
- 🔴 **`decidePlanReview` 决断撞上请求时限那一臂改说「已送出、时限内没有答复」**(CC-209;两条路同一句):sdk 的每请求时限到点(`TimeoutError`)时这一发其实已经送出、引擎多半正在驱动续跑 —— 此前两条路都落「could not reach the engine」。本版起结局正文是「The plan_review <决断> was sent, but no answer came back from the engine within the time limit this host allows for it — it may have taken effect (…)」,`effect` 仍是 `unconfirmed`;真连不上(连接被拒、断网)照旧是「could not reach the engine」。已装目标那条路的时限是 6 h;注入形用宿主 client 的 `timeoutMs`,🔴 要求不低于 6 h(sdk 的逐请求选项只有取消信号,本包改不了注入 client 的时限;沿用 sdk 缺省 60 s 的 client,续跑超过一分钟的批准会落这一臂),见接入文档 **§108a-9**。**谁要跟**:按「时限到点 ⇒ could not reach」整串断言的格改锚;按 `effect` 分支的端零改动;网页端给中继 client 设 `timeoutMs`(108d)。
|
|
103
|
+
- 决后回拉在注入形上是 15 s 的**独立落定**截止:到点即当回拉失败(回落决断 200 体自带的状态措辞)并中止底层请求,不被注入 client 的读重试退避拖长;已装目标那条路照旧是独立的 15 s 短超时 client。
|
|
104
|
+
- 注入连线本身坏形(`wire` 为 `null` / 非对象 / 读 `client` 就抛 —— JS 调用方)与 client 不可用同一处置:结局 `not_sent`、`onOutcome` 照回、零请求,不抛(此前这一形在决断入口之外抛出,`void decidePlanReview(…)` 留下一只未处理的拒绝、结局与回调都没有)。
|
|
105
|
+
- **不变**:不带新位的三口(请求体 / 出站头 / 结局文字〔时限那一臂除外〕/ 队列项键集 / 投递闩 / 投递序号 / 重开判决)逐字节同 0.84.0;`EngineWireTarget` 型不动;`makeEngineWireClient` 不动;子代族动词(tail / steer / output / compact / task handle / delegated prompt / resume)仍只吃已装目标(见接入文档 §7 P-28)。
|
|
106
|
+
- 🔴 **终帧 CC 形 `permission_denials` 收入参被传输层脱敏过的拒绝**(CC-235):服务端把 `tool_start.args` 转发给客户端之前做一道保形脱敏(结构与键名不动,字符串叶里的凭据形子串换成 `«redacted…»` 记号;环与超深子树换成 `[circular]` / `[depth-limit]` 占位串)。0.73.4–0.84.0 把这一类当成「拿不出可信入参」:那一行只进 `_sema_permission_denials`,并让 `_sema_permission_denials_absent: true` 落下 ⇒ 只读 CC 三键的消费方把一次真实的拒绝读成没发生(入参里写了 `scheme://user:token@host` 形 URL 的命令被拒时就是这一形,与哪条拒绝路径无关)。而同一条输出流里,这只对象早已作为转录 `tool_use.input` 交给了同一批消费方;参照形的记录点手里恒有入参、三键必填,从不因入参形态拒记一条。本版起:入参是普通对象、在扫描预算内、只是被传输层动过 ⇒ 照进 CC 数组,`tool_input` 就是帧上**同一只**对象(与转录 `tool_use.input` 同一个引用;不复制、不反解、不剔记号),条目带 `_sema_tool_input_redacted: true`(见 Added)。CC 数组是 `_sema_permission_denials` 的过滤子集,两处是**同一个条目**、同在同值。清单里只有这一类不完整时,`_sema_permission_denials_absent` 不再落下(它的语义不变 —— 仍是「CC 那条清单不可声称完整」;条数完整了,入参不是原值这件事由标记说)。账本行与流内补行(0.82.1 对账补上的那一半)同一条律。
|
|
107
|
+
- **不变**:真没有入参对象的几类 —— 行无 `toolCallId`、本流没见过那只 `tool_start`(重连后的流、宿主自建管线没交快照、同一个 id 见到两份不同入参)、入参不是普通对象、入参超出扫描预算(节点 / 深度)、本流快照溢出、流内补行的工具名读不出 —— 仍只在 `_sema_permission_denials`,`tool_input` 缺席(绝不铸 `{}`),`_absent: true` 照落。「被传输层动过 ∧ 超预算」按超预算判,不因见到记号先放行。账本自己带入参时账本那份恒优先,不盖标记。
|
|
108
|
+
- 这是**读法变化**:已发的 §66 G2(「入参带会被传输层替换的凭据形串 ⇒ `permission_denials` 空、`_absent: true`」)与 G3 在本版上判红是预期行为。成文改口见接入文档 **§108a′**。**谁要跟**:终端 —— 「这条 run 真的拒过」的判定结论不变(这一类此前经超集载体判「拒了」,现在经 CC 数组判「拒了」),`-p` 结果帧整帧过境零改动即得;凡拿 `tool_input` 重跑 / 比对 / 生成放行规则的读点先读标记(今天没有这类读点)。网页端 / 桌面端 / 管理台今天零读点。验收方按 §66 G2 / G3 写的判据改锚。
|
|
109
|
+
|
|
110
|
+
- 🔴 **凭据读法:`displayUntrusted` 系地址豁免的判法改了,两处「值 / 口令原样上屏」收口(CC-234;输出字节与 0.83.4 不同,断言按「不含值」写)**。机读口(合成终局行、结果帧 `errors[]`)、`displayUntrusted`(全部载体与开关)、`displayUntrustedMarks` 同批。接入文档 **§108a K-1 / K-2 / 108a-8**:
|
|
111
|
+
- **方案词 / 凭据标签与地址形的值之间、紧贴值夹着不可见单字**(格式类字符 —— 零宽空格、软连字符、标签字符等 —— 孤代理项、非空白控制符、没接成序列的 ESC / C1;原字,或本出口画出的可见转义形 `\uD800` / `` 这一类)时,值不再按地址豁免(豁免 = 主机与路径原样、只遮 userinfo / query / 片段)。`scheme://` 留,主机与路径换 `«redacted:secret»`,query / 片段照旧换 `«redacted:query»` / `«redacted:fragment»`。例:`Authorization: Bearer` + U+D800 + `https://secret.example/x` ⇒ `Authorization: Bearer` + U+D800 + `https://«redacted:secret»`。0.83.5–0.84.0 上这一形在正文 / 单行 / 字段三种载体都原样露出值;同一位置换成零宽空格的一形各版都露。
|
|
112
|
+
- **`user:<口令>@` 后面的主机位被可剥单元占住、再往后没有主机**(串尾 / 空白 / `/ ? #` 等右界、`:<端口>`、或下一枚 `@`)⇒ 按 userinfo 遮成 `«redacted:userinfo»@…`;这一形里用户名一段跨过可剥单元(与点形载体上屏的读法一致)。此前只有点形 / 空格形载体顺带遮住(单元画成的 `.` 恰像主机),机读口、默认形、转义形原样上屏。候选挂在一枚凭据标签 / 方案词上 —— 是它的值(分隔一直吃到候选起点,含引号值的开引号:`password: "user:<口令>@` + 零宽空格 + `/ <尾>"`),或把它吞了一截(`token=u:<口令>@…`、`"token":"u:<口令>@…`)—— 时不走这一条,整只值照旧由标签那一遍换记号(与 0.84.0 同答);标签 / 方案词被可剥单元拆开(`to` + 软连字符 + `ken=`、`Bea` + 零宽空格 + `rer `、`tok` + 着色序列 + `en=`)也按剥掉单元的读法认。标签的值是别的词、与候选之间隔着空白(`token=abc user:<口令>@` + 零宽空格)⇒ 候选照认 userinfo。
|
|
113
|
+
- **不变的**:值左邻是真空白、分隔符或引号时照旧按地址豁免(`Bearer https://docs.example.com/x`、`api_key: https://console.example.com/keys` 逐字节不变);紧贴值的是完整转义序列(着色等)时照旧豁免(标签后给值上色是正当排版);`@` 后面直接是真空白 / 串尾的无主机形照旧不算 userinfo;没有冒号的 `a@<单元>` 不动;凭据之外的不可见字符逐字节不动;孤代理项与零宽空格同位同答照旧成立。
|
|
114
|
+
- 🔴 **可见字节差异**(按「输出不含凭据」写的判据零改动;按原样字节写的改锚):不可见单字 / 它的转义形留在原处、不进记号(`Bearer \uD800https://«redacted:secret»`);`Authorization:` 头值上 0.83.4 是整段一枚记号,本版是 `Bearer` + 单字 + `https://«redacted:secret»`;点形载体上「方案词 + 空格 + 单字 + 地址」一形为 `Bearer «redacted:secret»`。**谁要跟**:管理台 —— 提货测试里钉「三载体露值」与零宽空格对照的格按预期翻红,翻面为「不含值 ∧ 含 `«redacted:`」;凡按字节断言凭据输出的格一律改按「不含值」写,不按 0.83.4 原样字节写。终端 / 网页端经本包适配层的机读口升级即净,零改动。
|
|
115
|
+
|
|
116
|
+
### Gates
|
|
117
|
+
|
|
118
|
+
- 新门 `run-system-reminder-open-tag-test.mjs`(30 格):引擎两形逐下标 · 非引擎形 15 形不认、不吞其后真形 · 串尾截断六形不认 · `from` 域外十一形 / 非串八形 `null` 不抛 · 与块上下文无关(嵌套 / 未闭合 / 块正文里的字面开标签)· 2 万条定种子随机串上,定位口找出的开标签集合 ≡ 只用剥离口、解包口的可观察答案反推的集合(不读内部),用定位口重写的剥离 / 解包与两口逐字节同 · 线性两格(单次扫大量近似开标签;`from` 前移走完整串)。
|
|
119
|
+
- 新门 `run-detach-durable-off-verdict-test.mjs`(34 格,其中服务端铸点见证一段只在给了服务端源码树时跑):锚句在场 ⇒ 真(含假 fetch 回 400 体、经 SDK 提交流真抛出的那一枚)· 同码另三句原文 ⇒ 假 · 非 400 七形 / 畸形输入十八形 ⇒ 假不抛 · 不读进程台账 · 冻结改前 `detachDurableOffHint`,除抛错形外逐条对拍返回值(armed / 未 arm × 22 条)· 抛错形五形(getter 抛错、Proxy 陷阱抛错、已撤销 Proxy)纯判定回 `false`、包装层回 `null`,改前两者都抛 · 读次数:`status` 恰一次、`message` 至多一次 · 服务端源码树在场时:通用码的全部 400 铸点里恰一处含锚句且以它起头,其余逐句判假。
|
|
120
|
+
- 按错误文案分支的门:具名豁免那一处从 `detachDurableOffHint` 搬进 `isDetachDurableOff400`(同一处锚句判断,站点数不变)。
|
|
121
|
+
- 扩门 `run-engine-notice-catalog-test.mjs`:I 段(服务端自铸码表两行冻结、与引擎镜像码册和实装引擎码册零交集、引擎镜像不被污染;在册判据与受众读口同认、原型键与脏码不冒充;`readInstructionsSourceChanged` 三格与缺席 / 空串 / 非串 / 原型链 / 敌意取值器各形)· IX 段(可选腿:指向一份装了服务端发布包的目录时,对它的服务端自铸码受众表双向等值、受众逐行同值、与引擎码册零交集、判 `user` 的码在用户流白名单而判 `operator` 的不在、派发口的用户面码全在白名单;没指时如实标为未跑,必跑档缺席即红)· J 段(派发表冻结;本模块每只导出的事实读器都是表里的同一只函数、表里每只都是本模块的导出、表里的码都在册;按码分家交叉矩阵 —— 每只读器恰读得出它挂的那几个码的夹具、别的码一概不给读;表里每个码都必须有门夹具,派发结果与直接读逐键同值、受众与受众读口同答;用户面恰六码、运维面两码;读目录授权两码经派发口视图按 `outcome` 判别、`covers` 坏词经派发口仍 `undefined`;在册无读器 / 册外 / 原型键 / 坏入参 / 敌意取值器 ⇒ `undefined`;`code` 与 `detail` 各只读一次)。另有编译期钉:派发表与本模块导出的事实读器两向相等(删表里一行构建即红)。
|
|
122
|
+
- 新门 `run-parked-resume-startup-test.mjs`(89 格):读口两成因与分不出(正文点名哪种成因都不分臂)、决断方向只认严格 `'deny'`、`taskId` 顶层优先附加键兜底 / 缺席不编;判定两位严格恒值;上游前提钉(实装引擎产物里「继承工具」那一因的判据行只对批准出);两句三段、互异、都指路重取待决列表、分不出那一句摆两条出路、不带扫词表里的词、零内部词;措辞单源(源码全树逐文件扫,两句只在一处铸);别码 / 无码 / 大小写 / 空白 / 兄弟码 / 退役键位 / 敌意取值器 ⇒ `null`,不看状态数字;真 SDK `toApiError(422)` 实例照读;五条出口补对应那一句(整串相等),别的码逐字节同旧;码优先:引擎真正文(会话没了那一形,先自证它命中「门已决」词表)上,停泊提问卡腿作答 / 空作答、审批卡腿批准 / 拒绝都不重连、失败文字带对应那一句,同一正文无码 / 别码照旧走扫词臂重连;`isCodeClassifiedGateFailure` 认本码与两只「门还在」码,本码不在「门还在」判定里。
|
|
123
|
+
- 新门 `run-session-policy-refused-removal-test.mjs`(111 格):判据本体对开发依赖引擎的真退役名表与协议前缀表独立判官逐名两向相等(向量 + 退役名表全员 + 前缀大小写变体 + 定种子随机名),且比 `legacy_tool_name` 判词宽;真 `Runner` + 内存会话规则店,单条名字分别写进 `toolDeny` / `toolAllow` 跑一次 —— 判据本体说「会拒」⟺ 引擎以 `config.legacy_tool_name` 拒启且模型零调用;撤销动词只撤会拒条目(其余桶与条目逐字节原样、序不变、在场空桶留空桶、一读一写、版本号 +1)、撤后同一会话下一跑过准备阶段(语料全员逐名跑,两只桶)、没有要撤的零写;老引擎真店上普通调用方删 `toolDeny` ⇒ `loosen_forbidden`、恰一次写、记录逐字节不变、下一跑仍拒启,只有 `toolAllow` 里有 ⇒ 撤得成;并发键撞一次恰重读重写一次、撞两次 ⇒ `conflict`;读失败 / 写被拒 / 写不定逐类(写不定含裸抛 / 5xx / 无码 4xx / 落盘后抛 / 回执读不懂 / 回执对不上),写不定之后再调一次 ⇒ `nothing_to_remove`;名册:真 `Runner` 挂一只叫 `Task` 的自定义工具(与一只别名是 `KillShell` 的)⇒ 引擎认那一条 deny,撤销动词拿这一跑的真名册不撤它、下一跑照过准备阶段且 deny 还在,名册只按原样比(小写 `task` 不豁免 `Task`,与引擎同),名册缺席 / 读不了十一形 ⇒ `roster_required`、零请求、不抛,读得懂的空名册照撤;八臂措辞两两互异、撤成那句按撤掉的桶分说、零用户字节、表外值不抛;出路句只认一码、列四处位置、不点名谁能删,真 `Runner` 拒启交出的正是这枚码,同一枚码也从调用方策略那一层来(记录为空)⇒ 撤销动词答 `nothing_to_remove`。
|
|
124
|
+
- 新门 `run-plan-review-injected-wire-test.mjs`(119 格):真 dist + 真 sdk 中继 client(spy fetch 路由到假引擎 A),已装目标故意指向另一只假引擎 B —— P 正控(spy 记到 Bearer 头)· W1 十三格场景矩阵注入形 vs 目标形结局 / 体 / 次数 / 机读位逐字节同答且 B 零命中 · W2 投递闩三形 · W3 `field_conflict` 去键重发恰一次 / `acceptEdits` 不重发,CC-46 双闸只从 `capsBaseUrl` 读证据(不回落已装目标)· W4 中继形每一发零 `authorization`(判别力:同一 spy 此刻仍记到带 token client 的 Bearer)· W5 植入的假 token 在四路结局 + 拒连路上零出现于日志 / 结局 / 队列项 / 回调 · W6 reason 七形 · W7 onOutcome 九形 · W8 reopen + wire 三形 · W9 五形坏 client · W10 两只探针 · W11 结构化最小 client 端到端 + 回拉带 signal · W12 决断时限两路同答(真 sdk + 缩放计时器:按接入段要求构造的注入 client 与已装目标对同一只慢回答逐字节同答;注入 client 时限短于回答 ⇒ `unconfirmed`「已送出、时限内没有答复」,已装目标撞上每请求时限 ⇒ 同一句,连接被拒仍是「could not reach」)· W13 读口截止独立落定(真 sdk、读口答 429 + `Retry-After: 60`、缺省读重试:两只探针在 `timeoutMs` 附近落定答「不知道」,决后回拉在截止处落定并回落 200 体状态,截止同时中止底层请求)· W14 坏连线四形(`null` / 串 / 数 / 读 `client` 就抛)不抛、无未处理拒绝、`not_sent` + 回调恰一次。
|
|
125
|
+
- 扩门 `run-permission-denial-projection-test.mjs`(349 → 375 格):F5 改判 —— 五种被动过的形(顶层记号 / 嵌套残片记号 / 裸记号 / 环占位 / 深度占位)各进 CC 数组恰一条、三键齐、`tool_input` 是同一只对象、两载体同一条目严格 `true` 标记 + 来源位、判别位不落、账本摘要位照过境;F1e 没被动过的入参 ⇒ 标记键缺席;F5b 正文里提到占位串不盖标记;F5g / F5g2 被动过 ∧ 超节点预算(记号先被扫到 / 预算先耗尽两序)、F5h 被动过 ∧ 超深度、F5i 入参挂在别的 id 上、F5j 带记号但不是普通对象 ⇒ 仍不进、不盖标记;F6b 账本自带入参 ⇒ 不盖标记;F10b 公开入口 `runStream` 端到端:`tool_input` 与同一条输出流里转录 `tool_use.input` 是同一只对象;L4 改判 —— 流内补行同一条律,L4b 没被动过不盖标记。变异反证七枚逐格见红(账本行标记丢失 / 流内补行标记丢失 / 两条路径各把「没见过 `tool_start`」按空对象收进来 / 见到记号即提前收 / 没动过也铸 `false` / 标记盖到账本自带入参上)。
|
|
126
|
+
- 扩门 `run-display-untrusted-projection-test.mjs`(402 → 414 格):X41 地址形值左邻是不可见单字 14 形 × 12 种出口(机读口、十种呈前载体、标记位置读口)凭据不露 · X41b 原形实得值 · X41c 主机与路径只剩被剥的单元时不凭空铸记号 · X42 空主机 userinfo 10 形 × 12 种出口不露 · X43 / X43b 真空白 / 着色序列 / 无冒号形逐字节不变 · X44 幂等与标记位置读口同字节 · X45 线性 · X46 与上一发布产物差分抽出的最小形(上一版遮住的出口上本版不露)· X47 空主机 userinfo 候选挂在标签 / 方案词上的 15 形(引号值夹单元 3 形 + 标签 / 方案词被单元拆开 12 形)× 12 种出口,口令与尾巴都不露(0.84.0 全遮)· X48 引号内空白池 / 拆标签池各取的样本 5 串 × 12 种出口 · X49 标签不挂在候选上时 userinfo 照认。另对 0.84.0 发布产物跑差分(宽池、拆标签定向池与引号内空白池各三到五组种子,全池五组种子 × 13 种出口;对 0.83.4 发布产物跑两形池):「上一版遮 / 本版露」只剩一类 3 格(点形单行载体上控制空白前的上一个词,KL-181 同类),其余计数 0。
|
|
127
|
+
- **终帧夹具第二批换成现役因由形**(CC-233;只改门,出包面零变化)。只换「结论依赖终态读法」的套:`run-permission-denial-projection-test.mjs`(15 处:成功臂与错误信封是否同一个铸点,哪一臂由终态读法判出)、`run-streamjson-timing-honesty-test.mjs`(13 处:到限码 → `subtype`、合成终局行、抢救正文)、`run-terminal-identity-copy-test.mjs`(18 处:终局行说哪一句)、`run-result-text-backfill-test.mjs`(1 处:补差读的是成功臂上的终答)、`run-parked-resume-startup-test.mjs`(3 处:停泊审批 / 提问的 park 终帧;问答门按引擎真实铸形补 `kind: 'human'`),以及 `run-client-core-pure-test.mjs` 余下的 41 处(终态投影、成本单轨、409 负控里的普通失败、降级链各臂、抢救腿、错误信封单一铸点等)—— `done` 帧从退役平面形(`status` + `errorCode` / `errorMessage` / `blockedReason`)换成 `result.terminal`(`completed` / `failed{code, message}` / `blocked{reason}` / `paused{gate}`)。只换形不改判据:六套换形前后检查数逐一相同且全绿(375 / 41 / 987 / 105 / 89 / 4112)。换形之前,把终态读法的因由分支改坏(成功读成「认不出」、失败从平面键名取码与原话、被挡读成成功),前五套照样全绿;换形之后同一组改动五套都红(权限拒绝投影停在错误信封的正控格,exit 9)。停泊决断 422 那一套另做一次:把因由形的 park 读成「认不出」,换形前全绿、换形后在「作答真走到决断」的自证格停下(exit 9)。每套另做一次夹具负控:把换进来的终态词改成表外词 ⇒ `run-streamjson-timing-honesty-test.mjs`、`run-terminal-identity-copy-test.mjs`(失败 / 被挡各一次)、`run-result-text-backfill-test.mjs`、`run-client-core-pure-test.mjs`(失败一次、终态投影成功臂一次)红,`run-parked-resume-startup-test.mjs` 在自证格停下(exit 9:认不出 park 就走不到决断);`run-permission-denial-projection-test.mjs` 对表外词**不红** —— 表外词落「认不出的终态」臂,那一臂同样是错误信封,而本套的结论只分「成功臂 / 错误信封」;对它改做「被挡 → 成功」的换词负控,当场停在错误信封的正控格。
|
|
128
|
+
- **合法的扁平帧逐格注明**:仍是扁平形的 29 处都是现役 wire 上真会出现的扁平字节,帧上或帧正上方各注一行 `// 409: …`(服务端自己的 active-run 拒绝信封,含老服务端只带人话的那一形)或 `// 回放面: …`(升级前落盘、经读盘面逐字回放的历史行;同步提交 park 体经幂等重放上 SSE;只可能出现在回放行上的退役词 / 表外词防御格)。涉及 `run-client-core-pure-test.mjs`、`run-streamjson-timing-honesty-test.mjs`、`run-terminal-identity-copy-test.mjs`、`run-selfheal-reopen-test.mjs`、`run-result-frame-projection-test.mjs`、`run-display-untrusted-projection-test.mjs`、`run-terminal-cause-projection-test.mjs`、`run-hitl-gate-honesty-test.mjs`、`run-shell-gate-durable-allow-test.mjs`;这些套的检查数不变。
|
|
129
|
+
- 新门 `run-fixture-flat-done-ratchet-test.mjs`(CC-233,12 格):扫 `scripts/` 下每一只 `{ type: 'done', result }` 字面量,把 `result` 追到它真正的对象字面量 —— 就地、经变量、经助手参数(同文件每个调用点各算一处)、经展开、经迭代(`for … of` 的数组行、`[…].map` 回调)五形都追 —— 再判因由形 / 扁平形;扁平位点没有 `// 回放面:` / `// 409:` 注(注释以标记开头、冒号后有理由;字符串 / 模板 / 正则里的 `//` 不算)的,计数不许超过登记物里的上限(只降;低于上限打印 `RATCHET-SLACK`)。本版实测 143 → 23:剩下 23 处都在结论与终态读法无关的九套里(见 Known limits)。尺子先植后量:植入语料里六形扁平、字符串里的假注、没写理由的注、两处真注、三处因由形与一只 `turn_end` 干扰项逐形逐数对拍,对不上 exit 9;真树另有人口地板(文件数、done 字面量数、因由形位点数)。
|
|
130
|
+
- 新门 `run-authority-envelope-mirror-test.mjs`(CC-230 过渡对账,37 格):同事正文写进转录行之前要拆火的权威信封标签表,是引擎那张表的本包镜像;此前没有门对它对账。现在对开发依赖引擎包双向对账 —— 引擎有、本包缺 ⇒ 红(那个标签的伪造信封会原样进转录);本包有、引擎没有 ⇒ 红(同事正文里的普通标签被改写);并核引擎那张表仍由它的信封登记表派生。引擎包根不导出这张表,门按路径读引擎模块里的值,门头注写明这是过渡读法(候镜像表改为构建期生成物)。消费面:三条同事车道渲出的转录行里,引擎每个权威标签(开 / 闭 / 带属性 / 全大写)全被拆火,引擎表里的非权威信封标签原样不动。
|
|
131
|
+
- 登记物:根公面基线 1260 → 1275(+15);型面门 unknown 出境棘轮 417 → 422(新口收宿主 catch 到的原值 / 通告原值,派发口入参放宽一格);`export-liveness` 登记 46 → 44 行(`DETACH_HEADER` / `engineSupportsTaskAgents` 两条 contract 行因有门按名引用而按退出条件删,棘轮 `maxRows` 同批 46 → 44);超集键台账 89 → 90(`_sema_tool_input_redacted`);单例清单 526 → 529(服务端自铸码受众表、派发表、422 两句措辞表入册);同名影子对账门豁免 25 → 26(一端本地同名同义的 detach 判定,到 0.85.0 为止);门数 144 → 151,README「Guards」表 151 行(`run-registry-test.mjs` 那一行改为不写死读它的门数);负控文档「自动化」表 25 行 = 负控套 `CASES` 25(新增两枚:棘轮上限改小 1 ⇒ 门必须红且点名;引擎信封登记表里把一个 framing 行改判 authority ⇒ 门必须红且点名缺的那个标签);棘轮新格 `fixtureFlatDone.unmarkedCeiling` = 23(附一条沿革账);可移植闭包 kernel 18 / adapt 35 / index 213 不变;裸定时器登记 `agentsWireCaps.ts` 2 → 1、`liveInitToolFace.ts` / `hitl/planReviewWire.ts` 出表(三处读口截止收进包内共享等待叶,该叶登记数不变)。
|
|
132
|
+
|
|
133
|
+
### Known limits(本版新增)
|
|
134
|
+
|
|
135
|
+
- 开标签文法常量本身仍不上公面:定位口回「在哪」,不回一段拿去拼正则的源码(与上一版同一取舍,见文末 KL-135 那一条)。
|
|
136
|
+
- `isDetachDurableOff400` 只认锚句:那条拒绝的原文改了,判定答 `false`(方向:不退让、不出提示行,原 400 照常交给宿主),在这条拒绝配上专码之前没有更稳的判据(KL-176)。
|
|
137
|
+
- 422 `parked_resume.startup_failed` 的两种成因在回体上分不开:对批准,本包只能说「分不出」那一句(两条出路都摆);继承工具那一形里,端若照旧把同一张卡连同批准再呈,用户会再撞一次同一个 422。等服务端在回体上带出机读成因位后再分句(KL-177)。
|
|
138
|
+
- 端侧自有「门早已决」判据链(按失败文字扫词)的,要在扫词之前问 `isCodeClassifiedGateFailure`,否则会话没了那一形仍会在端上被认成「门已决」;失败文字被拍平成串、机读码读不到的端路径,只能按 SDK 错误类名兜底(KL-178)。
|
|
139
|
+
- 服务端自铸码表只镜像服务端当前两行;服务端再加自铸码时,本包在对账腿(需指向服务端发布包)上先红,没指发布包的日常跑不出这一红(KL-179)。
|
|
140
|
+
- 拒启会话的出路:撤销动词按宿主交来的**一份**工具名册判「名字在不在名册里」—— 因这一码启动失败的那一跑交不出名册,名册要取自同一部署上过了准备阶段的另一跑;两跑挂的工具不同(子代腿、按场景卸载)时按交来的那一份判(KL-182);退役名表是本包构建时对过账的一份,引擎扩表后新加的名字在本包跟进前撤不掉(撤销动词答 `nothing_to_remove`)(KL-183);老引擎上一份记录同时在 `toolDeny` 与 `toolAllow` 里有坏行时,整份写被判放宽而拒,白名单那几条也一起没撤(KL-184);写口直接拒收这两类名字的 400 尚无专码,到货前落在收紧结局的 `request_rejected`(KL-185);出路句说不出是哪一层、也不点名谁能删(KL-186)。
|
|
141
|
+
- plan-review 注入形的决断腿时限 = 宿主那只 client 的 `timeoutMs`(sdk 缺省 60 s),本包改不了(sdk 的逐请求选项只有取消信号):短于 6 h 的 client,分钟级的续跑会落 `unconfirmed`「已送出、时限内没有答复」;注入 client 的读重试在退避睡眠期间不看取消信号,本包的截止落定之后它仍可能再睡一轮(至多 60 s)才收手 —— 给注入 client `timeoutMs` ≥ 6 h 与 `maxRetries: 0` 即无这两形(KL-191)。子代族动词在中继部署下仍只吃已装目标(接入文档 §7 P-28 余半场)。
|
|
142
|
+
- 拒绝清单上的 `tool_input`(0.73.4 起在 CC 数组里的条目与本版新收的脱敏条目同样)取自 `tool_start` 帧 —— 那是调用**开始时**的入参,先于 hook / 策略在判定前的改写;被拒的是改写后的最终入参,两者可以不同。上游在被拒调用的收口帧上带出最终入参之后改读它(KL-175)。「入参被传输层动过」今天仍按字面记号认:上游没有记录级的机读「已脱敏」位;入参里本来就含记号字面的调用会被多盖标记(KL-11,本版改写)。
|
|
143
|
+
- 凭据读法:地址形的值左邻只有完整转义序列(着色等)、没有不可见单字时,照旧按地址豁免,与真空白同答(KL-180);点形单行载体上,空主机 userinfo 前面隔着换行 / 制表符的上一个词不再随用户名一起遮 —— 上一版那一形是把换行画成点之后的副作用,本版与有主机形两版同答(KL-181)。另两形既有、本版不修:用户名与 `:` 之间紧贴 C1 引导符 U+009B 时机读口与转义形露口令、点形遮住(KL-192);无 scheme 的 userinfo 左界不在 `"` 处断开,主机在场时会把 JSON 键或引号值的开引号吞进记号,引号里空白之后的尾巴原样上屏(KL-193)。
|
|
144
|
+
- 九套(23 处)终帧夹具仍是扁平形、未注:`run-cost-reconcile-projection-test.mjs` 8 / `run-assistant-arm-identity-test.mjs` 4 / `run-subagent-usage-projection-test.mjs` 3 / `run-cost-absence-projection-test.mjs` 2 / `run-tool-roster-projection-test.mjs` 2 / `run-lane-proof-identity-test.mjs` 1 / `run-selfheal-reopen-test.mjs` 1 / `run-subagent-durable-divert-test.mjs` 1 / `run-terminal-facts-projection-test.mjs` 1。它们的终帧只是流的终止符,或只断两臂共有的量(成本、用量、名册、车道证明、子代分表),结论与终态读法无关;由棘轮封顶、只许减少(KL-187)。
|
|
145
|
+
- 棘轮只管一格总数:同一批里删掉一处未注扁平帧、别处新增一处,总数不变 ⇒ 绿。注是声明不是证明,门不判注了「回放面」的帧是不是真的回放面;追不到对象字面量的形(调用返回值、成员读)打印但不计(KL-188)。三处格对「表外终态词」夹具负控不响(那几格只分成功 / 非成功或与终态无关,认不出的终态词按设计落错误信封)(KL-190)。
|
|
146
|
+
- 权威信封标签对账读的是开发依赖引擎包的模块内部值:端连的引擎新于本包对账的那一版、且新版加了权威标签时,新标签在本包跟进之前不被拆火(对账门在抬开发依赖当天红)(KL-189)。
|
|
147
|
+
- 上一版登记的「开标签文法不上公面、按开标签切块的端仍需自持文法」一条本版销(定位口上公面;KL-135);「孤代理项与格式字符同处置之后两形露出」一条本版销(凭据读法收口;残余见 KL-180 / KL-181;KL-143)。
|
|
148
|
+
- 完整台账见接入文档 §108 末行「包侧缺口」。
|
|
149
|
+
|
|
150
|
+
## 0.84.0(2026-09-27)
|
|
151
|
+
|
|
152
|
+
> 主题:🔴 **minor** —— peer sdk 地板 `>=11.3.0` → `>=12.0.1`,同版四件 additive 与一批陈旧逻辑清扫。① 后台代理**登记读数**(缺席行的下半场):读口 + 取代判定 + 归类口 + 登记键桥 + 补行谓词,宿主终于有真读数可以填进缺席行回收入参的 `registry` 位;② 读目录授权两枚**结论通告**的事实读口;③ 接线回执 **`hands` 段**(引擎对「这条腿有没有挂上它自带的文件 / shell 工具」的正面声明);④ 审批词表与云控制面子路径**追平 sdk 12**(读法零改);⑤ **清扫**:退役键 `rewind.rewindFiles` 构造期拒收(专句点名去处)、`WorkflowRunState.agentCount` 改可选、26 个内部件退出包根、九张公面判定表换成只读的 Set 子类、包内判定用的十五张数组运行期冻结、`resume_at` 文本兼容腿退役。根公面运行期导出 1278 → 1260(+8 −26);公面类型 +10;超集键 +1 `_sema_hands`;开发依赖引擎 `~7.33.1` 不变。🔴 换钉前先读下面 BREAKING 五条(终端有一处编译期会红:`agentCount` 改可选)。
|
|
153
|
+
|
|
154
|
+
### BREAKING
|
|
155
|
+
|
|
156
|
+
- **peer `@sema-agent/sdk` 地板 `>=11.3.0` → `>=12.0.1`**。本包读三处 12.x 才有的声明 —— 每会话后台登记列表 `sessions.background`、它的能力位 `capabilities.background.listFace`、七词闭集的后台状态型 —— 装着 11.x 会见 peer 警告,声明面也编译不过。sdk 12 唯一的 BREAKING(设备码回体 `verification_uri_complete` 由必填改可选)本包早按可选读。地板由门见证:门从装着的声明文件里逐条读出这三处,不信版本号。**谁要跟**:终端 / 网页端 / 桌面端 / 管理台都换钉 sdk `>=12.0.1`;端上若有把 `verification_uri_complete` 当恒在的串来读的代码,同批改(在场 ⇒ 一键 / 二维码;缺席 ⇒ 展示地址 + 用户码)。
|
|
157
|
+
- **退役的回退键 `rewindFiles` 退场**(型面 + 运行期)。`SeamRewindSpec.rewindFiles` 删除(本包 0.81.0 起已不产它;引擎自 core 6.0.0 起对「捕获」义忽略、对「回退」义拒收 —— 回退旗是 `restoreFiles`)。请求装配的 `rewind` 组现在恰四键(`resumeAt` / `resumeAtMode` / `restoreFiles` / `rewindFilesTo`):给 `buildTaskRequest` / `assembleTaskRequest` 传 `rewind: { rewindFiles: … }` **构造期抛 `TypeError`**,不再原样透传;消息是退役键专句 —— 点名 `rewind.rewindFiles` 是退役键(引擎 core 6.0.0 起)、要删掉、代之以什么(回退会话时一并还原文件 ⇒ `rewind.restoreFiles: true`,须与 `rewind.resumeAt` 同交;只还原文件 ⇒ `rewind.rewindFilesTo`);在场即拒,`true` / `false` 同判;混着别的表外子键时这一句先报。值为 `undefined` / `null` 仍算没给。**谁要跟**:四端都已不发这一位,零改动;仍在交它的宿主换钉前删掉(不删 = 每一轮构造期抛,一轮都发不出去),不要换成别的键:文件历史在首次触碰时即被跟踪,不需要请求旗;钉着 `rewindFiles === true` 的请求键对账测试那一格同批删。
|
|
158
|
+
- **`WorkflowRunState.agentCount` 改可选**(型面;与 0.73.0 起的 `totalTokens` 同律)。有键 ⇒ run 记录上的腿数(`agents` 为空数组时是真 `0`);缺键 ⇒ run 记录上没有可读的腿数组 —— 渲「—」或不渲这一段,**绝不渲 `0`**。`projectWorkflowRun` 遇到 `agents` 在场却不是数组时也不再抛。**谁要跟**:终端 —— 工作流详情 / 列表降级行上按必有数字读的地方(如 `run.agentCount > 0`)编译不过,改按在场判,为「不知道」补的那一枚壳侧超集位可以退役;网页端 —— 详情面「N agent(s)」缺席时会渲成空数字,缺席不渲这一段。桌面端 / 管理台零读点。
|
|
159
|
+
- **26 个内部件退出包根**(型面 + 运行期;0.71.3 预告的 `export *` 放大件收回;已知各端源码零具名 import):`DEFAULT_DENY_REASON`、`MAX_HOOK_NOTICE_TEXT_CHARS`、`STOP_NOT_LANDED`、`STOP_NOT_LOCAL`、`STOP_PARKED`、`STOP_PARK_ARBITER_UNREACHABLE`、`STOP_PARK_RESUME_WON`、`clearBgTerminalFacts`、`denyReasonForWire`、`engineWireDebugEnabled`、`isAskTool`、`listNotifiedRuns`、`listWorkflowCompletionCardsEnqueued`、`noteBgOwnerAbsence`、`notePlanReviewAnsweredFor`、`planReviewArmedKeyFor`、`projectDiagnosticsFrame`、`registerSubagentContentAlias`、`resolveOwnerContext`、`surfaceEditNotForwarded`、`surfaceRuleArmNotSent`、`surfaceRuleArmRejected`、`unregisterLocalQuestionResponder`、`waitForGateArmedFor`、`wireCycleSeq`、`wireParentId`。包内照旧使用,行为不变;包的 `exports` 只开根入口与 `./registry`,从内部路径深 import 不受支持。0.71.3 预告的 34 名里 8 名暂留:`hostTimersFor` / `engineSessionParamFor` 是多会话宿主契约的一部分(与 `hostSettingsFor` / `hostFsFor` / `hostSessionFor` 同族),撤回收回预告、长期留在公面;`unrefTimer` 留在公面(跨宿主可移植的定时器原语:没有 `unref` 的宿主上原样返回、不抛,三端宿主自建保活定时器共用这一份判断;门在根公面上钉它的行为);`shortTaskLabel` / `DENIAL_LIMIT_KINDS` / `engineCapNestedTrue` / `surfaceRememberNotApplied` 定 0.85.0 退出公面;`RULE_OFFERS_ABSENCE_REASONS` 留在公面(与 `@sema-agent/sdk` 根入口导出的是同一个数组对象)。**谁要跟**:四端零改动;管理台测试里把 `shortTaskLabel` 当「一定在公面上的名字」用的那一格,0.85.0 前换一个名字。
|
|
160
|
+
- **九张公面判定表换成只读的 Set 子类**(运行期行为面):`CONFIG_REFUSAL_CODES`、`DELEGATION_CAP_CODES`、`TERMINAL_FLEET_TASK_STATUSES`、`CONTROL_TOOL_VERBS`、`STRUCTURED_DETAIL_TYPES`、`INTERNAL_SDK_ARM_TYPES`、`AGENT_MEMORY_WORDS`、`SUBAGENT_TOOL_NAMES`、`WORKFLOW_TOOL_NAMES`。它们一直标着 `ReadonlySet<string>`,实际却是普通 Set,而本包自己的判定读的就是同一个实例 —— 任何一处 `.add(…)` 都会改掉所有调用方的判定。现在 `add` / `delete` / `clear` 抛 `TypeError`、表不变;`has`、`size`、迭代、`forEach`、`instanceof Set`、`new Set(table)` 复制与 `structuredClone` 都照旧,成员与次序不变,型面不变。🔴 **看得见的差别**:实例的 `constructor` 不再是 `Set`、原型也不是 `Set.prototype` —— 拿它跟普通 `new Set([...])` 做严格深比较(Node `assert.deepStrictEqual`,以及比较构造器 / 原型的测试断言)从此判不等;宽松深比较(`assert.deepEqual`)照旧相等。**谁要跟**:端上若有这类严格深比较,改比成员(`[...table]`)或先复制成普通 Set;要可变的表请复制成新 `Set`。四端源码普查零处 `.add` / `.delete` / `.clear`。
|
|
161
|
+
|
|
162
|
+
### Added
|
|
163
|
+
|
|
164
|
+
- **后台代理的登记读数(缺席行的下半场)**。回收判据本身(接入文档 §102)一个字没改,变的是宿主终于有东西可以填进 `registry` 那一位:
|
|
165
|
+
- 读口 `readEngineAgentRegistry(client, sessionId, caps, opts?)`:只在 `capabilities.background.listFace` 是自有严格 `true` 时读本会话的后台登记;能力位不成立 ⇒ `no_list_face`,不发请求;路由缺席(404 `not_found.route`)⇒ `route_absent`;部署没接会话属主面(501 `capability.session_ownership_required`)⇒ `ownership_required`;其余一切(含 404 `not_found.session`、传输层失败、200 体读不出、**任一行**读不出、能力位 / 体 / 行 / 错误对象上的取值器抛、客户端形坏)⇒ `read_failed`。读不到一律回原因,**绝不**回空表,promise **绝不**拒绝;有一行读不出就整张拒收(少一行在归类口那里就是「没列」)。`read_failed` 在错误对象上读得到时带上 HTTP 状态 `status` 与错误码 `errorCode`(诊断用,不改归类;读不到就不带,不编),并在宿主日志口留一行 debug。不缓存、不轮询。读到的读数带它读的会话 `sessionId` 与序号 `seq`(按客户端 × 会话在发出时单调递增);读数对象、行表与每一行都冻结。🔴 读到的读数要**原样**交给下面几只口:能授权删行或补行的,只有读口产出的那一个对象(见归类口)。
|
|
166
|
+
- 取代判定 `isEngineAgentRegistryListingSuperseded(listing)`:同一客户端 × 同一会话上,发出更晚的一次读已带着行表到货 ⇒ `true`;被取代的读数在下面两只口里不作数。读口没经手的读数(拷贝 / 自建)判不出取代(答 `false`)—— 这类读数在归类口与补行谓词里一律不作数。
|
|
167
|
+
- 归类口 `engineAgentRegistryReadingOf(listing, key, opts?)` 把读数变成 `reapEngineAgentAbsentRows` 已经在收的逐行读数:登记状态 `pending` / `running` / `parked`(停在一张待决审批上)⇒ `running`;`completed` / `failed` / `killed` / `cancelled` ⇒ `ended`;认不出的词 ⇒ `unknown`。行**不在**清单里时,**只有**键是登记句柄形、宿主给了 `{ singleReplica: true }` 与这一行所属会话 `sessionId`(且与读数读的会话对得上)、**且**读的那一刻上游那一页不满服务端的 500 行上限,才读 `not_listed` —— 登记只列答这次请求的那个服务端进程上的行,按登记时刻新 → 旧截取,多副本部署上或满额的清单里「没列」不等于「离场」;不核会话就不许删。否则读 `unknown`,缺席行照留(多一行,绝不错删)。`singleReplica` 只在确知引擎是单进程时给(例:宿主自己拉起、只连这一台的本机引擎);给了 `sessionId` 而读数不是那条会话 ⇒ `unknown`;别的身份空间的键(子代会话 id、工作流子代)一律 `unknown`。🔴 **只认读口原样产出的那一个读数对象**:展开复制、`structuredClone`、JSON 往返、过滤或重组过的读数、手搭的读数一律读 `unknown`(截断判据按读到时的原始行数记在包内,过滤成短表骗不过它;读数上的 `seq` 改写也骗不过取代判定)。
|
|
168
|
+
- 登记键桥 `engineAgentRegistryKeyOf(event)`:缺席 / 行 / 进度事件(或宿主按事件合并的行)在登记域里的键 —— 两位 id 里是登记句柄形的那一位,同一只代理的进度事件与行事件因此取到同一把键。
|
|
169
|
+
- 补行谓词 `engineAgentRegistryRowsMissingFromHost(listing, hostKeys, opts?)`:登记仍算活着、宿主却没有这一行的代理(补行事实 `{ id, status, description?, createdAt }`)。逐行不补:本客户端的读口**首次读到**这一 id 不到 30 秒(与缺席侧同一个稳定窗 —— 进度事件可能先于把它的 id 桥到登记句柄的行事件到达;窗自本地首见起算、用包内同一只单调钟,与服务端的钟无关:两台机器的钟差、重连后首读一只老代理都跳不过这个窗)/ 登记时刻读不出(补行事实要带它)/ 宿主自这次读**发出**以来见到结束或撤掉的(`goneSinceRead`);整张空:读不到 / 读数不是读口原样产出的那一个对象 / 读数被取代 / 会话对不上 / 宿主键集或 `goneSinceRead` 读不了 / `nowMs` 给了却不是有限数。`nowMs` 与首见同一只钟(epoch 锚定的单调毫秒,量纲同 `Date.now()`),缺席时读调用那一刻的这只钟(要可复现就显式传)。首见按客户端 × 会话 × id 记:宿主每次读都新包一层 `sessions` ⇒ 每次都是新账、窗永远起不来 —— 复用同一只客户端。
|
|
170
|
+
- 读口、取代判定、归类口、键桥、补行谓词都不抛。新型 `EngineAgentRegistryClient` / `EngineAgentRegistryListing` / `EngineAgentRegistryRowView` / `EngineAgentRegistryUnavailableWhy` / `EngineAgentRegistryReadingOptions` / `EngineAgentRegistryFillOptions` / `EngineAgentRegistryMissingRow`。接入文档 **§107a B-1–B-8**。
|
|
171
|
+
- **读目录授权的结论通告读口**。`readReadRootGrantNotice(notice)` 读引擎对一次读目录授权的两枚结论(`approval.read_root_granted` / `approval.read_root_grant_rejected`):结局、与卡对上的工具调用 id,以及引擎写下的目录(卡上候选 `dir` 与引擎现在持有的规范拼写 `root`)或拒绝原因。只有 granted 通告说明加了目录,**没有 granted 通告 = 什么都没加**。granted 通告缺 `dir` 或 `root`、或 `covers` 在场却不是 `exact` ⇒ 整只读不了(`undefined`),读不出的范围绝不放宽成「整个目录」。不抛。新型 `ReadRootGrantNoticeFactsView`。本版**不发**授权本身:「放行并加目录」这一选项候服务端宣告能受理的能力位(老服务端对未知请求键静默忽略并照回 200,按版本号开闸会让人以为加了目录、其实只得到一次普通放行)。接入文档 **§107a G-1 / G-2**。
|
|
172
|
+
- **接线回执的 `hands` 段**。`wiring_manifest.hands`(`{ mounted, reason? }`:引擎正面声明这条腿装配时有没有挂上它自带的文件与 shell 工具)投影为超集键 `_sema_hands`,并以 `hands` 出现在 chrome 臂与提交回执视图上(`WiringManifestView` / `WiringManifestChromeEvent` 各 +1 可选键);`mounted` 须是自有布尔,`reason` 按引擎原字节透传,段缺席 = 没报(不折成「有」,也不折成「没有」)。读口 `handsSeamReadingOf(view)` 三态(`not_reported` / `mounted` / `not_mounted`),措辞 `handsSeamDetail(reading)` 每态一句;「没有自带工具」那一句与名册派生的 `handsMountedDetail` 同句首句尾(那一只的字节不变)。服务端 7.103.0 起带这一段,老服务端缺席。`handsSeamDetail` 对认不出的入参(包括误传的名册派生读数)答「没报」那一句,不抛。名册派生读口 `handsMountedFromManifest` 不变 —— 两者是不同的事实:`hands.mounted` 是装配事实,名册派生是这条腿裁剪后的名册里有没有这类工具;`mounted: true` 也不等于 shell 可达(接入文档 §107a-4)。新型 `WiringManifestHandsView` / `HandsSeamReading`。
|
|
173
|
+
|
|
174
|
+
### Changed
|
|
175
|
+
|
|
176
|
+
- **`handsMountedDetail` 对认不出的入参不再抛**。此前 `undefined` / `null` 抛 `TypeError`,其余认不出的值(包括误传的 `hands` 段读数)回 `undefined`,`mounted` 读数没有行数时渲出「undefined of them」;现在一律答与 `handsSeamDetail` 同一句「没报」(同一个铸点)。它认得的六种读数的句子逐字节不变。按「会抛」写的 try/catch 从此不再触发;按「回 `undefined` 就不渲」写的判空分支从此拿到一句串。
|
|
177
|
+
- **审批词表追平 sdk 12**:sdk 12 在审批帧的键锚上声明了 `mandate`,在停泊行上声明了 `requiresRealApproval` / `mandated` / `mandate` / `origin` / `ruleOffersAbsence`,并在运行期导出已知出身词与强制位词;本包这些读法早已就位,读法不变,词表 `ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 的内容与次序也不变(改为对上游运行期值逐词逐序对账)。
|
|
178
|
+
- **云控制面子路径的声明缺口关闭**:`./registry` 子路径的声明不再引用一个没有安装的包,用 `skipLibCheck: false` 做类型检查的下游不再从它那里见到「找不到模块」。
|
|
179
|
+
- **十五张判定数组运行期冻结**(型面不变):`REWIND_ERROR_CODE_PREFIXES`、`STOP_CONFLICT_CODES`、`CLAIM_RELEASED_STATES`、`CLAIM_HELD_STATES`、`RUNNING_STATES`、`ASK_PARK_GATE_KINDS`、`ASK_PARK_STATES`、`PLAN_REVIEW_GATE_KINDS`、`PLAN_REVIEW_STATES`、`TOOL_PERMISSION_REQUEST_ID_DOMAINS`、`ATTACHMENTS_SPEC_KEYS`、`LIVE_DEFAULT_FIELDS`、`TIER_ORDER`、`DEFAULT_CATALOG_SOURCES`、`CATALOG_DEFAULT_HOSTS`。与上一条同一病形:本包在调用期拿这同一个数组查成员 / 前缀 / 次序 / 白名单(例:往 `REWIND_ERROR_CODE_PREFIXES` 里 `push` 一个前缀,`isRewindFamilyCode` 就对它答真)。现在 `push` / `splice` 抛 `TypeError`,下标写 / 截断在严格模式下抛(非严格模式下静默无效),表都不变;读、迭代、复制与深比较都照旧。四端源码普查零处就地改写。
|
|
180
|
+
- **工作流终态词集**(用来判一条轮询中的工作流是否已报过)现在恰是引擎两处会发的终态词:`completed` / `failed`(工作流运行记录)与 `cancelled`(进程内任务登记的工作流句柄 —— 没有持久存储时停掉一条工作流,轮询回的就是它);引擎从不发的五个词(`done` / `stopped` / `interrupted` / `error` / `canceled`)删掉。
|
|
181
|
+
- **不变**:`CLAIM_RELEASED_STATES` 与无头重连的 run 行终态表照旧认 `timeout`。它不是现役写词,是 core 5.8.0 之前落库的历史行上的词 —— 服务端读 run 行的状态列原样返回,这类行今天仍可能被读回,照旧当已释放、照旧合成终帧(不让重连重试到预算耗尽后报传输失败)。
|
|
182
|
+
- **`cancel_lost_race` 的消息**改为「…check what that decision did to the run before retrying the cancel」(原为「…re-read the run state and retry cancel if it is still active」)。码不变。
|
|
183
|
+
|
|
184
|
+
### Removed
|
|
185
|
+
|
|
186
|
+
- **`isResumeAtRejection` 不再读错误文本**:只按机读码判(`errorCode`,或政策折叠码携带的原码)。给 7.50 及更早服务端的文本兜底腿(那些服务端的预检拒绝只在消息里带 `resume_at.*` 码)删除;这些服务端自 0.60.0 起已在支持窗外,7.51 起每一条这类拒绝都带码。
|
|
187
|
+
|
|
188
|
+
### Gates
|
|
189
|
+
|
|
190
|
+
- **后台登记读数**(`run-engine-agent-absence-projection-test.mjs` 新增 B / EB / BF 段):读口只在能力位严格为真时发请求,四种读不到按码分,半张表整只拒收,七种取值器抛 / 客户端坏形一律 resolve 为 `read_failed`;归类口的终态划分逐词对装着的引擎运行期谓词对账,句柄形镜像对引擎真值逐字对账,500 行上限对引擎运行期夹限(给了服务端发布物时再对它的路由)双向对账;单副本位只认自有严格 `true`;取代判定(发出序 / 到货序 / 更新那次读失败不取代)、会话核对(`not_listed` 不给会话即 `unknown`)、`read_failed` 诊断位(有才带、值形不对不带)与一行 debug、`goneSinceRead`、宿主键集七种读不了的形各有格;读数出身 —— 被取代读数的展开复制 / `structuredClone` / JSON 往返 / Proxy 不补行、归类 `unknown`,没被取代的读数的拷贝同样认不出(原对象照读作正控),被取代空表的拷贝不复活 `not_listed`,500 行截断清单过滤成新对象仍 `unknown`,读数 / 行表 / 每行冻结,原读数上改写 `seq` 骗不过取代判定;稳定窗(把包内单调钟钉在固定读数上:首见窗内 / 恰在窗上 / 窗外一毫秒、登记时刻早已过窗也按首见算、本机钟快 60 秒的新代理与重连首读的老代理都不补、同一客户端沿用首见、中途不在最新读数里的 id 再出现时重新起算、坏钟、登记时刻缺席);行事件晚于稳定窗才到时照补一行是取舍格(KL-164)。归类 / 补行格一律经读口取读数(手搭形只作「认不出」的反例)。
|
|
191
|
+
- **`hands` 段**:`run-wiring-manifest-projection-test.mjs` N 段(投影、坏形逐形、原型链上的段不算、chrome 臂与提交回执视图同值);`run-tool-roster-projection-test.mjs` H12 段(名册派生措辞口坏入参不抛、认得的六句逐字节不变、与新读口共用铸点)。
|
|
192
|
+
- **读目录授权结论通告**:`run-engine-notice-catalog-test.mjs` H 段(只认两码、`toolCallId` 必在、拒绝原因原样、granted 缺 `dir` / `root` 或 `covers` 坏形整只读不了、`covers` 词与引擎型编译期双向钉)。
|
|
193
|
+
- **地板见证**:`run-sdk-floor-test.mjs` ②e 段 —— 地板 12.0.1,见证本包新读的三处声明(列表方法、`background.listFace`、七词状态型);门看得见的地板以上每个已装 sdk 也须带这三处,地板降到它们不存在的线即红。负控锚同批抬(篡改形 12.0.2)。
|
|
194
|
+
- **sdk 12 追平的对账**:审批帧键锚对账回到逐元素相等(锚 32 项,`mandate` 的领先登记按退出条件删);停泊行五键从「按结构读、无账」转为有账(读法零改);能力位台账对 sdk 12 新增的四键逐一显式处置(`background` / `fileHistoryCapture` 读,`taskApproverPosture` / `taskWriteFaceOpen` 不读);出身词表改对 sdk 运行期 `ASK_ORIGINS` 逐词逐序对账,另钉 sdk 的型确由它派生;`run-ask-survives-posture-test.mjs` 另核产品表里每个词都是上游已知词。
|
|
195
|
+
- **子路径入口**:`run-sdk-registry-transit-test.mjs` —— 上游子路径已自带声明,「找不到模块」实测归零,这一段留作回潜守卫(再出现缺失的声明包当场红);隔离证明改用只 import 诱饵的合成探针;另核上游子路径声明不再引用那个缺失的包。
|
|
196
|
+
- **请求装配**:退役的 `rewind.rewindFiles` 子键被拒收并点名;拒收消息是退役专句(点名退役版本、要删掉、代之以 `rewind.restoreFiles` 配 `rewind.resumeAt` 或 `rewind.rewindFilesTo`;`true` / `false` 同拒;混着别的表外子键时专句先报);值为 `undefined` / `null` 不拒;`rewind` 那一行恰四键;发布的 `SeamRewindSpec` 声明里没有 `rewindFiles`(`run-task-request-omission-receipt-test.mjs` F16b – F16e)。
|
|
197
|
+
- **释放与重连**:历史行上的 `timeout` 照旧算已释放、照旧合成终帧(`run-selfheal-reopen-test.mjs` G8④a / G8④a′,`run-client-core-pure-test.mjs` B5 重连格);终态表出身门把它登记为历史落库行读兼容的遗留扩员(C / F 段);工作流终态词集对引擎**两处**上游(工作流运行记录的状态型 ∪ 进程内任务登记工作流句柄的状态字面量,后者从引擎源码按语法读出)去掉 `running` 双向钉死,另加一格真任务登记的取消回归:停一条没有持久存储的工作流、读回终态卡,结构化卡与模型面两条投影路径都须记为已通知、从等待计数里摘掉(`run-terminal-table-provenance-test.mjs` E / E7 段)。
|
|
198
|
+
- **判定表**:九张 Set 逐一钉成员与次序,`add` / `delete` / `clear` 抛且表不变,实例冻结;十五张判定数组逐一钉冻结、`push` / `splice` / 下标写 / 截断抛且表不变,改写企图之后包内判定照旧(`run-client-core-pure-test.mjs` ㉚′ / ㉚″)。**`unrefTimer`**:在根公面上钉跨宿主行为(没有 `unref` 的句柄原样返回不抛;有 `unref` 的调恰一次)(`run-client-core-pure-test.mjs` TIMER④)。
|
|
199
|
+
- **`resume_at` 拒绝**:包装的纯文本形答 `false`;机读码形(含带码的 sdk 类型化错误)答 `true`。**工作流视图**:没有腿数组时 `agentCount` 缺席,空数组时为 `0`。**`cancel_lost_race`**:消息说先去看那次决断对 run 做了什么再重试取消(`run-wire-refusal-copy-test.mjs` S3c)。
|
|
200
|
+
- **公面收回**:`run-export-liveness-test.mjs` G 段 `removed` 账新增 0.84.0 一版 26 名;此前经包根读这些值的门改从属主模块取。
|
|
201
|
+
- 驱动层门的终帧夹具换成活流上真会出现的形(CC-224;只改门,出包面零变化)。`run-hitl-gate-honesty-test.mjs`(95 帧)、`run-shell-gate-durable-allow-test.mjs`(17 帧)、`run-park-hop-progress-test.mjs`(2 帧,park 那一帧经共用的 `syncLeg` 喂进 14 格)、`run-wire-refusal-copy-test.mjs`(2 帧,其中一帧经共用的 `askLeg` 喂进 4 格),以及 `run-client-core-pure-test.mjs` 里审批桥的问答闭环 / 无浮层两格与 `runStream` 的四帧 park(B3 park 终态、复核卡片主格、卡片出口缺席 / 抛错两格)—— `done` 帧从退役的平面形(`status` + `checkpointGate` / `errorCode`)换成带标因由 `result.terminal`(park = `{ kind: 'paused', gate }`,completed / failed 同理),读 `.result.status` 的断言改读 `terminal.kind`;`run-hitl-gate-honesty-test.mjs` F3 经常量喂给 `isPlanReviewPark` / `armPlanReviewApproval` 的复核 park 同批换形。门对象里缺 `kind` 的问答门按引擎真实铸形补 `kind: 'human'`。只换形不改判据:五套换形前后检查数逐一相同且全绿(556 / 34 / 59 / 109 / 4011)。换形之前,把审批桥的 park 读数、`runStream` 的复核卡片臂、终帧投影的 park 臂与 `isPlanReviewPark` 四处同时改成只认平面形,这五套照样全绿;换形之后同一组改动每套都红。每套另做一次夹具负控:把换进来的 `kind: 'paused'` 改成表外词,五套都红(`run-client-core-pure-test.mjs` 的 B3 park、复核卡片主格、审批桥三组各单独做一次)。
|
|
202
|
+
- 平面形不再是这几套的默认输入,但它在两条路上仍是真实字节,各留一格同果对照(三格,检查数 556 → 561 / 34 → 39 / 4011 → 4015):
|
|
203
|
+
- `run-hitl-gate-honesty-test.mjs` F1-a′ 与 `run-shell-gate-durable-allow-test.mjs` ①′:跨 7.64.0 升级之前落盘的 park 行,经 durable 事件流原样回放进审批桥(续跑那一段由现役引擎跑,终帧是因由形)。断言与因由形那一格逐条同果:毒化帧不上屏、续跑后的真结果上屏、决断真发出、终帧照出。
|
|
204
|
+
- `run-client-core-pure-test.mjs` 切边②′:同步提交当场停在复核门时,服务端自己组的 200 体 `{ taskId, sessionId, status: 'needs_review' }` —— 既没有 `terminal` 也没有门,`needs_review` 这个词是它唯一的复核信号。复核卡片照弹、先于终帧。选这一形而不选「带平面门的历史行」,是因为后者靠门种就能认出,证不到只读状态词的那一半。
|
|
205
|
+
- 三格各带一条自证(喂进去的确实是平面形),自证按**结构**判形(没有 `terminal` 键、状态词对得上、门在 / 不在),不拿产品读口当尺子;产品读口把它读成平面暂停另成一格 —— 读口坏了是产品红,不是判据坏。把审批桥或复核卡片臂改成只认因由形,对应那一格当场红。
|
|
206
|
+
- 不在换形之列(本来就是服务端的现役形):409 拒绝信封、`/decide` 200 体、durable `suspended` 事件、run 行的 `status` 列。
|
|
207
|
+
- 登记物:根公面基线 1278 → 1260(+8 −26);`export-liveness` 登记 73 → 46 行(contract 40 / internal 2 / retire 4),棘轮 `maxRows` 同批 73 → 46(两条 contract 行因判定数组冻结格按名引用而按退出条件删除);超集键台账 88 → 89(`_sema_hands`);单例清单 524 → 526(登记读口的两本读数账与句柄形镜像入册,`resume_at` 文本兼容表随腿删);可移植闭包 kernel 16 → 18 / adapt 34 → 35 / index 210 → 213;门数 144 不变。
|
|
208
|
+
|
|
209
|
+
### Known limits(本版新增)
|
|
210
|
+
|
|
211
|
+
- 登记只列答这次请求的那个服务端进程上的行:没有上游「这份清单覆盖本会话全部副本」的信号之前,「行不在 ⇒ 可回收」只靠宿主的单副本位 —— 不给位时到期缺席行不回收(多留一行),给错位时多副本部署上可能删掉一只还在跑的子代(行上留回收句,不静默)(KL-159)。
|
|
212
|
+
- 补行谓词按宿主给的登记域键判「有没有这一行」;宿主只记面板键、没用 `engineAgentRegistryKeyOf` 取登记键时会多补一行(KL-160)。
|
|
213
|
+
- 登记状态词的终态划分没有上游运行期值可取,本包按 sdk 七词型面编译期穷举(上游加词当天编译红;运行期先到的新词读 `unknown`:不删、不补)(KL-161)。
|
|
214
|
+
- 「放行并加目录」本版不发,候服务端宣告能受理的能力位;结论通告读口已在(KL-162)。
|
|
215
|
+
- `hands` 段在服务端 7.103.0 发布前的真部署上恒缺席;`{ mounted: true, reason }` 这种矛盾形原样透传、读口按 `mounted` 判(KL-163)。
|
|
216
|
+
- 补行稳定窗 30 秒,自本客户端首次读到这一 id 起算:行事件晚于窗才到时宿主会多一行,直到行事件到来、宿主按登记键并行;宿主每次读都新包一层 `sessions` 时每次都是新账,首见恒是「刚才」,补行永远不发生(KL-164)。
|
|
217
|
+
- 读数「被取代」按同一客户端 × 会话上的发出序近似判(服务端对并发请求的处理序本包看不见);读数在路上时结束的行,只有宿主给了 `goneSinceRead` 才不会被补回;读数只认读口产出的那一个对象 —— 宿主想过滤就得在归类 / 补行的结果上过滤,不能先过滤读数(KL-165)。
|
|
218
|
+
- 登记列表最多 500 行:行数到上限时本会话所有「行不在」读 `unknown`,这类会话里缺席行只等真终态(KL-166)。
|
|
219
|
+
- 审批出身词 / 强制位词两张词表仍是本包的一份(对 sdk 12 运行期值逐词逐序对账,今天两边相同);sdk 在两次提货之间加词时,本包到下次提货才跟(KL-167)。
|
|
220
|
+
- 九张判定表挡不住刻意绕开实例方法的写法(`Set.prototype.add.call(table, x)`)(KL-168);九张 Set 与十五张判定数组之外,公面上其余数组形导出(展示 / 拼装用,或每行是对象)运行期没冻结(KL-169)。
|
|
221
|
+
- `mcpReconnect` 的注入面(`sessions.mcpReconnect(sessionId, { server }, opts?)`)与 sdk 12 声明的 `sessions.mcpReconnect(sessionId, server, opts?)` 第二参形不同:宿主不能把 sdk 客户端直接传进来,要自己包一层(KL-171)。
|
|
222
|
+
- 对 7.50 及更早的服务端,预检阶段不带码的 `resume_at` 拒绝判 `false`,去锚自动重发不触发(这些服务端早在支持窗外)(KL-172)。
|
|
223
|
+
- 读目录授权的 granted 通告形坏(缺 `dir` / `root`、`covers` 是表外值)时读口答 `undefined`,宿主按「没有 granted = 没加」会说没加、而引擎其实加了;今天不可达(引擎恒铸这两位,`covers` 只有 `exact` 或缺席)(KL-173)。
|
|
224
|
+
- 补偿登记里一条「待上游确认后退役」的说明串仍是未兑现形:本包早已按上游的终态进度事件落终态,防御性清扫事实上已是兜底;串要等上游确认那一条承诺已满足再改(KL-174)。
|
|
225
|
+
- 上一版登记的「联网搜索原因句只对到源码判官」一条本版销(对服务端 7.102.0 发布产物逐字重跑零差异;KL-65);「登记读口到货前缺席行永不回收」一条改写为「只在登记能证明离场时回收」(KL-118)。
|
|
226
|
+
- 完整台账见接入文档 §107 末行「包侧缺口」。
|
|
227
|
+
|
|
52
228
|
## 0.83.6(2026-09-27)
|
|
53
229
|
|
|
54
230
|
> 主题:patch —— 会话规则记录的无损判定(`sessionPolicyDeliverable`,0.83.1 起)补上一个判定缺口:两类名字此前被判「能写」,写进会话规则记录后这个会话此后的每一跑都会在启动时失败,而且会话属主自己撤不掉。本版把它们扣下,成因闭集加一个词 `legacy_tool_name`。🔴 对成因词做穷尽分支的端要加一臂(类型联合 +1 员)。
|