@sema-agent/server 7.149.0 → 7.150.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 (194) hide show
  1. package/MIGRATION.md +122 -9
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +39 -15
  5. package/dist/approval-card.d.ts +1 -1
  6. package/dist/approval-gate-currency.d.ts +1 -1
  7. package/dist/audit.d.ts +1 -1
  8. package/dist/audit.js +2 -2
  9. package/dist/background-session-reap.d.ts +1 -1
  10. package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
  11. package/dist/boot/deferred-sandbox-path-env.js +1 -2
  12. package/dist/boot/parked-revive-gate.d.ts +5 -5
  13. package/dist/boot/parked-revive-gate.js +2 -3
  14. package/dist/boot/resolve-spec.d.ts +4 -5
  15. package/dist/boot/resolve-spec.js +61 -25
  16. package/dist/boot/retention-lane.d.ts +1 -1
  17. package/dist/boot/session-faces.js +21 -21
  18. package/dist/boot/stage-03-store-backend.js +2 -2
  19. package/dist/boot/stage-06-runners.js +1 -2
  20. package/dist/boot/stage-07-capability-layer.js +1 -1
  21. package/dist/boot/stage-10-http-server.d.ts +33 -1
  22. package/dist/boot/stage-10-http-server.js +9 -4
  23. package/dist/boot/web-admin.d.ts +1 -1
  24. package/dist/capability-facts.d.ts +65 -56
  25. package/dist/capability-facts.js +42 -35
  26. package/dist/config-catalog.js +1 -1
  27. package/dist/config-types.d.ts +12 -11
  28. package/dist/deployment-governance.d.ts +7 -28
  29. package/dist/deployment-governance.js +1 -14
  30. package/dist/device-ws-hub.d.ts +1 -0
  31. package/dist/device-ws-hub.js +64 -28
  32. package/dist/device-ws-protocol.d.ts +20 -6
  33. package/dist/device-ws-protocol.js +9 -2
  34. package/dist/engine-identity.d.ts +7 -1
  35. package/dist/engine-identity.js +5 -0
  36. package/dist/field-conflict.d.ts +2 -2
  37. package/dist/fleet/engine-signal.d.ts +14 -1
  38. package/dist/fleet/engine-signal.js +5 -1
  39. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  40. package/dist/fleet/serving-lease.d.ts +18 -3
  41. package/dist/fleet/serving-lease.js +81 -35
  42. package/dist/fleet-client.d.ts +13 -11
  43. package/dist/fleet-client.js +53 -33
  44. package/dist/history-anchor.js +1 -1
  45. package/dist/hitl-delivery.d.ts +1 -3
  46. package/dist/hitl-delivery.js +1 -1
  47. package/dist/http/active-run-conflict.d.ts +3 -7
  48. package/dist/http/active-run-conflict.js +2 -2
  49. package/dist/http/admission.js +2 -2
  50. package/dist/http/approval-sweeps.js +2 -1
  51. package/dist/http/caller-trust.d.ts +2 -2
  52. package/dist/http/caller-trust.js +3 -3
  53. package/dist/http/checkpoint-ctx.d.ts +18 -63
  54. package/dist/http/checkpoint-ctx.js +1 -24
  55. package/dist/http/claim-heartbeat.d.ts +4 -4
  56. package/dist/http/claim-heartbeat.js +3 -3
  57. package/dist/http/dispatch.js +2 -2
  58. package/dist/http/durable-run-leg.js +4 -4
  59. package/dist/http/owner-access.d.ts +243 -19
  60. package/dist/http/owner-access.js +184 -5
  61. package/dist/http/readiness.d.ts +4 -2
  62. package/dist/http/resume-ctx-read.js +16 -1
  63. package/dist/http/resume-legs.js +18 -14
  64. package/dist/http/route-ctx.d.ts +23 -11
  65. package/dist/http/routes/a2a-serve.js +15 -14
  66. package/dist/http/routes/approvals-assistant.d.ts +3 -2
  67. package/dist/http/routes/approvals-assistant.js +8 -9
  68. package/dist/http/routes/capabilities.js +4 -3
  69. package/dist/http/routes/config-catalog.d.ts +1 -1
  70. package/dist/http/routes/mcp-reconnect.js +2 -2
  71. package/dist/http/routes/memory-origin.d.ts +1 -1
  72. package/dist/http/routes/notify-wake.js +2 -3
  73. package/dist/http/routes/projects.d.ts +1 -0
  74. package/dist/http/routes/projects.js +5 -3
  75. package/dist/http/routes/retention-ops.d.ts +1 -1
  76. package/dist/http/routes/run-permission-mode.d.ts +1 -1
  77. package/dist/http/routes/run-permission-mode.js +2 -2
  78. package/dist/http/routes/runs.d.ts +1 -1
  79. package/dist/http/routes/runs.js +23 -30
  80. package/dist/http/routes/session-memory-sync.js +4 -5
  81. package/dist/http/routes/session-sync.js +3 -7
  82. package/dist/http/routes/sessions.d.ts +1 -1
  83. package/dist/http/routes/sessions.js +18 -44
  84. package/dist/http/routes/tasks.js +9 -8
  85. package/dist/http/routes/trace-usage.js +14 -14
  86. package/dist/http/routes/workflows.d.ts +1 -0
  87. package/dist/http/routes/workflows.js +20 -38
  88. package/dist/http/server.d.ts +8 -4
  89. package/dist/http/server.js +5 -1
  90. package/dist/http/stored-body-replay.d.ts +3 -24
  91. package/dist/http/stored-body-replay.js +2 -12
  92. package/dist/http/submit-ctx.d.ts +1 -2
  93. package/dist/http/submit-ctx.js +3 -2
  94. package/dist/http/submit-replay.d.ts +15 -2
  95. package/dist/http/submit-replay.js +10 -4
  96. package/dist/http/wire-types.d.ts +6 -3
  97. package/dist/leader/endpoint.js +9 -8
  98. package/dist/leg-facts.d.ts +8 -2
  99. package/dist/leg-facts.js +1 -0
  100. package/dist/mcp-authorization-face.d.ts +18 -14
  101. package/dist/mcp-authorization-face.js +3 -2
  102. package/dist/memory-store-refusal.d.ts +1 -1
  103. package/dist/observability/corrupt-read-seat.d.ts +1 -1
  104. package/dist/observability/fail-open.d.ts +5 -5
  105. package/dist/observability/fail-open.js +5 -5
  106. package/dist/observability/logger.d.ts +7 -0
  107. package/dist/observability/logger.js +3 -1
  108. package/dist/observability/run-terminal.d.ts +1 -1
  109. package/dist/owner-faces.d.ts +27 -3
  110. package/dist/owner-faces.js +2 -0
  111. package/dist/peer-seat.d.ts +1 -1
  112. package/dist/peer-seat.js +52 -59
  113. package/dist/plugins/exec-path-law.d.ts +34 -0
  114. package/dist/plugins/exec-path-law.js +13 -0
  115. package/dist/plugins/file-run-store.js +1 -1
  116. package/dist/plugins/local-checkpoint-store.d.ts +4 -1
  117. package/dist/plugins/local-checkpoint-store.js +3 -0
  118. package/dist/plugins/memory-run-store.js +1 -1
  119. package/dist/plugins/one-time-migrations.d.ts +74 -49
  120. package/dist/plugins/one-time-migrations.js +134 -69
  121. package/dist/plugins/pg-pool.js +4 -0
  122. package/dist/plugins/posix-shell-fs.js +4 -2
  123. package/dist/plugins/remote-env-adb.js +3 -2
  124. package/dist/plugins/remote-env-device.js +8 -6
  125. package/dist/plugins/remote-env-e2b.d.ts +3 -1
  126. package/dist/plugins/remote-env-e2b.js +11 -8
  127. package/dist/plugins/remote-env-host.d.ts +1 -1
  128. package/dist/plugins/remote-env-host.js +20 -11
  129. package/dist/plugins/remote-env-k8s.js +3 -2
  130. package/dist/plugins/remote-env-local-docker.js +3 -2
  131. package/dist/plugins/remote-env-ssh.js +4 -3
  132. package/dist/plugins/remote-shell.d.ts +3 -1
  133. package/dist/plugins/remote-shell.js +3 -3
  134. package/dist/plugins/replica-registration.d.ts +35 -0
  135. package/dist/plugins/replica-registration.js +48 -0
  136. package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
  137. package/dist/plugins/run-store-sql.d.ts +1 -1
  138. package/dist/plugins/run-store-sql.js +2 -2
  139. package/dist/plugins/scenario-prefix-switch-m42.d.ts +6 -12
  140. package/dist/plugins/scenario-prefix-switch-m42.js +7 -5
  141. package/dist/plugins/schema-consistency.d.ts +7 -5
  142. package/dist/plugins/schema-consistency.js +29 -16
  143. package/dist/plugins/schema-drift-sentence.js +1 -1
  144. package/dist/plugins/serving-requirement.d.ts +49 -0
  145. package/dist/plugins/serving-requirement.js +53 -0
  146. package/dist/plugins/stop-then-start-sentence.d.ts +42 -3
  147. package/dist/plugins/stop-then-start-sentence.js +44 -0
  148. package/dist/plugins/store-backend.d.ts +1 -1
  149. package/dist/plugins/store-contracts.d.ts +12 -2
  150. package/dist/plugins/store-contracts.js +3 -0
  151. package/dist/plugins/tidb-pool.js +4 -0
  152. package/dist/process-instance.d.ts +3 -0
  153. package/dist/process-instance.js +7 -0
  154. package/dist/project-context.d.ts +66 -0
  155. package/dist/project-context.js +70 -0
  156. package/dist/question.d.ts +9 -21
  157. package/dist/question.js +28 -19
  158. package/dist/run-cancel-card.d.ts +1 -1
  159. package/dist/run-cancel-card.js +2 -1
  160. package/dist/security.d.ts +1 -1
  161. package/dist/session-agent.d.ts +1 -10
  162. package/dist/session-agent.js +0 -6
  163. package/dist/session-incarnation.d.ts +18 -4
  164. package/dist/session-incarnation.js +4 -1
  165. package/dist/session-notify-door.d.ts +4 -4
  166. package/dist/session-notify-door.js +5 -6
  167. package/dist/session-rules-seat.d.ts +4 -3
  168. package/dist/session-rules-seat.js +3 -11
  169. package/dist/session-sync.js +3 -3
  170. package/dist/stores-sql/checkpoint-store-sql.d.ts +21 -2
  171. package/dist/stores-sql/checkpoint-store-sql.js +106 -18
  172. package/dist/stores-sql/retention-store-sql.d.ts +1 -1
  173. package/dist/task-cwd.d.ts +4 -3
  174. package/dist/task-settings.d.ts +13 -0
  175. package/dist/task-settings.js +13 -7
  176. package/dist/tool-approval.d.ts +7 -6
  177. package/dist/tool-approval.js +41 -37
  178. package/dist/trace/engine-notice-wire.d.ts +14 -0
  179. package/dist/trace/engine-notice-wire.js +18 -1
  180. package/dist/trace/project.d.ts +4 -3
  181. package/dist/trace/project.js +3 -2
  182. package/dist/trace/projection-table.d.ts +33 -2
  183. package/dist/trace/self-minted-wire.d.ts +150 -17
  184. package/dist/trace/self-minted-wire.js +54 -16
  185. package/dist/trace/tool-card.d.ts +3 -0
  186. package/dist/trace/tool-card.js +24 -0
  187. package/dist/trace/tool-output-media.d.ts +2 -1
  188. package/dist/unattended-permission-mode.d.ts +1 -1
  189. package/dist/web-admin-client/apply-effective.d.ts +1 -1
  190. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  191. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  192. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -29
  193. package/package.json +2 -2
  194. package/wire-changes/server@7.150.0.json +335 -0
