@sema-agent/client-core 0.87.0 → 0.89.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -0
- package/README.md +20 -15
- package/dist/adapter/activeRunSelfHeal.js +4 -2
- package/dist/adapter/downstream/eventToSdkMessage.js +17 -2
- package/dist/adapter/downstream/wiringManifestView.d.ts +11 -0
- package/dist/adapter/downstream/wiringManifestView.js +28 -0
- package/dist/controlRouter.d.ts +7 -1
- package/dist/controlRouter.js +43 -1
- package/dist/disableSkillsWire.d.ts +17 -0
- package/dist/disableSkillsWire.js +52 -0
- package/dist/displayUntrusted.d.ts +4 -0
- package/dist/displayUntrusted.js +1742 -591
- package/dist/engineErrorCodes.d.ts +2 -0
- package/dist/engineErrorCodes.js +1 -0
- package/dist/engineNoticeCodes.d.ts +44 -1
- package/dist/engineNoticeCodes.js +211 -39
- package/dist/engineWireFor.d.ts +1 -0
- package/dist/engineWireFor.js +1 -1
- package/dist/gateOutcome.d.ts +4 -0
- package/dist/gateOutcome.js +5 -0
- package/dist/generated/engineFactTables.d.ts +1 -0
- package/dist/generated/engineFactTables.js +3 -0
- package/dist/generated/engineNoticeTables.d.ts +3 -0
- package/dist/generated/engineNoticeTables.js +110 -0
- package/dist/hitl/crashConverged.d.ts +1 -1
- package/dist/hitl/crashConverged.js +6 -1
- package/dist/hitl/planReviewWire.js +30 -10
- package/dist/hitl/toolApprovalWire.d.ts +6 -2
- package/dist/hitl/toolApprovalWire.js +30 -0
- package/dist/hooksWireCaps.js +80 -12
- package/dist/index.d.ts +12 -3
- package/dist/index.js +8 -3
- package/dist/pluginHooksWire.d.ts +46 -4
- package/dist/pluginHooksWire.js +277 -24
- package/dist/promptDelivery.d.ts +20 -0
- package/dist/promptDelivery.js +153 -0
- package/dist/providerRejection.d.ts +6 -0
- package/dist/providerRejection.js +52 -0
- package/dist/registryConflict.d.ts +3 -0
- package/dist/registryConflict.js +44 -0
- package/dist/request/taskRequest.d.ts +3 -0
- package/dist/request/taskRequest.js +64 -8
- package/dist/resumeRefusalCopy.d.ts +7 -0
- package/dist/resumeRefusalCopy.js +45 -1
- package/dist/runTerminal.d.ts +6 -0
- package/dist/runTerminal.js +23 -0
- package/dist/seam.d.ts +4 -0
- package/dist/seatContract.d.ts +9 -1
- package/dist/seatContract.js +10 -0
- package/dist/sessionMemoryErase.d.ts +76 -0
- package/dist/sessionMemoryErase.js +432 -0
- package/dist/subagent/engineSubagentResume.js +2 -1
- package/dist/subagent/engineSubagentSteer.d.ts +8 -1
- package/dist/subagent/engineSubagentSteer.js +26 -3
- package/docs/INTEGRATION-CLIENTS.md +767 -14
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,183 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.89.0(2026-10-03)
|
|
53
|
+
|
|
54
|
+
> 主题:**minor** —— 七项同发(按票序)。① **引擎 7.38 提货**(CC-282):开发依赖换钉引擎 `~7.38.2`;通告码册 81 → 86(`task.tool_turn_incomplete` 与四只服务端自铸通告码入册),引擎码册自带的铸方表接手服务端自铸码的受众,本包手写的四行受众表退役、`SERVER_NOTICE_AUDIENCE` 退出根入口;「工具轮不完整」与「用户输入没被用上」两族通告各有事实读器,后者另有一句用户面话;终局失败带的服务商拒绝详情窄读,并给「改了重发」判定口;steer 账本写不进的 503(`steering.ledger_unavailable`)归「原文稍后重发」一档,主 run / 自愈 / 子代三条 steer 腿读同一张码表;请求装配回执的省略成因短语口。② **审批四面问类两位**(CC-284):活卡帧、待决行、卡与运维队列行上的 `askClass` / `classes`。③ **请求键 `disableSkills`**(CC-277):这一发一只技能都不装。④ **hooks 设置来源条目的唯一执行者**(CC-287):设置来源条目与插件条目共用一只判定,每条恰有一个执行者,另给本端跳过口。⑤ **凭据被拒判官上根入口**(CC-289)。⑥ **服务端 7.111.0 两项**(CC-282 余项):`wiring_manifest` 接线回执新段 `instructions`(这条腿准备时项目记忆加载器选中的指令文件),只带这一段的帧开始出事件;子代转向成功结局带受理 id `messageId`。⑦ **展示出口对无标签裸 `Token <值>` / `token <值>` 形照遮**(CC-290):`token` 进方案词网,与 `Bearer` / `basic` 同分隔、同放行判法;地址路径以 `/token` 收尾后接三位 HTTP 状态码的日志行形放行。**为什么是 minor**:八只新顶层导出(`readToolTurnIncomplete` / `readUserInputUndrained` / `userInputUndrainedNotice` / `providerRejectionResend` / `taskRequestOmissionCausePhrase` / `disableSkillsDeclaration` / `settingsHooksKeptLocally` / `isReadCredentialRefusal`);根入口删一名 `SERVER_NOTICE_AUDIENCE`(🔴 型面 BREAKING;本机检索四端源码零读点,改用 `noticeAudienceOf`);🔴 对下列联合 / 闭集做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次:`ControlSafetyCode` +1 员(`ledger_unavailable`)、`EngineNoticeFactsCode` +3 员(`EngineNoticeFacts` 另 +3 臂)、子代 steer 结局联合 +1 臂(`reason: 'not-delivered'`)、`PluginHookReason` +6 词与 `PluginHookExclusionReason` +1 词(见 Changed 第 2 / 3 / 8 条);可选位 additive:`ApprovalCardRequest` / `ToolPermissionRequest` / `ToolApprovalFrame` 各 +2 位(`askClass` / `classes`)、`readRunTerminal` 的 `failed` 臂 +`detail?`、`HooksWirePlan` +2 数组(判形口对缺这两只的计划按空数组收下:按 0.88.0 型面拼 / 派生计划的 JS 宿主零改动;TypeScript 自造计划 / 引擎事实字面量要补位)/ `HooksWireEngineFacts` +1 位 / `HooksWirePlanOptions` +2 可选入参、`TaskRequestInput.disableSkills?`、`WiringManifestChromeEvent` / `WiringManifestView` 各 +1 可选位 `instructions?`、子代转向成功结局 +1 可选位 `messageId?`;通告码册长度与受众来源、自愈 steer 腿的 503 判定、审批键表长度、交互车道上设置来源 hook 的请求体与执行者、展示出口对无标签 `token` 方案词形的输出字节等**已发导出的可观察变化**在 Changed 逐条单列(写明谁要跟)。根公面运行期导出 1372 → 1379(+8 −1);测试钩 62 不变;公面类型名 942 → 952(+10);超集键 +1(`_sema_instructions`);零新投影臂;请求装配车道表 45 → 46 行;`ENGINE_NOTICE_CODES` 81 → 86;`ENGINE_NOTICE_FACT_READERS` 17 → 20 行(用户面 13 → 16,运维面 4 不变);`PLUGIN_HOOK_REASONS` 13 → 19、`PLUGIN_HOOK_EXCLUSION_REASONS` 5 → 6;`TOOL_APPROVAL_FRAME_KEYS_MIRROR` 31 → 33、`TOOL_PERMISSION_REQUEST_KEYS` 14 → 16;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.37.1` → `~7.38.2`(构建期,不进运行期依赖)。
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **`task.tool_turn_incomplete` 的事实读器 `readToolTurnIncomplete(notice)`**(CC-282;接入文档 **§115 TI-1 … TI-3**)⇒ `{ cause, count, toolCallIds?, sessionId, runId } | undefined`,挂进 `readEngineNoticeFacts`(受众 `user`)。引擎 7.38.0 起,一条 run 里模型这一轮的工具调用没成形(参数没写完就被截断 / 没有工具名 / 流里有读不出的帧被丢掉)或更早的调用没有记录到结果时,告诉用户一次(每个成因每条 run 至多一次)。`cause` 按开集透传(引擎今天四词 `truncated` / `unnamed` / `bad_frame` / `missing_result_synthesized`,型 `ToolTurnIncompleteCause`;表外词原样带回);`count` 正整数;`toolCallIds` 只在引擎给出可回显的调用 id 时在场(冻结副本)。`cause` / `count` / `sessionId` / `runId` 任一缺席或坏形 ⇒ 整只 `undefined`;`toolCallIds` 坏形只省这一键。只认自有属性、每格只读一次、永不抛。服务端 7.110.0 起这一码才上会话流(KL-365)。
|
|
59
|
+
- **用户输入没被用上:`readUserInputUndrained(notice)` + `userInputUndrainedNotice(facts)`**(CC-282;**§115 UI-1 … UI-6**):
|
|
60
|
+
- `readUserInputUndrained` 一只读器认两码 `task.user_steer_undrained` / `task.user_followup_undrained`(都挂进派发表,受众 `user`)⇒ `{ kind: 'steer' | 'followUp', count, cause?, taskId?, sessionId?, runId? } | undefined`。`kind` 由**码**定;`count` 是没被用上的条数(正整数,steer 码读 `steer`、follow-up 码读 `followUp`),读不出 ⇒ 整只 `undefined`;其余各位在场才交、坏形只省那一位。`cause` 开集透传(引擎 7.38.0 起 steer 码上两词:`leg_end` 引擎收场时还没用上 / `crashed` 服务端 7.110.0 起、受理那条 steer 的服务端进程在 run 收场前停了;型 `UserSteerUndrainedCause`);**缺席不补** —— steer 码缺 `cause` 是 7.38.0 之前的引擎,不等于 `leg_end`(KL-363)。`crashed` 那一臂恒无 `runId`(跨进程没有那条 run 的句柄),不是坏形。
|
|
61
|
+
- `userInputUndrainedNotice(facts)` ⇒ `string | undefined`:这一条的用户面一句,按 `kind` × `cause` 分四句 —— steer × `leg_end`「N 条在 run 进行中发的消息在 run 结束前没被用上、不会再投递;还需要就再发」;steer × `crashed`「N 条发给先前那条 run 的消息受理过,但服务端在那条 run 结束前停了,用没用上不知道 —— 先看那条 run 的记录与结果再决定要不要重发」(**不说**「没用上」;KL-362);follow-up「N 条排队的 follow-up 在 run 结束前没被用上、不会再投递;还需要就再发」;其余(表外 `cause`、steer 码缺 `cause`)「N 条消息可能没被用上,原因本版认不出 —— 先看记录再重发」。只说条数,不引用任何用户正文,也不带 id。对读器交出的读数恒有一句;读不懂的入参(`kind` 表外 / 条数不是正整数 / 读它就抛)⇒ `undefined`,不编句。
|
|
62
|
+
- 去重(本包不铸去重键):同一条告知 run 的流内 `(code, taskId)` 恰一帧;跨告知 run 可以再说一次 ⇒ 到一帧渲一帧、条数相加;重放按事件序号去重 —— **不要**按 `code + taskId` 跨流去重。引擎 7.39.0 预告的「子代收场没用上的输入在父会话里再说一条」那一位本版不读(KL-364)。
|
|
63
|
+
- **终局失败带的服务商拒绝详情**(CC-282;**§115 PR-1**):`readRunTerminal` 的 `failed` 臂新增可选位 `detail?: RunTerminalFailureDetail`(`{ kind, status?, code? }`)。服务端 ≥ 7.110.0、引擎 7.38 起,模型服务商拒绝了这次请求(HTTP 4xx)时在场:`kind: "provider_rejected"`,`status` 是服务商的 HTTP 状态码,`code` 是服务商自己给的那个词(有才带)。窄读规则:`kind` 是非空串(开集,表外词原样带回);`status` 是 100–599 的整数;`code` 是非空串;`kind` 为 `provider_rejected` 而状态码缺席、坏形或不在 400–599(铸点只给 4xx;`200` / `302` 一类不可能是服务商拒绝)⇒ 整只 `detail` 缺席,别的 `kind` 上的状态码仍收 100–599。只读自有数据位;读属性就抛 ⇒ 缺席,读器不抛。只在因由形(`result.terminal`)上读,扁平形不读。没有 `detail` 的失败终局,读数与 0.88.0 逐字节相同(不出现 `detail: undefined` 键)。CC 形结果帧(`doneToSdkResult`)不投这一位,带不带 `detail` 投影结果相同。
|
|
64
|
+
- **「改了重发」判定口 `providerRejectionResend(detail)`** ⇒ `{ resend: 'edit_and_resend' | 'not_by_editing'; text } | undefined`(CC-282;**§115 PR-2**),**只读状态码**:400 / 413 / 422 ⇒ `edit_and_resend`,句子 `The model provider rejected this request as sent (HTTP <status>). Change it — for example shorten it or remove an attachment — and send it again.`;其余一切 ⇒ `not_by_editing`,句子按档给出路,前半句同为 `The model provider refused this request (HTTP <status>)`:401 / 403 接 `: check the provider credentials or access for this account.`;404 接 `: the model is not available from this provider — choose another model.`;429 接 `: the provider is rate-limiting this account — wait and try again.`;5xx 接 `: the provider reported an internal error — try again later.`;其余(408 / 409 / 451 与表外状态码)接 ` for a reason that editing it will not fix — check the provider account or try again later.`。`detail` 缺席 / `null` / 不是 `provider_rejected` / 状态码读不出 / 读属性就抛 ⇒ `undefined`(说不出,不是「不能改了重发」)。服务商的 `code` 不进句子。只说「改了再发有望过」,不保证过(KL-376)。
|
|
65
|
+
- **省略成因短语口 `taskRequestOmissionCausePhrase(cause)`** ⇒ `string`(CC-282 g;**§115 OP-1**):请求装配回执成因的**从句**(小写起头、不带句点、不含「没发出去」那半句),给已有自己「没发出去」行形的端接在后面用;读不出 / 表外 ⇒ `for a reason this version does not recognize`。纯函数、绝不抛;与整句表同一张表派生。`other_channel` 的从句接在「这一次没发出去」之后不是逐字真 —— 另一步可能发了同一位(KL-359)。
|
|
66
|
+
- **审批卡与座位请求上的问类两位 `askClass` / `classes`**(CC-284;**§115 AC-1 … AC-6**):服务端 7.109.0 起,引擎给一次审批问盖的「这一问是哪一类」(`askClass`,对外说的那一个类)与「这一问属于的全部类」(`classes`,首员即 `askClass`)出现在活卡帧、待决行的整帧、卡面与运维队列行上。本版三只型各多两只可选位 —— 卡口入参 `ApprovalCardRequest`、座位请求 `ToolPermissionRequest`、活卡帧 `ToolApprovalFrame` —— 由**同一只**成对窄读填:活卡帧腿(待决行 `livePending[].frame` 经它出卡)、耐久待决行腿、卡 → 座位过境口 `toolPermissionRequestAskBits(card)`(出参多这两位)。
|
|
67
|
+
- 读法:两位都是对象**自有**的键,`askClass` 非空串,`classes` 是非空数组、每员非空串、无重复员、首员 === `askClass` ⇒ 原样带上(`classes` 是冻结副本,顺序是服务端交出的序);任一条不过 ⇒ **两位一起不带**(只有一半时只丢不补,不会拿 `askClass` 造一只 `[askClass]`);两位都缺 ⇒ 不带。
|
|
68
|
+
- 🔴 **缺席不是「普通问」**:缺席 = 服务端 < 7.109.0 / 该版本之前就已停下的那只问 / 引擎不盖类的站 / 服务端判坏形已丢。`ordinary` 是引擎闭集里的一个真词,只在在场时出现。
|
|
69
|
+
- 🔴 **开集、不重排**:本包不判词在不在引擎的类词表里(下一版引擎预告加类),端按词分支必须带 `default`;顺序原样(服务端 7.110.0 起按引擎规范序交出,7.109.0 原样交出;KL-360)。带重复员的一对本包两位都丢(比服务端 7.109.0 严;KL-361)。
|
|
70
|
+
- `approval_request` 卡面(呈卡帧与断连重放帧)上同一对本来就随信封原样到端(0.65.0 起本包不窄读那一面),本版无改动。门记录(`gateOutcomeOf`)上模式放行 / 模式拒绝两臂的同名两位读法不变(那两位由引擎在门记录上铸,与卡面不是同一铸点)。
|
|
71
|
+
- **`disableSkillsDeclaration(want, baseUrl)`** ⇒ `DisableSkillsDeclaration`(CC-277;**§115 DS-4**):请求键 `disableSkills`(这一发一只技能都不装 —— 部署的技能、调用方给的技能、agent 定义里的技能一个都不进引擎;其余工具照挂)的唯一取值口。读通用能力缓存的 `disableSkills` 位:读数为真 ⇒ 片段 `{ disableSkills: true }`;没报(服务端 ≤ 7.108.0)/ 为假 / 本进程还没读到 / 读不懂 ⇒ 空片段 + `withheld: { cause: 'not_reported' | 'unsupported' | 'unprobed' | 'unreadable', text }`(`text` 是一句给用户看的话,四句互异,起头 `Skills were not turned off for this request:`)。不发的理由:不认这一键的服务端对**整份**请求 400,不是忽略。意图 `false` / 缺席 ⇒ 空片段、无回执;意图是别的值(`'yes'` / `1` …)⇒ `TypeError`(先于能力位判,不回显值)。产物冻结。能力还没读到时提交的那一条不关技能(给一句话);端先 `await engineCapsSettled(baseUrl)` 再取片段可消除(KL-357)。
|
|
72
|
+
- **车道表 +1 行 `disableSkills`**(CC-277;45 → 46;**§115 DS-1**):interactive / print 有座、live 门后;utility 无座(同 `skills` 一行)。`TaskRequestInput.disableSkills?: true`(型只收字面 `true`)。
|
|
73
|
+
- **hooks 设置来源条目的本端跳过口 `settingsHooksKeptLocally(plan, event, group, opts?)`**(CC-287;**§115 HK-5**):客户端执行器跑一组设置来源 hook 之前调一次,拿回该跑的那几只。按内容认条目(同 matcher ∧ 同条目身份;matcher 缺席 / 空串 / `*` 同义 —— 都是全匹配),只对照计划的请求体;没有可跳的时返回同一个数组引用。压缩前后两事件收 `opts.engineCompaction`(`'not_performed'` ⇒ 引擎这一次没压,客户端照跑)。请求体一侧只认自有键(原型链上的键不随请求过境);客户端组与条目按属性访问读 —— 客户端执行器读到什么就按什么比(类实例、原型上的取值器照读)。计划缺 `settingsExcluded`(按 0.88.0 型面拼 / 派生的计划)按空数组照比请求体,与 `hooksForWire({ plan })` 收下这类计划同一口径(随请求发出的那几只客户端认得出、不跑第二次);`settingsExcluded` 在场而不是数组 ⇒ 读不懂,客户端照跑。
|
|
74
|
+
- 计划入参 +2 可选位:`shellHookTypesByEvent`(每个已报事件上客户端执行器能跑的 hook 型;🔴 报了事件的宿主请与换钉同批交。缺席 ⇒ 设置来源条目:command / http 按事件(报了 ⇒ 客户端能跑)、prompt / agent 视为客户端跑不了 —— 留在请求体上交给引擎;插件条目:报了事件即全型,与上一版同)、`promptAuthoredByUser`(`false` ⇒ 这一发不是用户写的,`UserPromptSubmit` 条目两源都不发、客户端也不跑)。
|
|
75
|
+
- 计划 +2 数组:`settingsVerdicts`(设置来源条目的执行者与依据)、`settingsExcluded`(`hooksForWire({ plan })` 的判形口与跳过口 `settingsHooksKeptLocally` 对缺这两只的计划同按空数组收下,在场就必须是数组);引擎事实 +1 位 `hooksCapable`(`taskSettings.hooks` 三态:读到 `true` / 显式 `false` / 没读到或没报 ⇒ `null`)。
|
|
76
|
+
- 判定依据闭集 `PLUGIN_HOOK_REASONS` +6(`engine_hooks_off` / `engine_hooks_unknown` / `engine_type_skipped`〔PowerShell 形 command,确定〕/ `engine_llm_limit`〔本事件第五只起的 prompt / agent,引擎可能跳过〕/ `engine_unconfirmed` / `engine_elsewhere`),筛掉原因 `PLUGIN_HOOK_EXCLUSION_REASONS` +1(`prompt_not_user_authored`),各配一句;按词穷尽分支的端编译红一次。
|
|
77
|
+
- **凭据被拒判官上根入口**(CC-289;**§115 CR-1**):`isReadCredentialRefusal(e)` 按名从根入口导出(此前只在包内两处读口之间共用,根入口只有那一句话 `READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`)。零行为变化,射程不动:状态 401 且码为 `auth.unauthorized` 或无码 / 空码才答 `true`;401 上的 `auth.principal_required` / `principal_unverified`(身份类)、403、407、别的状态一律答 `false`;结构读、永不抛。端侧读 fleet 流时「凡 401 记一次被拒」可改调它 —— 同一只判官三处共用(workflow 监视器、后台视图 fleet 源、端侧 fleet 流),不另立 fleet 专用分类口。去抖(几次、多久)与按凭据来源出的句子仍归宿主(那是宿主的会话事实)。
|
|
78
|
+
- **接线回执多一段 `instructions`**(CC-282 余项;服务端 7.111.0 起;接入文档 **§115 IN-1 … IN-4**):`wiring_manifest` chrome 臂(`WiringManifestChromeEvent`)与非流式提交回执视图(`WiringManifestView`,`readSubmitWiringManifest`)加可选位 `instructions?: { readonly selected: readonly string[] }` —— 这条腿准备时,项目记忆加载器选中的指令文件(相对工作目录的拼写;今天的候选是 `CLAUDE.md` / `.claude/CLAUDE.md` / `AGENTS.md` / `.claude/AGENTS.md`,首中即选,所以今天至多一员)。读法:在场 ⇒ 原样交出冻结副本(段对象与数组都冻结,不与入参共享引用);`selected: []` 原样交出 = 找过了、一个都没选中;**整段缺席 = 这条腿没有关于指令文件的陈述**(老服务端、部署没接加载器、没有执行环境的腿、工作目录不是本机绝对目录、委派子代腿),不是「没有指令文件」,不补键。坏形(不是对象 / `selected` 不是数组 / 成员不是非空串 / 数组有洞)⇒ 只丢这一段、同帧别段照交;成员按开集原字节交(不按今天的四个候选收窄,不判段长;KL-380)。报的是这条腿准备时读到的那一份,不是盘上此刻。超集键 `_sema_instructions`。根公面运行期导出不变。
|
|
79
|
+
- **子代转向成功结局带受理 id**(CC-282 余项;服务端 7.111.0 起;**§115 MI-1**):`steerEngineSubagent` 的 `{ ok: true, receipt }` 结局,在 200 回执带自有非空串 `messageId` 时原样多带 `messageId` —— 这次转向在服务端用户输入账本里的受理 id,与会话读面上「受理了、没用上」那一行的 `messageId` 是同一个值。缺席 = 老服务端(子代转向不经账本)或回执没带;空串 / 非串 / 原型链上的同名键 / 读取时抛 ⇒ 不带;`ok` / `receipt` 逐字节不变。续聊已结束子代(`resumeSettledSubagent`)的回执没有这一位(服务端只在转向上铸)。本包只原样交、不做关联(KL-381)。
|
|
80
|
+
- 公面合计:根入口运行期导出 +8 −1(CC-282 `readToolTurnIncomplete` / `readUserInputUndrained` / `userInputUndrainedNotice` / `providerRejectionResend` / `taskRequestOmissionCausePhrase`,删 `SERVER_NOTICE_AUDIENCE`;CC-277 `disableSkillsDeclaration`;CC-287 `settingsHooksKeptLocally`;CC-289 `isReadCredentialRefusal`;CC-284 零新名);测试钩不变;公面类型名 +10(`ToolTurnIncompleteCause` / `ToolTurnIncompleteFactsView` / `UserSteerUndrainedCause` / `UserInputUndrainedFactsView`;`RunTerminalFailureDetail` / `ProviderRejectionResend` / `SubagentSteerNotDelivered`;`DisableSkillsDeclaration`;`SettingsHookVerdict` / `SettingsHookExclusion`);`TaskRequestInput` +1 可选位;`ApprovalCardRequest` / `ToolPermissionRequest` / `ToolApprovalFrame` 各 +2 可选位;服务端 7.111.0 两项零新名。
|
|
81
|
+
|
|
82
|
+
### Removed
|
|
83
|
+
|
|
84
|
+
- 🔴 **根入口删 `SERVER_NOTICE_AUDIENCE`**(CC-282;型面 BREAKING;**§115 NM-3**):这张「服务端自铸通告码 → 受众」四行表的事实,引擎 7.38.0 起由引擎码册自己承载(四码入码册,受众进引擎受众表、铸方记服务端),本包不再持第二份。`engineNoticeInCatalog` / `noticeAudienceOf` 只查引擎码册生成物,四码的答案逐码同 0.88.0(`instructions.source_changed` / `session.records_skipped` / `server.model_unreachable` ⇒ `user`,`memory.layer_locked_legacy` ⇒ `operator`,全部在册)。**谁要跟**:按表遍历过它的端改用 `noticeAudienceOf(code)`(本机检索四端源码零读点)。名字进已退役名账,接入文档活段退役名录 §2z 同批加一行。
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
|
|
88
|
+
🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §115a′ 改锚)**:
|
|
89
|
+
|
|
90
|
+
1. **通告码册 81 → 86**(CC-282;开发依赖引擎 `~7.37.1` → `~7.38.2`;**§115 NM-1 / NM-2 / NM-4**):`ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 收进 `task.tool_turn_incomplete`(`user`)与四只服务端自铸码。随之 `engineNoticeInCatalog('task.tool_turn_incomplete')` 由 `false` 改答 `true`、`noticeAudienceOf` 由 `'operator'`(表外保守缺省)改答 `'user'`。四只服务端码的在册 / 受众答案不变(来源从本包手写表换成引擎码册)。`ENGINE_NOTICE_CODES` 里 `task.tool_turn_incomplete` 排在 `task.interrupt_unconsumed` 与 `approval.read_root_granted` 之间(引擎元组序)。**谁要跟**:按「码册八十一码」或「`approval.read_root_granted` 紧跟 `task.interrupt_unconsumed`」断言的格改锚(§115a′ 第 1 条)。
|
|
91
|
+
2. **按码派发口多认三码**(CC-282;**§115 TI-1 / UI-1**):`readEngineNoticeFacts` 对 `task.tool_turn_incomplete` / `task.user_steer_undrained` / `task.user_followup_undrained` 由 `undefined` 改答 `{ code, audience: 'user', facts }`;派发表 17 → 20 行,用户面码 13 → 16(运维面 4 不变);`EngineNoticeFactsCode` 联合 +3 员 —— 对它做穷尽 `switch` / 穷尽 `Record` 的 TypeScript 端**编译红一次**(本机检索四端零处)。
|
|
92
|
+
3. **steer 账本 503 归「原文稍后重发」一档,三条腿读同一张码表**(CC-282;**§115 SL-1 … SL-4**):
|
|
93
|
+
- `ControlSafetyCode` +1 员 `ledger_unavailable`(🔴 对它做穷尽 `switch` 的端编译红一次)。`steering.ledger_unavailable`(服务端写不进用户输入账本 ⇒ 503,这次输入一个字节都没交给引擎)由开集位 `steering_other` 改归这一位(与另两条腿同一合取:状态码 503 ∧ 码或类名;码或类名在而状态码对不上 —— 502、状态码是串、没有状态码 —— 仍落 `steering_other`),`ControlSafetyError.message` = `steering.ledger_unavailable — the server could not record this steer in its user-input ledger and refused it before anything reached the engine — the input was NOT delivered; resend the same text later (the same Idempotency-Key is fine)`。错误对象上码被剥掉时,按类名 `SteeringLedgerUnavailableError`(sdk 15.2.0 起)同认(更早的 sdk 造的是基类,认不出,KL-378)。其余八码的判别位与句子逐字节不变。 `steering_other` 那一句按状态码分两句:4xx(服务端收到、解析、明确拒)上仍是 0.88.0 原句「the steer did NOT land」;5xx / 状态码是串 / 没有状态码上改说「送达未知、别当它确知被丢而重发」(`ControlSafetyError.message` 的后半句在这几形上字节变;码表外的 `steering.*` 与「码在而状态码不是 503」两形都落这一位,同样按状态码取句)。`atMostOnceFailureClass`(自愈 steer 腿与 cancel 腿共用的送达判定)读状态码与主 run / 子代两腿同口(`status ?? statusCode`,数值才算):`{ statusCode: <4xx> }` 形由 `unknown` 改答 `rejected`(**§115a′ 第 14 条**)。
|
|
94
|
+
- 自愈 steer 腿(`atMostOnceFailureClass`):**503 且码为 `steering.ledger_unavailable`** ⇒ `rejected`(确知没送到);其余 5xx(含不带码的 503、带别的码的 503)仍是 `unknown`。用户可见:自愈三选卡 steer 腿撞上这一形,行文由「可能已送到、先观察」改为「没送到,可以再发」(用户形行首措辞的残留见 KL-377)。
|
|
95
|
+
- 子代 steer 结局联合 +1 臂 `SubagentSteerNotDelivered` = `{ ok: false, reason: 'not-delivered', safety: 'ledger_unavailable', detail }`,`detail` 是上面同一句处置。条件与自愈腿同一判定(503 且该码;状态码与自愈腿同读 `status`,缺席时读 `statusCode`);修前同一形答 `{ ok: false, reason: 'error', detail: '503' }`。🔴 对 `reason` 做穷尽分支的端编译红一次。`ledger_unavailable` 在主 run steer / interrupt 上自服务端 7.110.0 起出现,子代 steer 自服务端 7.111.0 起;更老的服务端在同一形上答 200。
|
|
96
|
+
4. **`readRunTerminal` 的 `failed` 臂多一个可选位 `detail?`**(CC-282;**§115 PR-1 / PR-4**):见 Added。按「`failed` 臂键集恰为 …」断言的格加这一键(缺席时读数与 0.88.0 逐字节同)。
|
|
97
|
+
5. **审批键表 31 → 33 / 14 → 16**(CC-284;**§115 AC-4**):`TOOL_APPROVAL_FRAME_KEYS_MIRROR` 31 → 33 键、`TOOL_PERMISSION_REQUEST_KEYS` 14 → 16 键,各 +`askClass` / `classes`。按「键表恰为 N 项 / 逐元素等于某份清单」断言的测试格加这两键;`toolPermissionRequestAskBits` 的出参在卡入参带一对时多两键(按「出参键集恰为 …」断言的格同改);手造卡上 `classes` 的取值器会抛时过境口原样抛(与 `origin` 取值器同律,不吞宿主异常;0.88.0 不读这一位,答 `{}`)。不带问类的卡、帧、行上所有出参逐字节同 0.88.0。
|
|
98
|
+
6. **请求装配对 `disableSkills`**(CC-277;**§115 DS-1 … DS-3**):
|
|
99
|
+
- `buildTaskRequest` / `assembleTaskRequest`:`disableSkills: true` 上请求体;`false` / `undefined` / `null` 不发、不进回执;非布尔值 `TypeError`(不回显值);`disableSkills: true` 与非空 `skills` 或入参上任一非空 `agents[].skills` 同交 ⇒ `TypeError`,句子点名两键、说二选一、不回显技能名(上游对这一组合 400 `request.field_conflict`;KL-358)。两类拒绝都不分车道、不受 live 门。修前这一键是表外键 ⇒ 任何值都 `TypeError`(「不认识的键」那一句)。
|
|
100
|
+
- `applyLiveRequestDefaults`:落位 `agents` 之后,若请求体带 `disableSkills: true` 而落位后的 `agents`(宿主给的或请求体自带的)里任一定义带非空 `skills` ⇒ `TypeError`(同一只判定)。这是本函数唯一会抛的一形;不带这一键的请求逐字节同 0.88.0。
|
|
101
|
+
- `TASK_REQUEST_OMISSION_CAUSE_NOTICES`(**§115 OP-2**):改由一张两列表(前导 + 成因从句)派生;四句与 `taskRequestOmissionCauseNotice` 的表外兜底句**逐字节同 0.88.0**,型不变。
|
|
102
|
+
7. **交互车道上设置来源 hook 的请求体与执行者**(CC-287;**§115 HK-1 … HK-10**):交互车道上,用户设置里的 `UserPromptSubmit` / `PreCompact` / `PostCompact` hook 此前既由客户端自己的执行器跑、又原样随请求交给引擎再跑一遍。现在 `hooksWirePlan()` 对设置来源条目与插件条目用同一只判定定唯一执行者:引擎确定会跑且引擎是本客户端在本机起的(或本客户端跑不了这一只)⇒ 交给引擎、客户端跳过;否则 ⇒ 客户端跑、不随请求发。判定只覆盖引擎点亮的九个事件上的 command / http / prompt / agent 条目;其余事件、形坏(含必要字段坏形:`command` / `url` / `prompt` 不是非空串)与表外型的条目不判定,请求体逐字节同上一版(服务端照旧整份拒)。
|
|
103
|
+
- 部署要身份(`taskSettings.hooks: false`)时,这些事件上客户端跑得了的条目同样不上请求体(引擎本来整份忽略)。`-p` 车道、不报本地事件的宿主与不传计划的 `hooksForWire()` 的请求体逐字节同 0.88.0。
|
|
104
|
+
- 插件条目:客户端报了型表(`shellHookTypesByEvent`)时,「客户端执行」只给它真能跑的型(例:客户端跑不了 agent 型 ⇒ 改判不跑、进「不会执行」清单);`promptAuthoredByUser: false` 时插件的 `UserPromptSubmit` 条目同样排除。端不交型表时插件判定同 0.88.0。
|
|
105
|
+
- 压缩前后两事件(`PreCompact` / `PostCompact`):引擎可能跑的设置条目(能力真而不确认引擎是本机自起 / 能力没读到)不判给客户端、照随请求发(`engine_unconfirmed`)—— 引擎在 run 中途自动压缩时只跑请求带来的 hooks,客户端的执行器没有机会先跑;客户端发起的压缩仍经跳过口 + `engineCompaction` 去重。引擎确定不跑的(能力 false / PowerShell 形)与本事件第五只起的 prompt / agent 条目(引擎在自动压缩里本来也超限不跑)客户端能跑就客户端跑(KL-368 / KL-369)。
|
|
106
|
+
- 「不会执行」清单(`hooksNotRunNotice`)多列设置来源判为不跑的条目(PowerShell 形 command;引擎整份忽略请求带来的 hooks 且客户端跑不了)。
|
|
107
|
+
- 🔴 可见变化:判给引擎的 hook 子进程看到的是引擎的环境(引擎白名单的基础变量、`CLAUDE_PROJECT_DIR` 与设置里的 `env`),不是客户端进程的环境;依赖本机环境变量的 hook 请把变量放进设置的 `env`(KL-370)。被引擎侧 `UserPromptSubmit` 拦下的主提交本版端上只见 `blocked` 终局 + 文字(KL-371)。端接上本端跳过口之前,本端执行器照旧跑,仍是两次;接了才一次。
|
|
108
|
+
8. **hooks 判定依据闭集**(CC-287;**§115 HK-6**):`PLUGIN_HOOK_REASONS` 13 → 19、`PLUGIN_HOOK_EXCLUSION_REASONS` 5 → 6(见 Added)。对 `PluginHookReason` / `PluginHookExclusionReason` 做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次。
|
|
109
|
+
9. **开发依赖引擎 `~7.37.1` → `~7.38.2`**(CC-282;构建期,不进运行期依赖):构建期生成的引擎事实表按 7.38.2 重生成,生成器自本版起另读引擎的通告铸方表与两只成因闭集(`task.user_steer_undrained` / `task.tool_turn_incomplete`)并与码册逐键对照,缺行即拒生成;7.38.1 / 7.38.2 相对 7.38.0 闭集零变化。引擎自 7.38 起把闭集数组写成冻结形(`Object.freeze([...])`),本包读口不就地改任何入参,对冻结与未冻结入参同答。
|
|
110
|
+
10. **只带 `instructions` 一段的 `wiring_manifest` 帧成臂**(CC-282 余项;**§115 IN-4**):0.88.0 把这样的帧投影成 `none / not_in_slice`(不出 chrome 事件),非流式回执读成 `unreadable`;本版出 chrome 事件 / 读成 `manifest`(那一段就是读数)。服务端 7.111.0 上,一条腿若在本包投影的十二段里只报了这一段,0.88.0 会整帧不出事件。连带的两处可观察变化见接入文档 §115a′ 第 8 条(print 车道名册判定口对这样的帧答 `no-roster`;一次性任务回落读提交回执时换一句拒用说明)。
|
|
111
|
+
11. **开发依赖 `@sema-agent/settings-schema` `^6.0.0` → `^7.0.1`**(CC-296;构建期,不进运行期依赖、不进 `peerDependencies`、不出包;**§115 TY-6**):本包 `src/` 对它零 import,7.0.0 删除 / 改形的 WorkerSpec 面(`runtime.sessionBackend` / `memoryBackend` / `db`、`coords.tidbHost` / `tidbPort` / `tidbUser`、`secretRefs.tidbPasswordEnv`、`remote-docker` 变体)在本包 `src/` 零读点;换钉只影响读该包产物的六道常驻门(`run-additive-key-passthrough-test.mjs` / `run-cloud-effective-projection-test.mjs` / `run-display-untrusted-projection-test.mjs` / `run-layering-shadow-export-test.mjs` / `run-model-capability-probe-test.mjs` / `run-plugin-hooks-projection-test.mjs`),换钉前后逐格同读,唯一可见差异是 `run-additive-key-passthrough-test.mjs` 的 G7v 标签里装着的 major 由 6 变 7;hook 条目必要字段判据所在的 `hooks.js` 两版逐字节相同。终端 1.0.141 先行把自己的依赖换到 7.0.x;G7v 判的是「本包装着的 major ≥ 终端在用的 major」,终端先升而本包不跟时这一格会红,本版换钉后恢复。门侧同批补两处对账(见下 Gates 的两条扩门):上游 hook 必要字段判据与本包判定逐值同答(G-HK29)、`@sema-agent/*` 声明的范围 / lockfile / 装着的版本四处一致(公面门 ⑤c)。
|
|
112
|
+
12. **通告事实读器与派发口的信封只认自有属性**(**§115 NM-7**;收紧方向):派发表里的每一只事实读器(此前各版已发的十六只 —— `readMcpInjectionDrop` / `readAskUnresolvable` / `readDurableGateUnavailable` / `readSkillsListingTruncated` / `readMcpServerRedialed` / `readReadRootGrantNotice` / `readInstructionsSourceChanged` / `readSessionRecordsSkipped` / 0.86.0 六只 / `readToolTurnRepaired` / `readModelUnreachable` —— 与本版两只)与 `readEngineNoticeFacts` 读通告的 `code` / `detail` 时,原型链上的同名键不再算在场 ⇒ `undefined`(此前派发口按属性访问读这两格、再交给读器,只在原型链上的信封经派发口照读出事实,直读器与派发口不同答);`providerRejectionResend` 读终局读数的 `detail` 同律。来自 JSON 的通告只有自有键,读数不变;按「`Object.create({ code, detail })` 读得出事实」写的测试作废。
|
|
113
|
+
|
|
114
|
+
### Fixed
|
|
115
|
+
|
|
116
|
+
- **展示出口:无标签的 `Token <值>` / `token <值>` 照遮**(CC-290;接入文档 **§115 DU-7 / DU-10**):`displayUntrusted` / `displayUntrustedMarks`(与本包合成终局行 / 结果帧 `errors[]` 共用的凭据面)此前只把 `token` 当**标签**认(要 `:` / `=`:`token=<值>`、`Token: <值>`),或只在 `Authorization:` 头值里当授权方案认;没有标签的方案词写法 —— `Token <值>`(`Authorization: Token <key>` 一族的头值单独出现时)、命令行 `--token <值>`、`{"auth":"Token <值>"}`、`MCP server failed: Token <值> rejected` —— 只有值本身是已知凭据字面形(`sk-` 前缀且随机段够长、`ghp_…` 等)才遮,`Token sk-l963-…` 一类原样上屏。本版 `token` 与 `bearer` / `basic` 用同一只方案词判法:同一组分隔(ASCII 与 Unicode 空白 —— 含不换行空格 / 表意空格 / 各宽空格 / 谚文填充 / 盲文空点 —— 不可见单元、换行)、同一只值扫描、大小写不分;紧跟在方案词后的普通英文词按放行表原样(`token` 那一张更宽:计量词、生命周期词、系动词 / 助动词、跨行后的句首词 —— `Token count: 1234`、`token expired`、`the token was rejected`、`OAuth token refresh failed: invalid_grant`、`token limit exceeded: 4096`、`Failed to refresh token\nPlease run /login again` 都原样);同一位置能按标签读的(`token:` / `token =` / `"token":`)仍按标签读,输出与上一版同字节。放行表外的词照遮(`token sidecar started` ⇒ `token «redacted:secret» started`、截短回显的值 `Invalid token abcdefgh…` ⇒ `Invalid token «redacted:secret»`、引号包着的放行词也是值 `token "count"` ⇒ `token "«redacted:secret»"`),方向是多遮(KL-382);地址路径以 `/token` 收尾后接三位 HTTP 状态码的日志行形(`POST https://auth.example/oauth/token 400 Bad Request`)原样放行,路径尾后跟别的值照遮;尖括号 / 括号包着的值是占位写法,两版都原样(KL-383);JS / JSON 解析器诊断(`token` 左邻恰是 `unexpected` 加一枚空格:`SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON`、`Unexpected token u in JSON at position 0`)整句原样,引号里的单元也不遮;`token indices` 在放行表里;凭据标签的值以 `token` 方案词起头(`"token": "Token https://h/<串>/x"`、`password: Token\u00a0https://h/<串>`)时外层标签整值遮,与 0.88.0 同字节(裸值形 `password: Token <值>` 两只记号并排);`token` 只给它自己的值加遮盖,不改标签与 `bearer` / `basic` 方案词的值怎么读 —— 外层值以别的字符起头再接 `token` 族方案词 + 非 ASCII 空白 + 地址(`Authorization: “Token\u00a0https://h/<串>”`、`` password=`Token\u3000https://h/<串>` ``)、`bearer` / `basic` 的值里接 `token` + 地址(`Bearer Token\u00a0https://h/<串>`、`Bearer “Token\u00a0https://h/<串>”`)、引号值里 `bearer` / `basic` 之后再出现 `token` + 地址(`password: "Bearer x Token https://h/<串>"`),一律与 0.88.0 同字节整值 / 整截遮;ASCII 空格分隔、不加引号的 `password: Token https://h/<串>` 两版都只遮 `Token`、地址按结构显示(既有形,KL-386);标签值写成「`bearer` / `basic` 方案词 + 地址」时地址的主机 / 路径原样显示(0.88.0 既有形,KL-386)。零新公面名。
|
|
117
|
+
- **地址片段里「值 + Unicode 空白 + 方案词 / 标签」的断法与 `,` / `;` 处同判**(CC-290 同批;**§115 DU-8**;只多遮;KL-384):带 scheme 的地址里,query / 片段的值后隔着 Unicode 空白再跟方案词 / 标签时,只有那一对的分隔是 ASCII 空白(值落在片段外)才让给词级面 —— 与 `,` / `;` 处同一只判据;分隔是不换行空格 / 表意空格 / `=`(`https://h/?a=1\u00a0Bearer\u00a0<值>`、`?a=1\u00a0token=<值>&b=2`)时值仍在片段里、按 query 整只遮(只开 URL 结构面的出口 `credentialWords: false` 上一版这几形原样)。
|
|
118
|
+
- **控制串跨行时一遍即落定**(CC-290 同批;**§115 DU-9**;只多遮;KL-385):控制串跨行时屏上读到的那一份内容另扫一次 —— `\u001bP<方案词 / 标签> \n\u001b]8;;h\u001b\` 一类在折平 / 转义形出口上上一版要洗两遍才落定(第二遍才遮 `8`),本版一遍到位,洗两遍 = 洗一遍(上一版同形,不是本版引入)。
|
|
119
|
+
|
|
120
|
+
### Gates
|
|
121
|
+
|
|
122
|
+
- 扩门 `scripts/run-engine-notice-catalog-test.mjs`(1193 → 1594 格,带新一代与老一代服务端夹具;CC-282 a–d):NM(码册 86 / 受众 / 派发表 / 删名)、TI(工具轮不完整读器)、UI(用户输入没被用上读器与四句;句口与两只读器的信封只认自有属性、follow-up 的保守句名词按 kind 取)新段;G-NM6 改写为就地写入自证(派发表每一码的全形 `detail` 深冻结后与未冻结的同答、未冻结入参读后逐字节不变;引擎包根的冻结闭集数组 96 只喂入全部读口一轮后仍冻结);服务端自铸码对账(IX)两代重写 + 自证;`E3-up` 否定半边加正控(修前尺子抽不出新形码册字面时恒真);常量表识别认 `Object.freeze` 形;G-NM7 —— 派发表每一码 × 四形(`code` / `detail` / 两者只在原型链上、`Object.prototype` 植入)派发口、直读器、句口同答 `undefined`。
|
|
123
|
+
- 扩门 `scripts/run-terminal-cause-projection-test.mjs`(375 → 443 格,带两代服务端夹具;CC-282 e):`PR` 段 —— `detail` 窄读(缺状态码整只丢 / 状态码非整数与越界 / `provider_rejected` 的状态码不在 400–599 整只丢 / 只读自有位 / 读属性就抛 / 扁平形不读 / 缺席时读数逐字节同 0.88.0、不出 `detail: undefined` 键)、`providerRejectionResend` 的状态分档与按档的句子(五档两两互异)、新一代 / 老一代服务端真铸点过境读数;G-PR3e —— `Object.prototype.detail` 植入合形服务商拒绝时判定口对缺席 / 空对象 / 表外 kind 仍答 `undefined`。
|
|
124
|
+
- 扩门 `scripts/run-selfheal-reopen-test.mjs`(704 → 711 格;CC-282 f):G18 —— 自愈 steer 腿「503 ∧ 该码 ⇒ 确知没送到」及其合取两半各一格(500 + 该码 / 无状态码 + 该码 / 503 + 别的码 / 码读不出都仍是送达未知),三选卡行文不再说「可能已送到」。
|
|
125
|
+
- 扩门 `scripts/run-wiring-manifest-projection-test.mjs`(219 → 296 格,带两代服务端夹具与 sdk 15.3.0 / 15.2.0 对拍;CC-282 余项):IN 段(G-IN1 – G-IN8)—— `instructions` 段在场原样冻结副本且不与入参共享引用、`selected:[]` 原样、缺席不折不补键、十四种坏形整段缺席、读取时抛按缺席(同帧别段照交)、只带这一段的帧成臂、成员开集原字节、不经投影口直喂适配层的内部臂再过同一只窄读、视图层与 chrome 臂两型键集相等;服务端 7.111.0 / 7.110.0 发布包真铸链(加载器陈述 → 租户面与 operator 面两只投影器 → 本包)逐字节同,7.110.0 无段;sdk 15.3.0 的事件臂声明可选 `instructions`、15.2.0 没有(夹具与探针树缺席时对应段标为未跑)。
|
|
126
|
+
- 扩门 `scripts/run-submit-wiring-manifest-test.mjs`(34 → 38 格;CC-282 余项):S7a – S7d —— 提交回执只带 `instructions` 一段 ⇒ `manifest`、`selected:[]` 在场、缺席无键、只有坏形 ⇒ `unreadable`。
|
|
127
|
+
- 扩门 `scripts/run-subagent-injected-wire-test.mjs`(155 → 184 格;CC-282 f / 余项):① 子代 steer 503 + 该码 ⇒ `not-delivered` 臂,500 + 该码与 503 + 别的码仍是 `error` 臂(→ 158 格);② MI 段(服务端 7.111.0)—— 成功结局 `messageId`:自有非空串才带,空串 / 数 / `null` / 布尔 / 对象 / 数组 / 原型链上的同名键 / 读取时抛都不带、不抛,回执体坏形走缺省句,`ok` / `receipt` 逐字节不变,注入 client 形与已装目标形同答;服务端 7.111.0 与 7.110.0 两代发布包真路由 × 开发依赖 sdk 与 sdk 15.3.0 两只真 client:7.111.0 的结局 `messageId` 与 200 回执逐字节同、与账本受理的是同一个值,7.110.0 回执无此键、子代转向不经账本、结局无此键;sdk 15.3.0 声明 `SubagentSteerReceipt.messageId?`、15.2.0 没有(→ 184 格)。
|
|
128
|
+
- 扩门 `scripts/run-approval-frame-keys-test.mjs`(139 → 241 格,带三代服务端夹具与新版 SDK 探针树;不带时夹具段与 SDK 对拍段标为未跑;CC-284):帧键镜像 31 → 33,两键按开发依赖 SDK 的锚登记为领先(退出条件:开发依赖 SDK 含这两键的那一版);新版 SDK(≥ 15.2.0)帧键锚与镜像两向相等、卡键锚新增的两键都已在卡入参上;问类两位腿 —— 帧腿在场原样冻结、半对 / 首员不符 / 重复员 / 空数组 / 非串员 / 空串员 / 非数组 / 稀疏 / 原型链上的键或员一律两位都不带、开集词与非规范序原样;耐久待决行腿与座位过境口同判、座位门不为这两位拒整条请求;门记录两臂读法不变;三代服务端夹具真铸点(运维队列行投影 / 出帧处的成对窄读 / 建卡 → 信封 → 重放帧;两代新服务端另走内嵌引擎自己的分类与盖章口)经 JSON 过境后两条卡腿与卡面逐字同服务端交出形:老一代(7.108.0)缺席、首铸代(7.109.0)在场且不重排、规范序代(7.110.0)重排后的序 / 服务端拒了的形缺席。
|
|
129
|
+
- 扩门 `scripts/run-mandated-card-values-test.mjs`(41 → 47 格;CC-284):夹具内嵌引擎 ≥ 7.37.0 时盖章口要引擎自己的分类作参数(修前换到服务端 7.109.0 / 7.110.0 夹具本门在构造期就抛);四类强制卡与普通名单卡上引擎盖的问类两位,经服务端投影后两条卡腿逐字同。
|
|
130
|
+
- 扩门 `scripts/run-live-pending-ask-test.mjs`(92 → 97 格;CC-284):待决行整帧带一对 ⇒ 帧腿卡入参带同值两位;行顶层凭空一对不长出卡位;帧上半对两位都缺席;盲卡形如实缺席。
|
|
131
|
+
- 新门 `scripts/run-disable-skills-wire-test.mjs`(93 格,带两代服务端夹具;CC-277,包侧投影门):构造器(车道表一行 / 三车道 × live 两态 / `false` 与缺席 / 坏值句不回显值〔已撤销代理也只报形状〕/ 与非空 `skills` 或带技能的 `agents` 冲突按名拒 / live 兜底层同判)、片段口五态(真 / 没报 / 假 / 没读到 / 读不懂)、新一代受理面对「`disableSkills:true` + 非空 skills」的 400 与老一代对未知键的 400 两条夹具腿、不带这一键的装配 / 回执 / 座位读数 / 出口判官读数对 0.88.0 发布产物逐字节同(sha256)。
|
|
132
|
+
- 扩门 `scripts/run-task-request-omission-receipt-test.mjs`(535 → 573 格;CC-282 g / CC-277):成因词 4、上游无对位 3 键、车道表 46 行、逐键判别式 48 格 × 车道 3 × live 2;整句 === 前导 + 成因从句、表外 / 异形入参一律落兜底从句不抛、src 里整句字面量零处;四句与兜底句对 0.88.0 发布产物金样逐字节同;终端从句对照读数(终端词集与本包短语逐字不同,预期)。
|
|
133
|
+
- 扩门 `scripts/run-plugin-hooks-projection-test.mjs`(225 → 293 格,`SEMA_SERVER_ROOT` 指向引擎源码树时 295 格;CC-287 / CC-296):H 段 —— G-HK0 穷尽矩阵(设置来源 × 事件 × 型 × 引擎能力 × 自有 × 端形〔含「只报事件、不交型表」〕× 非用户所写 × 压缩〔没交 / 压了 / 没压 / 引擎自动压缩〕,共 2520 份计划,逐格按服务端执行语义 + 本端执行器模型求「这一次一共跑几次」:两边任一真能跑 ⇒ 恰 1、被排除或两边都跑不了 ⇒ 0;引擎自动压缩那一列只有请求体上的条目能跑;能力没读到 × 引擎其实不跑 × 客户端发起、引擎压了的 48 格按 KL-369 取舍期望 0、单独计数;修前 168 格不符)、压缩两事件四形留在请求体与确定理由两形照旧本端跑(G-HK0c / G-HK0d / G-HK0e)、跳过口与计划两只数组的行只认自有属性〔整行与单个键在原型链上各有格〕且本端组读抛不外抛(G-HK27 / G-HK27d)、六键计划照认(G-HK28)、只报事件时设置来源 prompt / agent 照投(G-HK0b)、判定与依据词(G-HK1 – G-HK12 / G-HK14 – G-HK23b)、必要字段坏形不判定(G-HK24)、设置来源条目的承重字段与已装上游受理面逐值同答(G-HK29,CC-296:`command` / `http` / `prompt` / `agent` 四型 × 十二种取值 48 格,期望由已装 `settings-schema` 的 `HooksConfig.safeParse` 现算,上游拒 ⇔ 本包不判定;此前坏形表是手写的、只对本包一侧断言,上游把「非空串、不含 NUL」放宽或收紧一个字节没有任何一格会红;读不到上游契约时这一格标为未跑)、计划两只新数组的坏行(G-HK25)、跳过口 matcher 五形同键(G-HK26)、同条目不同 matcher 各占一位(G-HK8d)与判给本端的 LLM 条目不占引擎位次(G-HK8e)两格(位次的粒度与去重键的粒度)、新一代 / 老一代服务端发布版执行入口夹具(G-HK13:判给引擎的条目计数文件恰 1 行,修前 2 行)、包内每事件 LLM 条目上限与引擎源码及夹具执行器一致(E4)、六键 / 八键计划经投递口 + 跳过口每只恰 1 且计划两位只认自有键(G-HK30 / 30b / 30c / 30d)、客户端组 / 条目是类实例或 `Object.create` 出来的 × 三事件恰 1(G-HK31)、压缩两事件上超限的 prompt / agent 条目 144 份计划 864 格无「谁都不跑」(G-HK0f / 0f-2)。
|
|
134
|
+
- 扩门 `scripts/run-public-surface-test.mjs`(101 → 110 格;CC-296):⑤c —— `package.json` 里每条 `@sema-agent/*` 声明(`dependencies` / `devDependencies` / `peerDependencies` 各自在场的,今天 6 条)四处一致:范围串与 lockfile 根记录的同字段范围串同串、lockfile 里该包的版本满足该范围、`node_modules` 里装着的版本与 lockfile 里的版本一致。此前只比 `@sema-agent/sdk` 一个包:换钉时把范围写回旧值、或装着的不是 lockfile 记的那一版,这道门都是绿的,而装着的那一版正是读该包产物的各门的真实输入。范围写法只认 `^` / `~` / `>=` / 精确四形,认不出 ⇒ 工具坏了(exit 9)、不给产品判词;判据自证两格(范围满足判定的正反例、四处一致判定对伪造样本会说话)与声明条数下限一格。
|
|
135
|
+
- 扩门 `scripts/run-read-credential-refusal-projection-test.mjs`(30 → 52 格,带 sdk 15.x 两代探针树;缺 15.0.0 一代 48 格、两代都缺 44 格;CC-289):C 段 —— 公面判官与包内两处读口是同一只函数、判表逐行同答、三处同答(后台视图 fleet 源 ⟺ 公面判官)、sdk 三代(12.0.1 / 15.2.0 / 15.0.0)由 401 体造出的认证错误对象公面判官答 `true`、身份类两码 / 403 / 407 答 `false`;缺席的一代打 `SKIPPED-SECTION`(`SEMA_SDK15_ROOT` 钉 15.2.0、`SEMA_SDK15_ROOT_OLD` 钉更老的探针树,冒号分隔可多个)。
|
|
136
|
+
- 扩门 `scripts/run-client-core-pure-test.mjs`(→ 4159 格):帧键镜像 33 项;steer 账本 503(G-SL1 / G-SL2 两代 sdk 错误工厂 / G-SL5 其余八码逐字节同 0.88.0〔表外码 4xx 上同 0.88.0 原句〕/ G-SL6 三条 steer 腿对同一抛出物九形逐格同答 / G-SL6b 表外码 × 状态码与 `statusCode` 拼法八形三腿同答)。
|
|
137
|
+
- 扩门 `scripts/run-registry-test.mjs`(③d):棘轮账对**上一发布 tag** 比前缀(此前只对上一次提交比 —— 新账插在旧账之前、提交之后就看不出);取不到 tag 时打 SKIPPED-SECTION;判据正控 +1(新账插到中间)。
|
|
138
|
+
- 稳定门修补(换钉引擎 7.38.x 后同形红的识别):`run-gate-vocabulary-test.mjs` / `run-retired-vocabulary-census-test.mjs` / `run-auto-mode-unavailable-test.mjs` 对引擎闭集数组的读法认 `Object.freeze([...])` 形(判据不变);`run-upstream-tables-test.mjs` 的生成物对账带通告铸方表一行(与码册逐键对照)。
|
|
139
|
+
- 扩门 `scripts/run-display-untrusted-projection-test.mjs`(479 → 541 格;CC-290):H 段 —— 终端给的字节判据(`Token <值>` 不含值 ∧ 含 `«redacted:`)/ 坐实的十形 / 普通英文散文逐句不洗(与凭据两网全关的同选项出口逐字节同)/ 邻形族 / 出口族 / 同位置能按标签读的仍按标签读 / 现状钉(KL-382 表外词多遮、KL-383 尖括号值不认)/ 一轮即不动 / 屏上视图认出的控制串内容同扫 / `/token` 路径尾 + 三位状态码放行 / 引号包着的放行词照遮 / 解析器诊断 `Unexpected token X` 与 `token indices` 原样、`unexpected` 不是左邻时照遮(H13)/ 凭据标签的值以 `token` 方案词起头整值遮(复现三形 + 差分门 N3 原 9 格 + 自造 21 形金样;`bearer` / `basic` 字节不动;H14)/ `token` 只给自己的值加遮盖 —— 外层值以别的字符起头、`bearer` / `basic` 的值里、引号值缝里的 `token` + 非 ASCII 空白 + 地址十形机读口逐字节 = 0.88.0 且全出口不露,ASCII 空格不加引号的既有形回归(H15)。
|
|
140
|
+
- 扩门 `scripts/run-display-untrusted-baseline-diff-test.mjs`(差分池 135923 → 143410 串,20 格不变;CC-290):最小形池另收外层标签 / `bearer`·`basic` 值 × 前缀字符 × `token` 族 × 非 ASCII 空白 × 地址与引号值缝里 `bearer` 之后 `token` + 地址两族 1272 串(带角色进 B1;修前对 0.88.0 凭据位 10368 格);对 0.88.0 发布产物,「上一版遮、本版露」凭据位 0 格、非凭据位 0 格;洗两遍 ≠ 洗一遍 0 / 2007740 格;到改写次数帽 0 / 717050 格。
|
|
141
|
+
- 登记物:根公面基线 1372 → 1379(+8 −1);测试钩 62 不变;超集台账 `docs/type-superset.json` 98 → 99 条(`_sema_instructions`);门清单 `scripts/gates-manifest.json` 171 → 172 条(新门 `disable-skills-wire`),README「Guards」与负控文档由生成器同批重写;`docs/KNOWN-LIMITS.md` KL-357 … KL-390 新增、KL-179 / KL-329 / KL-332 / KL-333 销;退役登记 RL-15 销(`SERVER_NOTICE_AUDIENCE`)。
|
|
142
|
+
|
|
143
|
+
### Known limits(本版新增)
|
|
144
|
+
|
|
145
|
+
- 通告 / 终局 / steer(CC-282):服务端重启后补发的「用没用上不知道」那一句不能说得更确定(KL-362);引擎 7.38.0 之前的 steer 未用上通告落保守句(KL-363);引擎 7.39.0 预告的子代上报位本版不读(KL-364);服务端 < 7.110.0 不把 `task.tool_turn_incomplete` 放上会话流(KL-365);「改了重发」只读状态码(KL-376);自愈三选卡用户形 steer 腿撞账本 503 时行首措辞仍说引擎(KL-377);码被剥且 sdk < 15.2.0 时专类认不出(KL-378);省略成因 `other_channel` 的从句接在端的「没发出去」之后不逐字真(KL-359)。
|
|
146
|
+
- 审批问类(CC-284):不判成员、不重排(KL-360);带重复员的一对整对丢,比服务端 7.109.0 严(KL-361)。
|
|
147
|
+
- `disableSkills`(CC-277):能力位没读到时第一条请求不关技能(KL-357);与带技能的 agent 定义同交按名拒、本包不替宿主剪(KL-358)。
|
|
148
|
+
- hooks(CC-287):自行嵌入且不给 hook 载体的宿主上 prompt / agent 型设置 hook 静默不跑(KL-366);连非自有 / 远端引擎时只有引擎触发的事件与压缩前后两事件上的设置 hook 在那台机器上跑(KL-367);第五只起的 prompt / agent 条目客户端跑不了时判未确认、跑得了时(压缩两事件同)由客户端跑(KL-368);压缩前后 hook:引擎可能跑的设置条目照投,客户端发起的压缩依赖端交「引擎这次压没压」,能力没读到而引擎其实不跑时那一次谁都不跑(KL-369);判给引擎的 hook 看不到本机终端的环境变量(KL-370);引擎跑的 `UserPromptSubmit` 注入的上下文没有单独一行、被它拦下的主提交只显示 `blocked`(KL-371);端不交型表时设置来源的 prompt / agent 一律交引擎、客户端不跑(引擎这一次不跑时客户端本可跑的 prompt 也不跑;KL-372);端派发前按现算计划做减法的接缝(KL-373);`once` 按任务计(KL-374);`/goal` 的 Stop 钩子与上限 / 跳过口索引(KL-375)。
|
|
149
|
+
- 凭据被拒判官(CC-289):码这一位读取时抛错的手造异常对象按「无码 401」答 `true`(KL-379)。
|
|
150
|
+
- 服务端 7.111.0 两项(CC-282):`instructions.selected` 按开集原字节交(KL-380);子代转向 `messageId` 只原样交、不做关联(KL-381)。
|
|
151
|
+
- 展示出口(CC-290):`token` 方案词后放行表外的词 / 数字 / 反引号变量名 / 截短回显的值多遮一个词(KL-382);尖括号 / 括号包着的值不认(KL-383);只开 URL 结构面的出口里 URL 片段在「Unicode 空白 + 方案词 / 标签」处的断点并入 `,` / `;` 那一只判据,全开出口上方案词 / 标签名并进 query 记号(KL-384);屏上视图认出的控制串内容另扫一次(KL-385);标签值写成「`bearer` / `basic` 方案词 + 地址」时地址的主机 / 路径原样,ASCII 空格分隔、不加引号的 `password: Token https://…` 两版同样显示路径(KL-386)。
|
|
152
|
+
- 既有读法(0.88.0 同,本版不改):失败终局因由的 `code` / `kind` 与插件判定行字段按属性访问读,原型链上的同名键算在场(KL-387);steer 抛出物的状态码 / 码位是读它就抛的取值器时读取错误原样抛出(KL-388);hooks 跳过口客户端一侧按属性访问读,`Object.prototype` 上放着组 / 条目字段名(如 `matcher`)时认不出已发出(KL-390)。
|
|
153
|
+
- 登记物按既定裁定改窗(本版对这些物零改动):同名影子对账门的过渡表里,终端投递事实两只同名读口(`promptKnownUndelivered` / `withoutUndeliveredPrompts`)期限 0.89.0 → 0.90.0 ——下一个 minor 在账本对象上出同判的两只方法,终端改调方法后删包装,这两行随删;十行基线存量的复核期 0.89.0 → 0.91.0(终端排在下一版一次清);过渡物退役登记四行的复核期 0.89.0 → 0.91.0(退役条件未满足)。
|
|
154
|
+
- 完整台账见接入文档 §115 末行「包侧缺口」。
|
|
155
|
+
|
|
156
|
+
## 0.88.0(2026-10-02)
|
|
157
|
+
|
|
158
|
+
> 主题:**minor** —— 十票同发(按票序)。① **展示出口凭据面一次扫描**(CC-247):`displayUntrusted` / `displayUntrustedMarks`(与本包合成终局行 / 结果帧 `errors[]` 铸点共用的凭据面)此前是几张识别网**串行改写同一份文本、再洗到不动点**;本版改为在一份只读的判别视图上一遍收齐全部候选(URL 结构 / 无 scheme 的 userinfo / 标签与方案词的值 / PEM 块 / 参数表 / 已知凭据字面形 / 控制串内容),按写死的优先序归并、落地;带凭据的输入在出口内部对落地结果再过一遍,到输出不再变为止(按改写遍数计、帽 8 次;实测遍数(含确认输出不再变的那一遍):差分门的随机 / 穷举 / 文法池与两条已知构造链至多 3 遍,非定向的自造文法串也见到 4 遍(门池收了一只),定向搜索构造的串至多 6 遍,都在帽内;干净文本一遍、逐字节同),一轮即不动对**帽内收敛的输入**由这只循环保证(定向构造可让改写遍数随长度增长;到帽交最后一次改写的输出,再过一遍只多遮不多露;KL-355)。带凭据的输入上输出字节变(凭据位上「多遮 / 记号位置变」,非凭据位上几形少遮);对上一发布产物做五池 × 十五出口全池差分,凭据位(= 本包认得的凭据标签 / 方案词的值位,与 URL 结构位:userinfo / query 值 / 片段)上「上一版遮、本版露」为 0(射程:差分门五池与门内追加的最小形之内;池外仍有上一版遮、本版原样的几形,逐形见 Known limits 口令禁字一条;本包铸点洗过再经展示出口的复合路径另见 KL-317)。② **崩溃收敛 `cause` 认第二个词 `shutdown_before_park`**(CC-218):服务端 7.108.0 起,有序关停截断了一条还没闭的腿时照列收敛行,修前这些行整行计入 `dropped`,本版照常分桶;同版服务端对未被追踪腿的 pending 孤儿改给 `resumeSafe:false`(本包零代码,分桶读数随之变)。③ **`server.model_unreachable` 用户面通告入册**(CC-270 ①):服务端自铸码受众表 +1 行(user)+ 事实读器 `readModelUnreachable`,修前按受众分发的端看不到它。④ **开发依赖换钉引擎 `~7.36.0` → `~7.37.1`**(CC-272):构建期事实表按 7.37.1 重生(通告码册 +1 `context.tool_turn_repaired`,运维面)、放行原因闭集镜像 `GATE_MODE_RELEASE_REASON_WORDS` 与判词谓词 `isGateModeReleaseReasonWord`、修复通告事实读器 `readToolTurnRepaired`。⑤ **会话所有者自助记忆抹除**(CC-264):调用口 `eraseSessionMemory` + 结局判定口 `sessionMemoryEraseOutcome` + 三只闭集镜像。⑥ **registry 写冲突的两种 409 分得开**(CC-280):`classifyRegistryConflict` / `isScopeGoneError`。⑦ **请求装配认得 `requireExistingSession`**(CC-281):车道表 +1 行 + 被拒读口 `requireExistingSessionRefusalFromError` 与一句 `requireExistingSessionRefusalContent`。⑧ **投递事实判定归包**(CC-271):提交事实账本 `createPromptDeliveryLedger` + 两只按消息行的读口;判据 = 引擎为这次提交**建了 run**。⑨ **plan 决断台账**(CC-278):被离门证据结掉、还没被投递口认领的那一笔登记,由随后到达的投递口认领原笔(不另铸刻度)。⑩ **`wiring_manifest` 帧的 `fileHistory` 段**(CC-279):这条腿捕不捕文件历史,可选成员 + 超集键。**为什么是 minor**:十六只新顶层导出;`CrashConvergedRow.cause` 型联合 +1 词、`EngineNoticeFactsCode` +2 员 / `EngineNoticeFacts` +2 臂(对它们做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次,见 Changed 第 2 / 5 / 6 条);`WiringManifestChromeEvent.fileHistory?` / `WiringManifestView.fileHistory?` / `TaskRequestInput.requireExistingSession?` 三只可选位(对构造方 additive);展示出口输出字节、`SERVER_NOTICE_AUDIENCE` 行数、通告码册长度、`latestPlanReviewDecisionMark` 刻度等**已发导出的可观察变化**在 Changed 逐条单列(写明谁要跟)。型面 BREAKING 零处(对构造方)。根公面运行期导出 1356 → 1372(+16);测试钩 62 不变;公面类型名 922 → 942(+20);超集键 +1(`_sema_fileHistory`);零新投影臂(chrome `wiring_manifest` 臂多一只可选成员);请求装配车道表 44 → 45 行;`ENGINE_NOTICE_CODES` 80 → 81;`SERVER_NOTICE_AUDIENCE` 三行 → 四行;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.36.0` → `~7.37.1`(构建期,不进运行期依赖)。
|
|
159
|
+
|
|
160
|
+
### Added
|
|
161
|
+
|
|
162
|
+
- **`readModelUnreachable(notice)`** ⇒ `ModelUnreachableFactsView | undefined`(CC-270 ①;接入文档 **§114 MU-2**):服务端 7.108.0 起,一条 run 腿上某次模型调用以错误收场、且它最后一条请求在**建连**时就失败了(拒连 / DNS / 建连超时 …)时,给这条腿的用户发一条 `engine_notice`,码 `server.model_unreachable`(每腿每目标一次)。读器交出五位:`code`(建连失败的底层码,服务端今天六词:`UND_ERR_CONNECT_TIMEOUT` / `ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `EHOSTUNREACH` / `ENETUNREACH`;开集原样透传)、`targetHost`(够不着的模型端点 `host:port`)、`proxyInUse?`(这一跳走了代理时代理取自哪个环境变量 —— 只是**变量名**;直连缺席)、`remedy`(服务端给的一句补救话,原样)、`sessionId`。`code` / `targetHost` / `remedy` / `sessionId` 任一读不出(只认 `detail` 的自有属性,原型链上的同名键不算)⇒ 整只 `undefined`;`proxyInUse` 读不出只省这一键。每一位恰读一次,读点不抛。按码派发口 `readEngineNoticeFacts` 同批多认这一码(`audience: 'user'`)。本包不抄服务端的通告句与补救句 —— 要渲给人时用服务端给的 `message` / `remedy` 原句。
|
|
163
|
+
- **放行原因的闭集镜像**(CC-272;**§114 RR-1**):`GATE_MODE_RELEASE_REASON_WORDS`(冻结数组,今天一词 `rule_unreadable`)就是构建期从引擎包入口生成的那张表本身(不手抄);`isGateModeReleaseReasonWord(v)` 答「这个词本版认不认得」,与引擎自己的成员判定逐值同答;成员型 `GateModeReleaseReasonWord` 由同一张表派生。🔴 它们只给端判词:`gateOutcomeOf` / `gateModeRelease` 读出的 `released.reason` 仍按开集透传 —— 比本包新的引擎加的词原样带回,不折成 `rule_unreadable`、不丢、不让整只放行账缺席;谓词对它答 `false`,端原样显示或走通用句。
|
|
164
|
+
- **`context.tool_turn_repaired` 的事实读器 `readToolTurnRepaired(notice)`**(CC-272;**§114 TT-2**)⇒ `{ repairs: [{ form, toolCallIds }], sessionId, runId } | undefined`,挂进 `readEngineNoticeFacts`(受众 `operator`)。`form` 按开集透传(引擎今天四词 `trailing_text` / `late_result` / `missing_result` / `duplicate_result`;引擎没有从包入口导出这张词表);`toolCallIds` 是引擎的调用 id、按调用序、非空。`repairs` 缺席 / 空表、任一条读不出(`form` 非空串、`toolCallIds` 非空的非空串名单)、`sessionId` / `runId` 缺席 ⇒ 整只 `undefined`(半张修复清单比没有更坏);只认自有属性、每格只读一次、永不抛;名单与每一条都冻结。
|
|
165
|
+
- **会话所有者自助记忆抹除:调用口 `eraseSessionMemory` + 结局判定口 `sessionMemoryEraseOutcome`**(CC-264;**§114 SE-1 … SE-6**):
|
|
166
|
+
- `eraseSessionMemory({ sessionId, requestId, allowUnevidenced? }, wire, opts?)` 发**一次** `POST /v1/sessions/:id/memory/erase`(不重发:5xx / 429 / 503 同样只发一次),交回传输层事实 `SessionMemoryEraseAnswer`:`not_sent`(可证一个字节都没送出:入参坏 / 没有可用连线或连接阶段就失败 / 调用前已取消)、`answered`(HTTP 状态 + JSON 体)、`no_answer`(可能已送到、没拿到可读答复:截止 / 连接中途断 / 发出之后取消 / 说不出没送出)。永不抛。
|
|
167
|
+
- 体由本包新铸:恰好 `{ requestId }`;调用方对象**自有**的布尔 `allowUnevidenced` 才带上(原型链上继承来的不算),缺席时**不补** `false`;调用方对象上别的键(包括 `select`)一个都不上 wire。`requestId` 由宿主铸(一次抹除动作 × 一个会话一只),本包不铸、不改、不去空白。会话 id 是 `.` / `..`、或含未配对的代理码元(路径段编码不了)时本地拒、零请求(URL 解析会把点段吃掉,请求会被改投到别的路径)。
|
|
168
|
+
- `wire` 是与 `makeEngineWireClient` 同一份的连线配置(`baseUrl` / `token`〔串、每发读一次的取值函数、或 `{ mode: 'same-origin-relay' }`〕/ `principal` / `timeoutMs`〔缺省 60 s〕/ `fetchImpl`);出站头与 `makeEngineWireClient` 造的 client 逐字节同(凭证三态、principal 归一、浏览器宿主里带凭证的形不发、同源中继形零 `Authorization`)。已装目标(`EngineWireTarget`)直接可用。凭证不进答复、不进结局、不记日志。
|
|
169
|
+
- `sessionMemoryEraseOutcome(answer)` 是纯函数,结局闭集四档:`erased`(收执 `status: "complete"`)/ `partial`(`"partial"`)/ `refused`(**确知什么都没抹**:没送出,或引擎在门序里 / 改动之前按具名码拒)/ `unconfirmed`(**说不清抹没抹**:没答复、收执读不出或不是这一次的、一码两义的拒、未分类的拒、没有引擎机读码的非 2xx)。每档带一句单源英文人话 `text`(拒档恒以 `Nothing was erased` 起头,没法确认档恒以 `Not confirmed` 起头;不复述服务端原句)与重发姿势 `retry` + `retryText`(七值闭集:`not_needed` / `same_request_id` / `new_request_id` / `needs_operator` / `needs_consent` / `human_decision` / `pointless`)。引擎答了时带 `status` / `errorCode`(诊断用)。已抹 / 部分两档带收执(`readMemoryEraseReceipt` 的读数,数几条走 `memoryEraseCounts`)。永不抛,读不了的入参落 `unconfirmed`,绝不落「没做」。
|
|
170
|
+
- 三只冻结闭集镜像:`SESSION_MEMORY_ERASE_REFUSAL_REASONS`(12)/ `SESSION_MEMORY_ERASE_UNCONFIRMED_WHYS`(9)/ `SESSION_MEMORY_ERASE_RETRIES`(7)。两代服务端逐码 → 档见接入文档 §114a-2(服务端 7.108.0 起把三只 409 与控制面 500 逐码转发;更老的服务端同四形落 500 `internal.error` ⇒ `unconfirmed` / `engine_fault`,如实,不是本包少认)。
|
|
171
|
+
- **registry 写冲突的两种 409 分得开**(CC-280;**§114 RC-1 … RC-3**):registry 的配置写门 / 回滚门在同一个 HTTP 409 上答两件相反的事 —— 普通的乐观锁冲突(重读、改基线、再写一次即可),与「写的目标空间在途中被删、或删了又同名重建」(机器码 `scope_gone`:什么都没写;重读读到的是替身空间,原样重发会把旧草稿写进一个没人审过的空间)。`classifyRegistryConflict(status, body)` 返回三词闭集 `RegistryConflictClass` —— `'gone'`(409 且机器码是 scope-gone)/ `'conflict'`(其余任何 409)/ `'none'`(不是 409),与新版 SDK 子路径里的同名函数同名同形、逐例同答(机器码读法三步:`errorCode` → 对象形 `error.code` → `error` 串)。`isScopeGoneError(err)` 对 catch 到的错误答布尔:带原样响应体的 registry 错误按体判,新版 SDK 的两只 scope-gone 错误类按类名 + 409 认;本包不出错误类。本包支持的 SDK 版本(peer `>=12.0.1`)上没有这两名,所以是包内实现而不是转口;peer 地板不动。「逐例同答」的射程是 JSON 解析出来的体;与 SDK 刻意不同的两处都只在宿主自造的对象上出现:① 409 上读不出机器码(体上取值器 / 代理抛)时不抛、答 `'gone'`(停下不重发的那一边);② 体上的取值器每次读答不同时,本包每一位只读一次、按那一次读数判,SDK 同一位读多次,两边可能不同答。`isScopeGoneError` 对新版 SDK 的两只错误类按类名认,类名被打包器改写或子类改了 `name` 时判不出(答 `false`;KL-339)。`'conflict'` = 「不是 scope-gone 的 409」,不等于「重试必过」。
|
|
172
|
+
- **请求装配认得 `requireExistingSession`**(CC-281;**§114 RE-1 … RE-3**):`TaskRequestInput.requireExistingSession?: boolean`(型取自 SDK `TaskRequest.requireExistingSession`):`true` = 只续已有会话,会话不在时服务端在任何东西跑起来之前拒,而不是静默新开一个同 id 的空会话。车道表 +1 行:interactive / print 有座、live 门后;utility 无座(那条车道每次提交都用自己的独立会话 id)。本层只发字面 `true`(`false` 与缺席同义、不发、不进回执);非布尔坏值装配期拒;`true` 而 `sessionId` 缺席 / null / 空串 / 非串 ⇒ 装配期按名拒(错误文本写明「没有可续的会话」),不留给服务端。
|
|
173
|
+
- **「只续已有会话」被拒的读口与一句话**(CC-281;**§114 RF-1 / RF-2**):服务端对这一键的两种拒绝(会话不在 ⇒ 404;要求续却没给会话 id ⇒ 422)今天都不带专属码 —— wire 上 `errorCode` 是按状态补的通用码(`not_found.resource` / `request.unprocessable`),专属码只出现在消息末尾的括注 `(resume.session_not_found)` 里;引擎侧同步提交那一形带专属码、404。`requireExistingSessionRefusalFromError(err)` ⇒ `{ code, form: 'session_not_found' | 'session_id_missing' } | null`(三形都认;子代续跑面同码的 409 不归它);`requireExistingSessionRefusalContent(detail)` 两形各一句(都说明没有新开会话),表外形给两形都为真的通用句。
|
|
174
|
+
- **投递事实判定归包**(CC-271;**§114 PD-1 … PD-3**):`createPromptDeliveryLedger()`(提交事实账本出厂口)、`promptKnownUndelivered(ledger, message)` / `withoutUndeliveredPrompts(ledger, messages)`(按消息行的两只读口);型 `PromptDeliveryLedger` / `PromptDeliveryRecord`。账本两只**只增不删**的集合(attempted / delivered),按消息 uuid 记、一次记整批:`attempted(batch)` 记在提交路径第一拍,`deliveredByFrame(batch, event)` 吃引擎流上的原样 `AgentEvent`,`deliveredBySteerReceipt(batch, outcome)` 吃 409 自愈结局;`isAttempted` / `isDelivered` / `knownUndelivered`(= attempted ∧ ¬delivered)/ `batchOf` 四只查询;`toRecords()` / `fromRecords(records)` 的记录形 `{u, s:'a'|'d'}` 逐行 JSON 可落盘、可读回。判据:引擎为这次提交**建了 run** 的帧才算交出去 —— 🔴 409「会话已有在跑的 run」那一帧不算;**durable 腿流首帧 `meta`、开流审批卡 preamble 重放(`approval_request`)与撤卡帧(`approval_revoke`)也不算**(服务端在建 run 之前就写它们,会话被占时 409 帧跟在它们后面);拒收之后自愈把消息递进在跑 run、处置分类为 `handed-off` 的结局算。没走过提交路径的行两判皆假(不知道)。每个写口返回本次新增的记录。零 IO、零文案:提交批怎么从自己的消息表里划、落盘、渲染归宿主。
|
|
175
|
+
- **`wiring_manifest` 帧的 `fileHistory` 段**(CC-279;**§114 FH-1 … FH-3**):`WiringManifestChromeEvent` / `WiringManifestView`(非流式提交回执 `readSubmitWiringManifest` 同一张)多一只可选成员 `fileHistory?: string` —— **这条腿捕不捕文件历史**,今天两词 `"on"` / `"disabled"`,开集原字节透传(第三个词原样交给端,按未知处理)。帧上该键是**自有**非空串才在场;非串 / 空串 ⇒ 段缺席(与服务端上 wire 前丢键同尺);原型链上的同名键不算。🔴 缺席 = 老服务端 / 老引擎 / 外部 derive 没报,不折 `"disabled"`、也不当「在捕获」;`"disabled"` 也**不等于**「不能还原」(部署捕获位关时已存历史照常服务还原;部署形看能力位 `fileHistoryCapture`,本位答的是这一条腿)。内部臂超集键 `_sema_fileHistory`。只此一段的帧也成臂(修前整帧 `not_in_slice`)。子流帧照旧断闸。0.85.0 起登记的「这一段不投」(KL-245)收口。
|
|
176
|
+
- 公面合计:根入口运行期导出 +16(CC-270 ① `readModelUnreachable`;CC-272 `GATE_MODE_RELEASE_REASON_WORDS` / `isGateModeReleaseReasonWord` / `readToolTurnRepaired`;CC-264 `eraseSessionMemory` / `sessionMemoryEraseOutcome` / `SESSION_MEMORY_ERASE_REFUSAL_REASONS` / `SESSION_MEMORY_ERASE_UNCONFIRMED_WHYS` / `SESSION_MEMORY_ERASE_RETRIES`;CC-280 `classifyRegistryConflict` / `isScopeGoneError`;CC-281 `requireExistingSessionRefusalFromError` / `requireExistingSessionRefusalContent`;CC-271 `createPromptDeliveryLedger` / `promptKnownUndelivered` / `withoutUndeliveredPrompts`);测试钩不变;公面类型名 +20(`ModelUnreachableFactsView`;`GateModeReleaseReasonWord` / `ToolTurnRepairedFactsView` / `ToolTurnRepairView`;`SessionMemoryEraseWire` / `SessionMemoryEraseCall` / `SessionMemoryEraseOptions` / `SessionMemoryEraseSent` / `SessionMemoryEraseNotSentWhy` / `SessionMemoryEraseJson` / `SessionMemoryEraseAnswer` / `SessionMemoryEraseRefusalReason` / `SessionMemoryEraseUnconfirmedWhy` / `SessionMemoryEraseRetry` / `SessionMemoryEraseOutcome`;`RegistryConflictClass`;`RequireExistingSessionRefusalForm` / `RequireExistingSessionRefusalDetail`;`PromptDeliveryLedger` / `PromptDeliveryRecord`);`CrashConvergedRow.cause` +1 词;`EngineNoticeFactsCode` +2 员;`WiringManifestChromeEvent` / `WiringManifestView` +1 可选成员;`TaskRequestInput` +1 可选位;超集键 +1。
|
|
177
|
+
|
|
178
|
+
### Changed
|
|
179
|
+
|
|
180
|
+
🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §114a′ 改锚)**:
|
|
181
|
+
|
|
182
|
+
1. **展示出口的凭据面输出字节**(CC-247;**§114 DU-1 … DU-6**):`displayUntrusted` / `displayUntrustedMarks` 与本包合成终局行 / 结果帧 `errors[]` 上的凭据洗法,在下列各类带凭据的输入上与上一版字节不同(每类一例;`<口令>` / `<值>` / `<尾>` 代表凭据样的字串;干净文本逐字节同、全部出口一轮即不动 —— 带凭据的输入由出口内部的不动点循环在帽内保证(按改写遍数计、帽 8 次;实测遍数(含确认那一遍):差分门的随机 / 穷举 / 文法池与两条已知构造链至多 3 遍、非定向的自造文法串也见到 4 遍、定向搜索构造的串至多 6 遍;定向构造可让遍数随长度增长、到帽,KL-355),`escapeBackslashes` 开着时除外,与此前同)。**谁要跟**:按字节断言凭据输出的测试格改成「不含值 ∧ 含 `«redacted:`」两条独立断言(§114a′ 第 1 条);按产物字节登记锚的门换钉当天重跑(§114d)。
|
|
183
|
+
- 标签 / 方案词后的引号值头上是带主机的 `user:<口令>@host`:键、标签、引号留在原处,userinfo 记号落在引号里,地址后隔空白的尾巴换 `secret` 记号 —— `{"password":"u:<口令>@host/ <尾>"}` ⇒ `{"password":"«redacted:userinfo»@host/ «redacted:secret»"}`(此前 JSON 键与开引号被吞进 userinfo 记号、尾巴原样;KL-193 收口)。标签值读成无 scheme userinfo 地址时,最后一枚 `@` 的主机[:端口]之后紧贴、却不是路径 / query / 片段起头的尾巴是这只值的余下部分,照遮到值末(`"password":"To:<…>admin:<<口令>@db:5432&x=<值>` ⇒ `"password":"«redacted:userinfo»@db:5432«redacted:secret»`;上一版两只值都露 —— `To:<…>` 那一截被读成 userinfo,口令与 `<值>` 原样);只剩标点 / 引号的尾巴不动。
|
|
184
|
+
- 引号值是 `scheme://` 地址、地址后隔空白还有文字:空白之后到闭引号换 `secret` 记号(此前尾巴原样;KL-233 收口)。尾巴里又以一只地址起头(`token:"u:<口令>@h https://h/x <尾>`)时,那只地址同样只到空白为止,之后的文字照遮(此前整截按「像地址」放过);里层标签紧贴外层引号值的闭引号(`"<地址> token":<值>`)时,闭引号与分隔留在记号外,洗过的产物再洗一遍不变。无标签、单引号包着的 `user:<口令>@host`:口令换记号(此前原样;KL-234 收口);反引号包着的同形此前也遮,但开头的反引号被吞进记号,本版反引号留在原处;「口令以 `'` 起头 ∧ 主机右界恰是 `'`」的单引号串(`email:'bob@example.com'`)不算 userinfo。用户名整枚是一枚记号(`«redacted:query»:<口令>@host`)⇒ `«redacted:userinfo»@host`(此前口令原样;KL-235 收口)。
|
|
185
|
+
- 无 scheme userinfo 的用户名不再向左吞过定界字符(空白与 `" ' ` ( ) [ ] { } < > | \ ^ , ; =`):`token=u:<口令>@host.example/x` ⇒ `token=«redacted:userinfo»@host.example/x`(此前 `token=` 也进记号);`x(a:<口令>@host/p)` ⇒ `x(«redacted:userinfo»@host/p)`。标签左边紧贴、无标签无形状的裸串按原文显示(此前随用户名落进记号,是向左吞的副作用;KL-318)。空用户名的 `:<口令>@host` 无 scheme 也遮。口令段含双引号 / 反引号 / 尖括号的无 scheme `[用户名]:口令@主机` 默认不算 userinfo(`{"a":"b@c"}`、`To:<bob@example.com>` 不读成 userinfo);用户名紧跟凭据标签 / 方案词(`password=admin:"<口令>"@db`、`Authorization: Basic admin:"<口令>"@db`),或用户名是裸词、主机成形、地址不被引号包着(`connect failed: admin:p"<口令>@db:5432`、`ssh root:"<口令>"@10.0.0.5`、`admin:<<口令>@db`)照遮为 userinfo,与上一版同;用户名本身就是凭据标签或方案词 + 冒号(`token:u<<口令>@db`、`password:<<口令>>@db`、`auth_token:"pass"<口令>@db`、`Authorization:Basic"<口令>"@db`、`bearer:u<<口令>@db>`)照遮为 userinfo —— 只有词级网开着、且这枚标签的值真盖到 `@`(引号值闭在 `@` 之后 / 裸值一路没有停字符)才让给词级网,只开 URL 结构面的出口同遮,与上一版同字节;标签 / 方案词的裸值停在口令禁字上、其后到 `@主机` 没有断字也没有下一枚标签(`secret=u<<口令>@db`、`Authorization: Bearer u<<口令>@db`)⇒ 遮到 `@` 前(上一版也原样);其余几形仍原样(相对上一版少遮,KL-323 逐形列出);`email:"bob@example.com tail"` 一类与上一版同字节多遮(KL-351)。
|
|
186
|
+
- 片段里的标签值伸出未编码的停字符:片段与尾巴取并、整只按 `secret`(`https://h:1/v1#api_key=AB|<尾>` ⇒ `https://h:1/v1#«redacted:secret»`;KL-68 的这一形收口)。值的遮盖之后隔着不可见单元再紧贴词字符 ⇒ 遮盖续到那一截词的末尾(`Authorization:N<ESC>response=h(<ESC>c` ⇒ `Authorization:«redacted:secret»`)。带 scheme 地址的 query 值 / 片段在 `,` / `;` 后紧跟「凭据标签 + 分隔 + 空白」或「方案词 + 空白」时断开、让给词级网(`?k=',api_key: <值>` ⇒ `?k=«redacted:query»,api_key: «redacted:secret»`,此前值原样);这里的空白只认 ASCII 空白 / 控制符(片段扫描自己在那里止),分隔之后是不换行空格 / 表意空格 / 各宽空格 / 谚文填充 / 盲文空点时不断 —— 它们是片段值里的字,整只值照按结构遮(与上一版同字节,只开 URL 结构面的出口同遮);`;token=<值>` / `,token=<值>` / `,password:<值>` 是 URL 自己的参数语法、值在片段里,不断,照按路径段参数 / query / 片段 / userinfo 遮(与上一版同字节)。
|
|
187
|
+
- 上游预先带记号的输入:值以一枚记号起头、记号后不紧贴词字符 ⇒ 这只值就是那枚记号,后面隔着非词字符的明文不再并进(`token=«redacted:query»&<值> done` 原样;此前第二遍把它并成 `token=«redacted:secret» done`;KL-317)。紧贴词字符、或隔不可见单元再紧贴的照旧遮;记号后紧跟凭据名字而名字后不是分隔(`password=«redacted:secret»password!<值>`)、或名字与分隔之间隔着点而分隔后还有明文,照旧遮。URL 的 userinfo 位只有整段是记号才不动(`https://***:<口令>@<主机>/` 照遮);退役占位 `***` 本版不再铸,占位后还有内容(`"***@<值>"`、`***:<值>`)照遮。query 值 / 片段 / 路径段参数值是「记号 + 尾标点 + 屏上画成点 / 转义记号的空白控制符或不可见单元 + 值」时照遮(本包机读口按真空白断开交出的 `?k=«redacted:query»:<CR><值>`,再过点形 / 转义形出口时与值粘成一截;与上一版同遮);复合路径的其余形见 KL-317。
|
|
188
|
+
- 不再插入记号、不再把「记号 + 下一枚标签」再吞一遍(`Credential://'e://@` ⇒ `Credential:«redacted:secret»'e://@`,此前在 `@` 前插一枚 userinfo 记号;`Authorization:tp://#>Authorization:` ⇒ `Authorization:tp://#«redacted:fragment»Authorization:`,此前第二遍把 `>Authorization:` 并进片段记号);此前要调用方再洗一遍才稳定的形,本版在出口内部的一次调用里给出终形;标签值与 userinfo 候选取并、值伸得更远时记号种类是 `secret`(端不要按记号种类分支)。PEM 块体整段是一个控制串时,控制串里的标签值照遮、块体不再另铸一枚记号;块头在读面上认不出(裸 ESC / C1 CSI 紧贴 `-----BEGIN`,判别视图把它读进一段序列)的块不划不透明区,块里的标签值照遮(与上一版同)。块头在读面上认:头行词间的空格换成零宽空格 / 软连字符 / RLM / BEL 等不可见单元时与空格同读,块体照遮、不透明区照划(`-----BEGIN<U+200B>PRIVATE KEY-----\n<主体>\n-----END PRIVATE KEY-----` ⇒ 主体一枚记号;上一版只在默认形 / 转义形遮,机读口与字符面全关 / 点形 / 保排版出口原样)。
|
|
189
|
+
- 点形 / 转义形载体上:值左邻被画成 `.`(或写成转义形)的不可见单元留在记号左侧(`api_key: <ESC>M<值>` 点形 ⇒ `api_key: .«redacted:secret»`);空主机 userinfo 前面隔换行的上一行末的词随用户名进记号(点形 / 转义形上换行不再断开用户名;机读口、默认形照旧按换行断开;KL-181 形变)。
|
|
190
|
+
- 链接后紧跟结构终止符、再往后才有 `@` 的干净文本不再并进 userinfo(少遮方向,非凭据位):带 scheme 的地址片段只在「停字符恰在 `://` 之后,或 `://` 与停字符之间有一枚冒号」时跨过 `" < > | \ ^ { }` 与反引号(闭形记号里、开头闭合方括号主机字面里的冒号不算;口令位上的停字符照旧整段进记号:`https://u:p"w@host/x`、`https://u.v:"<口令>@h/` ⇒ `https://«redacted:userinfo»@…`,与上一版同)。`{"url":"https://example.com","email":"bob@example.com"}`、`<a href="https://[2001:db8::1]">bob@example.com</a>`、`url=https://[::1]|owner=bob@example.com` 原样(此前链接主机到邮箱用户名整段换进 userinfo 记号)。带端口的链接后紧跟停字符再有邮箱(`<a href="https://example.com:8080">bob@example.com</a>`)与上一版同样多遮(authority 里有冒号,停字符可能在口令位,取遮的一侧;KL-325);链接后紧跟 `)` `[` `,` `;` 再有邮箱同样(KL-324)。
|
|
191
|
+
- 不变的:干净文本逐字节同;字符面(控制符 / 双向与格式字符 / 行折平 / 名字位空白)、封长与标记位置读口不变;诊断词闭集、`max_tokens` 计量单位、方案词后的普通英文词等误洗收窄各形不变;`DisplayUntrustedOptions` 各位语义不变。
|
|
192
|
+
2. **`projectCrashConverged` 认 `cause: 'shutdown_before_park'`**(CC-218;**§114 SB-1 / SB-2**):服务端 7.108.0 起,有序关停(SIGTERM / 排空宽限窗满)截断了一条还没闭的腿时,下一次启动照列一条收敛行,`cause` 是 `shutdown_before_park`(进程崩了仍是 `crashed_before_park`)。修前本包把这一词当「别族的行」整行计入 `dropped`;本版这些行照常分桶。**分桶与 `needsHumanReason` 一字未改、也不看 `cause`**:常态是人已批、工具可能执行到一半(`decided` ∧ `resumeSafe:false`)⇒ needsHuman / `approved_then_interrupted`,与崩溃截断的已批腿同一句因由;罕见的 `pending` 形(关停时那张卡的结清写入挂住)按 `resumeSafe` 照旧分桶。`cause` 原样交到端上(本包不把新词折成旧词),**措辞归端:这类行是有序关停后的结清,不要说成「引擎崩了」**。词表外的 `cause` 仍整行 `dropped`(闭集)。**类型面**:`CrashConvergedRow.cause` 由 `'crashed_before_park'` 放宽为 `'crashed_before_park' | 'shutdown_before_park'` —— 对 `cause` 做穷尽 `switch`(带 `never` 兜底)或穷尽 `Record` 的 TypeScript 端**编译红一次**,补 `shutdown_before_park` 一臂;按 if 链读、或只把 `cause` 原样转述的端不受影响。**谁要跟**:按「这类行计入 `dropped`」断言的格改锚(§114a′ 第 5 / 6 条);崩溃遗留通告措辞写死「crash」的端改句(§114d)。
|
|
193
|
+
3. **崩溃收敛的分桶读数随服务端变**(本包零代码;服务端 7.108.0;**§114 RS-1**):服务端对**未被追踪的腿**(零窗口 / 后台 run 腿 / 委派子代)上的 pending 孤儿改给 `resumeSafe:false`(没有腿上的证据就不断言「工具零执行」;被追踪腿的 pending 孤儿仍是 `true`)。`projectCrashConverged` 照旧只信 `resumeSafe` ⇒ 这些行从 `resumeSafe[]` 挪到 `needsHuman[]`、因由 `pending_unsafe`。端上表现:后台 run 崩溃后要人确认的行变多、可自动重跑的行变少 —— 这是服务端要的方向。更老的服务端上同一形照旧落 `resumeSafe[]`。`contradictory` 判据(`decided` ∧ `resumeSafe:true`)不变。
|
|
194
|
+
4. **`SERVER_NOTICE_AUDIENCE` 三行 → 四行**(CC-270 ①;**§114 MU-1 / MU-3**):+`server.model_unreachable: 'user'`。随之 `engineNoticeInCatalog('server.model_unreachable')` 由 `false` 改答 `true`、`noticeAudienceOf` 由 `'operator'`(表外保守缺省)改答 `'user'`、`readEngineNoticeFacts` 由 `undefined` 改答 `{ code, audience: 'user', facts }`;派发表用户面码 12 → 13。**谁要跟**:按受众分发通告的端零改动即得(这一码从运维面 / 册外兜底挪到用户面);按「`SERVER_NOTICE_AUDIENCE` 恰三行」或「派发表用户面码恰十二个」断言的格改锚(§114a′ 第 7 / 8 条)。
|
|
195
|
+
5. **通告码册 80 → 81**(CC-272;**§114 TT-1 / TT-3**):`ENGINE_NOTICE_CODES` +`context.tool_turn_repaired`(紧跟 `route.tool_call_id_folded`);`engineNoticeInCatalog('context.tool_turn_repaired')` false → **true**;`noticeAudienceOf` 答 `'operator'`(修前册外码按保守缺省同答 `'operator'`,答案不变、出处改为受众表);`ENGINE_NOTICE_AUDIENCE` 多这一键;`readEngineNoticeFacts` 对这一码由 `undefined` 改为 typed 读数(`audience: 'operator'`);派发表运维面码 3 → 4。这一条通告引擎铸给宿主,已发布的服务端只写进运维日志、**不放上**客户端的事件流 —— 三端经服务端承载的会话今天收不到它。**谁要跟**:对 `EngineNoticeFactsCode` 做穷尽 `Record` / `switch` 的 TypeScript 端补两行(本条与第 4 条各一码,否则编译红;按 `if (f.code === …)` 只认已知几码的端不受影响);按「码册恰 80 员」/「运维面 typed 码恰三个」断言的格改口(§114a′ 第 9 条)。
|
|
196
|
+
6. **会话历史错配的出现频次随引擎变**(本包零代码;CC-272;**§114 TT-5**):0.87.0 的判型 `classifyToolHistoryMismatch` 与合成终局行键 `_sema_tool_history_mismatch` 一字未改。引擎 ≥ 7.37.1 在请求出门前修掉四形(调用之后跟着别的块 / 结果记在更后面 / 调用没有结果 / 同一调用两条结果),这几形不再让 provider 回那句 `tool_use ids were found without tool_result blocks immediately after`;转录不改写,之前写坏的会话在下一次请求自愈(那时一次成功的结局把连续次数清零,宿主不用做任何事)。仍会出 400 的形照旧被判型认出、照旧给出路句:同一条助手消息里两只同 id 的调用、宿主经旁路查询自带的历史里的孤儿 / 先于调用的结果、以及引擎 < 7.37.1 上的全部三形。用户拿到这一修复要等宿主所接的服务端带上引擎 ≥ 7.37.1。修复通告不上客户端的流 ⇒ 端不能据它抑制这只键(KL-308 射程句同批补)。
|
|
197
|
+
7. **开发依赖引擎 `~7.36.0` → `~7.37.1`**(CC-272;构建期,不进运行期依赖):构建期生成的引擎事实表按 7.37.1 重生成(既有表值不变;码册 +1 见第 5 条;第四批生成放行原因表)。生成器自本版起要求开发依赖引擎 ≥ 7.37.0(更老的引擎包入口没有放行原因表 ⇒ 生成器拒生成并点名缺的那一张,不回落去读私有路径)。
|
|
198
|
+
8. **`buildTaskRequest` / `assembleTaskRequest` 对 `requireExistingSession`**(CC-281;**§114 RE-1 … RE-5**):修前这一键是表外键 ⇒ 装配口抛 `TypeError`「入参带了本包不认识的键」;本版 interactive / print 有座(live 门后,非 live ⇒ 回执 `not_live`)、utility ⇒ 回执 `off_lane`(带 `sessionId` 时;`true` 而无会话 id 不分车道一律装配期拒);`true` 而无可续会话 id ⇒ 专句拒;坏值 ⇒ 专句拒。不带这一键的装配逐字节同 0.87.0。**谁要跟**:按「交这一键会被拒」断言的格改锚(§114a′ 第 12 条)。
|
|
199
|
+
9. **plan 决断台账:离门证据结掉的「已交出、未认领」决断由投递口认领原笔**(CC-278;**§114 DL-1 … DL-3**):宿主经 `notePlanReviewDecisionHandedOver` 登记了一次决断、本包投递口还没认领它的那一段里(宿主等这道门的实例快照读回来的窗内,或快照放行之后、投递调用到达本包之前的那串微任务里),宿主若调了 `notePlanReviewGateLeft`(409 体指名别的门 / 状态词不再是 `needs_review`),修前这一笔被结掉、随后到达的投递口找不到可认领的登记而另铸一笔,`latestPlanReviewDecisionMark` 随之前进 —— 宿主按登记刻度记下的门实例快照与「没生效」告知都对不上这一发(同一道门仍待决、POST 失败时那一句告知整个不出)。本版投递口的认领顺序是:未结算的登记 > **最近一笔**被离门证据结掉、还没被认领的登记 > 另铸 —— 那一发仍是登记的那一笔,交出刻度不变;认领那一拍撤回离门那次结算(连同它留下的「没生效」注脚),从认领到投出结局重新算在飞(与修前另铸的那一笔同判:POST 在飞时重开口拒开,读起点早于结局的快照判陈旧),结局投出时由本包结算。只有被离门证据结掉的登记会被再认领:在离门证据**之前**宿主自己 `settle()` 过的、`revoke()` 掉的,以及已投过结局的、已被认领过的都不会;离门证据之后句柄两口是空动作,那一笔仍可被认领(KL-348);新的一次决断照旧拿新刻度。不变:离门证据本身(照旧结算这条 run 名下全部未结算的笔)、投递口闩、容量规则、结局正文与机读位(三种失败形与不登记时逐字节同)。**谁要跟**:按「登记 → 离门 → 投递之后刻度前进」断言的格改锚(§114a′ 第 16 条);用 `notePlanReviewGateLeft` 充当「本包已结算」的测试替身改用登记句柄的 `settle()`(§114d)。
|
|
200
|
+
10. **`wiring_manifest` 帧的 `fileHistory` 段投影**(CC-279;**§114 FH-1 … FH-3**):`eventToSdkMessage` / `adapt()` / `runStream` 的 chrome `wiring_manifest` 事件在帧带这一段时多一键 `fileHistory`,内部臂多超集键 `_sema_fileHistory`;只带这一段的帧由 `not_in_slice` 改为成臂;`readSubmitWiringManifest` 对只带这一段的回执由 `unreadable` 改答 `manifest`。**谁要跟**:按「`wiring_manifest` 事件键集恰为 …」断言的格加这一键(present-iff;§114a′ 第 17 条)。
|
|
201
|
+
|
|
202
|
+
### Gates
|
|
203
|
+
|
|
204
|
+
- 新门 `scripts/run-display-untrusted-baseline-diff-test.mjs`(常驻;CC-247):凭据面对**上一发布产物**逐字节差分。基线 = 上一版 tarball(`SEMA_DU_BASELINE_TGZ` 指路径;缺席 ⇒ 差分段报 SKIPPED-SECTION、整门 PARTIAL,不当绿)。五池(定种子随机串两池 + 引号值 / userinfo 穷举形两池 + URL 参数分隔池:`;` / `,` 分隔的「名 = 值」落在路径段参数 / query / 片段 / userinfo 位)加一只最小回归形池,去重后 71 411 串 × 十五出口 = 1 071 165 格。B1 凭据位「上一版遮、本版露」= 0(无角色的随机池按整串预建的结构区间判位,不设固定回看窗);B2 只开 URL 结构面的出口按它自己的射程判;B3 包内三份文档的干净行过机读口与字符面全关出口逐字节不变;B4 一轮即不动(十四出口,含封长;另并进一只 64 512 串的全积文法池,只进本格与 B6);B6 凭据面不动点循环在全部池 × 五只出口上到帽 0 次(帽按改写遍数计 8 次;到帽 = 改写到帽之后另给的那一遍确认仍在变);B5 常见干净形不多遮(HTML 链接 / markdown 链接 / JSON 链接 + 邮箱 / 管道表 / CSV / 版本库远端地址 / CSS `url()` / `<br>` 分隔手写 23 形 × 十四出口 = 322 格逐字节不变;上一版也多遮的 6 形按 KL-324 / KL-325 豁免、不算绿,有基线时核「本版多遮的出口上一版也多遮」);B0 判别力自证。对 0.87.0 的读数(本版最后一次实跑):差异 188 261 格 · 旧露新遮 84 519 · 露出同字节异 102 505 · 旧遮新露 凭据位 0 / 只开 URL 结构面出口射程内 0 / 非凭据位(标签之前的裸串 1 032 · 被裸串粘住认不出的标签的值尾 24 · 非凭据头的尾巴 120 · 随机池结构判非凭据位 189 · 裁定形 13 · 只开 URL 结构面出口射程外 461);幂等 0 / 1 902 922 格;到帽 0 / 679 615 格,凭据面遍数直方(含确认那一遍)1 遍 212 349 · 2 遍 462 786 · 3 遍 4 454 · 4 遍 3 · 5 遍 5 · 6 遍 18(4 遍一档是门池里收的一只非定向自造文法串,5 / 6 遍两档全是门池里收的定向搜索构造串,KL-355);干净语料 100%;常见干净形 322/322(豁免 6 形 78 格,上一版同出口也多遮)。
|
|
205
|
+
- 扩门 `scripts/run-display-untrusted-projection-test.mjs`(414 → 479 格;CC-247):Y 段(一次扫描的优先序与记号原子、逐族钉住的形;链接 + 停字符 + 邮箱七形负控、口令位停字符正控、带端口链接形与上一版同字节多遮的现状钉、带点用户名 + 停字符口令、记号后名字不成可独立消费的一对照遮、URL userinfo 位与 query / 片段 / 段参数的记号后明文、PEM 头行与块体里控制串的标签值、退役占位后还有内容、口令段含完整记号的冒号;口令段含禁字的无 scheme userinfo 在前有凭据标签 / 裸词用户名 + 主机形时照遮的八形、包着地址的开引号与引号键收尾的十三形负控、与上一版同字节多遮的两形现状钉、用户名本身是凭据标签时标签不进记号;里层标签紧贴外层闭引号与引号值里地址后的缝以地址起头的十形一轮即不动;凭据面不动点循环到帽 0 次、干净文本凭据面恰一遍、文法池抽样一轮即不动、标记位置读口对最终输出自洽)、K49b 线性(无 scheme userinfo 两形与引号标签链三形)、K70b / K70c、K30 / K31 定向形先跑;按上面 Changed 第 1 条改口 U33 / K48 / K70 / X46 / Y6。另一批(U41 – U41c / Y22 – Y28):URL 片段不在「`;` / `,` + 凭据词」处提前断、原意形(凭据词 + 分隔 + 空白)仍断;用户名恰是凭据标签 + 口令含禁字(含只开 URL 结构面与单开词级网的出口)与无冒号三形不露、负控八形逐字节、裸值延伸不吃包着的地址也不跨下一枚标签;两条「每遍只推进一格」的构造链 k / n = 1…12 一遍到终形、定向搜索构造的多遍串帽内收敛;头在读面上认不出的 PEM 块不划不透明区;标签值地址形主机之后紧贴的尾巴照遮;多遍改写时标记位置来源表的复合(门内把 dist 叶子经数据 URL 派生一份带内部件读口的副本直验,不进包);到帽读数的口径(帽压到 1 的派生副本:恰在帽上落定不报到帽);机读口洗过再过展示出口(记号 + 尾标点 + 软位 + 值照遮)。再一批(U41d / Y29 – Y32):片段在「`;` / `,` + 凭据词 + 分隔 + 非 ASCII 空白」处不断(五种空白 × query / 片段 / 路径段参数 / userinfo 位,只开 URL 结构面逐字节与上一版同);地址值路径标签之后引号里夹控制串(OSC / DCS / APC / PM / SOS,含 C1 形)照遮;PEM 头行词间的空格换成不可见单元时各出口块体照遮、不透明区与块体同一次认头;用户名是方案词 + 冒号、地址被包着时照认 userinfo;标签值覆盖判的精确字节格(地址被包着 / 引号值闭在 `@` 之前)。
|
|
206
|
+
- 扩门 `scripts/run-crash-converged-projection-test.mjs`(138 → 166 格,带两代服务端夹具;不带夹具时 154 格、两代段标为未跑;CC-218):成文改口格(新词读得出、因由与旧词同);新词 decided / pending 两形、32 种组合 × 两词桶与因由逐格同(`cause` 不进判据)、词表外(近形词 / 大小写 / 尾空白 / 空串 / 原型键 / 非串)仍整行 `dropped`、本模块产物零句子且不改写 `cause`;只认旧词的穷尽 `switch` ⇒ TS2322;两代夹具 —— 服务端审计店真铸五形经 JSON 过境:新一代(≥7.108.0)两行新词全读得出、未被追踪腿的 pending 孤儿 `resumeSafe:false` ⇒ `needsHuman` / `pending_unsafe`;老一代(<7.108.0,按服务端版本认代)无新词、同一形落 `resumeSafe[]`。
|
|
207
|
+
- 扩门 `scripts/run-engine-notice-catalog-test.mjs`(→ 1193 格,带新一代与两份老一代服务端夹具;不带夹具时真铸点与对账段标为未跑;CC-270 ① / CC-272):服务端自铸表三行 → 四行;`readModelUnreachable` 段(四格必填且只认自有属性 / `proxyInUse` 可选 / `code` 与 `remedy` 开集原样 / 每格恰读一次 / 敌意取值器不抛 / 经派发口 user / 服务端两句不进产物;可选腿直驱服务端真铸点);`context.tool_turn_repaired` 段(新码在册、受众运维面、位置同源;读器逐格透传、冻结;`form` 开集透传、公面无修复形词表;十五种坏形整只缺席;开发依赖腿 —— 引擎修复律对四种坏转录真修、通告座真铸帧过派发口逐格同,合法转录零修复零通告;可选腿 —— 服务端发布包的用户流白名单里没有这一码);派发表用户面 12 → 13、运维面 3 → 4;码册 80 → 81;服务端发布包对账两代(新一代 / 老一代夹具各对一遍,本包领先老夹具的那一行要求老夹具的受众表与用户流白名单都没有它)。
|
|
208
|
+
- 扩门 `scripts/run-mode-release-projection-test.mjs`(→ 82 格;CC-272):公面词表就是生成物那个对象(引用相等、冻结、与引擎包入口的表逐词逐序同);谓词与引擎谓词逐值同答;表外 `reason` 原样带回、处置照读、谓词答 false;开发依赖引擎的模式裁决口真铸一只带原因的放行账 ⇒ 过引擎不变式筛 ⇒ 本包读回逐格同。扩门 `scripts/run-upstream-tables-test.mjs`(143 → 161 格):第四批放行原因表生成、与引擎逐词逐序同、源码初始化式就是生成物、原因词在源码里零串字面量;加词 ⇒ 生成物不同,坏形 ⇒ 拒生成;老引擎形点名缺的那一张。
|
|
209
|
+
- 新门 `scripts/run-session-memory-erase-projection-test.mjs`(335 格;CC-264,包侧投影门):调用口恰一发、体恰 `{requestId}`(+ 自有键上的显式布尔;原型链上继承来的不上 wire)、点段会话 id 与含未配对代理码元的会话 id 本地拒(零请求、不抛)、鸭子形信号答 `bad_input`;出站头与工厂造的 client 逐字节对拍;两代夹具真服务端(7.108.0 / 7.106.0)门序 400 → 401 → 501 → 404 → 501 → 400 ×4 → 200 逐码 → 档,两代差五形;结局四档、单源句、七值重发姿势、敌意入参不抛。
|
|
210
|
+
- 新门 `scripts/run-registry-conflict-projection-test.mjs`(96 格;CC-280):三词闭集与谓词;对新版 SDK 同名函数逐例对拍(状态 × 体组合与错误对象两组,零不一致;敌意体刻意分歧);registry 服务源码里的 scope-gone 铸点与乐观锁铸点逐处读(`SEMA_WEB_ADMIN_ROOT` / `SEMA_SDK15_ROOT` 缺席 ⇒ SKIPPED-SECTION)。扩门 `scripts/run-task-request-omission-receipt-test.mjs`(535 格;车道表 45 行)与 `scripts/run-resume-refusal-copy-test.mjs`(210 格;两代夹具真铸点腿;CC-281)。
|
|
211
|
+
- 新门 `scripts/run-prompt-delivery-projection-test.mjs`(111 格;CC-271):三条不变量(只增不删 / 建了 run 的帧才算 / 没走过提交路径两判皆假;服务端幂等重放臂的 409 冲突体不算)+ 时序 / 并发 / 失败分类三维 + 夹具服务端两代按写序真铸帧(`meta` → `approval_request` → 409)经真 SDK 解析端到端;同名影子门新登记两行(终端两只同名读口,`divergent-copy`,差分格 `cc271-prompt-delivery`,retireBy 0.89.0);重启恢复一格(三只写口的返回逐条落盘 → 丢掉账本 → 读回 ⇒ 交出去的行仍是交出去;只落 attempted 的返回 ⇒ 读回成确知没交出去,判别半;接入文档 §114 G-PD10)。扩门 `scripts/run-wiring-manifest-projection-test.mjs`(→ 219 格;CC-279):Q 段 `fileHistory`(两代夹具 core 派生 → server 投影真铸;这一段的取值器抛 ⇒ 段缺席、同帧别段照交,流式与非流式两口各一格)。
|
|
212
|
+
- 扩门 `scripts/run-plan-review-decision-ledger-test.mjs`(97 → 125 格;CC-278):K 段(时序 / 判别负控 / 并发 / 失败分类 / 终端两形端到端 r1 / r2 / arm 卡形;认领那一拍撤回离门结算、清「没生效」注脚、posting 笔不复用)。
|
|
213
|
+
- 扩门 `scripts/run-integration-doc-freshness-test.mjs`(1 624 → 1 626 格):已知限制档 `docs/KNOWN-LIMITS.md` 每张表每行(按未转义 `|` 切格)格数与表头相等 —— 行内代码里的 `|` 会被 Markdown 表格当格界拆开(修前五行被拆成 6 / 8 格、触发条件与升级判据两栏错位),一律写 `\|`;自证一格。
|
|
214
|
+
- 扩门 `scripts/run-package-hygiene-test.mjs`:出包面任一文件(全文,不按冻结基线切段)含行首合并冲突标记(`<<<<<<< ` / `=======` / `>>>>>>> ` / `||||||| `)即红,自检构造样本双向(正样本四形命中、非行首与八连符号不命中)。另加本仓本地四条过程说法(开发分支与评审轮次一类;不并进与上游同步的共用禁表),接入文档 §114 起、CHANGELOG 本段起向前执法(已发段冻结),自检正反样本双向。
|
|
215
|
+
- 登记物:根公面基线 1356 → 1372(+16);测试钩 62 不变;超集台账 `docs/type-superset.json` 97 → 98 条(`_sema_fileHistory`);门清单 `scripts/gates-manifest.json` 167 → 171 条(新门四道;扩门说明同批更新),README「Guards」与负控文档派生表同批重生;棘轮 `typeshape.unknownExport` 452 → 458、`portability.index` 229 → 232(registry.json 账 322 → 328 条);单例清单 573 → 595 条,高风险上限 133 不变;缺席折正向词普查登记 7 → 9 条(两只谓词的 catch ⇒ true 收紧向);过渡物退役登记 +2 行(服务端自铸码受众手写表:开发依赖引擎 ≥ 7.38.0 即到期;「只续已有会话」粗码形读消息尾括注:retireBy 0.90.0 到期重看)。
|
|
216
|
+
|
|
217
|
+
### Known limits(本版新增)
|
|
218
|
+
|
|
219
|
+
- 展示出口(CC-247):上游预先带记号、记号后隔非词字符紧跟明文时明文不并进(记号原子的代价;本包铸点洗过再经展示出口的复合路径同样触发,余形读数见 KL-317);凭据面不动点循环只对帽内收敛的输入保证一轮即不动,定向构造可让改写遍数随长度增长、到帽(交最后一次改写的输出;KL-355);裸 ESC / C1 CSI 紧贴 `-----BEGIN` 的 PEM 块体在非点形出口原样(三版同;块里的标签值照遮;KL-356);PEM 头行词间是制表符 / 不换行空格(真空白)、出口不把它折平成空格 / 画成点时块体原样(三版同;KL-356);凭据标签左边紧贴、无标签无形状的裸串按原文显示(KL-318);非凭据头(`"url":` / `max_tokens=`)值里地址之后的文字不遮(KL-319);封长后帽内本来可见的字不再被一枚插入的记号挤出帽外(KL-320);只开 URL 结构面时标签值 / 引号值地址之后的尾巴不遮(KL-321);随机拼接串里的四条裁定形(KL-322);口令段含双引号 / 反引号 / 尖括号的无 scheme userinfo 默认不算、前有凭据标签或裸词用户名 + 主机形时照遮,其余几形相对上一版少遮(差分门五池之外;KL-323),`email:"bob@example.com tail"` 一类与上一版同字节多遮(KL-351);标签 / 方案词 + 冒号后以 `<` 起头的占位文本(`key: <id>@scope`;只开词级网的出口上另含无空格的 `key:<id>@scope`)相对上一版新多遮成 `«redacted:secret»@…`(不含凭据,方向是多遮;KL-351);不在本包凭据标签族里的 JSON 键(`passphrase` / `pwd` / `auth` …)值里带 `@` 的串按原样显示(上一版只在值里带 `@` 时被宽松的 userinfo 网顺带遮住,同时把 `{"email":"bob@example.com"}` 的键也吞进记号;KL-354);链接后紧跟 `)` `[` `,` `;` 或(带端口时)停字符再有邮箱的干净文本整段换进 userinfo 记号(与上一版同形多遮;KL-324 / KL-325)。
|
|
220
|
+
- 崩溃收敛 / 服务端自铸通告(CC-218 / CC-270 ①):`shutdown_before_park` 的 `pending` 形与旧词同按 `resumeSafe` 分桶(KL-326);没收到 `server.model_unreachable` 不等于模型端点够得着 —— 同步非流式提交口、leader 车道、无会话的模型调用、代理在而上游不通、Bun 运行时上服务端不发(KL-327);它的 `code` 开集透传(KL-328);服务端自铸码受众仍是本包手写一张小表,引擎码册登记服务端自铸码的那一版(引擎 7.38.0)经下一次换钉接入后逐行退役(KL-329)。
|
|
221
|
+
- 引擎换钉(CC-272):`context.tool_turn_repaired` 不上客户端的事件流(KL-330);修复形词表本包不出镜像(KL-331);审批卡上的问类两位 `askClass` / `classes` 本版不接 —— 已发布的服务端卡帧不带这两位(KL-332);本版码册来自引擎 7.37.1,服务端若内嵌引擎 7.38.0,它新增的五码(四只服务端码入册 + `task.tool_turn_incomplete`)在本包码册外 ⇒ `readEngineNoticeFacts` 答 `undefined`、受众按保守缺省,到下一版换钉前经本包分发的端看不到这五码的 typed 事实(`server.model_unreachable` 本版经手写表可见,不受影响;KL-333)。
|
|
222
|
+
- 会话记忆抹除(CC-264):说不出没送出的传输失败一律落 `no_answer`(KL-334);会话存储层读错在本面落 `unconfirmed` / `engine_fault`(服务端落 500;KL-335);老一代服务端四形落 500 ⇒ `same_request_id`,其中两形同 id 重发不会成功(安全但没用;KL-336);点段会话 id 只在本口本地拒,同形存量(经 SDK 动词拼路径的别的口)另议(KL-337)。
|
|
223
|
+
- registry / 只续已有会话(CC-280 / CC-281):409 读不出机器码 ⇒ `'gone'`(与 SDK 分歧;KL-338);`isScopeGoneError` 判不出不保留体与码的错误对象(KL-339);`'conflict'` 含不可重试的 409(KL-340);兜底层删 mock 会话 id 时保留 `requireExistingSession: true`(KL-341);粗码形读消息尾括注,服务端改措辞即退化为 `null`(KL-342);流式提交上的同码失败帧不归读口(KL-343)。
|
|
224
|
+
- 投递判定(CC-271):判据是「建了 run」不是「模型处理了」(KL-344);开流先于建 run 的帧型是按服务端写序列的枚举(KL-345);steer 送达未知按没交出去记(KL-346);账本不判帧归属(KL-347);公面 409 判别口 `activeRunBusySignal` 对服务端幂等重放臂的 409 冲突体仍答 `null`(与上一版同,账本另认;KL-353)。
|
|
225
|
+
- 决断台账(CC-278):离门证据结掉的登记在宿主 `revoke()` / 自带路径 `settle()` 之后仍可被认领(KL-348);「登记 → 投递口认领」之间离门证据照旧结掉那一笔,这一小段里重开口不因它拒开(KL-349)。`fileHistory` 开集第三个词本包无措辞(CC-279;KL-350;`fileHistory` 段读抛只省这一段,既有段取值器抛仍整帧抛,与上一版同:KL-352)。
|
|
226
|
+
- 登记物按既定裁定改窗(本版对这些物零改动):同名影子对账门豁免表剩下的两行 —— 重开口外层(本包读点 0.83.4 起在,候终端换读)期限 0.88.0 → 0.90.0;回执成因词表(终端到期重看、下一版换读)期限 0.88.0 → 0.89.0;其余登记物本版零到期。
|
|
227
|
+
- 完整台账见接入文档 §114 末行「包侧缺口」。
|
|
228
|
+
|
|
52
229
|
## 0.87.0(2026-10-01)
|
|
53
230
|
|
|
54
231
|
> 主题:**minor** —— 六票同发(按票序)。① **会话历史 tool_use 错配的自救出路**(CC-268;终端的请托):provider 因为会话历史里一只工具调用对不上结果而拒掉这一会话的每一次请求时,合成终局错误行带机读超集键 `_sema_tool_history_mismatch`;本面真有 `/rewind` 命令的宿主钉 `EmitContext.offersRewind`(`true`,或对象形 `{ engineBaseUrl }` —— 那台引擎明说没有对话锚时不加句)后,行尾另起一行出路句(与 CC 同句),同一会话连续第二次起再补一句次数;另出两只根入口纯函数 —— 判型 `classifyToolHistoryMismatch` 与回退节点解析 `resolveToolHistoryRewindTarget`。② **崩溃收敛 needsHuman 桶的因由位**(CC-269):`projectCrashConverged` 的 needsHuman 行带闭集四词 `needsHumanReason`,分桶判据一字未改。③ **停车 fail-soft 真因超集键**(CC-273):HITL 桥在同步腿终帧在场时 fail-soft 收场,那只终帧照旧原样回吐、顶层多 `_sema_park_failed_reason`(与 durable 腿合成终帧的 `errorMessage` 逐字相等),结果帧透传同名键。④ **workflow 活动台账与监视器源的凭证位收取值函数**(CC-274):连线身份改按凭证来源认,宿主持同一只取值函数时令牌轮换不再清账。⑤ **detach 取消兜底的 arm 口收取值函数**(CC-275):取件口每调一次现读。⑥ **chrome 臂 `suspended_reopened`**(CC-276):流上 `suspended{reopened}` 投成一条 chrome 事件(读数 + reopen 族单源句 + 幂等键)。**为什么是 minor**:两只新顶层导出(`classifyToolHistoryMismatch` / `resolveToolHistoryRewindTarget`)+ `ChromeEvent` 新臂 `suspended_reopened`(对 `ChromeEvent['kind']` / `ChromeArmKind` 做穷尽 `Record` / `switch` 的 TypeScript 端编译红,与 0.86.0 同口径)+ 四处可选位 / 入参放宽(`EmitContext.offersRewind?`、`CrashConvergedRow.needsHumanReason?`、`LiveWorkflowConfig.authToken` / `WorkflowActivityLedgerConfig.authToken` 收取值函数、`armDetachCancel` 入参 `authToken` 收取值函数;对构造方均 additive)。型面 BREAKING 零处(对构造方;读那两只配置位 `authToken` 并按「串 / 中继」二分的宿主代码会编译红,见 Changed 第 5 条)。根公面运行期导出 1354 → 1356(+2);测试钩 62 不变;公面类型名 922 不变(两只新口的入参 / 出参型名不上入口,宿主按结构传;chrome 新臂是 `ChromeEvent` 联合的内联成员);超集键 +2(`_sema_tool_history_mismatch` / `_sema_park_failed_reason`);投影臂 +1(chrome `suspended_reopened`;`CHROME_ARMS` +1 行,`required:false`);另有**已发导出的可观察变化**在 Changed 逐条单列(第 1–6 条,写明谁要跟;第 7 条是公面零变化的内部搬家)。peer sdk 地板 `>=12.0.1` 不动;开发依赖不变。
|