@sema-agent/server 7.137.0 → 7.138.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 (209) hide show
  1. package/MIGRATION.md +328 -139
  2. package/README.md +1 -0
  3. package/README.zh-CN.md +1 -0
  4. package/USAGE.md +67 -20
  5. package/dist/approval-card.d.ts +21 -14
  6. package/dist/approval-card.js +1 -0
  7. package/dist/audit.js +1 -0
  8. package/dist/background-agent-name.d.ts +5 -0
  9. package/dist/background-agent-name.js +5 -0
  10. package/dist/boot/budget-tracing.d.ts +1 -12
  11. package/dist/boot/deployment-mods.d.ts +46 -16
  12. package/dist/boot/deployment-mods.js +82 -6
  13. package/dist/boot/governance-seams.d.ts +10 -17
  14. package/dist/boot/governance-seams.js +5 -17
  15. package/dist/boot/leader.d.ts +3 -0
  16. package/dist/boot/leader.js +1 -0
  17. package/dist/boot/org-delivery.js +15 -2
  18. package/dist/boot/resolve-spec.d.ts +3 -0
  19. package/dist/boot/resolve-spec.js +23 -12
  20. package/dist/boot/retention-lane.d.ts +11 -5
  21. package/dist/boot/retention-lane.js +2 -2
  22. package/dist/boot/runner-deps.d.ts +7 -3
  23. package/dist/boot/runner-deps.js +1 -0
  24. package/dist/boot/stage-04-stores.d.ts +1 -12
  25. package/dist/boot/stage-05-execution-env.d.ts +3 -12
  26. package/dist/boot/stage-05-execution-env.js +7 -4
  27. package/dist/boot/stage-06-runners.d.ts +3 -12
  28. package/dist/boot/stage-06-runners.js +5 -2
  29. package/dist/boot/stage-07-capability-layer.d.ts +3 -12
  30. package/dist/boot/stage-07-capability-layer.js +2 -2
  31. package/dist/boot/stage-08-reapers.d.ts +3 -12
  32. package/dist/boot/stage-09-leader.d.ts +3 -12
  33. package/dist/boot/stage-09-leader.js +2 -2
  34. package/dist/boot/stage-10-http-server.d.ts +3 -12
  35. package/dist/boot/stage-10-http-server.js +4 -2
  36. package/dist/boot/web-admin.d.ts +5 -2
  37. package/dist/boot/web-admin.js +3 -3
  38. package/dist/brain.js +5 -5
  39. package/dist/budget.d.ts +17 -15
  40. package/dist/budget.js +2 -2
  41. package/dist/capabilities/mcp-probe.d.ts +36 -11
  42. package/dist/capabilities/mcp-probe.js +44 -5
  43. package/dist/capability-facts.d.ts +6 -0
  44. package/dist/capability-facts.js +5 -0
  45. package/dist/checkpoint-identity.d.ts +13 -6
  46. package/dist/config-catalog.js +7 -1
  47. package/dist/config-types.d.ts +15 -7
  48. package/dist/config.js +8 -5
  49. package/dist/deployment-shape.d.ts +6 -6
  50. package/dist/gate-settlement.d.ts +71 -0
  51. package/dist/gate-settlement.js +40 -0
  52. package/dist/hooks/classic-stations.d.ts +1 -0
  53. package/dist/hooks/classic-stations.js +1 -0
  54. package/dist/hooks/command-spawn.d.ts +2 -2
  55. package/dist/hooks/hook-runner.js +14 -14
  56. package/dist/http/admission.js +4 -2
  57. package/dist/http/dispatch.d.ts +4 -0
  58. package/dist/http/dispatch.js +3 -0
  59. package/dist/http/durable-run-leg.js +4 -2
  60. package/dist/http/memory-compliance-failure-reply.js +3 -0
  61. package/dist/http/resume-legs.d.ts +5 -11
  62. package/dist/http/resume-legs.js +136 -91
  63. package/dist/http/route-ctx.d.ts +30 -51
  64. package/dist/http/route-ctx.js +2 -5
  65. package/dist/http/routes/a2a-serve.js +10 -4
  66. package/dist/http/routes/agents-roster.d.ts +1 -1
  67. package/dist/http/routes/agents-roster.js +5 -1
  68. package/dist/http/routes/approvals-assistant.js +6 -6
  69. package/dist/http/routes/capabilities.js +12 -10
  70. package/dist/http/routes/mcp-reconnect.d.ts +3 -2
  71. package/dist/http/routes/mcp-reconnect.js +7 -5
  72. package/dist/http/routes/memory-consolidation.d.ts +1 -1
  73. package/dist/http/routes/memory-origin.d.ts +1 -1
  74. package/dist/http/routes/rules.js +3 -3
  75. package/dist/http/routes/runs.js +11 -7
  76. package/dist/http/routes/sessions.js +6 -4
  77. package/dist/http/routes/side-query.js +2 -3
  78. package/dist/http/routes/tasks.js +792 -780
  79. package/dist/http/server.d.ts +31 -25
  80. package/dist/http/wire-types.d.ts +14 -6
  81. package/dist/identity-source.d.ts +1 -1
  82. package/dist/index.d.ts +2 -0
  83. package/dist/index.js +1 -0
  84. package/dist/leader/wire.d.ts +7 -0
  85. package/dist/leader/wire.js +5 -4
  86. package/dist/mcp-assertion-header.d.ts +51 -40
  87. package/dist/mcp-assertion-header.js +10 -11
  88. package/dist/mcp-authorization-face.d.ts +27 -0
  89. package/dist/mcp-authorization-face.js +15 -0
  90. package/dist/memory-operator-faces.d.ts +13 -4
  91. package/dist/memory-operator-faces.js +1 -17
  92. package/dist/memory-sync-client.js +72 -57
  93. package/dist/memory-sync.d.ts +1 -1
  94. package/dist/model-route-gap.d.ts +6 -22
  95. package/dist/model-route-gap.js +7 -5
  96. package/dist/mods-declaration.d.ts +110 -0
  97. package/dist/mods-declaration.js +109 -0
  98. package/dist/observability/err-text.d.ts +5 -0
  99. package/dist/observability/err-text.js +9 -0
  100. package/dist/observability/fail-open.d.ts +5 -1
  101. package/dist/observability/fail-open.js +5 -1
  102. package/dist/observability/secret-env-scrub.d.ts +1 -1
  103. package/dist/observability/secret-env-scrub.js +1 -1
  104. package/dist/parked-decide.d.ts +15 -2
  105. package/dist/parked-decide.js +14 -8
  106. package/dist/peer-seat.d.ts +150 -0
  107. package/dist/peer-seat.js +239 -0
  108. package/dist/permission-rule-vocab.d.ts +7 -7
  109. package/dist/permission-rule-vocab.js +3 -3
  110. package/dist/plain-string-record.d.ts +38 -0
  111. package/dist/plain-string-record.js +38 -0
  112. package/dist/plugins/background-agent-store-sql.js +6 -3
  113. package/dist/plugins/caching-session-store.d.ts +5 -0
  114. package/dist/plugins/caching-session-store.js +6 -0
  115. package/dist/plugins/checkpoint-store-sql.d.ts +15 -20
  116. package/dist/plugins/checkpoint-store-sql.js +8 -8
  117. package/dist/plugins/file-history-store-sql.js +3 -2
  118. package/dist/plugins/k8s-pod-reaper.d.ts +2 -8
  119. package/dist/plugins/k8s-pod-reaper.js +3 -3
  120. package/dist/plugins/local-checkpoint-store.d.ts +1 -11
  121. package/dist/plugins/local-checkpoint-store.js +0 -1
  122. package/dist/plugins/local-session-store.d.ts +66 -27
  123. package/dist/plugins/local-session-store.js +60 -28
  124. package/dist/plugins/mailbox-store-sql.d.ts +11 -3
  125. package/dist/plugins/mailbox-store-sql.js +103 -15
  126. package/dist/plugins/memory-sync-store-pg.d.ts +16 -5
  127. package/dist/plugins/memory-sync-store-tidb.d.ts +3 -3
  128. package/dist/plugins/one-time-migrations.d.ts +6 -3
  129. package/dist/plugins/one-time-migrations.js +3 -4
  130. package/dist/plugins/permission-rule-store-sql.js +21 -13
  131. package/dist/plugins/pg-session-storage.d.ts +10 -2
  132. package/dist/plugins/pg-session-storage.js +18 -5
  133. package/dist/plugins/remote-env-adb.d.ts +3 -1
  134. package/dist/plugins/remote-env-adb.js +1 -1
  135. package/dist/plugins/remote-env-device.d.ts +3 -1
  136. package/dist/plugins/remote-env-device.js +1 -1
  137. package/dist/plugins/remote-env-e2b.d.ts +2 -0
  138. package/dist/plugins/remote-env-e2b.js +1 -1
  139. package/dist/plugins/remote-env-host.d.ts +3 -1
  140. package/dist/plugins/remote-env-host.js +1 -1
  141. package/dist/plugins/remote-env-k8s.d.ts +3 -1
  142. package/dist/plugins/remote-env-k8s.js +1 -1
  143. package/dist/plugins/remote-env-local-docker.d.ts +2 -0
  144. package/dist/plugins/remote-env-local-docker.js +1 -1
  145. package/dist/plugins/remote-env-ssh.d.ts +3 -1
  146. package/dist/plugins/remote-env-ssh.js +1 -1
  147. package/dist/plugins/retention-store-sql.d.ts +14 -2
  148. package/dist/plugins/retention-store-sql.js +6 -0
  149. package/dist/plugins/session-fork.d.ts +10 -13
  150. package/dist/plugins/session-fork.js +5 -25
  151. package/dist/plugins/session-ownership.d.ts +7 -0
  152. package/dist/plugins/session-ownership.js +5 -0
  153. package/dist/plugins/session-workspace-cell.d.ts +17 -0
  154. package/dist/plugins/session-workspace-cell.js +38 -0
  155. package/dist/plugins/store-backend.js +7 -7
  156. package/dist/plugins/tidb-pool.js +6 -0
  157. package/dist/plugins/tidb-session-store.d.ts +17 -2
  158. package/dist/plugins/tidb-session-store.js +16 -5
  159. package/dist/plugins/tool-result-store-sql.d.ts +13 -6
  160. package/dist/plugins/tool-result-store-sql.js +8 -7
  161. package/dist/plugins/worktree-isolation.d.ts +3 -2
  162. package/dist/plugins/worktree-isolation.js +1 -7
  163. package/dist/project-identity.d.ts +1 -14
  164. package/dist/project-identity.js +0 -4
  165. package/dist/rules-consent.js +6 -4
  166. package/dist/run-local.js +12 -6
  167. package/dist/runs.d.ts +7 -1
  168. package/dist/runs.js +6 -1
  169. package/dist/sandbox-git-plane.d.ts +2 -2
  170. package/dist/server-secret-env.d.ts +6 -3
  171. package/dist/server-secret-env.js +4 -2
  172. package/dist/session-incarnation.d.ts +4 -5
  173. package/dist/session-incarnation.js +2 -2
  174. package/dist/session-workspace.d.ts +130 -0
  175. package/dist/session-workspace.js +83 -0
  176. package/dist/spec-fields.d.ts +1 -1
  177. package/dist/standing-answer-grant.d.ts +2 -13
  178. package/dist/standing-answer-grant.js +0 -7
  179. package/dist/task-a2a.d.ts +44 -14
  180. package/dist/task-a2a.js +46 -20
  181. package/dist/task-mcp.d.ts +33 -20
  182. package/dist/task-mcp.js +46 -22
  183. package/dist/tool-approval.d.ts +32 -8
  184. package/dist/tool-approval.js +49 -12
  185. package/dist/trace/core-keyset-guard.d.ts +33 -18
  186. package/dist/trace/engine-notice-wire.d.ts +1 -1
  187. package/dist/trace/engine-notice-wire.js +2 -0
  188. package/dist/trace/exit-seat.d.ts +20 -1
  189. package/dist/trace/exit-seat.js +3 -0
  190. package/dist/trace/extension-call-face.d.ts +33 -0
  191. package/dist/trace/extension-call-face.js +39 -0
  192. package/dist/trace/project.d.ts +25 -7
  193. package/dist/trace/project.js +29 -3
  194. package/dist/trace/redact.js +42 -13
  195. package/dist/trace/self-minted-wire.d.ts +129 -10
  196. package/dist/trace/self-minted-wire.js +62 -3
  197. package/dist/trace/wire-projection-faces.d.ts +6 -6
  198. package/dist/trace/wire-projection-faces.js +6 -5
  199. package/dist/user-authored-text.d.ts +2 -2
  200. package/dist/user-authored-text.js +16 -1
  201. package/dist/web-admin-client/center-request.d.ts +3 -2
  202. package/dist/web-admin-client/center-request.js +2 -3
  203. package/dist/web-admin-client/skills-mcp.d.ts +8 -4
  204. package/dist/web-admin-client/skills-mcp.js +31 -18
  205. package/dist/web-admin-client/types.d.ts +5 -0
  206. package/package.json +3 -3
  207. package/wire-changes/server@7.138.0.json +446 -0
  208. package/dist/http/mcp-remote-text.d.ts +0 -5
  209. package/dist/http/mcp-remote-text.js +0 -7
