@sema-agent/sdk 25.0.0 → 26.1.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.
Files changed (71) hide show
  1. package/README.md +151 -3
  2. package/dist/client.d.ts +0 -4
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +0 -5
  5. package/dist/client.js.map +1 -1
  6. package/dist/errors.d.ts +108 -26
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +57 -35
  9. package/dist/errors.js.map +1 -1
  10. package/dist/events.d.ts +41 -4
  11. package/dist/events.d.ts.map +1 -1
  12. package/dist/events.js.map +1 -1
  13. package/dist/index.d.ts +28 -17
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +12 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/resources/approvals.d.ts +19 -3
  18. package/dist/resources/approvals.d.ts.map +1 -1
  19. package/dist/resources/approvals.js +8 -3
  20. package/dist/resources/approvals.js.map +1 -1
  21. package/dist/resources/fleet.d.ts +12 -12
  22. package/dist/resources/fleet.d.ts.map +1 -1
  23. package/dist/resources/fleet.js.map +1 -1
  24. package/dist/resources/rules.d.ts +3 -6
  25. package/dist/resources/rules.d.ts.map +1 -1
  26. package/dist/resources/rules.js.map +1 -1
  27. package/dist/resources/runs.d.ts +4 -1
  28. package/dist/resources/runs.d.ts.map +1 -1
  29. package/dist/resources/runs.js +4 -1
  30. package/dist/resources/runs.js.map +1 -1
  31. package/dist/resources/session-sync.d.ts +36 -34
  32. package/dist/resources/session-sync.d.ts.map +1 -1
  33. package/dist/resources/session-sync.js +34 -41
  34. package/dist/resources/session-sync.js.map +1 -1
  35. package/dist/resources/sessions.d.ts +5 -3
  36. package/dist/resources/sessions.d.ts.map +1 -1
  37. package/dist/resources/sessions.js +5 -3
  38. package/dist/resources/sessions.js.map +1 -1
  39. package/dist/resources/side-query.d.ts +8 -0
  40. package/dist/resources/side-query.d.ts.map +1 -1
  41. package/dist/resources/side-query.js.map +1 -1
  42. package/dist/resources/tasks.d.ts +2 -0
  43. package/dist/resources/tasks.d.ts.map +1 -1
  44. package/dist/resources/tasks.js +2 -0
  45. package/dist/resources/tasks.js.map +1 -1
  46. package/dist/resources/tool-approvals.d.ts +106 -101
  47. package/dist/resources/tool-approvals.d.ts.map +1 -1
  48. package/dist/resources/tool-approvals.js +58 -37
  49. package/dist/resources/tool-approvals.js.map +1 -1
  50. package/dist/settings.d.ts +14 -1
  51. package/dist/settings.d.ts.map +1 -1
  52. package/dist/settings.js +0 -24
  53. package/dist/settings.js.map +1 -1
  54. package/dist/sync.d.ts +5 -5
  55. package/dist/sync.d.ts.map +1 -1
  56. package/dist/sync.js +15 -55
  57. package/dist/sync.js.map +1 -1
  58. package/dist/transport.d.ts +5 -0
  59. package/dist/transport.d.ts.map +1 -1
  60. package/dist/transport.js +7 -0
  61. package/dist/transport.js.map +1 -1
  62. package/dist/types.d.ts +236 -129
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js +8 -0
  65. package/dist/types.js.map +1 -1
  66. package/openapi.yaml +566 -559
  67. package/package.json +2 -3
  68. package/dist/resources/workspace.d.ts +0 -95
  69. package/dist/resources/workspace.d.ts.map +0 -1
  70. package/dist/resources/workspace.js +0 -60
  71. package/dist/resources/workspace.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -58,7 +58,7 @@
58
58
  */
59
59
  import type { SemaSettings } from "./settings.js";
60
60
  import type { ApprovalDecidedBy } from "./resources/approvals.js";
61
- import type { ASK_ORIGINS, AllowRuleShadow, ApprovalRequestFrame, AskOrigin, AutoModeFallbackCause, BoundGrantAbsence, BoundSkillGrants, ClassifierUnavailable, DenialLimitFallback, PersistedRuleMandate, RuleOffer, RuleOffersAbsence, ToolApprovalCardWord, ToolApprovalFrame } from "./resources/tool-approvals.js";
61
+ import type { ASK_ORIGINS, AllowRuleShadow, ApprovalFrameFamily, ApprovalRequestFrame, AskOrigin, AutoModeFallbackCause, BoundGrantAbsence, BoundSkillGrants, ClassifierUnavailable, DenialLimitFallback, PersistedRuleMandate, RuleOffer, RuleOffersAbsence, ToolApprovalCardWord, ToolApprovalFrame } from "./resources/tool-approvals.js";
62
62
  /** Authenticated end-user identity. Opaque to the service (used as memory scope + session owner). The SDK
63
63
  * normalizes; the service does NOT validate the format. Convention: `user:` / `org:` / `ai:` / `anon:`. */
64
64
  export type Principal = string;
