@sema-agent/server 7.147.0 → 7.149.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 (790) hide show
  1. package/MIGRATION.md +1468 -24
  2. package/README.md +35 -7
  3. package/README.zh-CN.md +18 -8
  4. package/USAGE.md +444 -193
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/approval-card.d.ts +36 -38
  39. package/dist/approval-gate-currency.js +3 -2
  40. package/dist/approval-leg-origin.d.ts +33 -0
  41. package/dist/approval-leg-origin.js +4 -0
  42. package/dist/approval-reconciler.d.ts +4 -13
  43. package/dist/approval-reconciler.js +2 -2
  44. package/dist/approval.d.ts +13 -11
  45. package/dist/approval.js +3 -3
  46. package/dist/audit.d.ts +10 -3
  47. package/dist/audit.js +15 -7
  48. package/dist/auth-bridge.d.ts +9 -15
  49. package/dist/auth-bridge.js +4 -11
  50. package/dist/auth-keys.d.ts +10 -1
  51. package/dist/auth-keys.js +8 -0
  52. package/dist/auto-mode-face.d.ts +10 -7
  53. package/dist/auto-mode-face.js +7 -4
  54. package/dist/background-agent-name.d.ts +19 -1
  55. package/dist/background-agent-name.js +12 -2
  56. package/dist/background-session-reap.d.ts +1 -1
  57. package/dist/bake-runner/main.js +9 -6
  58. package/dist/bench/s1/arms.js +6 -5
  59. package/dist/bench/s1/live-deps.js +5 -2
  60. package/dist/bench/s1/run-firm.js +6 -5
  61. package/dist/bind-host.d.ts +25 -0
  62. package/dist/bind-host.js +25 -0
  63. package/dist/boot/adoption.d.ts +3 -0
  64. package/dist/boot/adoption.js +1 -0
  65. package/dist/boot/deployment-mods.d.ts +1 -1
  66. package/dist/boot/execution-env.d.ts +17 -7
  67. package/dist/boot/execution-env.js +47 -42
  68. package/dist/boot/execution-lane.d.ts +6 -4
  69. package/dist/boot/execution-lane.js +3 -1
  70. package/dist/boot/exit-boundary.d.ts +2 -2
  71. package/dist/boot/exit-boundary.js +6 -5
  72. package/dist/boot/fatal-exit.d.ts +3 -5
  73. package/dist/boot/fatal-exit.js +2 -2
  74. package/dist/boot/leader.d.ts +15 -0
  75. package/dist/boot/leader.js +17 -15
  76. package/dist/boot/memory-consolidation.d.ts +37 -29
  77. package/dist/boot/memory-consolidation.js +11 -5
  78. package/dist/boot/org-delivery.d.ts +3 -2
  79. package/dist/boot/org-memory.js +1 -1
  80. package/dist/boot/parked-revive-gate.js +2 -2
  81. package/dist/boot/reapers.d.ts +4 -3
  82. package/dist/boot/reapers.js +19 -16
  83. package/dist/boot/resolve-spec.d.ts +5 -3
  84. package/dist/boot/resolve-spec.js +60 -70
  85. package/dist/boot/retention-lane.d.ts +4 -4
  86. package/dist/boot/retention-lane.js +2 -2
  87. package/dist/boot/runner-deps.d.ts +28 -7
  88. package/dist/boot/runner-deps.js +14 -5
  89. package/dist/boot/runtime-caps.d.ts +2 -2
  90. package/dist/boot/runtime-caps.js +16 -2
  91. package/dist/boot/session-faces.d.ts +16 -7
  92. package/dist/boot/session-faces.js +114 -94
  93. package/dist/boot/shutdown.d.ts +5 -4
  94. package/dist/boot/shutdown.js +6 -4
  95. package/dist/boot/stage-01-config.d.ts +1 -0
  96. package/dist/boot/stage-01-config.js +13 -4
  97. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
  98. package/dist/boot/stage-02-web-admin-pull.js +16 -3
  99. package/dist/boot/stage-03-store-backend.d.ts +4 -0
  100. package/dist/boot/stage-03-store-backend.js +4 -3
  101. package/dist/boot/stage-04-stores.d.ts +3 -0
  102. package/dist/boot/stage-04-stores.js +2 -2
  103. package/dist/boot/stage-05-execution-env.d.ts +8 -3
  104. package/dist/boot/stage-05-execution-env.js +2 -2
  105. package/dist/boot/stage-06-runners.d.ts +12 -13
  106. package/dist/boot/stage-06-runners.js +23 -15
  107. package/dist/boot/stage-07-capability-layer.d.ts +13 -9
  108. package/dist/boot/stage-07-capability-layer.js +5 -3
  109. package/dist/boot/stage-08-reapers.d.ts +13 -9
  110. package/dist/boot/stage-08-reapers.js +3 -3
  111. package/dist/boot/stage-09-leader.d.ts +14 -16
  112. package/dist/boot/stage-09-leader.js +12 -4
  113. package/dist/boot/stage-10-http-server.d.ts +14 -16
  114. package/dist/boot/stage-10-http-server.js +7 -4
  115. package/dist/boot/store-evidence.d.ts +20 -0
  116. package/dist/boot/store-evidence.js +13 -0
  117. package/dist/boot/stores.d.ts +6 -0
  118. package/dist/boot/stores.js +41 -27
  119. package/dist/boot/task-list-lane.d.ts +4 -4
  120. package/dist/boot/web-admin.d.ts +4 -2
  121. package/dist/boot/web-admin.js +55 -35
  122. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  123. package/dist/boot-reclaim.d.ts +3 -1
  124. package/dist/boot-reclaim.js +1 -1
  125. package/dist/brain.d.ts +7 -18
  126. package/dist/brain.js +5 -17
  127. package/dist/budget.js +6 -6
  128. package/dist/capabilities/center-plugins.d.ts +7 -1
  129. package/dist/capabilities/center-plugins.js +32 -10
  130. package/dist/capabilities/center-wiring.js +1 -1
  131. package/dist/capabilities/composite-members.d.ts +2 -2
  132. package/dist/capabilities/composite-members.js +2 -2
  133. package/dist/capabilities/repo-tools.d.ts +2 -0
  134. package/dist/capabilities/repo-tools.js +14 -12
  135. package/dist/capabilities/scenarios.d.ts +6 -15
  136. package/dist/capabilities/scenarios.js +11 -16
  137. package/dist/capabilities/skills.d.ts +1 -1
  138. package/dist/capabilities/tool-defer.d.ts +1 -1
  139. package/dist/capability-facts.d.ts +39 -11
  140. package/dist/capability-facts.js +35 -7
  141. package/dist/card-settle-stored-scope.d.ts +56 -0
  142. package/dist/card-settle-stored-scope.js +27 -0
  143. package/dist/card-void.d.ts +8 -13
  144. package/dist/card-void.js +2 -7
  145. package/dist/center-credential-renewer.d.ts +6 -2
  146. package/dist/center-credential-renewer.js +7 -3
  147. package/dist/config-catalog.d.ts +28 -1
  148. package/dist/config-catalog.js +95 -85
  149. package/dist/config-dir-trust.d.ts +37 -4
  150. package/dist/config-dir-trust.js +88 -44
  151. package/dist/config-invariants.d.ts +43 -3
  152. package/dist/config-invariants.js +69 -5
  153. package/dist/config-lkg.d.ts +23 -1
  154. package/dist/config-lkg.js +17 -3
  155. package/dist/config-provider.d.ts +9 -9
  156. package/dist/config-provider.js +25 -110
  157. package/dist/config-pull-failure.d.ts +50 -0
  158. package/dist/config-pull-failure.js +48 -0
  159. package/dist/config-types.d.ts +62 -21
  160. package/dist/config.d.ts +14 -21
  161. package/dist/config.js +141 -64
  162. package/dist/context-window-notice.d.ts +31 -0
  163. package/dist/context-window-notice.js +28 -0
  164. package/dist/delegated-session-owner.d.ts +1 -1
  165. package/dist/deleted-session-ids.d.ts +3 -2
  166. package/dist/deployment-governance.d.ts +3 -3
  167. package/dist/deployment-shape.d.ts +46 -11
  168. package/dist/deployment-shape.js +8 -0
  169. package/dist/egress-redirect.d.ts +25 -7
  170. package/dist/egress-redirect.js +20 -2
  171. package/dist/elicitation.d.ts +6 -5
  172. package/dist/elicitation.js +23 -22
  173. package/dist/engine-identity.d.ts +28 -0
  174. package/dist/engine-identity.js +10 -0
  175. package/dist/entry-problems.d.ts +5 -7
  176. package/dist/entry-problems.js +1 -1
  177. package/dist/env-facts.js +2 -1
  178. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  179. package/dist/env-name-allowlist-knobs.js +5 -0
  180. package/dist/env-witness.d.ts +7 -0
  181. package/dist/env-witness.js +16 -0
  182. package/dist/execution-lane-caps.d.ts +25 -23
  183. package/dist/execution-lane-caps.js +18 -26
  184. package/dist/execution-placement.d.ts +58 -18
  185. package/dist/execution-placement.js +41 -2
  186. package/dist/field-conflict.d.ts +7 -11
  187. package/dist/field-conflict.js +3 -3
  188. package/dist/file-history-capture.d.ts +3 -3
  189. package/dist/file-history-disclosure.js +1 -0
  190. package/dist/fleet/fleet-bus.d.ts +21 -3
  191. package/dist/fleet/fleet-bus.js +35 -25
  192. package/dist/fleet/fleet-reconciler.js +2 -2
  193. package/dist/fleet/serving-lease.js +3 -3
  194. package/dist/fleet-client.js +3 -3
  195. package/dist/fleet-lease.d.ts +0 -1
  196. package/dist/fleet-lease.js +4 -5
  197. package/dist/history-anchor.d.ts +23 -3
  198. package/dist/history-anchor.js +24 -4
  199. package/dist/hitl-delivery.d.ts +90 -0
  200. package/dist/hitl-delivery.js +98 -0
  201. package/dist/hooks/classic-stations.d.ts +8 -11
  202. package/dist/hooks/classic-stations.js +0 -7
  203. package/dist/hooks/command-spawn.d.ts +7 -2
  204. package/dist/hooks/command-spawn.js +13 -6
  205. package/dist/hooks/hook-llm.d.ts +5 -1
  206. package/dist/hooks/hook-llm.js +24 -15
  207. package/dist/hooks/hook-runner.d.ts +72 -57
  208. package/dist/hooks/hook-runner.js +271 -193
  209. package/dist/host-lsp-manager.d.ts +22 -8
  210. package/dist/host-lsp-manager.js +4 -1
  211. package/dist/http/active-run-conflict.d.ts +2 -43
  212. package/dist/http/active-run-conflict.js +3 -7
  213. package/dist/http/admission.d.ts +4 -18
  214. package/dist/http/admission.js +76 -79
  215. package/dist/http/approval-sweeps.d.ts +3 -3
  216. package/dist/http/approval-sweeps.js +56 -31
  217. package/dist/http/caller-trust.d.ts +8 -10
  218. package/dist/http/caller-trust.js +1 -2
  219. package/dist/http/claim-heartbeat.d.ts +49 -0
  220. package/dist/http/claim-heartbeat.js +46 -0
  221. package/dist/http/claimed-run.d.ts +16 -8
  222. package/dist/http/claimed-run.js +8 -0
  223. package/dist/http/dispatch.d.ts +8 -1
  224. package/dist/http/dispatch.js +78 -30
  225. package/dist/http/durable-run-leg.d.ts +11 -4
  226. package/dist/http/durable-run-leg.js +45 -21
  227. package/dist/http/execution-context.d.ts +122 -47
  228. package/dist/http/execution-context.js +135 -43
  229. package/dist/http/health-reader.d.ts +36 -0
  230. package/dist/http/health-reader.js +21 -0
  231. package/dist/http/health-self-report.d.ts +9 -9
  232. package/dist/http/health-self-report.js +4 -4
  233. package/dist/http/idempotency.d.ts +9 -5
  234. package/dist/http/idempotency.js +4 -4
  235. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  236. package/dist/http/memory-compliance-failure-reply.js +4 -2
  237. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  238. package/dist/http/memory-face-fault-reply.js +71 -0
  239. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  240. package/dist/http/memory-store-refusal-reply.js +3 -0
  241. package/dist/http/owner-access.d.ts +392 -67
  242. package/dist/http/owner-access.js +370 -35
  243. package/dist/http/principal-gate.d.ts +39 -89
  244. package/dist/http/principal-gate.js +26 -68
  245. package/dist/http/refusal-body.d.ts +35 -2
  246. package/dist/http/refusal-body.js +34 -0
  247. package/dist/http/request-guards.d.ts +9 -13
  248. package/dist/http/request-guards.js +34 -68
  249. package/dist/http/resume-composition.d.ts +37 -0
  250. package/dist/http/resume-composition.js +18 -0
  251. package/dist/http/resume-ctx-read.d.ts +46 -12
  252. package/dist/http/resume-ctx-read.js +31 -6
  253. package/dist/http/resume-legs.d.ts +54 -19
  254. package/dist/http/resume-legs.js +408 -196
  255. package/dist/http/retired-skill-manifest.d.ts +1 -1
  256. package/dist/http/route-ctx.d.ts +31 -32
  257. package/dist/http/routes/a2a-serve.d.ts +43 -5
  258. package/dist/http/routes/a2a-serve.js +60 -37
  259. package/dist/http/routes/admin-config-refresh.js +2 -2
  260. package/dist/http/routes/admin-drain.js +2 -2
  261. package/dist/http/routes/admin-memory-optout.js +4 -3
  262. package/dist/http/routes/adoption.d.ts +3 -0
  263. package/dist/http/routes/adoption.js +17 -10
  264. package/dist/http/routes/agents-roster.js +13 -7
  265. package/dist/http/routes/approvals-assistant.js +73 -67
  266. package/dist/http/routes/attachments.js +2 -2
  267. package/dist/http/routes/background.d.ts +3 -3
  268. package/dist/http/routes/background.js +9 -17
  269. package/dist/http/routes/capabilities.js +16 -19
  270. package/dist/http/routes/config-catalog.js +2 -2
  271. package/dist/http/routes/devices.d.ts +3 -3
  272. package/dist/http/routes/devices.js +4 -4
  273. package/dist/http/routes/diagnostics.d.ts +29 -3
  274. package/dist/http/routes/diagnostics.js +49 -18
  275. package/dist/http/routes/engine.js +2 -2
  276. package/dist/http/routes/fleet.js +5 -3
  277. package/dist/http/routes/images.js +10 -6
  278. package/dist/http/routes/leader.d.ts +7 -2
  279. package/dist/http/routes/leader.js +12 -3
  280. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  281. package/dist/http/routes/mcp-reconnect.js +7 -15
  282. package/dist/http/routes/memory-bundle.js +4 -7
  283. package/dist/http/routes/memory-compliance.js +4 -4
  284. package/dist/http/routes/memory-consolidation.js +6 -9
  285. package/dist/http/routes/memory-origin.d.ts +2 -0
  286. package/dist/http/routes/memory-origin.js +7 -8
  287. package/dist/http/routes/memory-policy.js +17 -12
  288. package/dist/http/routes/notify-wake.js +10 -19
  289. package/dist/http/routes/observability.js +3 -3
  290. package/dist/http/routes/principal-inbox.d.ts +4 -2
  291. package/dist/http/routes/principal-inbox.js +5 -4
  292. package/dist/http/routes/projects.d.ts +1 -1
  293. package/dist/http/routes/projects.js +3 -2
  294. package/dist/http/routes/retention-ops.js +6 -9
  295. package/dist/http/routes/rules.js +20 -5
  296. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  297. package/dist/http/routes/run-memory-capture.js +6 -12
  298. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  299. package/dist/http/routes/run-permission-mode.js +10 -17
  300. package/dist/http/routes/runs.js +155 -237
  301. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  302. package/dist/http/routes/session-memory-sync.js +7 -13
  303. package/dist/http/routes/session-sync.d.ts +28 -7
  304. package/dist/http/routes/session-sync.js +63 -50
  305. package/dist/http/routes/sessions-list.d.ts +3 -3
  306. package/dist/http/routes/sessions-list.js +9 -9
  307. package/dist/http/routes/sessions.js +87 -124
  308. package/dist/http/routes/shared-memory.js +6 -6
  309. package/dist/http/routes/side-query.js +2 -2
  310. package/dist/http/routes/tasks.js +237 -187
  311. package/dist/http/routes/trace-usage.d.ts +0 -12
  312. package/dist/http/routes/trace-usage.js +40 -46
  313. package/dist/http/routes/workflows.d.ts +39 -4
  314. package/dist/http/routes/workflows.js +42 -14
  315. package/dist/http/run-concurrency-cap.d.ts +20 -12
  316. package/dist/http/run-concurrency-cap.js +39 -26
  317. package/dist/http/run-read-face.d.ts +3 -5
  318. package/dist/http/run-read-face.js +8 -13
  319. package/dist/http/send.d.ts +12 -3
  320. package/dist/http/send.js +42 -6
  321. package/dist/http/server.d.ts +43 -45
  322. package/dist/http/server.js +61 -11
  323. package/dist/http/sse-log.d.ts +17 -10
  324. package/dist/http/sse-log.js +7 -7
  325. package/dist/http/stored-body-replay.d.ts +12 -0
  326. package/dist/http/stored-body-replay.js +2 -2
  327. package/dist/http/submit-ctx.d.ts +17 -8
  328. package/dist/http/submit-ctx.js +8 -5
  329. package/dist/http/submit-replay.d.ts +19 -6
  330. package/dist/http/submit-replay.js +18 -6
  331. package/dist/http/sync-submit-body.d.ts +3 -4
  332. package/dist/http/sync-submit-body.js +4 -5
  333. package/dist/http/wire-types.d.ts +4 -3
  334. package/dist/identity-source.d.ts +36 -5
  335. package/dist/identity-source.js +27 -0
  336. package/dist/index.d.ts +4 -1
  337. package/dist/index.js +2 -0
  338. package/dist/key-resolver.d.ts +32 -0
  339. package/dist/key-resolver.js +23 -9
  340. package/dist/leader/diffup.js +2 -1
  341. package/dist/leader/endpoint.d.ts +26 -5
  342. package/dist/leader/endpoint.js +154 -14
  343. package/dist/leader/fanout.d.ts +3 -0
  344. package/dist/leader/fanout.js +78 -63
  345. package/dist/leader/leader.d.ts +16 -0
  346. package/dist/leader/leader.js +43 -3
  347. package/dist/leader/merge.d.ts +9 -1
  348. package/dist/leader/merge.js +16 -1
  349. package/dist/leader/repair-wire.js +1 -1
  350. package/dist/leader/wire.d.ts +36 -3
  351. package/dist/leader/wire.js +59 -18
  352. package/dist/leg-facts.d.ts +7 -2
  353. package/dist/leg-facts.js +1 -0
  354. package/dist/local-store-declaration.d.ts +54 -0
  355. package/dist/local-store-declaration.js +59 -0
  356. package/dist/lsp-evict.d.ts +6 -4
  357. package/dist/lsp-evict.js +2 -3
  358. package/dist/mcp-assertion-header.d.ts +1 -1
  359. package/dist/mcp-assertion-header.js +1 -1
  360. package/dist/memory-operator-faces.d.ts +5 -4
  361. package/dist/memory-operator-faces.js +1 -1
  362. package/dist/memory-project-layer.js +1 -1
  363. package/dist/memory-scope.d.ts +33 -6
  364. package/dist/memory-scope.js +68 -19
  365. package/dist/memory-store-refusal.d.ts +5 -2
  366. package/dist/memory-sync-client.d.ts +3 -2
  367. package/dist/memory-sync-client.js +8 -5
  368. package/dist/model-compat.d.ts +17 -8
  369. package/dist/model-compat.js +6 -2
  370. package/dist/model-context-window.d.ts +57 -0
  371. package/dist/model-context-window.js +21 -0
  372. package/dist/model-entry-headers.d.ts +46 -4
  373. package/dist/model-entry-headers.js +2 -2
  374. package/dist/model-entry-refusal.d.ts +40 -20
  375. package/dist/model-entry-refusal.js +57 -30
  376. package/dist/model-plane-face.d.ts +19 -11
  377. package/dist/model-plane-face.js +9 -1
  378. package/dist/model-plane-probe.d.ts +2 -0
  379. package/dist/model-plane-probe.js +17 -0
  380. package/dist/model-provider.d.ts +3 -3
  381. package/dist/model-reach-scope.d.ts +2 -1
  382. package/dist/model-route-endpoint.d.ts +9 -5
  383. package/dist/model-route-endpoint.js +29 -7
  384. package/dist/model-select.d.ts +16 -0
  385. package/dist/model-select.js +4 -0
  386. package/dist/mountinfo.d.ts +37 -0
  387. package/dist/mountinfo.js +47 -0
  388. package/dist/namespaced-rule-name.d.ts +23 -14
  389. package/dist/namespaced-rule-name.js +8 -11
  390. package/dist/net-address.d.ts +1 -1
  391. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  392. package/dist/observability/corrupt-read-seat.js +5 -3
  393. package/dist/observability/fail-open.d.ts +72 -40
  394. package/dist/observability/fail-open.js +74 -40
  395. package/dist/observability/logger.d.ts +22 -1
  396. package/dist/observability/logger.js +89 -12
  397. package/dist/observability/metrics.js +4 -5
  398. package/dist/observability/otel-exporter.js +2 -1
  399. package/dist/observability/principal-context.d.ts +14 -7
  400. package/dist/observability/principal-context.js +8 -3
  401. package/dist/observability/run-terminal.d.ts +7 -1
  402. package/dist/observability/run-terminal.js +6 -2
  403. package/dist/observability/secret-env-scrub.d.ts +1 -1
  404. package/dist/observability/secret-env-scrub.js +1 -1
  405. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  406. package/dist/orchestration/hardened-vm-runner.js +11 -5
  407. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  408. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  409. package/dist/orchestration/hardened-vm-worker.js +2 -1
  410. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  411. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  412. package/dist/org-delivery-gate.d.ts +36 -10
  413. package/dist/org-delivery-gate.js +12 -8
  414. package/dist/outbound-dispatcher.d.ts +1 -1
  415. package/dist/outbound-dispatcher.js +6 -12
  416. package/dist/owner-brands.d.ts +81 -0
  417. package/dist/owner-brands.js +42 -0
  418. package/dist/owner-faces.d.ts +532 -0
  419. package/dist/owner-faces.js +126 -0
  420. package/dist/park-row-commit.d.ts +67 -0
  421. package/dist/park-row-commit.js +76 -0
  422. package/dist/parked-decide.d.ts +76 -12
  423. package/dist/parked-decide.js +152 -11
  424. package/dist/parked-revive-surface.d.ts +14 -4
  425. package/dist/parked-revive-surface.js +5 -4
  426. package/dist/peer-directory.d.ts +7 -9
  427. package/dist/peer-directory.js +3 -2
  428. package/dist/permission-rule-vocab.d.ts +53 -8
  429. package/dist/permission-rule-vocab.js +30 -2
  430. package/dist/plugins/adoption-log-sql.d.ts +3 -25
  431. package/dist/plugins/adoption-log-sql.js +23 -21
  432. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  433. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  434. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  435. package/dist/plugins/approval-ask-store-file.js +37 -14
  436. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  437. package/dist/plugins/approval-ask-store-memory.js +24 -10
  438. package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
  439. package/dist/plugins/approval-ask-store-sql.js +44 -15
  440. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  441. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  442. package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
  443. package/dist/plugins/approval-exemption-skill-m46.js +21 -0
  444. package/dist/plugins/approval-exemption-store.d.ts +32 -2
  445. package/dist/plugins/approval-exemption-store.js +42 -19
  446. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  447. package/dist/plugins/approval-nonce-store.js +72 -23
  448. package/dist/plugins/blob-backend.d.ts +2 -0
  449. package/dist/plugins/blob-backend.js +9 -6
  450. package/dist/plugins/caching-session-store.d.ts +13 -1
  451. package/dist/plugins/caching-session-store.js +43 -4
  452. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  453. package/dist/plugins/checkpoint-index-columns.js +36 -1
  454. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  455. package/dist/plugins/checkpoint-store-face.js +18 -1
  456. package/dist/plugins/device-store-sql.js +1 -0
  457. package/dist/plugins/ensure-index.d.ts +13 -1
  458. package/dist/plugins/ensure-index.js +154 -21
  459. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
  460. package/dist/plugins/ensure-schema-lock-policy.js +76 -9
  461. package/dist/plugins/file-run-store.d.ts +85 -32
  462. package/dist/plugins/file-run-store.js +177 -94
  463. package/dist/plugins/host-platform.d.ts +24 -3
  464. package/dist/plugins/host-platform.js +15 -1
  465. package/dist/plugins/image-bake-store-sql.js +2 -0
  466. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  467. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  468. package/dist/plugins/k8s-pod-reaper.js +0 -1
  469. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  470. package/dist/plugins/leader-run-store-sql.js +34 -4
  471. package/dist/plugins/local-checkpoint-store.d.ts +62 -23
  472. package/dist/plugins/local-checkpoint-store.js +197 -77
  473. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  474. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  475. package/dist/plugins/local-data-root-admission.js +100 -0
  476. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  477. package/dist/plugins/local-docker-capacity.js +194 -0
  478. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  479. package/dist/plugins/local-docker-reaper.js +102 -0
  480. package/dist/plugins/local-engine-high-water.d.ts +29 -6
  481. package/dist/plugins/local-engine-high-water.js +27 -19
  482. package/dist/plugins/local-session-store.d.ts +458 -140
  483. package/dist/plugins/local-session-store.js +906 -292
  484. package/dist/plugins/local-session-window.d.ts +3 -2
  485. package/dist/plugins/local-session-window.js +3 -2
  486. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  487. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  488. package/dist/plugins/local-task-attachment-store.js +22 -1
  489. package/dist/plugins/memory-embedder.js +9 -7
  490. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  491. package/dist/plugins/memory-engine-pg.js +14 -5
  492. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  493. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  494. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  495. package/dist/plugins/memory-engine-tidb.js +11 -2
  496. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  497. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  498. package/dist/plugins/memory-run-store.d.ts +53 -36
  499. package/dist/plugins/memory-run-store.js +116 -88
  500. package/dist/plugins/one-time-migration-marker.d.ts +26 -0
  501. package/dist/plugins/one-time-migration-marker.js +13 -0
  502. package/dist/plugins/one-time-migrations.d.ts +214 -47
  503. package/dist/plugins/one-time-migrations.js +481 -135
  504. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  505. package/dist/plugins/org-delivery-quota-store.js +31 -15
  506. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  507. package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
  508. package/dist/plugins/permission-rule-store-sql.js +11 -95
  509. package/dist/plugins/pg-pool.d.ts +2 -32
  510. package/dist/plugins/pg-pool.js +24 -17
  511. package/dist/plugins/remote-env-device.d.ts +3 -2
  512. package/dist/plugins/remote-env-e2b.d.ts +8 -32
  513. package/dist/plugins/remote-env-e2b.js +44 -32
  514. package/dist/plugins/remote-env-host.d.ts +51 -17
  515. package/dist/plugins/remote-env-host.js +111 -42
  516. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  517. package/dist/plugins/remote-env-k8s.js +111 -60
  518. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  519. package/dist/plugins/remote-env-local-docker.js +352 -72
  520. package/dist/plugins/remote-scratchpad.js +4 -0
  521. package/dist/plugins/retention-deployment.d.ts +49 -17
  522. package/dist/plugins/retention-deployment.js +39 -8
  523. package/dist/plugins/run-preview-m45.d.ts +11 -0
  524. package/dist/plugins/run-preview-m45.js +19 -0
  525. package/dist/plugins/run-store-sql.d.ts +82 -75
  526. package/dist/plugins/run-store-sql.js +164 -125
  527. package/dist/plugins/s3-answer.d.ts +2 -1
  528. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  529. package/dist/plugins/sandbox-reaper.js +2 -0
  530. package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
  531. package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
  532. package/dist/plugins/scheduler-support.d.ts +16 -1
  533. package/dist/plugins/scheduler-support.js +22 -2
  534. package/dist/plugins/schema-consistency.d.ts +131 -14
  535. package/dist/plugins/schema-consistency.js +388 -18
  536. package/dist/plugins/schema-drift-sentence.d.ts +10 -6
  537. package/dist/plugins/schema-drift-sentence.js +15 -7
  538. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  539. package/dist/plugins/schema-ensure-legs.js +1 -1
  540. package/dist/plugins/schema-indexes.js +3 -0
  541. package/dist/plugins/schema-live-columns.d.ts +14 -5
  542. package/dist/plugins/schema-live-columns.js +10 -10
  543. package/dist/plugins/send-user-file.js +2 -1
  544. package/dist/plugins/session-birth.d.ts +37 -0
  545. package/dist/plugins/session-birth.js +38 -0
  546. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  547. package/dist/plugins/session-epoch-anchor.js +33 -11
  548. package/dist/plugins/session-ext-table.d.ts +27 -3
  549. package/dist/plugins/session-ext-table.js +19 -6
  550. package/dist/plugins/session-fork.d.ts +15 -1
  551. package/dist/plugins/session-fork.js +3 -0
  552. package/dist/plugins/session-ownership.d.ts +1 -1
  553. package/dist/plugins/session-placement.d.ts +27 -20
  554. package/dist/plugins/session-placement.js +15 -12
  555. package/dist/plugins/session-row-sql.d.ts +12 -0
  556. package/dist/plugins/session-row-sql.js +3 -3
  557. package/dist/plugins/session-run-rollup.d.ts +29 -0
  558. package/dist/plugins/session-run-rollup.js +40 -0
  559. package/dist/plugins/session-store-sql.d.ts +38 -12
  560. package/dist/plugins/session-store-sql.js +130 -30
  561. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  562. package/dist/plugins/session-withdraw-sql.js +42 -0
  563. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  564. package/dist/plugins/shared-memory-store-sql.js +2 -1
  565. package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
  566. package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
  567. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  568. package/dist/plugins/sql-driver.d.ts +1 -1
  569. package/dist/plugins/sql-driver.js +2 -1
  570. package/dist/plugins/sql-errors.d.ts +32 -5
  571. package/dist/plugins/sql-errors.js +55 -7
  572. package/dist/plugins/sql-json-column.d.ts +8 -7
  573. package/dist/plugins/sql-json-column.js +10 -6
  574. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  575. package/dist/plugins/stop-then-start-sentence.js +7 -0
  576. package/dist/plugins/store-backend.d.ts +99 -16
  577. package/dist/plugins/store-backend.js +230 -65
  578. package/dist/plugins/store-contracts.d.ts +123 -33
  579. package/dist/plugins/store-contracts.js +38 -1
  580. package/dist/plugins/store-fault.d.ts +28 -2
  581. package/dist/plugins/store-fault.js +20 -2
  582. package/dist/plugins/task-attachment-store.d.ts +15 -3
  583. package/dist/plugins/task-attachment-store.js +22 -9
  584. package/dist/plugins/tidb-pool.d.ts +11 -6
  585. package/dist/plugins/tidb-pool.js +39 -18
  586. package/dist/plugins/web-search.js +5 -3
  587. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  588. package/dist/plugins/workflow-run-store-sql.js +11 -5
  589. package/dist/plugins/workspace-custody.d.ts +44 -0
  590. package/dist/plugins/workspace-custody.js +47 -0
  591. package/dist/principal-jwt.d.ts +4 -4
  592. package/dist/principal-jwt.js +20 -5
  593. package/dist/principal-shape.d.ts +41 -0
  594. package/dist/principal-shape.js +19 -0
  595. package/dist/project-identity.d.ts +8 -7
  596. package/dist/project-identity.js +40 -17
  597. package/dist/project-layer-key.d.ts +13 -2
  598. package/dist/project-layer-key.js +9 -1
  599. package/dist/question.d.ts +13 -23
  600. package/dist/question.js +21 -39
  601. package/dist/read-deny-floor-notice.d.ts +36 -0
  602. package/dist/read-deny-floor-notice.js +40 -0
  603. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  604. package/dist/request-declaration-disposition.js +39 -0
  605. package/dist/request-declaration-refusal.d.ts +35 -12
  606. package/dist/request-declaration-refusal.js +21 -9
  607. package/dist/request-form.d.ts +58 -0
  608. package/dist/request-form.js +72 -0
  609. package/dist/request-image-urls.d.ts +8 -2
  610. package/dist/request-image-urls.js +2 -1
  611. package/dist/request-images.d.ts +20 -0
  612. package/dist/request-images.js +59 -0
  613. package/dist/request-key-closure.d.ts +6 -7
  614. package/dist/request-key-closure.js +15 -2
  615. package/dist/resource-suspend.d.ts +7 -16
  616. package/dist/resource-suspend.js +1 -1
  617. package/dist/retired-name-host-notice.d.ts +21 -0
  618. package/dist/retired-name-host-notice.js +12 -0
  619. package/dist/rule-entry-list.d.ts +2 -2
  620. package/dist/rule-entry-list.js +3 -4
  621. package/dist/rule-issue-reading.d.ts +58 -0
  622. package/dist/rule-issue-reading.js +14 -0
  623. package/dist/rules-consent.d.ts +5 -3
  624. package/dist/rules-consent.js +1 -0
  625. package/dist/run-acceptance.d.ts +3 -1
  626. package/dist/run-acceptance.js +3 -0
  627. package/dist/run-cancel-card.d.ts +28 -0
  628. package/dist/run-cancel-card.js +19 -0
  629. package/dist/run-cancel-context.d.ts +10 -0
  630. package/dist/run-cancel-context.js +1 -0
  631. package/dist/run-local.d.ts +14 -6
  632. package/dist/run-local.js +117 -90
  633. package/dist/run-stale-default.d.ts +7 -0
  634. package/dist/run-stale-default.js +2 -0
  635. package/dist/runs.d.ts +56 -21
  636. package/dist/runs.js +73 -43
  637. package/dist/runtime-caps-resolver.d.ts +21 -6
  638. package/dist/runtime-caps-resolver.js +17 -4
  639. package/dist/runtime-governance.d.ts +2 -2
  640. package/dist/runtime-governance.js +5 -3
  641. package/dist/sealed-key-layout.d.ts +12 -5
  642. package/dist/sealed-key-layout.js +5 -0
  643. package/dist/sealed-key.d.ts +12 -2
  644. package/dist/sealed-key.js +115 -27
  645. package/dist/security.d.ts +128 -158
  646. package/dist/security.js +163 -59
  647. package/dist/sema-config-dir.d.ts +20 -0
  648. package/dist/sema-config-dir.js +25 -0
  649. package/dist/server-secret-env.d.ts +55 -25
  650. package/dist/server-secret-env.js +75 -22
  651. package/dist/session-agent.d.ts +3 -2
  652. package/dist/session-children-retire.d.ts +13 -8
  653. package/dist/session-children-retire.js +9 -7
  654. package/dist/session-deletion.d.ts +88 -0
  655. package/dist/session-deletion.js +8 -0
  656. package/dist/session-erase.d.ts +145 -0
  657. package/dist/session-erase.js +115 -0
  658. package/dist/session-error-wire.d.ts +5 -5
  659. package/dist/session-error-wire.js +1 -1
  660. package/dist/session-incarnation.d.ts +52 -5
  661. package/dist/session-incarnation.js +19 -2
  662. package/dist/session-policy-wire.d.ts +6 -3
  663. package/dist/session-policy-wire.js +11 -1
  664. package/dist/session-resident-background.d.ts +0 -71
  665. package/dist/session-resident-background.js +4 -3
  666. package/dist/session-row.d.ts +2 -1
  667. package/dist/session-rules-seat.d.ts +12 -0
  668. package/dist/session-rules-seat.js +19 -0
  669. package/dist/session-titler.d.ts +7 -15
  670. package/dist/session-titler.js +1 -1
  671. package/dist/session-workspace.d.ts +3 -3
  672. package/dist/spec-fields.d.ts +57 -3
  673. package/dist/spec-fields.js +72 -51
  674. package/dist/store-admission.d.ts +33 -0
  675. package/dist/store-admission.js +49 -0
  676. package/dist/store-posture.d.ts +141 -20
  677. package/dist/store-posture.js +205 -3
  678. package/dist/stored-request-hooks-m20.js +2 -2
  679. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  680. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  681. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  682. package/dist/stores-sql/checkpoint-store-sql.js +78 -49
  683. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  684. package/dist/stores-sql/file-history-store-sql.js +3 -5
  685. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  686. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  687. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  688. package/dist/stores-sql/pg-session-storage.js +54 -46
  689. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  690. package/dist/stores-sql/retention-store-sql.js +92 -27
  691. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  692. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  693. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  694. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  695. package/dist/stores-sql/tidb-session-storage.js +13 -8
  696. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  697. package/dist/stores-sql/tidb-session-store.js +69 -39
  698. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  699. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  700. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  701. package/dist/stores-sql/windowed-session-storage.js +9 -0
  702. package/dist/submission-exit.d.ts +50 -0
  703. package/dist/submission-exit.js +108 -0
  704. package/dist/task-a2a.d.ts +3 -8
  705. package/dist/task-a2a.js +28 -30
  706. package/dist/task-cwd.d.ts +43 -7
  707. package/dist/task-cwd.js +11 -0
  708. package/dist/task-mcp.d.ts +3 -3
  709. package/dist/task-mcp.js +4 -4
  710. package/dist/task-settings.d.ts +14 -10
  711. package/dist/task-settings.js +19 -7
  712. package/dist/terminal.d.ts +27 -43
  713. package/dist/terminal.js +49 -14
  714. package/dist/tool-approval.d.ts +173 -163
  715. package/dist/tool-approval.js +247 -232
  716. package/dist/trace/core-keyset-guard.d.ts +13 -6
  717. package/dist/trace/core-vocab-wire.d.ts +95 -0
  718. package/dist/trace/core-vocab-wire.js +15 -0
  719. package/dist/trace/engine-notice-wire.d.ts +24 -21
  720. package/dist/trace/engine-notice-wire.js +7 -3
  721. package/dist/trace/exit-seat.d.ts +30 -4
  722. package/dist/trace/exit-seat.js +40 -36
  723. package/dist/trace/extension-call-face.d.ts +3 -2
  724. package/dist/trace/extension-call-face.js +3 -1
  725. package/dist/trace/ledger-events.d.ts +4 -7
  726. package/dist/trace/ledger-sink.d.ts +4 -31
  727. package/dist/trace/ledger-sink.js +0 -11
  728. package/dist/trace/model-segment.d.ts +5 -5
  729. package/dist/trace/model-segment.js +5 -5
  730. package/dist/trace/project.d.ts +59 -44
  731. package/dist/trace/project.js +60 -26
  732. package/dist/trace/redact.d.ts +135 -27
  733. package/dist/trace/redact.js +884 -260
  734. package/dist/trace/self-minted-wire.d.ts +567 -20
  735. package/dist/trace/self-minted-wire.js +205 -24
  736. package/dist/trace/wire-projection-faces.d.ts +5 -6
  737. package/dist/trace/wire-projection-faces.js +2 -2
  738. package/dist/upstream-body.d.ts +23 -0
  739. package/dist/upstream-body.js +16 -0
  740. package/dist/url-refusal.d.ts +3 -3
  741. package/dist/url-refusal.js +11 -4
  742. package/dist/user-authored-text.d.ts +1 -1
  743. package/dist/user-input-ledger.d.ts +7 -8
  744. package/dist/user-input-ledger.js +1 -1
  745. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  746. package/dist/web-admin-client/apply-effective.js +33 -23
  747. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  748. package/dist/web-admin-client/apply-ledger.js +5 -2
  749. package/dist/web-admin-client/center-request.d.ts +2 -2
  750. package/dist/web-admin-client/center-request.js +15 -15
  751. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  752. package/dist/web-admin-client/effective-keys.js +1 -1
  753. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  754. package/dist/web-admin-client/entry-metadata.js +13 -0
  755. package/dist/web-admin-client/http-client.d.ts +1 -1
  756. package/dist/web-admin-client/http-client.js +23 -4
  757. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  758. package/dist/web-admin-client/mcp-revocation.js +2 -1
  759. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  760. package/dist/web-admin-client/read-warnings.js +1 -0
  761. package/dist/web-admin-client/restart-signal.js +8 -4
  762. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  763. package/dist/web-admin-client/types.d.ts +1 -2
  764. package/dist/workspace-space.d.ts +3 -2
  765. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  766. package/docs/error-text-lexicon.json +317 -0
  767. package/package.json +8 -3
  768. package/scripts/drain-check-local.mjs +118 -147
  769. package/scripts/drain-check.mysql.sql +22 -2
  770. package/scripts/drain-check.pg.sql +22 -2
  771. package/scripts/embed-minimal.mjs +183 -0
  772. package/wire-changes/server@7.148.0.json +1517 -0
  773. package/wire-changes/server@7.149.0.json +372 -0
  774. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  775. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  776. package/dist/http/memory-layer-reply.d.ts +0 -30
  777. package/dist/http/memory-layer-reply.js +0 -24
  778. package/dist/lsp/e2b-bridge.d.ts +0 -57
  779. package/dist/lsp/e2b-bridge.js +0 -139
  780. package/dist/lsp/e2b-manager.d.ts +0 -93
  781. package/dist/lsp/e2b-manager.js +0 -178
  782. package/dist/lsp/lsp-frames.d.ts +0 -14
  783. package/dist/lsp/lsp-frames.js +0 -25
  784. package/dist/lsp/manager.d.ts +0 -129
  785. package/dist/lsp/manager.js +0 -127
  786. package/dist/lsp/types.d.ts +0 -12
  787. package/dist/lsp/types.js +0 -2
  788. package/dist/lsp/ws-transport.d.ts +0 -40
  789. package/dist/lsp/ws-transport.js +0 -210
  790. package/dist/plain-string-record.js +0 -70
