@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,14 +1,19 @@
1
- import { redactErrorMessage, redactLedgerEventData, sealRunRowResult } from "../observability/run-terminal.js";
2
- import { outwardPlane } from "../terminal.js";
1
+ import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
2
+ import { redactErrorMessage, redactLedgerEventData, runRowErrorCodeOf, sealRunRowResult } from "../observability/run-terminal.js";
3
+ import { outwardPlane, persistedPlaneOf } from "../terminal.js";
3
4
  import { projectUsageStats, USAGE_SCAN_LIMIT } from "../usage-analytics.js";
4
5
  import { join } from "node:path";
5
- import { existsSync, readFileSync, readdirSync, renameSync, rmSync, statSync } from "node:fs";
6
+ import { closeSync, existsSync, fsyncSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync } from "node:fs";
7
+ import { IS_WIN32 } from "./host-platform.js";
6
8
  import { randomBytes } from "node:crypto";
7
9
  import { AppendLog, atomicWriteFile, ensureDir, isProcessLive, processFingerprint, sanitizePathComponent, sanitizeScope, writeThenLink } from "@sema-agent/core";
8
10
  import { recordFailOpen } from "../observability/fail-open.js";
9
11
  import { replayJsonlSkipping } from "../observability/corrupt-read-seat.js";
10
12
  import { joinFromStore, splitForStore } from "./wiring-section-codec.js";
11
- import { RUN_HOLDER_DEATH_CODES, RUN_ORPHANED_ERROR, RUN_STALLED_ERROR, StoreBootRefusalError, buildRunOrphanedError, isTerminalRunStatus, settledLegObservationOf } from "./store-contracts.js";
13
+ import { RUN_HOLDER_DEATH_CODES, RUN_ORPHANED_ERROR, RUN_STALLED_ERROR, RUN_STALL_DEFAULT_WIRING, RUN_STALL_VERDICT_UNLANDED_TAG, StoreBootRefusalError, runLivenessOf, buildRunOrphanedError, isTerminalRunStatus, settledLegObservationOf } from "./store-contracts.js";
14
+ import { buildSessionRunRollups } from "./session-run-rollup.js";
15
+ import { normalizedRunPreviewM45 } from "./run-preview-m45.js";
16
+ import { SHELL_SENTINEL_OWNER_M48 } from "./shell-sentinel-owner-m48.js";
12
17
  import { notifyRunTerminal } from "../observability/run-terminal.js";
13
18
  import { readRunIdentityCells, runIdentityCells } from "../identity-source.js";
14
19
  import { createInProcessSpaceCommitTable, fenceSpaceCommitAtTerminal, SPACE_COMMIT_RECORD_SCHEMA } from "../workspace-space-commit.js";
