@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,3 +1,5 @@
1
+ import { seatText } from "../../trace/exit-seat.js";
2
+ import { isHolderDeathVerdict } from "../../plugins/store-contracts.js";
1
3
  import { projectEvents, taskSummary, mapTraceEvent } from "../../trace/project.js";
2
4
  import { redactLedgerEventForRead } from "../../observability/run-terminal.js";
3
5
  import { projectArtifacts } from "../../trace/artifacts.js";
@@ -6,7 +8,9 @@ import { sleep } from "../sse-log.js";
6
8
  import { bindSseLifecycle } from "../sse-lifecycle.js";
7
9
  import { sendJson, sendError, sseHeaders, SSE_MAX_STREAM_MS, SSE_HEARTBEAT_IDLE_MS } from "../send.js";
8
10
  import { filterFingerprint } from "../cursor-fingerprint.js";
9
- import { fleetViewOf, sendUnauthorized } from "../principal-gate.js";
11
+ import { sendUnauthorized } from "../principal-gate.js";
12
+ import { admitRunById, enter, entryIsFleet, readVisibleRun, routeListFilter, runRowAt } from "../owner-access.js";
13
+ import { listFilterOf } from "../../owner-faces.js";
10
14
  import { assertNever } from "../route-ctx.js";
11
15
  import * as facts from "../../capability-facts.js";
12
16
  const TOOL_RESULT_LIMIT_CAP = 262_144;
