@sema-agent/server 7.148.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 (360) hide show
  1. package/MIGRATION.md +551 -9
  2. package/README.md +17 -2
  3. package/README.zh-CN.md +5 -1
  4. package/USAGE.md +126 -68
  5. package/dist/adoption/wire.d.ts +3 -3
  6. package/dist/approval-card.d.ts +33 -33
  7. package/dist/approval-gate-currency.d.ts +1 -1
  8. package/dist/approval-leg-origin.d.ts +33 -0
  9. package/dist/approval-leg-origin.js +4 -0
  10. package/dist/audit.d.ts +1 -1
  11. package/dist/audit.js +2 -2
  12. package/dist/auth-bridge.d.ts +9 -1
  13. package/dist/auth-bridge.js +4 -4
  14. package/dist/auth-keys.d.ts +10 -1
  15. package/dist/auth-keys.js +8 -0
  16. package/dist/background-session-reap.d.ts +1 -1
  17. package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
  18. package/dist/boot/deferred-sandbox-path-env.js +1 -2
  19. package/dist/boot/execution-env.js +10 -11
  20. package/dist/boot/execution-lane.d.ts +6 -4
  21. package/dist/boot/execution-lane.js +3 -1
  22. package/dist/boot/org-delivery.d.ts +3 -2
  23. package/dist/boot/parked-revive-gate.d.ts +5 -5
  24. package/dist/boot/parked-revive-gate.js +2 -3
  25. package/dist/boot/resolve-spec.d.ts +4 -5
  26. package/dist/boot/resolve-spec.js +66 -28
  27. package/dist/boot/retention-lane.d.ts +1 -1
  28. package/dist/boot/runner-deps.js +3 -1
  29. package/dist/boot/session-faces.js +21 -21
  30. package/dist/boot/stage-01-config.d.ts +1 -0
  31. package/dist/boot/stage-01-config.js +4 -3
  32. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  33. package/dist/boot/stage-02-web-admin-pull.js +10 -2
  34. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  35. package/dist/boot/stage-03-store-backend.js +4 -4
  36. package/dist/boot/stage-04-stores.d.ts +1 -0
  37. package/dist/boot/stage-05-execution-env.d.ts +1 -0
  38. package/dist/boot/stage-06-runners.d.ts +2 -1
  39. package/dist/boot/stage-06-runners.js +1 -2
  40. package/dist/boot/stage-07-capability-layer.d.ts +2 -1
  41. package/dist/boot/stage-07-capability-layer.js +1 -1
  42. package/dist/boot/stage-08-reapers.d.ts +2 -1
  43. package/dist/boot/stage-09-leader.d.ts +2 -1
  44. package/dist/boot/stage-10-http-server.d.ts +35 -2
  45. package/dist/boot/stage-10-http-server.js +9 -4
  46. package/dist/boot/stores.d.ts +3 -0
  47. package/dist/boot/stores.js +22 -19
  48. package/dist/boot/web-admin.d.ts +1 -1
  49. package/dist/capabilities/tool-defer.d.ts +1 -1
  50. package/dist/capability-facts.d.ts +70 -60
  51. package/dist/capability-facts.js +45 -49
  52. package/dist/card-settle-stored-scope.d.ts +56 -0
  53. package/dist/card-settle-stored-scope.js +27 -0
  54. package/dist/card-void.d.ts +7 -12
  55. package/dist/card-void.js +2 -7
  56. package/dist/config-catalog.d.ts +12 -0
  57. package/dist/config-catalog.js +37 -33
  58. package/dist/config-invariants.d.ts +5 -4
  59. package/dist/config-invariants.js +4 -4
  60. package/dist/config-types.d.ts +49 -16
  61. package/dist/config.d.ts +6 -5
  62. package/dist/config.js +35 -24
  63. package/dist/context-window-notice.d.ts +31 -0
  64. package/dist/context-window-notice.js +28 -0
  65. package/dist/deployment-governance.d.ts +7 -28
  66. package/dist/deployment-governance.js +1 -14
  67. package/dist/deployment-shape.d.ts +20 -11
  68. package/dist/deployment-shape.js +1 -0
  69. package/dist/device-ws-hub.d.ts +1 -0
  70. package/dist/device-ws-hub.js +64 -28
  71. package/dist/device-ws-protocol.d.ts +20 -6
  72. package/dist/device-ws-protocol.js +9 -2
  73. package/dist/engine-identity.d.ts +7 -1
  74. package/dist/engine-identity.js +5 -0
  75. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  76. package/dist/env-name-allowlist-knobs.js +5 -0
  77. package/dist/execution-lane-caps.d.ts +20 -5
  78. package/dist/execution-lane-caps.js +18 -4
  79. package/dist/field-conflict.d.ts +2 -2
  80. package/dist/fleet/engine-signal.d.ts +14 -1
  81. package/dist/fleet/engine-signal.js +5 -1
  82. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  83. package/dist/fleet/serving-lease.d.ts +18 -3
  84. package/dist/fleet/serving-lease.js +81 -35
  85. package/dist/fleet-client.d.ts +13 -11
  86. package/dist/fleet-client.js +53 -33
  87. package/dist/history-anchor.js +1 -1
  88. package/dist/hitl-delivery.d.ts +1 -3
  89. package/dist/hitl-delivery.js +1 -1
  90. package/dist/hooks/command-spawn.d.ts +7 -2
  91. package/dist/hooks/command-spawn.js +13 -6
  92. package/dist/hooks/hook-runner.d.ts +5 -0
  93. package/dist/hooks/hook-runner.js +11 -7
  94. package/dist/http/active-run-conflict.d.ts +3 -7
  95. package/dist/http/active-run-conflict.js +2 -2
  96. package/dist/http/admission.js +5 -5
  97. package/dist/http/approval-sweeps.js +5 -3
  98. package/dist/http/caller-trust.d.ts +2 -2
  99. package/dist/http/caller-trust.js +3 -3
  100. package/dist/http/checkpoint-ctx.d.ts +18 -63
  101. package/dist/http/checkpoint-ctx.js +1 -24
  102. package/dist/http/claim-heartbeat.d.ts +6 -6
  103. package/dist/http/claim-heartbeat.js +6 -6
  104. package/dist/http/claimed-run.d.ts +16 -9
  105. package/dist/http/claimed-run.js +8 -0
  106. package/dist/http/dispatch.js +7 -5
  107. package/dist/http/durable-run-leg.d.ts +8 -1
  108. package/dist/http/durable-run-leg.js +34 -15
  109. package/dist/http/execution-context.d.ts +115 -14
  110. package/dist/http/execution-context.js +130 -40
  111. package/dist/http/owner-access.d.ts +246 -21
  112. package/dist/http/owner-access.js +186 -8
  113. package/dist/http/principal-gate.d.ts +18 -11
  114. package/dist/http/principal-gate.js +3 -1
  115. package/dist/http/readiness.d.ts +4 -2
  116. package/dist/http/resume-ctx-read.d.ts +14 -3
  117. package/dist/http/resume-ctx-read.js +24 -3
  118. package/dist/http/resume-legs.d.ts +35 -3
  119. package/dist/http/resume-legs.js +262 -106
  120. package/dist/http/route-ctx.d.ts +29 -11
  121. package/dist/http/routes/a2a-serve.js +17 -14
  122. package/dist/http/routes/approvals-assistant.d.ts +3 -2
  123. package/dist/http/routes/approvals-assistant.js +11 -11
  124. package/dist/http/routes/capabilities.js +5 -4
  125. package/dist/http/routes/config-catalog.d.ts +1 -1
  126. package/dist/http/routes/diagnostics.d.ts +3 -1
  127. package/dist/http/routes/diagnostics.js +30 -5
  128. package/dist/http/routes/mcp-reconnect.js +2 -2
  129. package/dist/http/routes/memory-origin.d.ts +1 -1
  130. package/dist/http/routes/notify-wake.js +2 -3
  131. package/dist/http/routes/principal-inbox.d.ts +3 -1
  132. package/dist/http/routes/principal-inbox.js +3 -2
  133. package/dist/http/routes/projects.d.ts +1 -0
  134. package/dist/http/routes/projects.js +5 -3
  135. package/dist/http/routes/retention-ops.d.ts +1 -1
  136. package/dist/http/routes/run-permission-mode.d.ts +1 -1
  137. package/dist/http/routes/run-permission-mode.js +2 -2
  138. package/dist/http/routes/runs.d.ts +1 -1
  139. package/dist/http/routes/runs.js +33 -37
  140. package/dist/http/routes/session-memory-sync.js +4 -5
  141. package/dist/http/routes/session-sync.d.ts +24 -5
  142. package/dist/http/routes/session-sync.js +45 -37
  143. package/dist/http/routes/sessions-list.d.ts +1 -1
  144. package/dist/http/routes/sessions.d.ts +1 -1
  145. package/dist/http/routes/sessions.js +18 -44
  146. package/dist/http/routes/tasks.js +136 -101
  147. package/dist/http/routes/trace-usage.js +14 -14
  148. package/dist/http/routes/workflows.d.ts +1 -0
  149. package/dist/http/routes/workflows.js +20 -38
  150. package/dist/http/server.d.ts +12 -9
  151. package/dist/http/server.js +35 -6
  152. package/dist/http/stored-body-replay.d.ts +3 -24
  153. package/dist/http/stored-body-replay.js +2 -12
  154. package/dist/http/submit-ctx.d.ts +2 -2
  155. package/dist/http/submit-ctx.js +5 -5
  156. package/dist/http/submit-replay.d.ts +15 -2
  157. package/dist/http/submit-replay.js +10 -4
  158. package/dist/http/wire-types.d.ts +6 -3
  159. package/dist/index.d.ts +3 -1
  160. package/dist/index.js +1 -0
  161. package/dist/leader/endpoint.js +9 -8
  162. package/dist/leg-facts.d.ts +13 -2
  163. package/dist/leg-facts.js +2 -0
  164. package/dist/local-store-declaration.d.ts +54 -0
  165. package/dist/local-store-declaration.js +59 -0
  166. package/dist/mcp-assertion-header.d.ts +1 -1
  167. package/dist/mcp-assertion-header.js +1 -1
  168. package/dist/mcp-authorization-face.d.ts +18 -14
  169. package/dist/mcp-authorization-face.js +3 -2
  170. package/dist/memory-project-layer.js +1 -1
  171. package/dist/memory-scope.d.ts +4 -4
  172. package/dist/memory-scope.js +4 -4
  173. package/dist/memory-store-refusal.d.ts +1 -1
  174. package/dist/memory-sync-client.js +2 -2
  175. package/dist/model-context-window.d.ts +50 -11
  176. package/dist/model-context-window.js +20 -1
  177. package/dist/model-entry-refusal.d.ts +5 -4
  178. package/dist/model-entry-refusal.js +17 -3
  179. package/dist/model-reach-scope.d.ts +2 -1
  180. package/dist/observability/corrupt-read-seat.d.ts +1 -1
  181. package/dist/observability/fail-open.d.ts +19 -7
  182. package/dist/observability/fail-open.js +19 -7
  183. package/dist/observability/logger.d.ts +7 -0
  184. package/dist/observability/logger.js +3 -1
  185. package/dist/observability/metrics.js +1 -1
  186. package/dist/observability/run-terminal.d.ts +1 -1
  187. package/dist/observability/run-terminal.js +1 -0
  188. package/dist/observability/secret-env-scrub.d.ts +1 -1
  189. package/dist/observability/secret-env-scrub.js +1 -1
  190. package/dist/org-delivery-gate.d.ts +31 -6
  191. package/dist/org-delivery-gate.js +7 -4
  192. package/dist/owner-faces.d.ts +30 -5
  193. package/dist/owner-faces.js +2 -0
  194. package/dist/park-row-commit.d.ts +67 -0
  195. package/dist/park-row-commit.js +76 -0
  196. package/dist/parked-decide.d.ts +9 -7
  197. package/dist/parked-decide.js +25 -6
  198. package/dist/peer-directory.d.ts +1 -1
  199. package/dist/peer-seat.d.ts +1 -1
  200. package/dist/peer-seat.js +52 -59
  201. package/dist/plugins/adoption-log-sql.d.ts +3 -3
  202. package/dist/plugins/adoption-log-sql.js +19 -19
  203. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  204. package/dist/plugins/approval-ask-store-sql.js +3 -5
  205. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  206. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  207. package/dist/plugins/approval-exemption-skill-m46.d.ts +0 -6
  208. package/dist/plugins/approval-exemption-skill-m46.js +6 -10
  209. package/dist/plugins/approval-exemption-store.d.ts +26 -1
  210. package/dist/plugins/approval-exemption-store.js +28 -19
  211. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -3
  212. package/dist/plugins/ensure-schema-lock-policy.js +75 -9
  213. package/dist/plugins/exec-path-law.d.ts +34 -0
  214. package/dist/plugins/exec-path-law.js +13 -0
  215. package/dist/plugins/file-run-store.d.ts +22 -9
  216. package/dist/plugins/file-run-store.js +51 -23
  217. package/dist/plugins/local-checkpoint-store.d.ts +8 -1
  218. package/dist/plugins/local-checkpoint-store.js +5 -1
  219. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  220. package/dist/plugins/local-data-root-admission.js +100 -0
  221. package/dist/plugins/local-engine-high-water.d.ts +28 -7
  222. package/dist/plugins/local-engine-high-water.js +27 -22
  223. package/dist/plugins/local-session-store.d.ts +134 -49
  224. package/dist/plugins/local-session-store.js +149 -108
  225. package/dist/plugins/memory-run-store.d.ts +14 -9
  226. package/dist/plugins/memory-run-store.js +48 -22
  227. package/dist/plugins/one-time-migration-marker.d.ts +19 -3
  228. package/dist/plugins/one-time-migration-marker.js +7 -1
  229. package/dist/plugins/one-time-migrations.d.ts +110 -59
  230. package/dist/plugins/one-time-migrations.js +224 -136
  231. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  232. package/dist/plugins/org-delivery-quota-store.js +29 -14
  233. package/dist/plugins/permission-rule-store-sql.d.ts +1 -1
  234. package/dist/plugins/permission-rule-store-sql.js +5 -9
  235. package/dist/plugins/pg-pool.d.ts +1 -1
  236. package/dist/plugins/pg-pool.js +14 -12
  237. package/dist/plugins/posix-shell-fs.js +4 -2
  238. package/dist/plugins/remote-env-adb.js +3 -2
  239. package/dist/plugins/remote-env-device.d.ts +3 -2
  240. package/dist/plugins/remote-env-device.js +8 -6
  241. package/dist/plugins/remote-env-e2b.d.ts +4 -8
  242. package/dist/plugins/remote-env-e2b.js +21 -15
  243. package/dist/plugins/remote-env-host.d.ts +51 -10
  244. package/dist/plugins/remote-env-host.js +97 -31
  245. package/dist/plugins/remote-env-k8s.js +7 -4
  246. package/dist/plugins/remote-env-local-docker.d.ts +6 -3
  247. package/dist/plugins/remote-env-local-docker.js +11 -25
  248. package/dist/plugins/remote-env-ssh.js +4 -3
  249. package/dist/plugins/remote-shell.d.ts +3 -1
  250. package/dist/plugins/remote-shell.js +3 -3
  251. package/dist/plugins/replica-registration.d.ts +35 -0
  252. package/dist/plugins/replica-registration.js +48 -0
  253. package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
  254. package/dist/plugins/run-store-sql.d.ts +27 -8
  255. package/dist/plugins/run-store-sql.js +46 -18
  256. package/dist/plugins/scenario-prefix-switch-m42.d.ts +8 -12
  257. package/dist/plugins/scenario-prefix-switch-m42.js +9 -6
  258. package/dist/plugins/schema-consistency.d.ts +91 -5
  259. package/dist/plugins/schema-consistency.js +189 -7
  260. package/dist/plugins/schema-drift-sentence.d.ts +6 -5
  261. package/dist/plugins/schema-drift-sentence.js +13 -5
  262. package/dist/plugins/serving-requirement.d.ts +49 -0
  263. package/dist/plugins/serving-requirement.js +53 -0
  264. package/dist/plugins/session-placement.d.ts +5 -4
  265. package/dist/plugins/shell-sentinel-owner-m48.d.ts +22 -0
  266. package/dist/plugins/shell-sentinel-owner-m48.js +6 -0
  267. package/dist/plugins/stop-then-start-sentence.d.ts +55 -0
  268. package/dist/plugins/stop-then-start-sentence.js +51 -0
  269. package/dist/plugins/store-backend.d.ts +23 -9
  270. package/dist/plugins/store-backend.js +58 -24
  271. package/dist/plugins/store-contracts.d.ts +45 -5
  272. package/dist/plugins/store-contracts.js +19 -0
  273. package/dist/plugins/tidb-pool.d.ts +11 -6
  274. package/dist/plugins/tidb-pool.js +22 -12
  275. package/dist/plugins/workspace-custody.d.ts +44 -0
  276. package/dist/plugins/workspace-custody.js +47 -0
  277. package/dist/process-instance.d.ts +3 -0
  278. package/dist/process-instance.js +7 -0
  279. package/dist/project-context.d.ts +66 -0
  280. package/dist/project-context.js +70 -0
  281. package/dist/project-identity.d.ts +8 -7
  282. package/dist/project-identity.js +40 -17
  283. package/dist/project-layer-key.d.ts +13 -2
  284. package/dist/project-layer-key.js +9 -1
  285. package/dist/question.d.ts +9 -21
  286. package/dist/question.js +28 -19
  287. package/dist/read-deny-floor-notice.d.ts +36 -0
  288. package/dist/read-deny-floor-notice.js +40 -0
  289. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  290. package/dist/request-declaration-disposition.js +39 -0
  291. package/dist/run-cancel-card.d.ts +28 -0
  292. package/dist/run-cancel-card.js +20 -0
  293. package/dist/run-cancel-context.d.ts +10 -0
  294. package/dist/run-cancel-context.js +1 -0
  295. package/dist/run-local.js +28 -13
  296. package/dist/runs.d.ts +31 -7
  297. package/dist/runs.js +34 -16
  298. package/dist/security.d.ts +3 -3
  299. package/dist/server-secret-env.d.ts +34 -20
  300. package/dist/server-secret-env.js +61 -18
  301. package/dist/session-agent.d.ts +4 -12
  302. package/dist/session-agent.js +0 -6
  303. package/dist/session-children-retire.d.ts +6 -3
  304. package/dist/session-children-retire.js +2 -5
  305. package/dist/session-incarnation.d.ts +18 -4
  306. package/dist/session-incarnation.js +4 -1
  307. package/dist/session-notify-door.d.ts +4 -4
  308. package/dist/session-notify-door.js +5 -6
  309. package/dist/session-rules-seat.d.ts +4 -3
  310. package/dist/session-rules-seat.js +3 -11
  311. package/dist/session-sync.js +3 -3
  312. package/dist/session-workspace.d.ts +3 -3
  313. package/dist/store-admission.d.ts +33 -0
  314. package/dist/store-admission.js +49 -0
  315. package/dist/store-posture.d.ts +5 -0
  316. package/dist/store-posture.js +18 -1
  317. package/dist/stores-sql/checkpoint-store-sql.d.ts +22 -3
  318. package/dist/stores-sql/checkpoint-store-sql.js +109 -23
  319. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  320. package/dist/stores-sql/file-history-store-sql.js +3 -5
  321. package/dist/stores-sql/retention-store-sql.d.ts +1 -1
  322. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  323. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  324. package/dist/task-a2a.d.ts +3 -8
  325. package/dist/task-a2a.js +25 -27
  326. package/dist/task-cwd.d.ts +27 -10
  327. package/dist/task-cwd.js +3 -0
  328. package/dist/task-mcp.d.ts +3 -3
  329. package/dist/task-mcp.js +1 -1
  330. package/dist/task-settings.d.ts +13 -0
  331. package/dist/task-settings.js +14 -7
  332. package/dist/terminal.d.ts +2 -0
  333. package/dist/terminal.js +21 -6
  334. package/dist/tool-approval.d.ts +50 -41
  335. package/dist/tool-approval.js +96 -73
  336. package/dist/trace/engine-notice-wire.d.ts +38 -21
  337. package/dist/trace/engine-notice-wire.js +25 -4
  338. package/dist/trace/ledger-sink.d.ts +3 -1
  339. package/dist/trace/project.d.ts +8 -5
  340. package/dist/trace/project.js +11 -9
  341. package/dist/trace/projection-table.d.ts +33 -2
  342. package/dist/trace/redact.d.ts +12 -0
  343. package/dist/trace/redact.js +5 -1
  344. package/dist/trace/self-minted-wire.d.ts +268 -56
  345. package/dist/trace/self-minted-wire.js +110 -40
  346. package/dist/trace/tool-card.d.ts +3 -0
  347. package/dist/trace/tool-card.js +24 -0
  348. package/dist/trace/tool-output-media.d.ts +2 -1
  349. package/dist/unattended-permission-mode.d.ts +1 -1
  350. package/dist/web-admin-client/apply-effective.d.ts +1 -1
  351. package/dist/web-admin-client/apply-effective.js +22 -9
  352. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  353. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  354. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -29
  355. package/docs/error-text-lexicon.json +317 -0
  356. package/package.json +4 -2
  357. package/scripts/embed-minimal.mjs +183 -0
  358. package/wire-changes/server@7.149.0.json +372 -0
  359. package/wire-changes/server@7.150.0.json +335 -0
  360. package/dist/plain-string-record.js +0 -70