@@ -115,10 +115,28 @@ const FS_WRITE_TOOLS = pathConfinableWriteToolNames();
115
115
  function sessionAllowCategory(toolName) {
116
116
  return FS_WRITE_TOOLS.has(toolName) ? "fs-write" : `tool:${toolName}`;
117
117
  }
118
- function sessionAllowKey(owner, sessionId, incarnation, category, binding) {
119
- if (!sessionId || !incarnation)
120
- return undefined;
121
- return JSON.stringify([owner, sessionId, incarnation, category, binding.kind === "bound" ? binding.digest : null]);
118
+ function sessionAllowKey(owner, seat, category, binding) {
119
+ return JSON.stringify([owner, seat.sessionId, seat.incarnation, category, binding.kind === "bound" ? binding.digest : null]);
120
+ }
121
+ function sessionAllowSeatOf(leg) {
122
+ return leg.sessionId && leg.incarnation ? { sessionId: leg.sessionId, incarnation: leg.incarnation } : undefined;
123
+ }
124
+ function liveSessionAnswer(facts, leg) {
125
+ const home = standingAnswerHome(facts);
126
+ switch (home) {
127
+ case "none":
128
+ return { home: "none", occupantUnreadable: false };
129
+ case "seat": {
130
+ const seat = sessionAllowSeatOf(leg);
131
+ return seat !== undefined ? { home: "seat", seat } : { home: "none", occupantUnreadable: Boolean(leg.sessionId) };
132
+ }
133
+ case "server_store":
134
+ return leg.sessionId ? { home: "server_store", sessionId: leg.sessionId } : { home: "none", occupantUnreadable: false };
135
+ default: {
136
+ const unhandled = home;
137
+ throw new Error(`unhandled standing-answer home: ${String(unhandled)}`);
138
+ }
139
+ }
122
140
  }
123
141
  function askStandingAnswerFacts(req, governanceForced, deploymentListAsks) {
124
142
  const classes = screenAskClassMembers(req.askClass, req.classes)?.classes;
@@ -196,8 +214,8 @@ function pendingEntryStandingAnswerFacts(entry) {
196
214
  deploymentListQuestion: entry.deploymentListQuestion === true,
197
215
  };
198
216
  }
199
- function projectDecisionFacts(facts, frame, card) {
200
- const rememberRefused = standingAnswerHome(facts) === "none";
217
+ function projectDecisionFacts(facts, leg, frame, card) {
218
+ const rememberRefused = liveSessionAnswer(facts, leg).home === "none";
201
219
  if (frame !== undefined) {
202
220
  if (facts.requiresRealApproval)
203
221
  frame.requiresRealApproval = true;
@@ -256,7 +274,7 @@ function livePendingRowOf(e) {
256
274
  ...(e.requiresRealApproval ? { requiresRealApproval: true } : {}),
257
275
  ...(e.governanceForced ? { governanceForced: true } : {}),
258
276
  ...(listFrame.mandated === true ? { mandated: true } : {}),
259
- ...(standingAnswerHome(pendingEntryStandingAnswerFacts(e)) === "none" ? { rememberRefused: true } : {}),
277
+ ...(liveSessionAnswer(pendingEntryStandingAnswerFacts(e), e).home === "none" ? { rememberRefused: true } : {}),
260
278
  ...(listFrame.mandate !== undefined ? { mandate: listFrame.mandate } : {}),
261
279
  ...(listFrame.origin !== undefined ? { origin: listFrame.origin } : {}),
262
280
  ...(listFrame.type === "approval_request" && listFrame.liveFactsUnknown === true ? { liveFactsUnknown: true } : {}),
@@ -959,8 +977,8 @@ export class ToolApprovalCoordinator {
959
977
  const sessionId = origin.sessionId;
960
978
  if (!sessionId)
961
979
  return false;
962
- const liveKey = sessionAllowKey(origin.owner, sessionId, origin.incarnation, sessionAllowCategory(req.toolName), facts.grantBinding);
963
- const live = liveKey !== undefined && this.allowAllSessions.has(liveKey);
980
+ const seat = sessionAllowSeatOf(origin);
981
+ const live = seat !== undefined && this.allowAllSessions.has(sessionAllowKey(origin.owner, seat, sessionAllowCategory(req.toolName), facts.grantBinding));
964
982
  const durable = !live && facts.grantBinding.kind === "none" && (await this.durableGrantHas(sessionId, req.toolName));
965
983
  if (!live && !durable)
966
984
  return false;
@@ -1330,7 +1348,7 @@ export class ToolApprovalCoordinator {
1330
1348
  ...(askReasonsOfReq !== undefined ? { askReasons: askReasonsOfReq } : {}),
1331
1349
  ...(governanceForced ? { governanceForced: true } : {}),
1332
1350
  ...(req.mandated === true ? { mandated: true } : {}),
1333
- ...(standingAnswerHome(askStandingAnswerFacts(req, governanceForced, deploymentListAsks)) === "none" ? { rememberRefused: true } : {}),
1351
+ ...(liveSessionAnswer(askStandingAnswerFacts(req, governanceForced, deploymentListAsks), origin).home === "none" ? { rememberRefused: true } : {}),
1334
1352
  ...(typeof req.boundGrantDigest === "string" ? { boundGrantDigest: req.boundGrantDigest, ...(req.boundGrants !== undefined ? { boundGrants: req.boundGrants } : {}) } : {}),
1335
1353
  ...(noRulingCause !== undefined ? { classifierNoRuling: noRulingCause } : {}),
1336
1354
  ...(grantAbsence !== undefined ? { boundGrantAbsence: grantAbsence } : {}),
@@ -1897,7 +1915,7 @@ export class ToolApprovalCoordinator {
1897
1915
  grantBinding: entryGrantBinding,
1898
1916
  classes: entryClasses,
1899
1917
  ...(entryDeploymentListQuestion ? { deploymentListQuestion: true } : {}),
1900
- }), frame, cardForFrame);
1918
+ }), origin, frame, cardForFrame);
1901
1919
  const cardFrame = askId !== undefined && cardForFrame !== undefined
1902
1920
  ? buildApprovalRequestFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, card: cardForFrame, expiresAtMs: persistedExpiresAtMs, nowMs: Date.now(), live: frame })
1903
1921
  : undefined;