@@ -80,10 +85,14 @@ export class FileRunStore {
80
85
  claimOwner = { nonce: randomBytes(12).toString("hex"), ...processFingerprint() };
81
86
  claimLocks = new Map();
82
87
  logger;
88
+ rootRows;
83
89
  strictHydrate;
90
+ stall;
84
91
  constructor(root, opts) {
85
92
  this.logger = opts;
86
- this.strictHydrate = opts?.strictHydrate === true;
93
+ this.stall = opts.stall ?? RUN_STALL_DEFAULT_WIRING;
94
+ this.rootRows = opts.rootRows;
95
+ this.strictHydrate = opts.strictHydrate === true;
87
96
  const dirs = fileRunStoreDirsFor(root);
88
97
  this.runsDir = dirs.runs;
89
98
  this.activeDir = dirs.active;
@@ -379,13 +388,17 @@ export class FileRunStore {
379
388
  }
380
389
  async createRun(taskId, sessionId, owner, instanceId, meta = {}) {
381
390
  const idemKey = meta.idem?.key ?? null;
382
- return this.withClaimLock(sessionId, async () => {
383
- const acquired = await this.acquireClaim(sessionId, taskId);
384
- if (!acquired.ok) {
385
- const existing = this.submittedRow(taskId, idemKey);
386
- return existing ? { ok: false, existing: this.toRecord(existing) } : acquired;
387
- }
388
- return this.commitNewRun(taskId, sessionId, owner, instanceId, meta, idemKey);
391
+ return this.rootRows().withRootRow(sessionId, async (present) => {
392
+ if (!present)
393
+ return { ok: false, sessionAbsent: true };
394
+ return this.withClaimLock(sessionId, async () => {
395
+ const acquired = await this.acquireClaim(sessionId, taskId);
396
+ if (!acquired.ok) {
397
+ const existing = this.submittedRow(taskId, idemKey);
398
+ return existing ? { ok: false, existing: this.toRecord(existing) } : acquired;
399
+ }
400
+ return this.commitNewRun(taskId, sessionId, owner, instanceId, meta, idemKey);
401
+ });
389
402
  });
390
403
  }
391
404
  submittedRow(taskId, idemKey) {
@@ -470,6 +483,7 @@ export class FileRunStore {
470
483
  const r = this.runs.get(taskId);
471
484
  if (r && ownerEq(r.owner, owner) && r.status === "running")
472
485
  this.persist({ ...r, updatedAt: new Date() });
486
+ return r !== undefined && r.status === "running";
473
487
  }
474
488
  async appendEvent(taskId, seq, type, data) {
475
489
  data = redactLedgerEventData(type, data);
@@ -572,7 +586,7 @@ export class FileRunStore {
572
586
  }
573
587
  let pending;
574
588
  if (r.status === "running" || r.status === "suspended" || r.status === "needs_review") {
575
- const errorCode = result === null ? null : (outwardPlane(result.terminal).errorCode ?? null);
589
+ const errorCode = runRowErrorCodeOf(result);
576
590
  this.persist({ ...r, status, result, error, errorCode, updatedAt: new Date() });
577
591
  pending = {
578
592
  runId: taskId,
@@ -596,14 +610,14 @@ export class FileRunStore {
596
610
  const sealed = sealRunRowResult(result);
597
611
  const r = this.runs.get(taskId);
598
612
  if (r && (r.status === "running" || r.status === "suspended")) {
599
- this.persist({ ...r, status: "suspended", result: sealed, updatedAt: new Date() });
613
+ this.persist({ ...r, status: "suspended", result: sealed, errorCode: runRowErrorCodeOf(sealed), updatedAt: new Date() });
600
614
  }
601
615
  }
602
616
  async setNeedsReview(taskId, result) {
603
617
  const sealed = sealRunRowResult(result);
604
618
  const r = this.runs.get(taskId);
605
619
  if (r && (r.status === "running" || r.status === "needs_review")) {
606
- this.persist({ ...r, status: "needs_review", result: sealed, updatedAt: new Date() });
620
+ this.persist({ ...r, status: "needs_review", result: sealed, errorCode: runRowErrorCodeOf(sealed), updatedAt: new Date() });
607
621
  }
608
622
  }
609
623
  async markResuming(taskId, instanceId) {
@@ -614,6 +628,7 @@ export class FileRunStore {
614
628
  ...r,
615
629
  status: "running",
616
630
  result: null,
631
+ errorCode: null,
617
632
  instanceId,
618
633
  cancelRequested: false,
619
634
  preemptRequested: false,
@@ -696,62 +711,10 @@ export class FileRunStore {
696
711
  }
697
712
  return latest === undefined ? undefined : settledLegObservationOf(latest.taskId, latest.result);
698
713
  }
699
- async listSessions(opts) {
700
- const bySession = new Map();
701
- for (const r of this.runs.values()) {
702
- if (opts.owner !== undefined && r.owner !== opts.owner && !(opts.includeUnowned === true && r.owner === null))
703
- continue;
704
- const arr = bySession.get(r.sessionId) ?? [];
705
- arr.push(r);
706
- bySession.set(r.sessionId, arr);
707
- }
708
- const cursorAt = opts.cursor ? Date.parse(opts.cursor.lastActivityAt) : undefined;
709
- const qlc = opts.q?.toLowerCase();
710
- const summaries = [];
711
- for (const [sessionId, arr] of bySession) {
712
- if (qlc && !arr.some((r) => r.objectivePreview?.toLowerCase().includes(qlc)))
713
- continue;
714
- const sorted = [...arr].sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || (a.taskId < b.taskId ? 1 : a.taskId > b.taskId ? -1 : 0));
715
- const latest = sorted[0];
716
- const latestRunId = latest.result?.runId;
717
- let last = -Infinity;
718
- let first = Infinity;
719
- for (const r of arr) {
720
- const t = r.createdAt.getTime();
721
- if (t > last)
722
- last = t;
723
- if (t < first)
724
- first = t;
725
- }
726
- summaries.push({
727
- sessionId,
728
- owner: latest.owner,
729
- lastActivityAt: new Date(last).toISOString(),
730
- firstActivityAt: new Date(first).toISOString(),
731
- runCount: arr.length,
732
- objectivePreview: latest.objectivePreview,
733
- lastStatus: latest.status,
734
- lastRunId: latest.taskId,
735
- ...(typeof latestRunId === "string" && latestRunId !== "" ? { lastTaskRunId: latestRunId } : {}),
736
- title: null,
737
- pinned: false,
738
- });
739
- }
740
- return summaries
741
- .filter((s) => {
742
- if (cursorAt === undefined)
743
- return true;
744
- const t = Date.parse(s.lastActivityAt);
745
- return t < cursorAt || (t === cursorAt && s.sessionId < opts.cursor.sessionId);
746
- })
747
- .sort((a, b) => Date.parse(b.lastActivityAt) - Date.parse(a.lastActivityAt) || (a.sessionId < b.sessionId ? 1 : a.sessionId > b.sessionId ? -1 : 0))
748
- .slice(0, opts.limit);
749
- }
750
- async deleteBySession(sessionId, expectedSessionOwner) {
751
- void expectedSessionOwner;
752
- const claimed = this.active.get(sessionId);
753
- if (claimed !== undefined)
754
- return { active: claimed };
714
+ async sessionRunRollups(opts = {}) {
715
+ return buildSessionRunRollups(this.runs.values(), opts);
716
+ }
717
+ async deleteBySession(sessionId) {
755
718
  this.dropSectionBlobs(sessionId);
756
719
  let removed = 0;
757
720
  for (const [taskId, r] of [...this.runs]) {
@@ -814,9 +777,31 @@ export class FileRunStore {
814
777
  this.sweepClaims();
815
778
  return reaped;
816
779
  }
817
- async reapStale(olderThanMs) {
818
- const cutoff = Date.now() - olderThanMs;
819
- return this.reapRunning((r) => r.updatedAt.getTime() < cutoff, RUN_STALLED_ERROR, RUN_HOLDER_DEATH_CODES.stalled);
780
+ async reapStale() {
781
+ const nowMs = Date.now();
782
+ const windowMs = this.stall.windowMs();
783
+ const reaped = this.reapRunning((r) => runLivenessOf(this.toRecord(r), nowMs, windowMs) === "due", RUN_STALLED_ERROR, RUN_HOLDER_DEATH_CODES.stalled);
784
+ if (reaped > 0)
785
+ this.stall.onVerdicts(reaped);
786
+ return reaped;
787
+ }
788
+ async observeRun(row) {
789
+ const nowMs = Date.now();
790
+ const windowMs = this.stall.windowMs();
791
+ if (runLivenessOf(row, nowMs, windowMs) !== "due")
792
+ return row;
793
+ let landed = 0;
794
+ try {
795
+ landed = this.reapRunning((r) => r.taskId === row.taskId && runLivenessOf(this.toRecord(r), nowMs, windowMs) === "due", RUN_STALLED_ERROR, RUN_HOLDER_DEATH_CODES.stalled);
796
+ }
797
+ catch (err) {
798
+ recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
799
+ return row;
800
+ }
801
+ if (landed > 0)
802
+ this.stall.onVerdicts(landed);
803
+ const r = this.runs.get(row.taskId);
804
+ return r ? this.toRecord(r) : row;
820
805
  }
821
806
  async reclaimOrphanedAtBoot(isResumable) {
822
807
  const orphans = [];
@@ -961,7 +946,19 @@ export class FileRunStore {
961
946
  const verdict = await this.judgeClaim(sessionId, claim, holder);
962
947
  if (verdict.kind === "live")
963
948
  return { ok: false, activeTaskId: verdict.holderTaskId ?? holder };
964
- this.takeOverClaim(sessionId, verdict.reason, verdict.snapshot, verdict.code);
949
+ const stalled = verdict.code === RUN_HOLDER_DEATH_CODES.stalled;
950
+ let taken;
951
+ try {
952
+ taken = this.takeOverClaim(sessionId, verdict.reason, verdict.snapshot, verdict.code);
953
+ }
954
+ catch (e) {
955
+ if (!stalled)
956
+ throw e;
957
+ recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, e instanceof Error ? e.message : String(e));
958
+ return { ok: false, activeTaskId: verdict.snapshot.taskId || holder };
959
+ }
960
+ if (taken && stalled)
961
+ this.stall.onVerdicts(1);
965
962
  }
966
963
  }
967
964
  try {
@@ -1019,6 +1016,8 @@ export class FileRunStore {
1019
1016
  return live();
1020
1017
  return { kind: "stale", reason: `parked run (${row.status}) has no resumable checkpoint — claim reclaimed`, snapshot };
1021
1018
  }
1019
+ if (row && runLivenessOf(this.toRecord(row), Date.now(), this.stall.windowMs()) === "due")
1020
+ return { kind: "stale", reason: RUN_STALLED_ERROR, snapshot, code: RUN_HOLDER_DEATH_CODES.stalled };
1022
1021
  const mine = owner?.nonce === this.claimOwner.nonce;
1023
1022
  const ownerGone = owner !== undefined && !isProcessLive(owner);
1024
1023
  if (!mine && !ownerGone)
@@ -1051,7 +1050,7 @@ export class FileRunStore {
1051
1050
  if (row?.status !== snapshot.status || row?.updatedAt.getTime() !== snapshot.updatedAtMs)
1052
1051
  return false;
1053
1052
  if (row && (row.status === "running" || row.status === "suspended" || row.status === "needs_review")) {
1054
- this.persist({ ...row, status: "failed", error: reason, ...(code !== undefined ? { errorCode: code } : {}), updatedAt: new Date() });
1053
+ this.persist({ ...row, status: "failed", result: null, error: reason, errorCode: code ?? null, updatedAt: new Date() });
1055
1054
  }
1056
1055
  const quarantine = join(this.tmpDir, `stale-claim.${sanitizePathComponent(sessionId)}.${process.pid}.${randomBytes(6).toString("hex")}`);
1057
1056
  try {
@@ -1093,23 +1092,79 @@ export class FileRunStore {
1093
1092
  }
1094
1093
  this.eventLogs.delete(taskId);
1095
1094
  }
1095
+ const dir = this.runDir(taskId);
1096
+ rmSync(dir, { recursive: true, force: true });
1097
+ if (!IS_WIN32 && existsSync(this.runsDir)) {
1098
+ const fd = openSync(this.runsDir, "r");
1099
+ try {
1100
+ fsyncSync(fd);
1101
+ }
1102
+ finally {
1103
+ closeSync(fd);
1104
+ }
1105
+ }
1096
1106
  this.events.delete(taskId);
1097
1107
  const dropped = this.runs.get(taskId);
1098
1108
  if (dropped?.idemKey != null && this.byIdem.get(dropped.idemKey) === taskId)
1099
1109
  this.byIdem.delete(dropped.idemKey);
1100
1110
  this.runs.delete(taskId);
1101
- const dir = this.runDir(taskId);
1102
- if (existsSync(dir)) {
1103
- try {
1104
- rmSync(dir, { recursive: true, force: true });
1105
- }
1106
- catch {
1107
- }
1111
+ }
1112
+ withdrawRunsOf(sessionId, ownTaskId) {
1113
+ for (const r of this.runs.values())
1114
+ if (r.sessionId === sessionId && r.taskId !== ownTaskId)
1115
+ return { keep: "runs" };
1116
+ const own = ownTaskId === undefined ? undefined : this.runs.get(ownTaskId);
1117
+ if (own !== undefined && own.sessionId !== sessionId)
1118
+ throw new Error(`FileRunStore.withdrawRunsOf: run ${ownTaskId} belongs to session ${own.sessionId}, not ${sessionId} — refusing to delete it`);
1119
+ this.dropSectionBlobs(sessionId);
1120
+ if (own !== undefined)
1121
+ this.dropRun(own.taskId);
1122
+ return "proceed";
1123
+ }
1124
+ migrateRunErrorCodeColumnM44() {
1125
+ let migrated = 0;
1126
+ for (const r of this.runs.values()) {
1127
+ const target = r.status === "running" ? null : r.result === null ? r.errorCode : (persistedPlaneOf(r.result).errorCode ?? r.errorCode);
1128
+ if (target === r.errorCode)
1129
+ continue;
1130
+ this.persist({ ...r, errorCode: target });
1131
+ migrated += 1;
1132
+ }
1133
+ return migrated;
1134
+ }
1135
+ migrateRunObjectivePreviewM45() {
1136
+ let migrated = 0;
1137
+ for (const r of this.runs.values()) {
1138
+ if (typeof r.objectivePreview !== "string")
1139
+ continue;
1140
+ const target = normalizedRunPreviewM45(r.objectivePreview);
1141
+ if (target === undefined || target === r.objectivePreview)
1142
+ continue;
1143
+ this.persist({ ...r, objectivePreview: target });
1144
+ migrated += 1;
1145
+ }
1146
+ return migrated;
1147
+ }
1148
+ clearShellSentinelOwnersM48() {
1149
+ let cleared = 0;
1150
+ for (const r of this.runs.values()) {
1151
+ if (r.owner !== SHELL_SENTINEL_OWNER_M48)
1152
+ continue;
1153
+ this.persist({ ...r, owner: null });
1154
+ cleared += 1;
1108
1155
  }
1156
+ return cleared;
1109
1157
  }
1110
1158
  sessionIdsWithRuns() {
1111
1159
  return new Set([...this.runs.values()].map((r) => r.sessionId));
1112
1160
  }
1161
+ scenarioPrefixOwnerRowsM42() {
1162
+ let n = 0;
1163
+ for (const r of this.runs.values())
1164
+ if (r.owner !== null && r.owner.startsWith(SCENARIO_SUBJECT_PREFIX))
1165
+ n += 1;
1166
+ return n;
1167
+ }
1113
1168
  dispose() {
1114
1169
  for (const log of [...this.eventLogs.values(), ...this.blobLogs.values()]) {
1115
1170
  try {
@@ -32,7 +32,7 @@
32
32
  * structural tests only on mac/Linux; behavior-level bite happens on the first Windows-runner green.
33
33
  */
34
34
  import type { ChildProcess } from "node:child_process";
35
- import { killProcessTree, type BackgroundHardKillOutcome } from "@sema-agent/core";
35
+ import { killProcessTree, signalProcessTree, type BackgroundHardKillOutcome } from "@sema-agent/core";
36
36
  import type { Logger } from "../observability/logger.js";
37
37
  /** 平台读点全仓一处(`test/host-shell-settle-order.test.ts` 源码钉);别处要平台串从这里取,不直读 Node 的平台字段。 */
38
38
  export declare const HOST_PLATFORM: NodeJS.Platform;
@@ -133,8 +133,29 @@ export declare function hardKillGroupNow(pid: number): BackgroundHardKillOutcome
133
133
  */
134
134
  export declare function killTreeSoft(pid: number): void;
135
135
  /** Graceful tree kill where the CALLER has no escalation timer of its own (currently unused by the host lane —
136
- * exported for parity with core's surface; the bg driver keeps its own HOST_BG_KILL_GRACE_MS ladder). */
137
- export { killProcessTree };
136
+ * exported for parity with core's surface; the bg driver keeps its own HOST_BG_KILL_GRACE_MS ladder).
137
+ * `signalProcessTree` = ONE signal to the whole tree (POSIX: a `ps` snapshot of the descendants of `pid` + the group
138
+ * signal + each descendant; win32: taskkill /T). Never throws. Its root must be a pid that is still OURS (an unreaped
139
+ * child): a reaped pid may already be a stranger's, and a descendant walk from a stranger's pid kills the stranger's
140
+ * children — the one caller (the command-hook ladder) guards that on the child handle. */
141
+ export { killProcessTree, signalProcessTree };
142
+ /**
143
+ * Group probe for a REAPED leader: does the group of `pid` still hold an ORIGINAL member? Ask it only after node reaped the
144
+ * leader (an unreaped leader keeps the pid ours — no question to ask). POSIX reads two numbers:
145
+ * · `kill(-pid, 0)` — is anyone in the group;
146
+ * · `kill(pid, 0)` — is any process holding the number itself.
147
+ * Group empty (ESRCH) ⇒ false. Group non-empty and nobody holds the number (ESRCH) ⇒ true: the kernel never hands out a number that a
148
+ * process still uses as its process-group id, so the number was not recycled and the members are the original ones (Linux's pid
149
+ * allocator; BSD / darwin allocate the same way — inferred, not read from kernel source). Group non-empty and the number IS held
150
+ * (success / EPERM) ⇒ false: while an original member lived the number could not have been handed out, so every original is dead and what
151
+ * answers now is a stranger's new process / group — never ours, so the caller sends it nothing. EPERM on the group probe reads
152
+ * "non-empty" (darwin answers EPERM for a group holding only unreaped zombies, indistinguishable from a live member we may not signal:
153
+ * one extra shot, never a missed member); EPERM on the number probe reads "held" (the process exists, we just cannot touch it).
154
+ * win32 has no process group ⇒ always false (the tree is discovered only at signal time, by taskkill /T, and only from an unreaped
155
+ * root). Never throws. The only residual is the instant between the two probes (an original member dying and its number being
156
+ * recycled inside it) — microseconds, not the grace window.
157
+ */
158
+ export declare function reapedLeaderGroupAlive(pid: number): boolean;
138
159
  /**
139
160
  * 登记回执 = 注销的**唯一**凭据(身份即凭据,见簿注)+ 一只幂等的注销把手。
140
161
  *
@@ -127,7 +127,21 @@ export function killTreeSoft(pid) {
127
127
  }
128
128
  process.kill(-pid, "SIGTERM");
129
129
  }
130
- export { killProcessTree };
130
+ export { killProcessTree, signalProcessTree };
131
+ export function reapedLeaderGroupAlive(pid) {
132
+ if (IS_WIN32)
133
+ return false;
134
+ const answers = (target) => {
135
+ try {
136
+ process.kill(target, 0);
137
+ return true;
138
+ }
139
+ catch (err) {
140
+ return err.code !== "ESRCH";
141
+ }
142
+ };
143
+ return answers(-pid) && !answers(pid);
144
+ }
131
145
  const liveHostForegroundGroups = new Set();
132
146
  export function trackHostForegroundChild(pid) {
133
147
  const ticket = {
@@ -136,6 +136,8 @@ function refusingBakeRow(read) {
136
136
  export const IMAGE_BAKE_INDEXES = [
137
137
  { table: "image_bake", name: "idx_image_bake_status", columns: ["status"] },
138
138
  { table: "image_bake", name: "idx_image_bake_created", columns: ["created_at"] },
139
+ { table: "image_bake", name: "uq_image_bake_idem", columns: ["idem_key"], unique: true },
140
+ { table: "image_bake_event", name: "uq_image_bake_event_line", columns: ["bake_id", "line_ord"], unique: true },
139
141
  ];
140
142
  export async function ensurePgImageBakeSchema(pool, poolName = "standard") {
141
143
  for (const stmt of PG_IMAGE_BAKE_SCHEMA)
@@ -40,7 +40,7 @@
40
40
  * 另两种店**答了**却做不了的(没有写面或写面拒 / 并发争不过)⇒ 点名跳过,下一次起服再试,其间那几行照旧放行,每次起服都点名。
41
41
  */
42
42
  import { type DurableRulePartitionProvider, type PersistedRule, type RuleAdd, type RuleOwner } from "@sema-agent/core";
43
- /** 一只被退役的导入 add 所在的行(一行一条读数)。**不带规则正文**(与 M11 同一条纪律:规则正文不出店)—— 桶键 + 工具名足够让运维去列举面对上它。 */
43
+ /** 一只被退役的导入 add 所在的行(一行一条读数)。**不带规则正文**(规则正文不出店)—— 桶键 + 工具名足够让运维去列举面对上它。 */
44
44
  export interface ImportedLayerRootAllowRetired {
45
45
  /** 桶键(`buildRuleOwnerKey`:属主的单向摘要;两种店同一把,日志里不出属主名)。 */
46
46
  readonly ownerKey: string;
@@ -61,7 +61,7 @@ export type ImportedLayerRootSkipReason = "bucket_unreadable" | "vanished" | "no
61
61
  export interface ImportedLayerRootBucketSkipped {
62
62
  readonly ownerKey: string;
63
63
  readonly reason: ImportedLayerRootSkipReason;
64
- /** 一句不带行内容的话:读 / 解析桶抛出来的东西只报它的种类(原句可能引到桶里的行 —— 与 M11 `contentFreeRefusal` 同一条纪律;
64
+ /** 一句不带行内容的话:读 / 解析桶抛出来的东西只报它的种类(原句可能引到桶里的行 —— 规则正文不出店;
65
65
  * 原句由店自己的披露口说,File 店的 `permission_rule_store_disclosure`、SQL 店的整桶拒句);写面拒的是闭集词,原样带。 */
66
66
  readonly why: string;
67
67
  }
@@ -25,7 +25,7 @@
25
25
  * 每轮一行结构化日志 `sandbox_pod_reap_round`(扫了几只、按闭集原因分的删 / 跳过计数),每删一只一行 `sandbox_pod_reaped`;**列举失败**这一轮一只都删不了 ——
26
26
  * F 类兜底口 `server.sandbox-pod-reaper.list-failed` 计一次 + 一行 warn `sandbox_pod_reap_list_failed`(下一轮一个周期后照常再列);**某一只删失败**不挡其余 ——
27
27
  * 与连接清理同一只上报口 `reportPodDeleteFailed`(F 类计数 `server.sandbox-pod.delete-failed` + 一行 error `sandbox_pod_delete_failed`,`why=reaper_<删它的理由>`,下一轮再判再删)。
28
- * 每副本起服后第一个维护 tick 跑一次、此后每 {@link SANDBOX_POD_REAP_PERIOD_MS} 一次(`boot/reapers.ts`);多副本同时删同一只 ⇒ 404 计 `gone`。
28
+ * 每副本起服后第一个维护 tick 跑一次、此后每 `SANDBOX_REAP_PERIOD_MS` 一次(`boot/reapers.ts` 的沙箱回收腿,与 local-docker 车道的容器回收器共一只座一个节拍:`sandbox-reaper.ts`);多副本同时删同一只 ⇒ 404 计 `gone`。
29
29
  */
30
30
  import type { Logger } from "../observability/logger.js";
31
31
  import type { Metrics } from "../observability/metrics.js";
@@ -33,8 +33,6 @@ import type { Metrics } from "../observability/metrics.js";
33
33
  export declare const SANDBOX_POD_REAP_GRACE_MS = 60000;
34
34
  /** ① 的上界:`max(租约上限 + 宽限, 快照时限 + 引擎拆环境放行)`。唯一的调用方 = 适配器建 Pod 的那一拍(快照时限 = 建它的副本的 `dataTimeoutMs`),结果写进 Pod 的注解。 */
35
35
  export declare function sandboxRunEndHoldMs(snapshotTimeoutMs: number): number;
36
- /** 一个副本两轮回收之间的间隔。常量。 */
37
- export declare const SANDBOX_POD_REAP_PERIOD_MS: number;
38
36
  /** 列举出来的一只沙箱 Pod(只带判官要读的几样;时刻是毫秒)。 */
39
37
  export interface SandboxPodListing {
40
38
  readonly name: string;
@@ -15,7 +15,6 @@ function runEndHoldOf(raw) {
15
15
  const ms = Number(raw);
16
16
  return Number.isSafeInteger(ms) && ms >= RUN_END_HOLD_READABLE.min && ms <= RUN_END_HOLD_READABLE.max ? ms : undefined;
17
17
  }
18
- export const SANDBOX_POD_REAP_PERIOD_MS = 5 * 60_000;
19
18
  const CLASS_VERDICT = {
20
19
  live: "live",
21
20
  parked: "live",
@@ -2,10 +2,16 @@ import type { Pool as MySqlPool } from "mysql2/promise";
2
2
  import type { Pool as PgPool } from "pg";
3
3
  import { type SqlDriver } from "./sql-driver.js";
4
4
  import { type IndexSpec } from "./ensure-index.js";
5
+ import { type RunIdentity } from "../identity-source.js";
5
6
  /** 表名([ref] 单数纪律;`schema-naming-invariants` 的闭集词表执法)。 */
6
7
  export declare const LEADER_RUN_TABLE = "leader_run";
7
8
  /** leader run 的四态 —— 与 `leader/endpoint.ts` 的 `LeaderRun["status"]` 同词表(闭集)。 */
8
9
  export type LeaderRunStatus = "running" | "completed" | "failed" | "needs_human";
10
+ /**
11
+ * 终局行的机读码闭集(`error_code` 列;与 run / bake 的取消终局同词:`failed` + `cancelled`)。今天唯一的成员 = 取消口停下的 run;
12
+ * 其余终局(自然失败、陈旧清算)不带码 ⇒ 列 NULL。读出表外词 ⇒ 响亮拒(与 {@link statusOf} 同)。
13
+ */
14
+ export type LeaderRunErrorCode = "cancelled";
9
15
  /** 库里一行 leader run 的读出形。`result` 是 `LeaderResult` 的 JSON 原样(店不解释它的内部结构)。 */
10
16
  export interface LeaderRunRecord {
11
17
  id: string;
@@ -17,6 +23,12 @@ export interface LeaderRunRecord {
17
23
  objectivePreview: string | null;
18
24
  result?: unknown;
19
25
  error?: string;
26
+ /** 只在取消口停下的终局上在场(列 NULL ⇒ 缺席)。 */
27
+ errorCode?: LeaderRunErrorCode;
28
+ /** 耐久取消旗(`cancel_requested` 列):取消口翻过、行当时还在跑 ⇒ `true`。只翻 `running` 行;终局之后不再变。 */
29
+ cancelRequested: boolean;
30
+ /** 受理时验过的身份元组(三列;律在 `identity-source.ts` 头注)。`null` = 不合格(列之前的行 / 无鉴权写面 / 别人替属主按下)。不上 wire。 */
31
+ identity: RunIdentity | null;
20
32
  startedAtMs: number;
21
33
  finishedAtMs?: number;
22
34
  }
@@ -26,12 +38,16 @@ export interface NewLeaderRun {
26
38
  owner: string | null;
27
39
  /** 已 scope 过的幂等键(唯一铸法 `idemKeyOf(raw, caller, "leader")`,`http/idempotency.ts`;sha256 hex 定宽 64);null = 不去重。 */
28
40
  idemKey: string | null;
41
+ /** 受理时的身份元组 —— 凭据门铸、提交路由经 `runIdentityOf` 交来,原样写入,之后只读(店不重算)。 */
42
+ identity: RunIdentity | null;
29
43
  }
30
44
  /** 终局补丁 —— `finishRun` 一次写完(状态 + 结果/错误 + 完成时刻)。 */
31
45
  export interface LeaderRunTerminal {
32
46
  status: Exclude<LeaderRunStatus, "running">;
33
47
  result?: unknown;
34
48
  error?: string;
49
+ /** 取消口停下的终局带 `cancelled`;其余缺席(列写 NULL)。 */
50
+ errorCode?: LeaderRunErrorCode;
35
51
  }
36
52
  /** `objective_preview` 的字符上限,与 DDL 的 VARCHAR(160) 同源(`task_run.objective_preview` 先例同宽)。 */
37
53
  export declare const LEADER_OBJECTIVE_PREVIEW_CHARS = 160;
@@ -67,6 +83,12 @@ export declare class SqlLeaderRunStore {
67
83
  getRun(id: string): Promise<LeaderRunRecord | undefined>;
68
84
  /** 按幂等键读回既有行(dup-key 观察臂;也给集成套件直查)。 */
69
85
  getByIdem(idemKey: string): Promise<LeaderRunRecord | undefined>;
86
+ /**
87
+ * 翻耐久取消旗 —— **只翻 `running` 行**(CAS:`WHERE status = 'running'`,与 task_run / image_bake 的 `requestCancel` 同形)。
88
+ * 回执 = 是否真的翻了:`false` ⇒ 行不在或已终局(取消口据此重读、按终局臂答)。驱动这条 run 的副本在下一个存活心跳拍读到它并中止;
89
+ * 与 {@link finishRun} 同一只谓词 ⇒ 两写在库里有先后:旗先到 ⇒ 终局写落定后的复读看得见它;终局先到 ⇒ 本 CAS 打空。
90
+ */
91
+ requestCancel(id: string): Promise<boolean>;
70
92
  /**
71
93
  * 陈旧 `running` 清算(codex 交叉复审 R1-high②,验真后修)。
72
94
  *
@@ -4,8 +4,10 @@ import { mysqlDriver, pgDriver, dialectJsonEncoder } from "./sql-driver.js";
4
4
  import { decodeNullableJsonColumn, foldJsonColumn, jsonColumnText, readNonNullJsonValueColumn } from "./sql-json-column.js";
5
5
  import { ensureIndexes } from "./ensure-index.js";
6
6
  import { buildObjectivePreview } from "../user-authored-text.js";
7
+ import { RUN_IDENTITY_COLUMNS, readRunIdentityCells, runIdentityCells } from "../identity-source.js";
7
8
  export const LEADER_RUN_TABLE = "leader_run";
8
9
  const LEADER_RUN_STATUSES = new Set(["running", "completed", "failed", "needs_human"]);
10
+ const LEADER_RUN_ERROR_CODES = new Set(["cancelled"]);
9
11
  export const LEADER_OBJECTIVE_PREVIEW_CHARS = 160;
10
12
  export const TIDB_LEADER_RUN_STATEMENTS = [
11
13
  `CREATE TABLE IF NOT EXISTS ${LEADER_RUN_TABLE} (
@@ -22,6 +24,12 @@ export const TIDB_LEADER_RUN_STATEMENTS = [
22
24
  -- result:LeaderResult 的 JSON 原样(店不解释内部结构)。仅终局时写。
23
25
  result JSON NULL,
24
26
  error TEXT NULL,
27
+ -- error_code:终局的机读码(闭集 LeaderRunErrorCode;今天只有取消口停下的 run 写 cancelled,其余 NULL)。
28
+ error_code VARCHAR(64) NULL,
29
+ -- cancel_requested:耐久取消旗(与 task_run / image_bake 同形)。取消口只翻 running 行;驱动这条 run 的副本按存活心跳拍读它并中止。
30
+ cancel_requested SMALLINT NOT NULL DEFAULT 0,
31
+ -- 受理时验过的身份元组三列(列定义的唯一属主 = identity-source.ts 的 RUN_IDENTITY_COLUMNS,与 task_run 内插同一段)。
32
+ ${RUN_IDENTITY_COLUMNS.mysql},
25
33
  started_at_ms BIGINT NOT NULL,
26
34
  finished_at_ms BIGINT NULL,
27
35
  PRIMARY KEY (leader_run_id),
@@ -39,6 +47,9 @@ export const PG_LEADER_RUN_SCHEMA = [
39
47
  status VARCHAR(16) COLLATE "C" NOT NULL,
40
48
  result JSONB NULL,
41
49
  error TEXT COLLATE "C" NULL,
50
+ error_code VARCHAR(64) COLLATE "C" NULL,
51
+ cancel_requested SMALLINT NOT NULL DEFAULT 0,
52
+ ${RUN_IDENTITY_COLUMNS.pg},
42
53
  started_at_ms BIGINT NOT NULL,
43
54
  finished_at_ms BIGINT NULL,
44
55
  PRIMARY KEY (leader_run_id),
@@ -47,6 +58,7 @@ export const PG_LEADER_RUN_SCHEMA = [
47
58
  ];
48
59
  export const LEADER_RUN_INDEXES = [
49
60
  { table: `${LEADER_RUN_TABLE}`, name: "idx_leader_run_owner", columns: ["owner"] },
61
+ { table: `${LEADER_RUN_TABLE}`, name: "uq_leader_run_idem", columns: ["idem_key"], unique: true },
50
62
  { table: `${LEADER_RUN_TABLE}`, name: "idx_leader_run_started", columns: ["started_at_ms"] },
51
63
  ];
52
64
  export async function ensurePgLeaderRunSchema(q) {
@@ -57,7 +69,7 @@ export async function ensurePgLeaderRunSchema(q) {
57
69
  export const STALE_SWEEP_REASON = "leader run went stale: no replica settled it within LEADER_RUN_STALE_MS (the replica driving it most likely died). " +
58
70
  "The run was NOT taken over — re-submit with a NEW Idempotency-Key to run it again.";
59
71
  function selectCols(dialect) {
60
- return `leader_run_id, owner, objective_preview, status, ${jsonColumnText(dialect, "result")}, error, started_at_ms, finished_at_ms`;
72
+ return `leader_run_id, owner, objective_preview, status, ${jsonColumnText(dialect, "result")}, error, error_code, cancel_requested, identity_source, identity_scope, identity_principal_inc, started_at_ms, finished_at_ms`;
61
73
  }
62
74
  function readResultColumn(text, id) {
63
75
  try {
@@ -67,6 +79,15 @@ function readResultColumn(text, id) {
67
79
  throw foldJsonColumn(e, (m) => `leader_run: ${m} — refusing rather than serve this run as if it had finished empty-handed`);
68
80
  }
69
81
  }
82
+ function errorCodeOf(raw, id) {
83
+ if (raw == null)
84
+ return undefined;
85
+ const s = String(raw);
86
+ if (!LEADER_RUN_ERROR_CODES.has(s)) {
87
+ throw new Error(`leader_run ${id}: unknown error_code ${JSON.stringify(s)} (closed word table: ${[...LEADER_RUN_ERROR_CODES].join("|")}) — a newer replica wrote a word this build cannot interpret`);
88
+ }
89
+ return s;
90
+ }
70
91
  function statusOf(raw, id) {
71
92
  const s = String(raw);
72
93
  if (!LEADER_RUN_STATUSES.has(s)) {
@@ -78,6 +99,7 @@ function mapRow(r) {
78
99
  const id = String(r.leader_run_id);
79
100
  const result = readResultColumn(r.result, id);
80
101
  const error = r.error == null ? undefined : String(r.error);
102
+ const errorCode = errorCodeOf(r.error_code, id);
81
103
  const finished = r.finished_at_ms == null ? undefined : Number(r.finished_at_ms);
82
104
  return {
83
105
  id,
@@ -86,6 +108,9 @@ function mapRow(r) {
86
108
  objectivePreview: r.objective_preview == null ? null : String(r.objective_preview),
87
109
  ...(result === undefined ? {} : { result }),
88
110
  ...(error === undefined ? {} : { error }),
111
+ ...(errorCode === undefined ? {} : { errorCode }),
112
+ cancelRequested: Number(r.cancel_requested) === 1,
113
+ identity: readRunIdentityCells(r.identity_source, r.identity_scope, r.identity_principal_inc),
89
114
  startedAtMs: Number(r.started_at_ms),
90
115
  ...(finished === undefined ? {} : { finishedAtMs: finished }),
91
116
  };
@@ -102,9 +127,10 @@ export class SqlLeaderRunStore {
102
127
  const id = uuidv7();
103
128
  const now = Date.now();
104
129
  const preview = buildObjectivePreview(input.objective, LEADER_OBJECTIVE_PREVIEW_CHARS);
105
- const params = [id, input.idemKey, input.owner, preview, "running", now];
130
+ const cells = runIdentityCells(input.identity);
131
+ const params = [id, input.idemKey, input.owner, preview, "running", now, cells.identitySource, cells.identityScope, cells.identityPrincipalInc];
106
132
  try {
107
- await this.db.query(this.q(`INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms) VALUES (?,?,?,?,?,?)`, `INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms) VALUES ($1,$2,$3,$4,$5,$6)`), params);
133
+ await this.db.query(this.q(`INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms, identity_source, identity_scope, identity_principal_inc) VALUES (?,?,?,?,?,?,?,?,?)`, `INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms, identity_source, identity_scope, identity_principal_inc) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)`), params);
108
134
  }
109
135
  catch (err) {
110
136
  if (isDupKeyError(this.db.dialect, err) && input.idemKey) {
@@ -129,6 +155,10 @@ export class SqlLeaderRunStore {
129
155
  const row = res.rows[0];
130
156
  return row ? mapRow(row) : undefined;
131
157
  }
158
+ async requestCancel(id) {
159
+ const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET cancel_requested = 1 WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET cancel_requested = 1 WHERE leader_run_id = $1 AND status = 'running'`), [id]);
160
+ return res.affected > 0;
161
+ }
132
162
  async reapStaleRunning(staleMs, now) {
133
163
  const cutoff = now - staleMs;
134
164
  const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = 'failed', error = ?, finished_at_ms = ? WHERE status = 'running' AND started_at_ms < ?`, `UPDATE ${LEADER_RUN_TABLE} SET status = 'failed', error = $1, finished_at_ms = $2 WHERE status = 'running' AND started_at_ms < $3`), [STALE_SWEEP_REASON, now, cutoff]);
@@ -139,7 +169,7 @@ export class SqlLeaderRunStore {
139
169
  }
140
170
  async finishRun(id, patch) {
141
171
  const json = dialectJsonEncoder(this.db.dialect);
142
- const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = ?, result = CAST(? AS JSON), error = ?, finished_at_ms = ? WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET status = $1, result = $2::jsonb, error = $3, finished_at_ms = $4 WHERE leader_run_id = $5 AND status = 'running'`), [patch.status, patch.result == null ? null : json(patch.result), patch.error ?? null, Date.now(), id]);
172
+ const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = ?, result = CAST(? AS JSON), error = ?, error_code = ?, finished_at_ms = ? WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET status = $1, result = $2::jsonb, error = $3, error_code = $4, finished_at_ms = $5 WHERE leader_run_id = $6 AND status = 'running'`), [patch.status, patch.result == null ? null : json(patch.result), patch.error ?? null, patch.errorCode ?? null, Date.now(), id]);
143
173
  return res.affected > 0;
144
174
  }
145
175
  }