@@ -1,10 +1,13 @@
1
+ import { seatText } from "../../trace/exit-seat.js";
1
2
  import { liveToolEndForBacklog } from "../../trace/tool-output-media.js";
2
3
  import { redactHead, redactLedgerEventForRead } from "../../observability/run-terminal.js";
3
4
  import { z } from "zod";
4
5
  import { uuidv7, mintCheckpointToken, CheckpointError, policyCannotAnswer, validatePendingSteer, TASK_OUTPUT_REPLAY_KINDS, isSystemInjectionPriority } from "@sema-agent/core";
5
- import { isTerminalRunStatus, isParkedRunStatus, runProvenElsewhere } from "../../plugins/store-contracts.js";
6
- import { askOwnerAdmits, askRowCarriesOwner } from "../../plugins/approval-ask-store-sql.js";
6
+ import { isHolderDeathVerdict, isTerminalRunStatus, isParkedRunStatus, runProvenElsewhere } from "../../plugins/store-contracts.js";
7
+ import { askRowCarriesOwner } from "../../plugins/approval-ask-store-sql.js";
7
8
  import { LIVE_RUN_GATE_KINDS, TERMINAL_PARK_GATE_KINDS } from "../../plugins/checkpoint-store-face.js";
9
+ import { runCancelCardOf } from "../../run-cancel-card.js";
10
+ import { CARD_EXPIRE_OUTCOME, expireCardUnderStoredScope } from "../../card-settle-stored-scope.js";
8
11
  import { redactSecrets } from "../../trace/redact.js";
