@sema-agent/client-core 0.112.0 → 0.112.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 +23 -0
- package/README.md +2 -2
- package/dist/hitl/hitlBridge.d.ts +1 -0
- package/dist/hitl/hitlBridge.js +17 -4
- package/dist/hitl/planReviewCard.d.ts +3 -2
- package/dist/hitl/planReviewCard.js +2 -0
- package/dist/hitl/planReviewWire.d.ts +4 -2
- package/dist/hitl/planReviewWire.js +134 -97
- package/dist/i18n/messages.en.d.ts +2 -0
- package/dist/i18n/messages.en.js +3 -1
- package/dist/i18n/messages.zh.js +3 -1
- package/dist/notifications.js +14 -12
- package/dist/planReviewOutcomeCause.d.ts +2 -0
- package/dist/planReviewOutcomeCause.js +12 -0
- package/docs/INTEGRATION-CLIENTS.md +67 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,29 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.112.1(2026-11-10)
|
|
53
|
+
|
|
54
|
+
> 主题:计划审阅的批准恒带卡上的门身份、结局成因五词与一张配对表、坏行出路句改口、桥上原始动词的批准 / 改写必带门身份(CC-1496;接入文档 **§142 PA-1 – PA-5**;🔴 行为变,fail-closed;`cause` 值域由一词拓宽为五词 —— 对把它当单值或做穷尽判断的消费者是型面变化(编译红一次),其余为加性)
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- **计划审阅的批准恒带卡上的门身份(CC-1496;§142 PA-1;🔴 行为变,fail-closed)**:决断口 `decidePlanReview` 与包卡 / 重开卡的作答腿上,批准的请求体恒带卡事实上的 `checkpointId`。修前:同一道门的编号被引擎拒认过(409 `approval_stale`、拒体没有 `currentPending`、回拉 run 行仍是那道门)之后,再批准就不带门编号发出 —— 那时引擎若已停在另一道门上,这次批准会落到那一道门上。现在:「引擎拒认的门身份」集只对拒绝 / 要模型重新呈上计划放宽(那两种回答仍不带门编号,是契约给坏行留的出路);坏行上的批准由服务端再拒一次 ⇒ `not_applied` + `cause: 'gate_untrusted'`,门已换 ⇒ `gate_moved`,运维修好那一行之后带门编号的批准照常生效(不必等进程重启)。`permissionModeAfter: "default"` 被拒后的去档重发与主发同一个门编号:两发都从决断腿冻结的同一份请求体快照各铸一只新对象,注入 client 改写自己收到的那只不影响重发。带门身份的批准只落在那一道门上;门身份不复用、门内计划不变,是服务端的保证。
|
|
59
|
+
- **决断口的决断词入口闭集判(§142 PA-1)**:`decidePlanReview` 与包卡 / 重开卡的作答腿在进决断腿之前把决断词读一次,要求是 `approve` / `reject` / `ask_again` 三词之一的原始串;不是(装箱串 `new String('approve')`、表外词)⇒ 一个字节都不发、不投结局、`onOutcome` 不回调(与在飞闩拒同一形;宿主日志一行 error)。修前装箱的 `approve` 不附卡也会作为不带门编号的批准发出。
|
|
60
|
+
- **拒绝 / 要模型重新呈上计划因门编号被拒认过而不带门编号发出时,结局正文末尾多一句(§142 PA-5)**:只在这一发确实发出去了时追加(本地没发、可证没送出都不追加);句子是条件式 —— 这次回答发出时没带门编号,若它生效,作用的是它到达时引擎正在等的那份审阅,不一定是卡上那份计划;生效与否只由正文前半句说(目录键 `approval.planReview.decision.sentWithoutGateId`,en / zh)。只改正文,机读位不加键。这样的回答不授予退出计划模式的权,但计划若已被别处换过,会让模型重做一轮规划(可能丢掉一份还没人看过的计划,理由也会挂到那一份上)。
|
|
61
|
+
- **坏行出路句改口(§142 PA-3;目录键 `approval.planReview.decision.gateUntrusted`,en / zh)**:修好之前在这里批准会被同样拒掉、什么都不改;拒绝或要求重新出计划将不带门编号提交 —— 不批准任何东西,但计划若在此期间已换,就作用在那时在等的那份上(可能还没人看过);也可以取消任务。旧句「再答一次将不带门编号提交」作废。
|
|
62
|
+
- **桥上原始动词 `HitlBridge.reviewPlan`(§142 PA-4;🔴 行为变 + 型面加性)**:`PlanReviewOutcome` 多一位可选 `checkpointId`(审阅卡事实上的门身份,逐字);批准 / 改写不带它(或不是非空串)⇒ 本地安全停 `HitlSafetyError`,码 `wrong_gate`(本动词既有的门守卫码),说明句 = 目录键 `approval.planReview.bridge.gateIdMissing`(en / zh;安全停的 `message` 是英文那一句),一个字节都不发;带了原样上体;拒绝照旧(带了也原样上体)。决断词在入口只读一次、之后全程用这一读:读到的不是 `approve` / `edit` / `reject` 三词之一的原始串(装箱串、表外词)⇒ 本地安全停 `HitlSafetyError`,码 `bad_plan_edit`(本动词既有的坏入参码),一个字节都不发。安全停说明句不说计划还在等(一个请求都没发,证不了)。
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
|
|
66
|
+
- **结局成因五词 `PlanReviewOutcomeCause`(§142 PA-2;根入口 +1 型名;`cause` 值域由一词拓宽为五词 —— 对把它当单值或做穷尽判断的消费者是型面变化(编译红一次),其余为加性)**:`stored_form_unsupported` · `card_missing` · `card_withholds` · `gate_moved` · `gate_untrusted`。`PlanReviewOutcomeMeta.cause`(队列项 `_sema_planReviewOutcome` 与 `onOutcome` 载荷同值)由一词扩为五词,与 `effect` 成对,合法对恰五对:`still_parked` + `stored_form_unsupported` · `not_sent` + `card_missing` / `card_withholds` · `not_applied` + `gate_moved` / `gate_untrusted`;其余一律不落键(表外词与非法对不折成别的词)。缺席不是「生效了」,也不是「没有原因」:是本包没给成因。队列项、回调与队列口的重冻同读一张配对表;队列口对外来结局对象的 `effect` / `cause` 各读一次。`planReviewOutcomeTail` 第四参同型放宽(只有 `still_parked` + `stored_form_unsupported` 这一对改尾句)。
|
|
67
|
+
- **升级须知(值域由一词扩为五词,§142 PA-2)**:① 对 `cause` 写穷尽 `switch`(`default` 用 `never` 检查)或 `Record<…, …>` 的代码会编译红一次 ② 按旧一词做枚举校验的回读会拒新四词 ③ 把 `cause` 当布尔用(`if (meta.cause)`)的旧判断会把新四词误读成「服务端读不了这份停驻存下的样子」—— 改按值比较 ④ 新旧两版混跑时,旧版的队列口重冻只留 `stored_form_unsupported`,新四词被丢(键缺席,不会变成别的词)。
|
|
68
|
+
- 消息目录 +2 键(`approval.planReview.decision.sentWithoutGateId` / `approval.planReview.bridge.gateIdMissing`,en / zh),改 1 键(`approval.planReview.decision.gateUntrusted`,en / zh)。
|
|
69
|
+
|
|
70
|
+
### Gates
|
|
71
|
+
|
|
72
|
+
- 扩 **`scripts/run-plan-review-decide-card-projection-test.mjs`**(CC-1496;§142 PA-1 – PA-5):假引擎升成服务端模型(run 行回显的门编号与当前门的可信身份分开建模,只读生效记账与收到的体字节);新格 D13(拒认后同卡再批准两发都带门身份、再拒 ⇒ `gate_untrusted`)· D14(拒认后门推进到另一道,在旧卡上批准 ⇒ 零生效、`gate_moved`)· D14b(判成「门换了」的门不进拒认集:拒体带 `currentPending` / 回拉是别的门两形,随后同卡拒绝的请求体仍带门身份)· D15 / D15b / D15m(去档重发同一门身份;重发被拒不报生效;修好的坏行 [400, 200];会改写入参体的 client)· D16 / D16n(拒绝 / 重新呈上不带门身份、作用门与结局、「没带门编号」一句恰一次)· D17(成因六形 × 两通道;配对表 36 对全矩阵;访问器两读两答的外来结局对象)· D18(改口句英文正文、中文目录与中文渲染、两语键集)· D19(已装目标形 × 拒认集,线上原始字节)· D20(修好坏行后自愈)· D21(桥上原始动词)· D22(拒认后拒绝八形:条件式「没带门编号」一句只在确实发出时出现)· D23 / D24(决断口与桥上原始动词的决断词入口闭集判:装箱串 / 表外词 / 每读一答的取值器)· D25(队列口重冻对外来结局的 `cause` 只读一次)· D26(桥上非串门身份)· D27(出站体键序逐字节)· D21s / D18s(两句的英 / 中新句);改钉 D9(一只成因槽,语法树计数)· D9b(结局键 = 配对表)· D10(第二发批准照带门身份)· D11 / D12 / D12b(拒认集探针由批准改成拒绝)。
|
|
73
|
+
- 改钉 `scripts/run-client-core-pure-test.mjs` B7 与 `scripts/run-hitl-words-readout-test.mjs` G-HW5:桥上原始动词的批准 / 改写探针带门身份(§142 PA-4)。
|
|
74
|
+
|
|
52
75
|
## 0.112.0(2026-11-10)
|
|
53
76
|
|
|
54
77
|
> 主题:本地配置共用内核与其上三个配置域(MCP 服务器 / 技能 / 模型池)归包,连同服务端 7.149.0 · 类型包 38.1.0 · 设置契约 25.1.0 提货 ‖ 设置契约换钉 18.0.0 → 25.1.0:hook 条目判官多承运六键、服务端读者代际表一行不读键 1 → 5,其余各项零读点(接入文档 **§141 SS25-1 – SS25-9**;行为变:设置文件 hooks 这些键的坏值改判坏块)‖ 本地配置共用内核骨架:文档名表 + 全局状态文件唯一定位口 · 文件读数四态 · 写律一只编排口 · 回执四臂 + 预演 · 拒因闭集与两语句 · 车道判与写位前置 · 写意图表 + 设置写计划(CC-1452;接入文档 **§141 LC-1 – LC-9**;加性)‖ MCP 服务器配置归包:读侧一只 `mcpServersReport` · 写侧一只 `applyMcpServerEdit` · 两只视图投影器 · 座位能力位 `mcpServers` / `mcpServerEdit`(CC-1443 / CC-972;接入文档 **§141 MC2**;🔴 型面 BREAKING 窄)‖ 技能归本地配置内核:根表 `skillRootsOf` · 有效值读口 · 可编辑判 · 视图 · 写计划 · 座位能力位 `skills` / `skillsEdit`(CC-1445;接入文档 **§141 SK2-1 – SK2-10**;🔴 型面 BREAKING 窄)‖ 模型池与档位:纯计划口 `poolWritePlan` + 内核意图 · 视图与有效缺省读口 · 座位能力位 `modelPool` / `modelPoolEdit` 与三动词 · 存不存只问写不写律、验证状态三态 · 在线目录丢行数随目录走(CC-828;接入文档 **§141 MP-1 – MP-13**;🔴 型面 BREAKING 窄 + 行为变:缺省只走唯一律 `defaultModelChoiceOf`)‖ 模型配置缺席项 → 归因句:一只判词口 `modelConfigGapNotice`,五处读者同一铸点(CC-1465;接入文档 **§141 MG-1 – MG-5**;加性)‖ 服务端 7.149.0 / 类型包 38.1.0 提货:决断拒收出路词 `wayOut` 与出路句口 · 模型行视图窗口来源 · 读拒地板披露读口 `readDenyFloorOf` · 「原样重发改不了判」码表读类型包快照(CC-1458 / CC-1457;接入文档 **§141 S7149-0 – S7149-7**;🔴 行为变) ‖ 模型池余项:迁移合并律 · 孤儿钥匙槽清扫 · 缺省模型唯一律(CC-1460;接入文档 **§141 MX-1 – MX-9**;🔴 行为变) ‖ 本机引擎凭据只走归属证明之后的连接:判官 `engineCredentialReleaseVerdictOf` · 工厂 `makeLocalEngineWireClient`(CC-1466;接入文档 **§141 AO-1 – AO-5**;加性) ‖ 控制台 CA 钉的判定与规范化:地址判官 `readCenterAddress` · 信任 origin · 指纹三口 · 证书集判官 · 取证书重试计划 · 拒因句(CC-1241;接入文档 **§141 CA-1 – CA-9**;加性) ‖ 一事实一读口:店持久性只读能力面 · 引擎不可用行的应答位收探活判决、第九臂 · 被挡句第三方话封长走共享截断规则(CC-1461 / CC-1462 / CC-1463;接入文档 **§141 OR-1 – OR-6**;🔴 型面 BREAKING 窄 + 文案变) ‖ 安全停判官 `isHitlSafetyErrorLike` 的名字读法并入单一读口(CC-1397;接入文档 **§141 IH-1**;行为窄化) ‖ 本地写 allow 规则与卡上整工具一行改问兑付判官(CC-1420;接入文档 **§141 LA2-1 – LA2-4**;🔴 行为变 + 型面加性)
|
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.112.
|
|
38
|
+
**Version:** 0.112.1
|
|
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
|
|
@@ -701,7 +701,7 @@ guard still cross-checks the table by name).
|
|
|
701
701
|
| `scripts/run-seat-computer-use-switch-test.mjs` | Host switch for computer use. Whether the host currently allows computer use, where that value came from, whether an environment variable locks it, and when a change takes effect are answered once, by the host that carries the feature. The seat capability table gains `computerUseSwitch`, reported `true` only by a host that really carries computer use; a browser lane (no seat store) and the terminal never report it, and an absent capability means the switch is not rendered at all, not that it is off. `getComputerUse()` returns `{ enabled, source, lockedByEnv, appliesOn }`; `setComputerUse()` takes `{ enabled: false }` or `{ enabled: true, confirmed: true }` and returns `{ ok: true, changed, state }` or `{ ok: false, reason, state }`, a refusal being a receipt rather than an exception. The words are three frozen tuples: sources `env` / `settings` / `default`, refusal reasons `locked-by-env` / `confirmation-required` / `invalid-request` / `write-failed`, and the effect point `next-engine-start`. The request is untrusted input: `checkSetComputerUseRequest` accepts exactly the two shapes, and `planSetComputerUse(request, lockedByEnv)` decides, in the order malformed shape, then lock, then missing confirmation, whether the host may write; a lock flag that is not strictly `false` counts as locked, and the function never throws. Both outbound gates are closed shapes that also refuse two contradictions: a state locked by the environment must name `env` as its source, and a `locked-by-env` refusal must carry a locked state; the converse, and the locked flag on a successful receipt, are left to the host. Each key of the request is read once and the value judged is the value used. The suite checks registration, both outbound gates key by key, the inbound judge, the planner against an independent reference over a generated pool, the capability reading (including the browser lane and the bare name `computerUse`, which is not the capability), and an end-to-end host double that passes every receipt through the same gate. |
|
|
702
702
|
| `scripts/run-server-7144-pick-projection-test.mjs` | What the client reads from the server's newest session, approval-queue and live-text facts. Each retired, renamed or added server fact has exactly one reading: an older notice or error code that servers in the supported range still send keeps its own reader until the support floor moves past it, and the new code beside it is never folded into the old view or the other way round. Two new error codes are recognised and passed through unchanged. A cross-session message held for review shows an expiry time only when the server sends one; it is never computed from the hold time. A resume refusal tells the engine's row judge tripping over a row (an engine fault) apart from a row that does not read the way it says it should. Text that arrives in several blocks lands as one transcript row per block, and a credential split across two blocks stays out of the transcript on servers that mask it. A block the engine delivers only as its end frame shows up in the live transcript between its neighbours, with the same text a reloaded session shows on servers that include it in their stored rows (older servers leave it out of the stored rows). The user-facing sentence for a refused fork or log replacement on a session archive that still carries an earlier version's owner stamp is read by code only (the generic conflict of earlier servers does not match), is worded in English and Chinese word for word from the server's fixed sentence (compared against the server fixture when present), and carries no machine code. |
|
|
703
703
|
| `scripts/run-frame-arm-completion-projection-test.mjs` | Two frames the server sends in normal operation no longer count as dropped frames. The single-card close frame of the in-stream approval family (`approval_complete`) goes through the same envelope reading as the open and revoke frames and reaches the host as an `approval_complete` chrome event carrying the frame as-is, whose stream context the existing approval frame context reader answers. The session title notice (`session_titled`) becomes a `session_titled` chrome event with the session id and title, read as own non-empty string fields; the session row stays the only source of the title. Approval-card frames (open, revoke and close) never count as proof that a submission created a run: the delivery ledger and the event leg's refusal detection read one shared check, so a busy refusal that follows a replayed card still reaches `onRefused`. Malformed copies are still reported as `malformed`, frames the projector does not know are still reported, and both events stay on the host side of a seat. |
|
|
704
|
-
| `scripts/run-plan-review-decide-card-projection-test.mjs` | Plan-review decisions answer the card that was shown. The gate a plan-review decision answers has one source: the card facts that come with it. The package's own card and a reopened card hand over their own facts; the public decision call reads the `card` option. That gate identity goes into the decision body and is the gate the result is compared with afterwards. Approving needs a card that offers approval (a plan shown as written, with a gate identity); without one nothing is sent and the result says why, in the card's own words when the card withheld approval. If the gate moved on before the decision arrived, the engine refuses it and the result says the plan on the card is no longer the one waiting, without reopening anything. If the engine cannot recognise a gate identity that is still current, the result says so
|
|
704
|
+
| `scripts/run-plan-review-decide-card-projection-test.mjs` | Plan-review decisions answer the card that was shown. The gate a plan-review decision answers has one source: the card facts that come with it. The package's own card and a reopened card hand over their own facts; the public decision call reads the `card` option. That gate identity goes into the decision body and is the gate the result is compared with afterwards. Approving needs a card that offers approval (a plan shown as written, with a gate identity); without one nothing is sent and the result says why, in the card's own words when the card withheld approval. If the gate moved on before the decision arrived, the engine refuses it and the result says the plan on the card is no longer the one waiting, without reopening anything. If the engine cannot recognise a gate identity that is still current, the result says so. An approval always carries the card's gate identity, so on such a gate the engine refuses it again and nothing changes; a rejection or a request for a new plan on that gate is sent without it, and when it was actually sent its result says so, without claiming it took effect. Both the public decision call and the raw bridge verb read the decision word once and send nothing when it is not one of their own words. A default-mode retry carries the same gate identity as the first send, built from a frozen copy of the request body. Why a decision did not take effect is one cause word (`card_missing`, `card_withholds`, `gate_moved`, `gate_untrusted`, `stored_form_unsupported`), set only for the five effect pairs of one table and the same on the queue item and the callback. The raw bridge verb `HitlBridge.reviewPlan` refuses an approval or edit without a gate identity before sending anything. The gate drives the public decision call, the package card, a reopened card and the raw bridge verb against an injected client and an installed target, with a fake engine that models the gate id a run shows separately from the trusted identity of the current gate: missing and malformed cards, a card for another task, withheld cards, a moved gate, the unrecognised-gate path and its alternatives, repair after an unrecognised gate, a client that rewrites the body it was given, the bounded set of unrecognised gates, every effect and cause pair, the public types, and that the cause is set at most once per decision. |
|
|
705
705
|
| `scripts/run-session-engine-lane-projection-test.mjs` | Which engine a session lives on, decided once when the session starts. `sessionEngineBindingFor` turns the engine a host is wired to into a fixed identity key (a versioned JSON tuple for the host's own engine, for a declared engine by center, space and name, or for a direct address) and fails with a reason instead of guessing when a piece is missing; `commitSessionEngine` is the only first writer of the session's engine snapshot (first write, identical replay, a different value refused, an older record restored only on proof; the one other writer is `repointSessionEngine`, the session half of the one-time engine re-point) and raises a notice when the host's own engine is recorded as a Cloud session; `readSessionEngine` only reads the snapshot; `sessionDispatchTarget` picks the target for a session from that snapshot and the host's wiring snapshot and refuses with one of four reasons instead of falling back to the current default; `foldSessionPlacement` keeps a session's execution lane ordered by the device revision. The seat session row carries `engine` and `executionLane`, and the seat capability `engineModeDefaultOnly` says that switching the engine only changes the default for new sessions. The dispatch refusals also include `session-ambiguous` (the same session id sits on more than one engine's ledger); the host judges it and takes the refusal from `sessionDispatchRefusedFor`, and the dispatch judgement itself never answers it. A new session's lane intent (`start({ engine })`) uses exactly the two words a session's engine `kind` carries and the binding commit accepts. |
|
|
706
706
|
| `scripts/run-park-row-card-leg-projection-test.mjs` | Durable pending rows that the engine says it cannot continue: a row whose `rowVerdict` is not `ok` (written by a newer engine, bytes this engine does not resume, an unknown verdict word, or an unreadable verdict) is not shown as an approvable or answerable card and no decision is sent, on both card legs (durable fetch and question-card reopen triage) and in the pending-row count; the outcome carries the verdict and the engine's own sentence, and the fail-soft closing sentence no longer says to decide on the card. Rows with an `ok` verdict and rows from servers that do not send a verdict behave as before. Also pinned: the one way-out sentence shared by the unbound-row refusal and the local `binding_missing` stop, and the synthesized card frame carrying `sourceSessionId`. The same boundary applies when a host hands the decide or answer entry a row it fetched itself, when the verdict position is an accessor (it is not run), and to rows whose gate the engine cannot read (listed by newer engines with a non-`ok` verdict), while rows on a gate this leg does not own are still left to their own leg. Pinned on rows read by the real checkpoint store of two server generations and on rows summarized by the installed engine. When a reopen is refused because this engine cannot continue the parked question row, the self-heal row carries the engine sentence and the cannot-be-decided-here way out, never the resume or decide-on-the-engine way outs. Since 0.108.0 the `settled` verdict of the question-card triage and of the bounded re-check loop also carries `rowTaskId` (the judged row's own run id, present only together with `rowVerdict`; a sole child-run row resolved by fallback yields the child's id, never the requester's; `unborn` / `row` verdicts never carry it), and the root entry exports `checkpointRowBarOf` / `checkpointRowBarSentence` / `CheckpointRowBar` (engine sentence first, package sentence when unreadable). Since 0.108.0 the way-out sentence follows the pending row's own expiry position: with a finite `deadline` it still says to cancel the run or let the approval expire, with `deadline: null` (no expiry timer) it says to cancel the run and that this approval has no expiry timer, and when the position is absent or unreadable it only says to cancel the run; the decide-refusal receipt and the local `binding_missing` stop have no row in hand and always use the cancel-only sentence, the bridge stop reads the row's `deadline`, and the self-heal row reads the optional `_sema_rowDeadline` the host hands next to `_sema_rowVerdict`. Pinned on three states in both languages, a reader table that never runs accessors, and the host verdict in eight shapes. |
|
|
707
707
|
| `scripts/run-steer-input-ids-projection-test.mjs` | Steered input ids reach the host, and inputs the engine reports as unused are matched by id. The only id a steered input has is the `messageId` the server puts on the steer receipt; the client never mints one. Every steer path in the package that holds a receipt hands that id to the host: the control router's `steer()` returns the receipt as received for live (200) and parked (202) deliveries, and the self-heal path puts it on the `running-steered` outcome (absent when the receipt carries none). `readUserInputUndrained()` reads `detail.inputIds` only when the list names exactly the counted inputs, and `undrainedInputsVerdict()` matches it against the host's ids: an id the host sent and has not yet resent under the same id is resent, an id already resent once is handed to the user, and everything else (an unnamed notice, the server's crash report, a sub-agent copy, or ids the host never sent) is reported by count only. If the host's record of resent ids cannot be read, nothing is resent. When the child-session field on an undrained-input notice is present but unreadable, the id list is withheld and nothing is resent; a notice for this session is still resent by id. |
|
|
@@ -41,6 +41,7 @@ export interface PlanReviewOutcome {
|
|
|
41
41
|
editedPlan?: string;
|
|
42
42
|
reason?: string;
|
|
43
43
|
permissionModeAfter?: PlanReviewModeAfter;
|
|
44
|
+
checkpointId?: string;
|
|
44
45
|
}
|
|
45
46
|
export declare const PLAN_REVIEW_MODE_AFTER_WORDS: readonly ["default", "acceptEdits"];
|
|
46
47
|
export type PlanReviewModeAfter = (typeof PLAN_REVIEW_MODE_AFTER_WORDS)[number];
|
package/dist/hitl/hitlBridge.js
CHANGED
|
@@ -13,6 +13,7 @@ import { closeDecisionOp, decisionLedgerKeysOf, openDecisionOp } from './decisio
|
|
|
13
13
|
import { askParkBlockGeneration, noteAskParkDecideSettled } from './askParkAutoReopenBlock.js';
|
|
14
14
|
import { checkpointQueueRowSortOf, QUEUE_ROW_FAMILY_UNREADABLE_GATE } from './approvalQueueRow.js';
|
|
15
15
|
import { checkpointDeadlineStateOf, checkpointRowBarOf, checkpointRowBarSentence, unboundWayOutContent } from '../checkpointRowVerdict.js';
|
|
16
|
+
import { DATA_FACE_LANGUAGE, msg, renderMessage } from '../i18n/translate.js';
|
|
16
17
|
export const DEFAULT_DENY_REASON = 'The user rejected this tool use';
|
|
17
18
|
export const MAX_DENY_REASON_CHARS = 4096;
|
|
18
19
|
export function denyReasonForWire(reason, tag) {
|
|
@@ -419,32 +420,44 @@ export class HitlBridge {
|
|
|
419
420
|
return this.decideRaw(pending.sessionId, decision, opts);
|
|
420
421
|
}
|
|
421
422
|
async reviewPlan(outcome, opts) {
|
|
423
|
+
const decisionRaw = outcome.decision;
|
|
424
|
+
const decision = decisionRaw === 'approve' || decisionRaw === 'edit' || decisionRaw === 'reject' ? decisionRaw : undefined;
|
|
425
|
+
if (decision === undefined) {
|
|
426
|
+
throw new HitlSafetyError('plan-review decision must be "approve", "edit" or "reject"', 'bad_plan_edit');
|
|
427
|
+
}
|
|
422
428
|
const kind = this.active?.gate.kind;
|
|
423
429
|
if (kind && kind !== 'plan_review' && kind !== 'needs_review') {
|
|
424
430
|
throw new HitlSafetyError(`cannot plan-review a "${kind}" gate — a plan decision must never resolve a tool approval`, 'wrong_gate');
|
|
425
431
|
}
|
|
426
|
-
if (
|
|
432
|
+
if (decision === 'edit') {
|
|
427
433
|
if (!outcome.editedPlan || outcome.editedPlan.length === 0) {
|
|
428
434
|
throw new HitlSafetyError('plan-review "edit" requires a non-empty editedPlan', 'bad_plan_edit');
|
|
429
435
|
}
|
|
430
436
|
}
|
|
431
437
|
else if (outcome.editedPlan !== undefined) {
|
|
432
|
-
throw new HitlSafetyError(`plan-review "${
|
|
438
|
+
throw new HitlSafetyError(`plan-review "${decision}" must NOT carry editedPlan`, 'bad_plan_edit');
|
|
433
439
|
}
|
|
434
440
|
const modeAfter = outcome.permissionModeAfter;
|
|
435
441
|
if (modeAfter !== undefined && !isPlanReviewModeAfter(modeAfter)) {
|
|
436
442
|
throw new HitlSafetyError('plan-review permissionModeAfter must be "default" or "acceptEdits"', 'bad_plan_mode');
|
|
437
443
|
}
|
|
438
|
-
const
|
|
444
|
+
const gateRaw = outcome.checkpointId;
|
|
445
|
+
const gate = typeof gateRaw === 'string' && gateRaw !== '' ? gateRaw : undefined;
|
|
446
|
+
if (gate === undefined && (decision === 'approve' || decision === 'edit')) {
|
|
447
|
+
throw new HitlSafetyError(renderMessage(msg('approval.planReview.bridge.gateIdMissing'), DATA_FACE_LANGUAGE), 'wrong_gate');
|
|
448
|
+
}
|
|
449
|
+
const req = { decision };
|
|
439
450
|
if (modeAfter !== undefined && isPlanReviewModeAfter(modeAfter))
|
|
440
451
|
req.permissionModeAfter = modeAfter;
|
|
441
|
-
if (
|
|
452
|
+
if (decision === 'edit' && outcome.editedPlan !== undefined)
|
|
442
453
|
req.editedPlan = outcome.editedPlan;
|
|
443
454
|
if (outcome.reason !== undefined) {
|
|
444
455
|
const r = denyReasonForWire(outcome.reason, `plan-review ${this.taskId}`);
|
|
445
456
|
if (r !== undefined)
|
|
446
457
|
req.reason = r;
|
|
447
458
|
}
|
|
459
|
+
if (gate !== undefined)
|
|
460
|
+
req.checkpointId = gate;
|
|
448
461
|
return this.client.assistant.planReview(this.taskId, req, opts);
|
|
449
462
|
}
|
|
450
463
|
async resumeResourceLimit(opts) {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { type PlanReviewCardFacts, type PlanReviewFactsTaken } from '../planReviewCardFacts.js';
|
|
2
2
|
import { type MessageRef } from '../i18n/translate.js';
|
|
3
|
+
import type { PlanReviewOutcomeCause } from '../planReviewOutcomeCause.js';
|
|
3
4
|
import type { MessageKey } from '../i18n/messages.en.js';
|
|
4
5
|
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
5
6
|
export declare function planReviewCardNoteRef(facts: PlanReviewCardFacts): MessageRef | undefined;
|
|
6
7
|
export declare function planReviewUnreadableNoteRef(): MessageRef;
|
|
7
8
|
export declare function planReviewCardNote(facts: PlanReviewCardFacts, lang?: UiLanguage): string | undefined;
|
|
8
9
|
export declare function planReviewAskAgainKey(facts: PlanReviewCardFacts | undefined): MessageKey;
|
|
9
|
-
export type PlanReviewDecisionReason =
|
|
10
|
-
export declare function planReviewDecisionReasonRef(reason:
|
|
10
|
+
export type PlanReviewDecisionReason = Exclude<PlanReviewOutcomeCause, 'stored_form_unsupported'>;
|
|
11
|
+
export declare function planReviewDecisionReasonRef(reason: PlanReviewOutcomeCause, card?: PlanReviewCardFacts): MessageRef | undefined;
|
|
11
12
|
export interface PlanReviewLedgerSource {
|
|
12
13
|
readonly runRow: (taskId: string, signal: AbortSignal) => Promise<object>;
|
|
13
14
|
readonly frames: (taskId: string, signal: AbortSignal) => AsyncIterable<object>;
|
|
@@ -48,6 +48,8 @@ export function planReviewAskAgainKey(facts) {
|
|
|
48
48
|
}
|
|
49
49
|
export function planReviewDecisionReasonRef(reason, card) {
|
|
50
50
|
switch (reason) {
|
|
51
|
+
case 'stored_form_unsupported':
|
|
52
|
+
return undefined;
|
|
51
53
|
case 'card_missing':
|
|
52
54
|
return msg('approval.planReview.decision.cardMissing');
|
|
53
55
|
case 'card_withholds': {
|
|
@@ -3,6 +3,8 @@ import type { EngineWireInjection } from '../engineWireSdk.js';
|
|
|
3
3
|
import { type PlanReviewModeAfter } from './hitlBridge.js';
|
|
4
4
|
import type { AgentClient } from '@sema-agent/sdk';
|
|
5
5
|
import { isPlanReviewPark, type PlanReviewCardFacts } from '../planReviewCardFacts.js';
|
|
6
|
+
import { type PlanReviewOutcomeCause } from '../planReviewOutcomeCause.js';
|
|
7
|
+
export type { PlanReviewOutcomeCause } from '../planReviewOutcomeCause.js';
|
|
6
8
|
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
7
9
|
import type { ReopenCardVerdict } from '../adapter/activeRunSelfHeal.js';
|
|
8
10
|
export declare const PLAN_REVIEW_APPROVE_LABEL = "Yes, approve and run the plan";
|
|
@@ -80,10 +82,10 @@ export interface PlanReviewOutcomeMeta {
|
|
|
80
82
|
dispatchNo: number;
|
|
81
83
|
decision: 'approve' | 'reject' | 'ask_again';
|
|
82
84
|
effect: PlanReviewDecisionEffect;
|
|
83
|
-
cause?:
|
|
85
|
+
cause?: PlanReviewOutcomeCause;
|
|
84
86
|
questionId?: string;
|
|
85
87
|
}
|
|
86
|
-
export declare function planReviewOutcomeTail(taskId: string, decision: 'approve' | 'reject', effect: PlanReviewDecisionEffect, cause?:
|
|
88
|
+
export declare function planReviewOutcomeTail(taskId: string, decision: 'approve' | 'reject', effect: PlanReviewDecisionEffect, cause?: PlanReviewOutcomeCause): string;
|
|
87
89
|
export type PlanReviewWireClient = {
|
|
88
90
|
assistant: Pick<AgentClient['assistant'], 'planReview'>;
|
|
89
91
|
runs: Pick<AgentClient['runs'], 'get'> & Partial<Pick<AgentClient['runs'], 'events'>>;
|
|
@@ -18,6 +18,7 @@ import { denyReasonForWire, isPlanReviewModeAfter } from './hitlBridge.js';
|
|
|
18
18
|
import { freshPlanReviewQuestionId, planReviewQuestionId, REOPEN_ID_TAIL, taskIdFromPlanReviewQuestionId } from './gateIdentity.js';
|
|
19
19
|
import { isPlanReviewPark, mintPlanReviewCardFacts, notePlanReviewCardIssued, pausedCheckpointIdOf, planReviewCardFactsFrom, planReviewFactsCurrent, registeredPlanReviewCardFacts, samePlanReviewCardFacts, unknownBody, _resetPlanReviewRunsForTest, } from '../planReviewCardFacts.js';
|
|
20
20
|
import { planReviewAskAgainKey, planReviewCardNoteRef, planReviewDecisionReasonRef, planReviewUnreadableNoteRef, takePlanReviewFacts, _resetPlanReviewFactsFlightsForTest, } from './planReviewCard.js';
|
|
21
|
+
import { planReviewOutcomeCauseOf } from '../planReviewOutcomeCause.js';
|
|
21
22
|
import { EN_MESSAGES } from '../i18n/messages.en.js';
|
|
22
23
|
import { msg, renderMessage, DATA_FACE_LANGUAGE } from '../i18n/translate.js';
|
|
23
24
|
import { notePlanReviewAnswered, notePlanReviewAnsweredFor, planReviewArmedKeyFor, waitForGateArmedFor, wasGateArmedFor, } from './armedGateRegistry.js';
|
|
@@ -666,11 +667,34 @@ function noteEngineRefusedGate(id) {
|
|
|
666
667
|
engineRefusedGateIds.delete(oldest.value);
|
|
667
668
|
}
|
|
668
669
|
}
|
|
670
|
+
function wireGateOf(decision, gate) {
|
|
671
|
+
if (gate === undefined)
|
|
672
|
+
return undefined;
|
|
673
|
+
if (decision === 'approve')
|
|
674
|
+
return gate;
|
|
675
|
+
return engineRefusedGateIds.has(gate) ? undefined : gate;
|
|
676
|
+
}
|
|
677
|
+
function planReviewWireBodyOf(decision, reason, mode, gate) {
|
|
678
|
+
const withReason = reason !== undefined ? { reason } : {};
|
|
679
|
+
const withMode = mode !== undefined ? { permissionModeAfter: mode } : {};
|
|
680
|
+
if (decision === 'approve')
|
|
681
|
+
return gate === undefined ? undefined : Object.freeze({ decision, ...withReason, ...withMode, checkpointId: gate });
|
|
682
|
+
return Object.freeze({ decision, ...withReason, ...withMode, ...(gate !== undefined ? { checkpointId: gate } : {}) });
|
|
683
|
+
}
|
|
669
684
|
function planReviewDecisionReasonSegment(reason, card) {
|
|
670
685
|
if (reason === undefined)
|
|
671
686
|
return '';
|
|
672
687
|
try {
|
|
673
|
-
|
|
688
|
+
const ref = planReviewDecisionReasonRef(reason, card);
|
|
689
|
+
return ref === undefined ? '' : ` ${renderMessage(ref, DATA_FACE_LANGUAGE)}`;
|
|
690
|
+
}
|
|
691
|
+
catch {
|
|
692
|
+
return '';
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
function planReviewSentWithoutGateSegment() {
|
|
696
|
+
try {
|
|
697
|
+
return ` ${renderMessage(msg('approval.planReview.decision.sentWithoutGateId'), DATA_FACE_LANGUAGE)}`;
|
|
674
698
|
}
|
|
675
699
|
catch {
|
|
676
700
|
return '';
|
|
@@ -741,9 +765,17 @@ function askAgainReasonOf(card, opts) {
|
|
|
741
765
|
return renderMessage(msg('approval.planReview.askAgain.unknown'), DATA_FACE_LANGUAGE);
|
|
742
766
|
}
|
|
743
767
|
}
|
|
768
|
+
function planReviewDecisionWordOf(raw) {
|
|
769
|
+
return raw === 'approve' || raw === 'reject' || raw === 'ask_again' ? raw : undefined;
|
|
770
|
+
}
|
|
744
771
|
async function decidePlanReviewFor(taskId, decision, permissionModeAfter, opts, card, cardId) {
|
|
772
|
+
const word = planReviewDecisionWordOf(decision);
|
|
773
|
+
if (word === undefined) {
|
|
774
|
+
hostLog('error', `planReviewWire: decision-word-refused typeof=${typeof decision}`);
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
745
777
|
if (typeof taskId === 'string' && planReviewOpsOf(taskId).some((op) => op.phase === 'posting')) {
|
|
746
|
-
hostLog('error', `planReviewWire: decidePlanReview(${
|
|
778
|
+
hostLog('error', `planReviewWire: decidePlanReview(${word}) for task ${taskId} REFUSED — a decision for this task is already in flight (duplicate delivery latched)`);
|
|
747
779
|
return;
|
|
748
780
|
}
|
|
749
781
|
let op = typeof taskId === 'string' ? claimablePlanReviewDecisionOp(taskId) : undefined;
|
|
@@ -770,11 +802,11 @@ async function decidePlanReviewFor(taskId, decision, permissionModeAfter, opts,
|
|
|
770
802
|
settleDecisionOp(mine, 'package');
|
|
771
803
|
};
|
|
772
804
|
const dispatchNo = ++decideDispatchSeq;
|
|
773
|
-
hostLog('debug', `planReviewWire: decidePlanReview dispatch #${dispatchNo} task=${taskId} decision=${
|
|
805
|
+
hostLog('debug', `planReviewWire: decidePlanReview dispatch #${dispatchNo} task=${taskId} decision=${word} mode=${permissionModeAfter ?? '-'}`);
|
|
774
806
|
try {
|
|
775
|
-
const wireDecision =
|
|
776
|
-
const wireOpts =
|
|
777
|
-
await decidePlanReviewInner(taskId, wireDecision, permissionModeAfter, dispatchNo, releaseLatch, settle, wireOpts, card,
|
|
807
|
+
const wireDecision = word === 'ask_again' ? 'reject' : word;
|
|
808
|
+
const wireOpts = word === 'ask_again' ? { ...opts, reason: askAgainReasonOf(card, opts) } : opts;
|
|
809
|
+
await decidePlanReviewInner(taskId, wireDecision, permissionModeAfter, dispatchNo, releaseLatch, settle, wireOpts, card, word, cardId);
|
|
778
810
|
}
|
|
779
811
|
finally {
|
|
780
812
|
releaseLatch();
|
|
@@ -797,14 +829,15 @@ function planReviewClientsFor(resolved) {
|
|
|
797
829
|
}
|
|
798
830
|
async function decidePlanReviewInner(taskId, decision, permissionModeAfter, dispatchNo, releaseLatch, settle, opts, card, semanticDecision, cardId) {
|
|
799
831
|
let outcome;
|
|
800
|
-
let
|
|
832
|
+
let cause;
|
|
833
|
+
let unsentProven = false;
|
|
801
834
|
const gateBefore = card?.checkpointId;
|
|
802
835
|
const approvalWithheld = decision !== 'approve' ? undefined : card === undefined ? 'card_missing' : card.body.kind !== 'shown' || card.checkpointId === undefined ? 'card_withholds' : undefined;
|
|
803
836
|
let effect = 'unconfirmed';
|
|
804
|
-
let stillParkedCause;
|
|
805
837
|
let statusSeen;
|
|
806
838
|
const wire = opts?.wire;
|
|
807
839
|
const resolved = engineWireFor(wire, DEFAULT_SESSION_KEY, usablePlanReviewWireClient);
|
|
840
|
+
const wireGate = wireGateOf(decision, gateBefore);
|
|
808
841
|
const badMode = permissionModeAfter !== undefined && !isPlanReviewModeAfter(permissionModeAfter);
|
|
809
842
|
if (badMode) {
|
|
810
843
|
hostLog('error', `planReviewWire: ${decision} NOT sent — permissionModeAfter must be "default" or "acceptEdits"`);
|
|
@@ -814,7 +847,7 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
814
847
|
else if (approvalWithheld !== undefined) {
|
|
815
848
|
hostLog('debug', `planReviewWire: not-sent decision=${decision} reason=${approvalWithheld}`);
|
|
816
849
|
effect = 'not_sent';
|
|
817
|
-
|
|
850
|
+
cause = approvalWithheld;
|
|
818
851
|
outcome = renderMessage(msg('approval.planReview.decision.notSent', { decision }), DATA_FACE_LANGUAGE);
|
|
819
852
|
}
|
|
820
853
|
else if (resolved.kind === 'no-target') {
|
|
@@ -836,7 +869,6 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
836
869
|
}
|
|
837
870
|
else {
|
|
838
871
|
const client = clients.decide;
|
|
839
|
-
const checkpointId = gateBefore !== undefined && !engineRefusedGateIds.has(gateBefore) ? gateBefore : undefined;
|
|
840
872
|
const repullRow = async () => {
|
|
841
873
|
const probe = clients.repull();
|
|
842
874
|
if (!probe)
|
|
@@ -854,87 +886,90 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
854
886
|
try {
|
|
855
887
|
const mode = isPlanReviewModeAfter(permissionModeAfter) ? permissionModeAfter : undefined;
|
|
856
888
|
const reason = denyReasonForWire(opts?.reason, `plan-review ${taskId}`);
|
|
857
|
-
const
|
|
858
|
-
if (
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
if (checkpointId !== undefined)
|
|
863
|
-
reqBody.checkpointId = checkpointId;
|
|
864
|
-
let body;
|
|
865
|
-
try {
|
|
866
|
-
body = await sendOnce(undefined, () => client.assistant.planReview(taskId, reqBody));
|
|
889
|
+
const wireBody = planReviewWireBodyOf(decision, reason, mode, wireGate);
|
|
890
|
+
if (wireBody === undefined) {
|
|
891
|
+
effect = 'not_sent';
|
|
892
|
+
cause = 'card_withholds';
|
|
893
|
+
outcome = renderMessage(msg('approval.planReview.decision.notSent', { decision }), DATA_FACE_LANGUAGE);
|
|
867
894
|
}
|
|
868
|
-
|
|
869
|
-
const
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
body = await sendOnce(undefined, () => client.assistant.planReview(taskId, { decision, ...(reason !== undefined ? { reason } : {}), ...(checkpointId !== undefined ? { checkpointId } : {}) }));
|
|
895
|
+
else {
|
|
896
|
+
const firstSent = { ...wireBody };
|
|
897
|
+
let body;
|
|
898
|
+
try {
|
|
899
|
+
body = await sendOnce(undefined, () => client.assistant.planReview(taskId, firstSent));
|
|
874
900
|
}
|
|
875
|
-
|
|
876
|
-
|
|
901
|
+
catch (e1) {
|
|
902
|
+
const conflict = e1;
|
|
903
|
+
const defaultConflict = mode === 'default' && conflict?.status === 400 && conflict?.errorCode === REQUEST_FIELD_CONFLICT;
|
|
904
|
+
if (defaultConflict && !directFailureVerdictOf(e1, directSafetyStopOf(e1)).yields) {
|
|
905
|
+
hostLog('debug', 'planReviewWire: permissionModeAfter "default" refused as not applicable — re-sending the approval without the key (same meaning)');
|
|
906
|
+
const { permissionModeAfter: _modeDropped, ...resend } = wireBody;
|
|
907
|
+
body = await sendOnce(undefined, () => client.assistant.planReview(taskId, resend));
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
throw e1;
|
|
911
|
+
}
|
|
877
912
|
}
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
913
|
+
finally {
|
|
914
|
+
releaseLatch();
|
|
915
|
+
}
|
|
916
|
+
hostLog('debug', `planReviewWire: ${decision} → ok (dispatch #${dispatchNo}) ${JSON.stringify(body).slice(0, 200)}`);
|
|
917
|
+
let postStatus;
|
|
918
|
+
let gateAfter;
|
|
919
|
+
let gateKindAfter;
|
|
920
|
+
try {
|
|
921
|
+
const post = await repullRow();
|
|
922
|
+
if (post !== undefined) {
|
|
923
|
+
postStatus = bodyWordOf(post, 'status');
|
|
924
|
+
gateAfter = pausedCheckpointIdOf(post?.result);
|
|
925
|
+
gateKindAfter = pausedGateKindOf(post?.result);
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
catch (e) {
|
|
929
|
+
hostLog('debug', `planReviewWire: post-decide status re-pull failed (fail-soft): ${String(e)}`);
|
|
930
|
+
}
|
|
931
|
+
const bodyStatus = bodyWordOf(body, 'status');
|
|
932
|
+
const effective = postStatus ?? bodyStatus;
|
|
933
|
+
statusSeen = effective;
|
|
934
|
+
effect = planReviewSettledVerdict({ decision, postStatus, bodyStatus, reparked: bodySaysReparked(body), gateBefore, gateAfter, gateKindAfter });
|
|
935
|
+
const code = bodyWordOf(body, 'errorCode');
|
|
936
|
+
if (effect === 'still_parked' && postStatus === 'needs_review' && !bodySaysReparked(body)) {
|
|
937
|
+
outcome =
|
|
938
|
+
`The plan_review ${decision} returned HTTP 200 but the session is STILL locked on the same review gate ` +
|
|
939
|
+
`(post-decide status: needs_review). The decision did NOT take effect (known engine issue, RB-471 family). ` +
|
|
940
|
+
`Tell the user plainly that the ${decision} did not go through; the reliable exits today are approving the plan or cancelling the task.`;
|
|
941
|
+
}
|
|
942
|
+
else if (effect === 'still_parked') {
|
|
943
|
+
outcome =
|
|
944
|
+
`The plan_review ${decision} was NOT applied: the engine could not continue the task and put the plan back to wait for a decision` +
|
|
945
|
+
`${code !== undefined ? ` (engine code: ${code})` : ''}. Tell the user plainly that the ${decision} did not go through.`;
|
|
946
|
+
}
|
|
947
|
+
else if (effect === 'advanced') {
|
|
948
|
+
outcome = planReviewAdvancedOutcome(decision, effective === 'needs_review' ? 'needs_review' : 'suspended');
|
|
949
|
+
}
|
|
950
|
+
else if (effect === 'took_effect') {
|
|
951
|
+
outcome =
|
|
952
|
+
`The plan was ${decision === 'approve' ? 'approved and the parked task resumed to completion' : 'rejected (plan discarded)'} — ${effective === 'completed' ? 'final status' : 'status'}: ${effective} ` +
|
|
953
|
+
`(${postStatus !== undefined ? 'post-decide re-checked: task left the review gate' : "from the decision's own reply; the post-decide re-check was unavailable"}).`;
|
|
954
|
+
}
|
|
955
|
+
else if (effective === 'needs_review' && (gateBefore === undefined || gateAfter === undefined || postStatus !== 'needs_review')) {
|
|
956
|
+
outcome =
|
|
957
|
+
`The plan_review ${decision} returned HTTP 200 and the task is waiting at a plan review gate again (post-decide status: needs_review), ` +
|
|
958
|
+
`but it could not be told whether this is the same review (the ${decision} did not take effect) or a new plan written after it (it did).`;
|
|
959
|
+
}
|
|
960
|
+
else if (effective === 'suspended' || effective === 'needs_review') {
|
|
961
|
+
outcome =
|
|
962
|
+
`The plan_review ${decision} was accepted by the engine (HTTP 200) and the task is paused again (post-decide status: ${effective}), ` +
|
|
963
|
+
`${gateKindAfter !== undefined ? `at a '${gateKindAfter}' pause that is not an approval card` : 'but the pause it stopped at was not reported'} — what the ${decision} led to could not be confirmed.`;
|
|
964
|
+
}
|
|
965
|
+
else if (effective !== undefined) {
|
|
966
|
+
outcome =
|
|
967
|
+
`The plan_review ${decision} was accepted by the engine (HTTP 200), but the task then reported status ${effective}` +
|
|
968
|
+
`${code !== undefined ? ` (engine code: ${code})` : ''} — not a completion; what the ${decision} led to could not be confirmed.`;
|
|
969
|
+
}
|
|
970
|
+
else {
|
|
971
|
+
outcome = `The plan_review ${decision} was accepted by the engine (HTTP 200) but its effect is unconfirmed — final status: unknown (post-decide verification unavailable). Do not treat this as ${decision === 'approve' ? 'an approval that resumed the task' : 'a discarded plan'}.`;
|
|
892
972
|
}
|
|
893
|
-
}
|
|
894
|
-
catch (e) {
|
|
895
|
-
hostLog('debug', `planReviewWire: post-decide status re-pull failed (fail-soft): ${String(e)}`);
|
|
896
|
-
}
|
|
897
|
-
const bodyStatus = bodyWordOf(body, 'status');
|
|
898
|
-
const effective = postStatus ?? bodyStatus;
|
|
899
|
-
statusSeen = effective;
|
|
900
|
-
effect = planReviewSettledVerdict({ decision, postStatus, bodyStatus, reparked: bodySaysReparked(body), gateBefore, gateAfter, gateKindAfter });
|
|
901
|
-
const code = bodyWordOf(body, 'errorCode');
|
|
902
|
-
if (effect === 'still_parked' && postStatus === 'needs_review' && !bodySaysReparked(body)) {
|
|
903
|
-
outcome =
|
|
904
|
-
`The plan_review ${decision} returned HTTP 200 but the session is STILL locked on the same review gate ` +
|
|
905
|
-
`(post-decide status: needs_review). The decision did NOT take effect (known engine issue, RB-471 family). ` +
|
|
906
|
-
`Tell the user plainly that the ${decision} did not go through; the reliable exits today are approving the plan or cancelling the task.`;
|
|
907
|
-
}
|
|
908
|
-
else if (effect === 'still_parked') {
|
|
909
|
-
outcome =
|
|
910
|
-
`The plan_review ${decision} was NOT applied: the engine could not continue the task and put the plan back to wait for a decision` +
|
|
911
|
-
`${code !== undefined ? ` (engine code: ${code})` : ''}. Tell the user plainly that the ${decision} did not go through.`;
|
|
912
|
-
}
|
|
913
|
-
else if (effect === 'advanced') {
|
|
914
|
-
outcome = planReviewAdvancedOutcome(decision, effective === 'needs_review' ? 'needs_review' : 'suspended');
|
|
915
|
-
}
|
|
916
|
-
else if (effect === 'took_effect') {
|
|
917
|
-
outcome =
|
|
918
|
-
`The plan was ${decision === 'approve' ? 'approved and the parked task resumed to completion' : 'rejected (plan discarded)'} — ${effective === 'completed' ? 'final status' : 'status'}: ${effective} ` +
|
|
919
|
-
`(${postStatus !== undefined ? 'post-decide re-checked: task left the review gate' : "from the decision's own reply; the post-decide re-check was unavailable"}).`;
|
|
920
|
-
}
|
|
921
|
-
else if (effective === 'needs_review' && (gateBefore === undefined || gateAfter === undefined || postStatus !== 'needs_review')) {
|
|
922
|
-
outcome =
|
|
923
|
-
`The plan_review ${decision} returned HTTP 200 and the task is waiting at a plan review gate again (post-decide status: needs_review), ` +
|
|
924
|
-
`but it could not be told whether this is the same review (the ${decision} did not take effect) or a new plan written after it (it did).`;
|
|
925
|
-
}
|
|
926
|
-
else if (effective === 'suspended' || effective === 'needs_review') {
|
|
927
|
-
outcome =
|
|
928
|
-
`The plan_review ${decision} was accepted by the engine (HTTP 200) and the task is paused again (post-decide status: ${effective}), ` +
|
|
929
|
-
`${gateKindAfter !== undefined ? `at a '${gateKindAfter}' pause that is not an approval card` : 'but the pause it stopped at was not reported'} — what the ${decision} led to could not be confirmed.`;
|
|
930
|
-
}
|
|
931
|
-
else if (effective !== undefined) {
|
|
932
|
-
outcome =
|
|
933
|
-
`The plan_review ${decision} was accepted by the engine (HTTP 200), but the task then reported status ${effective}` +
|
|
934
|
-
`${code !== undefined ? ` (engine code: ${code})` : ''} — not a completion; what the ${decision} led to could not be confirmed.`;
|
|
935
|
-
}
|
|
936
|
-
else {
|
|
937
|
-
outcome = `The plan_review ${decision} was accepted by the engine (HTTP 200) but its effect is unconfirmed — final status: unknown (post-decide verification unavailable). Do not treat this as ${decision === 'approve' ? 'an approval that resumed the task' : 'a discarded plan'}.`;
|
|
938
973
|
}
|
|
939
974
|
}
|
|
940
975
|
catch (e) {
|
|
@@ -960,7 +995,7 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
960
995
|
}
|
|
961
996
|
else if (status === 409 && refusedCode === APPROVAL_STALE) {
|
|
962
997
|
let untrusted = false;
|
|
963
|
-
if (
|
|
998
|
+
if (wireGate !== undefined) {
|
|
964
999
|
const bag = readThrownExtra(e);
|
|
965
1000
|
const noCurrentPending = bag.state === 'object' &&
|
|
966
1001
|
(() => {
|
|
@@ -974,25 +1009,25 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
974
1009
|
if (noCurrentPending) {
|
|
975
1010
|
try {
|
|
976
1011
|
const row = await repullRow();
|
|
977
|
-
untrusted = row !== undefined && pausedCheckpointIdOf(row?.result) ===
|
|
1012
|
+
untrusted = row !== undefined && pausedCheckpointIdOf(row?.result) === wireGate;
|
|
978
1013
|
}
|
|
979
1014
|
catch {
|
|
980
1015
|
untrusted = false;
|
|
981
1016
|
}
|
|
982
1017
|
}
|
|
983
1018
|
}
|
|
984
|
-
if (untrusted &&
|
|
985
|
-
noteEngineRefusedGate(
|
|
1019
|
+
if (untrusted && wireGate !== undefined)
|
|
1020
|
+
noteEngineRefusedGate(wireGate);
|
|
986
1021
|
hostLog('debug', `planReviewWire: approval-stale decision=${decision} reason=${untrusted ? 'gate_untrusted' : 'gate_moved'}`);
|
|
987
1022
|
effect = 'not_applied';
|
|
988
|
-
|
|
1023
|
+
cause = untrusted ? 'gate_untrusted' : 'gate_moved';
|
|
989
1024
|
outcome = renderMessage(msg('approval.planReview.decision.refused', { decision }), DATA_FACE_LANGUAGE);
|
|
990
1025
|
}
|
|
991
1026
|
else if (checkpointUnsupportedVersionFromError(e) !== null) {
|
|
992
1027
|
const cu = checkpointUnsupportedVersionFromError(e);
|
|
993
1028
|
hostLog('debug', `planReviewWire: ${decision} → 409 checkpoint.unsupported_version (the server cannot continue this parked review in its stored form; still pending)`);
|
|
994
1029
|
effect = 'still_parked';
|
|
995
|
-
|
|
1030
|
+
cause = 'stored_form_unsupported';
|
|
996
1031
|
outcome = `This ${decision} was not applied. ${checkpointUnsupportedVersionContent(cu, { parkKind: 'plan_review', runId: taskId })}`;
|
|
997
1032
|
}
|
|
998
1033
|
else if (resumeContextUnavailableFromError(e) !== null) {
|
|
@@ -1024,18 +1059,20 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
1024
1059
|
else {
|
|
1025
1060
|
const failureTexts = wireFailureTextsOf(e);
|
|
1026
1061
|
hostLog('debug', `planReviewWire: ${decision} could not reach the engine: ${failureTexts.log}`);
|
|
1062
|
+
unsentProven = true;
|
|
1027
1063
|
outcome = `The plan_review decision could not reach the engine: ${failureTexts.reason}`;
|
|
1028
1064
|
}
|
|
1029
1065
|
}
|
|
1030
1066
|
}
|
|
1031
1067
|
}
|
|
1032
|
-
|
|
1033
|
-
|
|
1068
|
+
const outcomeCause = planReviewOutcomeCauseOf(effect, cause);
|
|
1069
|
+
outcome = `${outcome}${planReviewDecisionReasonSegment(outcomeCause, card)}${gateBefore !== undefined && wireGate === undefined && effect !== 'not_sent' && !unsentProven ? planReviewSentWithoutGateSegment() : ''}`;
|
|
1070
|
+
const tail = planReviewOutcomeTail(taskId, decision, effect, outcomeCause);
|
|
1034
1071
|
const prompt = `<plan-review-outcome>\n${outcome}\n${tail}\n</plan-review-outcome>`;
|
|
1035
1072
|
const onOutcome = opts?.onOutcome;
|
|
1036
1073
|
settle(effect === 'not_sent' || effect === 'still_parked');
|
|
1037
1074
|
try {
|
|
1038
|
-
const delivered = enqueuePlanReviewOutcome(prompt, { taskId, dispatchNo, decision: semanticDecision, effect, ...(
|
|
1075
|
+
const delivered = enqueuePlanReviewOutcome(prompt, { taskId, dispatchNo, decision: semanticDecision, effect, ...(outcomeCause !== undefined ? { cause: outcomeCause } : {}), ...(cardId !== undefined ? { questionId: cardId } : {}) });
|
|
1039
1076
|
if (!delivered) {
|
|
1040
1077
|
if (onOutcome !== undefined) {
|
|
1041
1078
|
hostLog('debug', `planReviewWire: outcome queue port not installed for task ${taskId} — outcome handed to the host's onOutcome callback only`);
|
|
@@ -1054,7 +1091,7 @@ async function decidePlanReviewInner(taskId, decision, permissionModeAfter, disp
|
|
|
1054
1091
|
dispatchNo,
|
|
1055
1092
|
decision: semanticDecision,
|
|
1056
1093
|
effect,
|
|
1057
|
-
...(
|
|
1094
|
+
...(outcomeCause !== undefined ? { cause: outcomeCause } : {}),
|
|
1058
1095
|
...(cardId !== undefined ? { questionId: cardId } : {}),
|
|
1059
1096
|
detail: outcome,
|
|
1060
1097
|
tail,
|
|
@@ -1498,6 +1498,8 @@ declare const EN: {
|
|
|
1498
1498
|
'approval.planReview.decision.cardMissing': string;
|
|
1499
1499
|
'approval.planReview.decision.gateMoved': string;
|
|
1500
1500
|
'approval.planReview.decision.gateUntrusted': string;
|
|
1501
|
+
'approval.planReview.decision.sentWithoutGateId': string;
|
|
1502
|
+
'approval.planReview.bridge.gateIdMissing': string;
|
|
1501
1503
|
'approval.planReview.option.askAgain.label': string;
|
|
1502
1504
|
'approval.planReview.option.askAgain.description': string;
|
|
1503
1505
|
'localEngine.behind.cliUpdate': string;
|
package/dist/i18n/messages.en.js
CHANGED
|
@@ -1497,7 +1497,9 @@ const EN = {
|
|
|
1497
1497
|
'approval.planReview.decision.refused': 'This {decision} was not applied: the engine refused it and changed nothing.',
|
|
1498
1498
|
'approval.planReview.decision.cardMissing': 'Approving a plan needs the card that showed it, and none came with this approval.',
|
|
1499
1499
|
'approval.planReview.decision.gateMoved': 'The plan on this card is no longer the one waiting for approval.',
|
|
1500
|
-
'approval.planReview.decision.gateUntrusted': "The engine could not recognise this review's gate id (the server's record of it looks damaged; an operator should check it).
|
|
1500
|
+
'approval.planReview.decision.gateUntrusted': "The engine could not recognise this review's gate id (the server's record of it looks damaged; an operator should check it). Until it is fixed, approving this plan from here is refused the same way and changes nothing. Rejecting it or asking for a new plan is sent without the gate id: that does not approve anything, but if the plan has changed in the meantime it acts on whichever plan is waiting then, which may be one nobody here has seen. Cancelling the task also works.",
|
|
1501
|
+
'approval.planReview.decision.sentWithoutGateId': 'This answer was sent without the gate id. If it took effect, it acted on whichever plan review the engine was waiting on when it arrived, which is not necessarily the plan on this card.',
|
|
1502
|
+
'approval.planReview.bridge.gateIdMissing': 'Approving or editing a plan needs the gate id of the review card the user saw, and this decision did not carry one, so nothing was sent. Decide from the review card, which carries the gate id, or reject the plan or cancel the task instead.',
|
|
1501
1503
|
'approval.planReview.option.askAgain.label': 'No, ask for the plan to be presented again',
|
|
1502
1504
|
'approval.planReview.option.askAgain.description': 'Do not approve; ask the model to present the plan again',
|
|
1503
1505
|
'localEngine.behind.cliUpdate': 'The local engine (version {running}) is newer than this Sema ({own}), so this Sema cannot start new work on it. Run `sema update`, then reopen this session.',
|
package/dist/i18n/messages.zh.js
CHANGED
|
@@ -1497,7 +1497,9 @@ const ZH = {
|
|
|
1497
1497
|
'approval.planReview.decision.refused': '这次 {decision} 没有生效:引擎拒了它,什么都没改。',
|
|
1498
1498
|
'approval.planReview.decision.cardMissing': '批准一份计划需要附上呈出它的那张卡,这次批准没有附卡。',
|
|
1499
1499
|
'approval.planReview.decision.gateMoved': '这张卡上的计划已不是在等批的那份。',
|
|
1500
|
-
'approval.planReview.decision.gateUntrusted': '
|
|
1500
|
+
'approval.planReview.decision.gateUntrusted': '引擎认不出这道审阅门的编号(服务端那一行记录看起来坏了,请运维检查)。修好之前,在这里批准会被同样拒掉、什么都不改。拒绝或要求重新出计划将不带门编号提交:它不批准任何东西,但计划若在此期间已换,它会作用在那时在等的那份计划上,那份可能还没人看过。也可以取消这项任务。',
|
|
1501
|
+
'approval.planReview.decision.sentWithoutGateId': '这次回答发出时没带门编号。若它生效,作用的是它到达时引擎正在等的那份审阅,不一定是这张卡上的计划。',
|
|
1502
|
+
'approval.planReview.bridge.gateIdMissing': '批准或改写计划需要带上用户看过的那张审阅卡的门编号,这次决断没有带,所以什么都没发。请从审阅卡上决断(卡上带着门编号),或改为拒绝这份计划,或取消这项任务。',
|
|
1501
1503
|
'approval.planReview.option.askAgain.label': '不,要模型重新呈上计划',
|
|
1502
1504
|
'approval.planReview.option.askAgain.description': '不批准;要模型重新呈上计划',
|
|
1503
1505
|
'localEngine.behind.cliUpdate': '本机引擎(版本 {running})比这个 Sema({own})新,这个 Sema 不能在它上面开始新的工作。请先运行 `sema update`,再重新打开这个会话。',
|
package/dist/notifications.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hostEnv } from './hostEnv.js';
|
|
2
|
+
import { planReviewOutcomeCauseOf } from './planReviewOutcomeCause.js';
|
|
2
3
|
import { unrefTimer } from './unrefTimer.js';
|
|
3
4
|
import { clearEnginePanelTaskResidentByWire, publishEngineAgentPanelEvent, } from './engineAgentPanelStore.js';
|
|
4
5
|
import { panelEndFact } from './panelReduce.js';
|
|
@@ -432,21 +433,22 @@ export function enqueuePlanReviewOutcome(value, meta) {
|
|
|
432
433
|
priority: 'later',
|
|
433
434
|
isMeta: true,
|
|
434
435
|
workload: 'plan-review',
|
|
435
|
-
...(meta !== undefined
|
|
436
|
-
? {
|
|
437
|
-
_sema_planReviewOutcome: Object.freeze({
|
|
438
|
-
taskId: meta.taskId,
|
|
439
|
-
dispatchNo: meta.dispatchNo,
|
|
440
|
-
decision: meta.decision,
|
|
441
|
-
effect: meta.effect,
|
|
442
|
-
...(meta.effect === 'still_parked' && meta.cause === 'stored_form_unsupported' ? { cause: meta.cause } : {}),
|
|
443
|
-
...(questionId !== undefined ? { questionId } : {}),
|
|
444
|
-
}),
|
|
445
|
-
}
|
|
446
|
-
: {}),
|
|
436
|
+
...(meta !== undefined ? { _sema_planReviewOutcome: planReviewOutcomeRefrozen(meta, questionId) } : {}),
|
|
447
437
|
});
|
|
448
438
|
return true;
|
|
449
439
|
}
|
|
440
|
+
function planReviewOutcomeRefrozen(meta, questionId) {
|
|
441
|
+
const effect = meta.effect;
|
|
442
|
+
const cause = planReviewOutcomeCauseOf(effect, meta.cause);
|
|
443
|
+
return Object.freeze({
|
|
444
|
+
taskId: meta.taskId,
|
|
445
|
+
dispatchNo: meta.dispatchNo,
|
|
446
|
+
decision: meta.decision,
|
|
447
|
+
effect,
|
|
448
|
+
...(cause !== undefined ? { cause } : {}),
|
|
449
|
+
...(questionId !== undefined ? { questionId } : {}),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
450
452
|
export function resupplyTruncatedSentence(facts, lang) {
|
|
451
453
|
try {
|
|
452
454
|
const f = resupplyTruncatedFactsOf(facts);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type PlanReviewOutcomeCause = 'stored_form_unsupported' | 'card_missing' | 'card_withholds' | 'gate_moved' | 'gate_untrusted';
|
|
2
|
+
export declare function planReviewOutcomeCauseOf(effect: {} | null | undefined, cause: {} | null | undefined): PlanReviewOutcomeCause | undefined;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function planReviewOutcomeCauseOf(effect, cause) {
|
|
2
|
+
switch (effect) {
|
|
3
|
+
case 'still_parked':
|
|
4
|
+
return cause === 'stored_form_unsupported' ? 'stored_form_unsupported' : undefined;
|
|
5
|
+
case 'not_sent':
|
|
6
|
+
return cause === 'card_missing' ? 'card_missing' : cause === 'card_withholds' ? 'card_withholds' : undefined;
|
|
7
|
+
case 'not_applied':
|
|
8
|
+
return cause === 'gate_moved' ? 'gate_moved' : cause === 'gate_untrusted' ? 'gate_untrusted' : undefined;
|
|
9
|
+
default:
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.112.0**(本批发布版 = **minor**(型面 BREAKING)—— 本地配置共用内核(LC)与其上三域归包:MCP 服务器配置(MC2)· 技能(SK2)· 模型池与档位(MP / MX);三域座位出站形一形(LCO:列表动词答视图或 `{ kind: 'unavailable', cause }`、写动词答 `{ receipt, … }`)· 模型配置缺席项归因句(MG)· 服务端 7.149.0 + 类型包 38.1.0 + 设置契约 25.1.0 提货(S7149 / SS25)· 本机引擎凭据的归属证明时刻判官与工厂(AO)· 控制台 CA 钉的判定与规范化(CA)· 店持久性单读口、引擎不可用行的应答位收探活判决(OR;`readEngineHealthStore` 退出公面)· 安全停判官名字读法收窄(IH)· 本地写 allow 规则改问兑付判官(LA2);公面 2330 → 2422(+93 −1)。上一 minor **0.111.0**(本批发布版 = **minor**(型面 BREAKING):37 车并入 —— 中文消息目录改住子路径 `./i18n/zh`、`ZH_MESSAGES` 从根入口退役、改住子路径(EX)· 服务端 7.148.0 + 类型包 38.0.0 换钉(S7148;hooks 拒定位 `field` 坐标、store 姿态两代读)· 停驻行卡 `parkRow.taskId` 退役(CP)· 改指证据改 `continuity` 地址对 + 列表口工厂形(RP2 / RP3)· 会话成本读口族(CO)· 决断卡三事实读口 + 换代两拍判官(SQ)· 座位契约 Quick Entry / hooks 名册 / 会话 hooks 名册状态收窄(QE / HR / RF)· 附件路由判官(AR)· 人拒说明位(RN)· 子代理模型词(AM)· 「不再询问」本地落规则兑付(LA)· 计划审阅卡证据代 `evidenceRevision`(EG)· 中文开头句平话回正(MP)· hooks env 名集派发前重算(HE)· 发版前内部检查门;公面 2235 → 2330(+96 −1);发版复审两腿一轮 + 修复腿 F1–F19 已并。上一 minor **0.110.0**(本批发布版 = **minor**(型面 BREAKING):类型包 35 → 37 换钉八处(PK;`checkpoint.invalid_outcome` 读 `row_integrity`、`probeEngineAlive` 去第二参)· 服务端 7.147.0 换钉 + 执行车道词 `none` + 续跑存量体读不出面派句 `unreadRequestMembersFromError`(SP)· workflow 轮询兜底读面原体口 `installWorkflowRunReader` 替 `installWorkflowStatusProbe`(0.110.0 退出公面,见退役名录)(WF)· 会话箱三载体 + `inbox_notice` lane + 臂 `session_box_notice`(SB)· 审批卡入参来源位 `inputSource`(IS)· 读流器耗尽按因读口(RE)· sdk peer 地板 23.1.0 → 25.0.0(SF)· hooks 治理关腿本端也不跑(HC)· 请求体 hooks 只带引擎属主事件(EO)· 出路句按腿分句(FW)· 输入作者词 + runOrigin 唯一读口(AU)· 停驻卡宿主口 `withdrawParkQuestion`(PW)· 展示出口凭据面粘连形(SA)· 清账二十余项。上一 minor **0.109.0**(本批发布版 = **minor**(型面 BREAKING):停驻行三态归属判官 `pendingRowOwnershipOf`(PO)· 宿主设置采纳闸已读载体 `absent` 与有意清空同读(HS2)· 呈卡帧拒因读口 `approvalRequestFrameReadingOf`(FR)· 显示安全三票(DS)· 座位会话行停驻位 `parkedUnresumable`(PU)· 换钉到引擎 7.66.0(含 7.65.0;通告码册 118 → 119;CP)· 本机引擎判官 / 占用读数 / 问询卡 / 退出去向 + 注入面 / 设置层播种 / 起服拒因 + 收尾梯 / 状态机 / 座位生命周期读数(CC-1173 首波;ES / EE / ESB;🔴 型面 BREAKING)· 自动作答不以卡上入参为放行依据(AN;🔴 型面 BREAKING)· 服务端 7.146.0 / 7.147.0 预提货(SP)· 座位 lane 子代别名 `subagent_alias`(SE)· 耐久审批门出句口 + 受众 user 十二码事实读口(NC)· Bash 被掐家族带部分输出的投影(BT)· 外来体读器 `in` 读点四态(AB)· 呈卡族消卡帧两族同判(CF)· 停驻卡回落形披露 + 问卡取用序(PG)· 只以段末帧到达的块进活流转录(LT)· 活卡入口 `approvalId` 只读一次(ID)· 决断面句口根导出 `decideFailureNote` / `decisionAnswerInvalidContent` + 标签洗口凭据网 + m1 真红六件(MF)· §137 两处接入方打回勘误(ERd))。上一 minor **0.108.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.64.0(CT;契约 8 不变;通告码册 117 → 118 · 拒句通告出处三态 · 缺省模型可解析合成判官 `catalogDefaultModelVerdict` + 值级端口第二十五件 `modelFaceResolvable`)· 设置契约 17.2.0 / 18.0.0(SS / SS2;MCP 声明保留成员名表、云控制面 A2A 对端名读数)· hooks 投影剥服务端读者不读的键 + 手写 `source` 不过境(HK;安全修复)· 模型受理判官按服务端 `aliases[]`(MA)· 座位动作通道 `onSeatAction` / `claimSeatActions` / 能力位 `seatActions`(SA)+ 座位资源动词按会话答与新会话车道意图位(LN)· 审批卡「谁问的」两位 + cc-import 结局词 `refused`(AR)· 停驻出路句改口 / 到期位三态 / 挡卡半句读口(RP / WO)· 通知受理判官 + 带完成身份不合批(NB)· 五只闭集各补一词(CS)· 续跑拒码五枚入表(RC)· 终端小票四批(SB / SC / SD:策略拒首句 `policyCause` · 主版本 0 三态 · 无头续收传输错重连 · 通告认审批反馈行 · 宿主回调口异常不外溢 · 老引擎 / 老服务端旧码回读〔`RememberRefusalCode` 多回一员〕· 带戳存档句按场景 · `modelPlaneSentence`)。上一 minor **0.107.0**(本批发布版 = **minor**(型面 BREAKING):换钉到服务端 7.145.0 / 类型包 35.0.0 / 设置契约 17.1.0(SX;规则导入兑付读口改吃整只 200 体)· 引擎 7.63.0(CT;契约 8 不变)· 展示出口 `escapeBackslashes` 第三档 `auto` + `exact` 回读 + 正文档空白一档、`blanks` 取值 `fillers` 退出型面(DM)· 旧码 `context.image_removed` 回册(IR)· 呈卡腿看判决 / 盲卡新名 / `none` 两词 / `task <id>` 标签(HF)· 订正小节 + `isSecretKeyName` 导出 + 带戳存档句口(XZ)· 计划结局载体唯一铸点 + `checkpointQueueRowSortOf` 导出 + steer 回执 messageId 与 undrained 对账判词(RC)。上一 minor **0.106.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.61.0 / 7.62.0(内核契约 6 → 7 → 8;CR / CS)· 服务端 7.142.0 / 7.143.0 / 7.144.0 与类型包 32 / 33 / 34、设置契约 16 / 17(PK / SV / SK / SJ / SW;决断体两位必带、`assistant.resume` 三参、`HitlClientLike` 切片收窄 型面 BREAKING)· 🔴 支持底线抬到服务端 7.139.0 / 引擎 7.60.0(SR)· 审批席判官 `approvalSeatOf`(AS)· 断线重放 / 起服接管审批不再当「不是强制的」(RF)· 流帽早帽退避(SC)· 座位能力位 `computerUseSwitch` / `engineModeDefaultOnly`(CU / LN)· 会话所在引擎 + 执行车道一等抽象 `sessionEngineBindingFor` / `commitSessionEngine` / `sessionDispatchTarget`(LN)· 消卡 / 会话标题两帧投影臂(AT)· v1 卡本会话放行走审批应答口 + 计划审阅批准必须附卡(HD;`DecidePlanReviewOptions.parkedResult` 删 型面 BREAKING)· 激活卡授权段点名(BG)· 计划审阅结局载体不 steer 进在跑的 run(PR)· 探活判官两格 + 导入档 `isCurrent` + auth 原话(PB)· 模型面读口 `modelPlaneOf`(SK);公面 2076(+44 −4))。上一 minor **0.105.0**(本批发布版 = **minor**(型面 BREAKING):换钉到服务端 7.140.0 / 7.141.0 与类型包 31.0.0(引擎 / 内核 7.60.0 · 配置契约 ^15.1.0 不跟;§134 PK-1)· 决断正文载体档 `DISPLAY_DECISION_BODY`(DB-1)· 「这块屏不再跟着 run X」一只形 `RunNotFollowed` + 零预算 `REATTACH_BUDGET_NONE`(RF;按次策略口型面 BREAKING)· 计划审阅卡一份卡事实 + 账本入口 + 重开按事实出选项(PC-1 – PC-12;撤档 / 作答判官三分 / 已呈档位 `withheld` 型面 BREAKING)· 引擎换代收尾决策表终形 `window-exhausted`(EG;`waits` 取代 `awaitedNextEngine` 型面 BREAKING)· 任务通知渲染去重改读服务端完成 id(RL-36 / 38 / 39 退役处置)· 值级端口第二十二件 `IMPORTED_SETTINGS_LAYERS`(ISL;`CoreValuePorts` 必填成员 +1 型面 BREAKING)· 在飞 run 切权限档动词 + 回执投影 `setRunPermissionMode`(PM-1 – PM-4)· 服务端 7.140 / 7.141 件:设置层条目带出处层 / MCP 传输种类能力位与投影期过滤(闭集变宽 型面 BREAKING)/ 记忆同步停驻读数 / 抹除拒档 / workflow 完成诊断 / 子代「未执行」卡 / 权限模式写能力位 / 引擎租约窗(PK-2 – PK-12);公面 2036(+22)· 0.104.1 patch 注记:悬挂审批呈卡族帧形并收(§133 AR)与后台任务表读句尾巴(§133 BT)随本版带)。上一 minor **0.104.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.60.0(引擎 / 内核 7.60.0 · 类型包 30.0.0 · 配置契约 15.1.0;生成表重生成)· MCP 失败类多一词 `host_refused` · 状态帧座位位 `seat` · 值级端口第二十一件 `ruleNameCovers`(名册一步覆盖读法)· 停驻终局结果帧恒走错误臂 / `-p` 出路句只在 `errors[0]`(§132 RA-1 / RA-2)· 权限三桶来源表组内序按写序(PO-1)· 停驻 / 活卡审批卡工具入参真源 = 记录侧那一份 + `argsRewritten`(AK-1 / AK-2,同一只读器)· 钩子车道类依据改读引擎真批准位门类集(HK-2)· 服务端 7.139.0 提货:换绑前态改读执行放置读面(SV-2)· 会话行条件写 `rowTag` / `expectedRowTag`(SV-1)· 换绑 409 子代形(SV-3)· 后台行子会话 id(SV-4)· 宿主设置源三处成文(HS-2a / HS-2b / XA-7a);型面 BREAKING:`CoreValuePorts` 必填成员 +1(`ruleNameCovers`)· `MCP_FAILURE_KINDS` 闭集变宽 · `DeviceSessionBindingOutcome` 臂集变(+`unbound` / `unsupported`,−`lane-absent`;读面切片换 `client.sessions`)· `DeviceBinding` / `DeviceSessionBinding` 不再转出、`boundAt` 退役 · 孤儿型 `ManagedPolicyReading` 退出根入口(RL-290)· RL-310 / 311 / 313 随类型包到货退役;公面 2010 → 2014(+`BRAIN_STATUS_SEATS` / `ruleNameCovers` / `sessionRowTagOf` / `sessionRowPatchRefusalOf`);依赖钉 core `^7.60.0` / mods-kernel `7.60.0` / sdk `^30.0.0` / settings-schema `^15.1.0`;peer sdk `>=23.1.0` / mods-kernel `>=7.54.0`(可选);读点逐端见 §132;§132)。上一版 0.103.0 = **minor**(型面 BREAKING)(一次重锚到引擎 7.59.0(引擎 / 内核 7.59.0 · 类型包 28.0.0 · 配置契约 14.8.0;生成表重生成)· MCP 授权失败记录一只读口四处过境 · 两只新通知事实读器 · 状态帧等待两位 · 工具结果行改参记录与改参句 · 服务器名 `remote-` 前缀律 · 决断拒收「行完整性」只认正证据 · 抹除证明 v2 · 整工具规则候选 · 服务端 7.137.0 随附件(§131 PK-10)· 结果帧成功臂不再带 `errors[]`(§131 LG-1)· 换钉当拍重钉(v1 卡读引擎卡词 `approvalCard`;姿态来源词表五词 +`lane`)· 六只派生窄视图退役;型面 BREAKING:请求键 `promptProfile` 换布尔 `promptLean`(RL-300)· 六导出退役(RL-179 / 192–196,公面 2016 → 2010)· `POSTURE_SOURCE_WORDS` 四 → 五词 · 成功臂 `errors[]` 删;依赖钉 core `^7.59.0` / mods-kernel `7.59.0` / sdk `^28.0.0` / settings-schema `^14.8.0`;peer sdk `>=23.1.0` / mods-kernel `>=7.54.0`(可选);读点逐端见 §131;§131)。上一版 0.102.0 = **minor**(型面 BREAKING(窄))(会话送后台四读口归包(能力位读数 · 连线句柄与本包亲手开流 · 交接资格一只判官 · 交接动词与后台观看)· 会话级思考开关归包(状态机 + `reasoningEffort` 单铸点投影 + 座位动词 / 能力位 / 会话行位)· mods 三类用户面座位(注册卡 / 行旁拒句 / 行旁代答句)+ 桌面装载座位的读口与句口 · 会话映射的引擎命名空间键含规范化路径(经中继的多台引擎不再串键)· 配置地址展示口两读法按位置对应取舍(单斜杠 / 零斜杠写法不再把口令显示成路径;修复轮三)· 出包文案卫生;型面 BREAKING(窄):`fireInteractiveInterrupt(runs, taskId, opts)` 新可选位 `wire` 与新臂 `{ kind: 'withheld' }`;依赖钉不动(core `^7.55.0` / sdk `^24.0.0` / settings-schema `^14.4.0`;peer sdk `>=23.1.0`,支持底线不动);读点逐端见 §130;§130)。上一版 0.101.0 = **minor**(型面 BREAKING)(提货引擎 7.54.0(开发依赖 W1 换钉 `^7.54.0` 与生成表重生成,后续 mods 内核车换钉 core `^7.55.0` / mods-kernel 7.55.0 同号,sdk `^24.0.0` / settings-schema `^14.4.0`;peer sdk `>=23.1.0` 与支持底线 server 7.129.1 / core 7.51.2 / sdk 23.1.0 不动)+ 清账三波(主题波 B-U / B-X / B-D 与 W 车)+ 发版修复轮十六车(修到干净)· MCP 服务器名独立判口 · 引擎名册按对端分组投影 · 收紧桶对端段 `*` 原样 · 值级端口第 19 / 20 件(`ANTHROPIC_DEFAULT_BASE_URL` / `readToolFaces`)· 宿主设置源 `HostSettingsSource` 四件 · 提交身份与请求车道唯一派生 `requestLaneOf` · HITL 决断失败一只直交读口与安全停一位 · 型面 BREAKING:`AllowDenyPolicyOptionsView.scope` 退出 / `SettingsPort` 退役(RL-252)/ `engineAcceptsCatalogDefault` 退出读数型(RL-183)/ `CoreValuePorts` 必填成员 +2 / `HooksWirePlan.httpPolicyDrops` 必填 / 决断拒收分码第五词 `grant_changed` / `-p` 车道 resolver 改收值(读点逐端见 §129y);§129)。上一版 0.100.0 = **minor**(型面 BREAKING)(提货版 + 清账三程 —— 提货 server 7.132.0 / core 7.53.0 / settings-schema 14.1.0 / sdk 24.0.0(peer sdk `>=23.1.0`;支持底线 server 7.129.1 / core 7.51.2 / sdk 23.1.0 不动)· 接线回执第十四段 `mods[]` / 提示词装配清单 v3 / 压缩开始帧 → `system/status` compacting · prepare 拒启码表 + 帽与 hooks 拒读口(`budget_exceeded`)+ 沙箱码臂 · 工具目录第四态 `request_only` · 本地会话 API +2 动词 · 请求面 MCP 条目判官同设置契约 14.1.0(名字 / 传输 / 身份头单判官,逐条披露 `projectMcpConfigs().dropped`)· 任务进度 `seq` 代际 + 子代身份单源 · 展示出口字节边界与主机区域 · 凭据键路径 / 工具旗名 / 注入车道告知 · 型面 BREAKING:`compaction_started` chrome 臂 / `MCP_CAPS` `SKILL_CAPS` 退出公面 / RL-153 `continuesPark` 硬退 / RL-156 `EventLegPorts.perStream` / RL-172 `scenarioAssignmentUnknownFromError`(0.100.0 退出公面,已退役;读点逐端见 §128y);§128)。上一版 0.99.0 = **minor**(型面 BREAKING)(提货版 + 清账二程 —— 提货 server 7.131.0 / sdk 23.1.0 / settings-schema 13.0.1 / core 7.52.0(peer sdk `>=23.1.0`)· 请求层附件席位 `userAttachments`(四态读器 + 装配只发整文件完整文本条目)· MCP 面板判别联合(`servers` 臂 / `scenarioRefusal` 拒因臂,BK-1)· `userInvokedSkills` 槽位 · `allowTools: []` 原样上体 · 审批卡口单路径(`claimApprovalCard` 中止安全登记 + 进程级已结表 + `approvalFrameContextOf`,两族去重归包)· 会话规则逐条扣留(`sessionPolicyDeliverable` 改读引擎 `readRuleEntry`)· 凭据面百分号解码视图 · 不可信标量清洗口 `cleanUntrustedScalar` · 问类规范序筛 · hooks 预检构建期抄本 + 设置文件坏形判官 · 首 token 存活探针合一(`modelCapabilityProbe` / `PROBE_VERDICTS`)· `-p` 车道重试 / 模型服务状态帧(`system/api_retry` + 超集帧 `_sema_model_status`)与合成 API 错误行三只机读位 · 文案单源五批进消息目录 + 路由缺口句 / 人答臂 / 宿主队列三值句口 · 能力缓存变更订阅 / 嵌套位读口 / 作废重探 · 抛出物读法收口与「找不到」三形 · 会话 id 规范口 · 设备面 / 引擎目标席位与座位只读动词 `readSessionMcpPanel` · 退役账到期硬退 RL-151 `STOP_CONFLICT_CODES` + 三只手抄 agent 帽常量退出公面(BK-4)+ `PLUGIN_HOOK_REASONS` +3(BK-5)+ `CoreValuePorts` 新端口两只(BK-9)· 支持底线 server 7.129.1 / core 7.51.2 不变 · 发版复审两腿修复;§127)。上上版 0.98.0 = **minor**(型面 BREAKING)(清账版 —— 退役账在册过渡臂与同轴孪生整批退役(型面 BREAKING 三组:typeshadow 改名 / 转口、hitl 旧五型三口 → `ApprovalResolution`、text 句表单源的旧句口)· 句表单源(持久规则人话五口 · 卡面三行说明读口 · 崩溃遗留逐行句 · 结局成因一行句表 · `policy` 出身句补半边 · 退出码 137 归因句 · 工具结果卡「未执行」位)· 事件腿组合器 `composeEventLeg`(三腿闭集、拒收 / 绑定 / HITL 分派)· 引擎地址一处真源 · 流式提交同键有界重开 · 抛出物读法单源 · turn 失败呈现与重连预算(第一程)· 重试行人话单源 `retryStatusNotice` · 会话规则收紧 / 撤销闭集 · 接替卡去向 `priorAnswerOutcome` · `LocalSessionRecord.parked` 三值 · 内建子代理名表 `BUILTIN_SUBAGENT_TYPES` · 提货 server 7.129.1 / sdk 23.0.2 / core 7.51.2(peer sdk ^23.0.2)· 支持底线 server 7.129.1(C-R498 ②,收回 7.126–7.128)· 退役账到期九行硬退(C-R498 ①)+ RL-117 / 119 / 142–144 / 164(C-R500:deny 侧扣送与目录省略照删)· 授予绑定三态按载体读(CC-660;技能工具不给整工具「以后别问」)· 发版复审两轮两腿修复;§126)。更早 0.97.1 = **patch**(代理工具清单只投可能有工具应答的名 CC-729 · 本跑声明的 MCP 服务器读口 `engineToolDirectoryOf` 与 run 级 `excludeTools` 判官 CC-730;零型面 BREAKING;§125)。上上版 0.97.0 = **minor**(型面 BREAKING),终端 1.0.149 对接版:支持底线三件同号 server 7.126.0 / core 7.49.5 / sdk 21.1.0、peer sdk >=21.1.0 · sdk 21 提货(团队编排四键退役 / 审批卡词八词闭集 / 终局 detail 四臂 / 提交幂等 409 / allowTools)· 门种常量转口 sdk(ASK_PARK_GATE_KINDS 退役)· 抛出物机读位只认自有数据位、extra 只认内建 Error 类形 · 码认领先于已决 · 总缓存落地三态与 29 读器 unreadable 臂 · 舰队账本 / 审批已结表单源 · 退役 isFsApprovalGate(0.97.0 退出公面)/ isEngineRefusedToolName(0.97.0 退出公面)/ rememberRefused / ReplayPendingBasis.settled / 改名表;§124)。上一版 0.96.0 = **minor**:**minor**,终端 1.0.148 对接版:支持底线三件同号 server 7.125.0 / core 7.48.0 / sdk 20.0.0 · 设置契约 12 提货 · 清账(0.96.0 窗内欠账按票收口)· 单一真源收口(规则工具名判官 / 门种 → 决断腿一张表 / 结局判法 / 总缓存落地写点 / hooks matcher 契约读法 / 文件历史没搬句与收紧闸)· 会话行改名置顶座位动词 · 服务商拒收分类词;peer sdk 地板 >=20.0.0;型面 BREAKING = CoreValuePorts 换一件(−RETIRED_TOOL_NAMES +judgeRuleToolName)· hookMatcher accepted.names 退役 · 根入口删除名(`retiredToolNames`(0.96.0 退出公面)/ `CONFIG_REFUSAL_CODES`(0.96.0 退出公面)/ 23 只过渡口,§2z)· 终局读数带 replay 位 · 舰队行 workspaceSnapshot 只认 failed;§123)。上一版 0.95.0 = **minor**:**minor**,终端 1.0.147 对接版:引擎 7.48 / 服务端 7.124 / 设置契约 11 / sdk 19 提货 · 面板行归约口 · 能力位读器族与终态词表收口 · 审批成因闭集与排空期重开 · 审批卡跨腿持有 · 技能工具表随能力位上 wire · 0.95.0 窗内欠账按票收口;peer sdk 地板 >=19.0.0;型面 BREAKING = 终态词表 / 谓词改名带属主 · absent 退词 · 七条过渡臂退役;§122)。上一版 0.94.0 = **minor**:终端 1.0.146 对接版:引擎 7.45 – 7.47 / 服务端 7.120 – 7.122 / 配置层 10 / sdk 18.1 提货 · 请求装配与审批判定归包 · 到期登记物按预告硬删 · 凭据遮蔽两件 · 附件信封外套标签;peer sdk 地板 >=18.1.0;型面 BREAKING = RX 五处硬删 · absent 退词 · 七条过渡臂退役 · 必填成员增加三处 · 八处闭集增员;§121)。上一版 0.93.1 = **patch**:耐久停驻审批的决断口单一持有者 —— `surfaceFsApprovalAndDecide` 对同一把审批身份键(行会话 + run + `toolCallId ?? boundCallId`)同时只许一次决断在路上,后到者拿同一结局的拷贝 + `joinedInFlight: true`、自己不呈卡不发决断,任一路中止 = 这一只决断被中断(CC-491)· 活卡 respond 回 `202 parking_in_progress` 读成「停驻中、这一发没生效」:结局 `{ decision: 'unresolved', parking }`、判别口既有 `unsettled` 臂新 cause `parking_in_progress`、包替用户上屏一句、不重发不去键不换名(CC-492);`kind` 联合零破坏,`ApprovalUnsettledCause` 闭集 +1 词(对 cause 做 `never` 穷举的写法编译红一次);`FsApprovalOutcome` 四臂 +1 可选位、`ToolApprovalFrameOutcome` +1 可选位;根公面运行期导出 1485 不变、公面类型名 +1;peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.119.0 不动;§120)。上一版 0.93.0 = **minor**:到期登记物硬删八组(型面 BREAKING;根入口 −21 名;CC-431)· device 车道读器扩到车道三位与 `management` 三态字面、新判据 `deviceLaneOpen`(型面 BREAKING;CC-454)· 审批决定口出处键换名:能力位 `approvalDecidedBy` 读器 / 唯一决定函数 `decisionAttributionKeyOf` / 退役键拒绝臂 `retired_key` / 换名恰重发一次(CC-403 并 CC-451 ②)· 能力位 `permissionModes` 读器与 `dontAsk` 按位发词(CC-451 ③)· 终局 `blocked` 的机读成因 `detail` 与会话规则记录读不到句的第十六句(CC-364)· 连接失败现场判读口 `transportFailureScene`(CC-363)· 交出后台的引擎 Bash 登记 `detectEngineBgShellDetach`(CC-331)· 子代 tick 模型位与 `/health` 配置落地读器 `readEngineConfigApplyState` / 漂移判决 `configDriftVerdict`(CC-323)· 引擎装机 core 版本三态口 `coreVersionTier`(CC-355)· 停泊赎回启动失败成因词位 `startupCause`(CC-244)· workflow 子代审批决定口两只 409(CC-430)· MCP 重拨 `unsettled` 判决臂(CC-429)· 联网搜索密钥头值判臂与来源 `host`(CC-428)· 多成因措辞存量两批(CC-120 / 423 / 422)· 活卡帧键镜像 +3(CC-433)· 会话规则可送判定对空对端段名收紧(CC-437)· 场景指派悬空 503 读口(CC-451 ⑤)· 重试覆盖层 429 不再渲成额度耗尽(CC-473)· 展示出口先洗后折(CC-472)· 弃用预告一名三位(CC-309 / 431)· 开发依赖引擎 `~7.44.0` 与生成表(CC-427)· 其余 CC-242 / 301 / 295 / 365 / 374;型面 BREAKING 两处 + 四处联合各 +1 员 + 一名三位弃用预告;根公面 1483 → 1485(+23 −21);测试钩 69 → 71;peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.119.0(老一代 7.106.0 – 7.118.0 十一份)、sdk 17.1.0 作下一代见证位;§119)。上一版 0.92.0 = **minor**:自动答复判定收成一只 `automaticAnswerVerdict`(CC-368)· 卡面披露键两代读 `allowRuleShadow`(CC-401)· steer 档位经包 `steerBodyOf` / `fleet.steerPriority` / `readSteerReceipt`(CC-374 并 CC-353)· 能力位读器读数随代际自动失效(CC-377)· 服务端 7.116.0 / sdk 16.2.0 提货 + `CoreValuePorts` +1 必填(CC-371 / 370)· 会话规则可送判定过规则编译器与协议名段判定(CC-381)· 支持底线抬到 server 7.106.0 / core 7.35.2(CC-352 / 380)· 其余 CC-367 / 369 / 373 / 376 / 379 / 366 / 178 / 295 / 407;型面 BREAKING 四处 + 七名弃用预告;根公面 1429 → 1483(+56 −2);测试钩 68 → 69;服务端夹具现役 7.116.0(老一代 7.106.0 – 7.115.0 八份)、7.117.0 与 sdk 16.3.0 作下一代见证位;§118)。上一版 0.91.0 = **minor**:steer 拒收处置句单源 `steerRefusalAdviceOf` / `ControlSafetyError.advice` · `.status` / `steeringRefusedBeforeEngine`(CC-307)· `abortableSleep` / `isAlreadyResolvedFailure` 上根入口(CC-317)· 引擎闭集表 `ASK_EVIDENCE_ABSENCE_VALUES` / `SYSTEM_INJECTION_PRIORITIES` / `READ_DENY_BUILTIN_TIERS` · `READ_DENY_DEFAULT_TIERS` + `parseReadDenyBuiltinTiers` / `MODE_ARBITRATION` + `askSurvivesStandingAnswer`(0.94.0 退出公面)(CC-318 / 327 / 322 ①)· 会话历史 tool_use 错配一族:`_sema_provider_rejection_resend` 归合成终局行、错配键 `rewindOffered`、`readToolHistoryMismatchKey` / `ToolHistoryMismatchRowKey`、`toolHistoryBadTurnSentence`(CC-303 / 304 / 305 / 309 ②)· 投递账本记录 `by` / `share` 与 `deliveryShareOf` / `droppedKeyCount`、`attempted` 的 `{ generation }` + `undeliveredInGeneration`(`PromptDeliveryLedger` 接口 +3 必有成员 —— 型面 BREAKING 第一处;CC-293 / 334)· 崩溃遗留通告 `crashConvergedNotice` / `crashConvergedNeedsHumanSentence` / `NEEDS_HUMAN_REASON_ORDER`(CC-310)· `permissionsDeclarationReport` + `PERMISSIONS_KEPT_REASONS` 与 `PermissionsDeclarationInput.settingsRead` 必填(型面 BREAKING 第二处;CC-314)· `engineCapsSettled(url, { withinMs })` 返回型窄变 `Promise<'settled' | 'timed_out'>` + `disableSkillsDeclarationSettled`(CC-311)· `hookMatcherVerdict`(CC-306)· `sessionPolicyReadNotice`(CC-328)· `inheritEnvRefusalContent` 首段改口(CC-336)· `attachmentsSubmitVerdict`(CC-337)· 展示出口 YAML 块标量整块一枚记号(CC-340)· `mintUserAttachmentEnvelope` / `encodeHumanTurn` / `deliveredUuidsOf` / `imageVisionOf` + 附件席位能力位读器占位形(CC-315 / 297 子集)· 服务端 7.115.0 / sdk 16.1.0 提货:「只续已有会话」按码优先、`checkpointUnsupportedVersionFromError` / `checkpointUnsupportedVersionContent`、`hookMatcherRefusalFromError`(0.103.0 退出公面)、活卡帧与耐久行 `probeReason`、接线回执 `fleet` 段 + `WiringManifestFleetView`(CC-339)· 登记物整治:`permissionRuleIssueDetail` 第三参分句(CC-359)、`rewindSpecForMode` 第三参按纪元位取舍(CC-345 ①)、HITL 桥两处型面 additive 与补偿表 `retireOn` 改台账行号(CC-343)、已知限制档清账(CC-349)· 开发依赖 settings-schema `^8.0.0`(CC-308,不出包)· 根公面 1397 → 1429(+32,零删名);测试钩 63 → 64;公面类型名 964 → 997;超集键 +2(`_sema_provider_rejection_resend` / `_sema_fleet`);peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.115.0(老一代八份)、sdk 16.1.0 进地板见证矩阵;§117)。上一版 0.90.0 = **minor**:引擎 7.40.1 / 服务端 7.113.0 · 7.114.0 / sdk 16 探针提货(通告码册 86 → 85、`readLegacyModeSeedMigrated` 退出公面、`attachments.planModeReminder` 退役、`PromptDeliveryLedger` +2 必有成员 —— 型面 BREAKING 三处;CC-291 / 300)· 云控制面子路径五名(CC-136)· 文件历史一句五态判定与声明事实账本(CC-294)· hooks matcher 工具别名读口(CC-298)· 机读支持底线与 `engineVersionTier`(CC-299)· `settings.permissions` 三桶装配口与 allow 能力位(CC-302)· 「改了重发」错配让位与错误载体铸口(CC-309 ①)· `AttachmentsSpecRefused`(CC-316)· 能力位读数冻结;根公面 1379 → 1397、peer sdk 地板 `>=12.0.1` 不动;§116。上一版 0.89.0 = **minor**:引擎 7.38 提货(开发依赖换钉引擎 `~7.38.2`;通告码册 81 → 86、引擎铸方表接手服务端自铸码的受众,`SERVER_NOTICE_AUDIENCE` 🔧 退出公面(型面 BREAKING,逐名见 §2z);工具轮不完整读器 `readToolTurnIncomplete`、用户输入没被用上读器 `readUserInputUndrained` 与一句 `userInputUndrainedNotice`(`EngineNoticeFactsCode` +3 员,穷尽分支的端编译期红);终局服务商拒绝详情 `readRunTerminal` 的 `failed.detail` 与「改了重发」判定口 `providerRejectionResend`(0.95.0 退出公面);steer 账本 503 `ledger_unavailable` 一张码表三条腿(`ControlSafetyCode` +1 员、子代 steer 结局联合 +1 臂,穷尽分支的端编译期红);省略成因短语口 `taskRequestOmissionCausePhrase`(0.98.0 退出公面);CC-282);审批四面问类两位 `askClass` / `classes`(三型各 +2 可选位;CC-284);请求键 `disableSkills` 与片段口 `disableSkillsDeclaration`(车道表 45 → 46 行;CC-277);hooks 设置来源条目的唯一执行者与本端跳过口 `settingsHooksKeptLocally`(`PLUGIN_HOOK_REASONS` +5 词、`PLUGIN_HOOK_EXCLUSION_REASONS` +1 词,穷尽分支的端编译期红;CC-287);凭据被拒判官 `isReadCredentialRefusal` 上根入口(CC-289);服务端 7.111.0 两项(接线回执新段 `instructions`、子代转向成功结局 `messageId`;CC-282 余项)与展示出口无标签 `Token <值>` 形照遮(CC-290);根公面 1372 → 1379;测试钩 62 不变;公面类型名 942 → 952;超集键 +1(98 → 99,`_sema_instructions`);peer sdk 地板 `>=12.0.1` 不动;§115)。上一版 0.88.0 = **minor**:展示出口凭据面一次扫描(带凭据的输入上输出字节变、干净文本逐字节同、一轮即不动;CC-247);崩溃收敛 `cause` 认第二个词 `shutdown_before_park`(`CrashConvergedRow.cause` 型联合 +1 词,穷尽分支的端编译期红;CC-218);服务端自铸通告 `server.model_unreachable` 入受众表与事实读器 `readModelUnreachable`(CC-270 ①);开发依赖换钉引擎 `~7.37.1`、放行原因闭集镜像 `GATE_MODE_RELEASE_REASON_WORDS` / `isGateModeReleaseReasonWord`、修复通告事实读器 `readToolTurnRepaired`、通告码册 80 → 81(`EngineNoticeFactsCode` +2 员;CC-272);会话所有者自助记忆抹除 `eraseSessionMemory` / `sessionMemoryEraseOutcome` + 三只闭集镜像(CC-264);registry 同一个 409 的两义判别 `classifyRegistryConflict`(0.95.0 退出公面) / `isScopeGoneError`(0.95.0 退出公面)(CC-280);请求键 `requireExistingSession`(车道表 44 → 45 行)与被拒读口 `requireExistingSessionRefusalFromError` / 一句 `requireExistingSessionRefusalContent`(CC-281);投递事实账本 `createPromptDeliveryLedger` + 两只按消息行的读口 `promptKnownUndelivered` / `withoutUndeliveredPrompts`(判据 = 引擎为这次提交建了 run;CC-271);plan 决断台账:离门证据结掉、还没被认领的登记由投递口认领原笔(CC-278);`wiring_manifest` 帧 `fileHistory` 段(`WiringManifestChromeEvent.fileHistory?` / `WiringManifestView.fileHistory?`,超集键 `_sema_fileHistory`;CC-279);根公面 1356 → 1372;测试钩 62 不变;公面类型名 922 → 942;超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§114)。上一版 0.87.0 = **minor**:会话历史 tool_use 错配的自救出路 —— 合成终局错误行超集键 `_sema_tool_history_mismatch`、`EmitContext.offersRewind?` 声明面出路句与连续次数句、根入口两只纯函数 `classifyToolHistoryMismatch` / `resolveToolHistoryRewindTarget`(CC-268);崩溃收敛 needsHuman 行的闭集因由位 `needsHumanReason`(CC-269);停车 fail-soft 同步终帧与结果帧的真因超集键 `_sema_park_failed_reason`(CC-273);workflow 活动台账 / 监视器源的 `authToken` 收取值函数、连线身份按凭证来源认(CC-274);`armDetachCancel` 入参 `authToken` 收取值函数、取件口每调现读(CC-275);chrome 臂 `suspended_reopened`(`ChromeEvent` +1 臂,穷尽分支的端编译期红;CC-276);根公面 1354 → 1356;测试钩 62 不变;公面类型名 922 不变;超集键 +2;peer sdk 地板 `>=12.0.1` 不动;§113)。上一版 0.86.0 = **minor**:引擎 7.34.0 提货两代读法 —— 事实表第二批构建期生成、`GATE_DENIED_BY_WORDS` 两代并集十一词(元素型 `GateDeniedByWord`,`mode` 专句)、门记录权限模式两臂与读口 `gateModeRelease`、通告码册六码与六只事实读器(`EngineNoticeFactsCode` +6)、`STRUCTURED_DETAIL_TYPES` +`read_unestablished`、本人规则店读不出两代读法、`shell_gate_tighten` 改句(CC-249 / CC-245 / CC-230);服务端 7.105.0 提货 —— 会话规则写口拒名码 `rules.legacy_tool_name` 的具名结局与 `isRulesRefusalCode`(CC-251)、门前只读路 401 的 `unauthorized` 态与 `READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`(CC-252);请求键 `approverPosture` 退役、构造期按名拒,两个运行期名字退出根入口(逐名见 §2z)(CC-253);`AskUnresolvableFactsView.remedy?`(CC-254);开发依赖引擎 `~7.36.0`(CC-255 换钉 7.35.0,`CONFIG_REFUSAL_CODES`(0.96.0 退出公面) 8 → 17;CC-261 再换钉 7.36.0),通告码册 73 → 80;`adapt()` 错误信封不再回落读旧名 `result`(CC-221);服务端 7.106.0 提货 —— caps `store` / `centerWiring` 窄读口、SQL 姿态两代读、计费入口 503 `fleet.lease_unavailable` 读口与一句话(CC-250),`executionLane.isolated` 与「本机无 OS 沙箱」判定(CC-256),请求键 `inheritEnv` 与版本闸片段口、两只拒按码出句(CC-257),权限规则表超帽坏项读口与一句(CC-262),工具声明拒按码认领(CC-263),请求体键形拒两张键表读口(CC-265);`-p` 首帧工具来源超集键 `_sema_tools_source` / `_sema_tools_fallback_reason` 与铸口 `printInitToolFaceSupersetKeys`(CC-266),三张估计工具表改为常驻(CC-267);根公面 1310 → 1354;测试钩 60 → 62;公面类型 891 → 922;超集键 +2;peer sdk 地板 `>=12.0.1` 不动(sdk 12.0.1 / 13.1.0 / 14.0.0 / 15.0.0 下本版 `.d.ts` 严格编译均零错误);§112)。上一版 0.85.2 = **patch**:自愈重开两只失败结局带 `errorCode`(这一次重开放弃所依据的那一发失败请求的外层 wire 码,present-iff;判定形不带),重开判决不成功臂 +`_sema_errorCode`(宿主可选铸;宿主重开口抛错时本包铸)(CC-260);自愈腿读错误对象与成功应答记录上的各位收进保护(读不出按缺席,不再 reject;`atMostOnceFailureClass` / `readSteerDelivery`(🔧 0.92.0 退出公面)/ `readSteerReceiptStatus`(🔧 0.92.0 退出公面)不再抛);根公面 1310 不变;公面类型名不变(两个已导出型各多可选位);超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§111)。上一版 0.85.1 = **patch**:请求装配回执省略成因的终端用户向句表 `TASK_REQUEST_OMISSION_CAUSE_NOTICES` 与取句口 `taskRequestOmissionCauseNotice`(与接入方那只 `taskRequestOmissionCauseDetail` 同源于同一成因闭集、逐词不同句;表外 / 读不出 ⇒ 一句通用句,不抛、不回显),接入方那张句表的字面量补挂 `satisfies`(CC-248);plan-review 重开口在「这个会话没有接能显示卡的界面」那一形上答 `{ reopened: false, _sema_noPresentationSurface: true }`,自愈结局两臂带 `noPresentationSurface`、自愈行五句补一句成因,重开前提(宿主为该会话键订阅问题帧端口)成文(CC-258);自愈腿读宿主重开判决收进保护(某一位读不出按缺席,不再 reject),宿主日志 / 探针口抛错不再改变判决;多会话宿主的按会话呈现回执登记口 `registerArmedGateFromQuestionIdFor` 回到根入口(0.72.0 退出公面的名字复活;CC-259);根公面 1307 → 1310;公面类型名不变(两个已导出型各多可选位);超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§110)。上一版 0.85.0 = **minor**:引擎事实表(通告码册 / 受众表 / MCP 注入丢弃原因 / 会话规则翻译判定内部两表)改为构建期生成,`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 导出的数组(不再冻结),四个思考档 / 权限模式型改为 SDK 型的别名,包内单源(CC-230);子代族八入口与两只行停止门收注入 client,写动词失败结局 +`unconfirmed`,`classifySubagentResumeFailure` 同判(CC-236);`sessionPolicyDeliverable` 收可选名册,`SessionPolicyWithheldWhy` 六词 → 七词(CC-228);过渡物退役登记与到期门,`adapt()` 不再认旧名 `attachedFiles`,三个运行期名字退出根入口(逐名见 §2z),`surfaceRememberNotApplied` 撤回退役预告(CC-221);plan-review 决断台账六口,`reopenPlanReviewCard` 按台账拒开(CC-241);会话后台任务停止口 `stopEngineSessionBackground` 与受据归类口 `engineSessionBackgroundReceiptReadingOf`(CC-246);服务端 7.104.0 会话侧:会话存档读不出三载体读口与人话 `corruptSessionContent`、`session.records_skipped` 进册(`SERVER_NOTICE_AUDIENCE` 🔧 0.89.0 退出公面前的三行)、删会话 409 读口、`/decide` 停驻挪动族读口(CC-217 / CC-243);服务端 7.104.0 能力 / 同步体侧:同步 park 新体与 park 行 `result`、`fileHistoryCaptureMode` 认 `on-optional` 与请求词片段口 `fileHistoryDeclarationField`(0.100.0 退出公面)、公钥发现读口 `projectSealedKeyCapability`、折叠粗码 `isStatusDerivedCoarseCode`(CC-243);同名影子对账门按语义判(CC-222);导出存活门读已提交历史(CC-240);根公面 1275 → 1307;测试钩 59 → 60;公面类型 +34;peer sdk 地板 `>=12.0.1` 不动;§109)。上一版 0.84.1 = **patch**:`<system-reminder>` 开标签定位口 `findSystemReminderOpenTag`(CC-210);detach durable-off 400 纯判定 `isDetachDurableOff400`,`detachDurableOffHint` 对读属性会抛的错误对象改回 `null`(CC-219);服务端自铸通告码进码册与受众表 `SERVER_NOTICE_AUDIENCE`(🔧 0.89.0 退出公面;`instructions.source_changed` 回到用户面)+ 事实读器 `readInstructionsSourceChanged`(CC-213);按码派发的通告事实口 `readEngineNoticeFacts` + 派发表 `ENGINE_NOTICE_FACT_READERS`,`readReadRootGrantNotice` 入参型放宽(CC-214);停泊审批决断 422 `parked_resume.startup_failed` 的读口 / 一句话 / 判定与码优先 `isCodeClassifiedGateFailure`(0.98.0 退出公面;CC-225);拒启会话的窄撤销动词 `removeRefusedSessionRules` 与出路句 `legacyToolNameFailureNoteOf`(0.103.0 退出公面),`CONFIG_REFUSAL_CODES`(0.96.0 退出公面) 七员 → 八员(CC-229);plan-review 编排三口与两只能力探针收注入 client(CC-209);CC 形 `permission_denials` 收入参只被传输层脱敏过的拒绝 + 超集位 `_sema_tool_input_redacted`(CC-235);凭据读法两处放行收口(CC-234);根公面 1260 → 1275;公面类型 +18;peer sdk 地板 `>=12.0.1` 不动;§108)。上一版 0.84.0 = **minor**:peer sdk 地板 `>=11.3.0` → `>=12.0.1`;后台代理登记读数 —— 读口 / 取代判定 / 归类口 / 登记键桥 / 补行谓词,缺席行下半场(CC-194);读目录授权结论通告读口 `readReadRootGrantNotice`(CC-185);接线回执 `hands` 段 `_sema_hands` + 读口 `handsSeamReadingOf` / `handsSeamDetail`,`handsMountedDetail` 坏入参不再抛(CC-206);陈旧逻辑清扫(CC-223):退役键 `rewind.rewindFiles` 构造期拒收、`WorkflowRunState.agentCount` 改可选、26 个内部件退出根入口、九张公面判定表换只读 Set 子类、十五张判定数组冻结、`resume_at` 文本兼容腿退役;根公面 1278 → 1260;公面类型 +10;§107)。上一版 0.83.6 = **patch**:会话规则记录的无损判定 `sessionPolicyDeliverable` 把引擎会在准备阶段拒启的两类名字(引擎退役名、含 `__` 而不以协议前缀开头的名字)改判「不写」,成因词 `legacy_tool_name`(闭集 5 → 6),引擎说「改名为 X」的退役名带 `currentName` 出路位;`peer_wide` 那句改措辞(判决不变)(CC-226);根公面 1278 不变;peer sdk 地板 `>=11.3.0` 不动;§106)。上一版 0.83.5 = **patch**:展示层出口 `displayUntrusted` 的连接符 ZWJ / ZWNJ 按语境判(🔴 默认形输出字节变)、两只可选开关 `escapeBackslashes` / `blanks` 与标记位置读口 `displayUntrustedMarks`(CC-204);凭据两网的判别视图认孤代理项,机读字节 `errors[]` / 合成终局行同批(CC-207);转义记号在凭据再扫里原子与四处凭据读法存量修复(相对 0.83.4 零新增外泄);hooks 启动模式可选词读口 `SettingsPort.hooksStartupMode()`,安全 / bare 模式下设置来源只发 managed(CC-200),设置来源里同一条 hook 只发一份(CC-208);自愈三条重发结局 +1 可选位 `releaseConfirmedByEngine`、行句按释放证据分说(CC-212);活段接入指引订正;公面类型 +3;peer sdk 地板 `>=11.3.0` 不动;根公面 1278;§105)。上一版 0.83.4 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`(0.94.0 退出公面),三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf`(0.98.0 已退役)上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 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 八条)|
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.112.1**(本批发布版 = **patch**:计划审阅的批准恒带卡上的门身份 · 结局成因五词 `PlanReviewOutcomeCause` 与一张配对表 · 坏行出路句改口 · 桥上原始动词的批准 / 改写必带门身份(PA;§142;`cause` 值域一词 → 五词,对当单值或做穷尽判断的消费者编译红一次);公面运行期 2422 不变。上一 minor **0.112.0**(本批发布版 = **minor**(型面 BREAKING)—— 本地配置共用内核(LC)与其上三域归包:MCP 服务器配置(MC2)· 技能(SK2)· 模型池与档位(MP / MX);三域座位出站形一形(LCO:列表动词答视图或 `{ kind: 'unavailable', cause }`、写动词答 `{ receipt, … }`)· 模型配置缺席项归因句(MG)· 服务端 7.149.0 + 类型包 38.1.0 + 设置契约 25.1.0 提货(S7149 / SS25)· 本机引擎凭据的归属证明时刻判官与工厂(AO)· 控制台 CA 钉的判定与规范化(CA)· 店持久性单读口、引擎不可用行的应答位收探活判决(OR;`readEngineHealthStore` 退出公面)· 安全停判官名字读法收窄(IH)· 本地写 allow 规则改问兑付判官(LA2);公面 2330 → 2422(+93 −1)。上一 minor **0.111.0**(本批发布版 = **minor**(型面 BREAKING):37 车并入 —— 中文消息目录改住子路径 `./i18n/zh`、`ZH_MESSAGES` 从根入口退役、改住子路径(EX)· 服务端 7.148.0 + 类型包 38.0.0 换钉(S7148;hooks 拒定位 `field` 坐标、store 姿态两代读)· 停驻行卡 `parkRow.taskId` 退役(CP)· 改指证据改 `continuity` 地址对 + 列表口工厂形(RP2 / RP3)· 会话成本读口族(CO)· 决断卡三事实读口 + 换代两拍判官(SQ)· 座位契约 Quick Entry / hooks 名册 / 会话 hooks 名册状态收窄(QE / HR / RF)· 附件路由判官(AR)· 人拒说明位(RN)· 子代理模型词(AM)· 「不再询问」本地落规则兑付(LA)· 计划审阅卡证据代 `evidenceRevision`(EG)· 中文开头句平话回正(MP)· hooks env 名集派发前重算(HE)· 发版前内部检查门;公面 2235 → 2330(+96 −1);发版复审两腿一轮 + 修复腿 F1–F19 已并。上一 minor **0.110.0**(本批发布版 = **minor**(型面 BREAKING):类型包 35 → 37 换钉八处(PK;`checkpoint.invalid_outcome` 读 `row_integrity`、`probeEngineAlive` 去第二参)· 服务端 7.147.0 换钉 + 执行车道词 `none` + 续跑存量体读不出面派句 `unreadRequestMembersFromError`(SP)· workflow 轮询兜底读面原体口 `installWorkflowRunReader` 替 `installWorkflowStatusProbe`(0.110.0 退出公面,见退役名录)(WF)· 会话箱三载体 + `inbox_notice` lane + 臂 `session_box_notice`(SB)· 审批卡入参来源位 `inputSource`(IS)· 读流器耗尽按因读口(RE)· sdk peer 地板 23.1.0 → 25.0.0(SF)· hooks 治理关腿本端也不跑(HC)· 请求体 hooks 只带引擎属主事件(EO)· 出路句按腿分句(FW)· 输入作者词 + runOrigin 唯一读口(AU)· 停驻卡宿主口 `withdrawParkQuestion`(PW)· 展示出口凭据面粘连形(SA)· 清账二十余项。上一 minor **0.109.0**(本批发布版 = **minor**(型面 BREAKING):停驻行三态归属判官 `pendingRowOwnershipOf`(PO)· 宿主设置采纳闸已读载体 `absent` 与有意清空同读(HS2)· 呈卡帧拒因读口 `approvalRequestFrameReadingOf`(FR)· 显示安全三票(DS)· 座位会话行停驻位 `parkedUnresumable`(PU)· 换钉到引擎 7.66.0(含 7.65.0;通告码册 118 → 119;CP)· 本机引擎判官 / 占用读数 / 问询卡 / 退出去向 + 注入面 / 设置层播种 / 起服拒因 + 收尾梯 / 状态机 / 座位生命周期读数(CC-1173 首波;ES / EE / ESB;🔴 型面 BREAKING)· 自动作答不以卡上入参为放行依据(AN;🔴 型面 BREAKING)· 服务端 7.146.0 / 7.147.0 预提货(SP)· 座位 lane 子代别名 `subagent_alias`(SE)· 耐久审批门出句口 + 受众 user 十二码事实读口(NC)· Bash 被掐家族带部分输出的投影(BT)· 外来体读器 `in` 读点四态(AB)· 呈卡族消卡帧两族同判(CF)· 停驻卡回落形披露 + 问卡取用序(PG)· 只以段末帧到达的块进活流转录(LT)· 活卡入口 `approvalId` 只读一次(ID)· 决断面句口根导出 `decideFailureNote` / `decisionAnswerInvalidContent` + 标签洗口凭据网 + m1 真红六件(MF)· §137 两处接入方打回勘误(ERd))。上一 minor **0.108.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.64.0(CT;契约 8 不变;通告码册 117 → 118 · 拒句通告出处三态 · 缺省模型可解析合成判官 `catalogDefaultModelVerdict` + 值级端口第二十五件 `modelFaceResolvable`)· 设置契约 17.2.0 / 18.0.0(SS / SS2;MCP 声明保留成员名表、云控制面 A2A 对端名读数)· hooks 投影剥服务端读者不读的键 + 手写 `source` 不过境(HK;安全修复)· 模型受理判官按服务端 `aliases[]`(MA)· 座位动作通道 `onSeatAction` / `claimSeatActions` / 能力位 `seatActions`(SA)+ 座位资源动词按会话答与新会话车道意图位(LN)· 审批卡「谁问的」两位 + cc-import 结局词 `refused`(AR)· 停驻出路句改口 / 到期位三态 / 挡卡半句读口(RP / WO)· 通知受理判官 + 带完成身份不合批(NB)· 五只闭集各补一词(CS)· 续跑拒码五枚入表(RC)· 终端小票四批(SB / SC / SD:策略拒首句 `policyCause` · 主版本 0 三态 · 无头续收传输错重连 · 通告认审批反馈行 · 宿主回调口异常不外溢 · 老引擎 / 老服务端旧码回读〔`RememberRefusalCode` 多回一员〕· 带戳存档句按场景 · `modelPlaneSentence`)。上一 minor **0.107.0**(本批发布版 = **minor**(型面 BREAKING):换钉到服务端 7.145.0 / 类型包 35.0.0 / 设置契约 17.1.0(SX;规则导入兑付读口改吃整只 200 体)· 引擎 7.63.0(CT;契约 8 不变)· 展示出口 `escapeBackslashes` 第三档 `auto` + `exact` 回读 + 正文档空白一档、`blanks` 取值 `fillers` 退出型面(DM)· 旧码 `context.image_removed` 回册(IR)· 呈卡腿看判决 / 盲卡新名 / `none` 两词 / `task <id>` 标签(HF)· 订正小节 + `isSecretKeyName` 导出 + 带戳存档句口(XZ)· 计划结局载体唯一铸点 + `checkpointQueueRowSortOf` 导出 + steer 回执 messageId 与 undrained 对账判词(RC)。上一 minor **0.106.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.61.0 / 7.62.0(内核契约 6 → 7 → 8;CR / CS)· 服务端 7.142.0 / 7.143.0 / 7.144.0 与类型包 32 / 33 / 34、设置契约 16 / 17(PK / SV / SK / SJ / SW;决断体两位必带、`assistant.resume` 三参、`HitlClientLike` 切片收窄 型面 BREAKING)· 🔴 支持底线抬到服务端 7.139.0 / 引擎 7.60.0(SR)· 审批席判官 `approvalSeatOf`(AS)· 断线重放 / 起服接管审批不再当「不是强制的」(RF)· 流帽早帽退避(SC)· 座位能力位 `computerUseSwitch` / `engineModeDefaultOnly`(CU / LN)· 会话所在引擎 + 执行车道一等抽象 `sessionEngineBindingFor` / `commitSessionEngine` / `sessionDispatchTarget`(LN)· 消卡 / 会话标题两帧投影臂(AT)· v1 卡本会话放行走审批应答口 + 计划审阅批准必须附卡(HD;`DecidePlanReviewOptions.parkedResult` 删 型面 BREAKING)· 激活卡授权段点名(BG)· 计划审阅结局载体不 steer 进在跑的 run(PR)· 探活判官两格 + 导入档 `isCurrent` + auth 原话(PB)· 模型面读口 `modelPlaneOf`(SK);公面 2076(+44 −4))。上一 minor **0.105.0**(本批发布版 = **minor**(型面 BREAKING):换钉到服务端 7.140.0 / 7.141.0 与类型包 31.0.0(引擎 / 内核 7.60.0 · 配置契约 ^15.1.0 不跟;§134 PK-1)· 决断正文载体档 `DISPLAY_DECISION_BODY`(DB-1)· 「这块屏不再跟着 run X」一只形 `RunNotFollowed` + 零预算 `REATTACH_BUDGET_NONE`(RF;按次策略口型面 BREAKING)· 计划审阅卡一份卡事实 + 账本入口 + 重开按事实出选项(PC-1 – PC-12;撤档 / 作答判官三分 / 已呈档位 `withheld` 型面 BREAKING)· 引擎换代收尾决策表终形 `window-exhausted`(EG;`waits` 取代 `awaitedNextEngine` 型面 BREAKING)· 任务通知渲染去重改读服务端完成 id(RL-36 / 38 / 39 退役处置)· 值级端口第二十二件 `IMPORTED_SETTINGS_LAYERS`(ISL;`CoreValuePorts` 必填成员 +1 型面 BREAKING)· 在飞 run 切权限档动词 + 回执投影 `setRunPermissionMode`(PM-1 – PM-4)· 服务端 7.140 / 7.141 件:设置层条目带出处层 / MCP 传输种类能力位与投影期过滤(闭集变宽 型面 BREAKING)/ 记忆同步停驻读数 / 抹除拒档 / workflow 完成诊断 / 子代「未执行」卡 / 权限模式写能力位 / 引擎租约窗(PK-2 – PK-12);公面 2036(+22)· 0.104.1 patch 注记:悬挂审批呈卡族帧形并收(§133 AR)与后台任务表读句尾巴(§133 BT)随本版带)。上一 minor **0.104.0**(本批发布版 = **minor**(型面 BREAKING):换钉到引擎 7.60.0(引擎 / 内核 7.60.0 · 类型包 30.0.0 · 配置契约 15.1.0;生成表重生成)· MCP 失败类多一词 `host_refused` · 状态帧座位位 `seat` · 值级端口第二十一件 `ruleNameCovers`(名册一步覆盖读法)· 停驻终局结果帧恒走错误臂 / `-p` 出路句只在 `errors[0]`(§132 RA-1 / RA-2)· 权限三桶来源表组内序按写序(PO-1)· 停驻 / 活卡审批卡工具入参真源 = 记录侧那一份 + `argsRewritten`(AK-1 / AK-2,同一只读器)· 钩子车道类依据改读引擎真批准位门类集(HK-2)· 服务端 7.139.0 提货:换绑前态改读执行放置读面(SV-2)· 会话行条件写 `rowTag` / `expectedRowTag`(SV-1)· 换绑 409 子代形(SV-3)· 后台行子会话 id(SV-4)· 宿主设置源三处成文(HS-2a / HS-2b / XA-7a);型面 BREAKING:`CoreValuePorts` 必填成员 +1(`ruleNameCovers`)· `MCP_FAILURE_KINDS` 闭集变宽 · `DeviceSessionBindingOutcome` 臂集变(+`unbound` / `unsupported`,−`lane-absent`;读面切片换 `client.sessions`)· `DeviceBinding` / `DeviceSessionBinding` 不再转出、`boundAt` 退役 · 孤儿型 `ManagedPolicyReading` 退出根入口(RL-290)· RL-310 / 311 / 313 随类型包到货退役;公面 2010 → 2014(+`BRAIN_STATUS_SEATS` / `ruleNameCovers` / `sessionRowTagOf` / `sessionRowPatchRefusalOf`);依赖钉 core `^7.60.0` / mods-kernel `7.60.0` / sdk `^30.0.0` / settings-schema `^15.1.0`;peer sdk `>=23.1.0` / mods-kernel `>=7.54.0`(可选);读点逐端见 §132;§132)。上一版 0.103.0 = **minor**(型面 BREAKING)(一次重锚到引擎 7.59.0(引擎 / 内核 7.59.0 · 类型包 28.0.0 · 配置契约 14.8.0;生成表重生成)· MCP 授权失败记录一只读口四处过境 · 两只新通知事实读器 · 状态帧等待两位 · 工具结果行改参记录与改参句 · 服务器名 `remote-` 前缀律 · 决断拒收「行完整性」只认正证据 · 抹除证明 v2 · 整工具规则候选 · 服务端 7.137.0 随附件(§131 PK-10)· 结果帧成功臂不再带 `errors[]`(§131 LG-1)· 换钉当拍重钉(v1 卡读引擎卡词 `approvalCard`;姿态来源词表五词 +`lane`)· 六只派生窄视图退役;型面 BREAKING:请求键 `promptProfile` 换布尔 `promptLean`(RL-300)· 六导出退役(RL-179 / 192–196,公面 2016 → 2010)· `POSTURE_SOURCE_WORDS` 四 → 五词 · 成功臂 `errors[]` 删;依赖钉 core `^7.59.0` / mods-kernel `7.59.0` / sdk `^28.0.0` / settings-schema `^14.8.0`;peer sdk `>=23.1.0` / mods-kernel `>=7.54.0`(可选);读点逐端见 §131;§131)。上一版 0.102.0 = **minor**(型面 BREAKING(窄))(会话送后台四读口归包(能力位读数 · 连线句柄与本包亲手开流 · 交接资格一只判官 · 交接动词与后台观看)· 会话级思考开关归包(状态机 + `reasoningEffort` 单铸点投影 + 座位动词 / 能力位 / 会话行位)· mods 三类用户面座位(注册卡 / 行旁拒句 / 行旁代答句)+ 桌面装载座位的读口与句口 · 会话映射的引擎命名空间键含规范化路径(经中继的多台引擎不再串键)· 配置地址展示口两读法按位置对应取舍(单斜杠 / 零斜杠写法不再把口令显示成路径;修复轮三)· 出包文案卫生;型面 BREAKING(窄):`fireInteractiveInterrupt(runs, taskId, opts)` 新可选位 `wire` 与新臂 `{ kind: 'withheld' }`;依赖钉不动(core `^7.55.0` / sdk `^24.0.0` / settings-schema `^14.4.0`;peer sdk `>=23.1.0`,支持底线不动);读点逐端见 §130;§130)。上一版 0.101.0 = **minor**(型面 BREAKING)(提货引擎 7.54.0(开发依赖 W1 换钉 `^7.54.0` 与生成表重生成,后续 mods 内核车换钉 core `^7.55.0` / mods-kernel 7.55.0 同号,sdk `^24.0.0` / settings-schema `^14.4.0`;peer sdk `>=23.1.0` 与支持底线 server 7.129.1 / core 7.51.2 / sdk 23.1.0 不动)+ 清账三波(主题波 B-U / B-X / B-D 与 W 车)+ 发版修复轮十六车(修到干净)· MCP 服务器名独立判口 · 引擎名册按对端分组投影 · 收紧桶对端段 `*` 原样 · 值级端口第 19 / 20 件(`ANTHROPIC_DEFAULT_BASE_URL` / `readToolFaces`)· 宿主设置源 `HostSettingsSource` 四件 · 提交身份与请求车道唯一派生 `requestLaneOf` · HITL 决断失败一只直交读口与安全停一位 · 型面 BREAKING:`AllowDenyPolicyOptionsView.scope` 退出 / `SettingsPort` 退役(RL-252)/ `engineAcceptsCatalogDefault` 退出读数型(RL-183)/ `CoreValuePorts` 必填成员 +2 / `HooksWirePlan.httpPolicyDrops` 必填 / 决断拒收分码第五词 `grant_changed` / `-p` 车道 resolver 改收值(读点逐端见 §129y);§129)。上一版 0.100.0 = **minor**(型面 BREAKING)(提货版 + 清账三程 —— 提货 server 7.132.0 / core 7.53.0 / settings-schema 14.1.0 / sdk 24.0.0(peer sdk `>=23.1.0`;支持底线 server 7.129.1 / core 7.51.2 / sdk 23.1.0 不动)· 接线回执第十四段 `mods[]` / 提示词装配清单 v3 / 压缩开始帧 → `system/status` compacting · prepare 拒启码表 + 帽与 hooks 拒读口(`budget_exceeded`)+ 沙箱码臂 · 工具目录第四态 `request_only` · 本地会话 API +2 动词 · 请求面 MCP 条目判官同设置契约 14.1.0(名字 / 传输 / 身份头单判官,逐条披露 `projectMcpConfigs().dropped`)· 任务进度 `seq` 代际 + 子代身份单源 · 展示出口字节边界与主机区域 · 凭据键路径 / 工具旗名 / 注入车道告知 · 型面 BREAKING:`compaction_started` chrome 臂 / `MCP_CAPS` `SKILL_CAPS` 退出公面 / RL-153 `continuesPark` 硬退 / RL-156 `EventLegPorts.perStream` / RL-172 `scenarioAssignmentUnknownFromError`(0.100.0 退出公面,已退役;读点逐端见 §128y);§128)。上一版 0.99.0 = **minor**(型面 BREAKING)(提货版 + 清账二程 —— 提货 server 7.131.0 / sdk 23.1.0 / settings-schema 13.0.1 / core 7.52.0(peer sdk `>=23.1.0`)· 请求层附件席位 `userAttachments`(四态读器 + 装配只发整文件完整文本条目)· MCP 面板判别联合(`servers` 臂 / `scenarioRefusal` 拒因臂,BK-1)· `userInvokedSkills` 槽位 · `allowTools: []` 原样上体 · 审批卡口单路径(`claimApprovalCard` 中止安全登记 + 进程级已结表 + `approvalFrameContextOf`,两族去重归包)· 会话规则逐条扣留(`sessionPolicyDeliverable` 改读引擎 `readRuleEntry`)· 凭据面百分号解码视图 · 不可信标量清洗口 `cleanUntrustedScalar` · 问类规范序筛 · hooks 预检构建期抄本 + 设置文件坏形判官 · 首 token 存活探针合一(`modelCapabilityProbe` / `PROBE_VERDICTS`)· `-p` 车道重试 / 模型服务状态帧(`system/api_retry` + 超集帧 `_sema_model_status`)与合成 API 错误行三只机读位 · 文案单源五批进消息目录 + 路由缺口句 / 人答臂 / 宿主队列三值句口 · 能力缓存变更订阅 / 嵌套位读口 / 作废重探 · 抛出物读法收口与「找不到」三形 · 会话 id 规范口 · 设备面 / 引擎目标席位与座位只读动词 `readSessionMcpPanel` · 退役账到期硬退 RL-151 `STOP_CONFLICT_CODES` + 三只手抄 agent 帽常量退出公面(BK-4)+ `PLUGIN_HOOK_REASONS` +3(BK-5)+ `CoreValuePorts` 新端口两只(BK-9)· 支持底线 server 7.129.1 / core 7.51.2 不变 · 发版复审两腿修复;§127)。上上版 0.98.0 = **minor**(型面 BREAKING)(清账版 —— 退役账在册过渡臂与同轴孪生整批退役(型面 BREAKING 三组:typeshadow 改名 / 转口、hitl 旧五型三口 → `ApprovalResolution`、text 句表单源的旧句口)· 句表单源(持久规则人话五口 · 卡面三行说明读口 · 崩溃遗留逐行句 · 结局成因一行句表 · `policy` 出身句补半边 · 退出码 137 归因句 · 工具结果卡「未执行」位)· 事件腿组合器 `composeEventLeg`(三腿闭集、拒收 / 绑定 / HITL 分派)· 引擎地址一处真源 · 流式提交同键有界重开 · 抛出物读法单源 · turn 失败呈现与重连预算(第一程)· 重试行人话单源 `retryStatusNotice` · 会话规则收紧 / 撤销闭集 · 接替卡去向 `priorAnswerOutcome` · `LocalSessionRecord.parked` 三值 · 内建子代理名表 `BUILTIN_SUBAGENT_TYPES` · 提货 server 7.129.1 / sdk 23.0.2 / core 7.51.2(peer sdk ^23.0.2)· 支持底线 server 7.129.1(C-R498 ②,收回 7.126–7.128)· 退役账到期九行硬退(C-R498 ①)+ RL-117 / 119 / 142–144 / 164(C-R500:deny 侧扣送与目录省略照删)· 授予绑定三态按载体读(CC-660;技能工具不给整工具「以后别问」)· 发版复审两轮两腿修复;§126)。更早 0.97.1 = **patch**(代理工具清单只投可能有工具应答的名 CC-729 · 本跑声明的 MCP 服务器读口 `engineToolDirectoryOf` 与 run 级 `excludeTools` 判官 CC-730;零型面 BREAKING;§125)。上上版 0.97.0 = **minor**(型面 BREAKING),终端 1.0.149 对接版:支持底线三件同号 server 7.126.0 / core 7.49.5 / sdk 21.1.0、peer sdk >=21.1.0 · sdk 21 提货(团队编排四键退役 / 审批卡词八词闭集 / 终局 detail 四臂 / 提交幂等 409 / allowTools)· 门种常量转口 sdk(ASK_PARK_GATE_KINDS 退役)· 抛出物机读位只认自有数据位、extra 只认内建 Error 类形 · 码认领先于已决 · 总缓存落地三态与 29 读器 unreadable 臂 · 舰队账本 / 审批已结表单源 · 退役 isFsApprovalGate(0.97.0 退出公面)/ isEngineRefusedToolName(0.97.0 退出公面)/ rememberRefused / ReplayPendingBasis.settled / 改名表;§124)。上一版 0.96.0 = **minor**:**minor**,终端 1.0.148 对接版:支持底线三件同号 server 7.125.0 / core 7.48.0 / sdk 20.0.0 · 设置契约 12 提货 · 清账(0.96.0 窗内欠账按票收口)· 单一真源收口(规则工具名判官 / 门种 → 决断腿一张表 / 结局判法 / 总缓存落地写点 / hooks matcher 契约读法 / 文件历史没搬句与收紧闸)· 会话行改名置顶座位动词 · 服务商拒收分类词;peer sdk 地板 >=20.0.0;型面 BREAKING = CoreValuePorts 换一件(−RETIRED_TOOL_NAMES +judgeRuleToolName)· hookMatcher accepted.names 退役 · 根入口删除名(`retiredToolNames`(0.96.0 退出公面)/ `CONFIG_REFUSAL_CODES`(0.96.0 退出公面)/ 23 只过渡口,§2z)· 终局读数带 replay 位 · 舰队行 workspaceSnapshot 只认 failed;§123)。上一版 0.95.0 = **minor**:**minor**,终端 1.0.147 对接版:引擎 7.48 / 服务端 7.124 / 设置契约 11 / sdk 19 提货 · 面板行归约口 · 能力位读器族与终态词表收口 · 审批成因闭集与排空期重开 · 审批卡跨腿持有 · 技能工具表随能力位上 wire · 0.95.0 窗内欠账按票收口;peer sdk 地板 >=19.0.0;型面 BREAKING = 终态词表 / 谓词改名带属主 · absent 退词 · 七条过渡臂退役;§122)。上一版 0.94.0 = **minor**:终端 1.0.146 对接版:引擎 7.45 – 7.47 / 服务端 7.120 – 7.122 / 配置层 10 / sdk 18.1 提货 · 请求装配与审批判定归包 · 到期登记物按预告硬删 · 凭据遮蔽两件 · 附件信封外套标签;peer sdk 地板 >=18.1.0;型面 BREAKING = RX 五处硬删 · absent 退词 · 七条过渡臂退役 · 必填成员增加三处 · 八处闭集增员;§121)。上一版 0.93.1 = **patch**:耐久停驻审批的决断口单一持有者 —— `surfaceFsApprovalAndDecide` 对同一把审批身份键(行会话 + run + `toolCallId ?? boundCallId`)同时只许一次决断在路上,后到者拿同一结局的拷贝 + `joinedInFlight: true`、自己不呈卡不发决断,任一路中止 = 这一只决断被中断(CC-491)· 活卡 respond 回 `202 parking_in_progress` 读成「停驻中、这一发没生效」:结局 `{ decision: 'unresolved', parking }`、判别口既有 `unsettled` 臂新 cause `parking_in_progress`、包替用户上屏一句、不重发不去键不换名(CC-492);`kind` 联合零破坏,`ApprovalUnsettledCause` 闭集 +1 词(对 cause 做 `never` 穷举的写法编译红一次);`FsApprovalOutcome` 四臂 +1 可选位、`ToolApprovalFrameOutcome` +1 可选位;根公面运行期导出 1485 不变、公面类型名 +1;peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.119.0 不动;§120)。上一版 0.93.0 = **minor**:到期登记物硬删八组(型面 BREAKING;根入口 −21 名;CC-431)· device 车道读器扩到车道三位与 `management` 三态字面、新判据 `deviceLaneOpen`(型面 BREAKING;CC-454)· 审批决定口出处键换名:能力位 `approvalDecidedBy` 读器 / 唯一决定函数 `decisionAttributionKeyOf` / 退役键拒绝臂 `retired_key` / 换名恰重发一次(CC-403 并 CC-451 ②)· 能力位 `permissionModes` 读器与 `dontAsk` 按位发词(CC-451 ③)· 终局 `blocked` 的机读成因 `detail` 与会话规则记录读不到句的第十六句(CC-364)· 连接失败现场判读口 `transportFailureScene`(CC-363)· 交出后台的引擎 Bash 登记 `detectEngineBgShellDetach`(CC-331)· 子代 tick 模型位与 `/health` 配置落地读器 `readEngineConfigApplyState` / 漂移判决 `configDriftVerdict`(CC-323)· 引擎装机 core 版本三态口 `coreVersionTier`(CC-355)· 停泊赎回启动失败成因词位 `startupCause`(CC-244)· workflow 子代审批决定口两只 409(CC-430)· MCP 重拨 `unsettled` 判决臂(CC-429)· 联网搜索密钥头值判臂与来源 `host`(CC-428)· 多成因措辞存量两批(CC-120 / 423 / 422)· 活卡帧键镜像 +3(CC-433)· 会话规则可送判定对空对端段名收紧(CC-437)· 场景指派悬空 503 读口(CC-451 ⑤)· 重试覆盖层 429 不再渲成额度耗尽(CC-473)· 展示出口先洗后折(CC-472)· 弃用预告一名三位(CC-309 / 431)· 开发依赖引擎 `~7.44.0` 与生成表(CC-427)· 其余 CC-242 / 301 / 295 / 365 / 374;型面 BREAKING 两处 + 四处联合各 +1 员 + 一名三位弃用预告;根公面 1483 → 1485(+23 −21);测试钩 69 → 71;peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.119.0(老一代 7.106.0 – 7.118.0 十一份)、sdk 17.1.0 作下一代见证位;§119)。上一版 0.92.0 = **minor**:自动答复判定收成一只 `automaticAnswerVerdict`(CC-368)· 卡面披露键两代读 `allowRuleShadow`(CC-401)· steer 档位经包 `steerBodyOf` / `fleet.steerPriority` / `readSteerReceipt`(CC-374 并 CC-353)· 能力位读器读数随代际自动失效(CC-377)· 服务端 7.116.0 / sdk 16.2.0 提货 + `CoreValuePorts` +1 必填(CC-371 / 370)· 会话规则可送判定过规则编译器与协议名段判定(CC-381)· 支持底线抬到 server 7.106.0 / core 7.35.2(CC-352 / 380)· 其余 CC-367 / 369 / 373 / 376 / 379 / 366 / 178 / 295 / 407;型面 BREAKING 四处 + 七名弃用预告;根公面 1429 → 1483(+56 −2);测试钩 68 → 69;服务端夹具现役 7.116.0(老一代 7.106.0 – 7.115.0 八份)、7.117.0 与 sdk 16.3.0 作下一代见证位;§118)。上一版 0.91.0 = **minor**:steer 拒收处置句单源 `steerRefusalAdviceOf` / `ControlSafetyError.advice` · `.status` / `steeringRefusedBeforeEngine`(CC-307)· `abortableSleep` / `isAlreadyResolvedFailure` 上根入口(CC-317)· 引擎闭集表 `ASK_EVIDENCE_ABSENCE_VALUES` / `SYSTEM_INJECTION_PRIORITIES` / `READ_DENY_BUILTIN_TIERS` · `READ_DENY_DEFAULT_TIERS` + `parseReadDenyBuiltinTiers` / `MODE_ARBITRATION` + `askSurvivesStandingAnswer`(0.94.0 退出公面)(CC-318 / 327 / 322 ①)· 会话历史 tool_use 错配一族:`_sema_provider_rejection_resend` 归合成终局行、错配键 `rewindOffered`、`readToolHistoryMismatchKey` / `ToolHistoryMismatchRowKey`、`toolHistoryBadTurnSentence`(CC-303 / 304 / 305 / 309 ②)· 投递账本记录 `by` / `share` 与 `deliveryShareOf` / `droppedKeyCount`、`attempted` 的 `{ generation }` + `undeliveredInGeneration`(`PromptDeliveryLedger` 接口 +3 必有成员 —— 型面 BREAKING 第一处;CC-293 / 334)· 崩溃遗留通告 `crashConvergedNotice` / `crashConvergedNeedsHumanSentence` / `NEEDS_HUMAN_REASON_ORDER`(CC-310)· `permissionsDeclarationReport` + `PERMISSIONS_KEPT_REASONS` 与 `PermissionsDeclarationInput.settingsRead` 必填(型面 BREAKING 第二处;CC-314)· `engineCapsSettled(url, { withinMs })` 返回型窄变 `Promise<'settled' | 'timed_out'>` + `disableSkillsDeclarationSettled`(CC-311)· `hookMatcherVerdict`(CC-306)· `sessionPolicyReadNotice`(CC-328)· `inheritEnvRefusalContent` 首段改口(CC-336)· `attachmentsSubmitVerdict`(CC-337)· 展示出口 YAML 块标量整块一枚记号(CC-340)· `mintUserAttachmentEnvelope` / `encodeHumanTurn` / `deliveredUuidsOf` / `imageVisionOf` + 附件席位能力位读器占位形(CC-315 / 297 子集)· 服务端 7.115.0 / sdk 16.1.0 提货:「只续已有会话」按码优先、`checkpointUnsupportedVersionFromError` / `checkpointUnsupportedVersionContent`、`hookMatcherRefusalFromError`(0.103.0 退出公面)、活卡帧与耐久行 `probeReason`、接线回执 `fleet` 段 + `WiringManifestFleetView`(CC-339)· 登记物整治:`permissionRuleIssueDetail` 第三参分句(CC-359)、`rewindSpecForMode` 第三参按纪元位取舍(CC-345 ①)、HITL 桥两处型面 additive 与补偿表 `retireOn` 改台账行号(CC-343)、已知限制档清账(CC-349)· 开发依赖 settings-schema `^8.0.0`(CC-308,不出包)· 根公面 1397 → 1429(+32,零删名);测试钩 63 → 64;公面类型名 964 → 997;超集键 +2(`_sema_provider_rejection_resend` / `_sema_fleet`);peer sdk 地板 `>=12.0.1` 不动;服务端夹具现役 7.115.0(老一代八份)、sdk 16.1.0 进地板见证矩阵;§117)。上一版 0.90.0 = **minor**:引擎 7.40.1 / 服务端 7.113.0 · 7.114.0 / sdk 16 探针提货(通告码册 86 → 85、`readLegacyModeSeedMigrated` 退出公面、`attachments.planModeReminder` 退役、`PromptDeliveryLedger` +2 必有成员 —— 型面 BREAKING 三处;CC-291 / 300)· 云控制面子路径五名(CC-136)· 文件历史一句五态判定与声明事实账本(CC-294)· hooks matcher 工具别名读口(CC-298)· 机读支持底线与 `engineVersionTier`(CC-299)· `settings.permissions` 三桶装配口与 allow 能力位(CC-302)· 「改了重发」错配让位与错误载体铸口(CC-309 ①)· `AttachmentsSpecRefused`(CC-316)· 能力位读数冻结;根公面 1379 → 1397、peer sdk 地板 `>=12.0.1` 不动;§116。上一版 0.89.0 = **minor**:引擎 7.38 提货(开发依赖换钉引擎 `~7.38.2`;通告码册 81 → 86、引擎铸方表接手服务端自铸码的受众,`SERVER_NOTICE_AUDIENCE` 🔧 退出公面(型面 BREAKING,逐名见 §2z);工具轮不完整读器 `readToolTurnIncomplete`、用户输入没被用上读器 `readUserInputUndrained` 与一句 `userInputUndrainedNotice`(`EngineNoticeFactsCode` +3 员,穷尽分支的端编译期红);终局服务商拒绝详情 `readRunTerminal` 的 `failed.detail` 与「改了重发」判定口 `providerRejectionResend`(0.95.0 退出公面);steer 账本 503 `ledger_unavailable` 一张码表三条腿(`ControlSafetyCode` +1 员、子代 steer 结局联合 +1 臂,穷尽分支的端编译期红);省略成因短语口 `taskRequestOmissionCausePhrase`(0.98.0 退出公面);CC-282);审批四面问类两位 `askClass` / `classes`(三型各 +2 可选位;CC-284);请求键 `disableSkills` 与片段口 `disableSkillsDeclaration`(车道表 45 → 46 行;CC-277);hooks 设置来源条目的唯一执行者与本端跳过口 `settingsHooksKeptLocally`(`PLUGIN_HOOK_REASONS` +5 词、`PLUGIN_HOOK_EXCLUSION_REASONS` +1 词,穷尽分支的端编译期红;CC-287);凭据被拒判官 `isReadCredentialRefusal` 上根入口(CC-289);服务端 7.111.0 两项(接线回执新段 `instructions`、子代转向成功结局 `messageId`;CC-282 余项)与展示出口无标签 `Token <值>` 形照遮(CC-290);根公面 1372 → 1379;测试钩 62 不变;公面类型名 942 → 952;超集键 +1(98 → 99,`_sema_instructions`);peer sdk 地板 `>=12.0.1` 不动;§115)。上一版 0.88.0 = **minor**:展示出口凭据面一次扫描(带凭据的输入上输出字节变、干净文本逐字节同、一轮即不动;CC-247);崩溃收敛 `cause` 认第二个词 `shutdown_before_park`(`CrashConvergedRow.cause` 型联合 +1 词,穷尽分支的端编译期红;CC-218);服务端自铸通告 `server.model_unreachable` 入受众表与事实读器 `readModelUnreachable`(CC-270 ①);开发依赖换钉引擎 `~7.37.1`、放行原因闭集镜像 `GATE_MODE_RELEASE_REASON_WORDS` / `isGateModeReleaseReasonWord`、修复通告事实读器 `readToolTurnRepaired`、通告码册 80 → 81(`EngineNoticeFactsCode` +2 员;CC-272);会话所有者自助记忆抹除 `eraseSessionMemory` / `sessionMemoryEraseOutcome` + 三只闭集镜像(CC-264);registry 同一个 409 的两义判别 `classifyRegistryConflict`(0.95.0 退出公面) / `isScopeGoneError`(0.95.0 退出公面)(CC-280);请求键 `requireExistingSession`(车道表 44 → 45 行)与被拒读口 `requireExistingSessionRefusalFromError` / 一句 `requireExistingSessionRefusalContent`(CC-281);投递事实账本 `createPromptDeliveryLedger` + 两只按消息行的读口 `promptKnownUndelivered` / `withoutUndeliveredPrompts`(判据 = 引擎为这次提交建了 run;CC-271);plan 决断台账:离门证据结掉、还没被认领的登记由投递口认领原笔(CC-278);`wiring_manifest` 帧 `fileHistory` 段(`WiringManifestChromeEvent.fileHistory?` / `WiringManifestView.fileHistory?`,超集键 `_sema_fileHistory`;CC-279);根公面 1356 → 1372;测试钩 62 不变;公面类型名 922 → 942;超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§114)。上一版 0.87.0 = **minor**:会话历史 tool_use 错配的自救出路 —— 合成终局错误行超集键 `_sema_tool_history_mismatch`、`EmitContext.offersRewind?` 声明面出路句与连续次数句、根入口两只纯函数 `classifyToolHistoryMismatch` / `resolveToolHistoryRewindTarget`(CC-268);崩溃收敛 needsHuman 行的闭集因由位 `needsHumanReason`(CC-269);停车 fail-soft 同步终帧与结果帧的真因超集键 `_sema_park_failed_reason`(CC-273);workflow 活动台账 / 监视器源的 `authToken` 收取值函数、连线身份按凭证来源认(CC-274);`armDetachCancel` 入参 `authToken` 收取值函数、取件口每调现读(CC-275);chrome 臂 `suspended_reopened`(`ChromeEvent` +1 臂,穷尽分支的端编译期红;CC-276);根公面 1354 → 1356;测试钩 62 不变;公面类型名 922 不变;超集键 +2;peer sdk 地板 `>=12.0.1` 不动;§113)。上一版 0.86.0 = **minor**:引擎 7.34.0 提货两代读法 —— 事实表第二批构建期生成、`GATE_DENIED_BY_WORDS` 两代并集十一词(元素型 `GateDeniedByWord`,`mode` 专句)、门记录权限模式两臂与读口 `gateModeRelease`、通告码册六码与六只事实读器(`EngineNoticeFactsCode` +6)、`STRUCTURED_DETAIL_TYPES` +`read_unestablished`、本人规则店读不出两代读法、`shell_gate_tighten` 改句(CC-249 / CC-245 / CC-230);服务端 7.105.0 提货 —— 会话规则写口拒名码 `rules.legacy_tool_name` 的具名结局与 `isRulesRefusalCode`(CC-251)、门前只读路 401 的 `unauthorized` 态与 `READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`(CC-252);请求键 `approverPosture` 退役、构造期按名拒,两个运行期名字退出根入口(逐名见 §2z)(CC-253);`AskUnresolvableFactsView.remedy?`(CC-254);开发依赖引擎 `~7.36.0`(CC-255 换钉 7.35.0,`CONFIG_REFUSAL_CODES`(0.96.0 退出公面) 8 → 17;CC-261 再换钉 7.36.0),通告码册 73 → 80;`adapt()` 错误信封不再回落读旧名 `result`(CC-221);服务端 7.106.0 提货 —— caps `store` / `centerWiring` 窄读口、SQL 姿态两代读、计费入口 503 `fleet.lease_unavailable` 读口与一句话(CC-250),`executionLane.isolated` 与「本机无 OS 沙箱」判定(CC-256),请求键 `inheritEnv` 与版本闸片段口、两只拒按码出句(CC-257),权限规则表超帽坏项读口与一句(CC-262),工具声明拒按码认领(CC-263),请求体键形拒两张键表读口(CC-265);`-p` 首帧工具来源超集键 `_sema_tools_source` / `_sema_tools_fallback_reason` 与铸口 `printInitToolFaceSupersetKeys`(CC-266),三张估计工具表改为常驻(CC-267);根公面 1310 → 1354;测试钩 60 → 62;公面类型 891 → 922;超集键 +2;peer sdk 地板 `>=12.0.1` 不动(sdk 12.0.1 / 13.1.0 / 14.0.0 / 15.0.0 下本版 `.d.ts` 严格编译均零错误);§112)。上一版 0.85.2 = **patch**:自愈重开两只失败结局带 `errorCode`(这一次重开放弃所依据的那一发失败请求的外层 wire 码,present-iff;判定形不带),重开判决不成功臂 +`_sema_errorCode`(宿主可选铸;宿主重开口抛错时本包铸)(CC-260);自愈腿读错误对象与成功应答记录上的各位收进保护(读不出按缺席,不再 reject;`atMostOnceFailureClass` / `readSteerDelivery`(🔧 0.92.0 退出公面)/ `readSteerReceiptStatus`(🔧 0.92.0 退出公面)不再抛);根公面 1310 不变;公面类型名不变(两个已导出型各多可选位);超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§111)。上一版 0.85.1 = **patch**:请求装配回执省略成因的终端用户向句表 `TASK_REQUEST_OMISSION_CAUSE_NOTICES` 与取句口 `taskRequestOmissionCauseNotice`(与接入方那只 `taskRequestOmissionCauseDetail` 同源于同一成因闭集、逐词不同句;表外 / 读不出 ⇒ 一句通用句,不抛、不回显),接入方那张句表的字面量补挂 `satisfies`(CC-248);plan-review 重开口在「这个会话没有接能显示卡的界面」那一形上答 `{ reopened: false, _sema_noPresentationSurface: true }`,自愈结局两臂带 `noPresentationSurface`、自愈行五句补一句成因,重开前提(宿主为该会话键订阅问题帧端口)成文(CC-258);自愈腿读宿主重开判决收进保护(某一位读不出按缺席,不再 reject),宿主日志 / 探针口抛错不再改变判决;多会话宿主的按会话呈现回执登记口 `registerArmedGateFromQuestionIdFor` 回到根入口(0.72.0 退出公面的名字复活;CC-259);根公面 1307 → 1310;公面类型名不变(两个已导出型各多可选位);超集键 +1;peer sdk 地板 `>=12.0.1` 不动;§110)。上一版 0.85.0 = **minor**:引擎事实表(通告码册 / 受众表 / MCP 注入丢弃原因 / 会话规则翻译判定内部两表)改为构建期生成,`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 导出的数组(不再冻结),四个思考档 / 权限模式型改为 SDK 型的别名,包内单源(CC-230);子代族八入口与两只行停止门收注入 client,写动词失败结局 +`unconfirmed`,`classifySubagentResumeFailure` 同判(CC-236);`sessionPolicyDeliverable` 收可选名册,`SessionPolicyWithheldWhy` 六词 → 七词(CC-228);过渡物退役登记与到期门,`adapt()` 不再认旧名 `attachedFiles`,三个运行期名字退出根入口(逐名见 §2z),`surfaceRememberNotApplied` 撤回退役预告(CC-221);plan-review 决断台账六口,`reopenPlanReviewCard` 按台账拒开(CC-241);会话后台任务停止口 `stopEngineSessionBackground` 与受据归类口 `engineSessionBackgroundReceiptReadingOf`(CC-246);服务端 7.104.0 会话侧:会话存档读不出三载体读口与人话 `corruptSessionContent`、`session.records_skipped` 进册(`SERVER_NOTICE_AUDIENCE` 🔧 0.89.0 退出公面前的三行)、删会话 409 读口、`/decide` 停驻挪动族读口(CC-217 / CC-243);服务端 7.104.0 能力 / 同步体侧:同步 park 新体与 park 行 `result`、`fileHistoryCaptureMode` 认 `on-optional` 与请求词片段口 `fileHistoryDeclarationField`(0.100.0 退出公面)、公钥发现读口 `projectSealedKeyCapability`、折叠粗码 `isStatusDerivedCoarseCode`(CC-243);同名影子对账门按语义判(CC-222);导出存活门读已提交历史(CC-240);根公面 1275 → 1307;测试钩 59 → 60;公面类型 +34;peer sdk 地板 `>=12.0.1` 不动;§109)。上一版 0.84.1 = **patch**:`<system-reminder>` 开标签定位口 `findSystemReminderOpenTag`(CC-210);detach durable-off 400 纯判定 `isDetachDurableOff400`,`detachDurableOffHint` 对读属性会抛的错误对象改回 `null`(CC-219);服务端自铸通告码进码册与受众表 `SERVER_NOTICE_AUDIENCE`(🔧 0.89.0 退出公面;`instructions.source_changed` 回到用户面)+ 事实读器 `readInstructionsSourceChanged`(CC-213);按码派发的通告事实口 `readEngineNoticeFacts` + 派发表 `ENGINE_NOTICE_FACT_READERS`,`readReadRootGrantNotice` 入参型放宽(CC-214);停泊审批决断 422 `parked_resume.startup_failed` 的读口 / 一句话 / 判定与码优先 `isCodeClassifiedGateFailure`(0.98.0 退出公面;CC-225);拒启会话的窄撤销动词 `removeRefusedSessionRules` 与出路句 `legacyToolNameFailureNoteOf`(0.103.0 退出公面),`CONFIG_REFUSAL_CODES`(0.96.0 退出公面) 七员 → 八员(CC-229);plan-review 编排三口与两只能力探针收注入 client(CC-209);CC 形 `permission_denials` 收入参只被传输层脱敏过的拒绝 + 超集位 `_sema_tool_input_redacted`(CC-235);凭据读法两处放行收口(CC-234);根公面 1260 → 1275;公面类型 +18;peer sdk 地板 `>=12.0.1` 不动;§108)。上一版 0.84.0 = **minor**:peer sdk 地板 `>=11.3.0` → `>=12.0.1`;后台代理登记读数 —— 读口 / 取代判定 / 归类口 / 登记键桥 / 补行谓词,缺席行下半场(CC-194);读目录授权结论通告读口 `readReadRootGrantNotice`(CC-185);接线回执 `hands` 段 `_sema_hands` + 读口 `handsSeamReadingOf` / `handsSeamDetail`,`handsMountedDetail` 坏入参不再抛(CC-206);陈旧逻辑清扫(CC-223):退役键 `rewind.rewindFiles` 构造期拒收、`WorkflowRunState.agentCount` 改可选、26 个内部件退出根入口、九张公面判定表换只读 Set 子类、十五张判定数组冻结、`resume_at` 文本兼容腿退役;根公面 1278 → 1260;公面类型 +10;§107)。上一版 0.83.6 = **patch**:会话规则记录的无损判定 `sessionPolicyDeliverable` 把引擎会在准备阶段拒启的两类名字(引擎退役名、含 `__` 而不以协议前缀开头的名字)改判「不写」,成因词 `legacy_tool_name`(闭集 5 → 6),引擎说「改名为 X」的退役名带 `currentName` 出路位;`peer_wide` 那句改措辞(判决不变)(CC-226);根公面 1278 不变;peer sdk 地板 `>=11.3.0` 不动;§106)。上一版 0.83.5 = **patch**:展示层出口 `displayUntrusted` 的连接符 ZWJ / ZWNJ 按语境判(🔴 默认形输出字节变)、两只可选开关 `escapeBackslashes` / `blanks` 与标记位置读口 `displayUntrustedMarks`(CC-204);凭据两网的判别视图认孤代理项,机读字节 `errors[]` / 合成终局行同批(CC-207);转义记号在凭据再扫里原子与四处凭据读法存量修复(相对 0.83.4 零新增外泄);hooks 启动模式可选词读口 `SettingsPort.hooksStartupMode()`,安全 / bare 模式下设置来源只发 managed(CC-200),设置来源里同一条 hook 只发一份(CC-208);自愈三条重发结局 +1 可选位 `releaseConfirmedByEngine`、行句按释放证据分说(CC-212);活段接入指引订正;公面类型 +3;peer sdk 地板 `>=11.3.0` 不动;根公面 1278;§105)。上一版 0.83.4 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`(0.94.0 退出公面),三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf`(0.98.0 已退役)上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 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` **>=25.0.0**(value-level,非 type-only;🔴 **0.110.0 抬版**(CC-1342;支持底线 sdk 一项同批抬到 25.0.0;§139 SF-1):运行期入口静态导入 sdk 25.0.0 起才有的消卡帧窄化谓词 `isApprovalCompleteFrameV1`,装 sdk 23.x / 24.x 的消费方 import 本包根入口即抛 SyntaxError(0.109.0 声明 `>=23.1.0` 是失实承诺,§139-SFd 成文改口);同批退役的四项过渡物(协议类名读口第四态 · `compaction_started` 守卫 · 地板以上的编译期钉 · 续跑成因领先登记)与同名型 `BrainStatusPhase` 改再导出见 §139 SF-2 / SF-3;此前 **0.99.0 抬版**(支持底线 sdk 一项同批抬到 23.1.0;§127 PK-1):根入口原样再导出 sdk 的请求层附件条目型 `UserAttachment`(23.1.0 起才有;与 sdk 同名的公面型就是 sdk 那一只),装 23.0.x 的消费方 d.ts 解析不到该名,运行期零差;此前 **0.98.0 抬版**(CC-733,sdk 23 提货;支持底线 sdk 一项同批抬到 23.0.2;§126 PN-2):活卡 respond 回执按 sdk 的两臂联合读(首决落地 / 首决回放),会话规则记录取 sdk 的三桶型,停驻续跑的启动成因取 sdk 的五词闭集,崩溃遗留行取 sdk 自己的行型(`CrashConvergedRow`);地板越过 sdk 22.x,五处只在 21.1 一代上成立的过渡读法同批执行(§126 PN-10),21.1.0 – 22.x 失去物料见证;此前 **0.97.0 抬版**(CC-715,与服务端 7.126.0 / 引擎 7.49.5 底线同批;§124 PK-1):本包根入口原样转口 sdk 21.1.0 的两只决断口门种常量 `APPROVAL_DECIDE_GATE_KINDS` / `PLAN_REVIEW_GATE_KINDS`(21.0.0 上不存在 ⇒ 运行期 import 失败),门种判官由它们的构建期生成物派生,终局失败详情按 sdk 21 三臂联合读,审批卡词取 sdk 卡词闭集;此前 **0.96.0 抬版**(C-R432 ①,与服务端 / 引擎底线同号;§123 PA-1):本包源码读 sdk 20 的舰队行型 `workspaceSnapshot` 声明(19.x 上源码编译红),终帧读口按 sdk 20 五臂联合 `DoneFrameResult` 的窄化序读重放体;已发 `.d.ts` 对装 19 / 20 的消费方都编得过(两视角实测见 §123 PA-1),抬地板是支持承诺随服务端 7.125.0 锁步;此前 **0.95.0 抬版**(C-R389 ② / C-R390;§122 PK7-1):公面型取 sdk 19 的 `AskRowEndingCause` / `ApprovalSettleCause`、审批成因闭集经包根常量取,18.x 失去物料见证;此前 **0.94.0 抬版**:请求面权限模式六词、审批出处键型 `ApprovalDecidedBy`、取消成因三词 / 状态派生粗码 / 410 DENIED 组那一词都改取 sdk(17.x / 18.x 起声明;三只运行期常量经构建期生成物取),12.0.1 – 18.0.x 不再支持,§121 SP2-7;此前 **0.84.0 抬版**:12.x 声明每会话后台登记列表 `sessions.background`、能力位 `capabilities.background.listFace` 与七词闭集的后台状态型,本包三者都读(登记读口的端点门与归类口的编译期穷举),按 12.0.1 编译,11.3.0 失去物料见证;0.84.1 / 0.85.0 / 0.85.1 / 0.85.2 / 0.86.0 / 0.87.0 / 0.88.0 / 0.89.0 / 0.90.0 不动(0.86.0:sdk 14 的三处型面 BREAKING 本包已按结构读覆盖,本版 `.d.ts` 在 sdk 12.0.1 / 13.1.0 / 14.0.0 / 15.0.0 下严格编译零错误,§112y;0.90.0:地板见证矩阵改为路径列表 —— 开发依赖 12.0.1 + 15.0.0 / 15.2.0 / 15.3.0 / 16.0.0 探针树逐份验,`.d.ts` 对 sdk 16.0.0 严格编译零错,§116 SD-1)。此前 **0.80.0 曾抬到 >=11.3.0**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码(0.80.0 至 0.83.6 都在这条地板上);**0.79.0 曾抬到 >=11.2.1**:11.2.x 声明 `capabilities.mcpProbe`、`mcpCapabilities` / `probeMcp` + `McpProbeFace`、写回执第三支 `stillLive: "unknown"`,11.2.1 再补 `TaskRequest.approverPosture` 与审批帧键 `mandated`(型面 + 运行期键锚),本包按 11.2.1 编译,11.0.1 失去物料见证;**0.78.0 曾抬到 >=11.0.1**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.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「不低于见证到的最低实装版」双钉);开发依赖 **38.1.0**(0.112.0 起;peer 地板 `>=25.0.0` 不动,§141 S7149-1)。 | `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
|
| peer:mods 内核(可选) | `@sema-agent/mods-kernel` **>=7.54.0**(**可选 peer**:`peerDependenciesMeta` optional;只在子路径入口 `./mods` 用,根入口零引用;0.101.0 新增;开发依赖与引擎同版精确钉(版本以 `package.json` `devDependencies` 为准),范围接受 ≠ 已验证,已验证 = 转口门逐代矩阵的列;§129 MK-2) | `package.json` `peerDependencies` / `peerDependenciesMeta` |
|
|
@@ -9741,6 +9741,72 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
|
|
|
9741
9741
|
|
|
9742
9742
|
**包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(CC-100)—— 方案候拍板(dist 去注释 vs 手清),0.77.2 · ② `DeniedBy` 第十词 `read_boundary` / `teamName` / `stillLive` 三词随 sdk 10 型面在 0.78.0 吸收(CC-106)· ③ `capabilities.mcpProbe` 候 core 7.26.0 #951 → server 7.93.0(CC-74)。
|
|
9743
9743
|
|
|
9744
|
+
## §142 🆕 0.112.1(2026-11-10)— 计划审阅的批准恒带卡上的门身份 · 结局成因五词 `PlanReviewOutcomeCause` 与一张配对表 · 坏行出路句改口 · 桥上原始动词的批准 / 改写必带门身份(CC-1496;行前缀 PA;🔴 行为变,fail-closed;`cause` 值域一词 → 五词:对当单值或做穷尽判断的消费者是型面变化(编译红一次),其余为加性)
|
|
9745
|
+
|
|
9746
|
+
> 本段行前缀 PA(PA-1 批准恒带门身份 · PA-2 结局成因五词 · PA-3 坏行出路句改口 · PA-4 桥上原始动词 · PA-5 拒绝 / 重新呈上不带门身份时的正文一句);行号一律带 142 前缀引用(142-PA-1)。🔴 §141 及以前不在本段射程,一字不碰;下面 142-PAd 逐句列本段取代或补足的旧句。
|
|
9747
|
+
|
|
9748
|
+
### 142-PAa. 规则与处置表
|
|
9749
|
+
|
|
9750
|
+
> **规则(PA)**:计划审阅决断的请求体带不带门身份只有一个判官 —— **批准上线恒带卡上的门身份**;卡说不出门身份就不发(0.106.0 起已如此);「引擎拒认的门身份」集**只对拒绝 / 要模型重新呈上计划**放宽带键规则(那两种回答不带门编号,是契约给坏行留的出路)。修前那一条「拒认集对批准也生效」删掉,不加新的「没发」臂。「为什么没生效」只一只成因槽,经一张配对表落到结局机读位 `cause`。带门身份的批准只落在那一道门上;门身份不复用、门内计划不变,是服务端的保证。
|
|
9751
|
+
> **这条规则让几样东西变少**:批准不再有「被拒认就不带键」这一例外;主发与去档重发共用一份请求体(两发不会拆开);结局成因从两只内部槽 + 三处「在场条件」收成一只槽 + 一张表(队列项、回调、队列口重冻同读)。
|
|
9752
|
+
|
|
9753
|
+
| 项 | 来源 | 处置 | 变化 | 三端读点 |
|
|
9754
|
+
|---|---|---|---|---|
|
|
9755
|
+
| **PA-1** 批准恒带卡上的门身份(`src/hitl/planReviewWire.ts` 的 `#decidePlanReview`) | 本包(CC-1496;服务端契约 §4c 门身份键) | consumed(🔴 行为变,fail-closed) | 修前:门身份进了拒认集(409 `approval_stale` ∧ 拒体没有 `currentPending` ∧ 回拉 run 行仍是那道门)之后,同门再批准不带门编号发出,其间引擎若已停在另一道门上就批了那一道;现在:批准恒带 ⇒ 坏行仍坏 ⇒ 服务端再拒(`not_applied` + `cause: 'gate_untrusted'`,什么都不改)· 门已换 ⇒ `gate_moved` · 运维修好那一行 ⇒ 照常生效(不必等进程重启)。`permissionModeAfter: "default"` 被拒(400 `request.field_conflict`)后的去档重发与主发同一个门编号:两发从决断腿冻结的同一份请求体快照各铸一只新对象,注入 client 改写自己收到的那只不影响重发;重发被拒照常落「没生效」。决断词在进决断腿之前读一次、闭集判(原始串且是 `approve` / `reject` / `ask_again` 之一):不是 ⇒ 零字节、不投结局、`onOutcome` 不回调(与在飞闩拒同一形) | 零改;渲坏行出路句的端读 PA-3 新句 |
|
|
9756
|
+
| **PA-2** 结局成因五词 `PlanReviewOutcomeCause`(`src/planReviewOutcomeCause.ts` 的 `#planReviewOutcomeCauseOf`);`PlanReviewOutcomeMeta.cause` 一词 → 五词 | 本包(CC-1496) | consumed(根入口 +1 型名;`cause` 值域一词 → 五词:对当单值或做穷尽判断的消费者是型面变化(编译红一次),其余为加性) | 合法对恰五对:`still_parked` + `stored_form_unsupported` · `not_sent` + `card_missing` / `card_withholds` · `not_applied` + `gate_moved` / `gate_untrusted`;其余不落键。队列项 `_sema_planReviewOutcome.cause` 与 `onOutcome` 载荷 `.cause` 同值;队列口重冻对外来结局对象的 `effect` / `cause` 各读一次再判表(访问器两读两答铸不出非法对)。`planReviewOutcomeTail` 第四参同型放宽,只有 `still_parked` + `stored_form_unsupported` 改尾句 | 见 142-PAy ①②;今天三端零 `.cause` 读点 |
|
|
9757
|
+
| **PA-3** 坏行出路句改口(目录键 `approval.planReview.decision.gateUntrusted`,en / zh) | 本包 | consumed(文案变) | 新句:修好之前在这里批准会被同样拒掉、什么都不改;拒绝或要求重新出计划将不带门编号提交 —— 不批准任何东西,但计划若在此期间已换,就作用在那时在等的那份上(可能还没人看过);也可以取消任务。旧句「再答一次将不带门编号提交」作废 | 自己按目录键渲句的端零改(换句随包) |
|
|
9758
|
+
| **PA-4** 桥上原始动词 `HitlBridge.reviewPlan`(`src/hitl/hitlBridge.ts` 的 `#reviewPlan`);`PlanReviewOutcome.checkpointId?` | 本包(CC-1496) | consumed(🔴 行为变 + 型面加性) | 批准 / 改写不带门身份(缺席 / 不是非空串)⇒ 本地安全停 `HitlSafetyError`,码 `wrong_gate`(本动词既有的门守卫码,不铸新词),`message` = 目录键 `approval.planReview.bridge.gateIdMissing` 的英文句(中文同键),一个字节都不发;带了原样上体(键序 … → `checkpointId` 最后);拒绝照旧(带了也原样上体);决断词入口读一次、之后全程用这一读:不是 `approve` / `edit` / `reject` 三词之一的原始串(装箱串 / 表外词)⇒ 本地安全停,码 `bad_plan_edit`(本动词既有的坏入参码),零字节;`gateIdMissing` 说明句不说计划还在等(零请求证不了) | 三端今天零调用;直调这只动词的宿主见 142-PAy ② |
|
|
9759
|
+
| **PA-5** 拒绝 / 要模型重新呈上计划因拒认集而不带门身份出站时的正文一句(目录键 `approval.planReview.decision.sentWithoutGateId`,en / zh) | 本包(CC-1496) | consumed(行为变:只改结局正文) | 这一发因拒认集不带门身份**且确实发出去了** ⇒ 结局正文末尾追加一句(条件式,不断言生效):这次回答发出时没带门编号,若它生效,作用的是它到达时引擎正在等的那份审阅,不一定是卡上那份计划;生效与否只由正文前半句说;本地没发 / 可证没送出 / 带门身份的拒绝都不追加;机读位不加键 | 零改 |
|
|
9760
|
+
|
|
9761
|
+
### 142-PAb. 缺席语义与坏形处置(逐键)
|
|
9762
|
+
|
|
9763
|
+
- **`cause`(PA-2)**:缺席 = 本包没给成因 —— `took_effect` / `advanced` / `unconfirmed`;无连接、坏档位、注入 client 不可用这类 `not_sent`;通用 4xx / 404 / 409 别码这类 `not_applied`;老版本包;宿主自铸的结局。缺席**不是**「生效了」,也**不是**「没有原因」。表外词或配对不合法 ⇒ 不落键(不折成别的词)。
|
|
9764
|
+
- **决断体 `checkpointId`(PA-1)**:批准 ⇒ 恒为卡事实上的门身份;卡说不出门身份 ⇒ 批准不发(`not_sent` + `card_withholds` / 没附卡 `card_missing`,0.106.0 起同);拒绝 / 要模型重新呈上计划 ⇒ 卡有门身份且不在拒认集里才带,否则不带。
|
|
9765
|
+
- **桥 `PlanReviewOutcome.checkpointId`(PA-4)**:只认非空串;缺席 / 空串 / 非串 ⇒ 当没带(批准 / 改写本地拒、拒绝照发不带)。本包不核它是不是用户看过的那张卡的门身份(那是调用方的事实)。
|
|
9766
|
+
- **拒认集**:容量(64,先进先出)、只在本进程、记集的条件都不变;只是读它的只剩拒绝 / 要模型重新呈上计划。
|
|
9767
|
+
|
|
9768
|
+
### 142-PAc. 黑盒判据(G 骨架;交 test)
|
|
9769
|
+
|
|
9770
|
+
包侧覆盖 `scripts/run-plan-review-decide-card-projection-test.mjs` D13 – D27 与 D14b(D22 – D27 = 条件式「没带门编号」一句八形 / 两口决断词闭集判 / 重冻 `cause` 只读一次 / 桥上非串门身份 / 出站体键序;假引擎服务端模型:run 行回显的门编号与当前门的可信身份分开建模、生效记账;D14b = 判成「门换了」的门不进拒认集,随后同卡拒绝仍带门身份)+ 改钉 D9 / D9b / D10 / D11 / D12 / D12b(D11 / D12 / D12b 的拒认集探针由批准改成拒绝)。修前产物上红的格:D9 / D9b / D10 / D13 / D14 / D15 / D15b / D16n / D17(三格)/ D18(两格)/ D19 / D20 / D21(两格)(D14b、D22 – D27 未在修前产物上量)。
|
|
9771
|
+
|
|
9772
|
+
| 格 | 场景 | 判据 | 修前读数 |
|
|
9773
|
+
|---|---|---|---|
|
|
9774
|
+
| G-PA-1〔服务端可选〕 | 请运维把一条停在计划审阅门上的 run 行的门编号改坏(行仍回显那个编号,门身份过不了信任边界);在那张卡上批准两次 | 两次请求体都带那个 `checkpointId`;两次都 409 `approval_stale`、结局 `not_applied` + `cause: 'gate_untrusted'`;run 仍停在原门 | 第二次批准不带 `checkpointId`、生效 |
|
|
9775
|
+
| G-PA-2〔服务端可选〕 | 同 G-PA-1 第一次之后,另一端拒绝、run 停上新门 Y;在旧卡上批准 | 请求体带旧编号、409、`gate_moved`;Y 没被批 | 不带编号、批了 Y |
|
|
9776
|
+
| G-PA-3〔服务端可选〕 | 同 G-PA-1 第一次之后,运维修好那一行;再批准 | 带编号、生效(`took_effect`) | 不带编号、生效 |
|
|
9777
|
+
| G-PA-4 | 同 G-PA-1 第一次之后,在那张卡上拒绝 | 请求体不带 `checkpointId`、带理由;结局正文含 `sentWithoutGateId` 那一句恰一次 | 不带编号、无那一句 |
|
|
9778
|
+
| G-PA-5 | 任一宿主读结局:无卡批准 / 撤档卡批准 | 队列项与回调同带 `cause: 'card_missing'` / `'card_withholds'` | 两处都无 `cause` |
|
|
9779
|
+
| G-PA-6 | 直调 `HitlBridge.reviewPlan({ decision: 'approve' })` | 抛 `HitlSafetyError`、`code === 'wrong_gate'`、零请求 | 发出、不带门编号 |
|
|
9780
|
+
| G-PA-7 | 直调 `HitlBridge.reviewPlan({ decision: new String('approve') })`;另以 `decidePlanReview(taskId, new String('approve'))` 不附卡 | 桥:抛 `HitlSafetyError`、`code === 'bad_plan_edit'`、零请求;决断口:零请求、无结局 | 发出 `{"decision":"approve"}`、不带门编号 |
|
|
9781
|
+
|
|
9782
|
+
### 142-PAd. 成文改口(已发段冻结、一字不碰;以下各句自本版起取代或补足原句)
|
|
9783
|
+
|
|
9784
|
+
| 旧句(坐标) | 新句(本版起) |
|
|
9785
|
+
|---|---|
|
|
9786
|
+
| CHANGELOG 0.106.0「门已换与认不出门编号」条(§135 HD-7 / HD-8):同门下一次决断不带 `checkpointId` | 只对拒绝 / 要模型重新呈上计划成立;批准恒带门身份,坏行仍坏就再被拒(`gate_untrusted`) |
|
|
9787
|
+
| CHANGELOG 0.106.0「认不出门编号的拒认集只在本进程」条:再答那一次不带门编号 | 同上一行;另:修好那一行后带门编号的批准照常生效,不必等重启 |
|
|
9788
|
+
| CHANGELOG 0.106.0 新门条(`run-plan-review-decide-card-projection-test.mjs`):原因槽一声明两写一读、结局对象无原因键 | 一只成因槽(四处写、恰一处读且经配对表);结局对象带 `cause`(配对表答了才带) |
|
|
9789
|
+
| §135 HD-5:卡有门身份就带(拒绝 / 要模型重新呈上计划同一条) | 批准恒带;拒绝 / 要模型重新呈上计划在门身份进了拒认集时不带 |
|
|
9790
|
+
| §135 HD-8:同门下一次决断不带门身份 | 同 CHANGELOG 0.106.0 那一条的新句 |
|
|
9791
|
+
| §135 HD-10:决断原因不上公面 / 结局对象不加原因键 | 结局机读位 `cause` 带成因五词(PA-2) |
|
|
9792
|
+
| §135 改口表 §131 PK-10 那一行的新句:卡有门身份就带(不在引擎拒认集里) | 批准恒带;「不在引擎拒认集里」只对拒绝 / 要模型重新呈上计划 |
|
|
9793
|
+
| §139 S7137-6:卡有门身份就带(去键重发那一发照带),唯一不带的形是在拒认集里 | 批准恒带(去键重发同一门身份);拒认集只对拒绝 / 要模型重新呈上计划 |
|
|
9794
|
+
| §139 S7137b 决断体 `checkpointId` 缺席语义:在引擎拒认的门身份集里 ⇒ 不带键 | 只限拒绝 / 要模型重新呈上计划;批准在拒认集里照带 |
|
|
9795
|
+
| §129 XA-3:`_sema_planReviewOutcome.cause` present-iff `stored_form_unsupported` | 那一对仍成立;`cause` 另有四词,落不落只问配对表(PA-2) |
|
|
9796
|
+
|
|
9797
|
+
### 142-PAe. 在册局限(用户可见)
|
|
9798
|
+
|
|
9799
|
+
- **坏行修好之前,在客户端批不了这份计划**:服务端那一行的门编号坏了时,每次批准都被拒、什么都不改,要等运维修好那一行(修好后照常生效)。修前第二次批准能过,但可能批到别的门上。出路句写明改走拒绝 / 取消。
|
|
9800
|
+
- **拒认之后,拒绝 / 要模型重新呈上计划仍不带门身份**:那段时间里别的客户端若已换出新计划,这次回答作用在那一份上 —— 不授予退出计划模式的权,但会让模型重做一轮规划,可能丢掉一份还没人看过的计划,理由也会挂到那一份上。这一发确实发出去时,结局正文明说它没带门编号(PA-5,条件式)。这是契约给坏行留的唯一出路(收紧它,用户就只剩取消任务)。
|
|
9801
|
+
|
|
9802
|
+
### 142-PAy. 三端升级必读(三条)
|
|
9803
|
+
|
|
9804
|
+
- ① **编译红 / 值域扩张**:`PlanReviewOutcomeMeta['cause']` 由一词扩为五词 —— 对它写穷尽 `switch`(`default` 用 `never` 检查)或 `Record<NonNullable<…>, …>` 的代码编译红一次,补四词即可;按旧一词做枚举校验的回读会拒新四词;把 `cause` 当布尔用(`if (meta.cause)`)的旧判断会把新四词误读成「服务端读不了这份停驻存下的样子」,改按值比较;新旧两版混跑时,旧版的队列口重冻只留 `stored_form_unsupported`,新四词被丢(键缺席,不会变成别的词)。三端今天零 `.cause` 读点。
|
|
9805
|
+
- ② **行为变**:坏行上的批准从此不过(结局 `not_applied` + `gate_untrusted`),出路是拒绝 / 取消或请运维修行;直调 `HitlBridge.reviewPlan` 的宿主,批准 / 改写要带审阅卡事实上的 `checkpointId`(不带 ⇒ `HitlSafetyError` `wrong_gate`、零请求),决断词要是三词之一的原始串(装箱串 / 表外词 ⇒ `bad_plan_edit`、零请求)。
|
|
9806
|
+
- ③ **判据 / 零动作**:`cause` 缺席不是「生效」;只经 `decidePlanReview` / 包卡作答的端零改(新句与新键随包)。
|
|
9807
|
+
|
|
9808
|
+
**包侧缺口:** 〔PA〕① 桥上原始动词 `HitlBridge.reviewPlan` 的门身份由调用方交,本包不核它是不是用户看过的那张卡的(决断口 `decidePlanReview` 读卡事实);这只动词的去留另议 · ② 界面用的「成因 → 句子」读口不在本版(机读位与数据面英文正文先出)· ③ 服务端契约里「人看过当前计划后不带键再决」一句不分动词,本包对批准单边收紧;适用范围待服务端契约补一句。
|
|
9809
|
+
|
|
9744
9810
|
## §141 🆕 0.112.0(2026-11-10)— 本段主题原文逐组列在紧随的「141-0 本段主题」引用块里(新增主题追到该块末尾,不再追到本行;标题 ≤ 1200 字)
|
|
9745
9811
|
|
|
9746
9812
|
> **141-0 本段主题**(各组主题原文照搬,一组一行;各组行前缀 → 子节见各组括注):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.112.
|
|
3
|
+
"version": "0.112.1",
|
|
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",
|