@@ -36,15 +36,18 @@ export const SELF_MINTED_WIRE = {
36
36
  stall_verdict: { attr: "-", since: "7.148.0" },
37
37
  },
38
38
  },
39
+ runResultSideKey: {
40
+ at: "run 结果顶层侧记键(GET /v1/runs/:id → result · done.result · POST /v1/tasks 200 体顶层 · 账本 done 行 result;<键> → 在场律)",
41
+ members: {
42
+ readDenyFloor: { attr: "present-iff the run went ahead while its read-deny rules are not byte-enforced (rows, an execution environment that does not keep the floor, READ_DENY_FLOOR_REQUIRED unset); { code, message } equals that run's engine_notice frame", since: "7.149.0" },
43
+ },
44
+ },
39
45
  runStallVerdictFace: {
40
46
  at: "run 流死亡终帧键 · 会话占用冲突体键",
41
47
  members: {
42
48
  "GET /v1/runs/:id/events#failed.errorCode(死亡判决的终帧从行合成时恒在场 = 行上的码 run.stalled / run.orphaned;本连接已投账本终帧则不合成)": { attr: "verdict", since: "7.148.0" },
43
49
  },
44
- retired: {
45
- "409 conflict.session_active_run#stale(只为 true 时在场)": { attr: "true-only", since: "7.37.0", until: "7.148.0" },
46
- "POST /v1/tasks/stream done.result(conflict.session_active_run)#stale(只为 true 时在场)": { attr: "true-only", since: "7.37.0", until: "7.148.0" },
47
- },
50
+ retired: {},
48
51
  },
