@sema-agent/server 7.147.0 → 7.148.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 (725) hide show
  1. package/MIGRATION.md +1039 -24
  2. package/README.md +20 -7
  3. package/README.zh-CN.md +14 -8
  4. package/USAGE.md +380 -163
  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/adoption/wire.d.ts +3 -3
  39. package/dist/approval-card.d.ts +28 -30
  40. package/dist/approval-gate-currency.js +3 -2
  41. package/dist/approval-reconciler.d.ts +4 -13
  42. package/dist/approval-reconciler.js +2 -2
  43. package/dist/approval.d.ts +13 -11
  44. package/dist/approval.js +3 -3
  45. package/dist/audit.d.ts +10 -3
  46. package/dist/audit.js +15 -7
  47. package/dist/auth-bridge.d.ts +0 -14
  48. package/dist/auth-bridge.js +0 -7
  49. package/dist/auto-mode-face.d.ts +10 -7
  50. package/dist/auto-mode-face.js +7 -4
  51. package/dist/background-agent-name.d.ts +19 -1
  52. package/dist/background-agent-name.js +12 -2
  53. package/dist/background-session-reap.d.ts +1 -1
  54. package/dist/bake-runner/main.js +9 -6
  55. package/dist/bench/s1/arms.js +6 -5
  56. package/dist/bench/s1/live-deps.js +5 -2
  57. package/dist/bench/s1/run-firm.js +6 -5
  58. package/dist/bind-host.d.ts +25 -0
  59. package/dist/bind-host.js +25 -0
  60. package/dist/boot/adoption.d.ts +3 -0
  61. package/dist/boot/adoption.js +1 -0
  62. package/dist/boot/deployment-mods.d.ts +1 -1
  63. package/dist/boot/execution-env.d.ts +17 -7
  64. package/dist/boot/execution-env.js +37 -31
  65. package/dist/boot/exit-boundary.d.ts +2 -2
  66. package/dist/boot/exit-boundary.js +6 -5
  67. package/dist/boot/fatal-exit.d.ts +3 -5
  68. package/dist/boot/fatal-exit.js +2 -2
  69. package/dist/boot/leader.d.ts +15 -0
  70. package/dist/boot/leader.js +17 -15
  71. package/dist/boot/memory-consolidation.d.ts +37 -29
  72. package/dist/boot/memory-consolidation.js +11 -5
  73. package/dist/boot/org-memory.js +1 -1
  74. package/dist/boot/parked-revive-gate.js +2 -2
  75. package/dist/boot/reapers.d.ts +4 -3
  76. package/dist/boot/reapers.js +19 -16
  77. package/dist/boot/resolve-spec.d.ts +5 -3
  78. package/dist/boot/resolve-spec.js +55 -67
  79. package/dist/boot/retention-lane.d.ts +4 -4
  80. package/dist/boot/retention-lane.js +2 -2
  81. package/dist/boot/runner-deps.d.ts +28 -7
  82. package/dist/boot/runner-deps.js +11 -4
  83. package/dist/boot/runtime-caps.d.ts +2 -2
  84. package/dist/boot/runtime-caps.js +16 -2
  85. package/dist/boot/session-faces.d.ts +16 -7
  86. package/dist/boot/session-faces.js +114 -94
  87. package/dist/boot/shutdown.d.ts +5 -4
  88. package/dist/boot/shutdown.js +6 -4
  89. package/dist/boot/stage-01-config.js +9 -1
  90. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  91. package/dist/boot/stage-02-web-admin-pull.js +6 -1
  92. package/dist/boot/stage-03-store-backend.d.ts +3 -0
  93. package/dist/boot/stage-03-store-backend.js +4 -3
  94. package/dist/boot/stage-04-stores.d.ts +2 -0
  95. package/dist/boot/stage-04-stores.js +2 -2
  96. package/dist/boot/stage-05-execution-env.d.ts +7 -3
  97. package/dist/boot/stage-05-execution-env.js +2 -2
  98. package/dist/boot/stage-06-runners.d.ts +10 -12
  99. package/dist/boot/stage-06-runners.js +23 -15
  100. package/dist/boot/stage-07-capability-layer.d.ts +11 -8
  101. package/dist/boot/stage-07-capability-layer.js +5 -3
  102. package/dist/boot/stage-08-reapers.d.ts +11 -8
  103. package/dist/boot/stage-08-reapers.js +3 -3
  104. package/dist/boot/stage-09-leader.d.ts +12 -15
  105. package/dist/boot/stage-09-leader.js +12 -4
  106. package/dist/boot/stage-10-http-server.d.ts +12 -15
  107. package/dist/boot/stage-10-http-server.js +7 -4
  108. package/dist/boot/store-evidence.d.ts +20 -0
  109. package/dist/boot/store-evidence.js +13 -0
  110. package/dist/boot/stores.d.ts +3 -0
  111. package/dist/boot/stores.js +21 -10
  112. package/dist/boot/task-list-lane.d.ts +4 -4
  113. package/dist/boot/web-admin.d.ts +4 -2
  114. package/dist/boot/web-admin.js +55 -35
  115. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  116. package/dist/boot-reclaim.d.ts +3 -1
  117. package/dist/boot-reclaim.js +1 -1
  118. package/dist/brain.d.ts +7 -18
  119. package/dist/brain.js +5 -17
  120. package/dist/budget.js +6 -6
  121. package/dist/capabilities/center-plugins.d.ts +7 -1
  122. package/dist/capabilities/center-plugins.js +32 -10
  123. package/dist/capabilities/center-wiring.js +1 -1
  124. package/dist/capabilities/composite-members.d.ts +2 -2
  125. package/dist/capabilities/composite-members.js +2 -2
  126. package/dist/capabilities/repo-tools.d.ts +2 -0
  127. package/dist/capabilities/repo-tools.js +14 -12
  128. package/dist/capabilities/scenarios.d.ts +6 -15
  129. package/dist/capabilities/scenarios.js +11 -16
  130. package/dist/capabilities/skills.d.ts +1 -1
  131. package/dist/capabilities/tool-defer.d.ts +1 -1
  132. package/dist/capability-facts.d.ts +38 -11
  133. package/dist/capability-facts.js +47 -8
  134. package/dist/card-void.d.ts +4 -4
  135. package/dist/card-void.js +1 -1
  136. package/dist/center-credential-renewer.d.ts +6 -2
  137. package/dist/center-credential-renewer.js +7 -3
  138. package/dist/config-catalog.d.ts +16 -1
  139. package/dist/config-catalog.js +62 -56
  140. package/dist/config-dir-trust.d.ts +37 -4
  141. package/dist/config-dir-trust.js +88 -44
  142. package/dist/config-invariants.d.ts +42 -3
  143. package/dist/config-invariants.js +69 -5
  144. package/dist/config-lkg.d.ts +23 -1
  145. package/dist/config-lkg.js +17 -3
  146. package/dist/config-provider.d.ts +9 -9
  147. package/dist/config-provider.js +25 -110
  148. package/dist/config-pull-failure.d.ts +50 -0
  149. package/dist/config-pull-failure.js +48 -0
  150. package/dist/config-types.d.ts +26 -17
  151. package/dist/config.d.ts +8 -16
  152. package/dist/config.js +113 -47
  153. package/dist/delegated-session-owner.d.ts +1 -1
  154. package/dist/deleted-session-ids.d.ts +3 -2
  155. package/dist/deployment-governance.d.ts +3 -3
  156. package/dist/deployment-shape.d.ts +30 -4
  157. package/dist/deployment-shape.js +7 -0
  158. package/dist/egress-redirect.d.ts +25 -7
  159. package/dist/egress-redirect.js +20 -2
  160. package/dist/elicitation.d.ts +6 -5
  161. package/dist/elicitation.js +23 -22
  162. package/dist/engine-identity.d.ts +28 -0
  163. package/dist/engine-identity.js +10 -0
  164. package/dist/entry-problems.d.ts +5 -7
  165. package/dist/entry-problems.js +1 -1
  166. package/dist/env-facts.js +2 -1
  167. package/dist/env-witness.d.ts +7 -0
  168. package/dist/env-witness.js +16 -0
  169. package/dist/execution-lane-caps.d.ts +5 -18
  170. package/dist/execution-lane-caps.js +0 -22
  171. package/dist/execution-placement.d.ts +58 -18
  172. package/dist/execution-placement.js +41 -2
  173. package/dist/field-conflict.d.ts +7 -11
  174. package/dist/field-conflict.js +3 -3
  175. package/dist/file-history-capture.d.ts +3 -3
  176. package/dist/file-history-disclosure.js +1 -0
  177. package/dist/fleet/fleet-bus.d.ts +21 -3
  178. package/dist/fleet/fleet-bus.js +35 -25
  179. package/dist/fleet/fleet-reconciler.js +2 -2
  180. package/dist/fleet/serving-lease.js +3 -3
  181. package/dist/fleet-client.js +3 -3
  182. package/dist/fleet-lease.d.ts +0 -1
  183. package/dist/fleet-lease.js +4 -5
  184. package/dist/history-anchor.d.ts +23 -3
  185. package/dist/history-anchor.js +24 -4
  186. package/dist/hitl-delivery.d.ts +90 -0
  187. package/dist/hitl-delivery.js +98 -0
  188. package/dist/hooks/classic-stations.d.ts +8 -11
  189. package/dist/hooks/classic-stations.js +0 -7
  190. package/dist/hooks/hook-llm.d.ts +5 -1
  191. package/dist/hooks/hook-llm.js +24 -15
  192. package/dist/hooks/hook-runner.d.ts +67 -57
  193. package/dist/hooks/hook-runner.js +260 -186
  194. package/dist/host-lsp-manager.d.ts +22 -8
  195. package/dist/host-lsp-manager.js +4 -1
  196. package/dist/http/active-run-conflict.d.ts +2 -43
  197. package/dist/http/active-run-conflict.js +3 -7
  198. package/dist/http/admission.d.ts +4 -18
  199. package/dist/http/admission.js +75 -78
  200. package/dist/http/approval-sweeps.d.ts +3 -3
  201. package/dist/http/approval-sweeps.js +54 -30
  202. package/dist/http/caller-trust.d.ts +8 -10
  203. package/dist/http/caller-trust.js +1 -2
  204. package/dist/http/claim-heartbeat.d.ts +49 -0
  205. package/dist/http/claim-heartbeat.js +46 -0
  206. package/dist/http/claimed-run.d.ts +4 -3
  207. package/dist/http/dispatch.d.ts +8 -1
  208. package/dist/http/dispatch.js +76 -30
  209. package/dist/http/durable-run-leg.d.ts +3 -3
  210. package/dist/http/durable-run-leg.js +17 -12
  211. package/dist/http/execution-context.d.ts +17 -43
  212. package/dist/http/execution-context.js +7 -5
  213. package/dist/http/health-reader.d.ts +36 -0
  214. package/dist/http/health-reader.js +21 -0
  215. package/dist/http/health-self-report.d.ts +9 -9
  216. package/dist/http/health-self-report.js +4 -4
  217. package/dist/http/idempotency.d.ts +9 -5
  218. package/dist/http/idempotency.js +4 -4
  219. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  220. package/dist/http/memory-compliance-failure-reply.js +4 -2
  221. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  222. package/dist/http/memory-face-fault-reply.js +71 -0
  223. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  224. package/dist/http/memory-store-refusal-reply.js +3 -0
  225. package/dist/http/owner-access.d.ts +391 -67
  226. package/dist/http/owner-access.js +371 -35
  227. package/dist/http/principal-gate.d.ts +24 -81
  228. package/dist/http/principal-gate.js +24 -68
  229. package/dist/http/refusal-body.d.ts +35 -2
  230. package/dist/http/refusal-body.js +34 -0
  231. package/dist/http/request-guards.d.ts +9 -13
  232. package/dist/http/request-guards.js +34 -68
  233. package/dist/http/resume-composition.d.ts +37 -0
  234. package/dist/http/resume-composition.js +18 -0
  235. package/dist/http/resume-ctx-read.d.ts +35 -12
  236. package/dist/http/resume-ctx-read.js +25 -6
  237. package/dist/http/resume-legs.d.ts +21 -18
  238. package/dist/http/resume-legs.js +189 -129
  239. package/dist/http/retired-skill-manifest.d.ts +1 -1
  240. package/dist/http/route-ctx.d.ts +25 -32
  241. package/dist/http/routes/a2a-serve.d.ts +43 -5
  242. package/dist/http/routes/a2a-serve.js +58 -37
  243. package/dist/http/routes/admin-config-refresh.js +2 -2
  244. package/dist/http/routes/admin-drain.js +2 -2
  245. package/dist/http/routes/admin-memory-optout.js +4 -3
  246. package/dist/http/routes/adoption.d.ts +3 -0
  247. package/dist/http/routes/adoption.js +17 -10
  248. package/dist/http/routes/agents-roster.js +13 -7
  249. package/dist/http/routes/approvals-assistant.js +70 -65
  250. package/dist/http/routes/attachments.js +2 -2
  251. package/dist/http/routes/background.d.ts +3 -3
  252. package/dist/http/routes/background.js +9 -17
  253. package/dist/http/routes/capabilities.js +15 -18
  254. package/dist/http/routes/config-catalog.js +2 -2
  255. package/dist/http/routes/devices.d.ts +3 -3
  256. package/dist/http/routes/devices.js +4 -4
  257. package/dist/http/routes/diagnostics.d.ts +27 -3
  258. package/dist/http/routes/diagnostics.js +27 -21
  259. package/dist/http/routes/engine.js +2 -2
  260. package/dist/http/routes/fleet.js +5 -3
  261. package/dist/http/routes/images.js +10 -6
  262. package/dist/http/routes/leader.d.ts +7 -2
  263. package/dist/http/routes/leader.js +12 -3
  264. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  265. package/dist/http/routes/mcp-reconnect.js +7 -15
  266. package/dist/http/routes/memory-bundle.js +4 -7
  267. package/dist/http/routes/memory-compliance.js +4 -4
  268. package/dist/http/routes/memory-consolidation.js +6 -9
  269. package/dist/http/routes/memory-origin.d.ts +2 -0
  270. package/dist/http/routes/memory-origin.js +7 -8
  271. package/dist/http/routes/memory-policy.js +17 -12
  272. package/dist/http/routes/notify-wake.js +10 -19
  273. package/dist/http/routes/observability.js +3 -3
  274. package/dist/http/routes/principal-inbox.d.ts +1 -1
  275. package/dist/http/routes/principal-inbox.js +2 -2
  276. package/dist/http/routes/projects.d.ts +1 -1
  277. package/dist/http/routes/projects.js +3 -2
  278. package/dist/http/routes/retention-ops.js +6 -9
  279. package/dist/http/routes/rules.js +20 -5
  280. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  281. package/dist/http/routes/run-memory-capture.js +6 -12
  282. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  283. package/dist/http/routes/run-permission-mode.js +10 -17
  284. package/dist/http/routes/runs.js +146 -231
  285. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  286. package/dist/http/routes/session-memory-sync.js +7 -13
  287. package/dist/http/routes/session-sync.d.ts +4 -2
  288. package/dist/http/routes/session-sync.js +21 -20
  289. package/dist/http/routes/sessions-list.d.ts +3 -3
  290. package/dist/http/routes/sessions-list.js +9 -9
  291. package/dist/http/routes/sessions.js +87 -124
  292. package/dist/http/routes/shared-memory.js +6 -6
  293. package/dist/http/routes/side-query.js +2 -2
  294. package/dist/http/routes/tasks.js +136 -120
  295. package/dist/http/routes/trace-usage.d.ts +0 -12
  296. package/dist/http/routes/trace-usage.js +40 -46
  297. package/dist/http/routes/workflows.d.ts +39 -4
  298. package/dist/http/routes/workflows.js +42 -14
  299. package/dist/http/run-concurrency-cap.d.ts +20 -12
  300. package/dist/http/run-concurrency-cap.js +39 -26
  301. package/dist/http/run-read-face.d.ts +3 -5
  302. package/dist/http/run-read-face.js +8 -13
  303. package/dist/http/send.d.ts +12 -3
  304. package/dist/http/send.js +42 -6
  305. package/dist/http/server.d.ts +39 -40
  306. package/dist/http/server.js +36 -11
  307. package/dist/http/sse-log.d.ts +17 -10
  308. package/dist/http/sse-log.js +7 -7
  309. package/dist/http/stored-body-replay.d.ts +12 -0
  310. package/dist/http/stored-body-replay.js +2 -2
  311. package/dist/http/submit-ctx.d.ts +16 -8
  312. package/dist/http/submit-ctx.js +6 -2
  313. package/dist/http/submit-replay.d.ts +19 -6
  314. package/dist/http/submit-replay.js +18 -6
  315. package/dist/http/sync-submit-body.d.ts +3 -4
  316. package/dist/http/sync-submit-body.js +4 -5
  317. package/dist/http/wire-types.d.ts +4 -3
  318. package/dist/identity-source.d.ts +36 -5
  319. package/dist/identity-source.js +27 -0
  320. package/dist/index.d.ts +1 -0
  321. package/dist/index.js +1 -0
  322. package/dist/key-resolver.d.ts +32 -0
  323. package/dist/key-resolver.js +23 -9
  324. package/dist/leader/diffup.js +2 -1
  325. package/dist/leader/endpoint.d.ts +26 -5
  326. package/dist/leader/endpoint.js +154 -14
  327. package/dist/leader/fanout.d.ts +3 -0
  328. package/dist/leader/fanout.js +78 -63
  329. package/dist/leader/leader.d.ts +16 -0
  330. package/dist/leader/leader.js +43 -3
  331. package/dist/leader/merge.d.ts +9 -1
  332. package/dist/leader/merge.js +16 -1
  333. package/dist/leader/repair-wire.js +1 -1
  334. package/dist/leader/wire.d.ts +36 -3
  335. package/dist/leader/wire.js +59 -18
  336. package/dist/lsp-evict.d.ts +6 -4
  337. package/dist/lsp-evict.js +2 -3
  338. package/dist/memory-operator-faces.d.ts +5 -4
  339. package/dist/memory-operator-faces.js +1 -1
  340. package/dist/memory-scope.d.ts +29 -2
  341. package/dist/memory-scope.js +64 -15
  342. package/dist/memory-store-refusal.d.ts +5 -2
  343. package/dist/memory-sync-client.d.ts +3 -2
  344. package/dist/memory-sync-client.js +6 -3
  345. package/dist/model-compat.d.ts +17 -8
  346. package/dist/model-compat.js +6 -2
  347. package/dist/model-context-window.d.ts +18 -0
  348. package/dist/model-context-window.js +2 -0
  349. package/dist/model-entry-headers.d.ts +46 -4
  350. package/dist/model-entry-headers.js +2 -2
  351. package/dist/model-entry-refusal.d.ts +35 -16
  352. package/dist/model-entry-refusal.js +40 -27
  353. package/dist/model-plane-face.d.ts +19 -11
  354. package/dist/model-plane-face.js +9 -1
  355. package/dist/model-plane-probe.d.ts +2 -0
  356. package/dist/model-plane-probe.js +17 -0
  357. package/dist/model-provider.d.ts +3 -3
  358. package/dist/model-route-endpoint.d.ts +9 -5
  359. package/dist/model-route-endpoint.js +29 -7
  360. package/dist/model-select.d.ts +16 -0
  361. package/dist/model-select.js +4 -0
  362. package/dist/mountinfo.d.ts +37 -0
  363. package/dist/mountinfo.js +47 -0
  364. package/dist/namespaced-rule-name.d.ts +23 -14
  365. package/dist/namespaced-rule-name.js +8 -11
  366. package/dist/net-address.d.ts +1 -1
  367. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  368. package/dist/observability/corrupt-read-seat.js +5 -3
  369. package/dist/observability/fail-open.d.ts +58 -38
  370. package/dist/observability/fail-open.js +60 -38
  371. package/dist/observability/logger.d.ts +22 -1
  372. package/dist/observability/logger.js +89 -12
  373. package/dist/observability/metrics.js +3 -4
  374. package/dist/observability/otel-exporter.js +2 -1
  375. package/dist/observability/principal-context.d.ts +14 -7
  376. package/dist/observability/principal-context.js +8 -3
  377. package/dist/observability/run-terminal.d.ts +7 -1
  378. package/dist/observability/run-terminal.js +5 -2
  379. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  380. package/dist/orchestration/hardened-vm-runner.js +11 -5
  381. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  382. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  383. package/dist/orchestration/hardened-vm-worker.js +2 -1
  384. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  385. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  386. package/dist/org-delivery-gate.d.ts +5 -4
  387. package/dist/org-delivery-gate.js +7 -6
  388. package/dist/outbound-dispatcher.d.ts +1 -1
  389. package/dist/outbound-dispatcher.js +6 -12
  390. package/dist/owner-brands.d.ts +81 -0
  391. package/dist/owner-brands.js +42 -0
  392. package/dist/owner-faces.d.ts +531 -0
  393. package/dist/owner-faces.js +126 -0
  394. package/dist/parked-decide.d.ts +67 -5
  395. package/dist/parked-decide.js +127 -5
  396. package/dist/parked-revive-surface.d.ts +14 -4
  397. package/dist/parked-revive-surface.js +5 -4
  398. package/dist/peer-directory.d.ts +6 -8
  399. package/dist/peer-directory.js +3 -2
  400. package/dist/permission-rule-vocab.d.ts +53 -8
  401. package/dist/permission-rule-vocab.js +30 -2
  402. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  403. package/dist/plugins/adoption-log-sql.js +5 -3
  404. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  405. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  406. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  407. package/dist/plugins/approval-ask-store-file.js +37 -14
  408. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  409. package/dist/plugins/approval-ask-store-memory.js +24 -10
  410. package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
  411. package/dist/plugins/approval-ask-store-sql.js +41 -10
  412. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  413. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  414. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  415. package/dist/plugins/approval-exemption-store.js +14 -0
  416. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  417. package/dist/plugins/approval-nonce-store.js +72 -23
  418. package/dist/plugins/blob-backend.d.ts +2 -0
  419. package/dist/plugins/blob-backend.js +9 -6
  420. package/dist/plugins/caching-session-store.d.ts +13 -1
  421. package/dist/plugins/caching-session-store.js +43 -4
  422. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  423. package/dist/plugins/checkpoint-index-columns.js +36 -1
  424. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  425. package/dist/plugins/checkpoint-store-face.js +18 -1
  426. package/dist/plugins/device-store-sql.js +1 -0
  427. package/dist/plugins/ensure-index.d.ts +13 -1
  428. package/dist/plugins/ensure-index.js +154 -21
  429. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  430. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  431. package/dist/plugins/file-run-store.d.ts +63 -23
  432. package/dist/plugins/file-run-store.js +138 -83
  433. package/dist/plugins/host-platform.d.ts +24 -3
  434. package/dist/plugins/host-platform.js +15 -1
  435. package/dist/plugins/image-bake-store-sql.js +2 -0
  436. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  437. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  438. package/dist/plugins/k8s-pod-reaper.js +0 -1
  439. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  440. package/dist/plugins/leader-run-store-sql.js +34 -4
  441. package/dist/plugins/local-checkpoint-store.d.ts +58 -23
  442. package/dist/plugins/local-checkpoint-store.js +195 -76
  443. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  444. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  445. package/dist/plugins/local-docker-capacity.js +194 -0
  446. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  447. package/dist/plugins/local-docker-reaper.js +102 -0
  448. package/dist/plugins/local-engine-high-water.d.ts +4 -2
  449. package/dist/plugins/local-engine-high-water.js +4 -1
  450. package/dist/plugins/local-session-store.d.ts +358 -125
  451. package/dist/plugins/local-session-store.js +824 -251
  452. package/dist/plugins/local-session-window.d.ts +3 -2
  453. package/dist/plugins/local-session-window.js +3 -2
  454. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  455. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  456. package/dist/plugins/local-task-attachment-store.js +22 -1
  457. package/dist/plugins/memory-embedder.js +9 -7
  458. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  459. package/dist/plugins/memory-engine-pg.js +14 -5
  460. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  461. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  462. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  463. package/dist/plugins/memory-engine-tidb.js +11 -2
  464. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  465. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  466. package/dist/plugins/memory-run-store.d.ts +39 -27
  467. package/dist/plugins/memory-run-store.js +72 -70
  468. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  469. package/dist/plugins/one-time-migration-marker.js +7 -0
  470. package/dist/plugins/one-time-migrations.d.ts +186 -45
  471. package/dist/plugins/one-time-migrations.js +442 -119
  472. package/dist/plugins/org-delivery-quota-store.js +2 -1
  473. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  474. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  475. package/dist/plugins/permission-rule-store-sql.js +6 -86
  476. package/dist/plugins/pg-pool.d.ts +1 -31
  477. package/dist/plugins/pg-pool.js +16 -7
  478. package/dist/plugins/remote-env-e2b.d.ts +7 -25
  479. package/dist/plugins/remote-env-e2b.js +34 -25
  480. package/dist/plugins/remote-env-host.d.ts +2 -9
  481. package/dist/plugins/remote-env-host.js +34 -22
  482. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  483. package/dist/plugins/remote-env-k8s.js +107 -58
  484. package/dist/plugins/remote-env-local-docker.d.ts +148 -14
  485. package/dist/plugins/remote-env-local-docker.js +367 -72
  486. package/dist/plugins/remote-scratchpad.js +4 -0
  487. package/dist/plugins/retention-deployment.d.ts +49 -17
  488. package/dist/plugins/retention-deployment.js +39 -8
  489. package/dist/plugins/run-preview-m45.d.ts +11 -0
  490. package/dist/plugins/run-preview-m45.js +19 -0
  491. package/dist/plugins/run-store-sql.d.ts +56 -68
  492. package/dist/plugins/run-store-sql.js +127 -116
  493. package/dist/plugins/s3-answer.d.ts +2 -1
  494. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  495. package/dist/plugins/sandbox-reaper.js +2 -0
  496. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  497. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  498. package/dist/plugins/scheduler-support.d.ts +16 -1
  499. package/dist/plugins/scheduler-support.js +22 -2
  500. package/dist/plugins/schema-consistency.d.ts +42 -9
  501. package/dist/plugins/schema-consistency.js +212 -11
  502. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  503. package/dist/plugins/schema-drift-sentence.js +4 -4
  504. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  505. package/dist/plugins/schema-ensure-legs.js +1 -1
  506. package/dist/plugins/schema-indexes.js +3 -0
  507. package/dist/plugins/schema-live-columns.d.ts +14 -5
  508. package/dist/plugins/schema-live-columns.js +10 -10
  509. package/dist/plugins/send-user-file.js +2 -1
  510. package/dist/plugins/session-birth.d.ts +37 -0
  511. package/dist/plugins/session-birth.js +38 -0
  512. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  513. package/dist/plugins/session-epoch-anchor.js +33 -11
  514. package/dist/plugins/session-ext-table.d.ts +27 -3
  515. package/dist/plugins/session-ext-table.js +19 -6
  516. package/dist/plugins/session-fork.d.ts +15 -1
  517. package/dist/plugins/session-fork.js +3 -0
  518. package/dist/plugins/session-ownership.d.ts +1 -1
  519. package/dist/plugins/session-placement.d.ts +22 -16
  520. package/dist/plugins/session-placement.js +15 -12
  521. package/dist/plugins/session-row-sql.d.ts +12 -0
  522. package/dist/plugins/session-row-sql.js +3 -3
  523. package/dist/plugins/session-run-rollup.d.ts +29 -0
  524. package/dist/plugins/session-run-rollup.js +40 -0
  525. package/dist/plugins/session-store-sql.d.ts +38 -12
  526. package/dist/plugins/session-store-sql.js +130 -30
  527. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  528. package/dist/plugins/session-withdraw-sql.js +42 -0
  529. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  530. package/dist/plugins/shared-memory-store-sql.js +2 -1
  531. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  532. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  533. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  534. package/dist/plugins/sql-driver.d.ts +1 -1
  535. package/dist/plugins/sql-driver.js +2 -1
  536. package/dist/plugins/sql-errors.d.ts +32 -5
  537. package/dist/plugins/sql-errors.js +55 -7
  538. package/dist/plugins/sql-json-column.d.ts +8 -7
  539. package/dist/plugins/sql-json-column.js +10 -6
  540. package/dist/plugins/store-backend.d.ts +84 -15
  541. package/dist/plugins/store-backend.js +186 -55
  542. package/dist/plugins/store-contracts.d.ts +90 -30
  543. package/dist/plugins/store-contracts.js +22 -1
  544. package/dist/plugins/store-fault.d.ts +28 -2
  545. package/dist/plugins/store-fault.js +20 -2
  546. package/dist/plugins/task-attachment-store.d.ts +15 -3
  547. package/dist/plugins/task-attachment-store.js +22 -9
  548. package/dist/plugins/tidb-pool.js +23 -8
  549. package/dist/plugins/web-search.js +5 -3
  550. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  551. package/dist/plugins/workflow-run-store-sql.js +11 -5
  552. package/dist/principal-jwt.d.ts +4 -4
  553. package/dist/principal-jwt.js +20 -5
  554. package/dist/principal-shape.d.ts +41 -0
  555. package/dist/principal-shape.js +19 -0
  556. package/dist/question.d.ts +13 -23
  557. package/dist/question.js +21 -39
  558. package/dist/request-declaration-refusal.d.ts +35 -12
  559. package/dist/request-declaration-refusal.js +21 -9
  560. package/dist/request-form.d.ts +58 -0
  561. package/dist/request-form.js +72 -0
  562. package/dist/request-image-urls.d.ts +8 -2
  563. package/dist/request-image-urls.js +2 -1
  564. package/dist/request-images.d.ts +20 -0
  565. package/dist/request-images.js +59 -0
  566. package/dist/request-key-closure.d.ts +6 -7
  567. package/dist/request-key-closure.js +15 -2
  568. package/dist/resource-suspend.d.ts +7 -16
  569. package/dist/resource-suspend.js +1 -1
  570. package/dist/retired-name-host-notice.d.ts +21 -0
  571. package/dist/retired-name-host-notice.js +12 -0
  572. package/dist/rule-entry-list.d.ts +2 -2
  573. package/dist/rule-entry-list.js +3 -4
  574. package/dist/rule-issue-reading.d.ts +58 -0
  575. package/dist/rule-issue-reading.js +14 -0
  576. package/dist/rules-consent.d.ts +5 -3
  577. package/dist/rules-consent.js +1 -0
  578. package/dist/run-acceptance.d.ts +3 -1
  579. package/dist/run-acceptance.js +3 -0
  580. package/dist/run-local.d.ts +14 -6
  581. package/dist/run-local.js +92 -80
  582. package/dist/run-stale-default.d.ts +7 -0
  583. package/dist/run-stale-default.js +2 -0
  584. package/dist/runs.d.ts +26 -15
  585. package/dist/runs.js +39 -27
  586. package/dist/runtime-caps-resolver.d.ts +21 -6
  587. package/dist/runtime-caps-resolver.js +17 -4
  588. package/dist/runtime-governance.d.ts +2 -2
  589. package/dist/runtime-governance.js +5 -3
  590. package/dist/sealed-key-layout.d.ts +12 -5
  591. package/dist/sealed-key-layout.js +5 -0
  592. package/dist/sealed-key.d.ts +12 -2
  593. package/dist/sealed-key.js +115 -27
  594. package/dist/security.d.ts +128 -158
  595. package/dist/security.js +163 -59
  596. package/dist/sema-config-dir.d.ts +20 -0
  597. package/dist/sema-config-dir.js +25 -0
  598. package/dist/server-secret-env.d.ts +21 -5
  599. package/dist/server-secret-env.js +14 -4
  600. package/dist/session-children-retire.d.ts +7 -5
  601. package/dist/session-children-retire.js +7 -2
  602. package/dist/session-deletion.d.ts +88 -0
  603. package/dist/session-deletion.js +8 -0
  604. package/dist/session-erase.d.ts +145 -0
  605. package/dist/session-erase.js +115 -0
  606. package/dist/session-error-wire.d.ts +5 -5
  607. package/dist/session-error-wire.js +1 -1
  608. package/dist/session-incarnation.d.ts +52 -5
  609. package/dist/session-incarnation.js +19 -2
  610. package/dist/session-policy-wire.d.ts +6 -3
  611. package/dist/session-policy-wire.js +11 -1
  612. package/dist/session-resident-background.d.ts +0 -71
  613. package/dist/session-resident-background.js +4 -3
  614. package/dist/session-row.d.ts +2 -1
  615. package/dist/session-rules-seat.d.ts +12 -0
  616. package/dist/session-rules-seat.js +19 -0
  617. package/dist/session-titler.d.ts +7 -15
  618. package/dist/session-titler.js +1 -1
  619. package/dist/spec-fields.d.ts +57 -3
  620. package/dist/spec-fields.js +72 -51
  621. package/dist/store-posture.d.ts +136 -20
  622. package/dist/store-posture.js +188 -3
  623. package/dist/stored-request-hooks-m20.js +2 -2
  624. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  625. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  626. package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
  627. package/dist/stores-sql/checkpoint-store-sql.js +75 -44
  628. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  629. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  630. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  631. package/dist/stores-sql/pg-session-storage.js +54 -46
  632. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  633. package/dist/stores-sql/retention-store-sql.js +92 -27
  634. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  635. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  636. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  637. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  638. package/dist/stores-sql/tidb-session-storage.js +13 -8
  639. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  640. package/dist/stores-sql/tidb-session-store.js +69 -39
  641. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  642. package/dist/stores-sql/windowed-session-storage.js +9 -0
  643. package/dist/submission-exit.d.ts +50 -0
  644. package/dist/submission-exit.js +108 -0
  645. package/dist/task-a2a.d.ts +1 -1
  646. package/dist/task-a2a.js +3 -3
  647. package/dist/task-cwd.d.ts +20 -0
  648. package/dist/task-cwd.js +8 -0
  649. package/dist/task-mcp.d.ts +1 -1
  650. package/dist/task-mcp.js +3 -3
  651. package/dist/task-settings.d.ts +14 -10
  652. package/dist/task-settings.js +18 -7
  653. package/dist/terminal.d.ts +25 -43
  654. package/dist/terminal.js +31 -11
  655. package/dist/tool-approval.d.ts +131 -129
  656. package/dist/tool-approval.js +189 -193
  657. package/dist/trace/core-keyset-guard.d.ts +13 -6
  658. package/dist/trace/core-vocab-wire.d.ts +95 -0
  659. package/dist/trace/core-vocab-wire.js +15 -0
  660. package/dist/trace/exit-seat.d.ts +30 -4
  661. package/dist/trace/exit-seat.js +40 -36
  662. package/dist/trace/extension-call-face.d.ts +3 -2
  663. package/dist/trace/extension-call-face.js +3 -1
  664. package/dist/trace/ledger-events.d.ts +4 -7
  665. package/dist/trace/ledger-sink.d.ts +1 -30
  666. package/dist/trace/ledger-sink.js +0 -11
  667. package/dist/trace/model-segment.d.ts +5 -5
  668. package/dist/trace/model-segment.js +5 -5
  669. package/dist/trace/project.d.ts +55 -42
  670. package/dist/trace/project.js +52 -19
  671. package/dist/trace/redact.d.ts +123 -27
  672. package/dist/trace/redact.js +880 -260
  673. package/dist/trace/self-minted-wire.d.ts +487 -19
  674. package/dist/trace/self-minted-wire.js +172 -23
  675. package/dist/trace/wire-projection-faces.d.ts +5 -6
  676. package/dist/trace/wire-projection-faces.js +2 -2
  677. package/dist/upstream-body.d.ts +23 -0
  678. package/dist/upstream-body.js +16 -0
  679. package/dist/url-refusal.d.ts +3 -3
  680. package/dist/url-refusal.js +11 -4
  681. package/dist/user-authored-text.d.ts +1 -1
  682. package/dist/user-input-ledger.d.ts +7 -8
  683. package/dist/user-input-ledger.js +1 -1
  684. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  685. package/dist/web-admin-client/apply-effective.js +13 -16
  686. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  687. package/dist/web-admin-client/apply-ledger.js +5 -2
  688. package/dist/web-admin-client/center-request.d.ts +2 -2
  689. package/dist/web-admin-client/center-request.js +15 -15
  690. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  691. package/dist/web-admin-client/effective-keys.js +1 -1
  692. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  693. package/dist/web-admin-client/entry-metadata.js +13 -0
  694. package/dist/web-admin-client/http-client.d.ts +1 -1
  695. package/dist/web-admin-client/http-client.js +23 -4
  696. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  697. package/dist/web-admin-client/mcp-revocation.js +2 -1
  698. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  699. package/dist/web-admin-client/read-warnings.js +1 -0
  700. package/dist/web-admin-client/restart-signal.js +8 -4
  701. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  702. package/dist/web-admin-client/types.d.ts +1 -2
  703. package/dist/workspace-space.d.ts +3 -2
  704. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  705. package/package.json +6 -3
  706. package/scripts/drain-check-local.mjs +118 -147
  707. package/scripts/drain-check.mysql.sql +22 -2
  708. package/scripts/drain-check.pg.sql +22 -2
  709. package/wire-changes/server@7.148.0.json +1517 -0
  710. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  711. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  712. package/dist/http/memory-layer-reply.d.ts +0 -30
  713. package/dist/http/memory-layer-reply.js +0 -24
  714. package/dist/lsp/e2b-bridge.d.ts +0 -57
  715. package/dist/lsp/e2b-bridge.js +0 -139
  716. package/dist/lsp/e2b-manager.d.ts +0 -93
  717. package/dist/lsp/e2b-manager.js +0 -178
  718. package/dist/lsp/lsp-frames.d.ts +0 -14
  719. package/dist/lsp/lsp-frames.js +0 -25
  720. package/dist/lsp/manager.d.ts +0 -129
  721. package/dist/lsp/manager.js +0 -127
  722. package/dist/lsp/types.d.ts +0 -12
  723. package/dist/lsp/types.js +0 -2
  724. package/dist/lsp/ws-transport.d.ts +0 -40
  725. package/dist/lsp/ws-transport.js +0 -210