9
12
  import { isUuidV7, encodeCheckpointScope } from "../../security.js";
10
13
  import { redactSteerIn, STEER_IN_MAX_CHARS, STEER_IN_MAX_REQUEST_CHARS } from "../../orchestration/workflow-agent-steer.js";
@@ -14,7 +17,7 @@ import { streamSseLog } from "../sse-log.js";
14
17
  import { bindSseLifecycle } from "../sse-lifecycle.js";
15
18
  import { buildApprovalPreamble, buildApprovalPreambleSseFrames, readClosedWordSeat, storedCardDemandsAPerson } from "../../approval-card.js";
16
19
  import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, DECIDED_BY_NOT_IN_PROOF, POLICY_CANNOT_ALLOW_PERSON_ASK } from "../../host-decision.js";
17
- import { ASK_DECISION_CONSUMER_ABSENT, approvalPreambleReplays, outcomeOfDecidedRow, presentedApprovalFrameFamily, resolveStreamApprovalGate } from "../../tool-approval.js";
20
+ import { ASK_DECISION_CONSUMER_ABSENT, approvalPreambleReplays, outcomeOfDecidedRow, parkSessionOf, presentedApprovalFrameFamily, resolveStreamApprovalGate } from "../../tool-approval.js";
18
21
  import { MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt } from "../../approval-ask-machine.js";