49
52
  sessionMemoryEraseStatus: {
50
53
  at: "POST /v1/sessions/:id/memory/erase(已分类拒 errorCode → HTTP 状态)",
@@ -57,7 +60,7 @@ export const SELF_MINTED_WIRE = {
57
60
  "memory.erasure_selector_mismatch": { attr: 409, since: "7.108.0" },
58
61
  "memory.erasure_census_incomplete": { attr: 409, since: "7.108.0" },
59
62
  "internal.memory_control_plane_corrupt": { attr: 500, since: "7.108.0" },
60
- "request.memory_layer": { attr: 400, revises: ["errorCode:internal.error"], since: "7.148.0" },
63
+ "request.memory_layer": { attr: 400, since: "7.148.0" },
61
64
  },
62
65
  },
63
66
  askTerminalReason: {
@@ -284,6 +287,31 @@ export const SELF_MINTED_WIRE = {
284
287
  waiting: { attr: "always within sandboxCapacity", since: "7.148.0" },
285
288
  },
286
289
  },
290
+ listeningLineKey: {
291
+ at: "stdout 启动协议行 listening(<键> → 在场律)",
292
+ members: {
293
+ port: { attr: "always", since: "1.214.2" },
294
+ bindHost: { attr: "always", since: "1.306.0" },
295
+ bindHostNote: { attr: "present-iff BIND_HOST unset and the bind was narrowed to loopback (unauthenticated write face)", since: "3.15.0" },
296
+ boundAddress: { attr: "always", since: "7.150.0" },
297
+ model: { attr: "always", since: "1.214.2" },
298
+ brain: { attr: "always", since: "1.214.2" },
299
+ breakerState: { attr: "always", since: "1.214.2" },
300
+ session: { attr: "always", since: "1.214.2" },
301
+ memory: { attr: "always", since: "1.214.2" },
302
+ instanceId: { attr: "always", since: "1.214.2" },
303
+ rateLimitPerMin: { attr: "always", since: "1.214.2" },
304
+ rateLimit: { attr: "always", since: "1.214.2" },
305
+ maxPrincipalCostUsd: { attr: "always", since: "1.214.2" },
306
+ costQuota: { attr: "always", since: "1.214.2" },
307
+ toolResultStore: { attr: "always", since: "1.214.2" },
308
+ otel: { attr: "always", since: "1.214.2" },
309
+ perModelKeys: { attr: "always", since: "1.214.2" },
310
+ sealedModelKeys: { attr: "always", since: "1.214.2" },
311
+ sealedPoisonedModels: { attr: "always", since: "1.214.2" },
312
+ workflowRunStore: { attr: "always", since: "1.214.2" },
313
+ },
314
+ },
287
315
  healthStoreKey: {
288
316
  at: "GET /health store",
289
317
  members: {
@@ -370,6 +398,14 @@ export const SELF_MINTED_WIRE = {
370
398
  supportsThinkingOff: { attr: "always", since: "7.138.0" },
371
399
  thinkingLevelMap: { attr: "present-iff declared", since: "7.147.0" },
372
400
  defaultThinking: { attr: "present-iff declared", since: "7.148.0" },
401
+ contextWindowSource: { attr: "present-iff contextWindow is present", since: "7.149.0" },
402
+ },
403
+ },
404
+ modelsContextWindowSource: {
405
+ at: "GET /v1/models models[].contextWindowSource(present-iff contextWindow)",
406
+ members: {
407
+ declared: { attr: "-", since: "7.149.0" },
408
+ assumed: { attr: "-", since: "7.149.0" },
373
409
  },
374
410
  },
375
411
  modelsRowAnthropicCompatKey: {
@@ -410,6 +446,7 @@ export const SELF_MINTED_WIRE = {
410
446
  registeredBy: { attr: "always", since: "7.147.0" },
411
447
  registeredAt: { attr: "always", since: "7.147.0" },
412
448
  archivedAt: { attr: "present-iff archived", since: "7.147.0" },
449
+ contentAttestedAt: { attr: "present-iff the registration carries the configuration center's content attestation (settings-schema 25.1.0; the time the center's write path last admitted the project's goal / notes / contextItems under the publisher role)", since: "7.150.0" },
413
450
  },
414
451
  },
415
452
  projectsListBodyKey: {
@@ -470,8 +507,19 @@ export const SELF_MINTED_WIRE = {
470
507
  at: "MCP 授权记录 authorization 的出现面(<面>#<键> → 在场律)",
471
508
  members: {
472
509
  "wiring_manifest.mcp[]#authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
510
+ "GET /v1/sessions/:id/mcp#lastLegMcp.mcp[].authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
511
+ "GET /v1/capabilities/mcp#servers[].authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
512
+ "POST /v1/capabilities/mcp/probe#servers[].authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
473
513
  "POST /v1/sessions/:id/mcp/reconnect#status.authorization": { attr: "present-iff errorCode unauthorized", since: "7.138.0" },
474
514
  "GET /v1/sessions/:id/mcp#servers[].authorization": { attr: "present-iff server unauthorized (this face carries no errorCode)", since: "7.138.0" },
515
+ "GET /v1/sessions/:id#messages[].details.authorization": { attr: "present-iff details.code unauthorized", since: "7.138.0" },
516
+ "SSE tool_end#structured.authorization": { attr: "present-iff structured.code unauthorized and reason in the closed set; members = reason", since: "7.138.0" },
517
+ "GET /v1/runs/:id/events#tool_end.structured.authorization": { attr: "present-iff structured.code unauthorized and reason in the closed set; members = reason", since: "7.138.0" },
518
+ },
519
+ retired: {
520
+ "GET /v1/sessions/:id#messages[].details.authorization.resourceMetadataUrl": { attr: "remote-claimed URL from the endpoint's challenge (deep-scrubbed text)", since: "7.138.0", until: "7.150.0" },
521
+ "SSE tool_end#structured.authorization(reason 以外的成员)": { attr: "card members passed through the text redactor (resourceMetadataUrl, a custom card's own members)", since: "7.138.0", until: "7.150.0" },
522
+ "GET /v1/runs/:id/events#tool_end.structured.authorization(reason 以外的成员)": { attr: "card members passed through the text redactor (resourceMetadataUrl, a custom card's own members)", since: "7.138.0", until: "7.150.0" },
475
523
  },
476
524
  },
477
525
  wiringModProvenance: {
@@ -491,22 +539,22 @@ export const SELF_MINTED_WIRE = {
491
539
  fieldConflictReason: {
492
540
  at: "400 / 409 / 422 request.field_conflict reason",
493
541
  members: {
494
- cascade_verify: { attr: "-", revises: ["selfMinted.fieldConflictKind:cascade_verify"], since: "7.148.0" },
495
- image_profile: { attr: "-", revises: ["selfMinted.fieldConflictKind:image_profile"], since: "7.148.0" },
496
- resume_anchor: { attr: "-", revises: ["selfMinted.fieldConflictKind:resume_anchor"], since: "7.148.0" },
497
- system_prompt_fold: { attr: "-", revises: ["selfMinted.fieldConflictKind:system_prompt_fold"], since: "7.148.0" },
498
- file_history_restore: { attr: "-", revises: ["selfMinted.fieldConflictKind:file_history_restore"], since: "7.148.0" },
499
- skills_disabled: { attr: "-", revises: ["selfMinted.fieldConflictKind:skills_disabled"], since: "7.148.0" },
500
- existing_session: { attr: "-", revises: ["selfMinted.fieldConflictKind:existing_session"], since: "7.148.0" },
501
- fork_target: { attr: "-", revises: ["selfMinted.fieldConflictKind:fork_target"], since: "7.148.0" },
502
- scratchpad_root: { attr: "-", revises: ["selfMinted.fieldConflictKind:scratchpad_root"], since: "7.148.0" },
503
- ask_answer: { attr: "-", revises: ["selfMinted.fieldConflictKind:ask_answer"], since: "7.148.0" },
504
- policy_person_ask: { attr: "-", revises: ["selfMinted.fieldConflictKind:policy_person_ask"], since: "7.148.0" },
505
- plan_edit: { attr: "-", revises: ["selfMinted.fieldConflictKind:plan_edit"], since: "7.148.0" },
506
- plan_mode_after: { attr: "-", revises: ["selfMinted.fieldConflictKind:plan_mode_after"], since: "7.148.0" },
507
- bound_call_door: { attr: "-", revises: ["selfMinted.fieldConflictKind:bound_call_door"], since: "7.148.0" },
508
- remember_decision: { attr: "-", revises: ["selfMinted.fieldConflictKind:remember_decision"], since: "7.148.0" },
509
- approval_feedback: { attr: "-", revises: ["selfMinted.fieldConflictKind:approval_feedback"], since: "7.148.0" },
542
+ cascade_verify: { attr: "-", since: "7.148.0" },
543
+ image_profile: { attr: "-", since: "7.148.0" },
544
+ resume_anchor: { attr: "-", since: "7.148.0" },
545
+ system_prompt_fold: { attr: "fields in fold order from appendSystemPrompt / projectId (the inherited project brief) / settings.outputStyle; count / cap", since: "7.150.0" },
546
+ file_history_restore: { attr: "-", since: "7.148.0" },
547
+ skills_disabled: { attr: "-", since: "7.148.0" },
548
+ existing_session: { attr: "-", since: "7.148.0" },
549
+ fork_target: { attr: "-", since: "7.148.0" },
550
+ scratchpad_root: { attr: "fields = cwd (sent) or projectId (inherited from the project), then scratchpadDir when the request's own covers it", since: "7.150.0" },
551
+ ask_answer: { attr: "-", since: "7.148.0" },
552
+ policy_person_ask: { attr: "-", since: "7.148.0" },
553
+ plan_edit: { attr: "-", since: "7.148.0" },
554
+ plan_mode_after: { attr: "-", since: "7.148.0" },
555
+ bound_call_door: { attr: "-", since: "7.148.0" },
556
+ remember_decision: { attr: "-", since: "7.148.0" },
557
+ approval_feedback: { attr: "-", since: "7.148.0" },
510
558
  },
511
559
  },
512
560
  hooksRefusalReason: {
@@ -606,7 +654,7 @@ export const SELF_MINTED_WIRE = {
606
654
  "POST /v1/runs|/v1/tasks Idempotency-Key#conflict.run_exists": { attr: 409, since: "7.125.0" },
607
655
  "POST /v1/runs|/v1/tasks Idempotency-Key#conflict.idempotency_payload_mismatch": { attr: 409, since: "7.126.0" },
608
656
  "POST /v1/tasks|/v1/tasks/stream#replay_first_answer_envelope(同键重放的体 = 首答的信封 + replay: true:终局 = 引擎结果(result 是串),停驻 = 结果 + 回执三键,行还在跑 = 回执三键;流式腿放进 done.result)": { attr: 200, since: "7.142.0" },
609
- "POST /v1/tasks|/v1/tasks/stream#replay_bit_one_rule(replay: true ⇔ 200 结局不是本次请求产出的:读行重放 + 在飞合流的跟随方,两腿同读;拒绝永不带位;流式终帧 done.replay = done.result.replay)": { attr: 200, revises: ["selfMinted.submitIdempotency:POST /v1/tasks#replay"], since: "7.148.0" },
657
+ "POST /v1/tasks|/v1/tasks/stream#replay_bit_one_rule(replay: true ⇔ 200 结局不是本次请求产出的:读行重放 + 在飞合流的跟随方,两腿同读;拒绝永不带位;流式终帧 done.replay = done.result.replay)": { attr: 200, since: "7.148.0" },
610
658
  },
611
659
  },
612
660
  leaderStopFace: {
@@ -806,6 +854,13 @@ export const SELF_MINTED_WIRE = {
806
854
  thrownName: { attr: "present-iff the engine named what its row judge saw thrown (non-empty string)", since: "7.144.0" },
807
855
  },
808
856
  },
857
+ rowRefusalWayOut: {
858
+ at: "409 决断类续跑拒体(/decide · /plan_review · /resume;判官判那张卡续不了)wayOut",
859
+ members: {
860
+ cancel_run: { attr: "-", since: "7.149.0" },
861
+ newer_worker: { attr: "-", since: "7.149.0" },
862
+ },
863
+ },
809
864
  permissionModeVerbBodyKey: {
810
865
  at: "POST /v1/runs/:id/permission-mode 200 体(<键> → 在场律)",
811
866
  members: {
@@ -928,13 +983,26 @@ export const SELF_MINTED_WIRE = {
928
983
  "POST /v1/tasks|/v1/tasks/stream|/v1/runs#settings.env 有成员不是帽内的串(新提交;只在采纳 env 的车道上:单用户 host / device,或采纳请求体 hooks 且请求带着 hooks;零 run;体 request.field_invalid + field settings.env,句子点名坐标、不回显值)": { attr: 400, since: "7.147.0" },
929
984
  "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#stored_unread_members(续跑将要跑的那一份体 —— 存量体,重述键在场时盖过重述之后 —— 里有本版读者读不出、而本部署本会采纳的成员:settings.hooks / settings.env / 其余 settings 延后键 / mcpServers[i].transport / a2aPeers[i].headers;认领之前,卡仍待决;体 resume_blocked_by_policy + blockedBy request.field_invalid + field + retriable)": { attr: 409, since: "7.147.0" },
930
985
  "POST /v1/runs/:id/steer#stored_unread_members(run 已终态、铸唤醒卡之前;同一只判;不铸卡;体 resume_blocked_by_policy + blockedBy request.field_invalid + field,不带 retriable)": { attr: 409, since: "7.147.0" },
931
- "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review|/v1/runs/:id/steer|/v1/runs/:id/permission-mode#resume_context_read_failed(读这条会话的续跑上下文失败:库断连 / 拒连 / 超时、缺表 / 权限拒、认不出的库错;拒在任何状态改动之前,卡仍待决、终态 steer 不铸卡;体 state.resume_context_unreadable)": { attr: 503, revises: ["errorCode:conflict.resume_context_unavailable"], since: "7.148.0" },
986
+ "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review|/v1/runs/:id/steer|/v1/runs/:id/permission-mode#resume_context_read_failed(读这条会话的续跑上下文失败:库断连 / 拒连 / 超时、缺表 / 权限拒、认不出的库错;拒在任何状态改动之前,卡仍待决、终态 steer 不铸卡;体 state.resume_context_unreadable)": { attr: 503, since: "7.148.0" },
987
+ "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#resume_claim_store_fault(认领之前那一次执行席读、认领那一笔 —— markResuming / wake 现建行的 createRun —— 或认领之后提交执行放置那一次店往返失败:库断连 / 拒连 / 超时、缺表 / 权限拒、认不出的库错;认领之后那一形续跑认领的停驻行回到认领之前的停驻词、认领留着,wake 现建的行删掉;卡仍待决;体 state.resume_context_unreadable)": { attr: 503, since: "7.149.0" },
988
+ "POST /v1/runs/:id/cancel#parked_card_body_scope_differs(停驻 run 上的取消:这张卡行体里自带的属主格与店的属主格不一致 —— 取消只读店的属主格,结算这张卡、驱 run 终局;体 { taskId, status: failed, errorCode: cancelled, cancelRequested: false, note })": { attr: 202, since: "7.149.0" },
989
+ "POST /v1/runs/:id/cancel#parked_card_body_unreadable(停驻 run 上的取消:这张卡的行体读不成检查点 —— 取消只读店的列,结算这张卡、驱 run 终局;体同上)": { attr: 202, since: "7.149.0" },
932
990
  "POST /v1/approvals/:sessionId/decide#parked_agent_definition_unavailable(停驻赎回;行上的代理类型不在赎回面委派工具的名册里:逐请求 `agents` 定义 / 停驻后被撤的部署定义 / 名叫 fork 的定义;approve 与 deny 同答;认领回滚、委派工具零调用、卡仍待决;体 decide.agent_definition_unavailable + taskId + rollback)": { attr: 409, since: "7.148.0" },
933
- "POST /v1/runs/:id/interrupt#body_with_fields(体带任何顶层键 —— 含早先版本受理的 text;非对象体同答;判在查 run 之前:任何 run 状态、属主、存在与否同一只体;体 request.body_shape + unknownKeys(键全在此)+ unsupportedKeys(恒空))": { attr: 400, revises: ["selfMinted.endpointFaceStatus:POST /v1/runs/:id/interrupt#text_live(带 text 的体打在本副本在飞的 run 上 = 引擎 steer 档位 now;202 体 { taskId, status, delivery: queued-immediate, messageId, note })"], since: "7.148.0" },
934
- },
935
- retired: {
936
- "POST /v1/runs/:id/interrupt#text_live(带 text 的体打在本副本在飞的 run 上 = 引擎 steer 档位 now;202 体 { taskId, status, delivery: queued-immediate, messageId, note })": { attr: 202, since: "7.52.0", until: "7.148.0" },
937
- },
991
+ "POST /v1/tasks|/v1/tasks/stream|/v1/runs#run_claim_store_fault(新提交:认领之前那一次执行席读,或认领这一段 —— 建行认领 createRun、执行放置、续跑输入的写、起跑之前的认领复核 —— 有一次店往返没答出来:库断连 / 拒连 / 超时、缺表 / 权限拒、认不出的库错;本请求铸的行已删掉 —— 认领与幂等键随行去,同一个自带 taskId 重发即新提交 —— 什么都没起跑;认领之后的流式腿 = 流的终帧;已绑设备的会话上认领之后那一次执行席读同答;体 state.run_store_unavailable)": { attr: 503, since: "7.149.0" },
992
+ "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(续跑腿提交放行之后、交给引擎之前那一段 —— 排空 workflow 完成的序号基址现读与落账、通告口落账 —— 店往返没答出来;续跑认领的停驻行回到停驻、认领留着,wake 现建的行删掉;卡仍待决;体 state.resume_context_unreadable)": { attr: 503, since: "7.149.0" },
993
+ "POST /v1/approvals/:sessionId/decide#workflow_host_turn_claim_store_fault(workflow 决定在宿主会话上起的新一跑:建行认领 / 执行放置 / 续跑输入 / 决定落行 / 起跑之前的认领复核有一次店往返没答出来;决定落行那一笔在 wake 腿上同答;现建的行已删掉,子代的卡仍待决;体 state.resume_context_unreadable)": { attr: 503, since: "7.149.0" },
994
+ "POST /v1/approvals/:sessionId/decide#workflow_decision_not_recorded(workflow 决定的投递那一跑在决定落行那一拍已不持宿主会话的认领 —— 心跳停满一窗被收割;决定没落、那一跑没起;与起跑之前认领复核答「没持有」同一只答复:认领在别的 run 上 ⇒ 409 conflict.session_active_run,宿主会话已删 ⇒ 404 resume.session_not_found,否则 409 conflict.claim_lost)": { attr: 409, since: "7.149.0" },
995
+ "POST /v1/approvals/:sessionId/decide#parked_redeem_placement_store_fault(停驻子代赎回:认领之前那一次执行席读,或认领之后那一次执行放置的店往返没答出来;认领没有或已回滚,子代仍停着、卡仍待决;体 decide.store_unreachable + taskId)": { attr: 503, since: "7.149.0" },
996
+ "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#placement_refused_after_claim(续跑家族、workflow 决定在宿主会话上起的新一跑、停驻子代赎回认领之后提交执行放置读出这条会话此刻不能在本处执行:已放在别的车道 / 写者在别处 / 设备拒;续跑认领的停驻行回到停驻、停驻赎回回滚,卡仍待决,wake 与宿主新一跑现建的行删掉;与认领之前同一只折法、同一只体;体 resume_blocked_by_policy + blockedBy 原码 + 原事实 forkPath / boundLane + retriable)": { attr: 409, since: "7.149.0" },
997
+ "POST /v1/tasks#park_commit_ended(同步腿停在要批的门上,而停驻提交答出这条 run 没有停住、已收场 —— 停驻写之前已按下取消 / 被失联收割 / 别处终结;卡已作废;体 = 收场那一行的信封,与同键重放同一只:终局行的结果,取消那一形 terminal.code cancelled;行上无结果 ⇒ 回执三键)": { attr: 200, since: "7.149.0" },
998
+ "POST /v1/approvals/:sessionId/decide|/v1/sessions/:id/wake|/v1/assistant/tasks/:id/resume|/v1/assistant/tasks/:id/plan_review#resume_park_ended(续跑腿再停 / 重开时停驻提交答出这条 run 已收场;卡已作废;体 status / errorCode = 收场那一行的,不带 retriable)": { attr: 200, since: "7.149.0" },
999
+ "POST /v1/runs/:id/interrupt#body_with_fields(体带任何顶层键 —— 含早先版本受理的 text;非对象体同答;判在查 run 之前:任何 run 状态、属主、存在与否同一只体;体 request.body_shape + unknownKeys(键全在此)+ unsupportedKeys(恒空))": { attr: 400, since: "7.148.0" },
1000
+ "GET /v1/tool-approvals/:id#row_unreadable(有行的问,按 id 读行那一拍店抛 / 超时;本副本自己铸的活卡与起服接管的登记同答;体 not_found.ask,与查无 / 不是你的逐字节同)": { attr: 404, since: "7.149.0" },
1001
+ "POST /v1/sessions/:id/sync/plan|POST /v1/sessions/:id/sync/import|PUT /v1/sessions/:id/sync/blobs/:hash#foreign_session_deleting(推送三口的门:id 上是别的主体正在删除的会话 —— 删除围栏已立、尚未删净;「被占着」读活行 ∪ 在删行,与对别人的活行同答;本人 / fleet 对自己在删的会话不变,拉取口仍只认活行;体 not_found.session,与对不存在 id 的拉取答复逐字节同)": { attr: 404, since: "7.149.0" },
1002
+ "POST /v1/sessions/:id/sync/import#idle_id_other_principal_in_flight(第一阶段:id 上还没有会话行,而另一个主体在这只 id 上的第一阶段正在飞;导入租约键 = 落点属主格 + 会话 id,空闲 id 上各占各的;体 = 第一阶段的暂存回执 stagingId;先提交者得,输的那一份在提交前复判答 404 not_found.session,与赢家的提交撞在同一刻时由店的属主 CAS 拒 409 conflict)": { attr: 200, since: "7.149.0" },
1003
+ "POST /v1/tasks|/v1/tasks/stream|/v1/runs#a2aPeers_headers_reserved_member(新提交;a2aPeers[i].headers 的成员名是 constructor / prototype —— 与 mcpServers[i].transport.headers / .env 同一张保留成员名表、同一只读法,大小写敏感;体 request.field_invalid + field 成员级路径 a2aPeers[i].headers.<名>;存盘续跑体里同形 ⇒ 续跑家族既有一面 #stored_unread_members 409)": { attr: 400, since: "7.149.0" },
1004
+ },
1005
+ retired: {},
938
1006
  },
939
1007
  ruleImportReceiptKey: {
940
1008
  at: "POST /v1/rules/cc-import/redeem 200 回执顶层键(<键> → 在场律;与 POST /v1/rules/local-import/redeem 同形)",
@@ -1003,17 +1071,18 @@ export const SELF_MINTED_WIRE = {
1003
1071
  ownerFaceAnswer: {
1004
1072
  at: "属主门的逐口答复(<口>#<调用方 × 行> → 状态 errorCode;其余各口的码与句逐字不变)",
1005
1073
  members: {
1006
- "POST /v1/tasks · /v1/tasks/stream · /v1/runs (sessionId)#others-owned-session": { attr: "404 resume.session_not_found (requireExistingSession: session does not exist (resume.session_not_found)), same body as a missing session; was 403 auth.forbidden (named caller) / 401 auth.unauthorized (no principal)", revises: ["errorCode:auth.forbidden", "errorCode:auth.unauthorized"], since: "7.148.0" },
1074
+ "POST /v1/tasks · /v1/tasks/stream · /v1/runs (sessionId)#others-owned-session": { attr: "404 resume.session_not_found (requireExistingSession: session does not exist (resume.session_not_found)), same body as a missing session; was 403 auth.forbidden (named caller) / 401 auth.unauthorized (no principal)", since: "7.148.0" },
1007
1075
  "POST /v1/tasks · /v1/tasks/stream · /v1/runs (sessionId)#ownerless-placed-session": { attr: "404 resume.session_not_found at the owner gate, same body as a missing session (assemblies without an execution seat too); not judged when the session's archive cannot be read", since: "7.148.0" },
1008
- "POST /v1/assistant/tasks/:id/plan_review#direct-door-valid-proof-others-task": { attr: "401 principal_unverified (principal proof required), same body as a missing row; was 404 not_found.run (task not found)", revises: ["errorCode:not_found.run"], since: "7.148.0" },
1009
- "GET|PUT /v1/sessions/:id/policy#ownerless-placed-session-non-fleet-non-operator": { attr: "404 not_found.session (session not found), same body as a missing session; was 409 conflict.session_ownerless", revises: ["errorCode:conflict.session_ownerless"], since: "7.148.0" },
1010
- "run / session read faces#deployment-service-credential-no-principal-users-rows": { attr: "200 on GET /v1/runs/:id · /v1/runs/:id/events · /v1/sessions/:id · /head · /events · /memory-status · /execution-placement (unless SERVICE_TOKEN_ACTS_FOR_DEPLOYMENT=false); was 404, or 401 auth.principal_required where a principal is required", revises: ["errorCode:auth.principal_required", "errorCode:not_found.run", "errorCode:not_found.session"], since: "7.148.0" },
1011
- "GET /v1/runs/:id · /v1/runs/:id/events#dev-open-principal-header-not-owner": { attr: "200 (the principal header is a label on a deployment without an identity boundary); was 404 not_found.run", revises: ["errorCode:not_found.run"], since: "7.148.0" },
1012
- "owner-only session ports#unreadable-archive-ownerless-session-fleet-or-operator": { attr: "answered as on a readable archive: background · background/stop · notify · mcp/reconnect · execution-placement · approval exemptions list / revoke (the gate skips the placement read only when both hypotheses admit the caller); was 500 corrupt_session", revises: ["errorCode:corrupt_session"], since: "7.148.0" },
1076
+ "POST /v1/assistant/tasks/:id/plan_review#direct-door-valid-proof-others-task": { attr: "401 principal_unverified (principal proof required), same body as a missing row; was 404 not_found.run (task not found)", since: "7.148.0" },
1077
+ "GET|PUT /v1/sessions/:id/policy#ownerless-placed-session-non-fleet-non-operator": { attr: "404 not_found.session (session not found), same body as a missing session; was 409 conflict.session_ownerless", since: "7.148.0" },
1078
+ "run / session read faces#deployment-service-credential-no-principal-users-rows": { attr: "200 on GET /v1/runs/:id · /v1/runs/:id/events · /v1/sessions/:id · /head · /events · /memory-status · /execution-placement (unless SERVICE_TOKEN_ACTS_FOR_DEPLOYMENT=false); was 404, or 401 auth.principal_required where a principal is required", since: "7.148.0" },
1079
+ "GET /v1/runs/:id · /v1/runs/:id/events#dev-open-principal-header-not-owner": { attr: "404 not_found.run, same body as a missing run (a caller that names a principal is that principal on a deployment without an identity boundary too); was 200", since: "7.149.0" },
1080
+ "session faces · list faces · /metrics family#dev-open-principal-header-not-owner": { 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)", since: "7.149.0" },
1081
+ "owner-only session ports#unreadable-archive-ownerless-session-fleet-or-operator": { attr: "answered as on a readable archive: background · background/stop · notify · mcp/reconnect · execution-placement · approval exemptions list / revoke (the gate skips the placement read only when both hypotheses admit the caller); was 500 corrupt_session", since: "7.148.0" },
1013
1082
  "run faces#row-without-owner-cell-no-fleet-no-operator": { attr: "the face's missing-row answer for every caller without a fleet or operator qualification on that face; was: a caller without a principal passed on some faces (absent equals absent)", since: "7.148.0" },
1014
- "POST /v1/tool-approvals/:id/respond#ask-not-visible-to-caller(查无 / 不是调用方的 / 行读不出 / 本 worker 没有问账)": { attr: "404 not_found.ask (no such approval ask (never existed, no longer kept, or not yours)), one body for every form, no state facts — the durable decision door's word; was 404 tool_approval.not_pending with cause unknown_or_other_replica (no cause on a worker without an ask ledger)", revises: ["errorCode:tool_approval.not_pending", "selfMinted.notPendingCause:unknown_or_other_replica"], since: "7.148.0" },
1015
- "GET /v1/tool-approvals/:id#ask-not-visible-to-caller(查无 / 不是调用方的 / 行读不出 / 本 worker 没有问账)": { attr: "404 not_found.ask, the same body as the respond door; was 404 tool_approval.not_pending with cause unknown_or_other_replica (no cause on a worker without an ask ledger)", revises: ["errorCode:tool_approval.not_pending", "selfMinted.notPendingCause:unknown_or_other_replica"], since: "7.148.0" },
1016
- "GET /v1/workflows/:id · /journal · /stream · POST /v1/workflows/:id/agents/:label/steer#session-assertion-mismatch": { attr: "404 not_found.workflow (workflow not found), same body as a missing workflow; was 404 not_found.run (workflow not found)", revises: ["errorCode:not_found.run"], since: "7.148.0" },
1083
+ "POST /v1/tool-approvals/:id/respond#ask-not-visible-to-caller(查无 / 不是调用方的 / 行读不出 / 本 worker 没有问账)": { attr: "404 not_found.ask (no such approval ask (never existed, no longer kept, or not yours)), one body for every form, no state facts — the durable decision door's word; was 404 tool_approval.not_pending with cause unknown_or_other_replica (no cause on a worker without an ask ledger)", since: "7.148.0" },
1084
+ "GET /v1/tool-approvals/:id#ask-not-visible-to-caller(查无 / 不是调用方的 / 行读不出 / 本 worker 没有问账)": { attr: "404 not_found.ask, the same body as the respond door; was 404 tool_approval.not_pending with cause unknown_or_other_replica (no cause on a worker without an ask ledger)", since: "7.148.0" },
1085
+ "GET /v1/workflows/:id · /journal · /stream · POST /v1/workflows/:id/agents/:label/steer#session-assertion-mismatch": { attr: "404 not_found.workflow (workflow not found), same body as a missing workflow; was 404 not_found.run (workflow not found)", since: "7.148.0" },
1017
1086
  },
1018
1087
  },
1019
1088
  sessionRewindFilesWire: {
@@ -1102,7 +1171,7 @@ export const SELF_MINTED_WIRE = {
1102
1171
  members: {
1103
1172
  "401 auth.unauthorized#operator(/metrics* · GET /v1/tasks/source-summary)": { attr: "… send the deployment's service token … without a principal header where this deployment lets its service token act for the deployment itself (GET /health reports it as auth.serviceTokenActsForDeployment; …), or a read-only token this endpoint accepts (…)", since: "7.146.0" },
1104
1173
  "422 invalid_entries#row_contract(会话同步推送第二阶段;收编批量导入同句进逐元素 detail)": { attr: "malformed entry (id and parentId must be strings of 1-64 characters, type a string of 1-32 characters)", since: "7.146.0" },
1105
- "404 not_found.run#a*/wa* id(compact · detach · 子代动词口;各 run 口的非属主臂)": { attr: "run not found — \"<id>\" looks like an agent handle (a*/wa* domain) … (the handle hint, same sentence as the missing-row arm)", revises: ["errorCode:not_found.run"], since: "7.148.0" },
1174
+ "404 not_found.run#a*/wa* id(compact · detach · 子代动词口;各 run 口的非属主臂)": { attr: "run not found — \"<id>\" looks like an agent handle (a*/wa* domain) … (the handle hint, same sentence as the missing-row arm)", since: "7.148.0" },
1106
1175
  "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" },
1107
1176
  "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" },
1108
1177
  "400 request.field_invalid#a2aPeers.over_cap": { attr: "tail: 声明列表拒绝骨架的句尾(与 mcpServers 共用 request-declaration-refusal)", since: "7.136.0" },
@@ -1113,7 +1182,7 @@ export const SELF_MINTED_WIRE = {
1113
1182
  "connect_failed(run 失败终局)#snapshot_bucket_missing(k8s 车道读 latest 得 404 NoSuchBucket;连沙箱失败,一只 pod 都不建)": { attr: "workspace space pointer read failed (snapshot_bucket_missing): the workspace snapshot bucket <name> (WORKSPACE_SNAPSHOT_BUCKET; default workspaces) does not exist in the object store — refusing to start this run … Ways out: create the bucket, or set WORKSPACE_SNAPSHOT_BUCKET to one that exists, or set WORKSPACE_PERSIST=off …", since: "7.136.0" },
1114
1183
  "400 request.field_invalid#images[i].url.credential": { attr: "<field> <规则句> — the URL is kept as written (a parked task's resume context, logs), while images[i] can carry the image bytes inline: send { data, mimeType } instead of a URL that holds the credential", since: "7.136.0" },
1115
1184
  "400 request.field_invalid#images.not_array": { attr: "head: images is <shape>, not an array of image entries", since: "7.148.0" },
1116
- "400 request.field_invalid#images[i].not_object": { attr: "head: images[i] is <shape>, not an image entry (an object)", revises: ["errorCode:internal.error"], since: "7.148.0" },
1185
+ "400 request.field_invalid#images[i].not_object": { attr: "head: images[i] is <shape>, not an image entry (an object)", since: "7.148.0" },
1117
1186
  "400 request.field_invalid#images[i].<key>.unusable": { attr: "<field> is not a usable declaration — must be a string (…) — got <shape>. The request is refused rather than handing the engine an image it cannot read: … Fix the entry (an image is either { data, mimeType } or { url }).", since: "7.148.0" },
1118
1187
  "400 request.body_shape#images[i].unknown_key": { attr: "body: unrecognized key(s) on an image entry — refused rather than dropped …; Accepted: <keys of the form>", since: "7.148.0" },
1119
1188
  "400 request.field_invalid#settings.env.compose": { attr: "settings.env cannot be composed into a child process environment — <the engine's verdict, sanitized>. The request is refused rather than accepted into a task whose hooks and shell would fail to start: fix or remove the variable concerned", since: "7.148.0" },
@@ -1220,12 +1289,13 @@ export const SELF_MINTED_WIRE = {
1220
1289
  },
1221
1290
  },
1222
1291
  deviceProtocolRevision: {
1223
- at: "GET /v1/capabilities deviceExecutor.protocolVersion 与 device WS challenge 帧的修订号(<修订号> → 它加进结局码闭集的词)",
1292
+ at: "GET /v1/capabilities deviceExecutor.protocolVersion 与 device WS challenge 帧的修订号(<修订号> → 它加进结局码闭集的词;零加词的语义修订 → 变更名)",
1224
1293
  members: {
1225
1294
  1: { attr: "base", since: "7.51.0" },
1226
1295
  2: { attr: "+liveness_no_output", since: "7.133.0" },
1227
1296
  3: { attr: "+name_too_long", since: "7.137.0" },
1228
1297
  4: { attr: "+symlink_loop", since: "7.143.0" },
1298
+ 5: { attr: "paths-unfolded", since: "7.150.0" },
1229
1299
  },
1230
1300
  },
1231
1301
  hookNonBlockingFailureReason: {
@@ -0,0 +1,3 @@
1
+ /** 一张工具结构化卡出门(`redact` = 调用面的整值脱敏器,环 / 深度守卫在它里面)。 */
2
+ export declare function projectToolCard(card: unknown, redact: (value: unknown) => unknown): unknown;
3
+ //# sourceMappingURL=tool-card.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { projectMcpAuthorization } from "../mcp-authorization-face.js";
2
+ import { projectToolStructured } from "./tool-output-media.js";
3
+ const TOOL_CARD_RECORDS = {
4
+ unauthorized: { member: "authorization", project: projectMcpAuthorization },
5
+ };
6
+ const isPlainRecord = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
7
+ function recordOf(card) {
8
+ const code = card.code;
9
+ if (typeof code !== "string")
10
+ return undefined;
11
+ const records = TOOL_CARD_RECORDS;
12
+ const record = Object.hasOwn(records, code) ? records[code] : undefined;
13
+ return record !== undefined && Object.hasOwn(card, record.member) ? record : undefined;
14
+ }
15
+ export function projectToolCard(card, redact) {
16
+ const record = isPlainRecord(card) ? recordOf(card) : undefined;
17
+ if (!isPlainRecord(card) || record === undefined)
18
+ return projectToolStructured(card, redact);
19
+ const face = record.project(card[record.member]);
20
+ const rest = projectToolStructured(Object.fromEntries(Object.entries(card).filter(([k]) => k !== record.member)), redact);
21
+ const kept = isPlainRecord(rest) ? rest : {};
22
+ return Object.fromEntries(Object.keys(card).flatMap((k) => (k === record.member ? (face === undefined ? [] : [[k, face]]) : Object.hasOwn(kept, k) ? [[k, kept[k]]] : [])));
23
+ }
24
+ //# sourceMappingURL=tool-card.js.map
@@ -7,7 +7,8 @@ export declare function projectToolOutput(output: unknown): unknown;
7
7
  * 媒体卡座位的**唯一一只遍历**(与 {@link projectToolOutput} 同律):媒体卡逐成员过 `redact`,`file` 里 `base64` 逐字、其余成员照脱;
8
8
  * 其它一切整只过 `redact`。保键序(逐键映射),不改入参。
9
9
  *
10
- * 形判与遍历只此一只,**脱敏器由调用面给**(「什么算该脱」是各面自己的事,「字节座位不过它」是这里的事):
10
+ * 形判与遍历只此一只,**脱敏器由调用面给**(「什么算该脱」是各面自己的事,「字节座位不过它」是这里的事)。调用它的只有工具卡的唯一读者
11
+ * `trace/tool-card.ts` 的 `projectToolCard`(卡上挂着的有处置表的记录先经记录的投影,其余部分交给本遍历),两面经它到这里:
11
12
  * · `tool_end` 活面 / 持久面(`toolEndEventData` 经 `trace/project.ts`):凭据脱敏 `redactDeep`;
12
13
  * · 会话存档读面(`audit.ts` 的 `toolResult.details` 叶):模型文本段脱敏的深扫(`redactDeepWith(v, redactModelText)`)。
13
14
  * `redact` 必须是整值→整值的纯函数(环 / 深度守卫在它里面,遍历不重做);非媒体卡原样交给它,所以非媒体卡的读数就是调用面自己的深扫。
@@ -17,7 +17,7 @@
17
17
  * ## 为什么是这一形(core §4.6e 推荐形逐条)
18
18
  * · **读整体,不读 `askClass`**:一问可以同属几类(探针问与写保护并存、组织裁决与 hook 并存),`askClass` 只是表序第一个;集里任一类
19
19
  * 不答 ⇒ 整问不答。
20
- * · **缺席 = 不答的类**:没盖 `origin` 的站(共享制品读确认,KL-1214-a)、部署自铸的请求、7.37.0 之前 park 的行续跑(KL-1214-b,续跑不补)
20
+ * · **缺席 = 不答的类**:没盖 `origin` 的站(共享制品读确认,[ref])、部署自铸的请求、7.37.0 之前 park 的行续跑([ref],续跑不补)
21
21
  * 都不带类 ⇒ 不答。
22
22
  * · **答集只 `ordinary`**:引擎可放行的类(core `releasableAskClassesFor(face)`,按问的面读 —— 哪些类、哪一面放得行以引擎的表为准,本注不抄名单)里除 `ordinary`
23
23
  * 之外的保护类与 `mode`(plan 的写问)留给人;可放行类之外的类(权威为人提的问)恒不答。function approver 的 yes 是「这一次调用的答」—— 它连 `requiresRealApproval`
@@ -134,7 +134,7 @@ export declare const isNoCenterEffective: (eff: EffectiveConfig) => boolean;
134
134
  */
135
135
  export declare function collabTemplatesNotExecuted(eff: Pick<EffectiveConfig, "collab">): string[];
136
136
  /**
137
- * DESIGN-278 §5 S2([ref])—— center 这份 effective **当前在管**哪些 `ServiceConfig` 键(配置目录端点
137
+ * [ref] §5 S2([ref])—— center 这份 effective **当前在管**哪些 `ServiceConfig` 键(配置目录端点
138
138
  * `GET /v1/config/catalog` 判 `effectiveLane` 的 center 半场)。
139
139
  *
140
140
  * 判据与各消费腿**同源**,不自铸第二份:
@@ -5,7 +5,8 @@ import { DEFAULT_MODEL_REF, buildEnvModelIdNotServedNotice, mintCapabilityKeys,
5
5
  import { applyAutoCompactWindow, buildModelCostKey, isRosterGateArmed, ownCredentialHitsInForce, parseAutonomy, unmatchableToolNamesRefusal } from "../config.js";
6
6
  import { NAME_TABLE_BEHAVIOR, retiredLeftOutEntries } from "../namespaced-rule-name.js";
7
7
  import { buildModelCompat, readModelCompat } from "../model-compat.js";
8
- import { ASSUMED_CONTEXT_WINDOW } from "../model-context-window.js";
8
+ import { resolveContextWindow } from "../model-context-window.js";
9
+ import { warnAssumedContextWindows } from "../context-window-notice.js";
9
10
  import { buildModelHeadersKey } from "../model-entry-headers.js";
10
11
  import { validateCommandRules } from "../runtime-governance.js";
11
12
  import { stageLimits } from "./stage-limits.js";
@@ -27,7 +28,7 @@ function envDerivedModel(config) {
27
28
  }
28
29
  return m;
29
30
  }
30
- function toModel(m, envDefaults = {}, logger) {
31
+ function toModel(m, window, envDefaults = {}, logger) {
31
32
  const thinkingDefault = envDefaults.defaultThinking;
32
33
  const declared = readModelCompat(m.api, m.compat);
33
34
  if (!declared.ok)
@@ -41,7 +42,7 @@ function toModel(m, envDefaults = {}, logger) {
41
42
  api: m.api,
42
43
  baseUrl: m.baseUrl ?? "",
43
44
  ...mintCapabilityKeys({ reasoning: m.reasoning, vision: m.vision }),
44
- contextWindow: m.contextWindow ?? envDefaults.contextWindow ?? ASSUMED_CONTEXT_WINDOW,
45
+ contextWindow: window.window,
45
46
  maxTokens: m.maxTokens ?? envDefaults.maxTokens ?? 4096,
46
47
  ...(m.charsPerToken !== undefined || envDefaults.charsPerToken !== undefined ? { charsPerToken: m.charsPerToken ?? envDefaults.charsPerToken } : {}),
47
48
  ...buildModelCostKey(m.cost),
@@ -96,6 +97,7 @@ function envModelPlaneOf(config) {
96
97
  if (snap === undefined) {
97
98
  snap = {
98
99
  models: { ...config.models },
100
+ contextWindowSources: { ...config.contextWindowSources },
99
101
  model: config.envModel,
100
102
  modelApiKeyEnv: { ...config.modelApiKeyEnv },
101
103
  modelApiKeys: { ...config.modelApiKeys },
@@ -192,6 +194,8 @@ export function applyEffective(config, eff, logger, opts) {
192
194
  }
193
195
  if (mp !== undefined)
194
196
  warnDanglingEnvBindings(config, staged.modelPlaneGroup.envBindingsDangling ?? [], logger);
197
+ if (mp !== undefined)
198
+ warnAssumedContextWindows(config, logger, { envTableIsPlaceholder: isRosterGateArmed(config.webAdmin) });
195
199
  if (staged.approvalGate.next !== undefined)
196
200
  logger?.info("web_admin_runtime", { version: staged.version, approvalRequire: staged.approvalGate.next });
197
201
  if (Object.keys(staged.hot.infoLine).length > 0)
@@ -217,9 +221,9 @@ function declareCandidateWithheldEnv(seats, modelApiKeyEnv, version) {
217
221
  if (handedOn.length === 0)
218
222
  return;
219
223
  withdrawServerWithheldEnv();
220
- throw new Error(`model catalog (effective v${version}): a model entry's apiKeyEnv names a variable a name-list env knob hands on — ` +
224
+ throw new Error(`model catalog (effective v${version}): a model entry's apiKeyEnv makes a variable a name-list env knob hands on one of this deployment's own credentials (by its name, or by its value under another name) — ` +
221
225
  handedOn.map((h) => `env ${h.knob} hands on ${h.name}, which this candidate makes ${h.problem}`).join("; ") +
222
- `; or point that entry's apiKeyEnv at a variable no name list hands on. The name lists are read at boot (changing one takes a restart); ` +
226
+ `; or point that entry's apiKeyEnv at a variable that no name list hands on and whose value no handed-on variable holds. The name lists are read at boot (changing one takes a restart); ` +
223
227
  `the candidate is refused whole and the current generation keeps serving (entries: ${entries}).`);
224
228
  }
225
229
  function commitStaged(config, staged) {
@@ -231,6 +235,7 @@ function commitStaged(config, staged) {
231
235
  config.droppedCatalogEntries = mp.droppedCatalogEntries;
232
236
  mutateInPlace(config.modelQuotaWeights, mp.quotaWeights);
233
237
  mutateInPlace(config.models, mp.models);
238
+ config.contextWindowSources = mp.contextWindowSources;
234
239
  config.model = mp.model;
235
240
  mutateInPlace(config.roles, mp.roles);
236
241
  mutateInPlace(config.tiers, mp.activeTiers);
@@ -254,7 +259,7 @@ function commitStaged(config, staged) {
254
259
  }
255
260
  export const MODEL_PLANE_DOMAINS = ["models"];
256
261
  const MODEL_PLANE_SURFACES = {
257
- models: ["models", "model", "modelRefusals", "droppedCatalogEntries", "modelApiKeyEnv", "modelApiKeys", "modelQuotaWeights", "roles", "tiers", "atMention"],
262
+ models: ["models", "contextWindowSources", "model", "modelRefusals", "droppedCatalogEntries", "modelApiKeyEnv", "modelApiKeys", "modelQuotaWeights", "roles", "tiers", "atMention"],
258
263
  };
259
264
  const MODEL_PLANE_GROUP_KEYS = MODEL_PLANE_DOMAINS.flatMap((d) => MODEL_PLANE_SURFACES[d]);
260
265
  export function withModelPlaneOf(target, source) {
@@ -351,6 +356,7 @@ function stageEnvModelPlane(config) {
351
356
  stages: {
352
357
  models: {
353
358
  ...snap,
359
+ contextWindowSources: { ...snap.contextWindowSources },
354
360
  modelApiKeyEnv: { ...snap.modelApiKeyEnv },
355
361
  modelApiKeys: { ...snap.modelApiKeys },
356
362
  modelRefusals: { ...snap.modelRefusals },
@@ -392,14 +398,18 @@ function stageModelPlane(config, eff, source, logger, sealedKeys) {
392
398
  return refuse(REFUSED_NAME_MINTED_CODE, malformedDroppedCarrierRefusal(verdict.malformed), { entries: [...verdict.malformed] });
393
399
  const usable = verdict.usable;
394
400
  const models = {};
401
+ const contextWindowSources = {};
395
402
  const modelApiKeyEnv = {};
396
403
  const modelApiKeys = {};
397
404
  const envModel = envDerivedModel(config);
398
- const envDefaults = { maxTokens: envModel.maxTokens, contextWindow: envModel.contextWindow, charsPerToken: envModel.charsPerToken, defaultThinking: envModel.defaultThinking, api: envModel.api, compat: envModel.compat };
405
+ const envDefaults = { maxTokens: envModel.maxTokens, charsPerToken: envModel.charsPerToken, defaultThinking: envModel.defaultThinking, api: envModel.api, compat: envModel.compat };
406
+ const envWindow = { window: envModel.contextWindow, source: config.envModelContextWindowSource };
399
407
  for (const m of usable) {
400
408
  if (m.baseUrl)
401
409
  logger?.warn("web_admin_model_base_url", { model: m.name, baseUrl: buildDisplaySafeUrl(m.baseUrl), hint: "registry-directed gateway override — this model's key authenticates AGAINST THIS URL" });
402
- models[m.name] = toModel(m, envDefaults, logger);
410
+ const window = resolveContextWindow(m.contextWindow, envWindow);
411
+ models[m.name] = toModel(m, window, envDefaults, logger);
412
+ contextWindowSources[m.name] = window.source;
403
413
  if (m.sealedApiKey) {
404
414
  const s = m.sealedApiKey;
405
415
  if (!sealedKeys) {
@@ -482,8 +492,10 @@ function stageModelPlane(config, eff, source, logger, sealedKeys) {
482
492
  throw new Error(`catalog default: unknown kind ${JSON.stringify(unhandled)}`);
483
493
  }
484
494
  }
485
- if (picked !== undefined)
495
+ if (picked !== undefined) {
486
496
  models.default = models[picked.name];
497
+ contextWindowSources.default = contextWindowSources[picked.name];
498
+ }
487
499
  }
488
500
  const nextView = { ...config, models, tiers: activeTiers, modelRefusals: verdict.refused };
489
501
  const noDefault = crossInvariant("default-model-resolvable").check({ live: config, next: nextView });
@@ -507,6 +519,7 @@ function stageModelPlane(config, eff, source, logger, sealedKeys) {
507
519
  const envBindingsDangling = danglingEnvBindingsOf(envPlane.roles, centerRoles, envModelTableOf(config), expandTiers(models, activeTiers) ?? models);
508
520
  const plane = {
509
521
  models,
522
+ contextWindowSources,
510
523
  model: defaultModel,
511
524
  modelApiKeyEnv,
512
525
  modelApiKeys,
@@ -8,7 +8,7 @@
8
8
  * 2. 三张登记表(非域白名单 / 不消费表 / 远端专属表)每行**必须带理由**;行的成立性由对账门**双向**钉——登记了
9
9
  * 却不成立(死账)与成立了却没登记(半接线)都红,理由失效之日格子自己翻红(墓碑),禁裸豁免。
10
10
  * 3. schema 侧的数据(`DOMAINS` / `PORTABLE_DOMAINS` / zod shape)一律由对账门**读 dist**,绝不抄进这里
11
- * (平行副本病是 DESIGN-282 §0 的病理定性,本文件只登记 server 自己那一侧)。
11
+ * (平行副本病是 [ref] §0 的病理定性,本文件只登记 server 自己那一侧)。
12
12
  */
13
13
  import type { EffectiveConfig } from "./types.js";
14
14
  /** EffectiveConfig 的全部顶层键(信封 + 域 + 非域白名单键),类型级绑定见上。 */
@@ -69,7 +69,7 @@ export declare function resolveMcpServers(mcp: {
69
69
  * [ref]:alias 窗撤销,单键命中(同 `skillsForScenario`)。 */
70
70
  export declare function mcpForScenario(center: CenterMcp | undefined, scenario: string): McpServerSpec[] | undefined;
71
71
  /**
72
- * DESIGN-269 §2.1 —— resolve the deployment's A2A peers (the `a2a` domain: `config.d/a2a.json` on the local leg, `/effective.a2a` on the
72
+ * [ref] §2.1 —— resolve the deployment's A2A peers (the `a2a` domain: `config.d/a2a.json` on the local leg, `/effective.a2a` on the
73
73
  * center leg — one declaration seat, both legs read through the contract) into core `A2aServerSpec`s + the scenarios each applies to. Exact sibling of {@link resolveMcpServers}, same three rules:
74
74
  * · header-NAME refs → real values from THIS service's env (the secret boundary is unchanged — the center
75
75
  * never holds the bearer), registered on `desk` under `rosterLease` (`mintDeclaration`, only for a peer that mounts); the spec carries the minted