@@ -1,43 +1,45 @@
1
1
  import { redactErrorMessage, redactHead, redactTerminalResult } from "../../observability/run-terminal.js";
2
2
  import { runWithVerification, runCascade, taskNotificationDedupKey, uuidv7 } from "@sema-agent/core";
3
3
  import { heldFor } from "../../peer-seat.js";
4
- import { graftParkToolCallId, markChildrenStoppedByUserOnAbort, syncRefusalHttpStatus, zeroWorkRefusalFacts, releaseKeyIfZeroWorkRefusal, createPromptCommitReader, settleResumeAnchor, HEARTBEAT_MS } from "../../runs.js";
5
- import { atHostBoundary, sealResultForExit, outwardPlane } from "../../terminal.js";
4
+ import { beatRunHeartbeat, graftParkToolCallId, markChildrenStoppedByUserOnAbort, syncRefusalHttpStatus, zeroWorkRefusalFacts, releaseKeyIfZeroWorkRefusal, createPromptCommitReader, settleResumeAnchor, TurnAnchorCapture, HEARTBEAT_MS } from "../../runs.js";
5
+ import { atHostBoundary, failureCodeOf, sealResultForExit, outwardPlane } from "../../terminal.js";
6
6
  import { voidVerifierPauseCard } from "../../verifier-pause-card.js";