19
22
  import { askRowEndingCause } from "../../approval-deny-reasons.js";
20
23
  import { normalizeRunEventType, screenedStoredEventData } from "../../trace/project.js";
@@ -22,21 +25,24 @@ import { invalidJsonError, sendJson, sendError, sendHttpError, sseHeaders } from
22
25
  import { mintCancelledResult } from "../../run-cancel-context.js";
23
26
  import { acceptedInputKindOf } from "../../user-input-ledger.js";
24
27
  import { INJECTION_TIERS } from "../../trace/injection-tier.js";
25
- import { headerStr, gatedPrincipal, explicitOperatorOk, sendPrincipalRefusal, runIdentityOf } from "../principal-gate.js";
28
+ import { headerStr, gatedSubject, explicitOperatorOk, sendPrincipalRefusal, runIdentityOf } from "../principal-gate.js";
26
29
  import { ActorAssertionWire } from "@sema-agent/settings-schema";
27
30
  import * as facts from "../../capability-facts.js";
28
31
  import { assertNever } from "../route-ctx.js";
29
32
  import { readRunFace } from "../run-read-face.js";
30
33
  import { replayOfExistingRun } from "../submit-replay.js";
31
34
  import { mintAndDriveDurableRun } from "../durable-run-leg.js";
32
- import { RUN_NOT_FOUND_MESSAGE, runNotFoundMessage } from "../route-ctx.js";
33
- import { withPrincipal } from "../../observability/principal-context.js";
34
- import { readResumeCtx } from "../resume-ctx-read.js";
35
+ import { SUBMISSION_CLAIM_FACE } from "../execution-context.js";
36
+ import { admitRunById, admitRunRow, enter, runRowAt } from "../owner-access.js";
37
+ import { keyAdmission, ownerCellOf, recoveredSubject } from "../../owner-faces.js";
38
+ import { personOf } from "../../owner-brands.js";
39
+ import { withSubject } from "../../observability/principal-context.js";
40
+ import { readResumeCtx, resumeCtxUnreadableAnswer } from "../resume-ctx-read.js";
35
41
  import { storedBodyReplayAnswer, storedBodyReplayLogFields } from "../checkpoint-ctx.js";