@@ -29,6 +29,7 @@ import type { ModelUsageDelta, ModelUsageTracker, PromptManifestRecord } from ".
29
29
  import type { RunCompanionRecord } from "../observability/prompt-manifest.js";
30
30
  import { type SafeText } from "./exit-seat.js";
31
31
  import { type SemaProvenanceInput } from "./sema-provenance.js";
32
+ import { type ExtensionRequesterFace, type ToolInputRewriteFace } from "./extension-call-face.js";
32
33
  import type { LedgerEventType } from "./ledger-events.js";
33
34
  import type { InstructionsSegment } from "../instruction-selection.js";
34
35
  import type { RunSkillEntry } from "../capabilities/skills.js";
@@ -101,6 +102,8 @@ export type TraceBlock = {
101
102
  name: string;
102
103
  label?: string;
103
104
  input: unknown;
105
+ recovered?: true;
106
+ requestedBy?: ExtensionRequesterFace;
104
107
  eventId?: string;
105
108
  parentToolCallId?: string;
106
109
  } | {
@@ -119,6 +122,11 @@ export type TraceBlock = {
119
122
  delivered?: McpDelivered;
120
123
  gate?: GateOutcome;
121
124
  gatedCallId?: string;
125
+ wireName?: string;
126
+ notExecuted?: true;
127
+ answeredBy?: string;
128
+ requestedBy?: ExtensionRequesterFace;
129
+ rewrite?: ToolInputRewriteFace;
122
130
  eventId?: string;
123
131
  parentToolCallId?: string;
124
132
  } | {
@@ -157,6 +165,7 @@ export declare function toolStartEventData(ev: {
157
165
  label?: string;
158
166
  args: unknown;
159
167
  recovered?: true;
168
+ requestedBy?: unknown;
160
169
  eventId?: string;
161
170
  parentToolCallId?: string;
162
171
  }): Record<string, unknown>;
@@ -295,6 +304,9 @@ export declare function toolEndEventData(ev: {
295
304
  gatedCallId?: string;
296
305
  wireName?: string;
297
306
  notExecuted?: true;
307
+ answeredBy?: unknown;
308
+ requestedBy?: unknown;
309
+ rewrite?: unknown;
298
310
  eventId?: string;
299
311
  parentToolCallId?: string;
300
312
  }): Record<string, unknown>;
@@ -628,11 +640,11 @@ export declare function compactionStartedEventData(ev: {
628
640
  parentToolCallId?: unknown;
629
641
  }): Record<string, unknown>;
630
642
  /** The `workspace_changed` payload([ref]二 core 裁定:[ref] §E13 旧臂,L1 门本车首次撞见——非新增,
631
- * 是本门扩 TaskEvent 臂集时第一次显式处置。语义 = bash `cd`/EnterWorktree 移动任务逻辑 cwd 后,在移动
632
- * 它的工具结算后发一帧,给 shell/宿主 UI 一个路径提示行。cwd 与已展示的工具 args 同信任级[UNTRUSTED,
633
- * RAW 逻辑路径,symlink 不解析]→ `redactSecrets` + 长度 bound[300,与 brainStatusEventData.detail 同
634
- * 惯例]。core 只在真变化时才发(不播初始 cwd);渲染面(cli)不得当持久态——跨 suspend/resume 重置为
635
- * 根,这是消费端纪律,服务端只如实转发单帧不做状态缓存。 */
643
+ * 是本门扩 TaskEvent 臂集时第一次显式处置)。core 7.58.0 起这一帧是腿的**整份快照**:每条经 `prepareExecutionEnv` 装配的腿起点一帧(`cwd` 可与上一帧相同;verify / cascade 的组合入口不经该装配、按契约没有这一帧)、
644
+ * 其后每变一帧(bash `cd` / EnterWorktree / ExitWorktree)。wire 上只投 `cwd`(其余四成员的处置在 `wire-projection-faces.ts` 那一行);
645
+ * cwd 与已展示的工具 args 同信任级[UNTRUSTED,RAW 逻辑路径,symlink 不解析]→ 出口座的有界位[300,与 brainStatusEventData.detail 同
646
+ * 惯例]。消费端按快照读:与已持有的 `cwd` 相同的一帧不渲染成「目录变了」。服务端只如实转发单帧;会话行上的那份最后一帧另由
647
+ * `session-workspace.ts` 的记录座存(不是本投影)。 */
636
648
  export declare function workspaceChangedEventData(ev: {
637
649
  cwd: string;
638
650
  eventId?: string;
@@ -1002,6 +1014,8 @@ export declare function brainStatusEventData(ev: {
1002
1014
  timeoutMs?: number;
1003
1015
  providerCondition?: string;
1004
1016
  providerConditionSource?: string;
1017
+ waitSegment?: string;
1018
+ sleptMs?: number;
1005
1019
  eventId?: string;
1006
1020
  parentToolCallId?: string;
1007
1021
  }): FrameData<{
@@ -1171,8 +1185,12 @@ export declare function toContractTokens(usage: unknown, usageMissing?: unknown)
1171
1185
  * (trace SSE 面)对同一账本行的字段选择逐字同构,此前两处独立手写,structured/totalChars/label
1172
1186
  * 三次扩字段各改两遍(见两处对偶注)。收一份:两面各自包装键名皮(id/name/input vs 同名),
1173
1187
  * 字段集合从此单点演进。 */
1174
- export declare function toolCallFieldsOf(d: Record<string, unknown>): Record<string, unknown>;
1175
- export declare function toolResultFieldsOf(d: Record<string, unknown>): Record<string, unknown>;
1188
+ export declare function toolCallFieldsOf(d: Record<string, unknown>): Omit<Extract<TraceBlock, {
1189
+ type: "tool-call";
1190
+ }>, "type">;
1191
+ export declare function toolResultFieldsOf(d: Record<string, unknown>): Omit<Extract<TraceBlock, {
1192
+ type: "tool-result";
1193
+ }>, "type" | "output" | "isError">;
1176
1194
  export interface ProjectOpts {
1177
1195
  /** Prepend the user turn (the objective is not in the event log; the endpoint supplies it). */
1178
1196
  objective?: string;
@@ -10,8 +10,10 @@ import { injectionTierOrAbsent } from "./injection-tier.js";
10
10
  import { semaProvenanceOrAbsent } from "./sema-provenance.js";
11
11
  import { resupplyFields, terminalFrameFacetFields } from "./task-notification-facets.js";
12
12
  import { dropProjectedFace } from "./projection-drop.js";
13
+ import { extensionAnswererOf, extensionRequesterOf, toolInputRewriteOf } from "./extension-call-face.js";
13
14
  import { projectByTable } from "./projection-table.js";
14
15
  import { durableRowIdentity } from "../checkpoint-identity.js";
16
+ import { projectMcpAuthorization } from "../mcp-authorization-face.js";
15
17
  export async function appendModelUsageDelta(append, modelUsage, taskId) {
16
18
  const delta = modelUsage?.drain(taskId);
17
19
  if (delta) {
@@ -95,13 +97,18 @@ function identityKey(v) {
95
97
  export function modelTextEventData(ev) {
96
98
  return { text: ev.text, ...(ev.eventId ? { eventId: ev.eventId } : {}) };
97
99
  }
100
+ function toolArgsOnWire(args) {
101
+ return redactDeep(args);
102
+ }
98
103
  export function toolStartEventData(ev) {
104
+ const requestedBy = extensionRequesterOf(ev.requestedBy, "tool_start");
99
105
  return {
100
106
  toolCallId: ev.toolCallId,
101
107
  toolName: ev.toolName,
102
108
  ...(ev.label !== undefined ? { label: ev.label } : {}),
103
- args: redactDeep(ev.args),
109
+ args: toolArgsOnWire(ev.args),
104
110
  ...(ev.recovered === true ? { recovered: true } : {}),
111
+ ...(requestedBy !== undefined ? { requestedBy } : {}),
105
112
  ...identityFields(ev),
106
113
  };
107
114
  }
@@ -166,6 +173,7 @@ function screenedGateOrThrow(v) {
166
173
  ...(d.mode === undefined ? {} : { mode: d.mode }),
167
174
  ...(d.askClass === undefined ? {} : { askClass: d.askClass }),
168
175
  ...(d.classes === undefined ? {} : { classes: [...d.classes] }),
176
+ ...(d.extension === undefined ? {} : { extension: seatText("trace-frame-text", d.extension) }),
169
177
  }
170
178
  : { kind: "allowed", ...(classifier === undefined ? {} : { classifier }), ...(released === undefined ? {} : { released }), ...(clearedBy === undefined ? {} : { clearedBy }) },
171
179
  ...(settlement === undefined ? {} : { settlement }),
@@ -225,6 +233,9 @@ export function reasoningEndEventData(ev) {
225
233
  }
226
234
  export function toolEndEventData(ev) {
227
235
  const gate = ev.gate === undefined ? undefined : screenedGate(ev.gate);
236
+ const answeredBy = extensionAnswererOf(ev.answeredBy, "tool_end");
237
+ const requestedBy = extensionRequesterOf(ev.requestedBy, "tool_end");
238
+ const rewrite = toolInputRewriteOf(ev.rewrite, "tool_end", toolArgsOnWire);
228
239
  return {
229
240
  toolCallId: ev.toolCallId,
230
241
  toolName: ev.toolName,
@@ -240,6 +251,9 @@ export function toolEndEventData(ev) {
240
251
  ...(typeof ev.gatedCallId === "string" && ev.gatedCallId !== "" ? { gatedCallId: ev.gatedCallId } : {}),
241
252
  ...(typeof ev.wireName === "string" && ev.wireName !== "" ? { wireName: ev.wireName } : {}),
242
253
  ...(ev.notExecuted === true ? { notExecuted: true } : {}),
254
+ ...(answeredBy !== undefined ? { answeredBy } : {}),
255
+ ...(requestedBy !== undefined ? { requestedBy } : {}),
256
+ ...(rewrite !== undefined ? { rewrite } : {}),
243
257
  ...identityFields(ev),
244
258
  };
245
259
  }
@@ -456,6 +470,7 @@ export function projectWiringManifestMcpRows(mcpIn) {
456
470
  ...(str(e.errorCode) !== undefined ? { errorCode: e.errorCode } : {}),
457
471
  ...(typeof e.delivered === "string" && MCP_DELIVERY_VERDICTS.includes(e.delivered) ? { delivered: e.delivered } : {}),
458
472
  ...(num(e.httpStatus) !== undefined ? { httpStatus: e.httpStatus } : {}),
473
+ ...((a) => (a !== undefined ? { authorization: a } : {}))(projectMcpAuthorization(e.authorization)),
459
474
  ...(liveness !== undefined ? { liveness } : {}),
460
475
  });
461
476
  }
@@ -570,10 +585,11 @@ export function wiringManifestEventData(ev, minted) {
570
585
  dropProjectedFace("wiring_manifest.mods[] row is missing name/seat/tier");
571
586
  continue;
572
587
  }
588
+ const provenance = e.provenance === undefined ? undefined : (registrantText(e.provenance) ?? dropProjectedFace("wiring_manifest.mods[].provenance is not a string"));
573
589
  const refusedBy = registrantText(e.refusedBy);
574
590
  const reason = registrantText(e.reason);
575
591
  if (refusedBy !== undefined && reason !== undefined) {
576
- rows.push({ name, seat, tier, refusedBy, reason });
592
+ rows.push({ name, seat, tier, ...(provenance !== undefined ? { provenance } : {}), refusedBy, reason });
577
593
  continue;
578
594
  }
579
595
  const events = strList(e.events);
@@ -597,7 +613,7 @@ export function wiringManifestEventData(ev, minted) {
597
613
  return [{ registration, cause, reason: why }];
598
614
  })
599
615
  : dropProjectedFace("wiring_manifest.mods[].skipped is not an array");
600
- rows.push({ name, seat, tier, events, ...(observe !== undefined ? { observe } : {}), ...(skipped !== undefined && skipped.length > 0 ? { skipped } : {}) });
616
+ rows.push({ name, seat, tier, ...(provenance !== undefined ? { provenance } : {}), events, ...(observe !== undefined ? { observe } : {}), ...(skipped !== undefined && skipped.length > 0 ? { skipped } : {}) });
601
617
  }
602
618
  return rows.length > 0 ? rows : undefined;
603
619
  })();
@@ -804,6 +820,8 @@ export function brainStatusEventData(ev) {
804
820
  ...(num(ev.retryAtMs) ? { retryAtMs: ev.retryAtMs } : {}),
805
821
  ...(num(ev.elapsedMs) ? { elapsedMs: ev.elapsedMs } : {}),
806
822
  ...(num(ev.timeoutMs) ? { timeoutMs: ev.timeoutMs } : {}),
823
+ ...(typeof ev.waitSegment === "string" && ev.waitSegment.length > 0 ? { waitSegment: ev.waitSegment } : {}),
824
+ ...(num(ev.sleptMs) ? { sleptMs: ev.sleptMs } : {}),
807
825
  ...(num(ev.errorStatus) ? { errorStatus: ev.errorStatus } : {}),
808
826
  ...(typeof ev.errClass === "string" && ev.errClass.length > 0 ? { errClass: ev.errClass } : {}),
809
827
  ...(typeof ev.providerCondition === "string" && ev.providerCondition.length > 0 ? { providerCondition: ev.providerCondition } : {}),
@@ -929,17 +947,22 @@ export function toContractTokens(usage, usageMissing) {
929
947
  };
930
948
  }
931
949
  export function toolCallFieldsOf(d) {
950
+ const requestedBy = extensionRequesterOf(d.requestedBy, "tool_start row");
932
951
  return {
933
952
  id: String(d.toolCallId ?? ""),
934
953
  name: String(d.toolName ?? ""),
935
954
  ...(typeof d.label === "string" ? { label: d.label } : {}),
936
955
  input: d.args,
937
956
  ...(d.recovered === true ? { recovered: true } : {}),
957
+ ...(requestedBy !== undefined ? { requestedBy } : {}),
938
958
  ...identityFields(d),
939
959
  };
940
960
  }
941
961
  export function toolResultFieldsOf(d) {
942
962
  const gate = d.gate === undefined ? undefined : screenedGate(d.gate);
963
+ const answeredBy = extensionAnswererOf(d.answeredBy, "tool_end row");
964
+ const requestedBy = extensionRequesterOf(d.requestedBy, "tool_end row");
965
+ const rewrite = toolInputRewriteOf(d.rewrite, "tool_end row", toolArgsOnWire);
943
966
  return {
944
967
  callId: String(d.toolCallId ?? ""),
945
968
  ...(typeof d.label === "string" ? { label: d.label } : {}),
@@ -952,6 +975,9 @@ export function toolResultFieldsOf(d) {
952
975
  ...(typeof d.gatedCallId === "string" && d.gatedCallId !== "" ? { gatedCallId: d.gatedCallId } : {}),
953
976
  ...(typeof d.wireName === "string" && d.wireName !== "" ? { wireName: d.wireName } : {}),
954
977
  ...(d.notExecuted === true ? { notExecuted: true } : {}),
978
+ ...(answeredBy !== undefined ? { answeredBy } : {}),
979
+ ...(requestedBy !== undefined ? { requestedBy } : {}),
980
+ ...(rewrite !== undefined ? { rewrite } : {}),
955
981
  ...identityFields(d),
956
982
  };
957
983
  }
@@ -1,4 +1,4 @@
1
- import { displayUrlOf, stripFormatCharacters } from "@sema-agent/core";
1
+ import { REDACTION_MARK, displayUrlOf, stripFormatCharacters } from "@sema-agent/core";
2
2
  import { CONTROL_AND_BIDI_CHARS, CREDENTIAL_PARAM_NAMES, isHierarchicalUrl } from "@sema-agent/settings-schema";
3
3
  import { recordFailOpen } from "../observability/fail-open.js";
4
4
  const normalizeForRedaction = stripFormatCharacters;
@@ -903,8 +903,9 @@ const PPK_CONTAINER_TOKEN = "«redacted:private-key»";
903
903
  const PEM_FRAGMENT_TOKEN = "«redacted:private-key:partial»";
904
904
  const HEADLESS_PPK_TOKEN = "«redacted:private-key:partial»";
905
905
  const ANCHORED_VALUE_TOKEN = "«redacted»";
906
+ const BEARER_VALUE_MIN = 20;
906
907
  const KEYWORD_SECRET_PATTERNS = [
907
- [keywordArm("[Bb]earer", "[A-Za-z0-9._~+/-]", 20, "=*", SCHEME_SEPARATOR_CLASS), "Bearer «redacted»"],
908
+ [keywordArm("[Bb]earer", "[A-Za-z0-9._~+/-]", BEARER_VALUE_MIN, "=*", SCHEME_SEPARATOR_CLASS), "Bearer «redacted»"],
908
909
  [keywordArm("Basic", "[A-Za-z0-9+/]", 16, "={0,2}", SCHEME_SEPARATOR_CLASS), "Basic «redacted»"],
909
910
  [keywordArm("[Tt]oken", "[A-Za-z0-9._~+/-]", 20), "token «redacted»"],
910
911
  ];
@@ -2031,6 +2032,15 @@ function collectJsonSecretFieldSpans(text, span, isHead) {
2031
2032
  }
2032
2033
  }
2033
2034
  const STRONG_AUTH_SCHEMES = new Set(["basic", "bearer"]);
2035
+ function isEngineMarkedCandidate(text, start, end, repl) {
2036
+ const open = repl.indexOf("«");
2037
+ const close = repl.lastIndexOf("»");
2038
+ if (open <= 0 || close < open || close === repl.length - 1)
2039
+ return false;
2040
+ const lead = repl.slice(0, open);
2041
+ const trail = repl.slice(close + 1);
2042
+ return end - start === lead.length + REDACTION_MARK.length + trail.length && text.startsWith(lead, start) && text.startsWith(REDACTION_MARK, start + lead.length) && text.startsWith(trail, end - trail.length);
2043
+ }
2034
2044
  const STRONG_AUTH_SCHEME_MAX = Math.max(...[...STRONG_AUTH_SCHEMES].map((w) => w.length));
2035
2045
  const ABSENT_OR_BOOLEAN_WORDS = new Set(["null", "nil", "none", "undefined", "true", "false", "yes", "no"]);
2036
2046
  const ABSENT_OR_BOOLEAN_MAX = Math.max(...[...ABSENT_OR_BOOLEAN_WORDS].map((w) => w.length));
@@ -2287,11 +2297,18 @@ function schemeValueAt(text, s, json) {
2287
2297
  if (isQuoteUnit(unitChOf(opening)) || unitChOf(opening) === JSON_STRING_END)
2288
2298
  i += unitLenOf(opening);
2289
2299
  const w = i;
2290
- while (i < n && i - w <= STRONG_AUTH_SCHEME_MAX && (isIdentStartCode(text.charCodeAt(i))))
2291
- i += 1;
2292
- anchoredScanUnits += i - w;
2293
- if (i - w > STRONG_AUTH_SCHEME_MAX || !STRONG_AUTH_SCHEMES.has(text.slice(w, i).toLowerCase()))
2294
- return undefined;
2300
+ const engineMarked = text.startsWith(REDACTION_MARK, i);
2301
+ if (engineMarked) {
2302
+ i += REDACTION_MARK.length;
2303
+ anchoredScanUnits += REDACTION_MARK.length;
2304
+ }
2305
+ else {
2306
+ while (i < n && i - w <= STRONG_AUTH_SCHEME_MAX && (isIdentStartCode(text.charCodeAt(i))))
2307
+ i += 1;
2308
+ anchoredScanUnits += i - w;
2309
+ if (i - w > STRONG_AUTH_SCHEME_MAX || !STRONG_AUTH_SCHEMES.has(text.slice(w, i).toLowerCase()))
2310
+ return undefined;
2311
+ }
2295
2312
  let separated = false;
2296
2313
  while (i < n) {
2297
2314
  const unit = readAnchorUnit(text, i, json);
@@ -2304,6 +2321,17 @@ function schemeValueAt(text, s, json) {
2304
2321
  if (!separated)
2305
2322
  return undefined;
2306
2323
  const vs = i;
2324
+ if (engineMarked) {
2325
+ let k = i;
2326
+ while (k < n && isToken68Code(text.charCodeAt(k)))
2327
+ k += 1;
2328
+ while (k < n && text.charCodeAt(k) === CH_EQ)
2329
+ k += 1;
2330
+ if (k - vs >= BEARER_VALUE_MIN) {
2331
+ anchoredScanUnits += k - vs;
2332
+ return { start: vs, end: k, quoted: false };
2333
+ }
2334
+ }
2307
2335
  if (i >= n || !isAsciiAlnumCode(text.charCodeAt(i)))
2308
2336
  return undefined;
2309
2337
  while (i < n && isToken68Code(text.charCodeAt(i)))
@@ -2625,7 +2653,7 @@ const armPool = (() => {
2625
2653
  const headFirstUnit = unionMembers(retryMembers.map((m) => m.headFirst)) ?? new Uint32Array(0x10000 >>> 5).fill(0xffffffff);
2626
2654
  poolArmCount = members.length;
2627
2655
  poolBoundaryArmCount = retryMembers.length;
2628
- return (text, wantCount, json, eat, scope, reach) => {
2656
+ return (text, wantCount, json, eat, scope, reach, engineMarked) => {
2629
2657
  readings += 1;
2630
2658
  const isHead = reach !== undefined;
2631
2659
  const lane = LANES[scope];
@@ -2695,8 +2723,8 @@ const armPool = (() => {
2695
2723
  }
2696
2724
  }
2697
2725
  poolSpanCount += spans.length;
2698
- const survives = (sp) => sp.undecided !== true || reach === undefined || reach(sp.start);
2699
- const kept = resolveSpanOverlaps(reach === undefined ? spans : spans.filter(survives));
2726
+ const survives = (sp) => !engineMarked(sp.start, sp.end, sp.repl) && (sp.undecided !== true || reach === undefined || reach(sp.start));
2727
+ const kept = resolveSpanOverlaps(spans.filter(survives));
2700
2728
  if (!wantCount || kept.length === 0)
2701
2729
  return { hits: NO_HITS, kept };
2702
2730
  const tokenOf = (sp) => members[sp.order].token;
@@ -2727,8 +2755,8 @@ let onRedaction;
2727
2755
  export function setRedactionObserver(fn) {
2728
2756
  onRedaction = fn;
2729
2757
  }
2730
- function applyRules(text, wantCount, json, eat, scope, reach) {
2731
- return armPool(text, wantCount, json, eat, scope, reach);
2758
+ function applyRules(text, wantCount, json, eat, scope, reach, engineMarked) {
2759
+ return armPool(text, wantCount, json, eat, scope, reach, engineMarked);
2732
2760
  }
2733
2761
  function reportHits(hits) {
2734
2762
  if (onRedaction === undefined)
@@ -2856,7 +2884,8 @@ function runRedaction(text, observe, json, wantHits, scope, layout, extent) {
2856
2884
  const read = (layers, view) => {
2857
2885
  const toOriginal = createViewToOriginal(layers);
2858
2886
  const reach = extent.kind === "head" ? (viewStart) => toOriginal.start(viewStart) < extent.emitEnd : undefined;
2859
- const r = applyRules(view, wantCount, json, eat, scope, reach);
2887
+ const engineMarked = (viewStart, viewEnd, repl) => isEngineMarkedCandidate(text, toOriginal.start(viewStart), toOriginal.start(viewEnd - 1) + 1, repl);
2888
+ const r = applyRules(view, wantCount, json, eat, scope, reach, engineMarked);
2860
2889
  forgetEscapedSeparatorTails();
2861
2890
  readsSoFar += 1;
2862
2891
  if (readsSoFar === 1) {
@@ -105,6 +105,10 @@ export declare const SELF_MINTED_WIRE: {
105
105
  readonly attr: 400;
106
106
  readonly since: "7.52.0";
107
107
  };
108
+ readonly "config.memory_erasure_scope": {
109
+ readonly attr: 400;
110
+ readonly since: "7.138.0";
111
+ };
108
112
  readonly "memory.target_outside_store": {
109
113
  readonly attr: 409;
110
114
  readonly since: "7.101.0";
@@ -625,6 +629,106 @@ export declare const SELF_MINTED_WIRE: {
625
629
  };
626
630
  };
627
631
  };
632
+ /** `GET /health` 的 `mods` 段:运维声明的 mod 包起服装上了几只(present-iff 装上了;与能力位 `modsDeploymentPackages` 同读一只事实)。 */
633
+ readonly healthModsKey: {
634
+ readonly at: "GET /health mods";
635
+ readonly members: {
636
+ deploymentPackages: {
637
+ attr: string;
638
+ since: string;
639
+ };
640
+ };
641
+ };
642
+ /** `GET /v1/models` 的 `models[]` 行键(只登本版新出现的键;行的其余键不是本版新上 wire):`supportsThinkingOff` —— 「这只模型的推理能不能关」,恒在场的布尔,值 = 引擎唯一读法 `thinkingOffSpelled(条目)`。 */
643
+ readonly modelsRowKey: {
644
+ readonly at: "GET /v1/models models[] 行键(<键> → 在场律)";
645
+ readonly members: {
646
+ readonly supportsThinkingOff: {
647
+ readonly attr: "always";
648
+ readonly since: "7.138.0";
649
+ };
650
+ };
651
+ };
652
+ /** `tool_end` 帧 `gate.disposition`(denied 臂)上的键(<臂>#<键> → 在场律;回放面 `GET /v1/runs/:id/events` 同读):`extension` —— hook 层拒且拒者的扩展注册名已知时 = 那张注册的名字(过出口座)。 */
653
+ readonly toolEndGateDispositionKey: {
654
+ readonly at: "tool_end gate.disposition 键(<臂>#<键> → 在场律)";
655
+ readonly members: {
656
+ readonly "denied#extension": {
657
+ readonly attr: "present-iff hook-layer denial by a named extension";
658
+ readonly since: "7.138.0";
659
+ };
660
+ };
661
+ };
662
+ /** `POST /v1/side-query` 200 体的键(只登本版新出现的键):`account` —— 本次侧查询的一行账(引擎定价、逐字过境;`costMicroUsd` 任何一笔未定价即缺席)。 */
663
+ readonly sideQueryBodyKey: {
664
+ readonly at: "POST /v1/side-query 200 体键(<键> → 在场律)";
665
+ readonly members: {
666
+ readonly account: {
667
+ readonly attr: "always";
668
+ readonly since: "7.138.0";
669
+ };
670
+ };
671
+ };
672
+ /**
673
+ * `POST /v1/side-query` 200 体在失败时的 `errorKind` 值里本版新出现的词(机读失败种类;缺席 = 引擎没给)。词是引擎铸的闭集,本服务逐字过境(`projectSideQueryResult`),词表属主 = 引擎的 `AssistantMessage.errorKind`:
674
+ * `satisfies Partial<Record<…>>` 把「登的是引擎的词」绑在引擎的型上。`image_unprocessable` —— 服务商处理不了请求里的图 —— 是本版新词;此前的三词(`input_too_long` / `length_empty` / `degenerate`,自 7.135.0 起在 wire 上)
675
+ * 不在本集 —— 同上面四个集的口径,只登本版新出现的。
676
+ */
677
+ readonly sideQueryErrorKind: {
678
+ readonly at: "POST /v1/side-query 200 体 errorKind 的值(失败时在场;引擎的词逐字过境)";
679
+ readonly members: {
680
+ image_unprocessable: {
681
+ attr: string;
682
+ since: string;
683
+ };
684
+ };
685
+ };
686
+ /** MCP 授权记录 `authorization`(只投闭集词 `reason`,与 `errorCode:"unauthorized"` 同行)出现的三张面;投影只有 `mcp-authorization-face.ts` 的 `projectMcpAuthorization` 一只,三面同读。 */
687
+ readonly mcpAuthorizationKey: {
688
+ readonly at: "MCP 授权记录 authorization 的出现面(<面>#<键> → 在场律)";
689
+ readonly members: {
690
+ readonly "wiring_manifest.mcp[]#authorization": {
691
+ readonly attr: "present-iff errorCode unauthorized";
692
+ readonly since: "7.138.0";
693
+ };
694
+ readonly "POST /v1/sessions/:id/mcp/reconnect#status.authorization": {
695
+ readonly attr: "present-iff errorCode unauthorized";
696
+ readonly since: "7.138.0";
697
+ };
698
+ readonly "GET /v1/sessions/:id/mcp#servers[].authorization": {
699
+ readonly attr: "present-iff server unauthorized (this face carries no errorCode)";
700
+ readonly since: "7.138.0";
701
+ };
702
+ };
703
+ };
704
+ /** `wiring_manifest.mods[].provenance`(每条腿的清单帧,每行 mod 注册一个出处标签):本服务自铸的注册带 `server`、运维声明的包带 `operator`;与同一行上 `seat` 的座词(`deployment` / `task`)互不相交。 */
705
+ readonly wiringModProvenance: {
706
+ readonly at: "wiring_manifest mods[].provenance";
707
+ readonly members: {
708
+ server: {
709
+ attr: string;
710
+ since: string;
711
+ };
712
+ operator: {
713
+ attr: string;
714
+ since: string;
715
+ };
716
+ };
717
+ };
718
+ /** 扩展经 `$.tool.call` 自己发起的调用是谁要的(core `AskRequest.requestedBy`)在审批开卡帧上的出现面:旧族 `tool_approval`、呈卡族 `approval_request` 顶层(卡外座)。 */
719
+ readonly extensionRequesterSeat: {
720
+ readonly at: "审批开卡帧上的 requestedBy(<帧>#requestedBy → 在场律)";
721
+ readonly members: {
722
+ "tool_approval#requestedBy": {
723
+ attr: string;
724
+ since: string;
725
+ };
726
+ "approval_request#requestedBy": {
727
+ attr: string;
728
+ since: string;
729
+ };
730
+ };
731
+ };
628
732
  /**
629
733
  * `request.field_conflict` 拒体的 `detail.kind`(字段之间互斥 / 互为前置的哪一类;`detail.fields` = 请求体坐标,不在本表 —— 它不是闭集)。
630
734
  * 词表属主 = `field-conflict.ts` 的 `FIELD_CONFLICT_KINDS`:`satisfies Record<FieldConflictKind, …>`,加词而本行没跟 / 多一个词 ⇒ tsc 红。
@@ -1147,10 +1251,6 @@ export declare const SELF_MINTED_WIRE: {
1147
1251
  readonly refusalSentenceForm: {
1148
1252
  readonly at: "拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变)";
1149
1253
  readonly members: {
1150
- readonly "409 decide.row_unrevivable#no_agent_name": {
1151
- readonly attr: "ends: deny it to close the card (the agent then ends as failed)";
1152
- readonly since: "7.136.0";
1153
- };
1154
1254
  readonly "409 decide.row_unrevivable#no_root_anchor": {
1155
1255
  readonly attr: "ends: deny it to close the card (the agent then ends as failed)";
1156
1256
  readonly since: "7.136.0";
@@ -1305,6 +1405,24 @@ export declare const SELF_MINTED_WIRE: {
1305
1405
  };
1306
1406
  };
1307
1407
  };
1408
+ /**
1409
+ * 回决门族 200 体上的**结清证据**(`<键>` → 在场律):`/decide` 的受理体 / 终局体 / 幂等回放 / 停驻子代复活成功 / 不可复活子代的 deny 作废,
1410
+ * `/resume` 与 `/plan_review` 的受理体 / 终局体(经停驻赎回席的迟到回决体原样转出)。键集属主 = `gate-settlement.ts` 的 `GateSettlementEvidence`
1411
+ * (唯一铸点 `buildSettlementEvidence`,五个边界;`checkpointId` 只随位出现)。
1412
+ */
1413
+ readonly settlementEvidenceKey: {
1414
+ readonly at: "回决门族 200 体的结清证据(<键> → 在场律;五个执行 / 回放边界由一只铸函数铸)";
1415
+ readonly members: {
1416
+ checkpointId: {
1417
+ attr: string;
1418
+ since: string;
1419
+ };
1420
+ decisionCommitted: {
1421
+ attr: string;
1422
+ since: string;
1423
+ };
1424
+ };
1425
+ };
1308
1426
  /**
1309
1427
  * 直连门决断证明的 HMAC 信封**扩展键闭集**(第 6 位扩展对象的键;字典序 = JSON 键序;在场才追加,缺席 ⇒ 字节逐字不变)。`satisfies Record<ApprovalEnvelopeExtKey, …>`:
1310
1428
  * 闭集属主 = `approval-hmac.ts` 的 `APPROVAL_ENVELOPE_EXT_KEYS`(加一个词而本表没跟 ⇒ tsc 红)。跨仓签名器照这张闭集实现,所以它是 wire。`attr` = 用它的那道门。
@@ -1511,16 +1629,17 @@ export declare const SELF_MINTED_WIRE: {
1511
1629
  readonly since: "7.137.0";
1512
1630
  };
1513
1631
  /**
1514
- * 7.137.0:MCP 远端失败句在面板与重拨回执上的出口读法(`http/mcp-remote-text.ts` 一只):按引擎铸点的记号 `[redacted]` 切开、只把引擎没抹的段过本仓 `redactSecrets`、截 200;
1515
- * 此前整句过一遍 —— 引擎回显体里凭据名字段上的 `[redacted]` 被改写成 `«redacted»`。钉 test/mcp-remote-text-redaction.test.ts、test/mcp-reconnect-http.test.ts ⑥。
1632
+ * MCP 远端失败句在面板与重拨回执上的出口读法:出口座的 `mcp-remote-text` 行(`trace/exit-seat.ts`)—— 与 trace / 通告同一个脱敏器(引擎记号 `[redacted]` = 已抹的值,原样;
1633
+ * 引擎记号占了方案词位时头值余下的部分照抹;引擎放过的形照抹),界 200(切点不落进记号)。7.137.0 是按记号切开、逐段过 `redactSecrets` 的另一只读法
1634
+ * (头名与值分在两段 ⇒ 方案词位上的值原样)。钉 test/mcp-remote-text-redaction.test.ts、test/mcp-reconnect-http.test.ts ⑥ 与「引擎记号占了方案词位」三形。
1516
1635
  */
1517
1636
  readonly "GET /v1/sessions/:id/mcp#servers[].error": {
1518
- readonly attr: "redactSecrets-outside-engine-marks+truncate:200";
1519
- readonly since: "7.137.0";
1637
+ readonly attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200";
1638
+ readonly since: "7.138.0";
1520
1639
  };
1521
1640
  readonly "POST /v1/sessions/:id/mcp/reconnect#reason|status.error|listingIncomplete.error": {
1522
- readonly attr: "redactSecrets-outside-engine-marks+truncate:200";
1523
- readonly since: "7.137.0";
1641
+ readonly attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200";
1642
+ readonly since: "7.138.0";
1524
1643
  };
1525
1644
  /**
1526
1645
  * 7.137.0:`GET /v1/config/catalog` 已有行的字面(`semantics` 说明句 / `derivedDefaultNote` 缺席说明;键与行集不变,写法同上一段 7.136.0 的行):提交面的带图预检退役后,
@@ -39,6 +39,7 @@ export const SELF_MINTED_WIRE = {
39
39
  at: "POST /v1/sessions/:id/memory/erase(已分类拒 errorCode → HTTP 状态)",
40
40
  members: {
41
41
  "config.memory_erasure_request": { attr: 400, since: "7.52.0" },
42
+ "config.memory_erasure_scope": { attr: 400, since: "7.138.0" },
42
43
  "memory.target_outside_store": { attr: 409, since: "7.101.0" },
43
44
  "memory.scope_home_not_directory": { attr: 409, since: "7.118.0" },
44
45
  "memory.erasure_evidence_unavailable": { attr: 409, since: "7.108.0" },
@@ -220,6 +221,58 @@ export const SELF_MINTED_WIRE = {
220
221
  unknown: { attr: "-", since: "7.121.0" },
221
222
  },
222
223
  },
224
+ healthModsKey: {
225
+ at: "GET /health mods",
226
+ members: {
227
+ deploymentPackages: { attr: "present-iff deployment mod packages loaded at boot", since: "7.138.0" },
228
+ },
229
+ },
230
+ modelsRowKey: {
231
+ at: "GET /v1/models models[] 行键(<键> → 在场律)",
232
+ members: {
233
+ supportsThinkingOff: { attr: "always", since: "7.138.0" },
234
+ },
235
+ },
236
+ toolEndGateDispositionKey: {
237
+ at: "tool_end gate.disposition 键(<臂>#<键> → 在场律)",
238
+ members: {
239
+ "denied#extension": { attr: "present-iff hook-layer denial by a named extension", since: "7.138.0" },
240
+ },
241
+ },
242
+ sideQueryBodyKey: {
243
+ at: "POST /v1/side-query 200 体键(<键> → 在场律)",
244
+ members: {
245
+ account: { attr: "always", since: "7.138.0" },
246
+ },
247
+ },
248
+ sideQueryErrorKind: {
249
+ at: "POST /v1/side-query 200 体 errorKind 的值(失败时在场;引擎的词逐字过境)",
250
+ members: {
251
+ image_unprocessable: { attr: "-", since: "7.138.0" },
252
+ },
253
+ },
254
+ mcpAuthorizationKey: {
255
+ at: "MCP 授权记录 authorization 的出现面(<面>#<键> → 在场律)",
256
+ members: {
257
+ "wiring_manifest.mcp[]#authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
258
+ "POST /v1/sessions/:id/mcp/reconnect#status.authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
259
+ "GET /v1/sessions/:id/mcp#servers[].authorization": { attr: "present-iff server unauthorized (this face carries no errorCode)", since: "7.138.0" },
260
+ },
261
+ },
262
+ wiringModProvenance: {
263
+ at: "wiring_manifest mods[].provenance",
264
+ members: {
265
+ server: { attr: "-", since: "7.138.0" },
266
+ operator: { attr: "-", since: "7.138.0" },
267
+ },
268
+ },
269
+ extensionRequesterSeat: {
270
+ at: "审批开卡帧上的 requestedBy(<帧>#requestedBy → 在场律)",
271
+ members: {
272
+ "tool_approval#requestedBy": { attr: "present-iff extension-initiated call", since: "7.138.0" },
273
+ "approval_request#requestedBy": { attr: "present-iff extension-initiated call", since: "7.138.0" },
274
+ },
275
+ },
223
276
  fieldConflictKind: {
224
277
  at: "400 request.field_conflict detail.kind",
225
278
  members: {
@@ -393,7 +446,6 @@ export const SELF_MINTED_WIRE = {
393
446
  refusalSentenceForm: {
394
447
  at: "拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变)",
395
448
  members: {
396
- "409 decide.row_unrevivable#no_agent_name": { attr: "ends: deny it to close the card (the agent then ends as failed)", since: "7.136.0" },
397
449
  "409 decide.row_unrevivable#no_root_anchor": { attr: "ends: deny it to close the card (the agent then ends as failed)", since: "7.136.0" },
398
450
  "400 request.field_invalid#mcpServers.over_cap(受理口 · POST /v1/capabilities/mcp/probe 同句)": { attr: "head: <field> has <count> entries — at most <cap> are accepted", since: "7.136.0" },
399
451
  "400 request.field_invalid#a2aPeers.over_cap": { attr: "tail: 声明列表拒绝骨架的句尾(与 mcpServers 共用 request-declaration-refusal)", since: "7.136.0" },
@@ -442,6 +494,13 @@ export const SELF_MINTED_WIRE = {
442
494
  toolCallId: { attr: "present-iff", since: "7.41.0" },
443
495
  },
444
496
  },
497
+ settlementEvidenceKey: {
498
+ at: "回决门族 200 体的结清证据(<键> → 在场律;五个执行 / 回放边界由一只铸函数铸)",
499
+ members: {
500
+ checkpointId: { attr: "present-iff", since: "7.138.0" },
501
+ decisionCommitted: { attr: "present-iff", since: "7.138.0" },
502
+ },
503
+ },
445
504
  approvalEnvelopeExtKey: {
446
505
  at: "直连门证明 HMAC 信封第 6 位扩展对象的键(<键> → 用它的门)",
447
506
  members: {
@@ -494,8 +553,8 @@ export const SELF_MINTED_WIRE = {
494
553
  "GET /v1/config/catalog#rows[WORKSPACE_SNAPSHOT_PREFIX].semantics": { attr: "multi-segment-prefix;bad-segment-refuses-boot", since: "7.136.0" },
495
554
  "GET /v1/config/catalog#rows[WORKSPACE_SNAPSHOT_PREFIX].derivedDefaultNote": { attr: "absent=>kata", since: "7.136.0" },
496
555
  "GET /v1/config/catalog#rows[K8S_SANDBOX_ENV].semantics": { attr: "values-only-in-the-pod-own-secret;role-needs-secrets-create;denied-refuses-boot", since: "7.137.0" },
497
- "GET /v1/sessions/:id/mcp#servers[].error": { attr: "redactSecrets-outside-engine-marks+truncate:200", since: "7.137.0" },
498
- "POST /v1/sessions/:id/mcp/reconnect#reason|status.error|listingIncomplete.error": { attr: "redactSecrets-outside-engine-marks+truncate:200", since: "7.137.0" },
556
+ "GET /v1/sessions/:id/mcp#servers[].error": { attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200", since: "7.138.0" },
557
+ "POST /v1/sessions/:id/mcp/reconnect#reason|status.error|listingIncomplete.error": { attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200", since: "7.138.0" },
499
558
  "GET /v1/config/catalog#rows[MODEL_VISION].semantics": { attr: "names-engine-notice:model.capability_downgraded", since: "7.137.0" },
500
559
  "GET /v1/config/catalog#rows[MODEL_VISION].derivedDefaultNote": { attr: "names-engine-notice:model.capability_downgraded", since: "7.137.0" },
501
560
  "GET /v1/config/catalog#rows[MODEL_CHEAP_VISION].semantics": { attr: "names-engine-notice:model.capability_downgraded", since: "7.137.0" },