7
- import { withPrincipal } from "../../observability/principal-context.js";
7
+ import { withSubject } from "../../observability/principal-context.js";
8
8
  import { fleetRunPublisher, fleetRunLabels, fleetRunResiduals, nameFleetRowOnDelivery } from "../../fleet/fleet-bus.js";
9
9
  import { defaultSubagentTailBus } from "../../fleet/subagent-tail-bus.js";
10
10
  import { createLiveModelText, modelStreamOfTask } from "../../trace/model-segment.js";
11
11
  import { emitPendingWorkflowCompletions, taskNotificationInboxEntry, taskNotificationStreamKeyOf, NotifiedKeys } from "../../orchestration/workflow-completion-inbox.js";
12
- import { createForwardAppendFailedNote, createLedgerSink, createLedgerTwinEmit } from "../../trace/ledger-sink.js";
12
+ import { createForwardAppendFailedNote, createLedgerSink } from "../../trace/ledger-sink.js";
13
+ import { createHitlTransport } from "../../hitl-delivery.js";
13
14
  import { registerEngineNoticeLeg } from "../../trace/engine-notice-wire.js";
14
15
  import { clearTurnActivity, readTurnActivityMs, recordTurnActivity } from "../../turn-activity.js";
15
16
  import { buildCancelledLedgerRow, createRunAbort, mintCancelledResult } from "../../run-cancel-context.js";