@@ -298,7 +298,7 @@ export interface TaskRequest {
298
298
  * (没有可续的东西)。随持久化 body 骑到 resume 腿上。
299
299
  *
300
300
  * 🔴 **两处拒的码与状态(server ≥7.115.0 / S-1038;此前两处的 `errorCode` 都是状态派生的粗码,码只写在句尾括注里)**:`sessionId` 在本部署不存在 ⇒ **404 `resume.session_not_found`**
301
- * (前提:会话店答得了归属 `ownerOf` —— SQL / local / 引擎缺省内存店都有);没给 `sessionId` ⇒ **422 `request.field_conflict`**(请求自相矛盾:`sessionId` 是它的前置;**不是**「会话不存在」,
301
+ * (前提:会话店答得了归属 —— server ≥7.135.0 读的是会话头读面 `headOf`,≤7.134.x 读的是 `ownerOf`;SQL / local / 引擎缺省内存店都有);没给 `sessionId` ⇒ **422 `request.field_conflict`**(请求自相矛盾:`sessionId` 是它的前置;**不是**「会话不存在」,
302
302
  * 契约里本码唯一的 422)。`POST /v1/tasks` / `/v1/tasks/stream` / `/v1/runs` 三口同体,授权在 SSE 头之前 ⇒ 流式口拿到的也是真状态。按 `errorCode` 分派;
303
303
  * 旧粗码 `not_found.resource` / `request.unprocessable` 与句尾括注都不是依据(本包没有按它们分派的代码)。 */
304
304
  requireExistingSession?: boolean;
@@ -580,7 +580,7 @@ export interface TaskRequest {
580
580
  * eventId→entryId 映射、`resumeAnchorStore.resolve` 折算。**必须配 `sessionId`**(要分叉的会话;session 由 auth 派生,
581
581
  * body 不带);**不能与 durable resume 同用**(resume 路径会先剥掉 resumeAt 再 re-resolve)。anchor 未知 → 4xx;已知但
582
582
  * 被 compact 掉 → 同步 4xx / 异步 run-result `resume_at.not_found`。worker 无 anchor store(`resumeAnchorStore`+
583
- * `getLeafId`)→ 501,与 `capabilities.resumeAt` 同对一对(能力说 yes ⟺ 路由 resolve)。
583
+ * 会话头读面 `headOf`;≤7.134.x 是 `getLeafId`)→ 501,与 `capabilities.resumeAt` 同对一对(能力说 yes ⟺ 路由 resolve)。
584
584
  * server ≥7.125.0:**用户提示词**的手柄也可以直接取自历史读面 —— `GET /v1/sessions/:id` 的用户消息行上的 `taskId`(见 {@link SessionUserMessageRow};present-iff,
585
585
  * 行上有就一定解得出),重载之后无需再有 live `eventId` 在手。 */
586
586
  resumeAt?: string;
@@ -597,8 +597,8 @@ export interface TaskRequest {
597
597
  /** ⚰️ **退役拼法**(整树快照纪元;S-15 / design/381,server ≥7.52 起;sdk 11.4.0 注改真,与 {@link rewindFilesTo} 同一类陈旧注 [8437] U3)。
598
598
  * server `src/http/wire-types.ts` 逐字:仍收在 wire 上 —— 「捕获」义(`true`、不配 `resumeAt`)是被容忍的 no-op + 弃用披露;
599
599
  * 「恢复」义(`true` + `resumeAt`)是 core 的 **typed 迁移拒**,点名 {@link restoreFiles}(恢复语义真的变了:整树 ⇒ 跟踪集,
600
- * server 从不静默改写)。⇒ 新代码发 `restoreFiles`(先探 `capabilities.restoreFiles`);本键只为读 ≤7.51 的老 server 保留声明
601
- * (删 = major)。旧注描述的是 ≤7.51 整树快照店形,已不成立。 */
600
+ * server 从不静默改写)。⇒ 新代码发 `restoreFiles`(先探 `capabilities.restoreFiles`)。本键照**钉版 server 的请求面**声明:
601
+ * 它仍收这个拼法(上面两种答法都是它的真行为),sdk 26.0.0 的律「开形面上的退役键以钉版 server 的面为准」⇒ 留到 server 那边删的那一版同版删。 */
602
602
  rewindFiles?: boolean;
603
603
  /** 🔴 E18 code-only rewind(core 1.166.0 `TaskSpec.rewindFilesTo`;server「R8」)—— 把本会话编辑过的**跟踪集**文件收敛到
604
604
  * 某一条 **user message** 那一刻的历史边界、**不** fork 对话(会话 leaf 不动,只动文件)。= CC Rewind "code"-only 模式
@@ -607,7 +607,7 @@ export interface TaskRequest {
607
607
  * 与 {@link resumeAt} **同一种手柄**、同一只锚店折算 —— 典型值 = 那一轮提交时 **202 回执里的 `taskId`**(server 以本 run 的
608
608
  * taskId 为键记 user-message 锚,值 = 该 user message 的 entryId;`http/durable-run-leg.ts` / `routes/tasks.ts` 的锚捕获)。
609
609
  * server `src/boot/resolve-spec.ts:686-697`:`resumeAnchorStore.resolve(sessionId, <手柄>, principal)` → entry id;未知手柄 ⇒ 404
610
- * `rewind_files_to.unknown_event`;没带会话 ⇒ 422 `rewind_files_to.no_session`;worker 无锚店 / 无 `getLeafId` ⇒ 501。
610
+ * `rewind_files_to.unknown_event`;没带会话 ⇒ 422 `rewind_files_to.no_session`;worker 无锚店 / 无会话头读面(`headOf`;≤7.134.x 是 `getLeafId`)⇒ 501。
611
611
  * ⚠️ 501 **不是**能力位的全部谓词(车OV 对抗复审 [low] 订正):{@link Capabilities.rewindFilesTo} 还合取文件历史店;
612
612
  * 那一半缺席时 server **不** 501,而是 core 在 prepare 里拒 `rewind.store_unconfigured`(`prepare-file-history.js`)⇒ 先探能力位。
613
613
  * (server ≥7.104.0 / S-724:同步 `POST /v1/tasks` 零工作时那一拒答 **409** 错误体 —— 见 {@link ConflictError};异步 / 活流腿仍是终态
@@ -623,7 +623,7 @@ export interface TaskRequest {
623
623
  restoreFiles?: boolean;
624
624
  /** S-15 同批键(design/381 DV-15;server ≥7.52 校验布尔并透传 core,语义属主=core 的 restore 合同,
625
625
  * dist types.d.ts 亲读):部分恢复同意位 —— 缺席/false = 收敛中 ≥1 文件被拒/失败时 loud 终局
626
- * `rewind.restore_failed`(带 per-file 台账);true = run 继续,同一台账以 `restore_partial` note 披露
626
+ * `rewind.restore_failed`(带 per-file 台账;server ≥7.135.0:`resumeAt` 的还原撞「在但不可用」的边界也以本码失败,零工作且店判 `transient` 时放开提交幂等键 —— 见 `tasks.submit` 注);true = run 继续,同一台账以 `restore_partial` note 披露
627
627
  * 在 `TaskResult.rewindNotes`。🔴 两腿都吃(codex R2 复审订正):`resumeAt`+`restoreFiles` 的分叉
628
628
  * 恢复**与** `rewindFilesTo` 的 code-only 恢复 —— code-only 调用方漏带本位同样吃 loud 终局。
629
629
  * 恢复动作 per-file 幂等:重跑同一恢复即收敛。 */
@@ -762,7 +762,7 @@ export interface TaskRequest {
762
762
  /**
763
763
  * server ≥7.118.0(core 7.43.0 #1354)—— **声明这条 run 上没有人能答审批**。唯一一词 `"none"`({@link APPROVAL_REACH});原样投引擎 `TaskSpec.approvalReach`。
764
764
  *
765
- * 给 `-p` 这类握着流、却没有人能答审批的壳:不声明时部署的审批席照发活卡、wiring 清单报 `ask.effective:"human_reachable"`。声明之后活的回调不再是
765
+ * 给 `-p` 这类握着流、却没有人能答审批的壳:不声明时部署的审批席照发活卡(server ≥7.134.0 起前提是提交体声明了 `settings.approvalFrameFamilies`,没声明的任务本来就收不到活卡)、wiring 清单报 `ask.effective:"human_reachable"`。声明之后活的回调不再是
766
766
  * 这条 run 的审批人(wiring 清单 `ask.form:"declared_none"`);**有停驻设施的部署上第一次门控调用就停驻**(run `paused`)—— 要「拒了接着跑」用
767
767
  * `permissionMode:"dontAsk"`。它**不**放行、**不**释放任何东西。引擎不把它写进检查点,续跑腿由 server 从持久化体重供。
768
768
  * 读不出的值(集外词 / 非串)⇒ `400 request.field_invalid`。先探 {@link Capabilities.approvalReach}(缺席 = 老 server)。不发 = 零变化。
@@ -910,6 +910,12 @@ export interface TaskRequest {
910
910
  * ⚠️ 残余(server 如实登记,S-908):绑定按**会话**键控、在 run 认领之后写(被拒的请求零写);无 run 店的部署上同会话并发受理的
911
911
  * 两条 run 之间「最后写者赢」—— 同会话别并发提交不同的 `inheritEnv`。委派子代的 shell 照缺省清洗。 */
912
912
  inheritEnv?: "all" | "scrub";
913
+ /** server ≥7.135.0(引擎 `TaskSpec.projectMemory` 原样投):**这一条 run 不读部署的项目上下文** —— 带这个词的腿引擎不调部署的项目上下文座,项目层、声明的指令文件、它们喂的那几处一并缺席
914
+ * (引擎自己的 git 状态车道、记忆引擎、技能 / hooks / MCP 不受影响;委派 / 后台 / fork / workflow 子代随父继承)。唯一的词 `"disabled"`;**键缺席 = 调座**。
915
+ * 这条腿的 `wiring_manifest.projectMemory` 读作 `"disabled"`({@link WiringManifest.projectMemory}),`instructions` 段缺席。没接项目上下文座的部署照样受理(清单上答 `"absent"`)。
916
+ * 拼写门是单成员关断词表:别的值(含 `"off"` / 布尔 / `null`)fresh 提交 ⇒ `400 request.field_invalid`;续跑重放同判,折 `409 resume_blocked_by_policy`(`blockedBy: "request.field_invalid"`)。
917
+ * 🔴 **按位发,不按版本猜**:读 {@link Capabilities.projectMemory};老 server 的键闭集门对它答 `400 request.body_shape`(`unknownKeys: ["projectMemory"]`)。 */
918
+ projectMemory?: "disabled";
913
919
  /** server ≥1.221 (core 1.314): DEFERRED DISCLOSURE list — the named MOUNTED tools (built-ins included)
914
920
  * ride the wire as a placeholder (schema bytes out of the cache prefix) and materialize via ToolSearch
915
921
  * on demand. The carrier for the shell's "Workflow on by default but not exposed" posture. Same
@@ -1320,7 +1326,7 @@ export interface SyncParkReceipt {
1320
1326
  * 终局体不带它(不给终局造 `terminal.kind` 之外的第二真源)。同一次 park 在 `/v1/tasks/stream` 的 `done.result` 上除身份键外逐字相同;
1321
1327
  * 恢复凭据从不在体上(`paused.token` 摘掉)。
1322
1328
  *
1323
- * ⚠️ **三代同一个型,如实登记**(本包支持地板 3.0.0;与 {@link TaskResult.terminal} 同款:型面按现行代声明,老代的差别写在这里,
1329
+ * ⚠️ **三代同一个型,如实登记**(本包支持地板 7.52.0 ⇒ 下面三代都还在支持面内或经账本回放可达;与 {@link TaskResult.terminal} 同款:型面按现行代声明,老代的差别写在这里,
1324
1330
  * 不把 `terminal` 做成可选去逼每个现行读点处理一个不存在的缺席分支):
1325
1331
  * · **server ≤7.63**:平面形(见 {@link LegacyPlaneTaskResult})—— `status` 是**终局词**(`completed` / `failed` / `blocked` /
1326
1332
  * park 两词),**没有** `terminal`,码在退役平面键(`r["errorCode"]` 经开集索引读);
@@ -1430,7 +1436,7 @@ export interface TaskResult {
1430
1436
  * 两种拼法 = 一个语义面两个写者)。要五词 `status` 的消费方自己调引擎的 `terminalProjection(terminal)`。
1431
1437
  *
1432
1438
  * ⚠️ **跨代偏斜,如实登记**(与 8.0.0 的 `CcImportResult` 换形同款处置):本 SDK 的 server 支持地板是
1433
- * **3.0.0**,而 `terminal` 只有 **≥7.64.0** 的 server 才发。对着一台更老的 server,这一座在运行期
1439
+ * **7.52.0**,而 `terminal` 只有 **≥7.64.0** 的 server 才发。对着 7.52–7.63 的 server(或回放那一代写下的账本行),这一座在运行期
1434
1440
  * **缺席**(而型面上它是必填)—— 旧的平面键则仍在 wire 上,经开集索引读得到但**无类型**。
1435
1441
  * 🔴 要同时吃两代 server 的消费方:先用 `"terminal" in result` 判形,别把型面的必填当成运行期保证。
1436
1442
  * ⚠️ 本座**不**做成可选来「表达这件事」:可选会让 7.64.0 之后的每一个读点都被迫处理一个**不存在**的
@@ -1656,10 +1662,9 @@ export interface ModelInfo {
1656
1662
  /** S-188(server ≥7.69.0)—— 这一行对 **openai-completions 线路**的兼容声明。缺席的两种成因与
1657
1663
  * 「整只判形」纪律见 {@link ModelCompat};anthropic 腿刻意不铸这个键(那条 brain 读的是另一张表)。 */
1658
1664
  compat?: ModelCompat;
1659
- /** #345(server ≥7.45)—— 这一行的 key↔URL 配对姿态。🔴 在 **≥7.45 的 worker 上恒在场**(判不了时是
1660
- * `"unknown"`,而不是键消失);类型上仍标可选,因为 SDK 的 `SUPPORTED_SERVER_FLOOR` 是 **3.0.0** ——
1661
- * 判别位是**对端版本**,不是这个键的在场性。值域与读法见 {@link RoutePairingStatus}。 */
1662
- routePairing?: RoutePairingStatus;
1665
+ /** #345(server ≥7.45)—— 这一行的 key↔URL 配对姿态。🔴 **恒在场**(判不了时是 `"unknown"`,而不是键消失;server 的目录投影无条件铸它)——
1666
+ * sdk 26.0.0 随支持底线 7.52.0 改**必有**(25.x 及以前标可选)。值域与读法见 {@link RoutePairingStatus}。 */
1667
+ routePairing: RoutePairingStatus;
1663
1668
  [k: string]: unknown;
1664
1669
  }
1665
1670
  /**
@@ -1696,7 +1701,7 @@ export interface DroppedEntry {
1696
1701
  * `GET /v1/models` 的 200 体(信封;{@link ModelsResource.list} 的返回型)。`models` / `default` / `defaultModel` 先前就有,本版起有了具名型(此前是 `list()` 上的内联形),新键挂在上面。
1697
1702
  * · `droppedEntries` —— server ≥7.123.0 恒在场的数组:**本代目录里被读腿逐条丢掉的条目**(条目不合 settings-schema 的 `ModelEntry` 形,目录其余条目照常服务)。壳 / 管理面据此知道「我写下的哪一条引擎没收、为什么」,
1698
1703
  * 不必自己再判一遍 schema。**键缺席 = 更早的 server**(≤7.122.x);零条被丢 = `[]`(在场的空数组),没有目录在管(env 腿)同样是 `[]` —— 消费端据此分「引擎说没丢」(`[]`)与「引擎说不了」(缺席 ⇒ 用自己的判官)。
1699
- * 所以本型把它写成可选:本包的 server 支持底线是 `3.0.0`。
1704
+ * 所以本型把它写成可选:本包的 server 支持底线是 `7.52.0`(7.52–7.122 的 server 不发它)。
1700
1705
  * · **与 `models` 同一代**:两者是同一代目录的两面。候选的模型面这一组被拒时(例如默认模型不在目录里),或候选目录**一条启用条目也没有**时(幸存条目与被丢条目都按条目自己写的 `enabled` 算,
1701
1706
  * 被丢行读不出启用与否按启用算),`models` 与 `droppedEntries` 一起停在上一代 —— 本键**不报**那份没落地候选的条目(那份候选为什么落不了地,读 `/health.modelRefusals`);
1702
1707
  * 所以停用的被丢条目只在「有启用条目、模型面落了地」的目录里上本键。
@@ -1715,9 +1720,24 @@ export interface ModelsResponse {
1715
1720
  droppedEntries?: DroppedEntry[];
1716
1721
  /** server ≥7.126.0 · **present-iff**:当前生效的配置是因候选判官整拒了最近一份候选而回落的那一份时在场(见 {@link CandidateRejected});缺席不下「无拒」的结论(也可能是更早的 server)。 */
1717
1722
  candidateRejected?: CandidateRejected;
1718
- /** server ≥7.133.0 · **恒在场,追加在应答最末**:**这台引擎服务的是哪张模型表 / 目录采纳了没有 / 起服路由判官怎么说** —— 壳读这一格,不自己预测(判官的输入是服务进程的事实,壳拼不出,镜像两道判会随时间与真判官漂开)。
1723
+ /** server ≥7.133.0 · **恒在场,追加在应答最末**(7.133.0–7.134.x;server ≥7.135.0 起最末一键是 {@link aliases},本键在其前 —— 键序不是契约,按键名读):**这台引擎服务的是哪张模型表 / 目录采纳了没有 / 起服路由判官怎么说** —— 壳读这一格,不自己预测(判官的输入是服务进程的事实,壳拼不出,镜像两道判会随时间与真判官漂开)。
1719
1724
  * 键缺席 = 更早的 server(≤7.132.x)。读法与四个字段见 {@link ModelPlane}。 */
1720
1725
  modelPlane?: ModelPlane;
1726
+ /** server ≥7.135.0 · **恒在场**(零条为 `[]`;server 把它铸在应答最末一键,键序不是契约,按键名读):**除 `models[].name` 之外还能提交的模型词** —— 档位词 / `default` / 目录条目的 id 拼写等,server 的受理门认它们、`models[]` 行里没有它们。
1727
+ * **受理判法(一条,模型词判官读这一格,不按行 id 推)**:一个模型词可提交 ⇔ 名在 `models[].name` ∪ `aliases[].name` **且** 该行 `atMentionable !== false`(`atMentionable` 缺席 = 无名单裁决,不是不可提)。
1728
+ * `aliases` 不说词落到哪一行(刻意)。**键缺席 = 更早的 server(≤7.134.x)**:档位词 / `default` 照旧「说不清」,别拿缺席当「没有别名」。形与读法见 {@link ModelAlias}。 */
1729
+ aliases?: ModelAlias[];
1730
+ }
1731
+ /**
1732
+ * `GET /v1/models` 顶层 `aliases[]` 的一行(server ≥7.135.0):一个**可提交的模型词**,不是 `models[]` 里的一行。
1733
+ * · `name` —— 词本身(与 `models[].name` 不重名);
1734
+ * · `atMentionable?` —— 与 `models[]` 行**同一只投影**:**仅在部署配了 at-mention 名单时逐行在场**(名单裁决:该词解到的目录条目能不能被 `@` 点名);无名单 ⇒ 键缺席 = 「无名单裁决」,**不是不可提**。
1735
+ * 🔴 **受理判法**:模型词可提交 ⇔ 名在 `models[].name` ∪ `aliases[].name` 且 `atMentionable !== false`。判官读这一格,**不要按行 id 推**(一个 id 拼写是否被认,取决于 server 的目录匹配,不是你能从行里算出来的)。
1736
+ * 老 server(≤7.134.x)没有这一格:档位词 / `default` 读作「说不清」,别折成不可提。
1737
+ */
1738
+ export interface ModelAlias {
1739
+ name: string;
1740
+ atMentionable?: boolean;
1721
1741
  }
1722
1742
  /**
1723
1743
  * `GET /v1/models.modelPlane`(server ≥7.133.0;**恒在场**,纯数据,条件键缺席、不铸 `null` / 空串)—— 「这台引擎服务的是哪张模型表」的**唯一读口**。引擎起来之后以它为准,**不再自己预测 / 自判**
@@ -1846,6 +1866,11 @@ export interface WorkflowRunSummary {
1846
1866
  description?: string;
1847
1867
  /** run 级失败 agent 数(仅 > 0 才发;"completed, with failures" 免 N+1 get)。census 批2 四段回填。 */
1848
1868
  agentFailures?: number;
1869
+ /** server ≥7.135.0(core 7.55.0 `runParkedOf`):**恒字面 `true`、永不 `false`** —— run 在跑(`status: "running"`)且有 agent 停在审批门上;否则键缺席。读作「这条 run 在等人」,不是「失败」。
1870
+ * 老 server 不发。fleet 行与 `GET /v1/workflows/:id` 同位同读法。 */
1871
+ parked?: true;
1872
+ /** run 行的机器码(开集;如排空后的停驻终态 `workflow.agent_parked`);行上有才在场。(26.1.0 补声明:引擎的摘要投影早于 7.134.0 就发它。) */
1873
+ errorCode?: string;
1849
1874
  currentPhase?: string;
1850
1875
  status: WorkflowRunStatus;
1851
1876
  /** 已记录的 phase 数。 */
@@ -1989,6 +2014,10 @@ export interface WorkflowRun {
1989
2014
  id: string;
1990
2015
  scope: string;
1991
2016
  status: WorkflowRunStatus;
2017
+ /** server ≥7.135.0:同 {@link WorkflowRunSummary.parked}(恒字面 `true`、永不 `false`;在跑且有 agent 停在审批门上才在场)。 */
2018
+ parked?: true;
2019
+ /** run 行的机器码(开集;同 {@link WorkflowRunSummary.errorCode} 与 fleet 行的同名位)。(26.1.0 补声明:detail 投影早于 7.134.0 就转发它。) */
2020
+ errorCode?: string;
1992
2021
  /** 🔴 K-2c detail 侧(service `summarizeWorkflowDetail` src/http/routes/workflows.ts,redacted/omit-when-absent)—— 工作流头部
1993
2022
  * 名/副标题(来自脚本 `export const meta={name,description}`)。detail **不带 `currentPhase`**(那是 summary 行字段;
1994
2023
  * detail 有完整 `phases[]` 含 per-phase `title`,当前 phase 自这里取)。老 run 二者皆缺。 */
@@ -2927,7 +2956,7 @@ export type DeniedBy = "policy" | "hook" | "org" | "persisted_rule" | "classifie
2927
2956
  */
2928
2957
  export type PermissionMode = "default" | "acceptEdits" | "plan" | "auto" | "bypassPermissions" | "dontAsk";
2929
2958
  /**
2930
- * 一只问**属于哪一类**(core `ASK_CLASSES`:7.34.0 铸二十词,core 7.39.0 起 `shell_floor` 入册 ⇒ 二十一词,core 7.40.0 起 `unstated` 入册 ⇒ 二十二词,core 7.41.0 起 `requires_user_interaction` 入册 ⇒ 二十三词,core 7.43.0 起 `classifier_no_ruling` 入册 ⇒ 二十四词,core 7.45.0 起 `dangerous_delete` 入册 ⇒ 二十五词,core 7.49.0 起 `unverifiable_shell_text` 入册 ⇒ 二十六词(同版写目标落点读不出那一类改拼 `target_unresolved`,旧拼法见 README 22.0.0 迁移表),**core 7.51.0 / server ≥7.129.0 起 `governance_unavailable` 并入 `rule_unreadable` ⇒ 二十五词**(23.0.0 BREAKING,零别名;7.128.x 停驻的卡 / 行由 server 起服一次性改写);模式 × 类仲裁表的列)。K-32 扩项 / server ≥7.106.0 起出现在
2959
+ * 一只问**属于哪一类**(core `ASK_CLASSES`:7.34.0 铸二十词,core 7.39.0 起 `shell_floor` 入册 ⇒ 二十一词,core 7.40.0 起 `unstated` 入册 ⇒ 二十二词,core 7.41.0 起 `requires_user_interaction` 入册 ⇒ 二十三词,core 7.43.0 起 `classifier_no_ruling` 入册 ⇒ 二十四词,core 7.45.0 起 `dangerous_delete` 入册 ⇒ 二十五词,core 7.49.0 起 `unverifiable_shell_text` 入册 ⇒ 二十六词(同版写目标落点读不出那一类改拼 `target_unresolved`,旧拼法见 README 22.0.0 迁移表),**core 7.51.0 / server ≥7.129.0 起 `governance_unavailable` 并入 `rule_unreadable` ⇒ 二十五词**(23.0.0 BREAKING,零别名;7.128.x 停驻的卡 / 行由 server 起服一次性改写),**core 7.54.0 / server ≥7.134.0 起 `cross_boundary` 入册 ⇒ 二十六词**;模式 × 类仲裁表的列)。K-32 扩项 / server ≥7.106.0 起出现在
2931
2960
  * {@link ModeRelease.askClass} / `.classes` 与 deny 臂的 `askClass` / `classes` 上,以及通告 `permission.ask_released_by_mode` 的 detail 里;
2932
2961
  * K-37 扩项 / server ≥7.109.0(S-934 ②)起也在审批面:活卡帧 / 卡面 / 运维队列行 / `/stream` `pending` 帧的 `askClass` / `classes`
2933
2962
  * (同样经 core `isAskClass` 筛,读不出整对不投;见 {@link import("./resources/tool-approvals.js").ToolApprovalFrame.askClass})。
@@ -2970,7 +2999,11 @@ export type AskClass = "content_question" | "hook" | "ancestor"
2970
2999
  * denial-limit 回落那一行(只有人的答清得掉;**免疫 bypass**,allow 规则清不掉,分类器不再被问)。活卡帧 / 收件箱行另带成因 {@link import("./resources/tool-approvals.js").ToolApprovalFrame.classifierNoRuling}。 */
2971
3000
  | "classifier_no_ruling"
2972
3001
  /** core 7.41.0 / server ≥7.116.0:服务器工具申报声明「每次调用都要用户在场」(见本型顶注)—— **不在** `bypassPermissions` 可放的类里,只有人的答清得掉。 */
2973
- | "requires_user_interaction" | "operator_forced"
3002
+ | "requires_user_interaction"
3003
+ /** core 7.54.0 / server ≥7.134.0:**跨边界确认**(设备车道的发射闸)—— 这条 run 执行在部署信任边界之外的设备上、部署是多租形(`REQUIRE_PRINCIPAL=true`),
3004
+ * 一次落到组织侧的写 —— 或在一次离目标读之后、发回设备的调用 —— 由部署的审批人逐次确认:常驻 allow 规则与任何自动车道都答不了它,配置给的放行被拒。
3005
+ * 卡上同带 `mandate: "cross_boundary_taint"`({@link import("./resources/tool-approvals.js").PersistedRuleMandate})。只在执行于目标设备的树上出现,宿主车道永不出现;**免疫 bypass**。 */
3006
+ | "cross_boundary" | "operator_forced"
2974
3007
  /** core 7.39.0(#1260;server ≥7.113.0 提货):运维旋钮 `shellGate: "always"` 在**跑 shell 的席位**上的地板 —— `operator_always` 授权词所披露的那一问,
2975
3008
  * 自己成一类,免得持有另一种强制问的类集把它藏掉。与 `operator_forced` 同样**免疫 bypass**(不在 `bypassPermissions` 可放的类里)。 */
2976
3009
  | "shell_floor"
@@ -3036,7 +3069,7 @@ export type GateRecordAskClass = AskClass | GateRecordRetiredWord<"askClass">;
3036
3069
  export type GateRecordDeniedBy = DeniedBy | GateRecordRetiredWord<"deniedBy">;
3037
3070
  /** 门记录上的模式放行理由 = 今天的一员 `target_unresolved`(core `MODE_RELEASE_REASONS`)∪ 档案词(7.122.0–7.125.x 的旧拼法 / 7.126.x 及以前的 `rule_unreadable`)。 */
3038
3071
  export type GateRecordModeReleaseReason = "target_unresolved" | GateRecordRetiredWord<"modeReleaseReason">;
3039
- /** 门记录上的强制词 = {@link PersistedRuleMandate}(今天的六词)∪ 档案词(7.49.0 前的旧拼法)。 */
3072
+ /** 门记录上的强制词 = {@link PersistedRuleMandate}(今天的全集)∪ 档案词(7.49.0 前的旧拼法)。 */
3040
3073
  export type GateRecordPersistedRuleMandate = PersistedRuleMandate | GateRecordRetiredWord<"persistedRuleMandate">;
3041
3074
  /** 门记录上的出身词 = core `ASK_ORIGINS`(今天的十二词)∪ 档案词(`unresolvable`,core 7.14.0 改名 `ancestor_marked`)。🔴 门记录这一面引擎判成员,所以是**闭集**
3042
3075
  * —— 与卡面上开集读的 {@link AskOrigin} 不同面(卡面 server 只判非空串)。 */
@@ -3056,7 +3089,7 @@ export interface ModeRelease {
3056
3089
  classes: GateRecordAskClass[];
3057
3090
  /** 卡上本会显示的 origin(与 {@link GateOutcome.origin} 同一张表;本面按引擎档案闭集筛)。 */
3058
3091
  origin?: GateRecordAskOrigin;
3059
- /** 卡上本会显示的强制词(今天六词 ∪ 档案词,见 {@link GateRecordPersistedRuleMandate})。 */
3092
+ /** 卡上本会显示的强制词(今天的全集 ∪ 档案词,见 {@link GateRecordPersistedRuleMandate})。 */
3060
3093
  mandate?: GateRecordPersistedRuleMandate;
3061
3094
  /**
3062
3095
  * 🔴 放行**越过了什么**:一个词,取 core `MODE_RELEASE_REASONS` 数组序里这只 ask 的类集持有的**第一位**;类集不持有任何成员 ⇒ 缺席。
@@ -3118,6 +3151,10 @@ export type GateDisposition = {
3118
3151
  /** K-32 扩项(server ≥7.106.0 / core 7.34.0 design/1111):`bypassPermissions` **放行**了一只没人答的 ask —— 见 {@link ModeRelease}。
3119
3152
  * 缺席 = 这次放行不是模式放的(普通 allow / 人批的 / 规则放的),或老 server(≤7.105.0 剥掉了它)。 */
3120
3153
  released?: ModeRelease;
3154
+ /** server ≥7.135.0(core 7.55.0):**allow 层清掉了一只本该问的 ask**(没人作答、调用照跑)的披露 —— 哪个成员的 allow 规则、站在哪些条目上,列表型成员另带这些条目在这次 run 收到的那张列表里的下标。
3155
+ * 与卡 / 帧上的 `allowRuleShadowed`(命中却没清掉)是一对,见 {@link import("./resources/tool-approvals.js").AllowRuleClearance}。
3156
+ * 在场 ⇔ 一个 allow 成员清掉了一只仍在等的 ask 而没人作答;缺席 = 这次调用没有 ask 要清 / 模式放行 / 只读臂 / 分类器或沙箱放行 / 人批的 yes,或老 server(≤7.134.x)。**不与 `released` 同在。** */
3157
+ clearedBy?: import("./resources/tool-approvals.js").AllowRuleClearance;
3121
3158
  } | {
3122
3159
  kind: "denied";
3123
3160
  /** 拒的那一层(门记录按档案读:今天的 {@link DeniedBy} ∪ 档案词,见 {@link GateRecordDeniedBy})。 */
@@ -3658,6 +3695,8 @@ export type TraceBlock = {
3658
3695
  * - `prompt-assembled` — `{ seq, ...PromptManifestRow }` (server ≥1.219): the prepare's assembly manifest — the stored
3659
3696
  * ledger row verbatim (server ≥7.132.0: the v3 row `identity`/`selectors`/`blocks`/`sections`/…, or a
3660
3697
  * row written by ≤7.131.x carrying `constitution`; see {@link PromptManifestRow}). MULTIPLE per task on cascade/verify runs.
3698
+ * - `cross-boundary-taint` — `{ seq, ...CrossBoundaryTaintRow }` (server ≥7.134.0): the device lane's cross-boundary taint row, only on a tree that
3699
+ * executes on a target device (never on the host lane). See {@link CrossBoundaryTaintRow}.
3661
3700
  * - `turn` — `{ seq, tokens? }` a turn boundary (+ usage if present).
3662
3701
  * - `done` — `{ seq, suspended? }` terminal (suspended:true = paused on HITL, NOT completed).
3663
3702
  * - `error` — `{ errorCode, message }` terminal failure / `WORKER_DOWN` (stalled) / `STREAM_MAX_DURATION` /
@@ -3672,17 +3711,17 @@ export type TraceBlock = {
3672
3711
  * precisely typed. The union stays OPEN — an `event` value this SDK doesn't yet know about still narrows to the
3673
3712
  * trailing catch-all member (bare `Record<string, unknown>` data, exactly the old behavior), so a new server-side
3674
3713
  * frame type never breaks compilation; it only arrives less precisely typed until the SDK catches up. */
3675
- /** 🔴 契约调和车1 G(2026-08-02):每个臂的 `data` 都可以携一个 `type` = **该臂的 `event` 名**
3676
- * (server [2373]C-12 起双发:`src/trace/project.ts:763` 的 `data: { type: mapped.event, ...mapped.data }`,
3677
- * meta 帧同批 `routes/trace-usage.ts:258`)。**server ≥ 5.0.0 恒发**;之所以声明为**可选**,是因为 SDK 的
3678
- * 支持地板是 server 3.0.0(那时只有 `error` 臂自带 `type`)。
3714
+ /** 🔴 契约调和车1 G(2026-08-02):每个臂的 `data` 都携一个 `type` = **该臂的 `event` 名**
3715
+ * (server [2373]C-12 起双发:`src/trace/project.ts` 的 `mapTraceEvent` 恒铸 `data: { type: mapped.event, ...mapped.data }`,
3716
+ * meta 帧同批 `routes/trace-usage.ts`)。**server ≥ 5.0.0 恒发** ⇒ sdk 26.0.0 随支持底线 7.52.0 在每只具名臂上改**必有**(25.x 及以前标可选);
3717
+ * 兜底开集臂不变(未知事件的 `data` 照旧按 `Record<string, unknown>` 读)。
3679
3718
  * 为什么它不是冗余装饰:一层**剥掉 SSE `event:` 行**的代理/中继(只把 `data:` JSON 往下游转的 BFF)之后,
3680
3719
  * `type` 是消费方唯一还能分派的键 —— 那种场景按它分派;`event` 行在场时仍以 `event` 为准(两者恒相等)。 */
3681
3720
  export type TraceStreamEvent = {
3682
3721
  event: "meta";
3683
3722
  id?: string;
3684
3723
  data: {
3685
- type?: "meta";
3724
+ type: "meta";
3686
3725
  version: number;
3687
3726
  mode: string;
3688
3727
  resumeFrom?: number;
@@ -3691,7 +3730,7 @@ export type TraceStreamEvent = {
3691
3730
  event: "block-thinking-delta";
3692
3731
  id?: string;
3693
3732
  data: {
3694
- type?: "block-thinking-delta";
3733
+ type: "block-thinking-delta";
3695
3734
  seq: number;
3696
3735
  text: string;
3697
3736
  };
@@ -3699,7 +3738,7 @@ export type TraceStreamEvent = {
3699
3738
  event: "block-content-delta";
3700
3739
  id?: string;
3701
3740
  data: {
3702
- type?: "block-content-delta";
3741
+ type: "block-content-delta";
3703
3742
  seq: number;
3704
3743
  text: string;
3705
3744
  };
@@ -3707,7 +3746,7 @@ export type TraceStreamEvent = {
3707
3746
  event: "tool-call";
3708
3747
  id?: string;
3709
3748
  data: {
3710
- type?: "tool-call";
3749
+ type: "tool-call";
3711
3750
  seq: number;
3712
3751
  id: string;
3713
3752
  name: string;
@@ -3720,7 +3759,7 @@ export type TraceStreamEvent = {
3720
3759
  event: "tool-result";
3721
3760
  id?: string;
3722
3761
  data: {
3723
- type?: "tool-result";
3762
+ type: "tool-result";
3724
3763
  seq: number;
3725
3764
  callId: string;
3726
3765
  label?: string;
@@ -3740,14 +3779,21 @@ export type TraceStreamEvent = {
3740
3779
  event: "prompt-assembled";
3741
3780
  id?: string;
3742
3781
  data: {
3743
- type?: "prompt-assembled";
3782
+ type: "prompt-assembled";
3744
3783
  seq: number;
3745
3784
  } & PromptManifestRow;
3785
+ } | {
3786
+ event: "cross-boundary-taint";
3787
+ id?: string;
3788
+ data: {
3789
+ type: "cross-boundary-taint";
3790
+ seq: number;
3791
+ } & CrossBoundaryTaintRow;
3746
3792
  } | {
3747
3793
  event: "turn";
3748
3794
  id?: string;
3749
3795
  data: {
3750
- type?: "turn";
3796
+ type: "turn";
3751
3797
  seq: number;
3752
3798
  tokens?: unknown;
3753
3799
  };
@@ -3755,7 +3801,7 @@ export type TraceStreamEvent = {
3755
3801
  event: "done";
3756
3802
  id?: string;
3757
3803
  data: {
3758
- type?: "done";
3804
+ type: "done";
3759
3805
  seq: number;
3760
3806
  suspended?: boolean;
3761
3807
  };
@@ -3763,7 +3809,7 @@ export type TraceStreamEvent = {
3763
3809
  event: "error";
3764
3810
  id?: string;
3765
3811
  data: {
3766
- type?: "error";
3812
+ type: "error";
3767
3813
  errorCode: string;
3768
3814
  message: string;
3769
3815
  };
@@ -3923,13 +3969,13 @@ export type WorkflowStreamEvent =
3923
3969
  * 和『流正常结束』混为一谈」。此前 SDK 只声明了 `message` ⇒ 想按机器码分支的人 TS 直接报 `errorCode`
3924
3970
  * 不存在,只能退回锚文案(server 明确想消灭的那个姿势)。
3925
3971
  * 同一份 `types.ts` 里 runs/trace 那条流的 error 臂声明的就是 `{errorCode, message}` —— SDK 内部此前
3926
- * 自己就不一致。`errorCode` 标可选是因为 SDK 的支持地板早于该键落地的那一版。 */
3972
+ * 自己就不一致。sdk 26.0.0 起 `type` 与 `errorCode` 都**必有**(支持底线 7.52.0 的 server 已恒铸这两键;此前因地板早于该键落地标可选)。 */
3927
3973
  | {
3928
3974
  event: "error";
3929
3975
  id?: string;
3930
3976
  data: {
3931
- type?: "error";
3932
- errorCode?: string;
3977
+ type: "error";
3978
+ errorCode: string;
3933
3979
  message: string;
3934
3980
  };
3935
3981
  }
@@ -4012,7 +4058,9 @@ export interface McpServerSpec {
4012
4058
  /** Caller-side per-tool safety-axis overrides, keyed by the server's remote (un-namespaced) tool name.
4013
4059
  * #272:`effect` 是 core 的**三词**枚举(`read`/`write`/`idempotent`——core ToolAxes 同名字段),此前
4014
4060
  * 这里只列两词,漏 `idempotent`(server `task-mcp.ts` 的形状校验一直按三词收,发 `idempotent` 一直
4015
- * 合法生效,只是本类型把它标红)。 */
4061
+ * 合法生效,只是本类型把它标红)。
4062
+ * 🔴 引擎的 `boundaryFlow` 成员(core 7.54.0:声明一只**引擎专用**工具)**只在部署腿上受理**:请求体 `mcpServers[i].toolAxes.<tool>.boundaryFlow` ⇒ server ≥7.134.0
4063
+ * 新提交 `400 request.field_invalid` 点名(A2A 对端同键 ⇒ 那条对端不挂、运维 warn 点名);本型刻意不声明它。 */
4016
4064
  toolAxes?: Record<string, {
4017
4065
  effect?: "read" | "write" | "idempotent";
4018
4066
  egress?: boolean;
@@ -4024,12 +4072,16 @@ export interface McpServerSpec {
4024
4072
  * 出现读器不认的键(`pathTraget` 笔误)都算——覆盖层是**收窄**声明,丢它 = 那只工具无面挂载、运维声明的保护
4025
4073
  * 静默失效。请求腿进 `mcp_injection_dropped{dropped:[name]}` 点名;形合但语义坏(`pathTarget.param` 不在工具
4026
4074
  * 物化后的 schema 上)由引擎拒**那一只**工具并出 `config.tool_face_invalid` 通告(operator 面)。三条腿(请求 /
4027
- * config-center / 本地 config.d)同一条规则。 */
4075
+ * config-center / 本地 config.d)同一条规则。
4076
+ * 🔴 **server ≥7.134.0:判官换成引擎包根的 `readToolFaces`,在受理口判** —— 坏形的新提交整条 `400 request.field_invalid`(点名成员;续跑重放:整条 server 不进):
4077
+ * 空工具名、保留审批卡、`pathTarget.access` 不在闭集 `read` / `create` / `edit`(写成 `"write"` 拒)、`pathTarget.base: "root"` 而 `access` 不是 `read`、单独的 `patternParam`、
4078
+ * 未知成员、安全轴写成面成员、非布尔旗;部署腿(中心 / `config.d`)的坏声明 ⇒ 整任务 `config.tool_face_invalid`。拒句里的工具名由引擎读器回显(控制符折空格、有界)。 */
4028
4079
  toolFaces?: Record<string, McpToolFace>;
4029
4080
  /** server ≥7.132.0(受理键;core `McpServerSpec.startupTimeoutMs`):**这台**服务器的启动上限(整毫秒)—— 握手(连接 + initialize)与初次工具列举各带它。
4030
4081
  * 读序一只函数:本键 › 进程级 `MCP_TIMEOUT` › MCP SDK 自己的 60 000 ms ⇒ 启动卡住的一台按自己的钟被切,兄弟照用部署的钟;只界启动阶段(调用自己的超时不动)。
4031
- * 合法范围 1 000 – 2 147 483 647;🔴 **值形判官只在引擎**:server 两扇门(新提交 / 探测口)都不在入口判它,坏值(串 / 小数 / 0 / 负数 / NaN / `null` / 越界)由引擎在拨号时
4032
- * **只拒这一台**(`config.mcp_startup_timeout_invalid`,兄弟照挂),不钳、不读成缺省。老 server(≤7.131.x)对它答 `400 request.body_shape`(`unknownKeys` 点名)。 */
4082
+ * 合法范围 1 000 – 2 147 483 647。🔴 **server ≥7.134.0:值形判官是引擎包根的 `mcpStartupTimeoutMs`,在受理口判** —— 坏值(数字串 / 小数 / 越界 / `null`)的新提交
4083
+ * `400 request.field_invalid`(原因句是引擎的);server 7.132.0–7.133.x 照常受理、引擎在拨号时**只拒这一台**(`config.mcp_startup_timeout_invalid`,兄弟照挂)。
4084
+ * 老 server(≤7.131.x)对它答 `400 request.body_shape`(`unknownKeys` 点名)。 */
4033
4085
  startupTimeoutMs?: number;
4034
4086
  }
4035
4087
  /**
@@ -4116,7 +4168,7 @@ interface PermissionModeAutoBase {
4116
4168
  * `capabilities.permissionModeAuto` 的**两代形**(判别位 = `armed` 的**三态**)。
4117
4169
  *
4118
4170
  * 🔴 **武装两键(`armed` / `reason`)是 server ≥7.57.0(S-80)才有的**,而本包声明的
4119
- * 支持地板是 **3.0.0** ⇒ 每一台 7.x ≤7.56.0 的 server 都在承诺面内,它们**只发** {@link PermissionModeAutoBase}
4171
+ * 支持地板是 **7.52.0** ⇒ 每一台 7.52.0–7.56.0 的 server 都在承诺面内,它们**只发** {@link PermissionModeAutoBase}
4120
4172
  * 那三位(亲核 server tag `v7.50.0` / `v7.56.0` 的 `routes/capabilities.ts` 逐字确认)。
4121
4173
  * 🔴 **K-35(server 7.107.0 / S-899,wire-changes R2,BREAKING)**:7.57.0–7.106.0 还随武装两键发一只极性位 `intentArming`(7.106.0 起单极恒真),
4122
4174
  * 7.107.0 起**恒缺席**,本包**删声明**(零别名、零双读)。老 server 发来的那只旧键落进 {@link PermissionModeAutoBase} 的透传索引签名
@@ -4209,19 +4261,10 @@ export interface Capabilities extends EngineCapabilityBits {
4209
4261
  generationEcho?: boolean;
4210
4262
  [k: string]: unknown;
4211
4263
  };
4212
- /** #3([1894];server 1.299–7.51)workspace 浏览面能力族——对象=面在场(E19 快照店读面+durable 会话店
4213
- * 齐;`maxFileBytes`=file 端点单文件上限,超限 413 `workspace_file_too_large` 信封指路 archive),
4214
- * `false`/缺席=面不在(路由 501 同谓词)。
4215
- * 🔴 **RETIRED(server ≥7.52,S-15/design/381)**:整树快照纪元退役 ⇒ 本位恒 `false`,四条
4216
- * `/v1/sessions/:id/workspace*` 路由形保留但恒答 501 `capability.workspace_retired`(拒因点名纪元退役,
4217
- * 不让消费端拿 404 猜拼写)。per-edited-file rewind 历史没有「整个工作区」的 manifest 可投影 ——
4218
- * 将来若需「rewind 覆盖面」浏览是一个 NEW 面,不是把这个名字接回去。消费姿势不变:探本位,false 即不渲。 */
4219
- workspace?: false | {
4220
- browse?: boolean;
4221
- archive?: boolean;
4222
- maxFileBytes?: number;
4223
- [k: string]: unknown;
4224
- };
4264
+ /** 工作区浏览面的能力位 —— **支持面内恒 `false`**(server ≥7.52,S-15 / design/381:整树快照纪元退役;四条 `/v1/sessions/:id/workspace*` 路由形保留但恒答
4265
+ * 501 `capability.workspace_retired`)。per-edited-file rewind 历史没有「整个工作区」的 manifest 可投影 —— 将来若有「rewind 覆盖面」浏览,那是一个新面,不是把这个名字接回去。
4266
+ * ⚰️ sdk 26.0.0 删了这一位的对象臂(`{ browse, archive, maxFileBytes }`,server 1.299–7.51)与 `client.workspace` 四动词(底线 7.52.0 之下才有)。 */
4267
+ workspace?: false;
4225
4268
  /** `POST /v1/leader` 车道位。**server ≥7.122.0 读两个条件的合取**:leader 面在场(`LEADER_ENABLED` 等挂着)**且**运维入口地板收 leader 提交 ——
4226
4269
  * 后者与受理口 422 `request.autonomy_lane_refused` 读**同一对判据**(入口词是 `plan` 的 leader run 没有计划审阅通道)。所以运维 `AUTONOMY=plan` 的部署上本位读 **false**
4227
4270
  * (直接提交仍答 422 `request.autonomy_lane_refused`);`AUTONOMY=read-only` / `ask` / 缺席时本位随面在场。面缺席的 false 在提交时答 501 `capability.leader_endpoint_required`
@@ -4242,7 +4285,7 @@ export interface Capabilities extends EngineCapabilityBits {
4242
4285
  * 多租户 fail-closed=空)∩ 每拍活展开目录 —— 词表里的词两道门都过,目录外词(部署配置错误)被滤。
4243
4286
  * 空数组=本部署无可用词(多租户未显式配置的诚实形);缺席=老 server(降级为不教不校)。 */
4244
4287
  workflowModels?: string[];
4245
- /** 🔴 E18 rewind gate(service src/http/routes/capabilities.ts `Boolean(resumeAnchorStore && sessionStorage.getLeafId)`)—— `TaskRequest.resumeAt`
4288
+ /** 🔴 E18 rewind gate(service src/http/routes/capabilities.ts;server ≥7.135.0 `Boolean(resumeAnchorStore && headReadOf(sessionStorage))`,≤7.134.x `Boolean(resumeAnchorStore && sessionStorage.getLeafId)`)—— `TaskRequest.resumeAt`
4246
4289
  * 能否 resolve。false/缺 ⇒ shell 隐藏「rewind 到某条消息」入口,别 trial-by-4xx。本/云均可(anchor store 各后端都在),
4247
4290
  * 仅 env-only/无后端 worker false。 */
4248
4291
  resumeAt?: boolean;
@@ -4372,13 +4415,23 @@ export interface Capabilities extends EngineCapabilityBits {
4372
4415
  /** server ≥7.116.0(S-509,契约附录 B.1,谓词类「设施依赖」):**会话同步的文件历史 blob 面**可用 —— `PUT /v1/sessions/:id/sync/blobs/:hash` 与
4373
4416
  * `GET /v1/sessions/:id/sync/history/blobs/:hash` 两口。= {@link sessionSync} ∧ 文件历史店有 blob 传输面(`syncBlobFaces`;**只有 SQL 后端有**,`DB_BACKEND=local` 上恒 `false`)。
4374
4417
  * 🔴 **两端都读**:同步是 src → dst 两个 peer,**任一端为 `false` ⇒ 只同步对话**:别推 `fileHistory`、别 PUT blob(把 `fileHistory` 推给没有 blob 面的对端,
4375
- * commit 之后因缺 blob 422 `missing_blob`)。位为 `false` 时两口答 **501 `capability.snapshot_store_required`**(任何会话 id 同一句,先于属主判);
4418
+ * **第一阶段**〔零暂存零提交,对话也不落〕就 422 `missing_blob`:server ≥7.135.0 把预检前移,7.134.x 及更早是对话提交之后的第二阶段才 422;`false` 的端点只同步对话)。位为 `false` 时两口答 **501 `capability.snapshot_store_required`**(任何会话 id 同一句,先于属主判);
4376
4419
  * blob「未被会话历史图引用 / 字节不存在」仍是 404 `not_found.blob`(scope 边界,只在有 blob 面的后端上可达)。
4377
4420
  * ⚠️ **缺席 = 老 server(≤7.115.x)= 不知道**:那里 `sessionSync: true` 的 local 部署上 PUT blob 恒 501、`GET …/sync/history/blobs` 对清单引用的 blob 恒 404(位说「能」而口恒拒)。
4378
4421
  * sdk 17.0.0 起编排 verb 按一条律读(`pushSessionBundle` / `pullSessionBundle` / `importSessionBundle` 同读):**信封引用了 blob 而某一端位缺席 ⇒ 不搬**(`fileHistory:"skipped"`,只同步对话);
4379
4422
  * 信封不引用 blob(只有回退边界)⇒ 照带 —— 16.2.0–16.3.0「缺席 ⇒ 照旧尝试」退役(那一读法在 7.52–7.115 的 local 后端上改过文件的会话整次抛),
4380
4423
  * 见 {@link import("./sync.js").PushSessionResult.fileHistory}。 */
4381
4424
  sessionSyncFileHistory?: boolean;
4425
+ /** server ≥7.135.0(契约附录 B.1,谓词类「恒真」):**会话规则记录认协议命名空间的覆盖形**。为 `true` ⇒ 会话规则(`PUT /v1/sessions/:id/policy` 与 `POST /v1/sessions/:id/sync/import` 的 `policy` 面)
4426
+ * 的 `toolAllow` / `toolDeny` 里,引擎协议表上**每一个**命名空间(今天 `mcp__` 与 `a2a__`)的三种覆盖形 —— 整对端 `mcp__srv`、工具段通配 `mcp__srv__*`、工具段 glob `mcp__srv__get_*` —— 引擎的匹配器认成**一组工具**,写口收。
4427
+ * 壳据位放开自己对这三形的无损判定,不按版本猜。🔴 位**只说命名空间的覆盖形**:`*`、对端段的部分通配(`mcp__git*`)、尾分隔 `mcp__srv__` 照旧由写口拒(`400 rules.inert_entry`);整协议名 `mcp__*` 只在 `toolDeny` 收(拒这一协议的每一只工具)。
4428
+ * 与 {@link sessionPolicy} 正交(那一位答有没有会话规则写面):壳读法 = `sessionPolicy` ∧ 本位。**键缺席 = 老 server(≤7.134.x)与位为 `false`:一律按「不放宽」读**。 */
4429
+ sessionRulesNamespaceForms?: boolean;
4430
+ /** server ≥7.135.0(附录 B.1,恒真版本事实位):顶层请求键 {@link TaskRequest.projectMemory} 受理(唯一的词 `"disabled"`)。读面不挂设施:没接项目上下文座的部署照样受理(清单上答 `"absent"`)。
4431
+ * **键缺席 = 老 server**:键闭集门对 `projectMemory` 答 `400 request.body_shape`(`unknownKeys` 点名)—— 见位才发。 */
4432
+ projectMemory?: boolean;
4433
+ /** server ≥7.135.0(附录 B.1,恒真版本事实位):场景卡 `GET /v1/capabilities/scenarios/:name` 带 `skills[]`({@link ScenarioDetail.skills})。**键缺席 = 老 server:读不到清单,不是「这个场景没有技能」**(那是 `skills: []`)。 */
4434
+ scenarioSkills?: boolean;
4382
4435
  /** 🔴 K-5 session-resume gates(service src/http/routes/capabilities.ts,§0.5 session 抽象)—— shell 的 `/resume` picker 据此诚实
4383
4436
  * gate,别 trial-by-501:`sessionList` = list 可用(`Boolean(sessionStorage.listSessions ?? runStore.listSessions)`,
4384
4437
  * 喂 picker 行);`sessions` = transcript preview 可用(`Boolean(sessionAudit)`,`GET /v1/sessions/:id`→SessionAudit)。
@@ -4393,8 +4446,9 @@ export interface Capabilities extends EngineCapabilityBits {
4393
4446
  /** 🔴 契约调和车1 H②(2026-08-02;server `src/http/routes/capabilities.ts` 的 `sessionEvents` 位 —— **server 一直在发,
4394
4447
  * SDK 与 spec 两侧此前同缺** ⇒ 消费方读它掉进开集拿到 `unknown`)。
4395
4448
  * `GET /v1/sessions/:id/events`(session 级 SSE 头订阅,{@link SessionsResource.watch})的门,谓词是
4396
- * **三与**:durable `sessionWatch` 在场 **且** session 店同时具备 `getLeafId` **和** `ownerOf`
4397
- * —— 路由 501 用的是同一个谓词,所以 `says yes ⟺ route works` 在这一位上成立。
4449
+ * **二与**(server ≥7.135.0):durable `sessionWatch` 在场 **且** session 店具备会话头读面 `headOf`
4450
+ * (≤7.134.x 是**三与**:`sessionWatch` ∧ `getLeafId` ∧ `ownerOf`)—— 这两个老方法随 7.135.0 的店契约退出,
4451
+ * 所以 `DB_BACKEND=memory` 上这一位现在是 `true`(此前 `false`)。路由 501 用的是同一个谓词,`says yes ⟺ route works` 在这一位上成立。
4398
4452
  * false/缺席 ⇒ 退回轮询 `GET /v1/sessions/:id/head`(那条面无此门),别 trial-by-501。
4399
4453
  * ⚠️ 现势(server [2373]A-5,2026-08-02):这一位**还没有已接线的消费端** —— 它是预备位,不是
4400
4454
  * 「大家都在用」的面;按它 gate 是对的,把它当「已被广泛消费」来推断则不是。 */
@@ -4474,6 +4528,10 @@ export interface Capabilities extends EngineCapabilityBits {
4474
4528
  /** server ≥7.133.0:**只收紧座位表**恒受理——请求 `settings.readDenyPatterns` / `settings.writeProtectedExtra` / `settings.complianceAdditionalDenies` / `settings.permissions.neverAuto` 四键
4475
4529
  * (见 {@link SemaSettings} 对应成员):每座 = 部署表 ∪ 请求列表,**只增不减**,空数组 ≡ 没送。恒 `true`;**位缺席 = 老 server —— 对这四键答 400 `request.body_shape`,见位才发**。 */
4476
4530
  tightenOnlySeats?: boolean;
4531
+ /** server ≥7.134.0:请求键 {@link import("./settings.js").SemaSettings.approvalFrameFamilies}(这条 run 的客户端渲染得了哪些审批开卡帧族)的**受理位**,恒 `true`(不随部署形变)。
4532
+ * 🔴 **触发位就是它,不是顶层 {@link Capabilities.approvalFrameFamilies}**:≤7.133.x 已有顶层位,却对这只键答 `400 request.body_shape`
4533
+ * (`unknownKeys: ["settings.approvalFrameFamilies"]`)—— 位缺席 ⇒ 别发这只键。 */
4534
+ approvalFrameFamilies?: boolean;
4477
4535
  [k: string]: unknown;
4478
4536
  };
4479
4537
  /** 🔴 **server ≥7.115.0 起恒在**:`{ permissions: { allowGrant: true } }`;**≥7.117.0 起 `permissions` 多一位 `allowLayer: true`** —— 「请求体 `settings.permissions.allow` 按**哪一种读法**收」的**版本位**(wire additive;两位都是恒真、
@@ -4587,14 +4645,11 @@ export interface Capabilities extends EngineCapabilityBits {
4587
4645
  * (ask 账必须**持久** —— 内存形重启即丢已接受的决议)∧ park 设施在场(checkpoint 店 + DURABLE_APPROVAL,
4588
4646
  * = 窗口到期时的降级目的地;缺它的结局是 core fail-closed deny,比现行活卡更差,所以协议诚实地不上场)。
4589
4647
  *
4590
- * ⚠️ 部署默认位**分两段读**(`STREAM_APPROVAL_ENABLED` 是五合取里唯一会随版本改默认值的一项):
4591
- * · server **≤7.4.0 默认 OFF** —— 这些版本上绝大多数部署这一位是 `false`,能用的只有 legacy
4592
- * `tool_approval` 活卡腿({@link ToolApprovalsResource.respond});
4593
- * · server **≥7.5.0 默认 ON**(server CHANGELOG 以 BREAKING 披露;窗口默认同批 60s→300s)——
4594
- * 满足其余四合取的部署**默认**就在直播流上发两帧、回决端点真结算。
4595
- * `STREAM_APPROVAL_ENABLED=false` 是唯一干净还原键。7.5.0 已于 2026-08-07 上 npm,本仓的 live
4596
- * 契约门(`test/live/_fence.ts` 的校准头)也已抬到 7.5.0。
4597
- * ⚠️ 两段都还要读:第一段不是历史注脚,它描述**今天仍在跑的**全部 7.3.x/7.4.x 装机。
4648
+ * ⚠️ 部署默认位(`STREAM_APPROVAL_ENABLED` 是五合取里唯一会随版本改过默认值的一项):支持面内(server ≥7.52.0)**默认 ON** ——
4649
+ * 满足其余四合取的部署**默认**就在直播流上发两帧、回决端点真结算;`STREAM_APPROVAL_ENABLED=false` 是唯一干净还原键。
4650
+ * 🔴 **server ≥7.134.0 起,这条 run 收不收得到活卡还要看提交体**:任务 `settings.approvalFrameFamilies` 没声明的,零活卡(耐久店在场时按无人值守政策当场停驻,否则当场拒);
4651
+ * 本位为真只说「这台 worker 上协议上场」,不替提交体声明(见 {@link SemaSettings.approvalFrameFamilies} 与见位 `taskSettings.approvalFrameFamilies`)。
4652
+ * (默认 OFF 的是 server ≤7.4.0,已在支持底线之下;7.5.0 起默认 ON,server CHANGELOG 以 BREAKING 披露。)
4598
4653
  * 🔴 别按版本号猜、也别按这段散文猜:**唯一权威是本位的实测值**(它是五合取的结果,开关只是其中一项)。
4599
4654
  * 与 {@link Capabilities.toolApproval}(活卡腿)、{@link Capabilities.approvals}(durable checkpoint 腿)
4600
4655
  * 三位**正交**,可以各不相同 —— 别用其中一位推断另一位。 */
@@ -4608,8 +4663,11 @@ export interface Capabilities extends EngineCapabilityBits {
4608
4663
  * · `[]` —— 逐调用审批整面没开(`TOOL_APPROVAL_ENABLED=false`):**不呈卡**(这一位的 `[]` 不是「缺席」)。
4609
4664
  * 🔴 **键缺席 ≠ 空数组**:缺席 = server ≤7.132.x —— 那里 `streamApproval: true` 的腿**两族并发**(同一只 ask 先 `tool_approval`、后 `approval_request`,同带 `approvalId`),按 `approvalId` 去重。
4610
4665
  * 帧型:{@link import("./resources/tool-approvals.js").ApprovalCompleteFrame}、{@link import("./resources/tool-approvals.js").ApprovalRequestFrame}。
4666
+ * 🔴 **server ≥7.134.0:这一位只说「本 worker 呈卡用哪一族」,不再说「你会收到卡」** —— 一条 run 只在它的提交体声明了本位里的那个族时才有活审批通道
4667
+ * (请求键 {@link import("./settings.js").SemaSettings.approvalFrameFamilies},见位才发:受理位 {@link Capabilities.taskSettings}`.approvalFrameFamilies`);值本身不因声明而变。
4668
+ * 元素词表 = {@link import("./resources/tool-approvals.js").APPROVAL_FRAME_FAMILIES}(与请求键同一只)。
4611
4669
  */
4612
- approvalFrameFamilies?: Array<"tool_approval" | "approval_request">;
4670
+ approvalFrameFamilies?: ApprovalFrameFamily[];
4613
4671
  /**
4614
4672
  * #229(server ≥7.15.0,`routes/capabilities.ts` 的能力对象**硬编码 true**)—— 回决**理由**位在这台
4615
4673
  * worker 上存在的**版本探测位**:live `POST /v1/tool-approvals/:id/respond` 收 `note` + 回执带
@@ -4666,8 +4724,8 @@ export interface Capabilities extends EngineCapabilityBits {
4666
4724
  /** PUT /v1/sessions/:id/policy 面(`routes/capabilities.ts` 的能力对象 `Boolean(sessionPolicyStore)`)。 */
4667
4725
  sessionPolicy?: boolean;
4668
4726
  /** E18 code-only rewind 在场位(TaskRequest.rewindFilesTo;server `routes/capabilities.ts:839` =
4669
- * `Boolean(deps.fileHistoryStore && deps.resumeAnchorStore && deps.sessionStorage?.getLeafId)` —— 要还原(文件历史店)、
4670
- * 也要解析目标手柄(锚店 + `getLeafId`):「说 yes ⟺ 纯代码回卷的提交解析得出、还原得了」)。
4727
+ * `Boolean(deps.fileHistoryStore && deps.resumeAnchorStore && headReadOf(deps.sessionStorage))`(≤7.134.x 末项是 `deps.sessionStorage?.getLeafId`)—— 要还原(文件历史店)、
4728
+ * 也要解析目标手柄(锚店 + 会话头读面 `headOf`;≤7.134.x 是 `getLeafId`):「说 yes ⟺ 纯代码回卷的提交解析得出、还原得了」)。
4671
4729
  * 🔴 sdk 11.4.0 订正([8437] U3):旧注点名的是 S-15(design/381)之前的**整树快照店**,那一席早已换成
4672
4730
  * **文件历史店** `fileHistoryStore`。
4673
4731
  * 🔴 K-24 改真(server ≥7.104.0 / S-724):7.97.0–7.103.x 上那一席是**捕获脸**(后端 ∧ 部署旋钮 `FILE_HISTORY_CAPTURE`),关掉捕获的
@@ -4943,7 +5001,7 @@ export interface Capabilities extends EngineCapabilityBits {
4943
5001
  };
4944
5002
  /** 会话内 **MCP re-dial** 端点 `POST /v1/sessions/:id/mcp/reconnect` 的在场位(server ≥7.85.0 /
4945
5003
  * S-381 / core 7.22.0 #857;`routes/capabilities.ts:264` = `Boolean(deps.runStore) &&
4946
- * Boolean(deps.sessionStorage?.ownerOf)`)。谓词类 = **设施依赖**两项合取:持久 run 账面(动词要经 run 行
5004
+ * Boolean(deps.sessionStorage?.ownerOf)`;server ≥7.135.0 末项是 `headReadOf(deps.sessionStorage) !== undefined`)。谓词类 = **设施依赖**两项合取:持久 run 账面(动词要经 run 行
4947
5005
  * 找本副本活流)∧ 会话属主面(入站 owner 门 fail-closed,缺它整口 501)—— 两个 501 与本位从**同一批 deps**
4948
5006
  * 推导 ⇒「说 yes 但 501」结构上不可能。
4949
5007
  * 🔴 位为真**只**保证端点在场:不保证这一次有活 run(非 live ⇒ 409 `steering.not_running`),更不保证这条 run
@@ -5022,7 +5080,7 @@ export interface Capabilities extends EngineCapabilityBits {
5022
5080
  * (关 = 这条会话的每个提交都带它;续跑腿重放同一个体,照带);
5023
5081
  * · ⚰️ `"on-always"` —— **退役词**(server 7.104.0 起不再发出:请求词接线后「捕获中且关不掉」结构上不可达),7.97.0–7.103.x 的 worker
5024
5082
  * 仍发它 = 捕获中且**无法按会话关闭** ⇒ 只渲一句只读真话「本部署恒捕获,无法按会话关闭」(契约附录 B.1 逐臂),别渲关不掉的开关。
5025
- * 本包支持地板(3.0.0)之内的 server 真会发它,所以它留在联合里(K-24 复审 r1 M2,偏离任务书的「硬删」,理由如实:删了 ⇒ 随包 spec
5083
+ * 本包支持地板(7.52.0)之内的 server 真会发它,所以它留在联合里(K-24 复审 r1 M2,偏离任务书的「硬删」,理由如实:删了 ⇒ 随包 spec
5026
5084
  * 判一份合法的 7.103 能力面违约、消费端写不出契约要的那一臂);登记 `_keyset-divergence.ts` `CAPABILITY_RETIRED_WORDS`,
5027
5085
  * 删除条件 = 支持地板抬过 7.104.0。
5028
5086
  * 词表外的词按未知处理(不按前缀猜,不渲开关)。⚠️ 关掉 ≠ 删掉:部署翻成 `"off"` 不做任何批量删除。
@@ -5057,7 +5115,7 @@ export interface Capabilities extends EngineCapabilityBits {
5057
5115
  workspaceSync?: WorkspaceSyncCapability;
5058
5116
  /** **会话后台任务两口的在场位**(server ≥7.102.0 / S-745 / core 7.32.0 #1107;铸点 `routes/capabilities.ts:308` =
5059
5117
  * `{ listFace: sessionBackgroundFacesAvailable(deps), exitFaces: sessionBackgroundFacesAvailable(deps) }`,与两口的 501
5060
- * **同一只谓词**:会话属主面 `sessionStorage.ownerOf` 在场 ⇒「说 yes 但 501」结构上不可能;缺它 ⇒ 两位显式 `false`、
5118
+ * **同一只谓词**:会话属主面(server ≥7.135.0 是 `sessionStorage.headOf`,≤7.134.x 是 `ownerOf`)在场 ⇒「说 yes 但 501」结构上不可能;缺它 ⇒ 两位显式 `false`、
5061
5119
  * 两口 501 `capability.session_ownership_required`)。
5062
5120
  * · `listFace` —— `GET /v1/sessions/:id/background` 在场({@link import("./resources/sessions.js").SessionsResource.background});
5063
5121
  * · `exitFaces` —— `POST /v1/sessions/:id/background/stop` 在场({@link import("./resources/sessions.js").SessionsResource.backgroundStop})。
@@ -5285,8 +5343,23 @@ export interface ScenarioDetail {
5285
5343
  * `git_client_unconfigured` = scan/code-review 这类 repoTools 场景缺 GIT_API_* 配置);按键分支,
5286
5344
  * 禁匹配英文文案。server 若扩词表=additive,未知词按「不可用但原因未知」处置。 */
5287
5345
  unavailableReason?: string;
5346
+ /** server ≥7.135.0:**这个场景的 run 装着的部署技能**清单(本部署技能目录 ∪ 配置源交来的,按场景过滤;请求体自带的 `skills` 不在内)—— 与交进 `TaskSpec` 的那一份是同一只过滤、同组同序。
5347
+ * 壳的 `/技能名` 补全读它,点名走 `userInvokedSkills`。条目不带正文,也不带技能上的两只工具清单。恒在场(无技能 ⇒ `[]`);**键缺席 = 老 server:读不到清单,不是「这个场景没有技能」**。
5348
+ * 卡上有、run 里没有的两种:`disableSkills: true` 的那一发;正文超引擎加载上限的技能(点它的名答 `config.user_invoked_skill_unknown`)。位见 {@link Capabilities.scenarioSkills}。 */
5349
+ skills?: ScenarioSkill[];
5288
5350
  [k: string]: unknown;
5289
5351
  }
5352
+ /** {@link ScenarioSkill.source} 的闭集(server ≥7.135.0,自铸词表 `scenarioSkillSource`):`factory` = 本部署的技能目录(`SKILLS_DIR`);`center` = 配置源交来的(中心 / 本地 `config.d` 的技能清单,或配置声明的插件;
5353
+ * 按名盖掉出厂同名的那只也是 `center`)。 */
5354
+ export declare const SCENARIO_SKILL_SOURCES: readonly ["factory", "center"];
5355
+ /** {@link SCENARIO_SKILL_SOURCES} 的成员型。 */
5356
+ export type ScenarioSkillSource = (typeof SCENARIO_SKILL_SOURCES)[number];
5357
+ /** 场景卡 {@link ScenarioDetail.skills} 的一行(server ≥7.135.0):`{ name, description, source }`,不带正文。 */
5358
+ export interface ScenarioSkill {
5359
+ name: string;
5360
+ description: string;
5361
+ source: ScenarioSkillSource;
5362
+ }
5290
5363
  /** A pending HITL checkpoint — the RICH `/v1/approvals` operator-queue row (true shape;
5291
5364
  * ASSISTANT-WIRE-CONTRACT §7(b), service main 1fafeec / core 1.110.0). ⚠️ createdAt/deadline are EPOCH MS.
5292
5365
  *
@@ -5303,7 +5376,7 @@ export interface ScenarioDetail {
5303
5376
  * `GET /v1/approvals` 的**信封**(`client.approvals.list()` 的返回,wire 体原样)—— server `src/http/routes/approvals-assistant.ts` 的 `approvals-list` 臂一次 `sendJson` 铸四键:
5304
5377
  * · `pending` —— 耐久停驻行(决议走 `POST /v1/approvals/:sessionId/decide`);恒在场;
5305
5378
  * · `serverNowMs` —— **本响应铸造时刻**的服务器钟(server ≥7.57.0;同版本恒在场)。壳渲倒计时用 `deadline − serverNowMs`,别减本机钟(钟差会让「还剩 4 分钟」的卡其实早过期);
5306
- * ≤7.56.x 的 server 不带它(本包支持地板 3.0.0 之内,所以型上可选);
5379
+ * 7.52–7.56.x 的 server 不带它(本包支持地板 7.52.0 之内,所以型上可选);
5307
5380
  * · `livePending?` —— 流内窗里的活 ask(server ≥7.43;决议走 `POST /v1/tool-approvals/:id/respond`)。**缺席 = 本部署没有活审批面**,`[]` = 有面、此刻无待批;
5308
5381
  * · `crashConverged?` —— 启动时收敛掉的**审计行**(server ≥7.55.0;只在 local 车道审计店在场时在场,`[]` = 有面且无崩溃残账)。行不是队列行:无决议路由、不复活 run。
5309
5382
  * 三族行形与决议路由各不相同,**分数组不混编**(数组名即路由判据)。
@@ -5368,7 +5441,7 @@ export interface LivePendingRow {
5368
5441
  * 上同名键同源)。此前只在 `frame` 里。 */
5369
5442
  mandated?: true;
5370
5443
  /** server ≥7.102.0(S-721 / core 7.32.0 #1092)—— 强制位站在哪一个词上,与 `mandated` 同层同形(在场逐字,缺席不编词);
5371
- * 值 = 条目上那一个词(与 {@link frame} 上同名键同源)。六词闭集与「缺席 ≠ 不强制」见
5444
+ * 值 = 条目上那一个词(与 {@link frame} 上同名键同源)。闭集与「缺席 ≠ 不强制」见
5372
5445
  * {@link import("./resources/tool-approvals.js").PersistedRuleMandate}。 */
5373
5446
  mandate?: PersistedRuleMandate;
5374
5447
  /** server ≥7.102.0(S-755 / cli L-695 / C-R111)—— ask 的**出身词**(谁提的这一问),与 `mandate` 同层同形;值 = 条目上那
@@ -5458,23 +5531,11 @@ export interface PendingCheckpoint {
5458
5531
  * SQL 店里仍读不出登记门类的行**不列**(计数 `server.approvals.queue-row-gate-kind-missing`;也没有决断口绑得住它),而不是缺着这个键送出。
5459
5532
  * ⇒ 对着 ≥7.132.0 的 server,缺席**到达不了**;对着 7.131.x 及更早的 server,缺席 = pre-`gate_kind` 的历史 SQL 行(`gate_kind` 列为 NULL)。
5460
5533
  * 消费端对缺席的读法一句(server 契约原话):**按「读不出」fail closed**(不当 `"human"`、不编类别、不路由到任何决断口)。
5461
- * ⚠️ 本位**刻意仍是可选**(与 {@link import("./errors.js").ResumeBlockedByPolicyError.blockedBy} 同一条律,K-24 复审 r1 M1):支持地板 3.0.0 之内的老 server 真的会缺它 ——
5534
+ * ⚠️ 本位**刻意仍是可选**(与 {@link import("./errors.js").ResumeBlockedByPolicyError.blockedBy} 同一条律,K-24 复审 r1 M1):支持地板 7.52.0 之内的老 server(≤7.131.x)真的会缺它 ——
5462
5535
  * 型上写必有 = 让老 server 上的缺席变成一个型说「不可能」的值。支持地板抬过 7.132.0 的那一版改必有(那时缺席不再可达)。 */
5463
5536
  gateKind?: string;
5464
- /** server 7.16.0([3684]②):同步卡早有的「别再问我这个」持久规则候选,durable 队列行补齐供给——
5465
- * 数组序=展示序,EXACT 形若在场恒在首位;core 契约 basis ≤ 2,server 执法上限 4 ⇒ 消费端按 ≤4 布局
5466
- * (与同步 AskRequest.ruleSuggestions 同契约)。
5467
- * 🔴 **display/triage-only,耐久腿无兑付口**:`POST /v1/approvals/:sessionId/decide` 的体不带规则位,
5468
- * 唯一能兑付的是**同副本活卡腿** `POST /v1/tool-approvals/:id/respond` 的 `persistRule`(且要
5469
- * `capabilities.permissionRules`)——渲这一格按只读渲(WIRE-CONTRACT §7b 射程句同源)。
5470
- * ⚠️ 缺席 = 老行(列诞生前 park)或该 ask 无候选——两者都按「无候选」渲染,别当错误。 */
5471
- ruleSuggestions?: Array<{
5472
- rule: string;
5473
- match: "exact" | "prefix";
5474
- command: string;
5475
- }>;
5476
5537
  /**
5477
- * S-134(server ≥7.46.0;core 5.58.0 design/375)—— 上一条**退役键的换形继任**:同一条 core 契约
5538
+ * S-134(server ≥7.46.0;core 5.58.0 design/375)—— ≤7.45 的三元组键 `ruleSuggestions` 的**换形继任**(旧键 sdk 26.0.0 随底线 7.52.0 删):同一条 core 契约
5478
5539
  * (`PendingAction.ruleOffers` ≡ 同步腿 `AskRequest.ruleOffers`),形是判别联合 `single | batch`,
5479
5540
  * 逐字见 {@link import("./resources/tool-approvals.js").RuleOffer}。
5480
5541
  * server ≥7.46.0 的行上**只铸新键**;pre-5.58 的老行按新窄读逐条不合 ⇒ 整格「无供给」(不做兼容读)。
@@ -5486,7 +5547,8 @@ export interface PendingCheckpoint {
5486
5547
  * 活卡帧腿相反({@link import("./resources/tool-approvals.js").ToolApprovalFrame.ruleOffers}):
5487
5548
  * 那侧 server 是纯前缀截、零逐条丢弃,下标恒等于 core 的 offer index,兑付真发生在那条腿上。
5488
5549
  *
5489
- * 🔴 **display/triage-only** 与 {@link ruleSuggestions} 同律;**缺席 = 真的没有供给**(规则车道没武装 /
5550
+ * 🔴 **display/triage-only,耐久腿无兑付口**:`POST /v1/approvals/:sessionId/decide` 的体不带规则位,唯一能兑付的是**同副本活卡腿**
5551
+ * `POST /v1/tool-approvals/:id/respond` 的 `persistRule`(且要 `capabilities.permissionRules`)—— 渲这一格按只读渲;**缺席 = 真的没有供给**(规则车道没武装 /
5490
5552
  * 命令说不出规则 / 规则清不掉这只 ask / 老行),不是「投影层漏了」—— 后者正是 server 把这一格搬上
5491
5553
  * 耐久腿要修的病。恒不铸 `null`、不铸 `[]`。
5492
5554
  */
@@ -5508,7 +5570,7 @@ export interface PendingCheckpoint {
5508
5570
  * core d.ts:与 `requiresRealApproval`(只有人能清 —— 蕴含本位)、`ruleOffersAbsence` 三位彼此独立,投影逐位照投、不互推。 */
5509
5571
  mandated?: true;
5510
5572
  /** server ≥7.102.0(S-721)—— 强制位站在哪一个词上(park 行孪生座经 `readClosedWordSeat(…, "mandate")` = core
5511
- * `isPersistedRuleMandate` 筛;集外词读作缺席)。与 inbox 行对同一张行逐字同答。六词与读法见
5573
+ * `isPersistedRuleMandate` 筛;集外词读作缺席)。与 inbox 行对同一张行逐字同答。词表与读法见
5512
5574
  * {@link import("./resources/tool-approvals.js").PersistedRuleMandate}。 */
5513
5575
  mandate?: PersistedRuleMandate;
5514
5576
  /** server ≥7.102.0(S-755 / cli L-695 / C-R111)—— 谁提的这一问(park 行孪生座 `PendingAction.tool_approval.origin`,
@@ -5742,7 +5804,8 @@ export interface SessionListPage {
5742
5804
  /** E6(shell-host permissionMode;core `SessionPermissionRules` session-policy-store.ts:23,service `GET/PUT
5743
5805
  * /v1/sessions/:id/policy`,SHIPPED)—— operator 收紧的 per-session 工具权限规则(core 在 prepare-time SUBTRACT-only
5744
5806
  * 读它)。**三只**开放可选 string[] 桶;读写均经 {@link StoredSessionRules}(带 `rev` OCC 键)。🔴 **tighten-only 不变式**
5745
- * core 强制:普通(非 operator)写只能收紧(删 deny / 不能放宽 allowlist/allowDirs)→ 放宽 403 `loosen_forbidden`;
5807
+ * core 强制:普通(非 operator)写不得放宽 operator 写下的那一部分(删 deny / 放宽 allowlist/allowDirs)→ 放宽 403 `loosen_forbidden`
5808
+ * (server ≥7.135.0 起比的是行的 operator 部分 {@link StoredSessionRules.operatorRules},属主收得回自己加的条目;7.134.x 及以前是对整行只减不加;句子随版换,只按码读);
5746
5809
  * CAS `expectedRev` 不符 → 409 `conflict`;ownerless session → 409;non-owner → 404(无 existence oracle)。
5747
5810
  * 🔴 **server ≥7.129.0(引擎 7.51.0)一种文法**:`toolAllow` / `toolDeny` 装**规则条目** —— 工具名、`mcp__<server>`、或工具自己文法的规则
5748
5811
  * (`Bash(git push:*)` / `Edit(docs/*)`;条目 `Bash(rm:*)` 按命令名拒 `rm`,连接链任一段:`toolDeny: ["Bash(rm:*)"]`)。命令桶 `commandAllow` / `commandDeny` **退役**(本型 23.0.0 起删,零别名):
@@ -5757,14 +5820,29 @@ export interface SessionPermissionRules {
5757
5820
  /** 设了 = 写工具(Q6/core 1.161 起 CC 名 `Write`/`Edit`)仅可写这些目录内;不能路径约束的写工具(如 `Bash`)在它设了时被禁。RAW 存,run 时解析。 */
5758
5821
  allowDirs?: string[];
5759
5822
  }
5823
+ /** {@link StoredSessionRules.operatorRules}:行的 operator 部分 = 三只桶 + 它自己的文法戳(`grammar` 恒在,是引擎写口判官盖的)。 */
5824
+ export interface SessionRulesOperatorPart extends SessionPermissionRules {
5825
+ grammar: number;
5826
+ }
5760
5827
  /** {@link SessionPermissionRules} + store 盖的单调 `rev`(OCC 键)。GET/PUT 的 `{rules}` 信封里就是这个。
5761
- * PUT 回送 `rev` 作下次 `expectedRev`(CAS)。 */
5828
+ * PUT 回送 `rev` 作下次 `expectedRev`(CAS)。
5829
+ * server ≥7.135.0 起行可多一键 {@link StoredSessionRules.operatorRules}(operator 部分;**缺席 = 整行归 operator**)—— 非 operator 写不得放宽的是它,不是整行。 */
5762
5830
  export interface StoredSessionRules extends SessionPermissionRules {
5763
5831
  rev: number;
5832
+ /** server ≥7.135.0(引擎 7.55.0):**这一行的 operator 部分** —— 最近一次 **operator** 写下的那几只桶(外加它自己的 `grammar` 戳),非 operator 写不得放宽的那条线。
5833
+ * **缺席 = 整行归 operator**(operator 的写、以及 7.135.0 之前存下的每一行 —— 存量行读法与升级前同:属主一条也收不回)。
5834
+ * 部分只由引擎的写口判官铸,店整只存、原样读回;`PUT` 回包、`GET` 命中存量行与 2c `GET …/sync/manifest` 的 `policy[].rules` 同带。
5835
+ * 🔴 **回显的 `operatorRules` 的读法(发布字节读出,两条入口不同)**:**`PUT …/policy`:回显的部分一律被忽略** —— 路由先过一遍写口读者(它的产物不带 `rev`)再交店重判,店看到的是不带 `rev` 的值:
5836
+ * 有存行 ⇒ 沿用**存行**的 operator 部分,无存行 ⇒ 盖一只只带戳的空部分。所以普通 `PUT` 想「收回自己加的条目」只管不带 `operatorRules` 地发新值(`expectedRev` = 读到的那一行),别指望回显它能改写 operator 线。
5837
+ * **同步导入的重放(`POST …/sync/import` 的 `policy[]` 记录,记录带 `rev`)**:**有存行**时沿用**存行**的部分、回显值被忽略;**无存行**时,非 operator 的记录若给的是一份「像存行」的值(带 `rev` ≥ 1)
5838
+ * 则采用值自己带的部分(采用之后那一部分**就是这一行的 operator 线**:事后收回它 ⇒ `403 loosen_forbidden`),否则盖一只只带戳的空部分;operator 写恒不带部分。
5839
+ * 非 operator 的写在**空行**上盖一只**只带戳**的部分(属主收得回自己加的条目:`PUT` 一份不带那一条的值,`expectedRev` = 读到的那一行,下一道工具门起生效);在 operator 部分之上随意加减,
5840
+ * 动到部分之内的条目 ⇒ `403 loosen_forbidden`、行不动。operator 写一次就把整行变成 operator 的(本键随之缺席)。 */
5841
+ operatorRules?: SessionRulesOperatorPart;
5764
5842
  /** server ≥7.92.0(引擎 7.25.0;老 server 缺席):会话规则的**血统世代**。一次 erase(`deleteBySession`)结束一条血统——
5765
5843
  * 其后首写带 gen+1;读者看到不同 gen 就当新血统而非延续,无论 rev。与 `rev` 高水位一起构成「rev 跨删除保序」契约。 */
5766
5844
  gen?: number;
5767
- /** server ≥ 7.129.0(引擎 7.51.2):这一行的条目按哪一代规则**文法**读 —— 引擎的写口判官给每一行盖的戳(本版 server 写下的行恒 `1`)。
5845
+ /** server ≥ 7.129.0(引擎 7.51.2):这一行的条目按哪一代规则**文法**读 —— 引擎的写口判官给每一行盖的戳(server ≥7.129.0 起写 `1`;**server ≥7.135.0 起写 `4`**,即引擎的 `SESSION_RULES_GRAMMAR`,发布字节上读到的现值;7.134.x 及更早写更小的号,读法不靠数值猜 —— 只当「这一行按哪一代文法读」的戳)。
5768
5846
  * 缺席 = 戳之前存下的行(文法 0:拼成规则形的 allow 条目 `Bash(rm:*)` 名了不存在的工具、什么都不放行;引擎照旧那样读并通告一次;
5769
5847
  * 服务端的一次性迁移改写存量行并盖戳)。把 GET 回的体连 `rev` 回传 PUT 而不带 `grammar` ⇒ 按文法 0 读(`400 rules.inert_entry`
5770
5848
  * reason `earlier_grammar`);`grammar` 比引擎新 ⇒ `400 rules.invalid_shape`(field `grammar`)。只写三只桶即盖当前文法。 */
@@ -6120,15 +6198,8 @@ export interface SessionRulesRecord {
6120
6198
  principal?: string;
6121
6199
  rules: StoredSessionRules;
6122
6200
  }
6123
- /** One E19 file snapshot keyed by a `SessionTreeEntry.id` — `manifest` = `[relPath, blobHash]` tuples. The blob
6124
- * BYTES are NOT inlined (a turn's working tree can be tens of MiB → OOM/413); they ride the content-addressed
6125
- * blob routes (GET …/snapshots/:key/blobs/:hash to pull, PUT …/blobs/:hash to push). */
6126
- export interface SyncSnapshot {
6127
- key: string;
6128
- manifest: Array<[string, string]>;
6129
- }
6130
6201
  /** core `FileHistoryExport`(`formatVersion: "file-history/1"`)的**镜像** —— server ≥7.52(S-15 / design/381)起会话同步搬运文件历史的信封,**取代**已退役的 E19 整树快照
6131
- * {@link SyncSnapshot}:per-edited-file 的版本链(tracked)+ 边界(boundaries);**blob 字节不在信封里**(按 hash 寻址,经 history blob 两口搬运,见
6202
+ * (≤7.51 的 `snapshots` 一代;sdk 26.0.0 随底线 7.52.0 删了它的型 `SyncSnapshot`):per-edited-file 的版本链(tracked)+ 边界(boundaries);**blob 字节不在信封里**(按 hash 寻址,经 history blob 两口搬运,见
6132
6203
  * {@link import("./resources/session-sync.js").SessionSyncResource.getHistoryBlob} / `putBlob`)。SDK 只读 `tracked[].versions[].blobHash`(决定要搬哪些 blob),其余**逐字透传**
6133
6204
  * (server 的 import 门按 `formatVersion` refuse-not-coerce、复核 `keyKind` / `keyFamily` 闭集 —— SDK 不替它判,也不复制那两张闭集词表:二者按 `string` 读)。
6134
6205
  * 键集对拍 core `dist/core/file-history-store.d.ts` 的 `FileHistoryExport`。 */
@@ -6168,7 +6239,7 @@ export interface SyncAnchor {
6168
6239
  owner: string | null;
6169
6240
  }
6170
6241
  /** `GET …/sync/manifest` → `{ manifest: SessionManifest }`. The THIN cross-backend snapshot: entry IDS (oldest-first,
6171
- * NOT payloads — those stream via `/sync/entries`) + per-snapshot relPath→blobHash + policy + anchors + leaf. The
6242
+ * NOT payloads — those stream via `/sync/entries`) + the file-history envelope + policy + anchors + leaf. The
6172
6243
  * local peer feeds `entryIds` to {@link classifySyncRelationshipByIds} to decide fast-forward/fork BEFORE pulling
6173
6244
  * the entry stream + only the blob hashes it lacks. Mirrors session-sync.ts SessionManifest:213. */
6174
6245
  export interface SessionManifest {
@@ -6179,13 +6250,9 @@ export interface SessionManifest {
6179
6250
  entryCount: number;
6180
6251
  /** The session's current leaf entry id, or null. */
6181
6252
  leafId: string | null;
6182
- /** 🔴 **server ≥7.52(S-15)起不发这个键、wire 上不再有它**(E19 整树快照纪元退役;server `exportSessionManifest` 铸 `{ sessionId, entryIds, entryCount, leafId, fileHistory, policy, anchors }`,
6183
- * 7.116.0 发布字节逐键核过)。≤7.51 老 server 仍发它。**缺席 = 这台 server 不发整树快照**(真正的文件历史在 {@link fileHistory});
6184
- * sdk 17.0.0 起本成员可选、`manifest()` 原样交回 wire(16.x 在缺席时填 `[]`,那一层过渡删了 —— 读它的代码按「缺席 = 没有」处理)。 */
6185
- snapshots?: SyncSnapshot[];
6186
- /** server ≥7.52:per-edited-file 文件历史信封({@link FileHistoryExport});`null` = 没有历史 / 源店导不出;**键缺席 = ≤7.51 老 server**(那一代走 {@link snapshots})。
6187
- * 搬 blob 前先读两端的 {@link Capabilities.sessionSyncFileHistory}(server ≥7.116.0)。 */
6188
- fileHistory?: FileHistoryExport | null;
6253
+ /** per-edited-file 文件历史信封({@link FileHistoryExport});`null` = 没有历史 / 源店导不出。**支持面内恒在场**(server ≥7.52 恒铸这个键;sdk 26.0.0 起必有 ——
6254
+ * ≤7.51 那一代的整树快照 `snapshots` 随底线 7.52.0 退出支持面,型删)。搬 blob 前先读两端的 {@link Capabilities.sessionSyncFileHistory}(server ≥7.116.0)。 */
6255
+ fileHistory: FileHistoryExport | null;
6189
6256
  policy: SessionRulesRecord[];
6190
6257
  anchors: SyncAnchor[];
6191
6258
  /** 🔴 **server ≥7.125.0**(契约 §20)—— 会话行的标题,经**列表行同一只投影**读(与 {@link SessionSummary.title} 同一个值:用户写的串,否则自动标题器的)。
@@ -6197,17 +6264,15 @@ export interface SessionManifest {
6197
6264
  /** 🔴 **server ≥7.125.0**(契约 §20)—— 会话行的置顶位(同 {@link SessionSummary.pinned};present-iff 与 {@link title} 同一条)。 */
6198
6265
  pinned?: boolean;
6199
6266
  }
6200
- /** The portable state of ONE session, ready to replay into another backend (mirrors session-sync.ts SessionBundle:193).
6201
- * Blobs are deliberately NOT inlined — each snapshot carries only its `manifest`; the bytes stream through the
6267
+ /** The portable state of ONE session, ready to replay into another backend (mirrors session-sync.ts SessionBundle).
6268
+ * Blobs are deliberately NOT inlined — the file-history envelope carries only blob hashes; the bytes stream through the
6202
6269
  * content-addressed blob routes. The SDK assembles this from a manifest + the streamed entries for a PUSH. */
6203
6270
  export interface SessionBundle {
6204
6271
  sessionId: string;
6205
6272
  /** The FULL durable conversation log, verbatim ids/parents/payload (oldest-first). */
6206
6273
  entries: SyncEntry[];
6207
- /** 同 {@link SessionManifest.snapshots}(≤7.51 老 server 的整树快照;缺席 = 源是 ≥7.52)。 */
6208
- snapshots?: SyncSnapshot[];
6209
- /** 同 {@link SessionManifest.fileHistory}(server ≥7.52 的文件历史信封;键缺席 = 源是 ≤7.51 老 server)。 */
6210
- fileHistory?: FileHistoryExport | null;
6274
+ /** 同 {@link SessionManifest.fileHistory}(必有;`null` = 没有历史 / 源店导不出 / 拉取时源端没有 blob 面而不搬)。 */
6275
+ fileHistory: FileHistoryExport | null;
6211
6276
  policy: SessionRulesRecord[];
6212
6277
  anchors: SyncAnchor[];
6213
6278
  }
@@ -6602,16 +6667,15 @@ export interface InboxRow {
6602
6667
  /** server ≥7.69.0(core 7.10.0 #616)—— **为什么这一问会到我手上**:分类器被咨询过但答不了。inbox 是
6603
6668
  * **分诊**面,`breaker_open` 在这里价值最大 —— 它预告的是一场审批风暴,而不是一次偶发询问。
6604
6669
  * 形与三条硬读法(开集 `cause` / 缺席不是断言 / switch 带 default)逐字见 {@link ClassifierUnavailable}。
6605
- * ⚰️ **`classifierUnavailable` 退役(server 7.72.0 / core 7.14.0 #688,BREAKING 无别名)**:server 三腿自 7.72.0 起
6606
- * **恒不再铸它**;继任是 `tool_end.gate` / `permissionDenied.gate` 上的 `disposition.cause`(闭二词
6607
- * `unavailable` / `parse_error`,答的是「这次 deny 是什么形」而非「为什么不可用」,旧 switch 搬不过去)。
6608
- * SDK 保留声明只为读 [7.69.0, 7.72.0) 窗内的旧 server;登记在 `_keyset-divergence.ts` 退役名单。 */
6670
+ * ⚰️ **退役(server 7.72.0 / core 7.14.0,BREAKING 无别名)**:server 三腿自 7.72.0 起**恒不再铸它**;继任是 `tool_end.gate` / `permissionDenied.gate` 上的
6671
+ * `disposition.cause`(闭二词 `unavailable` / `parse_error`,答的是「这次 deny 是什么形」而非「为什么不可用」,旧 switch 搬不过去)。
6672
+ * 🔴 **为什么本面还留着这一位**:本行的随包 spec 是**闭形**(`additionalProperties: false`)—— 支持面内
6673
+ * [7.69.0, 7.72.0) 的 server 仍会发它,删了就让那些 server 的合法行对 spec 违约。何时删、帧上同名键为何还留:权威说明在帧注 {@link ToolApprovalFrame.classifierUnavailable},本行只指向(卡上的同名键另按钉版卡 schema 仍收而留,见 {@link ApprovalCard.classifierUnavailable})。 */
6609
6674
  classifierUnavailable?: ClassifierUnavailable;
6610
- /** server ≥7.72.0(core 7.14.0 #688 C3,additive)—— **规则车道读不通的是哪一半**:在场 ⇔ `origin ===
6611
- * "rule_store_unavailable"`;`store` = 规则店读不了(运维:店与网络),`call` = 店读到了但这条命令按人的
6612
- * deny/ask 行读不出来(提示词:命令写法)。形与硬读法逐字见 {@link ToolApprovalFrame.ruleStoreUnreadable}。
6613
- * ⚰️ **退役(server 7.106.0 / core 7.34.0 C-R172)**:与帧上同名位同批退场 —— 继任 = 会话流 `engine_notice` `permission.rule_store_unavailable`;
6614
- * 保留声明只为读 [7.72.0, 7.106.0) 的旧 server。 */
6675
+ /** server ≥7.72.0(core 7.14.0 #688 C3,additive)—— **规则车道读不通的是哪一半**(`"store"` / `"call"`)。
6676
+ * 形、在场条件、两词语义、⚰️ 退场句与退役条件的**权威说明在帧注**:{@link ToolApprovalFrame.ruleStoreUnreadable},本行只指向 —— 本行与帧上的同名键同读、同留。
6677
+ * 🔴 **为什么本面还留着这一位**:本行的随包 spec 是**闭形**(`additionalProperties: false`)—— 支持面内 [7.72.0, 7.106.0) 的 server 仍会发它,
6678
+ * 删了就让那些 server 的合法行对 spec 违约。 */
6615
6679
  ruleStoreUnreadable?: "store" | "call";
6616
6680
  /** 任务目标(从 task ctx 富化;契约明确 "`null` if unavailable" —— 真回 null 的字段,非 OMIT)。 */
6617
6681
  objective: string | null;
@@ -6761,7 +6825,7 @@ export interface AssistantTaskStatus {
6761
6825
  * 🔴 与 live 流上的 `wiring_manifest` 帧**同类不同半场**,一个形状承两半(消费端要把两面对上,所以不拆
6762
6826
  * 成两个类型);**哪些键属于哪一半是确定的,不是「通常」**:
6763
6827
  * · effective 半场(live 帧)独有:`leg`、`ask.effective`、`configFingerprint` —— 静态半场**从不铸**这三项;
6764
- * · 静态半场(本端点)恒有:其余每一段 + `governance`(本面就是那个段的受众)。
6828
+ * · 静态半场(本端点)恒有:其余每一段 + `governance`(本面就是那个段的受众)—— 「其余」不含下文「effective 半场 only」清单里的那些段(它们在本面恒缺席)。
6765
6829
  * 所以字段虽可选(core 开集加段/删段不该把消费端编译炸掉),读的时候按半场判:在诊断响应里等 `leg` 或
6766
6830
  * `configFingerprint` 是等一个永远不来的值。
6767
6831
  *
@@ -6773,8 +6837,8 @@ export interface AssistantTaskStatus {
6773
6837
  * 🔴 **一条规则管所有「effective 半场 only」的键**(9.7.0 立,codex 对抗复审 [high] 验真后收成这一句,
6774
6838
  * 而不是给新加的三段各写一条特例):本型**今天唯一的消费点**是 `GET /v1/diagnostics/wiring` 的 `static`
6775
6839
  * 半场,而标了「只在 effective 半场铸」的键(`leg` / `ask.effective` / `configFingerprint` / `tools` /
6776
- * `mods` / `lsp` / `modelGate` / `autoMode` / `writeProtection` / `readDeny` / `autoConsolidation` / `fileHistory`)
6777
- * 在这条 wire 上**恒缺席** ⇒ **它们在本面上的缺席不携带任何信息**。
6840
+ * `mods` / `lsp` / `modelGate` / `autoMode` / `writeProtection` / `readDeny` / `autoConsolidation` / `fileHistory` / `instructions` /
6841
+ * `sessionRules` / `projectMemory`)在这条 wire 上**恒缺席** ⇒ **它们在本面上的缺席不携带任何信息**。
6778
6842
  * 每一段顶注里写的那些「缺席 = 未武装 / 缺席 = 第三态」的读法**只对 live 帧成立**(`AgentEvent` 的
6779
6843
  * `wiring_manifest` 臂),**不许**搬到这条端点的响应上来读 —— 在这里把缺席读成「未武装」,恰恰会把一台
6780
6844
  * 正在自动外流记忆的部署渲成没在外流。要读那几件事:租户面读
@@ -6816,6 +6880,15 @@ export interface WiringManifest {
6816
6880
  session?: {
6817
6881
  store?: string;
6818
6882
  };
6883
+ /** server ≥7.135.0(引擎 7.55.0;effective 半场恒在):**委派腿重读会话规则** —— `childrenReadLive: true` = 这条腿接了会话规则层(部署有会话规则店、任务带会话 id)并把会话的键交给了它委派出去的每一条腿
6884
+ * (同步 / 后台 / fork / workflow / 续跑 / 观察者旁车,任意深度):**现在写进会话的一条规则,已经在跑的子代下一次调用就受它管**;`false` = 没有规则层,什么也没交出去(没接店,或一次性任务没有会话)。
6885
+ * **缺席 = 老引擎,什么也不说**(不读成 `false`)。壳按位说话:`true` ⇒「现在加的规则管已经在跑的代理的下一次调用」;`false` / 缺席 ⇒ 不对在跑的代理作陈述。读不出(不是 `{ childrenReadLive: 布尔 }`)⇒ 这一段丢。 */
6886
+ sessionRules?: {
6887
+ childrenReadLive: boolean;
6888
+ };
6889
+ /** server ≥7.135.0(引擎 7.55.0;effective 半场恒在):**这条腿调没调部署的项目上下文座** —— `"on"` = 调了(座答了什么是部署的事);`"disabled"` = 座接着、请求 {@link TaskRequest.projectMemory} 关掉了;
6890
+ * `"absent"` = 部署没接座(不论请求说了什么)。后两词的腿上,本服务自铸的 `instructions` 段**缺席**(loader 没被调,就没有陈述)。词表属主是引擎,**读开集**(新词原样过境);缺席 = 老引擎。 */
6891
+ projectMemory?: "on" | "disabled" | "absent" | (string & {});
6819
6892
  /** fleet 面:`backgroundAgentStore` / `hostChildEventSink` 是在场位;🔴 `subagentTranscripts`(**server ≥7.115.0 / S-744**,core 7.32.0 的档位上 wire)= 这台部署的**子代转录档位**,
6820
6893
  * 壳按它如实渲「durable record」文案:`"none"`(没有 agent 行店:子代记录不留)/ `"rows"`(行与终态快照活过重启、**对话不活**:仅本进程 / 会话店 TTL 内可续)/ `"full"`(已结束的子代**跨重启可续**)。
6821
6894
  * 🔴 **开集读**:三词是 core 今天的词,**不要穷举**(core 的第四个词会被吞成缺席);**未知词 ⇒ 按「未知档位」处置,不要当 `full`**。缺席(老 server / 老引擎)= 不知道,**绝不读成 `"none"`**;租户帧与 operator 帧同投。 */
@@ -6846,7 +6919,7 @@ export interface WiringManifest {
6846
6919
  * 一个「本会话不再问」的答案到底能不能被记住?**租户可见**(引擎刻意把它放在 operator-only 的
6847
6920
  * `governance` 段**之外**,server 两面都投)。要给「不再询问」这个交互之前先读它:`storeWired:false` 时
6848
6921
  * 那个承诺无处兑现。🔴 **引擎恒发这一段**,所以 `false` 是**真读数**(「这台 worker 没有规则车道」),
6849
- * 不是「引擎太老」;只有**整键缺席**才是「没发过」(本 SDK 的 server 地板 3.0.0 早于它)。
6922
+ * 不是「引擎太老」;只有**整键缺席**才是「没发过」—— 投影只在引擎给了非空的段时才铸这一段,另外一条 server 7.6.0 之前写下的账本行回放时也没有它(故型上可选)。
6850
6923
  * `syncWired` = 这台 worker 把持久规则并进与跨设备 / 传输 / 服务端同侪**同一个**同意信任域(与 `storeWired`
6851
6924
  * 合读回答「这一下点击到底传多远」);`orgGoverned` = 规则车道之上武装了组织治理层,而那一层是
6852
6925
  * **fail-closed**(读不到组织快照时每一条 allow 都升级成真人审批)。 */
@@ -7001,8 +7074,42 @@ export interface ToolRosterEntry {
7001
7074
  pathTarget?: McpToolFace["pathTarget"];
7002
7075
  ruleFace?: McpToolFace["ruleFace"];
7003
7076
  renderHints?: McpToolFace["renderHints"];
7077
+ /** core 7.54.0 / server ≥7.134.0(引擎**必填**成员,`wiring_manifest.tools.entries[]` 与 `tool_roster_delta` 帧 `delta.roster.entries[]` 每一行都带):
7078
+ * 这只工具的一次调用**走哪几条腿**({@link BoundaryLeg} 数组,按 {@link BOUNDARY_LEGS} 序),或 `"per_call"` —— 它的分派按每次调用给腿(引擎自己的定义与协议工具声明它,
7079
+ * 其余行跟随 `effect`)。设备车道的发射闸读它判一次调用要不要跨边界确认。**键缺席 = 老 server**(≤7.133.x);按封闭 schema 严格校验名册行的消费方升到本包后才收得下这一位。 */
7080
+ boundaryLegs?: "per_call" | BoundaryLeg[];
7004
7081
  [k: string]: unknown;
7005
7082
  }
7083
+ /** 一次调用可能走的**腿**(core `BOUNDARY_LEGS` 逐词同序;core 7.54.0):`env` —— 执行环境里(设备上)· `outside_read` —— 读到执行环境之外 · `outside_write` —— 写到执行环境之外。 */
7084
+ export declare const BOUNDARY_LEGS: readonly ["env", "outside_read", "outside_write"];
7085
+ /** {@link BOUNDARY_LEGS} 的成员型。 */
7086
+ export type BoundaryLeg = (typeof BOUNDARY_LEGS)[number];
7087
+ /** 一棵执行于目标设备的树的**跨边界污染位**(core `CROSS_BOUNDARY_TAINT_BITS` 逐词同序;core 7.54.0):`targetExecutionArmed` —— 树已武装为在目标上执行 ·
7088
+ * `offTargetReadObserved` —— 树里已经放进过一次离目标读的内容。 */
7089
+ export declare const CROSS_BOUNDARY_TAINT_BITS: readonly ["targetExecutionArmed", "offTargetReadObserved"];
7090
+ /** {@link CROSS_BOUNDARY_TAINT_BITS} 的成员型。 */
7091
+ export type CrossBoundaryTaintBit = (typeof CROSS_BOUNDARY_TAINT_BITS)[number];
7092
+ /** 跨边界污染行的**阶段**(core `permission.cross_boundary_taint` 帧的 `phase`):`prepare` —— 武装的树上准备一条腿 · `resume` —— 耐久续跑腿 ·
7093
+ * `observed` —— 这条腿第一次把离目标读放进树(带那一只调用)。 */
7094
+ export type CrossBoundaryTaintPhase = "prepare" | "resume" | "observed";
7095
+ /**
7096
+ * **跨边界污染行**(core 7.54.0 设备车道发射闸的 `permission.cross_boundary_taint` 帧去掉信封 —— server ≥7.134.0 的耐久行;**纯元数据**):
7097
+ * 一棵执行于目标设备的树,武装腿准备时(`prepare`)/ 耐久续跑腿(`resume`)各一行,第一次放进离目标读时一行(`observed`,带那一只调用)。宿主车道永不出现。
7098
+ * 两个出口同一行:`GET /v1/runs/:id/events` 的账本事件 `cross_boundary_taint`({@link import("./events.js").AgentEvent} 同名臂)与 trace SSE `GET /v1/tasks/:id/stream` 的
7099
+ * `cross-boundary-taint` 帧({@link TraceStreamEvent} 同名臂,行 + `seq`)。**`GET /v1/runs/:id` 的轮询对象上没有它**。
7100
+ */
7101
+ export interface CrossBoundaryTaintRow {
7102
+ /** 这条腿的 run id。 */
7103
+ runId: string;
7104
+ phase: CrossBoundaryTaintPhase;
7105
+ /** 事件之后树的污染位(core 位的子集)。 */
7106
+ taint: CrossBoundaryTaintBit[];
7107
+ /** 树自武装起一直在 `multi_tenant` 姿态下跑(由 `REQUIRE_PRINCIPAL` 派生)。 */
7108
+ governed: boolean;
7109
+ /** 只在 `observed`:放进离目标读的那一只调用。 */
7110
+ toolName?: string;
7111
+ toolCallId?: string;
7112
+ }
7006
7113
  /**
7007
7114
  * core `ToolRosterDelta`(core 7.8.0)—— **运行期**名册变更的载荷,`tool_roster_delta` 帧的 `delta`
7008
7115
  * (server ≥7.70.0;铸点 `src/trace/project.ts:736`,判形属主是 core 的 typebox schema:判不出形 ⇒
@@ -7417,7 +7524,7 @@ export interface MemoryOriginClearReceipt {
7417
7524
  * 但因为卡全程 pending,什么都没有被伪造,重发同一条 decide 即可 —— **一台 ≥7.72.0 的 server** 起这条腿有
7418
7525
  * 两条腿:宿主停在可唤醒的 park 上就续那一跑,不在就在同一个宿主会话上铸一条新跑承载决定,两条腿的受理体
7419
7526
  * 逐字同形;宿主会话此刻被别的 run 占用时改答既有的 409 `conflict.session_active_run`。⚠️ 这两条腿是
7420
- * 7.72.0 才有的:本包支持地板是 3.0.0,对 [7.69.0, 7.72.0) 窗口内仍受支持的老 server,重发拿到的仍是
7527
+ * 7.72.0 才有的:本包支持地板是 7.52.0,对 [7.69.0, 7.72.0) 窗口内仍受支持的老 server,重发拿到的仍是
7421
7528
  * 409 `decide.workflow_host_not_parked`(该码已于 7.72.0 退役、无别名,但仅对**更新的** server 生效 ——
7422
7529
  * 见 {@link import("./errors.js").DecideWorkflowHostError})。
7423
7530
  *