36
42
  import { headReadOf } from "../../session-incarnation.js";
37
43
  import { serviceVersion } from "../../service-version.js";
38
44
  import { storedBodyReplayRefusal } from "../stored-body-replay.js";
39
- import { steerBodyKeyIssue } from "../../request-key-closure.js";
45
+ import { haltBodyIssue, steerBodyKeyIssue } from "../../request-key-closure.js";
40
46
  import { fieldConflictFacts } from "../../field-conflict.js";
41
47
  const STEER_PRIORITY_WORDS = INJECTION_TIERS.map((tier) => `'${tier}'`);
42
48
  const STEER_PRIORITY_UNION = STEER_PRIORITY_WORDS.join(" | ");
@@ -78,28 +84,16 @@ export function projectDecisionActor(raw) {
78
84
  const parsed = AskDecisionActorSchema.safeParse(raw);
79
85
  return parsed.success ? parsed.data : undefined;
80
86
  }
81
- async function subagentReadGate(req, res, ctx, runId, search) {
87
+ async function subagentReadGate(req, res, ctx, runId, route) {
82
88
  const { deps } = ctx;
83
- const principal = gatedPrincipal(req, deps.config);
84
- if (deps.config.requirePrincipal && principal === undefined) {
85
- sendPrincipalRefusal(res, req, deps.config);
89
+ const entry = enter(req, res, deps, route);
90
+ if (entry === undefined)
86
91
  return null;
87
- }
88
- const trusted = explicitOperatorOk(principal, deps.config);
89
- const run = await deps.runStore.getRun(runId);
90
- if (!run) {
91
- sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
92
- return null;
93
- }
94
- if (!trusted && !ctx.helpers.runOwnerOk(req, res, run.owner)) {
92
+ const admitted = (await admitRunById(entry, res, deps.runStore, runId));
93
+ if (admitted === undefined)
95
94
  return null;
96
- }
97
- const callerSession = new URLSearchParams(search).get("session");
98
- if (!trusted && run.sessionId && callerSession !== run.sessionId) {
99
- sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
100
- return null;
101
- }
102
- return { run, trusted };
95
+ const trusted = admitted.quals.has("operator");
96
+ return { run: admitted.row, trusted };
103
97
  }
104
98
  function sendHandleMiss(res, run, thisInstanceId) {
105
99
  if (isTerminalRunStatus(run.status)) {
@@ -112,7 +106,7 @@ function sendHandleMiss(res, run, thisInstanceId) {
112
106
  }
113
107
  return false;
114
108
  }
115
- async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
109
+ async function streamRunEvents(req, res, deps, runStore, taskId) {
116
110
  await streamSseLog(req, res, {
117
111
  preamble: async (signal) => {
118
112
  const gate = resolveStreamApprovalGate({
@@ -143,7 +137,7 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
143
137
  onPreambleFailure: (reason, err) => deps.logger?.warn?.("approval_preamble_failed", { taskId, reason, face: "run.events", error: err instanceof Error ? err.message : String(err ?? "") }),
144
138
  statusOf: async (id) => {
145
139
  const run = await runStore.getRun(id);
146
- return run ? { status: run.status, updatedAt: run.updatedAt } : undefined;
140
+ return run ? runRowAt("run-events", runStore, run) : undefined;
147
141
  },
148
142
  getEvents: (id, after) => runStore.getEvents(id, after),
149
143
  formatEvent: (ev) => {
@@ -152,13 +146,16 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
152
146
  const data = screenedStoredEventData(type, redacted);
153
147
  return { id: ev.seq, event: type, data: { type, ...(data ?? {}) } };
154
148
  },
155
- staleFrame: () => ({ event: "failed", data: { type: "failed", errorMessage: "run stalled (instance lost?)" } }),
156
- }, taskId, staleMs);
149
+ isTerminalEvent: (ev) => ev.type === "done" || ev.type === "failed",
150
+ closingFrameOf: (row, deliveredTerminal) => !deliveredTerminal && isHolderDeathVerdict(row)
151
+ ? { event: "failed", data: { type: "failed", ...(row.error !== null ? { errorMessage: seatText("trace-frame-text", row.error) } : {}), errorCode: row.errorCode } }
152
+ : undefined,
153
+ }, taskId);
157
154
  }
158
155
  function sendSteerReplayRefusal(res, refusal) {
159
156
  const detail = refusal?.detail;
160
157
  const differs = detail !== null && typeof detail === "object" ? readClosedWordSeat(detail, "differs") : undefined;
161
- sendError(res, 409, "steering.duplicate_input_id", refusal instanceof Error ? refusal.message : "this steering input id was already accepted with different values", differs !== undefined ? { detail: { differs } } : undefined);
158
+ sendError(res, 409, "steering.duplicate_input_id", refusal instanceof Error ? refusal.message : "this steering input id was already accepted with different values", differs !== undefined ? { differs } : undefined);
162
159
  }
163
160
  async function acceptLiveUserInput(deps, res, at) {
164
161
  if (!deps.userInputLedger)
@@ -190,7 +187,7 @@ async function relayAcceptedInput(deps, acceptance, call) {
190
187
  export async function handleRuns(req, res, match, ctx) {
191
188
  const { deps } = ctx;
192
189
  const { idemCache, inflightRuns, preemptableRuns, steerableRuns, wakeParkMints } = ctx.registry;
193
- const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied, runOwnerOk, runSessionAcceptOk } = ctx.helpers;
190
+ const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied } = ctx.helpers;
194
191
  const { prepareSpec } = ctx.legs;
195
192
  const source = ctx.req.source;
196
193
  if (match.decl.id === "runs-submit") {
@@ -201,7 +198,7 @@ export async function handleRuns(req, res, match, ctx) {
201
198
  }
202
199
  const runStore = runs.runStore;
203
200
  const rawIdem = headerStr(req.headers["idempotency-key"]);
204
- const submitter = gatedPrincipal(req, deps.config);
201
+ const submitter = gatedSubject(req, deps.config);
205
202
  const keyedBody = rawIdem ? await readJson(req) : undefined;
206
203
  const idem = rawIdem ? submissionIdemOf(rawIdem, idemCallerOf(req, ctx), keyedBody) : undefined;
207
204
  if (idem) {
@@ -213,14 +210,19 @@ export async function handleRuns(req, res, match, ctx) {
213
210
  const inflight = idemCache.peek(inflightKeyOf(idem, "durable", clientTaskId));
214
211
  const keyedRow = inflight ? undefined : await runStore.getRunByIdem(idem.key);
215
212
  if (inflight || keyedRow) {
216
- const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, { principal: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) }, "durable", deps, runStore);
213
+ const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) }, "durable", deps, runStore);
217
214
  sendJson(res, resp.status, resp.body);
218
215
  return;
219
216
  }
220
217
  }
221
218
  if (rateLimited(req, res) || quotaExceeded(req, res))
222
219
  return;
223
- const prepared = await prepareSpec(req, res, keyedBody);
220
+ const body = rawIdem ? keyedBody : await readJson(req);
221
+ if (!idem && clientTaskIdOf(body) === false) {
222
+ sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
223
+ return;
224
+ }
225
+ const prepared = await prepareSpec(req, res, body);
224
226
  if (!prepared)
225
227
  return;
226
228
  try {
@@ -241,12 +243,11 @@ export async function handleRuns(req, res, match, ctx) {
241
243
  return;
242
244
  }
243
245
  const runStore = runs.runStore;
244
- if (deps.config.requirePrincipal && !gatedPrincipal(req, deps.config)) {
245
- sendPrincipalRefusal(res, req, deps.config);
246
+ const entry = enter(req, res, deps, match.decl.id);
247
+ if (entry === undefined)
246
248
  return;
247
- }
248
249
  let run;
249
- let notFound;
250
+ let pathId;
250
251
  if (match.decl.id === "runs-by-idem") {
251
252
  const rawKey = new URLSearchParams(match.search).get("idempotencyKey");
252
253
  if (!rawKey) {
@@ -254,27 +255,20 @@ export async function handleRuns(req, res, match, ctx) {
254
255
  return;
255
256
  }
256
257
  run = await runStore.getRunByIdem(idemKeyOf(rawKey, idemCallerOf(req, ctx), "run"));
257
- notFound = RUN_NOT_FOUND_MESSAGE;
258
258
  }
259
259
  else {
260
- const taskId = match.params.taskId;
261
- run = await runStore.getRun(taskId);
262
- notFound = runNotFoundMessage(taskId);
263
- }
264
- if (!run) {
265
- sendError(res, 404, "not_found.run", notFound);
266
- return;
260
+ pathId = match.params.taskId;
261
+ run = await runStore.getRun(pathId);
267
262
  }
268
- const taskId = run.taskId;
269
- if (!runOwnerOk(req, res, run.owner))
270
- return;
271
- if (!runSessionAcceptOk(req, res, run, match.decl.id === "run-events" ? "run.events" : "run.poll"))
263
+ const admitted = await admitRunRow(entry, res, runStore, run, pathId);
264
+ if (admitted === undefined)
272
265
  return;
266
+ const taskId = admitted.row.taskId;
273
267
  if (match.decl.id === "run-events") {
274
- await streamRunEvents(req, res, deps, runStore, taskId, deps.config.runStaleSec * 1000);
268
+ await streamRunEvents(req, res, deps, runStore, taskId);
275
269
  }
276
270
  else {
277
- sendJson(res, 200, await readRunFace(deps, runStore, run));
271
+ sendJson(res, 200, await readRunFace(deps, runStore, admitted.row));
278
272
  }
279
273
  return;
280
274
  }
@@ -285,29 +279,22 @@ export async function handleRuns(req, res, match, ctx) {
285
279
  return;
286
280
  }
287
281
  const runStore = runs.runStore;
288
- if (deps.config.requirePrincipal && !gatedPrincipal(req, deps.config)) {
289
- sendPrincipalRefusal(res, req, deps.config);
282
+ const entry = enter(req, res, deps, match.decl.id);
283
+ if (entry === undefined)
290
284
  return;
291
- }
292
285
  const taskId = match.params.taskId;
293
- const run = await runStore.getRun(taskId);
294
- if (!run) {
295
- sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
296
- return;
297
- }
298
- if (!runOwnerOk(req, res, run.owner))
299
- return;
300
- if (!runSessionAcceptOk(req, res, run, "run.cancel"))
286
+ const cancelAdmitted = (await admitRunById(entry, res, runStore, taskId));
287
+ if (cancelAdmitted === undefined)
301
288
  return;
289
+ const run = cancelAdmitted.row;
302
290
  const rs = runStore;
303
- const cancelSuspended = async () => {
291
+ const cancelSuspended = async (parked) => {
304
292
  const cs = deps.checkpointStore;
305
293
  let note = "cancelled while suspended (pending approval settled)";
306
294
  if (cs) {
307
- const token = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: LIVE_RUN_GATE_KINDS });
295
+ const token = await runCancelCardOf(cs, run.sessionId);
308
296
  if (token) {
309
- const cp = await cs.get(token);
310
- const won = cp ? await cs.expire(token, cp.scope) : false;
297
+ const won = (await expireCardUnderStoredScope(cs, token)) === CARD_EXPIRE_OUTCOME.expired;
311
298
  if (!won) {
312
299
  const now = await rs.getRun(taskId);
313
300
  const st = now?.status;
@@ -341,7 +328,7 @@ export async function handleRuns(req, res, match, ctx) {
341
328
  }
342
329
  const err = note;
343
330
  try {
344
- const result = mintCancelledResult({ taskId, sessionId: run.sessionId, startedAtMs: Date.parse(run.createdAt), message: err, cause: "cancel_verb" });
331
+ const result = mintCancelledResult({ taskId, sessionId: run.sessionId, startedAtMs: Date.parse(run.createdAt), message: err, cause: "cancel_verb", parkedResult: parked });
345
332
  let lastErr;
346
333
  for (let attempt = 0;; attempt++) {
347
334
  try {
@@ -376,7 +363,7 @@ export async function handleRuns(req, res, match, ctx) {
376
363
  for (let attempt = 0; !flagged; attempt++) {
377
364
  const now = await runStore.getRun(taskId);
378
365
  if (now !== undefined && isParkedRunStatus(now.status)) {
379
- await cancelSuspended();
366
+ await cancelSuspended(now.result);
380
367
  return;
381
368
  }
382
369
  if (now?.status === "running" && attempt < CANCEL_RECLASSIFY_ATTEMPTS) {
@@ -394,7 +381,7 @@ export async function handleRuns(req, res, match, ctx) {
394
381
  sendJson(res, 202, { taskId, status: "cancelling", cancelRequested: true });
395
382
  }
396
383
  else if (isParkedRunStatus(run.status)) {
397
- await cancelSuspended();
384
+ await cancelSuspended(run.result);
398
385
  }
399
386
  else {
400
387
  sendJson(res, 202, { taskId, status: run.status, cancelRequested: run.cancelRequested, note: "run already terminal — cancel is a no-op" });
@@ -410,11 +397,9 @@ export async function handleRuns(req, res, match, ctx) {
410
397
  return;
411
398
  }
412
399
  const runStore = runs.runStore;
413
- const principal = gatedPrincipal(req, deps.config);
414
- if (deps.config.requirePrincipal && principal === undefined) {
415
- sendPrincipalRefusal(res, req, deps.config);
400
+ const entry = enter(req, res, deps, match.decl.id);
401
+ if (entry === undefined)
416
402
  return;
417
- }
418
403
  const taskId = match.params.taskId;
419
404
  const body = ((await readJson(req)) ?? {});
420
405
  if (typeof body.text !== "string" || body.text.length === 0) {
@@ -440,7 +425,6 @@ export async function handleRuns(req, res, match, ctx) {
440
425
  const priority = body.priority;
441
426
  const steerIdemRaw = headerStr(req.headers["idempotency-key"]);
442
427
  const messageId = steerIdemRaw ? `idem-${idemKeyOf(steerIdemRaw, idemCallerOf(req, ctx), "run").slice(0, 32)}` : uuidv7();
443
- const operator = explicitOperatorOk(principal, deps.config);
444
428
  const steerInput = () => ({
445
429
  text,
446
430
  trusted: false,
@@ -457,15 +441,10 @@ export async function handleRuns(req, res, match, ctx) {
457
441
  }
458
442
  throw e;
459
443
  }
460
- const run = await runStore.getRun(taskId);
461
- if (!run) {
462
- sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
463
- return;
464
- }
465
- if (!operator && !runOwnerOk(req, res, run.owner))
466
- return;
467
- if (!runSessionAcceptOk(req, res, run, "run.steer"))
444
+ const steerAdmitted = (await admitRunById(entry, res, runStore, taskId));
445
+ if (steerAdmitted === undefined)
468
446
  return;
447
+ const run = steerAdmitted.row;
469
448
  let parkQueueFull;
470
449
  let parkDuplicateKey;
471
450
  const tryPark = async () => {
@@ -473,7 +452,7 @@ export async function handleRuns(req, res, match, ctx) {
473
452
  if (!park.available)
474
453
  return "no-store";
475
454
  const cs = park.checkpointStore;
476
- const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS };
455
+ const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS, axis: "run" };
477
456
  const scope = await cs.peekPendingScope(run.sessionId, parkBinding);
478
457
  if (scope === null || scope === undefined)
479
458
  return "no-checkpoint";
@@ -583,7 +562,7 @@ export async function handleRuns(req, res, match, ctx) {
583
562
  return;
584
563
  }
585
564
  const prior = wakeParkMints.get(run.sessionId) ?? Promise.resolve();
586
- const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false };
565
+ const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false, unreadableCtx: false };
587
566
  const parkOnce = async (t, sc) => {
588
567
  try {
589
568
  if (await deps.checkpointStore.setPendingSteer(t, sc, steerInput()))
@@ -638,6 +617,10 @@ export async function handleRuns(req, res, match, ctx) {
638
617
  mintResult.unsealableCtx = resumeRead;
639
618
  return;
640
619
  }
620
+ if (resumeRead.kind === "unreadable") {
621
+ mintResult.unreadableCtx = true;
622
+ return;
623
+ }
641
624
  if (resumeRead.kind === "absent") {
642
625
  mintResult.noResumeCtx = true;
643
626
  return;
@@ -661,7 +644,11 @@ export async function handleRuns(req, res, match, ctx) {
661
644
  createdAt: Date.now(),
662
645
  sourceSessionId: run.sessionId,
663
646
  });
664
- const stillRead = await readResumeCtx(cs.getCtx(run.sessionId), { sessionId: run.sessionId, opener: deps.checkpointCtxSealing });
647
+ const withdrawThenRethrow = async (e) => {
648
+ await withdrawWakeCard(wakeToken, cpScope, "resume_context_defect");
649
+ throw e;
650
+ };
651
+ const stillRead = await readResumeCtx(cs.getCtx(run.sessionId), { sessionId: run.sessionId, opener: deps.checkpointCtxSealing }).catch(withdrawThenRethrow);
665
652
  if (stillRead.kind === "corrupt" || stillRead.kind === "unsealable") {
666
653
  await withdrawWakeCard(wakeToken, cpScope, stillRead.kind === "corrupt" ? "resume_context_corrupt" : "resume_context_unsealable");
667
654
  if (stillRead.kind === "corrupt")
@@ -670,12 +657,17 @@ export async function handleRuns(req, res, match, ctx) {
670
657
  mintResult.unsealableCtx = stillRead;
671
658
  return;
672
659
  }
660
+ if (stillRead.kind === "unreadable") {
661
+ await withdrawWakeCard(wakeToken, cpScope, "resume_context_unreadable");
662
+ mintResult.unreadableCtx = true;
663
+ return;
664
+ }
673
665
  if (stillRead.kind !== "ok") {
674
666
  await withdrawWakeCard(wakeToken, cpScope, "resume_context_absent");
675
667
  mintResult.noResumeCtx = true;
676
668
  return;
677
669
  }
678
- const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest" }).catch(() => null);
670
+ const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest", axis: "run" }).catch(() => null);
679
671
  if (winner !== null && winner !== wakeToken) {
680
672
  await withdrawWakeCard(wakeToken, cpScope, "converged_on_winner");
681
673
  await parkOnce(winner, cpScope);
@@ -708,6 +700,11 @@ export async function handleRuns(req, res, match, ctx) {
708
700
  sendError(res, 409, "conflict.checkpoint_ctx_unsealable", "run already ended and this session's stored resume context holds credentials this server cannot unseal (reason says why) — nothing was queued, because POST /v1/sessions/:id/wake could not resume it; restore the sealed-key directory that sealed them, restart this server (it reads its keys only at startup) and steer again, or submit a new task instead", { field: mintResult.unsealableCtx.field, reason: mintResult.unsealableCtx.reason });
709
701
  return;
710
702
  }
703
+ if (mintResult.unreadableCtx) {
704
+ const { status, body: { error, errorCode, ...facts } } = resumeCtxUnreadableAnswer();
705
+ sendError(res, status, errorCode, error, facts);
706
+ return;
707
+ }
711
708
  if (mintResult.unservable !== undefined) {
712
709
  deps.logger?.warn?.("steer_wake_park_refused_stored_body", { taskId, sessionId: run.sessionId, ...storedBodyReplayLogFields(mintResult.unservable) });
713
710
  const { status, body: { error, errorCode, ...rest } } = storedBodyReplayAnswer(mintResult.unservable, serviceVersion(), false);
@@ -735,62 +732,23 @@ export async function handleRuns(req, res, match, ctx) {
735
732
  return;
736
733
  }
737
734
  const runStore = runs.runStore;
738
- const principal = gatedPrincipal(req, deps.config);
739
- if (deps.config.requirePrincipal && principal === undefined) {
740
- sendPrincipalRefusal(res, req, deps.config);
735
+ const entry = enter(req, res, deps, match.decl.id);
736
+ if (entry === undefined)
741
737
  return;
742
- }
743
738
  const taskId = match.params.taskId;
744
- const interruptRaw = await readJson(req);
745
- const interruptNormalized = interruptRaw === null || interruptRaw === undefined ? {} : interruptRaw;
746
- if (typeof interruptNormalized !== "object" || Array.isArray(interruptNormalized)) {
747
- sendError(res, 400, "request.body_shape", "body must be {} (bare halt: cut the in-flight turn and stop the run at this boundary) or { text: string (non-empty) } (cut + steer: the text reaches the model after the cut)");
748
- return;
749
- }
750
- const interruptBody = interruptNormalized;
751
- const interruptBare = !("text" in interruptBody);
752
- let text = "";
753
- if (!interruptBare) {
754
- if (typeof interruptBody.text !== "string" || interruptBody.text.length === 0) {
755
- sendError(res, 400, "request.body_shape", "body must be {} (bare halt: cut the in-flight turn and stop the run at this boundary) or { text: string (non-empty) } (cut + steer: the text reaches the model after the cut)");
756
- return;
757
- }
758
- text = interruptBody.text;
759
- }
760
- const keyIssue = steerBodyKeyIssue(interruptBody, "interrupt");
761
- if (keyIssue) {
762
- sendError(res, 400, "request.body_shape", keyIssue.message, { unknownKeys: keyIssue.unknownKeys, unsupportedKeys: keyIssue.unsupportedKeys });
739
+ const haltIssue = haltBodyIssue(await readJson(req));
740
+ if (haltIssue) {
741
+ sendError(res, 400, "request.body_shape", haltIssue.message, { unknownKeys: haltIssue.unknownKeys, unsupportedKeys: haltIssue.unsupportedKeys });
763
742
  return;
764
743
  }
765
- const interruptIdemRaw = headerStr(req.headers["idempotency-key"]);
766
- const interruptInputId = interruptIdemRaw ? `idem-${idemKeyOf(interruptIdemRaw, idemCallerOf(req, ctx), "run").slice(0, 32)}` : uuidv7();
767
- const interruptMessageId = interruptInputId;
768
- const operator = explicitOperatorOk(principal, deps.config);
769
- if (!interruptBare) {
770
- try {
771
- validatePendingSteer({ text, trusted: false, inputId: interruptInputId });
772
- }
773
- catch (e) {
774
- if (e instanceof CheckpointError && e.code === "steering.invalid_content") {
775
- sendError(res, 422, "steering.invalid_content", e.message);
776
- return;
777
- }
778
- throw e;
779
- }
780
- }
781
- const run = await runStore.getRun(taskId);
782
- if (!run) {
783
- sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
784
- return;
785
- }
786
- if (!operator && !runOwnerOk(req, res, run.owner))
787
- return;
788
- if (!runSessionAcceptOk(req, res, run, "run.interrupt"))
744
+ const interruptAdmitted = (await admitRunById(entry, res, runStore, taskId));
745
+ if (interruptAdmitted === undefined)
789
746
  return;
747
+ const run = interruptAdmitted.row;
790
748
  const sendInterruptNotRunning = (error) => sendError(res, 409, "steering.not_running", error);
791
749
  const sendNoLiveTurn = (status, streamJustSettled) => {
792
750
  if (isParkedRunStatus(status)) {
793
- sendError(res, 409, "interrupt.nothing_in_flight", "run is waiting on a pending decision — there is no in-flight turn to interrupt; to deliver input use POST /v1/runs/:id/steer (it waits with the pending decision and is delivered when the run resumes)");
751
+ sendError(res, 409, "interrupt.nothing_in_flight", "run is waiting on a pending decision — there is no in-flight turn to interrupt; answer that decision to let the run resume, or POST /v1/runs/:id/cancel to stop the run");
794
752
  return;
795
753
  }
796
754
  if (streamJustSettled) {
@@ -814,53 +772,23 @@ export async function handleRuns(req, res, match, ctx) {
814
772
  sendNoLiveTurn(run.status, false);
815
773
  return;
816
774
  }
817
- if (interruptBare) {
818
- let haltReceipt;
819
- try {
820
- haltReceipt = await liveStream.halt();
821
- }
822
- catch (e) {
823
- if (e.code !== "steering.not_running")
824
- throw e;
825
- const freshRun = await runStore.getRun(taskId).catch(() => undefined);
826
- sendNoLiveTurn(freshRun?.status ?? run.status, true);
827
- return;
828
- }
829
- sendJson(res, 202, {
830
- taskId,
831
- status: run.status,
832
- turnCut: haltReceipt.turnCut,
833
- note: "halt accepted — cut + stop: turnCut reports whether THIS call cut a live turn (repeat calls answer turnCut:false once the stop is latched). A halt that CONSUMES (it cut a turn, or stopped the loop at a boundary) ends the run at that boundary as status:\"completed\" with haltedByUser:true — resume by submitting the next objective on the same session. Each real cut is marked by a task.turn_interrupted event with detail.cause:\"user_halt\". A halt racing the run's natural last moments consumes NOTHING: the run's own ending stands (completed with the answer as result, or failed when the model's own abort owns the final) and the result does NOT carry haltedByUser — the only trace of that halt is a task.halt_unconsumed engine notice.",
834
- });
835
- return;
836
- }
837
- const acceptance = await acceptLiveUserInput(deps, res, { messageId: interruptMessageId, sessionId: run.sessionId, taskId, leg: liveStream, tier: "now" });
838
- if (acceptance === "refused")
839
- return;
775
+ let haltReceipt;
840
776
  try {
841
- await relayAcceptedInput(deps, acceptance, () => liveStream.steer(text, { trusted: false, priority: "now", ...(interruptInputId !== undefined ? { inputId: interruptInputId } : {}) }));
777
+ haltReceipt = await liveStream.halt();
842
778
  }
843
779
  catch (e) {
844
- const code = e.code;
845
- if (code === "steering.invalid_content") {
846
- sendError(res, 422, "steering.invalid_content", e instanceof Error ? e.message : "invalid steering content");
847
- return;
848
- }
849
- if (code === "steering.blocked_by_hook") {
850
- sendError(res, 422, "steering.blocked_by_hook", e instanceof Error ? e.message : "the deployment's userPromptSubmit hook refused this input (fail-closed)");
851
- return;
852
- }
853
- if (code === "steering.duplicate_input_id") {
854
- sendSteerReplayRefusal(res, e);
855
- return;
856
- }
857
- if (code !== "steering.not_running")
780
+ if (e.code !== "steering.not_running")
858
781
  throw e;
859
782
  const freshRun = await runStore.getRun(taskId).catch(() => undefined);
860
783
  sendNoLiveTurn(freshRun?.status ?? run.status, true);
861
784
  return;
862
785
  }
863
- sendJson(res, 202, { taskId, status: run.status, delivery: "queued-immediate", messageId: interruptMessageId, note: "interrupt accepted — the cut is best-effort: a task.turn_interrupted event on the run stream is the proof a turn was actually cut; with nothing in flight the text lands at the next turn boundary" });
786
+ sendJson(res, 202, {
787
+ taskId,
788
+ status: run.status,
789
+ turnCut: haltReceipt.turnCut,
790
+ note: "halt accepted — cut + stop: turnCut reports whether THIS call cut a live turn (repeat calls answer turnCut:false once the stop is latched). A halt that CONSUMES (it cut a turn, or stopped the loop at a boundary) ends the run at that boundary as status:\"completed\" with haltedByUser:true — resume by submitting the next objective on the same session. Each real cut is marked by a task.turn_interrupted event with detail.cause:\"user_halt\". A halt racing the run's natural last moments consumes NOTHING: the run's own ending stands (completed with the answer as result, or failed when the model's own abort owns the final) and the result does NOT carry haltedByUser — the only trace of that halt is a task.halt_unconsumed engine notice.",
791
+ });
864
792
  return;
865
793
  }
866
794
  if (match.decl.id === "run-compact") {
@@ -872,22 +800,14 @@ export async function handleRuns(req, res, match, ctx) {
872
800
  return;
873
801
  }
874
802
  const runStore = runs.runStore;
875
- const principal = gatedPrincipal(req, deps.config);
876
- if (deps.config.requirePrincipal && principal === undefined) {
877
- sendPrincipalRefusal(res, req, deps.config);
803
+ const entry = enter(req, res, deps, match.decl.id);
804
+ if (entry === undefined)
878
805
  return;
879
- }
880
806
  const taskId = match.params.taskId;
881
- const run = await runStore.getRun(taskId);
882
- if (!run) {
883
- sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
884
- return;
885
- }
886
- const operator = explicitOperatorOk(principal, deps.config);
887
- if (!operator && !runOwnerOk(req, res, run.owner))
888
- return;
889
- if (!runSessionAcceptOk(req, res, run, "run.compact"))
807
+ const compactAdmitted = (await admitRunById(entry, res, runStore, taskId));
808
+ if (compactAdmitted === undefined)
890
809
  return;
810
+ const run = compactAdmitted.row;
891
811
  const parsed = await readJson(req);
892
812
  if (parsed === null || typeof parsed !== "object") {
893
813
  sendHttpError(res, invalidJsonError("not_object"));
@@ -927,27 +847,19 @@ export async function handleRuns(req, res, match, ctx) {
927
847
  return;
928
848
  }
929
849
  const runStore = runs.runStore;
930
- const principal = gatedPrincipal(req, deps.config);
931
- if (deps.config.requirePrincipal && principal === undefined) {
932
- sendPrincipalRefusal(res, req, deps.config);
850
+ const entry = enter(req, res, deps, match.decl.id);
851
+ if (entry === undefined)
933
852
  return;
934
- }
935
853
  const taskId = match.params.taskId;
936
854
  const body = ((await readJson(req)) ?? {});
937
855
  if (typeof body.toolCallId !== "string" || body.toolCallId.length === 0 || body.toolCallId.length > 256) {
938
856
  sendError(res, 400, "request.body_shape", "body must be { toolCallId: string (non-empty, ≤256 chars) }");
939
857
  return;
940
858
  }
941
- const run = await runStore.getRun(taskId);
942
- if (!run) {
943
- sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
944
- return;
945
- }
946
- const operator = explicitOperatorOk(principal, deps.config);
947
- if (!operator && !runOwnerOk(req, res, run.owner))
948
- return;
949
- if (!runSessionAcceptOk(req, res, run, "run.detach"))
859
+ const detachAdmitted = (await admitRunById(entry, res, runStore, taskId));
860
+ if (detachAdmitted === undefined)
950
861
  return;
862
+ const run = detachAdmitted.row;
951
863
  const live = steerableRuns.get(taskId);
952
864
  if (!live) {
953
865
  sendError(res, 409, "detach.not_running", run.status === "running" ? "run is active on another replica — detach is replica-local" : `run is ${run.status} — no running tool call to detach`);
@@ -961,7 +873,7 @@ export async function handleRuns(req, res, match, ctx) {
961
873
  }
962
874
  export async function handleRunVerbs(req, res, match, ctx) {
963
875
  const { deps } = ctx;
964
- const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode, runOwnerOk, runSessionAcceptOk } = ctx.helpers;
876
+ const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode } = ctx.helpers;
965
877
  if (match.decl.id === "run-subagent-output") {
966
878
  const outputFact = facts.subagentOutput(deps);
967
879
  if (!outputFact.available) {
@@ -976,7 +888,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
976
888
  sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
977
889
  return;
978
890
  }
979
- const gated = await subagentReadGate(req, res, ctx, runId, match.search);
891
+ const gated = await subagentReadGate(req, res, ctx, runId, match.decl.id);
980
892
  if (!gated)
981
893
  return;
982
894
  const { run } = gated;
@@ -1004,7 +916,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1004
916
  sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
1005
917
  return;
1006
918
  }
1007
- const gatedTail = await subagentReadGate(req, res, ctx, runId, match.search);
919
+ const gatedTail = await subagentReadGate(req, res, ctx, runId, match.decl.id);
1008
920
  if (!gatedTail)
1009
921
  return;
1010
922
  const { run } = gatedTail;
@@ -1072,7 +984,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1072
984
  sendError(res, 400, "request.path_malformed", "malformed task path (invalid percent-encoding)");
1073
985
  return;
1074
986
  }
1075
- const gatedB = await subagentReadGate(req, res, ctx, runId, match.search);
987
+ const gatedB = await subagentReadGate(req, res, ctx, runId, match.decl.id);
1076
988
  if (!gatedB)
1077
989
  return;
1078
990
  const { run } = gatedB;
@@ -1137,11 +1049,9 @@ export async function handleRunVerbs(req, res, match, ctx) {
1137
1049
  return;
1138
1050
  }
1139
1051
  const runStore = steerFact.runStore;
1140
- const principal = gatedPrincipal(req, deps.config);
1141
- if (deps.config.requirePrincipal && principal === undefined) {
1142
- sendPrincipalRefusal(res, req, deps.config);
1052
+ const entry = enter(req, res, deps, match.decl.id);
1053
+ if (entry === undefined)
1143
1054
  return;
1144
- }
1145
1055
  const runId = safeDecode(match.params.runId);
1146
1056
  const target = safeDecode(match.params.sub);
1147
1057
  if (runId === null || target === null) {
@@ -1164,16 +1074,10 @@ export async function handleRunVerbs(req, res, match, ctx) {
1164
1074
  sendError(res, 413, "steer.content_too_large", `content exceeds ${STEER_IN_MAX_REQUEST_CHARS} characters (got ${body.content.length}); note only the first ${STEER_IN_MAX_CHARS} are delivered anyway`);
1165
1075
  return;
1166
1076
  }
1167
- const trusted = explicitOperatorOk(principal, deps.config);
1168
- const run = await runStore.getRun(runId);
1169
- if (!run) {
1170
- sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
1171
- return;
1172
- }
1173
- if (!trusted && !runOwnerOk(req, res, run.owner))
1174
- return;
1175
- if (!runSessionAcceptOk(req, res, run, `subagent.${verb}`))
1077
+ const childAdmitted = (await admitRunById(entry, res, runStore, runId));
1078
+ if (childAdmitted === undefined)
1176
1079
  return;
1080
+ const run = childAdmitted.row;
1177
1081
  const send409 = (errorCode, error) => sendError(res, 409, errorCode, error);
1178
1082
  const redacted = redactSteerIn(body.content, target);
1179
1083
  const resolution = steerFact.registry.resolve(runId, target);
@@ -1194,7 +1098,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1194
1098
  if (await ownerLeaseDenied(res, run.owner ?? undefined))
1195
1099
  return;
1196
1100
  const resumeFn = handle.resume;
1197
- const marker = await withPrincipal(run.owner ?? undefined, () => resumeFn(redacted));
1101
+ const marker = await withSubject(recoveredSubject(run.owner), () => resumeFn(redacted));
1198
1102
  sendJson(res, 200, { taskId: runId, target, status: "running", delivery: "applied", marker, note: `Message queued for delivery to ${handle.agentName ?? target}; it will continue in the background.` });
1199
1103
  return;
1200
1104
  }
@@ -1241,7 +1145,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1241
1145
  sendError(res, 501, "feature.elicitation_disabled", "inbound MCP elicitation is not enabled on this worker (MCP_ELICITATION_ENABLED)");
1242
1146
  return;
1243
1147
  }
1244
- const principal = gatedPrincipal(req, deps.config);
1148
+ const principal = gatedSubject(req, deps.config);
1245
1149
  if (deps.config.requirePrincipal && principal === undefined) {
1246
1150
  sendPrincipalRefusal(res, req, deps.config);
1247
1151
  return;
@@ -1260,7 +1164,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1260
1164
  sendError(res, 501, "feature.ask_question_disabled", "AskUserQuestion live HITL is not enabled on this worker (ASK_QUESTION_ENABLED)");
1261
1165
  return;
1262
1166
  }
1263
- const principal = gatedPrincipal(req, deps.config);
1167
+ const principal = gatedSubject(req, deps.config);
1264
1168
  if (deps.config.requirePrincipal && principal === undefined) {
1265
1169
  sendPrincipalRefusal(res, req, deps.config);
1266
1170
  return;
@@ -1279,7 +1183,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1279
1183
  sendError(res, 501, "feature.tool_approval_disabled", "live tool-approval HITL is not enabled on this worker (TOOL_APPROVAL_ENABLED)");
1280
1184
  return;
1281
1185
  }
1282
- const principal = gatedPrincipal(req, deps.config);
1186
+ const principal = gatedSubject(req, deps.config);
1283
1187
  if (deps.config.requirePrincipal && principal === undefined) {
1284
1188
  sendPrincipalRefusal(res, req, deps.config);
1285
1189
  return;
@@ -1308,7 +1212,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1308
1212
  return;
1309
1213
  }
1310
1214
  const askStore = streamFact.askStore;
1311
- const principal = gatedPrincipal(req, deps.config);
1215
+ const principal = gatedSubject(req, deps.config);
1312
1216
  if (deps.config.requirePrincipal && principal === undefined) {
1313
1217
  sendPrincipalRefusal(res, req, deps.config);
1314
1218
  return;
@@ -1350,9 +1254,8 @@ export async function handleRunVerbs(req, res, match, ctx) {
1350
1254
  askNotFound();
1351
1255
  return;
1352
1256
  }
1353
- const ownerOk = askOwnerAdmits(row0.owner, principal);
1354
- const operatorOk = explicitOperatorOk(principal, deps.config);
1355
- if (!ownerOk && !operatorOk) {
1257
+ const askAdmission = keyAdmission("ask.decide", { subject: principal, operator: explicitOperatorOk(principal === undefined ? undefined : personOf(principal), deps.config) }, ownerCellOf(row0.owner));
1258
+ if (askAdmission === undefined) {
1356
1259
  askNotFound();
1357
1260
  return;
1358
1261
  }
@@ -1360,7 +1263,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1360
1263
  id: principal ?? "_",
1361
1264
  ...(body.actor ? { label: redactSecrets(body.actor.label).slice(0, ASK_ACTOR_LABEL_MAX) } : {}),
1362
1265
  verified: principal !== undefined,
1363
- via: ownerOk ? "owner" : "operator",
1266
+ via: askAdmission === "row" ? "owner" : "operator",
1364
1267
  };
1365
1268
  const decidedRowIsAuthoritative = (row) => {
1366
1269
  if (row.state !== "DECIDED" || row.decision !== "approve" && row.decision !== "deny" || row.provisional || row.decidedAtMs === null) {
@@ -1423,7 +1326,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
1423
1326
  }
1424
1327
  case "PARKED":
1425
1328
  sendError(res, 410, "gone.ask_parked", "the in-stream window closed and this ask was parked onto the durable approval gate — decide it through that gate for the session echoed here", {
1426
- sessionId: row.sessionId,
1329
+ sessionId: parkSessionOf(row),
1427
1330
  gateBoundCallId: row.gateBoundCallId,
1428
1331
  gateBoundInputHash: row.gateBoundInputHash,
1429
1332
  });
@@ -1576,31 +1479,43 @@ export async function handleRunVerbs(req, res, match, ctx) {
1576
1479
  return assertNever(match.decl.id);
1577
1480
  }
1578
1481
  export async function createDurableRun(req, res, ctx, prepared, idem) {
1482
+ try {
1483
+ const out = await createDurableRunHeld(req, res, ctx, prepared, idem);
1484
+ await prepared.seat.close();
1485
+ return out;
1486
+ }
1487
+ catch (err) {
1488
+ await prepared.seat.close();
1489
+ throw err;
1490
+ }
1491
+ }
1492
+ async function createDurableRunHeld(req, res, ctx, prepared, idem) {
1579
1493
  const { deps } = ctx;
1580
1494
  const { idemCache } = ctx.registry;
1581
1495
  const { leaseDenied, usageWindowDenied, admitRun } = ctx.helpers;
1496
+ const seat = prepared.seat;
1582
1497
  const source = ctx.req.source;
1583
1498
  const runs = facts.durableRuns(deps);
1584
1499
  if (!runs.available) {
1585
- sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)");
1500
+ await seat.deliverTerminal(() => sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)"));
1586
1501
  return null;
1587
1502
  }
1588
1503
  const runStore = runs.runStore;
1589
1504
  const clientTaskId = clientTaskIdOf(prepared.body);
1590
1505
  if (clientTaskId === false) {
1591
- sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
1506
+ await seat.deliverTerminal(() => sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)"));
1592
1507
  return null;
1593
1508
  }
1594
- const submitter = gatedPrincipal(req, deps.config);
1595
- const caller = { principal: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) };
1509
+ const submitter = gatedSubject(req, deps.config);
1510
+ const caller = { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) };
1596
1511
  if (clientTaskId) {
1597
1512
  const existing = await runStore.getRun(clientTaskId);
1598
1513
  if (existing)
1599
1514
  return await replayOfExistingRun(existing, caller, "durable", deps, runStore);
1600
1515
  }
1601
- if ((await leaseDenied(req, res)) || (await usageWindowDenied(req, res)))
1516
+ if ((await leaseDenied(req, res, seat)) || (await usageWindowDenied(req, res, seat)))
1602
1517
  return null;
1603
- const runSlot = admitRun(req, res);
1518
+ const runSlot = await admitRun(req, res, seat);
1604
1519
  if (runSlot === undefined)
1605
1520
  return null;
1606
1521
  return await idemCache.run(idem !== undefined ? inflightKeyOf(idem, "durable", clientTaskId) : undefined, async () => {
@@ -1611,10 +1526,13 @@ export async function createDurableRun(req, res, ctx, prepared, idem) {
1611
1526
  fleetScope: submitter ?? "default",
1612
1527
  elicitOwner: submitter ?? null,
1613
1528
  source,
1614
- identity: runIdentityOf(req, deps.config, prepared.auth?.principal ?? null),
1529
+ identity: runIdentityOf(req, deps.config, prepared.auth?.subject ?? null),
1615
1530
  runSlot,
1531
+ face: SUBMISSION_CLAIM_FACE,
1616
1532
  });
1617
- return out.existing ? await replayOfExistingRun(out.existing, caller, "durable", deps, runStore) : out;
1533
+ const receipt = out.existing ? await replayOfExistingRun(out.existing, caller, "durable", deps, runStore) : out;
1534
+ await prepared.seat.close();
1535
+ return receipt;
1618
1536
  }).finally(() => runSlot.release());
1619
1537
  }
1620
1538
  function clientTaskIdOf(body) {