16
17
  import { recordResourceWindow } from "../../resource-window.js";
17
18
  import { redactSecrets } from "../../trace/redact.js";
18
19
  import { writeLiveFrame, writeLiveHeartbeat } from "../live-frame.js";
19
- import { contextUsageEventData, turnEndEventData, toolStartEventData, toolEndEventData, taskProgressEventData, taskStartedEventData, taskNotificationEventData, compactedEventData, diagnosticsEventData, brainStatusEventData, steeringInjectedEventData, compactionOutcomeEventData, compactionStartedEventData, workspaceChangedEventData, wiringManifestFaceEventData, toolRosterDeltaEventData, toolProgressEventData, toolDisclosureEventData, humanInputEventData, appendModelUsageDelta, attachModelUsage, createPromptManifestSeat, liveIdentityFields } from "../../trace/project.js";
20
+ import { contextUsageEventData, turnEndEventData, toolStartEventData, toolEndEventData, taskProgressEventData, taskStartedEventData, taskNotificationEventData, compactedEventData, diagnosticsEventData, brainStatusEventData, steeringInjectedEventData, compactionOutcomeEventData, compactionStartedEventData, workspaceChangedEventData, wiringManifestFaceEventData, toolRosterDeltaEventData, toolProgressEventData, toolDisclosureEventData, humanInputEventData, appendModelUsageDelta, attachModelUsage, createPromptManifestSeat, identityFields } from "../../trace/project.js";
20
21
  import { cascadeConfig, fillRunPreviewOnDelivery, runMeta } from "../run-meta.js";