@@ -15,7 +19,7 @@ export async function handleTraceUsage(req, res, match, ctx) {
15
19
  const { deps } = ctx;
16
20
  const { safeDecode } = ctx.helpers;
17
21
  if (match.decl.id === "tasks-source-summary") {
18
- if (!fleetViewOf(req, deps, "read").fleetWide) {
22
+ if (!routeListFilter(req, deps, match.decl.id).fleetWide) {
19
23
  sendUnauthorized(res, "operator");
20
24
  return;
21
25
  }
@@ -35,11 +39,10 @@ export async function handleTraceUsage(req, res, match, ctx) {
35
39
  match.decl.id === "task-trace-stream" ||
36
40
  match.decl.id === "task-trace-artifacts" ||
37
41
  match.decl.id === "task-tool-result") {
38
- const { fleetWide, gateOwner } = fleetViewOf(req, deps, "read");
39
- if (!fleetWide && gateOwner === null) {
40
- sendUnauthorized(res, "identity");
42
+ const traceEntry = enter(req, res, deps, match.decl.id);
43
+ if (traceEntry === undefined)
41
44
  return;
42
- }
45
+ const gateOwner = listFilterOf(traceEntry.face, traceEntry.caller).gateOwner;
43
46
  const runs = facts.durableRuns(deps);
44
47
  if (!runs.available) {
45
48
  sendError(res, 501, "capability.run_store_required", "trace API requires a durable run store (DB_BACKEND=mysql|pg|local)");
@@ -48,31 +51,33 @@ export async function handleTraceUsage(req, res, match, ctx) {
48
51
  const runStore = runs.runStore;
49
52
  const query = new URLSearchParams(match.search);
50
53
  const taskId = match.params.taskId;
51
- let ownedRun;
52
- if (taskId && gateOwner !== null) {
53
- const run = await runStore.getRun(taskId);
54
- if (!run || (run.owner !== null && run.owner !== gateOwner)) {
55
- sendError(res, 404, "not_found.run", "task not found");
54
+ let admittedRun;
55
+ const readDeferred = match.decl.id === "task-tool-result" && entryIsFleet(traceEntry);
56
+ if (taskId !== undefined && !readDeferred) {
57
+ const admitted = await admitRunById(traceEntry, res, runStore, taskId);
58
+ if (admitted === undefined)
56
59
  return;
57
- }
58
- ownedRun = run;
60
+ admittedRun = admitted.row;
59
61
  }
60
62
  switch (match.decl.id) {
61
63
  case "task-trace-list":
62
64
  await handleTaskList(res, runStore, query, gateOwner);
63
65
  return;
64
66
  case "task-trace-turns":
65
- await handleTaskTurns(res, runStore, taskId, query);
67
+ await handleTaskTurns(res, runStore, admittedRun, query);
66
68
  return;
67
69
  case "task-trace-stream":
68
- await streamTaskTrace(req, res, runStore, taskId, deps.config.runStaleSec * 1000, match.search);
70
+ await streamTaskTrace(req, res, runStore, admittedRun, match.search);
69
71
  return;
70
72
  case "task-trace-artifacts":
71
- await handleTaskArtifacts(res, runStore, taskId);
73
+ await handleTaskArtifacts(res, runStore, admittedRun);
72
74
  return;
73
- case "task-tool-result":
74
- await handleToolResult(res, deps.toolResultStore, runStore, taskId, ownedRun, safeDecode(match.params.ref), query);
75
+ case "task-tool-result": {
76
+ const ownedRun = admittedRun;
77
+ const readRun = ownedRun !== undefined ? async () => ownedRun : () => readVisibleRun(traceEntry, runStore, taskId);
78
+ await handleToolResult(res, deps.toolResultStore, taskId, readRun, safeDecode(match.params.ref), query);
75
79
  return;
80
+ }
76
81
  default:
77
82
  return assertNever(match.decl.id);
78
83
  }
@@ -88,7 +93,7 @@ export async function handleTraceUsage(req, res, match, ctx) {
88
93
  return;
89
94
  }
90
95
  const runStore = runs.runStore;
91
- const { fleetWide, gateOwner } = fleetViewOf(req, deps, "read");
96
+ const { fleetWide, gateOwner } = routeListFilter(req, deps, match.decl.id);
92
97
  if (!fleetWide && gateOwner === null) {
93
98
  sendUnauthorized(res, "identity");
94
99
  return;
@@ -176,16 +181,12 @@ async function handleTaskList(res, runStore, query, forceOwner) {
176
181
  const nextCursor = hasMore && last ? encodeCursor({ createdAt: last.createdAt, taskId: last.taskId }, f) : undefined;
177
182
  sendJson(res, 200, { tasks, ...(nextCursor ? { nextCursor } : {}) });
178
183
  }
179
- async function handleTaskArtifacts(res, runStore, taskId) {
180
- const run = await runStore.getRun(taskId);
181
- if (!run) {
182
- sendError(res, 404, "not_found.run", "task not found");
183
- return;
184
- }
184
+ async function handleTaskArtifacts(res, runStore, run) {
185
+ const taskId = run.taskId;
185
186
  const events = await runStore.getEvents(taskId, 0);
186
187
  sendJson(res, 200, { artifacts: projectArtifacts(events, { taskId, jobId: run.jobId }) });
187
188
  }
188
- async function handleToolResult(res, store, runStore, taskId, ownedRun, ref, query) {
189
+ async function handleToolResult(res, store, taskId, readRun, ref, query) {
189
190
  const intParam = (name, cap) => {
190
191
  const raw = query.get(name);
191
192
  if (raw === null)
@@ -212,7 +213,7 @@ async function handleToolResult(res, store, runStore, taskId, ownedRun, ref, que
212
213
  const notFound = () => sendError(res, 404, "not_found.tool_result", "tool result not found");
213
214
  if (ref === null)
214
215
  return notFound();
215
- const run = ownedRun ?? (await runStore.getRun(taskId));
216
+ const run = await readRun();
216
217
  if (!run)
217
218
  return notFound();
218
219
  const owner = store?.ownerOf ? await store.ownerOf(ref) : undefined;
@@ -227,12 +228,8 @@ async function handleToolResult(res, store, runStore, taskId, ownedRun, ref, que
227
228
  sendJson(res, 200, { content: slice.content, offset: slice.offset, totalChars: slice.totalChars });
228
229
  }
229
230
  const readFaceEvent = (ev) => ({ ...ev, data: redactLedgerEventForRead(ev.type, ev.data) });
230
- async function handleTaskTurns(res, runStore, taskId, query) {
231
- const run = await runStore.getRun(taskId);
232
- if (!run) {
233
- sendError(res, 404, "not_found.run", "task not found");
234
- return;
235
- }
231
+ async function handleTaskTurns(res, runStore, run, query) {
232
+ const taskId = run.taskId;
236
233
  const limit = Math.min(100, Math.max(1, Number(query.get("limit") ?? 20) || 20));
237
234
  const cursorSeq = Number(query.get("cursor") ?? 0) || 0;
238
235
  const [events, retainedFrom] = await Promise.all([runStore.getEvents(taskId, 0), runStore.retainedFrom(taskId)]);
@@ -243,12 +240,8 @@ async function handleTaskTurns(res, runStore, taskId, query) {
243
240
  const nextCursor = eligible.length > limit && oldest ? String(oldest.seq) : undefined;
244
241
  sendJson(res, 200, { turns, ...(nextCursor ? { nextCursor } : {}), retainedFrom });
245
242
  }
246
- async function streamTaskTrace(req, res, runStore, taskId, staleMs, search) {
247
- const run0 = await runStore.getRun(taskId);
248
- if (!run0) {
249
- sendError(res, 404, "not_found.run", "task not found");
250
- return;
251
- }
243
+ async function streamTaskTrace(req, res, runStore, admitted, search) {
244
+ const taskId = admitted.taskId;
252
245
  const lastId = Number(req.headers["last-event-id"] ?? new URLSearchParams(search).get("from") ?? 0);
253
246
  let from = Number.isFinite(lastId) ? lastId : 0;
254
247
  sseHeaders(res);
@@ -259,26 +252,27 @@ async function streamTaskTrace(req, res, runStore, taskId, staleMs, search) {
259
252
  });
260
253
  const start = Date.now();
261
254
  let lastBeat = Date.now();
255
+ let deliveredTerminal = false;
262
256
  const write = (events) => {
263
257
  for (const ev of events) {
264
258
  const out = mapTraceEvent(ev.type, ev.seq, (readFaceEvent(ev).data ?? {}));
265
259
  if (out)
266
260
  res.write(`id: ${ev.seq}\nevent: ${out.event}\ndata: ${JSON.stringify(out.data)}\n\n`);
267
261
  from = ev.seq;
262
+ if (ev.type === "done" || ev.type === "failed")
263
+ deliveredTerminal = true;
268
264
  }
269
265
  };
270
266
  while (!closed) {
271
- const [events, run] = await Promise.all([runStore.getEvents(taskId, from), runStore.getRun(taskId)]);
267
+ const [events, raw] = await Promise.all([runStore.getEvents(taskId, from), runStore.getRun(taskId)]);
272
268
  write(events);
273
- if (!run)
269
+ if (!raw)
274
270
  break;
271
+ const run = await runRowAt("task-trace-stream", runStore, raw);
275
272
  if (run.status !== "running") {
276
273
  write(await runStore.getEvents(taskId, from));
277
- break;
278
- }
279
- const stale = Date.now() - new Date(run.updatedAt).getTime() > staleMs;
280
- if (stale && events.length === 0) {
281
- res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "WORKER_DOWN", message: "run stalled (instance lost?)" })}\n\n`);
274
+ if (!deliveredTerminal && isHolderDeathVerdict(run))
275
+ res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "WORKER_DOWN", message: seatText("trace-frame-text", run.error ?? "") })}\n\n`);
282
276
  break;
283
277
  }
284
278
  if (Date.now() - start > SSE_MAX_STREAM_MS) {
@@ -2,7 +2,6 @@ import type { IncomingMessage, ServerResponse } from "node:http";
2
2
  import { type WorkflowRun } from "@sema-agent/core";
3
3
  import { type Admit } from "../../trace/projection-table.js";
4
4
  import type { RouteCtx, RouteMatch, RouteIdsOf } from "../route-ctx.js";
5
- /** SVC-5 的 steer 路——`handle()` 里位置在 tasks/runs 之后(鉴权门之后),故是**独立**的域入口。 */
6
5
  /** 路由体 = 从 `server.ts` 的 `handle()` 里**整段剪切**过来的原文(唯一改动:统一去缩进两格)。裸 `return;`
7
6
  * = 「本域已应答」;走到函数尾才是「没匹配上」。跨域的东西一律在首行解构出来。 */
8
7
  export declare function handleWorkflows(req: IncomingMessage, res: ServerResponse, match: RouteMatch<WorkflowsRouteId>, ctx: RouteCtx): Promise<void>;
@@ -20,7 +19,7 @@ export interface GroupForest {
20
19
  readonly roots: readonly WorkflowGroupRow[];
21
20
  readonly childrenOf: ReadonlyMap<WorkflowGroupRow, readonly WorkflowGroupRow[]>;
22
21
  }
23
- /** 详情面九张表的铸键与 `rows` 读到的根:原记录 + 本次投影建一次的组森林。 */
22
+ /** 详情面十一张表的铸键与 `rows` 读到的根:原记录 + 本次投影建一次的组森林。 */
24
23
  export interface WorkflowDetailRoot {
25
24
  readonly run: WorkflowRun;
26
25
  readonly forest: GroupForest;
@@ -171,6 +170,28 @@ export declare const WORKFLOW_RUN_STATS_DISPOSITIONS: {
171
170
  };
172
171
  };
173
172
  };
173
+ /**
174
+ * run 级预算超支(core `WorkflowRun.budgetOvershoot`:终局 run 真花超了上限才有,条件铸)。展示面审(core 型亲读):三格全是令牌数 ——
175
+ * `budgetTokens` 配置的上限、`spentTokens` 已结算的实花、`unsettledTokens` 终局时仍在飞的腿上观测到的花费(估计值,消费方与前者相加;引擎只在非零时写这一格,缺席与零同读)——
176
+ * 没有文本成员 ⇒ 逐成员 `forward`,不过脱敏器,也不开自由数据通道。
177
+ */
178
+ export declare const WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS: {
179
+ readonly budgetTokens: "forward";
180
+ readonly spentTokens: "forward";
181
+ readonly unsettledTokens: "forward";
182
+ };
183
+ /**
184
+ * run 级总超时截断(core `WorkflowRun.timeoutInterruption`:总超时的截止线在 run 到达终局之前已经触发才有,条件铸)。展示面审(core 型亲读):五格全是毫秒数与计数 ——
185
+ * `timeoutMs` 触发的那条线、`agentsCompleted` / `agentsFailed` / `agentsInFlight` 截断那一刻的三个计数(时点快照,`agentsFailed` 不是 run 级 `agentFailures`)、
186
+ * `approvalWaitedMs` 单条腿等审批的最长一段(下界,缺席 = 部署没供给,不是零)—— 没有文本成员 ⇒ 逐成员 `forward`,不过脱敏器,也不开自由数据通道。
187
+ */
188
+ export declare const WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS: {
189
+ readonly timeoutMs: "forward";
190
+ readonly agentsCompleted: "forward";
191
+ readonly agentsFailed: "forward";
192
+ readonly agentsInFlight: "forward";
193
+ readonly approvalWaitedMs: "forward";
194
+ };
174
195
  export declare const WORKFLOW_RUN_DISPOSITIONS: {
175
196
  readonly id: "forward";
176
197
  readonly scope: "forward";
@@ -200,6 +221,22 @@ export declare const WORKFLOW_RUN_DISPOSITIONS: {
200
221
  };
201
222
  };
202
223
  readonly agentFailures: "forward";
224
+ readonly budgetOvershoot: {
225
+ readonly nested: {
226
+ readonly budgetTokens: "forward";
227
+ readonly spentTokens: "forward";
228
+ readonly unsettledTokens: "forward";
229
+ };
230
+ };
231
+ readonly timeoutInterruption: {
232
+ readonly nested: {
233
+ readonly timeoutMs: "forward";
234
+ readonly agentsCompleted: "forward";
235
+ readonly agentsFailed: "forward";
236
+ readonly agentsInFlight: "forward";
237
+ readonly approvalWaitedMs: "forward";
238
+ };
239
+ };
203
240
  readonly startedAt: "forward";
204
241
  readonly endedAt: "forward";
205
242
  readonly createdAt: "forward";
@@ -350,8 +387,6 @@ export declare const WORKFLOW_RUN_DISPOSITIONS: {
350
387
  readonly sourceTaskId: "strip";
351
388
  readonly originatingSessionId: "strip";
352
389
  readonly effectiveArgs: "strip";
353
- readonly budgetOvershoot: "strip";
354
- readonly timeoutInterruption: "strip";
355
390
  readonly resultFull: "strip";
356
391
  readonly completionId: "strip";
357
392
  readonly resume: "strip";
@@ -10,16 +10,27 @@ import { projectByTable } from "../../trace/projection-table.js";
10
10
  const JOURNAL_PROJECTION_MEMO_CAP = 1024;
11
11
  const journalProjectionMemo = new Map();
12
12
  import { sendJson, sendError, sseHeaders } from "../send.js";
13
- import { gatedPrincipal, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
13
+ import { gatedSubject, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
14
+ import { partsOf } from "../../owner-brands.js";
15
+ import { taskSpecIdentityOf } from "../../engine-identity.js";
14
16
  import { assertNever } from "../route-ctx.js";
17
+ import { callerOf, sessionAsserted } from "../owner-access.js";
15
18
  import * as facts from "../../capability-facts.js";
16
19
  import { steerBodyKeyIssue } from "../../request-key-closure.js";
20
+ function sendWorkflowAbsent(res) {
21
+ sendError(res, 404, "not_found.workflow", "workflow not found");
22
+ }
23
+ const WORKFLOW_SESSION_ASSERTION = {
24
+ "workflow-detail": { phase: "accept", label: "workflow.detail" },
25
+ "workflow-journal": { phase: "accept", label: "workflow.journal" },
26
+ "workflow-stream": { phase: "accept", label: "workflow.stream" },
27
+ "workflow-agent-steer": { phase: "accept", label: "workflow.agent-steer" },
28
+ };
17
29
  export async function handleWorkflows(req, res, match, ctx) {
18
30
  const { deps } = ctx;
19
- const { runSessionAcceptOk } = ctx.helpers;
20
31
  {
21
- const principal = gatedPrincipal(req, deps.config);
22
- if (deps.config.requirePrincipal && !principal) {
32
+ const subject = gatedSubject(req, deps.config);
33
+ if (deps.config.requirePrincipal && !subject) {
23
34
  sendPrincipalRefusal(res, req, deps.config);
24
35
  return;
25
36
  }
@@ -38,7 +49,7 @@ export async function handleWorkflows(req, res, match, ctx) {
38
49
  return;
39
50
  }
40
51
  const runStore = runs.store;
41
- const scope = principal ?? "default";
52
+ const scope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
42
53
  const wfId = match.params.runId;
43
54
  const isStream = match.decl.id === "workflow-stream";
44
55
  if (match.decl.id === "workflows-list") {
@@ -62,11 +73,13 @@ export async function handleWorkflows(req, res, match, ctx) {
62
73
  }
63
74
  const run = await getWorkflowRun(runStore, wfId, scope);
64
75
  if (!run || run.scope !== scope) {
65
- sendError(res, 404, "not_found.workflow", "workflow not found");
76
+ sendWorkflowAbsent(res);
66
77
  return;
67
78
  }
68
- if (!runSessionAcceptOk(req, res, { sessionId: run.originatingSessionId ?? null }, match.decl.id === "workflow-journal" ? "workflow.journal" : isStream ? "workflow.stream" : "workflow.detail", "workflow not found"))
79
+ if (!sessionAsserted(WORKFLOW_SESSION_ASSERTION[match.decl.id], req, run.originatingSessionId, callerOf(req, deps).operator)) {
80
+ sendWorkflowAbsent(res);
69
81
  return;
82
+ }
70
83
  if (match.decl.id === "workflow-journal") {
71
84
  if (journalStore === undefined)
72
85
  throw new Error("workflow-journal reached without the workflowsJournal journal witness");
@@ -154,7 +167,7 @@ export async function handleWorkflows(req, res, match, ctx) {
154
167
  }
155
168
  export async function handleWorkflowAgentSteer(req, res, match, ctx) {
156
169
  const { deps } = ctx;
157
- const { readJson, rateLimited, quotaExceeded, leaseDenied, safeDecode, runSessionAcceptOk } = ctx.helpers;
170
+ const { readJson, rateLimited, quotaExceeded, leaseDenied, safeDecode } = ctx.helpers;
158
171
  switch (match.decl.id) {
159
172
  case "workflow-agent-steer":
160
173
  break;
@@ -169,7 +182,8 @@ export async function handleWorkflowAgentSteer(req, res, match, ctx) {
169
182
  sendWorkflowsUnavailable(res, runs.why);
170
183
  return;
171
184
  }
172
- const principal = gatedPrincipal(req, deps.config);
185
+ const subject = gatedSubject(req, deps.config);
186
+ const principal = subject === undefined ? undefined : partsOf(subject).person;
173
187
  if (deps.config.requirePrincipal && principal === undefined) {
174
188
  sendPrincipalRefusal(res, req, deps.config);
175
189
  return;
@@ -197,14 +211,16 @@ export async function handleWorkflowAgentSteer(req, res, match, ctx) {
197
211
  return;
198
212
  }
199
213
  const trusted = explicitOperatorOk(principal, deps.config);
200
- const ownerScope = principal ?? "default";
214
+ const ownerScope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
201
215
  const wfRun = await getWorkflowRun(runs.store, wfRunId, ownerScope);
202
216
  if (!trusted && !wfRun) {
203
- sendError(res, 404, "not_found.workflow", "workflow not found");
217
+ sendWorkflowAbsent(res);
204
218
  return;
205
219
  }
206
- if (wfRun && !runSessionAcceptOk(req, res, { sessionId: wfRun.originatingSessionId ?? null }, "workflow.agent-steer", "workflow not found"))
220
+ if (wfRun && !sessionAsserted(WORKFLOW_SESSION_ASSERTION["workflow-agent-steer"], req, wfRun.originatingSessionId, callerOf(req, deps).operator)) {
221
+ sendWorkflowAbsent(res);
207
222
  return;
223
+ }
208
224
  const sendNotRunningWf = (error) => sendError(res, 409, "steering.not_running", error);
209
225
  const redacted = redactSteerIn(body.content, label);
210
226
  const resolution = deps.workflowAgentRegistry?.resolve(wfRunId, label);
@@ -364,6 +380,18 @@ export const WORKFLOW_RUN_STATS_DISPOSITIONS = {
364
380
  costMicroUsd: "forward",
365
381
  nested: { nested: WORKFLOW_RUN_STATS_NESTED_DISPOSITIONS },
366
382
  };
383
+ export const WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS = {
384
+ budgetTokens: "forward",
385
+ spentTokens: "forward",
386
+ unsettledTokens: "forward",
387
+ };
388
+ export const WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS = {
389
+ timeoutMs: "forward",
390
+ agentsCompleted: "forward",
391
+ agentsFailed: "forward",
392
+ agentsInFlight: "forward",
393
+ approvalWaitedMs: "forward",
394
+ };
367
395
  export const WORKFLOW_RUN_DISPOSITIONS = {
368
396
  id: "forward",
369
397
  scope: "forward",
@@ -373,6 +401,8 @@ export const WORKFLOW_RUN_DISPOSITIONS = {
373
401
  description: { redact: "redactSecrets" },
374
402
  stats: { nested: WORKFLOW_RUN_STATS_DISPOSITIONS },
375
403
  agentFailures: "forward",
404
+ budgetOvershoot: { nested: WORKFLOW_BUDGET_OVERSHOOT_DISPOSITIONS },
405
+ timeoutInterruption: { nested: WORKFLOW_TIMEOUT_INTERRUPTION_DISPOSITIONS },
376
406
  startedAt: "forward",
377
407
  endedAt: "forward",
378
408
  createdAt: "forward",
@@ -396,8 +426,6 @@ export const WORKFLOW_RUN_DISPOSITIONS = {
396
426
  sourceTaskId: "strip",
397
427
  originatingSessionId: "strip",
398
428
  effectiveArgs: "strip",
399
- budgetOvershoot: "strip",
400
- timeoutInterruption: "strip",
401
429
  resultFull: "strip",
402
430
  completionId: "strip",
403
431
  resume: "strip",
@@ -32,40 +32,48 @@
32
32
  * (drain 靠 `uncountedBillableInflight` 数它们),它们的席位就活到请求结束 —— 帽照样数得到它们。
33
33
  *
34
34
  * ## 拒的形
35
- * 429 `limit.rate_exceeded`(沿用现有限流码,不新铸一枚:消费端的分支同「稍后再来」)+ 体里机读 `reason`(闭集 {@link RATE_EXCEEDED_REASONS},今天一词)
36
- * + `retryAfterSec`(固定 {@link RUN_CONCURRENCY_RETRY_AFTER_SEC});头 `Retry-After` 与体里同值,同其它限流 / 配额门的发送形(`res.setHeader("retry-after")` + `sendError`)。
35
+ * 429 `limit.rate_exceeded`(沿用现有限流码,不新铸一枚:消费端的分支同「稍后再来」)+ 体里机读 `reason`(闭集 {@link RATE_EXCEEDED_REASONS},今天两词)
36
+ * + `retryAfterSec`(固定 {@link RATE_EXCEEDED_RETRY_AFTER_SEC});头 `Retry-After` 与体里同值,同其它限流 / 配额门的发送形(`res.setHeader("retry-after")` + `sendError`)。
37
37
  * 拒在建行、认领会话与 SSE 头之前(受理漏斗已做的会话登记见上面「位置的两个如实」)。
38
38
  *
39
39
  * ## 谁需要 / 谁受伤 / 补偿
40
40
  * 需要:共享一台 GPU 或一只小模型网关的家用 / 小团队部署。受伤:超帽者拿 429(新行为,缺省关)。补偿:缺省 0 = 关(升级零变化)+ `Retry-After` 给退避。
41
41
  * 无主体请求(无头 service 凭据、`REQUIRE_PRINCIPAL=false` 的单用户部署)只受全局帽 —— 按主体帽对它不判(没有主体可分账)。
42
+ *
43
+ * ## 同一扇门的第二个拒因:沙箱容量(`sandbox_capacity`)
44
+ * local-docker 车道容器帽(`DOCKER_MAX_CONTAINERS`,`plugins/local-docker-capacity.ts`)的真闸在起容器处(子代、续跑腿、首个工具调用都只能在那里拒);
45
+ * 本门是它在提交面的早答:**闸里此刻有起动在等空位** ⇒ 新提交 429 `sandbox_capacity`(新 run 只会接到队尾)。门读闸的队列(`SandboxCapacityView.waiting`),
46
+ * 不调 docker、不另数;队列空而车道满时新提交照常放行,它的首个工具调用在起容器处等。判在两只 run 帽之前(拒时不占席位),与 run 帽同四口同位、同不判续跑 / 唤醒 / 作答。
42
47
  */
43
48
  import type { IncomingMessage, ServerResponse } from "node:http";
44
49
  import type { RunAbort } from "../run-cancel-context.js";
45
50
  import { type RefusalBody } from "./refusal-body.js";
46
51
  import type { FlatServiceDeps } from "./server.js";
52
+ import type { TerminalSeat } from "./route-ctx.js";
47
53
  /**
48
54
  * 本副本在飞 run 的 id 集 —— `inflightRuns`(durable 腿)∪ `steerableRuns`(活流)的**唯一**并集写法:
49
55
  * `drainState.inflight`(排空等多久)、`isRunLiveOnThisReplica`(这条 run 是不是在本副本跑)与并发帽读的是同一份。
50
56
  * 参数取 `ReadonlyMap`:读法不改登记簿。
51
57
  */
52
58
  export declare function liveRunIdsOf(inflightRuns: ReadonlyMap<string, unknown>, steerableRuns: ReadonlyMap<string, unknown>): Set<string>;
53
- /** 并发帽拒的机读 `reason` 词。 */
54
- export declare const RUN_CONCURRENCY_CAP_REASON: "run_concurrency_cap";
55
59
  /**
56
60
  * 429 `limit.rate_exceeded` 体上机读 `reason` 的**闭集**(穷举读它;加一种拒因 ⇒ 这里加一词,`switch` 的消费端编译红)。
61
+ * `run_concurrency_cap` = 本副本在飞 run 已到并发帽;`sandbox_capacity` = local-docker 车道容器帽前已有起动在等空位。
57
62
  * 其余 `limit.rate_exceeded` 的产地(速率桶、赎回准入、MCP 探活、烘焙提交)不带 `reason` —— 读法是「有 `reason` 才分」。
58
63
  */
59
- export declare const RATE_EXCEEDED_REASONS: readonly ["run_concurrency_cap"];
64
+ export declare const RATE_EXCEEDED_REASONS: readonly ["run_concurrency_cap", "sandbox_capacity"];
60
65
  export type RateExceededReason = (typeof RATE_EXCEEDED_REASONS)[number];
61
- /** 退避提示:固定 5 秒(是提示不是承诺 —— 在飞的 run 可能再跑很久;帽满只说「稍后再来」)。 */
62
- export declare const RUN_CONCURRENCY_RETRY_AFTER_SEC = 5;
66
+ /** 退避提示:固定 5 秒(是提示不是承诺 —— 在飞的 run / 在跑的容器可能再跑很久;满只说「稍后再来」)。两个拒因同值。 */
67
+ export declare const RATE_EXCEEDED_RETRY_AFTER_SEC = 5;
63
68
  /** 一枚席位:放行与登记进在飞集之间占着的那一格。`release` 幂等(登记点放一次,提交门的 `finally` 再放一次兜底)。 */
64
69
  export interface RunSlot {
65
70
  release(): void;
66
71
  }
67
- /** 并发帽拒的 `{status, body, retryAfterSec}`(体经全仓唯一组句器;状态与退避供发送口用)。 */
68
- export declare function runConcurrencyRefusalOf(): {
72
+ /**
73
+ * 提交门 429 的 `{status, body, retryAfterSec}`(一只铸点出闭集里每个拒因;体经全仓唯一组句器;状态与退避供发送口用)。
74
+ * 每个拒因一臂字面句(穷举 `switch`:加词而没写臂 ⇒ tsc 红;字面句让 `test/api-error-text-freeze.test.ts` 逐字冻住)。
75
+ */
76
+ export declare function rateExceededRefusalOf(reason: RateExceededReason): {
69
77
  readonly status: 429;
70
78
  readonly body: RefusalBody;
71
79
  readonly retryAfterSec: number;
@@ -75,11 +83,11 @@ export interface RunConcurrencyGate {
75
83
  * 提交门的并发帽准入:放行 ⇒ 交回席位(调用点登记那一拍 / `finally` 放);超帽 ⇒ 已应答 429(+ `Retry-After`),交回 `undefined`,调用点 `return`。
76
84
  * 位序:在幂等重放、`rateLimited` / `quotaExceeded` / `leaseDenied` / `usageWindowDenied` 之后,任何建行 / 认领 / SSE 头之前。
77
85
  */
78
- admitRun(req: IncomingMessage, res: ServerResponse): RunSlot | undefined;
86
+ admitRun(req: IncomingMessage, res: ServerResponse, seat: TerminalSeat): Promise<RunSlot | undefined>;
79
87
  }
80
- /** 装配口:`deps` 只读 `config`(两旋钮,每次判时现读)与 `logger`;在飞集由 server 装配层交来(两张登记簿本身,不拷)。 */
88
+ /** 装配口:`deps` 只读 `config`(两旋钮,每次判时现读)、`logger` 与沙箱容量闸的只读面(缺席 ⇒ 不判);在飞集由 server 装配层交来(两张登记簿本身,不拷)。 */
81
89
  export declare function createRunConcurrencyGate(ctx: {
82
- deps: Pick<FlatServiceDeps, "config" | "logger">;
90
+ deps: Pick<FlatServiceDeps, "config" | "logger" | "sandboxCapacity">;
83
91
  inflightRuns: ReadonlyMap<string, RunAbort>;
84
92
  steerableRuns: ReadonlyMap<string, unknown>;
85
93
  }): RunConcurrencyGate;
@@ -1,54 +1,67 @@
1
- import { gatedPrincipal } from "./principal-gate.js";
1
+ import { gatedPerson } from "./principal-gate.js";
2
+ import { personOf } from "../owner-brands.js";
3
+ import { recoveredSubject } from "../owner-faces.js";
2
4
  import { refusalBody } from "./refusal-body.js";
3
5
  import { sendError } from "./send.js";
4
6
  export function liveRunIdsOf(inflightRuns, steerableRuns) {
5
7
  return new Set([...inflightRuns.keys(), ...steerableRuns.keys()]);
6
8
  }
7
- export const RUN_CONCURRENCY_CAP_REASON = "run_concurrency_cap";
8
- export const RATE_EXCEEDED_REASONS = [RUN_CONCURRENCY_CAP_REASON];
9
- export const RUN_CONCURRENCY_RETRY_AFTER_SEC = 5;
9
+ export const RATE_EXCEEDED_REASONS = ["run_concurrency_cap", "sandbox_capacity"];
10
+ export const RATE_EXCEEDED_RETRY_AFTER_SEC = 5;
10
11
  const UNTRACKED_SLOT = { release: () => undefined };
11
- export function runConcurrencyRefusalOf() {
12
- return {
13
- status: 429,
14
- body: refusalBody({
15
- errorCode: "limit.rate_exceeded",
16
- message: "too many runs are in flight on this server right now — nothing was started; retry after the Retry-After interval",
17
- facts: { reason: RUN_CONCURRENCY_CAP_REASON, retryAfterSec: RUN_CONCURRENCY_RETRY_AFTER_SEC },
18
- }),
19
- retryAfterSec: RUN_CONCURRENCY_RETRY_AFTER_SEC,
20
- };
12
+ export function rateExceededRefusalOf(reason) {
13
+ const facts = { reason, retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
14
+ switch (reason) {
15
+ case "run_concurrency_cap":
16
+ return { status: 429, body: refusalBody({ errorCode: "limit.rate_exceeded", message: "too many runs are in flight on this server right now — nothing was started; retry after the Retry-After interval", facts }), retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
17
+ case "sandbox_capacity":
18
+ return { status: 429, body: refusalBody({ errorCode: "limit.rate_exceeded", message: "sandbox capacity reached: container starts are already waiting for a free slot — nothing was started; retry after the Retry-After interval", facts }), retryAfterSec: RATE_EXCEEDED_RETRY_AFTER_SEC };
19
+ }
21
20
  }
22
21
  export function createRunConcurrencyGate(ctx) {
23
22
  const { deps, inflightRuns, steerableRuns } = ctx;
24
23
  const seats = new Set();
25
- function admitRun(req, res) {
24
+ async function refuse(res, exit, reason) {
25
+ const refusal = rateExceededRefusalOf(reason);
26
+ const { error, errorCode, ...extra } = refusal.body;
27
+ await exit.deliverTerminal(() => {
28
+ res.setHeader("retry-after", String(refusal.retryAfterSec));
29
+ sendError(res, refusal.status, errorCode, error, extra);
30
+ });
31
+ return undefined;
32
+ }
33
+ async function admitRun(req, res, exit) {
34
+ const waiting = deps.sandboxCapacity?.waiting() ?? 0;
35
+ if (waiting > 0) {
36
+ deps.logger?.info?.("sandbox_capacity_refused", { waiting });
37
+ return refuse(res, exit, "sandbox_capacity");
38
+ }
26
39
  const { runMaxConcurrent: globalCap, runMaxConcurrentPerPrincipal: ownCap } = deps.config;
27
40
  if (globalCap === 0 && ownCap === 0)
28
41
  return UNTRACKED_SLOT;
29
- const owner = gatedPrincipal(req, deps.config);
42
+ const person = gatedPerson(req, deps.config);
30
43
  const live = liveRunIdsOf(inflightRuns, steerableRuns);
31
44
  const inFlight = live.size + seats.size;
32
45
  let scope;
33
46
  if (globalCap > 0 && inFlight >= globalCap)
34
47
  scope = "global";
35
- else if (ownCap > 0 && owner !== undefined) {
36
- const holders = [...[...live].map((id) => inflightRuns.get(id)?.owner), ...[...seats].map((seat) => seat.owner)];
37
- if (holders.filter((o) => o === owner).length >= ownCap)
48
+ else if (ownCap > 0 && person !== undefined) {
49
+ const holders = [...[...live].map((id) => personOfHolder(inflightRuns.get(id)?.owner)), ...[...seats].map((seat) => seat.person)];
50
+ if (holders.filter((p) => p === person).length >= ownCap)
38
51
  scope = "principal";
39
52
  }
40
53
  if (scope !== undefined) {
41
- deps.logger?.info?.("run_concurrency_cap_refused", { scope, inFlight, cap: scope === "global" ? globalCap : ownCap, hasPrincipal: owner !== undefined });
42
- const refusal = runConcurrencyRefusalOf();
43
- const { error, errorCode, ...extra } = refusal.body;
44
- res.setHeader("retry-after", String(refusal.retryAfterSec));
45
- sendError(res, refusal.status, errorCode, error, extra);
46
- return undefined;
54
+ deps.logger?.info?.("run_concurrency_cap_refused", { scope, inFlight, cap: scope === "global" ? globalCap : ownCap, hasPrincipal: person !== undefined });
55
+ return refuse(res, exit, "run_concurrency_cap");
47
56
  }
48
- const seat = { owner };
57
+ const seat = { person };
49
58
  seats.add(seat);
50
59
  return { release: () => void seats.delete(seat) };
51
60
  }
52
61
  return { admitRun };
53
62
  }
63
+ function personOfHolder(owner) {
64
+ const subject = recoveredSubject(owner);
65
+ return subject === undefined ? undefined : personOf(subject);
66
+ }
54
67
  //# sourceMappingURL=run-concurrency-cap.js.map
@@ -1,12 +1,10 @@
1
1
  import { type RunRecord } from "../plugins/store-contracts.js";
2
2
  import type { RunStore } from "../plugins/store-backend.js";
3
3
  import type { ServiceConfig } from "../config-types.js";
4
- /** 读面要的部署配置两格(stale 折叠窗 + 基建计价)。 */
4
+ /** 读面要的部署配置(基建计价)。 */
5
5
  export interface RunFaceDeps {
6
- config: Pick<ServiceConfig, "runStaleSec" | "infraCostRates">;
6
+ config: Pick<ServiceConfig, "infraCostRates">;
7
7
  }
8
- /** 一条行是不是「看起来失联」:盘上 `running`、而最后一次心跳早于 `runStaleSec` —— 读面把它折成 `failed`(`run.stalled`)。读它的人只此一只判据(读面与同步重放回执同读)。 */
9
- export declare function runRowStale(deps: RunFaceDeps, run: RunRecord): boolean;
10
8
  /**
11
9
  * 一条行上的结果**当作出口结果读**(封口 + 脱敏的读入口)—— 读面的 `result` 与同步提交的重放体读的是同一只:
12
10
  * 终局行按 taskId+updatedAt 记忆的读入口,非终局行(停驻 / 在跑)走店入口那一套封口的读入口;行上没有结果 ⇒ `undefined`。
@@ -26,7 +24,7 @@ export declare function readRunFace(deps: RunFaceDeps, runStore: RunStore, run:
26
24
  msSinceLastActivity?: number | undefined;
27
25
  taskId: string;
28
26
  sessionId: string;
29
- status: "running" | import("@sema-agent/core").TaskStatus;
27
+ status: import("@sema-agent/core").TaskStatus | "running";
30
28
  }>;
31
29
  /** run 行读面的值形 —— 从唯一投影口的返回型派生(不手抄键表)。 */
32
30
  export type RunReadFace = Awaited<ReturnType<typeof readRunFace>>;