@@ -1944,7 +1962,7 @@ export class ToolApprovalCoordinator {
1944
1962
  if (s.requiresRealApproval === true)
1945
1963
  continue;
1946
1964
  s.requiresRealApproval = true;
1947
- const card = projectDecisionFacts(pendingEntryStandingAnswerFacts(s), s.frame, s.cardFrame?.card);
1965
+ const card = projectDecisionFacts(pendingEntryStandingAnswerFacts(s), s, s.frame, s.cardFrame?.card);
1948
1966
  if (s.cardFrame !== undefined && card !== undefined && card !== s.cardFrame.card)
1949
1967
  s.cardFrame = { ...s.cardFrame, card };
1950
1968
  }
@@ -2097,11 +2115,10 @@ export class ToolApprovalCoordinator {
2097
2115
  }
2098
2116
  recordDeploymentListAnswer(decided, entry, judgedOwner, parsed, principal, eligibility) {
2099
2117
  const store = this.sessionGrants;
2100
- const sessionId = entry.sessionId;
2101
- if (parsed.value !== "allow_session" || !sessionId || store === undefined)
2102
- return decided;
2103
- if (standingAnswerHome(pendingEntryStandingAnswerFacts(entry)) !== "server_store")
2118
+ const answer = liveSessionAnswer(pendingEntryStandingAnswerFacts(entry), entry);
2119
+ if (parsed.value !== "allow_session" || answer.home !== "server_store" || store === undefined)
2104
2120
  return decided;
2121
+ const sessionId = answer.sessionId;
2105
2122
  return (async () => {
2106
2123
  const result = await decided;
2107
2124
  if (result.status !== 200)
@@ -2781,25 +2798,11 @@ export class ToolApprovalCoordinator {
2781
2798
  }
2782
2799
  finishRespond(entry, judgedOwner, parsed, opts) {
2783
2800
  let rememberApplied;
2784
- const home = standingAnswerHome(pendingEntryStandingAnswerFacts(entry));
2785
- let grantable;
2786
- switch (home) {
2787
- case "seat":
2788
- grantable = true;
2789
- break;
2790
- case "none":
2791
- case "server_store":
2792
- grantable = false;
2793
- break;
2794
- default: {
2795
- const unhandled = home;
2796
- throw new Error(`unhandled standing-answer home: ${String(unhandled)}`);
2797
- }
2798
- }
2799
2801
  if (parsed.value === "allow_session") {
2800
- const grantKey = grantable ? sessionAllowKey(judgedOwner, entry.sessionId, entry.incarnation, sessionAllowCategory(entry.toolName), entry.grantBinding) : undefined;
2801
- rememberApplied = grantKey !== undefined;
2802
- if (grantKey !== undefined) {
2802
+ const answer = liveSessionAnswer(pendingEntryStandingAnswerFacts(entry), entry);
2803
+ rememberApplied = answer.home === "seat";
2804
+ if (answer.home === "seat") {
2805
+ const grantKey = sessionAllowKey(judgedOwner, answer.seat, sessionAllowCategory(entry.toolName), entry.grantBinding);
2803
2806
  if (this.allowAllSessions.size >= MAX_ALLOW_SESSIONS) {
2804
2807
  const oldest = this.allowAllSessions.values().next().value;
2805
2808
  if (oldest !== undefined)
@@ -2807,7 +2810,7 @@ export class ToolApprovalCoordinator {
2807
2810
  }
2808
2811
  this.allowAllSessions.add(grantKey);
2809
2812
  }
2810
- else if (grantable && entry.sessionId) {
2813
+ else if (answer.home === "none" && answer.occupantUnreadable) {
2811
2814
  defaultLogger.warn("session_grant_refused_occupant_unreadable", { sessionId: entry.sessionId, toolName: entry.toolName });
2812
2815
  }
2813
2816
  }
@@ -2880,7 +2883,8 @@ export class ToolApprovalCoordinator {
2880
2883
  grantBinding: { kind: "unreadable" },
2881
2884
  ...(card.classes !== undefined ? { classes: card.classes } : {}),
2882
2885
  };
2883
- const rememberRefused = standingAnswerHome(pendingEntryStandingAnswerFacts(facts)) === "none";
2886
+ const leg = row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {};
2887
+ const rememberRefused = liveSessionAnswer(pendingEntryStandingAnswerFacts(facts), leg).home === "none";
2884
2888
  const cardFrame = (card.rememberRefused === true) === rememberRefused
2885
2889
  ? replayFrame
2886
2890
  : { ...replayFrame, card: rememberRefused ? { ...card, rememberRefused: true } : (({ rememberRefused: _stale, ...rest }) => rest)(card) };
@@ -2911,7 +2915,7 @@ export class ToolApprovalCoordinator {
2911
2915
  owner: row.owner,
2912
2916
  ownerReadSeq: this.rowReadSeq,
2913
2917
  executionLane: row.executionLane,
2914
- ...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
2918
+ ...leg,
2915
2919
  ...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
2916
2920
  toolName: card.toolName,
2917
2921
  ...facts,
@@ -1,3 +1,4 @@
1
+ import { projectMcpAuthorization } from "../mcp-authorization-face.js";
1
2
  /**
2
3
  * 上 wire 的通告码 —— **显式闭集常量表**(设计稿 ①,起步三码;今天的码数以本常量自身为准——
3
4
  * 在散文里抄数字必陈腐,codex 5.65 增量批 R1-[low] 实逮:上一句曾写「今天九码」而表里是十条。
@@ -108,6 +109,19 @@ export declare function redactNoticeMessage(message: unknown): string;
108
109
  * 交中和形,空白 / 超长的条目两只码不同)。其余字段、其余码原样。
109
110
  */
110
111
  export declare function redactNoticeRuleText(code: string, detail: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
112
+ /**
113
+ * 通告 `detail` 里**平铺着一条有处置表的记录**的码:码 → 那条记录的成员名与出门投影(一张表,不在 {@link engineNoticeEventData} 里写分支)。
114
+ * 记录成员只经那只投影出门(结构位:不过 {@link sanitizeWireText} 的脱敏与截断 —— 结构位的形与长由记录的属主判);detail 的其余成员照旧经
115
+ * {@link sanitizeNoticeDetail},合并按引擎 detail 的原键序。投影答 `undefined`(`reason` 出闭集 / 缺席)⇒ 记录成员整组缺席(在场而读不出由表的丢弃口计一次),
116
+ * 与状态面「整格缺席」同一失败方向。
117
+ * 运维日志腿(`boot/runner-deps.ts` 的转发席)不读这张登记:日志答「发生了什么」(给运维,整行过日志行的出口座),wire 答「用户拿到什么」—— 两个问题,两个读者。
118
+ */
119
+ export declare const NOTICE_DETAIL_RECORDS: {
120
+ readonly "mcp.authorization_required": {
121
+ readonly members: readonly string[];
122
+ readonly project: typeof projectMcpAuthorization;
123
+ };
124
+ };
111
125
  export declare function engineNoticeEventData(notice: {
112
126
  code: string;
113
127
  message: string;
@@ -2,6 +2,7 @@ import { uuidv7 } from "@sema-agent/core";
2
2
  import { redactSecrets } from "./redact.js";
3
3
  import { redactListEntry } from "../list-entry-display.js";
4
4
  import { recordFailOpen } from "../observability/fail-open.js";
5
+ import { MCP_AUTHORIZATION_MEMBERS, projectMcpAuthorization } from "../mcp-authorization-face.js";
5
6
  export const ENGINE_NOTICE_WIRE_CODES = [
6
7
  "memory.session_polluted",
7
8
  "memory.harvest_quarantined",
@@ -136,11 +137,27 @@ export function redactNoticeRuleText(code, detail) {
136
137
  });
137
138
  return { ...detail, [at.array]: redacted };
138
139
  }
140
+ export const NOTICE_DETAIL_RECORDS = {
141
+ "mcp.authorization_required": { members: MCP_AUTHORIZATION_MEMBERS, project: projectMcpAuthorization },
142
+ };
143
+ function noticeDetailOf(code, detail) {
144
+ const records = NOTICE_DETAIL_RECORDS;
145
+ const record = Object.hasOwn(records, code) ? records[code] : undefined;
146
+ if (record === undefined || detail === undefined)
147
+ return sanitizeNoticeDetail(redactNoticeRuleText(code, detail));
148
+ const own = (key) => record.members.includes(key);
149
+ const face = { ...record.project(Object.fromEntries(Object.entries(detail).filter(([k]) => own(k)))) };
150
+ const rest = sanitizeNoticeDetail(redactNoticeRuleText(code, Object.fromEntries(Object.entries(detail).filter(([k]) => !own(k)))));
151
+ return Object.fromEntries(Object.keys(detail).flatMap((k) => {
152
+ const from = own(k) ? face : rest;
153
+ return Object.hasOwn(from, k) ? [[k, from[k]]] : [];
154
+ }));
155
+ }
139
156
  export function engineNoticeEventData(notice, sessionId, nowMs, eventId) {
140
157
  return {
141
158
  code: notice.code,
142
159
  message: redactNoticeMessage(notice.message).slice(0, NOTICE_TEXT_MAX),
143
- detail: sanitizeNoticeDetail(redactNoticeRuleText(notice.code, notice.detail)),
160
+ detail: noticeDetailOf(notice.code, notice.detail),
144
161
  sessionId,
145
162
  ts: nowMs,
146
163
  eventId,
@@ -217,7 +217,7 @@ export declare function toolStartEventData(ev: {
217
217
  * `done` 永远到不了、重连恒复现同一处),而 `gate-outcome-defective` 那一格还不涨。
218
218
  *
219
219
  * ⇒ 兑现方式从「枚举」换成**结构**:任何逃出投影的异常同走既有的那一口 report + withhold。规则因此变少
220
- * (不是「守住已知的 N 种坏形」而是「坏字节一律 withhold」)。core 7.51.0 起筛本身对任意 JSON 形不抛(KL-1731-a:只覆盖 JSON ——
220
+ * (不是「守住已知的 N 种坏形」而是「坏字节一律 withhold」)。core 7.51.0 起筛本身对任意 JSON 形不抛([ref]:只覆盖 JSON ——
221
221
  * 访问器 / Proxy 这类非 JSON 值仍可能抛),本仓此前叠在筛前的具名形门与成员门(第二读法)随之退役,诊断串就是筛给的缺陷句。
222
222
  * ⛔ **刻意不动**「先脱敏后截断」的次序:截断在前会把跨界的密钥切成半截明文留在输出里,而且它只治
223
223
  * `note` 一条叶(`approver` 同病)—— 那是给一个类打两个特判,正是本仓要消掉的形。
@@ -294,7 +294,8 @@ export declare function reasoningEndEventData(ev: Record<string, unknown>): Segm
294
294
  * can never appear here) — SAME UNTRUSTED RAW contract as `output` (a card carries `originalFile`/stdout bodies),
295
295
  * so it gets the same deep redaction before it is persisted or echoed — except a media card's `file.base64` (image / document
296
296
  * cards: the second encoding of the same bytes the `output` block carries), which, like the block's `data`, is an encoding of
297
- * bytes and not text ({@link projectToolStructured}; the durable face drops it in the ledger confluence). `label`(core 展示名,同 tool_start 的
297
+ * bytes and not text; a card that carries a record with a disposition table (an MCP authorization failure card's `authorization`) has that member
298
+ * projected by the record's table ({@link projectToolCard}, the one reader of a tool card — session history reads `toolResult.details` with it too; the durable face drops the media bytes in the ledger confluence). `label`(core 展示名,同 tool_start 的
298
299
  * label 待遇 verbatim)白名单排查(2026-07-24)补齐进函数本体——此前外包给调用点各自手动拼接,7 处只有
299
300
  * 3 处记得拼,resume leg + ledger-sink 落盘两处漏了,持久化记录本身缺 label 一写盘就永久追不回来。 */
300
301
  export declare function toolEndEventData(ev: {
@@ -333,7 +334,7 @@ export declare function toolEndEventData(ev: {
333
334
  * · `toolCallId` / `toolName` —— 调用 id(🔴 [ref] 订正:出身是**服务商**在 tool_use / tool_calls 里给的,引擎缺席时自铸兜底、越界时折叠 ——
334
335
  * 此前写「引擎铸」不实)与名册里的工具名(与 `tool_start` 逐字同源)⇒ verbatim。调用 id 这一族的形状在**全部面的共同入口**一次施加 ——
335
336
  * core 7.36.0([ref])brain 建调用那一行的准入(在形原样 / 越界单射折叠,原字节只在转录 `ToolCall.wireId`),一方 brain 新铸的调用在逐帧面上
336
- * 恒是在形的引擎 id(残余两条 [ref]:≤7.106.0 写下的存量行 resume 出来的帧是服务商原串逐字;宿主 Brain 不准入 KL-1207-a —— 详见
337
+ * 恒是在形的引擎 id(残余两条 [ref]:≤7.106.0 写下的存量行 resume 出来的帧是服务商原串逐字;宿主 Brain 不准入 [ref] —— 详见
337
338
  * run-terminal `admitProviderEcho` 顶注);
338
339
  * 本仓不设第二道闸(见 run-terminal `admitProviderEcho` 顶注;[ref] 关)。
339
340
  * · `elapsedTimeSeconds` —— 引擎铸的整秒,单调、一 call 一个原点 ⇒ 有限数才铸键。
@@ -6,7 +6,8 @@ import { errorText } from "../observability/err-text.js";
6
6
  import { redactSecrets, redactDeep } from "./redact.js";
7
7
  import { seatText } from "./exit-seat.js";
8
8
  import { sanitizeWireText } from "./engine-notice-wire.js";
9
- import { projectToolOutput, projectToolStructured } from "./tool-output-media.js";
9
+ import { projectToolOutput } from "./tool-output-media.js";
10
+ import { projectToolCard } from "./tool-card.js";
10
11
  import { injectionTierOrAbsent } from "./injection-tier.js";
11
12
  import { semaProvenanceFields } from "./sema-provenance.js";
12
13
  import { resupplyFields, sessionBoxCarrierFields, terminalFrameFacetFields } from "./task-notification-facets.js";
@@ -255,7 +256,7 @@ export function toolEndEventData(ev) {
255
256
  ...(ev.output !== undefined ? { output: projectToolOutput(ev.output) } : {}),
256
257
  ...(ev.truncated ? { truncated: true } : {}),
257
258
  ...(Number.isFinite(ev.totalChars) ? { totalChars: ev.totalChars } : {}),
258
- ...(ev.structured !== undefined ? { structured: projectToolStructured(ev.structured, redactDeep) } : {}),
259
+ ...(ev.structured !== undefined ? { structured: projectToolCard(ev.structured, redactDeep) } : {}),
259
260
  ...(typeof ev.errorCode === "string" && ev.errorCode.length <= 128 ? { errorCode: ev.errorCode } : {}),
260
261
  ...(typeof ev.delivered === "string" && MCP_DELIVERY_VERDICTS.includes(ev.delivered) ? { delivered: ev.delivered } : {}),
261
262
  ...(gate !== undefined ? { gate } : {}),
@@ -15,6 +15,7 @@
15
15
  * `nested` 不收各臂键不同的联合(`keyof` 只给交集,某一臂独有的键会悄悄没有处置),core 写成 `unknown` / `any` 的值只能 `strip`;
16
16
  * **一格只许一词** —— 类型上把其余词的键写成 `never`(展开也混不进第二个词),运行期再核一次,两词同在 ⇒ 响亮抛。
17
17
  * 投影函数是表的解释器 {@link projectByTable};`core-keyset-guard.ts` 读表({@link TableCoreKeys})—— 门与投影只有一个写者。
18
+ * 解释器的产物型也是表的函数({@link FaceOf}):表翻一格,出门型随之变,出口不另写产物型、不解构挑键。
18
19
  *
19
20
  * ## 三条读法(所有表同一条)
20
21
  * · **缺席即缺席**:源值 `undefined` ⇒ 键缺席(不补 `[]` / `false` / 默认值);
@@ -91,10 +92,40 @@ export type TableCoreKeys<Tbl> = {
91
92
  readonly mint: unknown;
92
93
  } ? never : K;
93
94
  }[keyof Tbl];
95
+ /** 表的一格在 core 型上的源值型(铸键不在 core 型上 ⇒ 没有源值)。 */
96
+ type SourceOf<T, K> = K extends keyof T ? T[K] : never;
97
+ /** 列表位的元素型。 */
98
+ type RowOf<V> = NonNullable<V> extends readonly (infer E)[] ? E : never;
99
+ /** 一格出门后的型 —— 与解释器 {@link projectNode} 逐臂同读(谓词臂在布尔读法臂之前:谓词也是布尔读法,它多说了值认成什么型)。 */
100
+ type CellFace<V, E> = E extends "forward" ? Exclude<V, undefined> : E extends {
101
+ readonly mint: (...args: never[]) => infer X;
102
+ } ? Exclude<X, undefined> : E extends {
103
+ readonly forward: (raw: unknown) => raw is infer G;
104
+ } ? G : E extends {
105
+ readonly forward: unknown;
106
+ } ? Exclude<V, undefined> : E extends {
107
+ readonly redact: unknown;
108
+ } ? string : E extends {
109
+ readonly nested: infer Sub;
110
+ readonly rows: unknown;
111
+ } ? FaceOf<RowOf<V>, Sub>[] : E extends {
112
+ readonly nested: infer Sub;
113
+ } ? FaceOf<NonNullable<V>, Sub> : never;
114
+ /**
115
+ * 一张表的**出门型** = 解释器 {@link projectByTable} 的产物型,逐格由处置词推出(表是唯一写者,型随表走):
116
+ * · `"strip"` ⇒ 键不在型里;
117
+ * · `"forward"` / `{ forward: 布尔读法 }` ⇒ 源值型去 `undefined`(解释器只把 `undefined` 读作缺席,`null` 原样出门);
118
+ * · `{ forward: (raw) => raw is G }` ⇒ `G`(读法认的就是出门的型);
119
+ * · `{ redact }` ⇒ `string`;`{ nested }` ⇒ 子表的出门型(写了 `rows` ⇒ 它的数组);`{ mint }` ⇒ 铸函数返回型去 `undefined`。
120
+ * 每个键都可选(缺席即缺席 / 在场却读不出 ⇒ 丢);不带表字面量的 `readonly`(产物是解释器新建的对象)。
121
+ */
122
+ export type FaceOf<T, Tbl> = {
123
+ -readonly [K in keyof Tbl as Tbl[K] extends "strip" ? never : K]?: CellFace<SourceOf<T, K>, Tbl[K]>;
124
+ };
94
125
  /**
95
126
  * 按表投影一个值。`face` = 计数 / 报错里的面名(`<面>.<键路径>`);`root` = 铸键与 `rows` 读到的根(面的顶层值)。
96
- * 纯数据进、纯数据出;不改入参。
127
+ * 纯数据进、纯数据出;不改入参。产物型 = {@link FaceOf}(本函数是表的唯一解释器,型的唯一断言在这里)。
97
128
  */
98
- export declare function projectByTable<T extends object, R>(face: string, table: CoreTable<T, R>, value: T, root: R): Record<string, unknown>;
129
+ export declare function projectByTable<T extends object, R, Tbl extends CoreTable<T, R>>(face: string, table: Tbl, value: T, root: R): FaceOf<T, Tbl>;
99
130
  export {};
100
131
  //# sourceMappingURL=projection-table.d.ts.map
@@ -804,6 +804,96 @@ export declare const SELF_MINTED_WIRE: {
804
804
  };
805
805
  };
806
806
  };
807
+ /**
808
+ * stdout 启动协议行 `listening`(`msg:"listening"` 的那一行 JSON;不随 `LOG_LEVEL`,见 `observability/logger.ts` 的 `STARTUP_PROTOCOL_EVENTS`)的顶层键 → 在场律。
809
+ * 起本进程的壳 / 嵌入宿主 / 夹具从这一行取口(`port`)与实绑地址(`boundAddress`),再用 `/health` 的 `pid` / `dataRoot` 验身份。本集 7.150.0 才登记;
810
+ * `1.214.2` = 本仓 org 树首个 tag(那一批键在它之前就在这一行上),`bindHost` / `bindHostNote` 按各自首次出现的 tag。值的读法(词表、显示形)不在本集。
811
+ */
812
+ readonly listeningLineKey: {
813
+ readonly at: "stdout 启动协议行 listening(<键> → 在场律)";
814
+ readonly members: {
815
+ port: {
816
+ attr: string;
817
+ since: string;
818
+ };
819
+ bindHost: {
820
+ attr: string;
821
+ since: string;
822
+ };
823
+ bindHostNote: {
824
+ attr: string;
825
+ since: string;
826
+ };
827
+ boundAddress: {
828
+ attr: string;
829
+ since: string;
830
+ };
831
+ model: {
832
+ attr: string;
833
+ since: string;
834
+ };
835
+ brain: {
836
+ attr: string;
837
+ since: string;
838
+ };
839
+ breakerState: {
840
+ attr: string;
841
+ since: string;
842
+ };
843
+ session: {
844
+ attr: string;
845
+ since: string;
846
+ };
847
+ memory: {
848
+ attr: string;
849
+ since: string;
850
+ };
851
+ instanceId: {
852
+ attr: string;
853
+ since: string;
854
+ };
855
+ rateLimitPerMin: {
856
+ attr: string;
857
+ since: string;
858
+ };
859
+ rateLimit: {
860
+ attr: string;
861
+ since: string;
862
+ };
863
+ maxPrincipalCostUsd: {
864
+ attr: string;
865
+ since: string;
866
+ };
867
+ costQuota: {
868
+ attr: string;
869
+ since: string;
870
+ };
871
+ toolResultStore: {
872
+ attr: string;
873
+ since: string;
874
+ };
875
+ otel: {
876
+ attr: string;
877
+ since: string;
878
+ };
879
+ perModelKeys: {
880
+ attr: string;
881
+ since: string;
882
+ };
883
+ sealedModelKeys: {
884
+ attr: string;
885
+ since: string;
886
+ };
887
+ sealedPoisonedModels: {
888
+ attr: string;
889
+ since: string;
890
+ };
891
+ workflowRunStore: {
892
+ attr: string;
893
+ since: string;
894
+ };
895
+ };
896
+ };
807
897
  readonly healthStoreKey: {
808
898
  readonly at: "GET /health store";
809
899
  readonly members: {
@@ -1130,6 +1220,10 @@ export declare const SELF_MINTED_WIRE: {
1130
1220
  attr: string;
1131
1221
  since: string;
1132
1222
  };
1223
+ contentAttestedAt: {
1224
+ attr: string;
1225
+ since: string;
1226
+ };
1133
1227
  };
1134
1228
  };
1135
1229
  /** `GET /v1/projects` 200 体的顶层键(闭集;体是路由里的内联字面量 —— 行的键集在 `projectRowKey`)。 */
@@ -1243,7 +1337,13 @@ export declare const SELF_MINTED_WIRE: {
1243
1337
  };
1244
1338
  };
1245
1339
  };
1246
- /** MCP 授权记录 `authorization`(只投闭集词 `reason`,与 `errorCode:"unauthorized"` 同行)出现的三张面;投影只有 `mcp-authorization-face.ts` 的 `projectMcpAuthorization` 一只,三面同读。 */
1340
+ /**
1341
+ * MCP 授权记录 `authorization` 在 wire 上的**全部投影载体**(与 `errorCode:"unauthorized"` 同在)。出门只经一张处置表(`mcp-authorization-face.ts` 的
1342
+ * `MCP_AUTHORIZATION_DISPOSITIONS`,投影 `projectMcpAuthorization` 一只;今天只放行闭集词 `reason`)。账本帧、面板的 `lastLegMcp.mcp[]`、能力面两口载的是状态行投影
1343
+ * (`wiring_manifest.mcp[]` 行)写入 / 应答那一刻的产物;会话历史与 `tool_end.structured`(活面 SSE、持久面账本行与 `GET /v1/runs/:id/events` 等回放)是工具卡的投影
1344
+ * (一只读者 `projectToolCard`,登记 `TOOL_CARD_RECORDS`,`trace/tool-card.ts`;活面只载带已准入 `type` 的卡,即自注册工具在 `code: "unauthorized"` 卡上放的 `authorization`)。通告 `mcp.authorization_required` 的 `detail`
1345
+ * 里平铺的记录成员经同一只投影(登记 `NOTICE_DETAIL_RECORDS`),它的键由附录 D.3 登记,不在本集。会话同步拉取口(`/sync/entries`)是存档的逐字复制、不是投影,不在本集。
1346
+ */
1247
1347
  readonly mcpAuthorizationKey: {
1248
1348
  readonly at: "MCP 授权记录 authorization 的出现面(<面>#<键> → 在场律)";
1249
1349
  readonly members: {
@@ -1251,6 +1351,18 @@ export declare const SELF_MINTED_WIRE: {
1251
1351
  readonly attr: "present-iff errorCode unauthorized";
1252
1352
  readonly since: "7.138.0";
1253
1353
  };
1354
+ readonly "GET /v1/sessions/:id/mcp#lastLegMcp.mcp[].authorization": {
1355
+ readonly attr: "present-iff errorCode unauthorized";
1356
+ readonly since: "7.138.0";
1357
+ };
1358
+ readonly "GET /v1/capabilities/mcp#servers[].authorization": {
1359
+ readonly attr: "present-iff errorCode unauthorized";
1360
+ readonly since: "7.138.0";
1361
+ };
1362
+ readonly "POST /v1/capabilities/mcp/probe#servers[].authorization": {
1363
+ readonly attr: "present-iff errorCode unauthorized";
1364
+ readonly since: "7.138.0";
1365
+ };
1254
1366
  readonly "POST /v1/sessions/:id/mcp/reconnect#status.authorization": {
1255
1367
  readonly attr: "present-iff errorCode unauthorized";
1256
1368
  readonly since: "7.138.0";
@@ -1259,6 +1371,35 @@ export declare const SELF_MINTED_WIRE: {
1259
1371
  readonly attr: "present-iff server unauthorized (this face carries no errorCode)";
1260
1372
  readonly since: "7.138.0";
1261
1373
  };
1374
+ readonly "GET /v1/sessions/:id#messages[].details.authorization": {
1375
+ readonly attr: "present-iff details.code unauthorized";
1376
+ readonly since: "7.138.0";
1377
+ };
1378
+ readonly "SSE tool_end#structured.authorization": {
1379
+ readonly attr: "present-iff structured.code unauthorized and reason in the closed set; members = reason";
1380
+ readonly since: "7.138.0";
1381
+ };
1382
+ readonly "GET /v1/runs/:id/events#tool_end.structured.authorization": {
1383
+ readonly attr: "present-iff structured.code unauthorized and reason in the closed set; members = reason";
1384
+ readonly since: "7.138.0";
1385
+ };
1386
+ };
1387
+ readonly retired: {
1388
+ readonly "GET /v1/sessions/:id#messages[].details.authorization.resourceMetadataUrl": {
1389
+ readonly attr: "remote-claimed URL from the endpoint's challenge (deep-scrubbed text)";
1390
+ readonly since: "7.138.0";
1391
+ readonly until: "7.150.0";
1392
+ };
1393
+ readonly "SSE tool_end#structured.authorization(reason \u4EE5\u5916\u7684\u6210\u5458)": {
1394
+ readonly attr: "card members passed through the text redactor (resourceMetadataUrl, a custom card's own members)";
1395
+ readonly since: "7.138.0";
1396
+ readonly until: "7.150.0";
1397
+ };
1398
+ readonly "GET /v1/runs/:id/events#tool_end.structured.authorization(reason \u4EE5\u5916\u7684\u6210\u5458)": {
1399
+ readonly attr: "card members passed through the text redactor (resourceMetadataUrl, a custom card's own members)";
1400
+ readonly since: "7.138.0";
1401
+ readonly until: "7.150.0";
1402
+ };
1262
1403
  };
1263
1404
  };
1264
1405
  /** `wiring_manifest.mods[].provenance`(每条腿的清单帧,每行 mod 注册一个出处标签):本服务自铸的注册带 `server`、运维声明的包带 `operator`;与同一行上 `seat` 的座词(`deployment` / `task`)互不相交。 */
@@ -1290,7 +1431,7 @@ export declare const SELF_MINTED_WIRE: {
1290
1431
  };
1291
1432
  };
1292
1433
  /**
1293
- * `request.field_conflict` 拒体根上的 `reason`(字段之间互斥 / 互为前置的哪一类;`fields` = 请求体坐标,不在本表 —— 它不是闭集)。
1434
+ * `request.field_conflict` 拒体根上的 `reason`(字段之间互斥 / 互为前置的哪一类;`fields` = 请求体坐标,不在本表 —— 它不是闭集;某一类的坐标并集变了,记在那一词的 `attr` 上)。
1294
1435
  * 词表属主 = `field-conflict.ts` 的 `FIELD_CONFLICT_REASONS`:`satisfies Record<FieldConflictReason, …>`,加词而本行没跟 / 多一个词 ⇒ tsc 红。
1295
1436
  * 契约附录 A 的 `request.field_conflict` 行逐个列这些词(`test/field-conflict-detail.test.ts` 钉)。同一组词 7.133.0–7.147.0 在 `detail.kind`(集名 `fieldConflictKind`,
1296
1437
  * 随拒体版式律退役);`since` 记的是它们出现在根上 `reason` 的那一版。
@@ -2036,7 +2177,7 @@ export declare const SELF_MINTED_WIRE: {
2036
2177
  };
2037
2178
  /**
2038
2179
  * 运维队列停驻行(`kind: "checkpoint"`)与订阅流 `pending` 帧上的 `agent` —— 行的会话(`sessionId`)在委派树里的位置 `{ id?, parentSessionId?, rootSessionId? }`,
2039
- * 与 `GET /v1/sessions/:sessionId` 体顶层的同名键同一只读口(`session-agent.ts` 的 `readSessionAgent`)、同一只投影,逐值同答。
2180
+ * 与 `GET /v1/sessions/:sessionId` 体顶层的同名键同一只读口(`http/owner-access.ts` 的 `readSessionAgent`)、同一只投影,逐值同答。
2040
2181
  * 在场律 `present-iff`:这一次列表读到行的会话是一只 placed 委派子代(会话行上存着引擎写下的委派元组);宿主会话、同步委派的子代、`fork` 型后台子代、
2041
2182
  * 不存元组的店、那一读没读成(F 类 `server.approvals.queue-row-agent-unreadable`)⇒ 缺席 —— 缺席读作「这台 server 没有说」。`satisfies` 绑行形:删键 / 改名而本表没跟 ⇒ tsc 红。
2042
2183
  */
@@ -2672,17 +2813,14 @@ export declare const SELF_MINTED_WIRE: {
2672
2813
  };
2673
2814
  readonly "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#resume_claim_store_fault(\u8BA4\u9886\u4E4B\u524D\u90A3\u4E00\u6B21\u6267\u884C\u5E2D\u8BFB\u3001\u8BA4\u9886\u90A3\u4E00\u7B14 \u2014\u2014 markResuming / wake \u73B0\u5EFA\u884C\u7684 createRun \u2014\u2014 \u6216\u8BA4\u9886\u4E4B\u540E\u63D0\u4EA4\u6267\u884C\u653E\u7F6E\u90A3\u4E00\u6B21\u5E97\u5F80\u8FD4\u5931\u8D25:\u5E93\u65AD\u8FDE / \u62D2\u8FDE / \u8D85\u65F6\u3001\u7F3A\u8868 / \u6743\u9650\u62D2\u3001\u8BA4\u4E0D\u51FA\u7684\u5E93\u9519;\u8BA4\u9886\u4E4B\u540E\u90A3\u4E00\u5F62\u7EED\u8DD1\u8BA4\u9886\u7684\u505C\u9A7B\u884C\u56DE\u5230\u8BA4\u9886\u4E4B\u524D\u7684\u505C\u9A7B\u8BCD\u3001\u8BA4\u9886\u7559\u7740,wake \u73B0\u5EFA\u7684\u884C\u5220\u6389;\u5361\u4ECD\u5F85\u51B3;\u4F53 state.resume_context_unreadable)": {
2674
2815
  readonly attr: 503;
2675
- readonly revises: readonly ["errorCode:internal.error"];
2676
2816
  readonly since: "7.149.0";
2677
2817
  };
2678
2818
  readonly "POST /v1/runs/:id/cancel#parked_card_body_scope_differs(\u505C\u9A7B run \u4E0A\u7684\u53D6\u6D88:\u8FD9\u5F20\u5361\u884C\u4F53\u91CC\u81EA\u5E26\u7684\u5C5E\u4E3B\u683C\u4E0E\u5E97\u7684\u5C5E\u4E3B\u683C\u4E0D\u4E00\u81F4 \u2014\u2014 \u53D6\u6D88\u53EA\u8BFB\u5E97\u7684\u5C5E\u4E3B\u683C,\u7ED3\u7B97\u8FD9\u5F20\u5361\u3001\u9A71 run \u7EC8\u5C40;\u4F53 { taskId, status: failed, errorCode: cancelled, cancelRequested: false, note })": {
2679
2819
  readonly attr: 202;
2680
- readonly revises: readonly ["errorCode:conflict.approval_settled"];
2681
2820
  readonly since: "7.149.0";
2682
2821
  };
2683
2822
  readonly "POST /v1/runs/:id/cancel#parked_card_body_unreadable(\u505C\u9A7B run \u4E0A\u7684\u53D6\u6D88:\u8FD9\u5F20\u5361\u7684\u884C\u4F53\u8BFB\u4E0D\u6210\u68C0\u67E5\u70B9 \u2014\u2014 \u53D6\u6D88\u53EA\u8BFB\u5E97\u7684\u5217,\u7ED3\u7B97\u8FD9\u5F20\u5361\u3001\u9A71 run \u7EC8\u5C40;\u4F53\u540C\u4E0A)": {
2684
2823
  readonly attr: 202;
2685
- readonly revises: readonly ["errorCode:internal.error"];
2686
2824
  readonly since: "7.149.0";
2687
2825
  };
2688
2826
  readonly "POST /v1/approvals/:sessionId/decide#parked_agent_definition_unavailable(\u505C\u9A7B\u8D4E\u56DE;\u884C\u4E0A\u7684\u4EE3\u7406\u7C7B\u578B\u4E0D\u5728\u8D4E\u56DE\u9762\u59D4\u6D3E\u5DE5\u5177\u7684\u540D\u518C\u91CC:\u9010\u8BF7\u6C42 `agents` \u5B9A\u4E49 / \u505C\u9A7B\u540E\u88AB\u64A4\u7684\u90E8\u7F72\u5B9A\u4E49 / \u540D\u53EB fork \u7684\u5B9A\u4E49;approve \u4E0E deny \u540C\u7B54;\u8BA4\u9886\u56DE\u6EDA\u3001\u59D4\u6D3E\u5DE5\u5177\u96F6\u8C03\u7528\u3001\u5361\u4ECD\u5F85\u51B3;\u4F53 decide.agent_definition_unavailable + taskId + rollback)": {
@@ -2691,32 +2829,26 @@ export declare const SELF_MINTED_WIRE: {
2691
2829
  };
2692
2830
  readonly "POST /v1/tasks|/v1/tasks/stream|/v1/runs#run_claim_store_fault(\u65B0\u63D0\u4EA4:\u8BA4\u9886\u4E4B\u524D\u90A3\u4E00\u6B21\u6267\u884C\u5E2D\u8BFB,\u6216\u8BA4\u9886\u8FD9\u4E00\u6BB5 \u2014\u2014 \u5EFA\u884C\u8BA4\u9886 createRun\u3001\u6267\u884C\u653E\u7F6E\u3001\u7EED\u8DD1\u8F93\u5165\u7684\u5199\u3001\u8D77\u8DD1\u4E4B\u524D\u7684\u8BA4\u9886\u590D\u6838 \u2014\u2014 \u6709\u4E00\u6B21\u5E97\u5F80\u8FD4\u6CA1\u7B54\u51FA\u6765:\u5E93\u65AD\u8FDE / \u62D2\u8FDE / \u8D85\u65F6\u3001\u7F3A\u8868 / \u6743\u9650\u62D2\u3001\u8BA4\u4E0D\u51FA\u7684\u5E93\u9519;\u672C\u8BF7\u6C42\u94F8\u7684\u884C\u5DF2\u5220\u6389 \u2014\u2014 \u8BA4\u9886\u4E0E\u5E42\u7B49\u952E\u968F\u884C\u53BB,\u540C\u4E00\u4E2A\u81EA\u5E26 taskId \u91CD\u53D1\u5373\u65B0\u63D0\u4EA4 \u2014\u2014 \u4EC0\u4E48\u90FD\u6CA1\u8D77\u8DD1;\u8BA4\u9886\u4E4B\u540E\u7684\u6D41\u5F0F\u817F = \u6D41\u7684\u7EC8\u5E27;\u5DF2\u7ED1\u8BBE\u5907\u7684\u4F1A\u8BDD\u4E0A\u8BA4\u9886\u4E4B\u540E\u90A3\u4E00\u6B21\u6267\u884C\u5E2D\u8BFB\u540C\u7B54;\u4F53 state.run_store_unavailable)": {
2693
2831
  readonly attr: 503;
2694
- readonly revises: readonly ["errorCode:internal.error", "errorCode:device.not_bound"];
2695
2832
  readonly since: "7.149.0";
2696
2833
  };
2697
2834
  readonly "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#resume_pre_engine_store_fault(\u7EED\u8DD1\u817F\u63D0\u4EA4\u653E\u884C\u4E4B\u540E\u3001\u4EA4\u7ED9\u5F15\u64CE\u4E4B\u524D\u90A3\u4E00\u6BB5 \u2014\u2014 \u6392\u7A7A workflow \u5B8C\u6210\u7684\u5E8F\u53F7\u57FA\u5740\u73B0\u8BFB\u4E0E\u843D\u8D26\u3001\u901A\u544A\u53E3\u843D\u8D26 \u2014\u2014 \u5E97\u5F80\u8FD4\u6CA1\u7B54\u51FA\u6765;\u7EED\u8DD1\u8BA4\u9886\u7684\u505C\u9A7B\u884C\u56DE\u5230\u505C\u9A7B\u3001\u8BA4\u9886\u7559\u7740,wake \u73B0\u5EFA\u7684\u884C\u5220\u6389;\u5361\u4ECD\u5F85\u51B3;\u4F53 state.resume_context_unreadable)": {
2698
2835
  readonly attr: 503;
2699
- readonly revises: readonly ["errorCode:internal.error"];
2700
2836
  readonly since: "7.149.0";
2701
2837
  };
2702
2838
  readonly "POST /v1/approvals/:sessionId/decide#workflow_host_turn_claim_store_fault(workflow \u51B3\u5B9A\u5728\u5BBF\u4E3B\u4F1A\u8BDD\u4E0A\u8D77\u7684\u65B0\u4E00\u8DD1:\u5EFA\u884C\u8BA4\u9886 / \u6267\u884C\u653E\u7F6E / \u7EED\u8DD1\u8F93\u5165 / \u51B3\u5B9A\u843D\u884C / \u8D77\u8DD1\u4E4B\u524D\u7684\u8BA4\u9886\u590D\u6838\u6709\u4E00\u6B21\u5E97\u5F80\u8FD4\u6CA1\u7B54\u51FA\u6765;\u51B3\u5B9A\u843D\u884C\u90A3\u4E00\u7B14\u5728 wake \u817F\u4E0A\u540C\u7B54;\u73B0\u5EFA\u7684\u884C\u5DF2\u5220\u6389,\u5B50\u4EE3\u7684\u5361\u4ECD\u5F85\u51B3;\u4F53 state.resume_context_unreadable)": {
2703
2839
  readonly attr: 503;
2704
- readonly revises: readonly ["errorCode:internal.error"];
2705
2840
  readonly since: "7.149.0";
2706
2841
  };
2707
2842
  readonly "POST /v1/approvals/:sessionId/decide#workflow_decision_not_recorded(workflow \u51B3\u5B9A\u7684\u6295\u9012\u90A3\u4E00\u8DD1\u5728\u51B3\u5B9A\u843D\u884C\u90A3\u4E00\u62CD\u5DF2\u4E0D\u6301\u5BBF\u4E3B\u4F1A\u8BDD\u7684\u8BA4\u9886 \u2014\u2014 \u5FC3\u8DF3\u505C\u6EE1\u4E00\u7A97\u88AB\u6536\u5272;\u51B3\u5B9A\u6CA1\u843D\u3001\u90A3\u4E00\u8DD1\u6CA1\u8D77;\u4E0E\u8D77\u8DD1\u4E4B\u524D\u8BA4\u9886\u590D\u6838\u7B54\u300C\u6CA1\u6301\u6709\u300D\u540C\u4E00\u53EA\u7B54\u590D:\u8BA4\u9886\u5728\u522B\u7684 run \u4E0A \u21D2 409 conflict.session_active_run,\u5BBF\u4E3B\u4F1A\u8BDD\u5DF2\u5220 \u21D2 404 resume.session_not_found,\u5426\u5219 409 conflict.claim_lost)": {
2708
2843
  readonly attr: 409;
2709
- readonly revises: readonly ["errorCode:internal.error"];
2710
2844
  readonly since: "7.149.0";
2711
2845
  };
2712
2846
  readonly "POST /v1/approvals/:sessionId/decide#parked_redeem_placement_store_fault(\u505C\u9A7B\u5B50\u4EE3\u8D4E\u56DE:\u8BA4\u9886\u4E4B\u524D\u90A3\u4E00\u6B21\u6267\u884C\u5E2D\u8BFB,\u6216\u8BA4\u9886\u4E4B\u540E\u90A3\u4E00\u6B21\u6267\u884C\u653E\u7F6E\u7684\u5E97\u5F80\u8FD4\u6CA1\u7B54\u51FA\u6765;\u8BA4\u9886\u6CA1\u6709\u6216\u5DF2\u56DE\u6EDA,\u5B50\u4EE3\u4ECD\u505C\u7740\u3001\u5361\u4ECD\u5F85\u51B3;\u4F53 decide.store_unreachable + taskId)": {
2713
2847
  readonly attr: 503;
2714
- readonly revises: readonly ["errorCode:internal.error"];
2715
2848
  readonly since: "7.149.0";
2716
2849
  };
2717
2850
  readonly "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#placement_refused_after_claim(\u7EED\u8DD1\u5BB6\u65CF\u3001workflow \u51B3\u5B9A\u5728\u5BBF\u4E3B\u4F1A\u8BDD\u4E0A\u8D77\u7684\u65B0\u4E00\u8DD1\u3001\u505C\u9A7B\u5B50\u4EE3\u8D4E\u56DE\u8BA4\u9886\u4E4B\u540E\u63D0\u4EA4\u6267\u884C\u653E\u7F6E\u8BFB\u51FA\u8FD9\u6761\u4F1A\u8BDD\u6B64\u523B\u4E0D\u80FD\u5728\u672C\u5904\u6267\u884C:\u5DF2\u653E\u5728\u522B\u7684\u8F66\u9053 / \u5199\u8005\u5728\u522B\u5904 / \u8BBE\u5907\u62D2;\u7EED\u8DD1\u8BA4\u9886\u7684\u505C\u9A7B\u884C\u56DE\u5230\u505C\u9A7B\u3001\u505C\u9A7B\u8D4E\u56DE\u56DE\u6EDA,\u5361\u4ECD\u5F85\u51B3,wake \u4E0E\u5BBF\u4E3B\u65B0\u4E00\u8DD1\u73B0\u5EFA\u7684\u884C\u5220\u6389;\u4E0E\u8BA4\u9886\u4E4B\u524D\u540C\u4E00\u53EA\u6298\u6CD5\u3001\u540C\u4E00\u53EA\u4F53;\u4F53 resume_blocked_by_policy + blockedBy \u539F\u7801 + \u539F\u4E8B\u5B9E forkPath / boundLane + retriable)": {
2718
2851
  readonly attr: 409;
2719
- readonly revises: readonly ["errorCode:execution_lane.tree_bound", "errorCode:conflict.session_mirror"];
2720
2852
  readonly since: "7.149.0";
2721
2853
  };
2722
2854
  readonly "POST /v1/tasks#park_commit_ended(\u540C\u6B65\u817F\u505C\u5728\u8981\u6279\u7684\u95E8\u4E0A,\u800C\u505C\u9A7B\u63D0\u4EA4\u7B54\u51FA\u8FD9\u6761 run \u6CA1\u6709\u505C\u4F4F\u3001\u5DF2\u6536\u573A \u2014\u2014 \u505C\u9A7B\u5199\u4E4B\u524D\u5DF2\u6309\u4E0B\u53D6\u6D88 / \u88AB\u5931\u8054\u6536\u5272 / \u522B\u5904\u7EC8\u7ED3;\u5361\u5DF2\u4F5C\u5E9F;\u4F53 = \u6536\u573A\u90A3\u4E00\u884C\u7684\u4FE1\u5C01,\u4E0E\u540C\u952E\u91CD\u653E\u540C\u4E00\u53EA:\u7EC8\u5C40\u884C\u7684\u7ED3\u679C,\u53D6\u6D88\u90A3\u4E00\u5F62 terminal.code cancelled;\u884C\u4E0A\u65E0\u7ED3\u679C \u21D2 \u56DE\u6267\u4E09\u952E)": {
@@ -2733,17 +2865,14 @@ export declare const SELF_MINTED_WIRE: {
2733
2865
  };
2734
2866
  readonly "GET /v1/tool-approvals/:id#row_unreadable(\u6709\u884C\u7684\u95EE,\u6309 id \u8BFB\u884C\u90A3\u4E00\u62CD\u5E97\u629B / \u8D85\u65F6;\u672C\u526F\u672C\u81EA\u5DF1\u94F8\u7684\u6D3B\u5361\u4E0E\u8D77\u670D\u63A5\u7BA1\u7684\u767B\u8BB0\u540C\u7B54;\u4F53 not_found.ask,\u4E0E\u67E5\u65E0 / \u4E0D\u662F\u4F60\u7684\u9010\u5B57\u8282\u540C)": {
2735
2867
  readonly attr: 404;
2736
- readonly revises: readonly ["selfMinted.toolApprovalReadState:pending"];
2737
2868
  readonly since: "7.149.0";
2738
2869
  };
2739
2870
  readonly "POST /v1/sessions/:id/sync/plan|POST /v1/sessions/:id/sync/import|PUT /v1/sessions/:id/sync/blobs/:hash#foreign_session_deleting(\u63A8\u9001\u4E09\u53E3\u7684\u95E8:id \u4E0A\u662F\u522B\u7684\u4E3B\u4F53\u6B63\u5728\u5220\u9664\u7684\u4F1A\u8BDD \u2014\u2014 \u5220\u9664\u56F4\u680F\u5DF2\u7ACB\u3001\u5C1A\u672A\u5220\u51C0;\u300C\u88AB\u5360\u7740\u300D\u8BFB\u6D3B\u884C \u222A \u5728\u5220\u884C,\u4E0E\u5BF9\u522B\u4EBA\u7684\u6D3B\u884C\u540C\u7B54;\u672C\u4EBA / fleet \u5BF9\u81EA\u5DF1\u5728\u5220\u7684\u4F1A\u8BDD\u4E0D\u53D8,\u62C9\u53D6\u53E3\u4ECD\u53EA\u8BA4\u6D3B\u884C;\u4F53 not_found.session,\u4E0E\u5BF9\u4E0D\u5B58\u5728 id \u7684\u62C9\u53D6\u7B54\u590D\u9010\u5B57\u8282\u540C)": {
2740
2871
  readonly attr: 404;
2741
- readonly revises: readonly ["errorCode:conflict"];
2742
2872
  readonly since: "7.149.0";
2743
2873
  };
2744
2874
  readonly "POST /v1/sessions/:id/sync/import#idle_id_other_principal_in_flight(\u7B2C\u4E00\u9636\u6BB5:id \u4E0A\u8FD8\u6CA1\u6709\u4F1A\u8BDD\u884C,\u800C\u53E6\u4E00\u4E2A\u4E3B\u4F53\u5728\u8FD9\u53EA id \u4E0A\u7684\u7B2C\u4E00\u9636\u6BB5\u6B63\u5728\u98DE;\u5BFC\u5165\u79DF\u7EA6\u952E = \u843D\u70B9\u5C5E\u4E3B\u683C + \u4F1A\u8BDD id,\u7A7A\u95F2 id \u4E0A\u5404\u5360\u5404\u7684;\u4F53 = \u7B2C\u4E00\u9636\u6BB5\u7684\u6682\u5B58\u56DE\u6267 stagingId;\u5148\u63D0\u4EA4\u8005\u5F97,\u8F93\u7684\u90A3\u4E00\u4EFD\u5728\u63D0\u4EA4\u524D\u590D\u5224\u7B54 404 not_found.session,\u4E0E\u8D62\u5BB6\u7684\u63D0\u4EA4\u649E\u5728\u540C\u4E00\u523B\u65F6\u7531\u5E97\u7684\u5C5E\u4E3B CAS \u62D2 409 conflict)": {
2745
2875
  readonly attr: 200;
2746
- readonly revises: readonly ["errorCodeFamily:import_in_flight"];
2747
2876
  readonly since: "7.149.0";
2748
2877
  };
2749
2878
  readonly "POST /v1/tasks|/v1/tasks/stream|/v1/runs#a2aPeers_headers_reserved_member(\u65B0\u63D0\u4EA4;a2aPeers[i].headers \u7684\u6210\u5458\u540D\u662F constructor / prototype \u2014\u2014 \u4E0E mcpServers[i].transport.headers / .env \u540C\u4E00\u5F20\u4FDD\u7559\u6210\u5458\u540D\u8868\u3001\u540C\u4E00\u53EA\u8BFB\u6CD5,\u5927\u5C0F\u5199\u654F\u611F;\u4F53 request.field_invalid + field \u6210\u5458\u7EA7\u8DEF\u5F84 a2aPeers[i].headers.<\u540D>;\u5B58\u76D8\u7EED\u8DD1\u4F53\u91CC\u540C\u5F62 \u21D2 \u7EED\u8DD1\u5BB6\u65CF\u65E2\u6709\u4E00\u9762 #stored_unread_members 409)": {
@@ -2956,7 +3085,6 @@ export declare const SELF_MINTED_WIRE: {
2956
3085
  };
2957
3086
  readonly "session faces \u00B7 list faces \u00B7 /metrics family#dev-open-principal-header-not-owner": {
2958
3087
  readonly attr: "each face's missing-row answer, same body as a missing row (404 not_found.session on GET /v1/sessions/:id · /head · /events · /memory-status · /execution-placement · PATCH /v1/sessions/:id · fork · sync reads (manifest · entries · history blob) · memory/erase · background · background/stop · mcp/reconnect · policy · notify; approval exemptions 404 not_found.session (not found); DELETE /v1/sessions/:id 200 {deleted:false}; sync push family (plan · import · blob put) 404 on another owner's session, its existing create answer on a missing id); GET /v1/sessions · /v1/fleet/stream · /v1/agents/roster · /v1/tasks (trace list) · /v1/usage/* · /v1/sendfile-links pinned to the named caller; /metrics* and GET /v1/tasks/source-summary 401 auth.unauthorized (operator sentence; METRICS_TOKEN, when configured, still opens /metrics* and is judged first); a Bearer this deployment cannot verify does not count as naming no principal (no fleet); a caller naming no principal and presenting no unverifiable credential unchanged (fleet); was 200 / fleet-wide (the principal header read as a label)";
2959
- readonly revises: readonly ["selfMinted.ownerFaceAnswer:GET /v1/runs/:id · /v1/runs/:id/events#dev-open-principal-header-not-owner"];
2960
3088
  readonly since: "7.149.0";
2961
3089
  };
2962
3090
  readonly "owner-only session ports#unreadable-archive-ownerless-session-fleet-or-operator": {
@@ -3581,9 +3709,10 @@ export declare const SELF_MINTED_WIRE: {
3581
3709
  /**
3582
3710
  * 设备 WS 协议的修订号(成员 = 修订号;能力位 `deviceExecutor.protocolVersion` 报最高那一只,challenge 帧同值)。`attr` = 那一修订号加进 executor → server 结局码闭集的词
3583
3711
  * (修订号 1 = 首版的基集 `base`,词集见随包 `docs/DEVICE-EXECUTOR-PROTOCOL.md` §2.1);executor 声明哪个修订号就只发到那一行为止的词。
3712
+ * 零加词的语义修订(server 发来的帧意思变了)attr = 变更名;协议文档同一行第三栏写变更全文。
3584
3713
  */
3585
3714
  readonly deviceProtocolRevision: {
3586
- readonly at: "GET /v1/capabilities deviceExecutor.protocolVersion 与 device WS challenge 帧的修订号(<修订号> → 它加进结局码闭集的词)";
3715
+ readonly at: "GET /v1/capabilities deviceExecutor.protocolVersion 与 device WS challenge 帧的修订号(<修订号> → 它加进结局码闭集的词;零加词的语义修订 → 变更名)";
3587
3716
  readonly members: {
3588
3717
  1: {
3589
3718
  attr: string;
@@ -3601,6 +3730,10 @@ export declare const SELF_MINTED_WIRE: {
3601
3730
  attr: string;
3602
3731
  since: string;
3603
3732
  };
3733
+ 5: {
3734
+ attr: string;
3735
+ since: string;
3736
+ };
3604
3737
  };
3605
3738
  };
3606
3739
  /**