21
22
  import { idemCallerOf, inflightKeyOf, submissionIdemOf } from "../idempotency.js";
22
- import { replayOfExistingRun } from "../submit-replay.js";
23
- import { httpErrorCode, sendJson, sendError, sseHeaders } from "../send.js";
23
+ import { isReplayedOutcome, replayedOutcome, replayOfExistingRun } from "../submit-replay.js";
24
+ import { httpErrorCode, sendJson, sseHeaders } from "../send.js";
24
25
  import { collectSsePreamble } from "../sse-log.js";
25
26
  import { buildApprovalPreamble } from "../../approval-card.js";
26
- import { approvalPreambleReplays, createApprovalCardEmitter, declaredApprovalFrameFamilies, resolveApprovalLeg, resolveStreamApprovalGate } from "../../tool-approval.js";
27
+ import { approvalPreambleReplays, declaredApprovalFrameFamilies, resolveApprovalLeg, resolveStreamApprovalGate } from "../../tool-approval.js";
27
28
  import { buildActiveRunConflict, isActiveRunConflictBody, toDoneFrameResult } from "../active-run-conflict.js";
28
29
  import { commitExecutionContext } from "../execution-context.js";
29
30
  import { rootSessionAbsentAnswer } from "../execution-context.js";
31
+ import { recheckClaimBeforeLaunch, startClaimHeartbeat } from "../claim-heartbeat.js";
30
32
  import { timeClaim } from "../claim-latency.js";
31
33
  import { commitSessionInheritEnv } from "../session-inherit-env.js";
32
- import { headerStr, gatedPrincipal, explicitOperatorOk, runIdentityOf } from "../principal-gate.js";
33
- import { failOpenTagForDroppedFrame, recordFailOpen } from "../../observability/fail-open.js";
34
+ import { headerStr, gatedPerson, gatedSubject, explicitOperatorOk, runIdentityOf } from "../principal-gate.js";
35
+ import { recoveredSubject } from "../../owner-faces.js";
36
+ import { recordFailOpen } from "../../observability/fail-open.js";
34
37
  import { buildSyncSubmitBody } from "../sync-submit-body.js";
35
38
  import { assertNever } from "../route-ctx.js";
36
39
  import * as facts from "../../capability-facts.js";
37
- import { persistSubmissionCtx } from "../submit-ctx.js";
40
+ import { persistSubmissionCtx, SUBMIT_CTX_CLAIM_LOST } from "../submit-ctx.js";
38
41
  import { withModelReachScope } from "../../model-reach-scope.js";
39
42
  import { createInstructionSelectionLeg } from "../../instruction-selection.js";
40
- import { fieldConflictFacts } from "../../field-conflict.js";
41
43
  import { refusalBody } from "../refusal-body.js";
42
44
  import { heldWorkflowParkDecisions } from "../../parked-decide.js";
43
45
  import { createSessionWorkspaceRecorder, sessionWorkspaceStoreOf } from "../../session-workspace.js";
@@ -70,8 +72,8 @@ function refusalDoneResult(body) {
70
72
  const b = body;
71
73
  return { status: "failed", errorCode: String(b.errorCode), errorMessage: String(b.error) };
72
74
  }
73
- function doneResultOfOutcome(resp) {
74
- return resp.status === 200 ? resp.body : refusalDoneResult(resp.body);
75
+ function doneFrameOfOutcome(resp) {
76
+ return { type: "done", result: resp.status === 200 ? resp.body : refusalDoneResult(resp.body), ...(isReplayedOutcome(resp) ? { replay: true } : {}) };
75
77
  }
76
78
  const MULTI_ATTEMPT_NO_EVENT_CHANNEL_NOTICE = "verify / cascade ran with their normal multi-attempt semantics, but the synchronous /v1/tasks endpoint has no event channel — no status/progress frames exist to replay on this shape. For status / progress / delegated-child frames and the terminal done, submit via POST /v1/runs and read GET /v1/runs/:id/events; note that verify / cascade legs carry no per-turn stream there either (no wiring_manifest / text / turn_end frames — the engine runs those legs as result-returning attempts).";
77
79
  export async function handleTasks(req, res, match, ctx) {
@@ -99,18 +101,18 @@ export async function handleTasks(req, res, match, ctx) {
99
101
  const liveStream = match.decl.id === "tasks-submit-stream";
100
102
  {
101
103
  const rawIdem = headerStr(req.headers["idempotency-key"]);
102
- const submitter = gatedPrincipal(req, deps.config);
104
+ const submitter = gatedSubject(req, deps.config);
103
105
  const keyedBody = rawIdem ? await readJson(req) : undefined;
104
106
  const idem = rawIdem ? submissionIdemOf(rawIdem, idemCallerOf(req, ctx), keyedBody) : undefined;
105
107
  const inflightKey = idem ? inflightKeyOf(idem, "sync") : undefined;
106
108
  const cached = inflightKey ? idemCache.peek(inflightKey) : undefined;
107
109
  const keyedRow = idem && !cached && deps.runStore ? await deps.runStore.getRunByIdem(idem.key) : undefined;
108
110
  if (keyedRow && deps.runStore) {
109
- const replay = await replayOfExistingRun(keyedRow, { principal: submitter, idem }, "sync", deps, deps.runStore);
111
+ const replay = await replayOfExistingRun(keyedRow, { subject: submitter, idem }, "sync", deps, deps.runStore);
110
112
  if (liveStream && replay.status === 200) {
111
113
  sseHeaders(res, { "x-task-id": keyedRow.taskId });
112
114
  writeMetaFrame(res, keyedRow.taskId, keyedRow.sessionId);
113
- writeLiveFrame(res, { type: "done", result: replay.body, replay: true });
115
+ writeLiveFrame(res, doneFrameOfOutcome(replay));
114
116
  res.end();
115
117
  }
116
118
  else {
@@ -128,9 +130,9 @@ export async function handleTasks(req, res, match, ctx) {
128
130
  hb.unref?.();
129
131
  res.on("close", () => clearInterval(hb));
130
132
  try {
131
- const resp = await cached;
133
+ const resp = replayedOutcome(await cached);
132
134
  if (!res.writableEnded)
133
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(resp), replay: true });
135
+ writeLiveFrame(res, doneFrameOfOutcome(resp));
134
136
  }
135
137
  finally {
136
138
  clearInterval(hb);
@@ -138,7 +140,7 @@ export async function handleTasks(req, res, match, ctx) {
138
140
  res.end();
139
141
  }
140
142
  else {
141
- const resp = await cached;
143
+ const resp = replayedOutcome(await cached);
142
144
  sendSubmitResult(res, resp);
143
145
  }
144
146
  return;
@@ -150,7 +152,7 @@ export async function handleTasks(req, res, match, ctx) {
150
152
  if (!prepared)
151
153
  return;
152
154
  try {
153
- runSlot = admitRun(req, res);
155
+ runSlot = await admitRun(req, res, prepared.seat);
154
156
  if (runSlot === undefined)
155
157
  return;
156
158
  const declaredFamilies = declaredApprovalFrameFamilies(prepared.body.settings);
@@ -165,32 +167,32 @@ export async function handleTasks(req, res, match, ctx) {
165
167
  };
166
168
  };
167
169
  const assembleApprovalLeg = (streamApprovalOn) => resolveApprovalLeg({ ...approvalLegInput(streamApprovalOn), nowMonotonicMs: performance.now() });
168
- const principal = prepared.auth?.principal;
169
- const wiringOperatorFace = explicitOperatorOk(gatedPrincipal(req, deps.config), deps.config);
170
+ const principal = prepared.auth?.subject;
171
+ const wiringOperatorFace = explicitOperatorOk(gatedPerson(req, deps.config), deps.config);
170
172
  let wiringReceipt;
171
173
  const instructionLeg = createInstructionSelectionLeg();
172
174
  const legWiringSections = () => ({ instructions: instructionLeg.segment(), skills: prepared.legFacts?.skills });
173
175
  const withRunReceipt = (out) => wiringReceipt !== undefined ? { ...out, wiringManifest: wiringReceipt } : out;
174
176
  if (liveStream) {
175
- if (prepared.verify || prepared.cascade) {
176
- sendError(res, 400, "request.field_conflict", "verify / cascade are not supported on /v1/tasks/stream (both are multi-attempt, not a single stream) — use /v1/tasks or /v1/runs", fieldConflictFacts("cascade_verify", prepared.verify ? (prepared.cascade ? ["verify", "cascade"] : ["verify"]) : ["cascade"]));
177
- return;
178
- }
179
177
  const earlyDurableTid = facts.durableRuns(deps).available ? uuidv7() : undefined;
180
178
  const streamLegStartedAt = Date.now();
181
179
  const detachOnDisconnect = headerStr(req.headers["x-detach-on-disconnect"]) === "true";
182
- if (detachOnDisconnect && earlyDurableTid === undefined) {
183
- sendError(res, 400, "request.precondition_unmet", "x-detach-on-disconnect requires a durable run (a run store + sessionId) — without one the detached result would be unqueryable");
184
- return;
185
- }
186
180
  reqState.streamTaskId = earlyDurableTid;
187
181
  let usageKey;
188
182
  let manifestSeat;
189
183
  reqState.streamDetached = detachOnDisconnect;
184
+ let heldTerminal;
185
+ const writeTerminalFrame = (frame) => {
186
+ if (heldTerminal === undefined && prepared.seat.keepsWithoutWithdraw)
187
+ writeLiveFrame(res, frame);
188
+ else
189
+ heldTerminal = frame;
190
+ };
191
+ let stopClaimHeartbeat;
190
192
  sseHeaders(res, earlyDurableTid ? { "x-task-id": earlyDurableTid } : undefined);
191
193
  if (earlyDurableTid)
192
194
  writeMetaFrame(res, earlyDurableTid, prepared.spec.sessionId, prepared.warnings);
193
- const ac = createRunAbort(prepared.auth?.principal ?? null);
195
+ const ac = createRunAbort(prepared.auth?.subject ?? null);
194
196
  let closed = false;
195
197
  let detachLogged = false;
196
198
  let disconnectParkGrace;
@@ -235,18 +237,9 @@ export async function handleTasks(req, res, match, ctx) {
235
237
  checkpointStore: deps.checkpointStore,
236
238
  });
237
239
  const replaySessionId = approvalPreambleReplays(approvalLegInput(replayGate.active)) ? prepared.spec.sessionId : undefined;
238
- const presentedOnConnection = new Set();
239
- const presentedCompleted = new Set();
240
- const admitPresentedComplete = (askId) => {
241
- if (!presentedOnConnection.has(askId))
242
- return true;
243
- if (presentedCompleted.has(askId))
244
- return false;
245
- presentedCompleted.add(askId);
246
- return true;
247
- };
240
+ let connectionTransport;
248
241
  if (replaySessionId) {
249
- const replayOwner = gatedPrincipal(req, deps.config) ?? null;
242
+ const replayOwner = gatedSubject(req, deps.config) ?? null;
250
243
  const askStore = replayGate.active ? replayGate.askStore : undefined;
251
244
  let presentedAskIds = [];
252
245
  const preambleFrames = await collectSsePreamble(async (signal) => {
@@ -265,13 +258,11 @@ export async function handleTasks(req, res, match, ctx) {
265
258
  for (const f of preambleFrames)
266
259
  writeLiveFrame(res, { ...f });
267
260
  if (deps.toolApproval && preambleFrames.length > 0) {
268
- for (const askId of presentedAskIds)
269
- presentedOnConnection.add(askId);
270
261
  const unwatch = deps.toolApproval.watchPresentedCards(presentedAskIds, (frame) => {
271
- if (res.writableEnded || res.destroyed || !admitPresentedComplete(frame.askId))
262
+ if (res.writableEnded || res.destroyed)
272
263
  return;
273
264
  writeLiveFrame(res, { ...frame });
274
- });
265
+ }, () => connectionTransport);
275
266
  res.once("close", unwatch);
276
267
  }
277
268
  }
@@ -310,24 +301,28 @@ export async function handleTasks(req, res, match, ctx) {
310
301
  if (created.ok)
311
302
  recordResourceWindow(tid, prepared.spec.resourceSuspend);
312
303
  if (created.existing) {
313
- const replay = await replayOfExistingRun(created.existing, { principal: submitter, idem }, "sync", deps, deps.runStore);
314
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(replay), replay: true });
304
+ const replay = await replayOfExistingRun(created.existing, { subject: submitter, idem }, "sync", deps, deps.runStore);
305
+ writeTerminalFrame(doneFrameOfOutcome(replay));
315
306
  return replay;
316
307
  }
317
308
  if (created.sessionAbsent) {
318
309
  const refused = rootSessionAbsentAnswer();
319
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(refused) });
310
+ writeTerminalFrame(doneFrameOfOutcome(refused));
320
311
  return refused;
321
312
  }
322
313
  if (!created.ok) {
323
- const conflict = await buildActiveRunConflict({ runStore: deps.runStore, checkpointStore: deps.checkpointStore, governance: deps.config, runStaleSec: deps.config.runStaleSec, turnActivity: readTurnActivityMs }, prepared.spec.sessionId, created.activeTaskId);
314
+ const conflict = await buildActiveRunConflict({ runStore: deps.runStore, checkpointStore: deps.checkpointStore, governance: deps.config, turnActivity: readTurnActivityMs }, prepared.spec.sessionId, created.activeTaskId);
324
315
  const refused = { status: 409, body: conflict };
325
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(refused) });
316
+ writeTerminalFrame(doneFrameOfOutcome(refused));
326
317
  return refused;
327
318
  }
319
+ prepared.seat.noteOwnRun(tid);
320
+ if (detachOnDisconnect)
321
+ prepared.seat.markRecord();
322
+ stopClaimHeartbeat = startClaimHeartbeat(deps.runStore, tid, principal ?? null, deps.metrics);
328
323
  const placementReject = await commitExecutionContext(deps, { kind: "run", runStore: deps.runStore, taskId: tid }, prepared.execution);
329
324
  if (placementReject) {
330
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(placementReject) });
325
+ writeTerminalFrame(doneFrameOfOutcome(placementReject));
331
326
  return placementReject;
332
327
  }
333
328
  durableTaskId = tid;
@@ -335,13 +330,18 @@ export async function handleTasks(req, res, match, ctx) {
335
330
  }
336
331
  if (deps.checkpointStore) {
337
332
  const ctxRefusal = await persistSubmissionCtx(deps.checkpointStore, deps, durableTaskId !== undefined && deps.runStore ? { runStore: deps.runStore, taskId: durableTaskId } : undefined, prepared);
338
- if (ctxRefusal) {
339
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(ctxRefusal) });
333
+ if (ctxRefusal !== undefined && ctxRefusal !== SUBMIT_CTX_CLAIM_LOST) {
334
+ writeTerminalFrame(doneFrameOfOutcome(ctxRefusal));
340
335
  return ctxRefusal;
341
336
  }
342
337
  }
338
+ const lostClaim = durableTaskId !== undefined && deps.runStore ? await recheckClaimBeforeLaunch(deps, deps.runStore, prepared.spec.sessionId, durableTaskId) : undefined;
339
+ if (lostClaim !== undefined) {
340
+ writeTerminalFrame(doneFrameOfOutcome(lostClaim));
341
+ return lostClaim;
342
+ }
343
343
  commitSessionInheritEnv(deps, prepared.spec.sessionId, prepared.body);
344
- markChildrenStoppedByUserOnAbort(ac.signal, durableTaskId ?? prepared.spec.sessionId, prepared.auth?.principal);
344
+ markChildrenStoppedByUserOnAbort(ac.signal, durableTaskId ?? prepared.spec.sessionId, prepared.auth?.subject);
345
345
  let ledgerSink;
346
346
  let ledgerTerminal = false;
347
347
  if (durableTaskId && deps.runStore) {
@@ -353,8 +353,9 @@ export async function handleTasks(req, res, match, ctx) {
353
353
  manifestSeat = createPromptManifestSeat(deps.promptManifests, tid);
354
354
  const owner = principal ?? null;
355
355
  const abortFromVerb = () => ac.abort("cancel_verb");
356
+ stopClaimHeartbeat?.();
356
357
  durableHeartbeat = setInterval(() => {
357
- void rs.heartbeat(tid, owner).catch(() => undefined);
358
+ beatRunHeartbeat(rs, tid, owner, () => ac.abort("stall_verdict"), () => undefined);
358
359
  if (!ac.signal.aborted) {
359
360
  void Promise.resolve(rs.isCancelRequested?.(tid, owner)).then((c) => { if (c)
360
361
  abortFromVerb(); }).catch(() => undefined);
@@ -369,7 +370,7 @@ export async function handleTasks(req, res, match, ctx) {
369
370
  let fleetPub;
370
371
  try {
371
372
  fleetPub = durableTaskId
372
- ? fleetRunPublisher(deps.fleetBus, { runId: durableTaskId, scope: gatedPrincipal(req, deps.config) ?? "default", rootTaskId: durableTaskId, sessionId: prepared.spec.sessionId, ...fleetRunLabels(prepared.acceptance.objectiveAtSubmit) })
373
+ ? fleetRunPublisher(deps.fleetBus, { runId: durableTaskId, scope: gatedSubject(req, deps.config) ?? "default", rootTaskId: durableTaskId, sessionId: prepared.spec.sessionId, ...fleetRunLabels(prepared.acceptance.objectiveAtSubmit) })
373
374
  : undefined;
374
375
  if (fleetPub)
375
376
  nameFleetRowOnDelivery(prepared.acceptance, fleetPub);
@@ -410,7 +411,7 @@ export async function handleTasks(req, res, match, ctx) {
410
411
  live: (row) => {
411
412
  if (res.writableEnded || res.destroyed) {
412
413
  if (noticeLedger === undefined)
413
- recordFailOpen(failOpenTagForDroppedFrame("engine_notice"), "frame=engine_notice");
414
+ recordFailOpen("server.stream.frame-dropped-stream-closed", "frame=engine_notice");
414
415
  return;
415
416
  }
416
417
  writeLiveFrame(res, { type: "engine_notice", ...row });
@@ -425,7 +426,7 @@ export async function handleTasks(req, res, match, ctx) {
425
426
  await deps.userInputLedger.announceUndrained({ sessionId: prepared.spec.sessionId, taskId: durableTaskId });
426
427
  try {
427
428
  const streamBody = async () => {
428
- await withPrincipal(principal, async () => {
429
+ await withSubject(recoveredSubject(principal), async () => {
429
430
  const tailContentMode = prepared.spec.forwardSubagentEvents === true ? "on" : "progress_only";
430
431
  const childText = createLiveModelText();
431
432
  const topText = createLiveModelText();
@@ -510,6 +511,8 @@ export async function handleTasks(req, res, match, ctx) {
510
511
  const causeAtDone = ev.type === "done" ? ac.cause() : undefined;
511
512
  await deps.userInputLedger?.observeLegEvent(liveStream, ev);
512
513
  await prepared.acceptance.observe(ev);
514
+ if (ev.type === "done")
515
+ prepared.acceptance.settle(ev.result);
513
516
  await liveWorkspace.observe(ev);
514
517
  if (ledgerSink)
515
518
  await manifestSeat?.drain(ledgerSink.append);
@@ -523,7 +526,7 @@ export async function handleTasks(req, res, match, ctx) {
523
526
  finalizeTaskResult(ev.result, principal, prepared.spec.objective);
524
527
  noteRunOutcome(finalResult);
525
528
  await putRewindAnchor();
526
- settleFleet(outwardPlane(finalResult.terminal).status, fleetRunResiduals(finalResult));
529
+ settleFleet(outwardPlane(finalResult.terminal).status, fleetRunResiduals(finalResult, failureCodeOf(finalResult.terminal)));
527
530
  if (ledgerSink && finalResult) {
528
531
  if (usageKey && deps.modelUsage && deps.runStore && durableTaskId) {
529
532
  const rs2 = deps.runStore;
@@ -534,7 +537,7 @@ export async function handleTasks(req, res, match, ctx) {
534
537
  await ledgerSink.onDone(finalResult);
535
538
  ledgerTerminal = true;
536
539
  }
537
- writeLiveFrame(res, { ...ev, result: finalResult });
540
+ writeTerminalFrame({ ...ev, result: finalResult });
538
541
  continue;
539
542
  }
540
543
  if (ledgerSink) {
@@ -617,12 +620,11 @@ export async function handleTasks(req, res, match, ctx) {
617
620
  }
618
621
  else if (ev.type === "turn_end" || ev.type === "message_committed" || ev.type === "context_usage") {
619
622
  const e = ev;
620
- const ident = liveIdentityFields(e);
621
623
  const arm = ev.type === "turn_end"
622
- ? { type: "turn_end", ...turnEndEventData(ev), ...ident }
624
+ ? { type: "turn_end", ...turnEndEventData(ev) }
623
625
  : ev.type === "message_committed"
624
- ? { type: "message_committed", entryId: e.entryId, role: e.role, ...(e.toolCallId !== undefined ? { toolCallId: e.toolCallId } : {}), ...ident }
625
- : { type: "context_usage", ...contextUsageEventData(ev), ...ident };
626
+ ? { type: "message_committed", entryId: e.entryId, role: e.role, ...(e.toolCallId !== undefined ? { toolCallId: e.toolCallId } : {}), ...identityFields(e) }
627
+ : { type: "context_usage", ...contextUsageEventData(ev) };
626
628
  writeLiveFrame(res, arm);
627
629
  }
628
630
  else {
@@ -633,22 +635,20 @@ export async function handleTasks(req, res, match, ctx) {
633
635
  });
634
636
  };
635
637
  const askTaskId = durableTaskId ?? uuidv7();
636
- const askOwner = gatedPrincipal(req, deps.config) ?? null;
638
+ const askOwner = gatedSubject(req, deps.config) ?? null;
637
639
  const emitAsk = (frame) => {
638
640
  if (res.writableEnded || res.destroyed) {
639
- recordFailOpen(failOpenTagForDroppedFrame(frame.type), `frame=${frame.type}`);
641
+ recordFailOpen("server.stream.frame-dropped-stream-closed", `frame=${frame.type}`);
640
642
  return;
641
643
  }
642
644
  writeLiveFrame(res, { ...frame });
643
645
  };
644
646
  const faceAlive = () => !res.writableEnded && !res.destroyed;
645
- const emitElicitation = createLedgerTwinEmit({ sink: ledgerSink, writeLive: emitAsk, liveReachable: faceAlive });
646
- const writeQuestionLive = (frame) => {
647
- if (!faceAlive())
648
- throw new Error("live stream ended — question frame undeliverable");
649
- emitAsk(frame);
650
- };
651
- const emitQuestion = createLedgerTwinEmit({ sink: ledgerSink, writeLive: writeQuestionLive, liveReachable: faceAlive });
647
+ const hitlTransport = createHitlTransport({
648
+ ...(ledgerSink ? { ledger: ledgerSink.append } : {}),
649
+ live: { write: (frame) => writeLiveFrame(res, { ...frame }), alive: faceAlive },
650
+ });
651
+ connectionTransport = hitlTransport;
652
652
  await emitPendingWorkflowCompletions(deps.workflowCompletionInbox, prepared.spec.sessionId, askOwner, (frame) => {
653
653
  if (closed || res.writableEnded || res.destroyed)
654
654
  throw new Error("stream ended before the completion frame was written");
@@ -659,16 +659,11 @@ export async function handleTasks(req, res, match, ctx) {
659
659
  writeLiveFrame(res, frame);
660
660
  }, { route: "sync-stream-open", connection: "live-sse", log: (m, x) => deps.logger?.info?.(m, x) });
661
661
  const withElicit = deps.elicitation
662
- ? () => deps.elicitation.runWithContext({ taskId: askTaskId, owner: askOwner, emit: emitElicitation, abortSignal: ac.signal }, streamBody)
662
+ ? () => deps.elicitation.runWithContext({ taskId: askTaskId, owner: askOwner, transport: hitlTransport, abortSignal: ac.signal }, streamBody)
663
663
  : streamBody;
664
664
  const withQuestion = () => deps.question
665
- ? deps.question.runWithContext({ taskId: askTaskId, owner: askOwner, emit: emitQuestion, abortSignal: ac.signal, deliverable: faceAlive }, withElicit)
665
+ ? deps.question.runWithContext({ taskId: askTaskId, owner: askOwner, transport: hitlTransport, abortSignal: ac.signal }, withElicit)
666
666
  : withElicit();
667
- const emitApproval = (frame) => {
668
- if (res.writableEnded || res.destroyed)
669
- throw new Error("live stream ended — approval card undeliverable");
670
- emitAsk(frame);
671
- };
672
667
  const streamApprovalOn = resolveStreamApprovalGate({
673
668
  toolApprovalEnabled: Boolean(deps.toolApproval),
674
669
  streamApprovalEnabled: deps.config.streamApproval?.enabled === true,
@@ -678,27 +673,6 @@ export async function handleTasks(req, res, match, ctx) {
678
673
  const approvalLeg = assembleApprovalLeg(streamApprovalOn);
679
674
  const legDeadlineMonotonic = approvalLeg.legDeadlineMonotonic;
680
675
  const unattended = approvalLeg.unattended;
681
- const emitCard = createApprovalCardEmitter({
682
- ...(ledgerSink
683
- ? {
684
- appendDurable: async (frame) => {
685
- const { type, ...rest } = frame;
686
- await ledgerSink.append(type, rest);
687
- },
688
- }
689
- : {}),
690
- writeLive: (frame) => {
691
- if (res.writableEnded || res.destroyed)
692
- throw new Error("live stream ended");
693
- if (frame.type === "approval_complete" && !admitPresentedComplete(frame.askId))
694
- return;
695
- emitAsk(frame);
696
- },
697
- });
698
- const emitRevokeLive = (frame) => {
699
- if (!res.writableEnded && !res.destroyed)
700
- emitAsk(frame);
701
- };
702
676
  const approvalCtx = deps.toolApproval && unattended === undefined
703
677
  ? {
704
678
  taskId: askTaskId,
@@ -708,12 +682,12 @@ export async function handleTasks(req, res, match, ctx) {
708
682
  executionLane: prepared.execution.lane,
709
683
  ...(streamApprovalOn
710
684
  ? {
711
- emitCard,
712
- emitRevoke: emitRevokeLive,
685
+ family: "approval_request",
686
+ transport: hitlTransport,
713
687
  legKey: "",
714
688
  ...(legDeadlineMonotonic !== undefined ? { legDeadlineMonotonic } : {}),
715
689
  }
716
- : { emit: emitApproval }),
690
+ : { family: "tool_approval", transport: hitlTransport }),
717
691
  }
718
692
  : undefined;
719
693
  if (deps.toolApproval) {
@@ -754,7 +728,7 @@ export async function handleTasks(req, res, match, ctx) {
754
728
  }
755
729
  else {
756
730
  await putRewindAnchor();
757
- const pending = await deps.checkpointStore?.findPendingTokenBySession(prepared.spec.sessionId);
731
+ const pending = await deps.checkpointStore?.findPendingTokenBySession(prepared.spec.sessionId, undefined, { axis: "run" });
758
732
  const dcCause = ac.cause();
759
733
  if (pending) {
760
734
  if (ledgerSink && !ledgerTerminal) {
@@ -808,7 +782,7 @@ export async function handleTasks(req, res, match, ctx) {
808
782
  try {
809
783
  const row = await deps.runStore.getRun(durableTaskId);
810
784
  if (row?.status === "running") {
811
- const pending = await deps.checkpointStore?.findPendingTokenBySession(prepared.spec.sessionId);
785
+ const pending = await deps.checkpointStore?.findPendingTokenBySession(prepared.spec.sessionId, undefined, { axis: "run" });
812
786
  const backstopCause = ac.cause();
813
787
  if (pending) {
814
788
  if (ledgerSink && !ledgerTerminal) {
@@ -827,7 +801,7 @@ export async function handleTasks(req, res, match, ctx) {
827
801
  const retryPlane = outwardPlane(finalResult.terminal);
828
802
  await deps.runStore.setTerminal(durableTaskId, retryPlane.status, finalResult, retryPlane.errorMessage ?? null);
829
803
  await releaseKeyIfZeroWorkRefusal(deps.runStore, durableTaskId, finalResult);
830
- settleFleet(retryPlane.status, fleetRunResiduals(finalResult));
804
+ settleFleet(retryPlane.status, fleetRunResiduals(finalResult, failureCodeOf(finalResult.terminal)));
831
805
  }
832
806
  else if (backstopCause !== undefined) {
833
807
  const err = "stream aborted before completion (run cancelled)";
@@ -859,7 +833,14 @@ export async function handleTasks(req, res, match, ctx) {
859
833
  };
860
834
  counters.uncountedBillableInflight++;
861
835
  try {
862
- const settling = idemCache.run(inflightKey, async () => withRunReceipt(await runStreamSubmitLeg()));
836
+ const settling = idemCache.run(inflightKey, async () => {
837
+ try {
838
+ return withRunReceipt(await runStreamSubmitLeg());
839
+ }
840
+ finally {
841
+ await prepared.seat.close();
842
+ }
843
+ });
863
844
  if (!ranLive)
864
845
  runSlot?.release();
865
846
  resp = await settling;
@@ -872,16 +853,24 @@ export async function handleTasks(req, res, match, ctx) {
872
853
  finally {
873
854
  counters.uncountedBillableInflight--;
874
855
  clearInterval(hb);
856
+ stopClaimHeartbeat?.();
875
857
  if (usageKey)
876
858
  deps.modelUsage?.clear(usageKey);
877
859
  manifestSeat?.release();
878
860
  }
879
861
  if (!ranLive && resp && !res.writableEnded) {
880
- writeLiveFrame(res, { type: "done", result: doneResultOfOutcome(resp), replay: true });
862
+ writeTerminalFrame(doneFrameOfOutcome(replayedOutcome(resp)));
881
863
  }
864
+ await prepared.seat.deliverTerminal(() => {
865
+ const frame = heldTerminal;
866
+ heldTerminal = undefined;
867
+ if (frame !== undefined && !res.writableEnded)
868
+ writeLiveFrame(res, frame);
869
+ });
882
870
  res.end();
883
871
  }
884
872
  else {
873
+ let stopSyncClaimHeartbeat;
885
874
  const withSyncSubmitKeys = (body) => {
886
875
  const extra = {
887
876
  ...(prepared.verify || prepared.cascade ? { notice: MULTI_ATTEMPT_NO_EVENT_CHANNEL_NOTICE } : {}),
@@ -901,11 +890,13 @@ export async function handleTasks(req, res, match, ctx) {
901
890
  if (created.ok)
902
891
  recordResourceWindow(tid, prepared.spec.resourceSuspend);
903
892
  if (created.existing)
904
- return await replayOfExistingRun(created.existing, { principal: submitter, idem }, "sync", deps, deps.runStore);
893
+ return await replayOfExistingRun(created.existing, { subject: submitter, idem }, "sync", deps, deps.runStore);
905
894
  if (created.sessionAbsent)
906
895
  return rootSessionAbsentAnswer();
907
896
  if (!created.ok)
908
- return { status: 409, body: await buildActiveRunConflict({ runStore: deps.runStore, checkpointStore: deps.checkpointStore, governance: deps.config, runStaleSec: deps.config.runStaleSec, turnActivity: readTurnActivityMs }, prepared.spec.sessionId, created.activeTaskId) };
897
+ return { status: 409, body: await buildActiveRunConflict({ runStore: deps.runStore, checkpointStore: deps.checkpointStore, governance: deps.config, turnActivity: readTurnActivityMs }, prepared.spec.sessionId, created.activeTaskId) };
898
+ prepared.seat.noteOwnRun(tid);
899
+ stopSyncClaimHeartbeat = startClaimHeartbeat(deps.runStore, tid, principal ?? null, deps.metrics);
909
900
  const placementReject = await commitExecutionContext(deps, { kind: "run", runStore: deps.runStore, taskId: tid }, prepared.execution);
910
901
  if (placementReject)
911
902
  return placementReject;
@@ -914,19 +905,23 @@ export async function handleTasks(req, res, match, ctx) {
914
905
  }
915
906
  if (deps.checkpointStore) {
916
907
  const ctxRefusal = await persistSubmissionCtx(deps.checkpointStore, deps, durableTaskId !== undefined && deps.runStore ? { runStore: deps.runStore, taskId: durableTaskId } : undefined, prepared);
917
- if (ctxRefusal)
908
+ if (ctxRefusal !== undefined && ctxRefusal !== SUBMIT_CTX_CLAIM_LOST)
918
909
  return ctxRefusal;
919
910
  }
911
+ const lostClaim = durableTaskId !== undefined && deps.runStore ? await recheckClaimBeforeLaunch(deps, deps.runStore, prepared.spec.sessionId, durableTaskId) : undefined;
912
+ if (lostClaim !== undefined)
913
+ return lostClaim;
920
914
  commitSessionInheritEnv(deps, prepared.spec.sessionId, prepared.body);
921
915
  const syncCancelCtrl = createRunAbort(principal ?? null);
922
- markChildrenStoppedByUserOnAbort(syncCancelCtrl.signal, durableTaskId ?? prepared.spec.sessionId, prepared.auth?.principal);
916
+ markChildrenStoppedByUserOnAbort(syncCancelCtrl.signal, durableTaskId ?? prepared.spec.sessionId, prepared.auth?.subject);
923
917
  if (durableTaskId && deps.runStore) {
924
918
  const rs = deps.runStore;
925
919
  const tid = durableTaskId;
926
920
  const owner = principal ?? null;
927
921
  const abortFromVerb = () => syncCancelCtrl.abort("cancel_verb");
922
+ stopSyncClaimHeartbeat?.();
928
923
  durableHeartbeat = setInterval(() => {
929
- void rs.heartbeat(tid, owner).catch(() => undefined);
924
+ beatRunHeartbeat(rs, tid, owner, () => syncCancelCtrl.abort("stall_verdict"), () => undefined);
930
925
  if (!syncCancelCtrl.signal.aborted) {
931
926
  void Promise.resolve(rs.isCancelRequested?.(tid, owner)).then((c) => { if (c)
932
927
  abortFromVerb(); }).catch(() => undefined);
@@ -957,14 +952,28 @@ export async function handleTasks(req, res, match, ctx) {
957
952
  const plainLeg = async () => {
958
953
  const stream = prepared.runner.runTaskStream(specWithSignal, undefined, heldDecisions);
959
954
  const syncWorkspace = createSessionWorkspaceRecorder(sessionWorkspaceStoreOf(deps.sessionStorage), prepared.legFacts?.sessionWitness);
955
+ const anchorKey = durableTaskId;
956
+ const anchorStore = deps.resumeAnchorStore;
957
+ const anchor = new TurnAnchorCapture(undefined, "sync", anchorStore && anchorKey ? async (entryId) => { await anchorStore.put(prepared.spec.sessionId, anchorKey, entryId, principal ?? null); } : undefined);
960
958
  for await (const ev of stream) {
961
959
  observeSyncLegEvent(ev);
960
+ switch (ev.type) {
961
+ case "human_input":
962
+ anchor.onHumanInput(ev);
963
+ break;
964
+ case "message_committed":
965
+ await anchor.onMessageCommitted(ev.role, ev.entryId);
966
+ break;
967
+ case "turn_end":
968
+ await anchor.onTurnEnd();
969
+ break;
970
+ }
962
971
  await prepared.acceptance.observe(ev);
963
972
  await syncWorkspace.observe(ev);
964
973
  }
965
974
  return stream.result();
966
975
  };
967
- result = atHostBoundary(await instructionLeg.run(prepared.spec.sessionId, () => withPrincipal(principal, () => prepared.verify ? verifyLeg(prepared.verify) : prepared.cascade ? cascadeLeg() : plainLeg())), prepared.spec.sessionId);
976
+ result = atHostBoundary(await instructionLeg.run(prepared.spec.sessionId, () => withSubject(recoveredSubject(principal), () => prepared.verify ? verifyLeg(prepared.verify) : prepared.cascade ? cascadeLeg() : plainLeg())));
968
977
  }
969
978
  finally {
970
979
  counters.uncountedBillableInflight--;
@@ -1020,18 +1029,25 @@ export async function handleTasks(req, res, match, ctx) {
1020
1029
  let ranSyncLeg = false;
1021
1030
  const settling = idemCache.run(inflightKey, async () => {
1022
1031
  ranSyncLeg = true;
1023
- return withRunReceipt(await runSyncSubmitLeg());
1032
+ try {
1033
+ return withRunReceipt(await runSyncSubmitLeg());
1034
+ }
1035
+ finally {
1036
+ await prepared.seat.close();
1037
+ }
1024
1038
  });
1025
1039
  if (!ranSyncLeg)
1026
1040
  runSlot?.release();
1027
- const resp = await settling;
1028
- sendSubmitResult(res, resp);
1041
+ const settled = await settling.finally(() => stopSyncClaimHeartbeat?.());
1042
+ const resp = ranSyncLeg ? settled : replayedOutcome(settled);
1043
+ await prepared.seat.deliverTerminal(() => sendSubmitResult(res, resp));
1029
1044
  }
1030
1045
  return;
1031
1046
  }
1032
1047
  finally {
1033
1048
  runSlot?.release();
1034
1049
  prepared.peerLease.release();
1050
+ await prepared.seat.close();
1035
1051
  }
1036
1052
  }
1037
1053
  }
@@ -1,15 +1,3 @@
1
- /**
2
- * [ref] A9 域模块 —— Task Trace 只读面 + 用量统计面。
3
- *
4
- * 路由:`GET /v1/tasks/source-summary`(跨租户 door 汇总,ops-only)、`GET /v1/tasks[/:id/{turns,stream,artifacts}]`
5
- * (S1 Task Trace API)、`GET /v1/usage/{summary,series,breakdown}`(web P4 / registry AnalyticsSource)。
6
- *
7
- * ⚠️ 三块都跑在全局 service-credential 门**之前**(与 /metrics 同款待遇)——只读 traceToken 单凭据的调用方
8
- * (registry 中继的姿势)在全局门会被 401,挂门后=门内 traceToken 支持成死代码(1.148 a2 实机抓获)。
9
- * [ref](7.105.0):门前不等于不设防 —— 本域坐在读路谓词段,先过 `dispatch.ts` 的 `readCredentialOk`
10
- * (部署配了 service 凭据时要「service token / traceToken / 已验 principal」之一),块内这几道门在它之后。
11
- * 因此本域在 `handle()` 里的位置就是契约的一部分:必须留在鉴权门上方,顺序不可与其他域对调。本域零可变状态。
12
- */
13
1
  import type { IncomingMessage, ServerResponse } from "node:http";
14
2
  import type { RouteCtx, RouteMatch, RouteIdsOf } from "../route-ctx.js";
15
3
  /** 路由体 = 从 `server.ts` 的 `handle()` 里**整段剪切**过来的原文(唯一改动:统一去缩进两格)。裸 `return;`