@sema-agent/server 7.147.0 → 7.149.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/MIGRATION.md +1468 -24
  2. package/README.md +35 -7
  3. package/README.zh-CN.md +18 -8
  4. package/USAGE.md +444 -193
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/approval-card.d.ts +36 -38
  39. package/dist/approval-gate-currency.js +3 -2
  40. package/dist/approval-leg-origin.d.ts +33 -0
  41. package/dist/approval-leg-origin.js +4 -0
  42. package/dist/approval-reconciler.d.ts +4 -13
  43. package/dist/approval-reconciler.js +2 -2
  44. package/dist/approval.d.ts +13 -11
  45. package/dist/approval.js +3 -3
  46. package/dist/audit.d.ts +10 -3
  47. package/dist/audit.js +15 -7
  48. package/dist/auth-bridge.d.ts +9 -15
  49. package/dist/auth-bridge.js +4 -11
  50. package/dist/auth-keys.d.ts +10 -1
  51. package/dist/auth-keys.js +8 -0
  52. package/dist/auto-mode-face.d.ts +10 -7
  53. package/dist/auto-mode-face.js +7 -4
  54. package/dist/background-agent-name.d.ts +19 -1
  55. package/dist/background-agent-name.js +12 -2
  56. package/dist/background-session-reap.d.ts +1 -1
  57. package/dist/bake-runner/main.js +9 -6
  58. package/dist/bench/s1/arms.js +6 -5
  59. package/dist/bench/s1/live-deps.js +5 -2
  60. package/dist/bench/s1/run-firm.js +6 -5
  61. package/dist/bind-host.d.ts +25 -0
  62. package/dist/bind-host.js +25 -0
  63. package/dist/boot/adoption.d.ts +3 -0
  64. package/dist/boot/adoption.js +1 -0
  65. package/dist/boot/deployment-mods.d.ts +1 -1
  66. package/dist/boot/execution-env.d.ts +17 -7
  67. package/dist/boot/execution-env.js +47 -42
  68. package/dist/boot/execution-lane.d.ts +6 -4
  69. package/dist/boot/execution-lane.js +3 -1
  70. package/dist/boot/exit-boundary.d.ts +2 -2
  71. package/dist/boot/exit-boundary.js +6 -5
  72. package/dist/boot/fatal-exit.d.ts +3 -5
  73. package/dist/boot/fatal-exit.js +2 -2
  74. package/dist/boot/leader.d.ts +15 -0
  75. package/dist/boot/leader.js +17 -15
  76. package/dist/boot/memory-consolidation.d.ts +37 -29
  77. package/dist/boot/memory-consolidation.js +11 -5
  78. package/dist/boot/org-delivery.d.ts +3 -2
  79. package/dist/boot/org-memory.js +1 -1
  80. package/dist/boot/parked-revive-gate.js +2 -2
  81. package/dist/boot/reapers.d.ts +4 -3
  82. package/dist/boot/reapers.js +19 -16
  83. package/dist/boot/resolve-spec.d.ts +5 -3
  84. package/dist/boot/resolve-spec.js +60 -70
  85. package/dist/boot/retention-lane.d.ts +4 -4
  86. package/dist/boot/retention-lane.js +2 -2
  87. package/dist/boot/runner-deps.d.ts +28 -7
  88. package/dist/boot/runner-deps.js +14 -5
  89. package/dist/boot/runtime-caps.d.ts +2 -2
  90. package/dist/boot/runtime-caps.js +16 -2
  91. package/dist/boot/session-faces.d.ts +16 -7
  92. package/dist/boot/session-faces.js +114 -94
  93. package/dist/boot/shutdown.d.ts +5 -4
  94. package/dist/boot/shutdown.js +6 -4
  95. package/dist/boot/stage-01-config.d.ts +1 -0
  96. package/dist/boot/stage-01-config.js +13 -4
  97. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
  98. package/dist/boot/stage-02-web-admin-pull.js +16 -3
  99. package/dist/boot/stage-03-store-backend.d.ts +4 -0
  100. package/dist/boot/stage-03-store-backend.js +4 -3
  101. package/dist/boot/stage-04-stores.d.ts +3 -0
  102. package/dist/boot/stage-04-stores.js +2 -2
  103. package/dist/boot/stage-05-execution-env.d.ts +8 -3
  104. package/dist/boot/stage-05-execution-env.js +2 -2
  105. package/dist/boot/stage-06-runners.d.ts +12 -13
  106. package/dist/boot/stage-06-runners.js +23 -15
  107. package/dist/boot/stage-07-capability-layer.d.ts +13 -9
  108. package/dist/boot/stage-07-capability-layer.js +5 -3
  109. package/dist/boot/stage-08-reapers.d.ts +13 -9
  110. package/dist/boot/stage-08-reapers.js +3 -3
  111. package/dist/boot/stage-09-leader.d.ts +14 -16
  112. package/dist/boot/stage-09-leader.js +12 -4
  113. package/dist/boot/stage-10-http-server.d.ts +14 -16
  114. package/dist/boot/stage-10-http-server.js +7 -4
  115. package/dist/boot/store-evidence.d.ts +20 -0
  116. package/dist/boot/store-evidence.js +13 -0
  117. package/dist/boot/stores.d.ts +6 -0
  118. package/dist/boot/stores.js +41 -27
  119. package/dist/boot/task-list-lane.d.ts +4 -4
  120. package/dist/boot/web-admin.d.ts +4 -2
  121. package/dist/boot/web-admin.js +55 -35
  122. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  123. package/dist/boot-reclaim.d.ts +3 -1
  124. package/dist/boot-reclaim.js +1 -1
  125. package/dist/brain.d.ts +7 -18
  126. package/dist/brain.js +5 -17
  127. package/dist/budget.js +6 -6
  128. package/dist/capabilities/center-plugins.d.ts +7 -1
  129. package/dist/capabilities/center-plugins.js +32 -10
  130. package/dist/capabilities/center-wiring.js +1 -1
  131. package/dist/capabilities/composite-members.d.ts +2 -2
  132. package/dist/capabilities/composite-members.js +2 -2
  133. package/dist/capabilities/repo-tools.d.ts +2 -0
  134. package/dist/capabilities/repo-tools.js +14 -12
  135. package/dist/capabilities/scenarios.d.ts +6 -15
  136. package/dist/capabilities/scenarios.js +11 -16
  137. package/dist/capabilities/skills.d.ts +1 -1
  138. package/dist/capabilities/tool-defer.d.ts +1 -1
  139. package/dist/capability-facts.d.ts +39 -11
  140. package/dist/capability-facts.js +35 -7
  141. package/dist/card-settle-stored-scope.d.ts +56 -0
  142. package/dist/card-settle-stored-scope.js +27 -0
  143. package/dist/card-void.d.ts +8 -13
  144. package/dist/card-void.js +2 -7
  145. package/dist/center-credential-renewer.d.ts +6 -2
  146. package/dist/center-credential-renewer.js +7 -3
  147. package/dist/config-catalog.d.ts +28 -1
  148. package/dist/config-catalog.js +95 -85
  149. package/dist/config-dir-trust.d.ts +37 -4
  150. package/dist/config-dir-trust.js +88 -44
  151. package/dist/config-invariants.d.ts +43 -3
  152. package/dist/config-invariants.js +69 -5
  153. package/dist/config-lkg.d.ts +23 -1
  154. package/dist/config-lkg.js +17 -3
  155. package/dist/config-provider.d.ts +9 -9
  156. package/dist/config-provider.js +25 -110
  157. package/dist/config-pull-failure.d.ts +50 -0
  158. package/dist/config-pull-failure.js +48 -0
  159. package/dist/config-types.d.ts +62 -21
  160. package/dist/config.d.ts +14 -21
  161. package/dist/config.js +141 -64
  162. package/dist/context-window-notice.d.ts +31 -0
  163. package/dist/context-window-notice.js +28 -0
  164. package/dist/delegated-session-owner.d.ts +1 -1
  165. package/dist/deleted-session-ids.d.ts +3 -2
  166. package/dist/deployment-governance.d.ts +3 -3
  167. package/dist/deployment-shape.d.ts +46 -11
  168. package/dist/deployment-shape.js +8 -0
  169. package/dist/egress-redirect.d.ts +25 -7
  170. package/dist/egress-redirect.js +20 -2
  171. package/dist/elicitation.d.ts +6 -5
  172. package/dist/elicitation.js +23 -22
  173. package/dist/engine-identity.d.ts +28 -0
  174. package/dist/engine-identity.js +10 -0
  175. package/dist/entry-problems.d.ts +5 -7
  176. package/dist/entry-problems.js +1 -1
  177. package/dist/env-facts.js +2 -1
  178. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  179. package/dist/env-name-allowlist-knobs.js +5 -0
  180. package/dist/env-witness.d.ts +7 -0
  181. package/dist/env-witness.js +16 -0
  182. package/dist/execution-lane-caps.d.ts +25 -23
  183. package/dist/execution-lane-caps.js +18 -26
  184. package/dist/execution-placement.d.ts +58 -18
  185. package/dist/execution-placement.js +41 -2
  186. package/dist/field-conflict.d.ts +7 -11
  187. package/dist/field-conflict.js +3 -3
  188. package/dist/file-history-capture.d.ts +3 -3
  189. package/dist/file-history-disclosure.js +1 -0
  190. package/dist/fleet/fleet-bus.d.ts +21 -3
  191. package/dist/fleet/fleet-bus.js +35 -25
  192. package/dist/fleet/fleet-reconciler.js +2 -2
  193. package/dist/fleet/serving-lease.js +3 -3
  194. package/dist/fleet-client.js +3 -3
  195. package/dist/fleet-lease.d.ts +0 -1
  196. package/dist/fleet-lease.js +4 -5
  197. package/dist/history-anchor.d.ts +23 -3
  198. package/dist/history-anchor.js +24 -4
  199. package/dist/hitl-delivery.d.ts +90 -0
  200. package/dist/hitl-delivery.js +98 -0
  201. package/dist/hooks/classic-stations.d.ts +8 -11
  202. package/dist/hooks/classic-stations.js +0 -7
  203. package/dist/hooks/command-spawn.d.ts +7 -2
  204. package/dist/hooks/command-spawn.js +13 -6
  205. package/dist/hooks/hook-llm.d.ts +5 -1
  206. package/dist/hooks/hook-llm.js +24 -15
  207. package/dist/hooks/hook-runner.d.ts +72 -57
  208. package/dist/hooks/hook-runner.js +271 -193
  209. package/dist/host-lsp-manager.d.ts +22 -8
  210. package/dist/host-lsp-manager.js +4 -1
  211. package/dist/http/active-run-conflict.d.ts +2 -43
  212. package/dist/http/active-run-conflict.js +3 -7
  213. package/dist/http/admission.d.ts +4 -18
  214. package/dist/http/admission.js +76 -79
  215. package/dist/http/approval-sweeps.d.ts +3 -3
  216. package/dist/http/approval-sweeps.js +56 -31
  217. package/dist/http/caller-trust.d.ts +8 -10
  218. package/dist/http/caller-trust.js +1 -2
  219. package/dist/http/claim-heartbeat.d.ts +49 -0
  220. package/dist/http/claim-heartbeat.js +46 -0
  221. package/dist/http/claimed-run.d.ts +16 -8
  222. package/dist/http/claimed-run.js +8 -0
  223. package/dist/http/dispatch.d.ts +8 -1
  224. package/dist/http/dispatch.js +78 -30
  225. package/dist/http/durable-run-leg.d.ts +11 -4
  226. package/dist/http/durable-run-leg.js +45 -21
  227. package/dist/http/execution-context.d.ts +122 -47
  228. package/dist/http/execution-context.js +135 -43
  229. package/dist/http/health-reader.d.ts +36 -0
  230. package/dist/http/health-reader.js +21 -0
  231. package/dist/http/health-self-report.d.ts +9 -9
  232. package/dist/http/health-self-report.js +4 -4
  233. package/dist/http/idempotency.d.ts +9 -5
  234. package/dist/http/idempotency.js +4 -4
  235. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  236. package/dist/http/memory-compliance-failure-reply.js +4 -2
  237. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  238. package/dist/http/memory-face-fault-reply.js +71 -0
  239. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  240. package/dist/http/memory-store-refusal-reply.js +3 -0
  241. package/dist/http/owner-access.d.ts +392 -67
  242. package/dist/http/owner-access.js +370 -35
  243. package/dist/http/principal-gate.d.ts +39 -89
  244. package/dist/http/principal-gate.js +26 -68
  245. package/dist/http/refusal-body.d.ts +35 -2
  246. package/dist/http/refusal-body.js +34 -0
  247. package/dist/http/request-guards.d.ts +9 -13
  248. package/dist/http/request-guards.js +34 -68
  249. package/dist/http/resume-composition.d.ts +37 -0
  250. package/dist/http/resume-composition.js +18 -0
  251. package/dist/http/resume-ctx-read.d.ts +46 -12
  252. package/dist/http/resume-ctx-read.js +31 -6
  253. package/dist/http/resume-legs.d.ts +54 -19
  254. package/dist/http/resume-legs.js +408 -196
  255. package/dist/http/retired-skill-manifest.d.ts +1 -1
  256. package/dist/http/route-ctx.d.ts +31 -32
  257. package/dist/http/routes/a2a-serve.d.ts +43 -5
  258. package/dist/http/routes/a2a-serve.js +60 -37
  259. package/dist/http/routes/admin-config-refresh.js +2 -2
  260. package/dist/http/routes/admin-drain.js +2 -2
  261. package/dist/http/routes/admin-memory-optout.js +4 -3
  262. package/dist/http/routes/adoption.d.ts +3 -0
  263. package/dist/http/routes/adoption.js +17 -10
  264. package/dist/http/routes/agents-roster.js +13 -7
  265. package/dist/http/routes/approvals-assistant.js +73 -67
  266. package/dist/http/routes/attachments.js +2 -2
  267. package/dist/http/routes/background.d.ts +3 -3
  268. package/dist/http/routes/background.js +9 -17
  269. package/dist/http/routes/capabilities.js +16 -19
  270. package/dist/http/routes/config-catalog.js +2 -2
  271. package/dist/http/routes/devices.d.ts +3 -3
  272. package/dist/http/routes/devices.js +4 -4
  273. package/dist/http/routes/diagnostics.d.ts +29 -3
  274. package/dist/http/routes/diagnostics.js +49 -18
  275. package/dist/http/routes/engine.js +2 -2
  276. package/dist/http/routes/fleet.js +5 -3
  277. package/dist/http/routes/images.js +10 -6
  278. package/dist/http/routes/leader.d.ts +7 -2
  279. package/dist/http/routes/leader.js +12 -3
  280. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  281. package/dist/http/routes/mcp-reconnect.js +7 -15
  282. package/dist/http/routes/memory-bundle.js +4 -7
  283. package/dist/http/routes/memory-compliance.js +4 -4
  284. package/dist/http/routes/memory-consolidation.js +6 -9
  285. package/dist/http/routes/memory-origin.d.ts +2 -0
  286. package/dist/http/routes/memory-origin.js +7 -8
  287. package/dist/http/routes/memory-policy.js +17 -12
  288. package/dist/http/routes/notify-wake.js +10 -19
  289. package/dist/http/routes/observability.js +3 -3
  290. package/dist/http/routes/principal-inbox.d.ts +4 -2
  291. package/dist/http/routes/principal-inbox.js +5 -4
  292. package/dist/http/routes/projects.d.ts +1 -1
  293. package/dist/http/routes/projects.js +3 -2
  294. package/dist/http/routes/retention-ops.js +6 -9
  295. package/dist/http/routes/rules.js +20 -5
  296. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  297. package/dist/http/routes/run-memory-capture.js +6 -12
  298. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  299. package/dist/http/routes/run-permission-mode.js +10 -17
  300. package/dist/http/routes/runs.js +155 -237
  301. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  302. package/dist/http/routes/session-memory-sync.js +7 -13
  303. package/dist/http/routes/session-sync.d.ts +28 -7
  304. package/dist/http/routes/session-sync.js +63 -50
  305. package/dist/http/routes/sessions-list.d.ts +3 -3
  306. package/dist/http/routes/sessions-list.js +9 -9
  307. package/dist/http/routes/sessions.js +87 -124
  308. package/dist/http/routes/shared-memory.js +6 -6
  309. package/dist/http/routes/side-query.js +2 -2
  310. package/dist/http/routes/tasks.js +237 -187
  311. package/dist/http/routes/trace-usage.d.ts +0 -12
  312. package/dist/http/routes/trace-usage.js +40 -46
  313. package/dist/http/routes/workflows.d.ts +39 -4
  314. package/dist/http/routes/workflows.js +42 -14
  315. package/dist/http/run-concurrency-cap.d.ts +20 -12
  316. package/dist/http/run-concurrency-cap.js +39 -26
  317. package/dist/http/run-read-face.d.ts +3 -5
  318. package/dist/http/run-read-face.js +8 -13
  319. package/dist/http/send.d.ts +12 -3
  320. package/dist/http/send.js +42 -6
  321. package/dist/http/server.d.ts +43 -45
  322. package/dist/http/server.js +61 -11
  323. package/dist/http/sse-log.d.ts +17 -10
  324. package/dist/http/sse-log.js +7 -7
  325. package/dist/http/stored-body-replay.d.ts +12 -0
  326. package/dist/http/stored-body-replay.js +2 -2
  327. package/dist/http/submit-ctx.d.ts +17 -8
  328. package/dist/http/submit-ctx.js +8 -5
  329. package/dist/http/submit-replay.d.ts +19 -6
  330. package/dist/http/submit-replay.js +18 -6
  331. package/dist/http/sync-submit-body.d.ts +3 -4
  332. package/dist/http/sync-submit-body.js +4 -5
  333. package/dist/http/wire-types.d.ts +4 -3
  334. package/dist/identity-source.d.ts +36 -5
  335. package/dist/identity-source.js +27 -0
  336. package/dist/index.d.ts +4 -1
  337. package/dist/index.js +2 -0
  338. package/dist/key-resolver.d.ts +32 -0
  339. package/dist/key-resolver.js +23 -9
  340. package/dist/leader/diffup.js +2 -1
  341. package/dist/leader/endpoint.d.ts +26 -5
  342. package/dist/leader/endpoint.js +154 -14
  343. package/dist/leader/fanout.d.ts +3 -0
  344. package/dist/leader/fanout.js +78 -63
  345. package/dist/leader/leader.d.ts +16 -0
  346. package/dist/leader/leader.js +43 -3
  347. package/dist/leader/merge.d.ts +9 -1
  348. package/dist/leader/merge.js +16 -1
  349. package/dist/leader/repair-wire.js +1 -1
  350. package/dist/leader/wire.d.ts +36 -3
  351. package/dist/leader/wire.js +59 -18
  352. package/dist/leg-facts.d.ts +7 -2
  353. package/dist/leg-facts.js +1 -0
  354. package/dist/local-store-declaration.d.ts +54 -0
  355. package/dist/local-store-declaration.js +59 -0
  356. package/dist/lsp-evict.d.ts +6 -4
  357. package/dist/lsp-evict.js +2 -3
  358. package/dist/mcp-assertion-header.d.ts +1 -1
  359. package/dist/mcp-assertion-header.js +1 -1
  360. package/dist/memory-operator-faces.d.ts +5 -4
  361. package/dist/memory-operator-faces.js +1 -1
  362. package/dist/memory-project-layer.js +1 -1
  363. package/dist/memory-scope.d.ts +33 -6
  364. package/dist/memory-scope.js +68 -19
  365. package/dist/memory-store-refusal.d.ts +5 -2
  366. package/dist/memory-sync-client.d.ts +3 -2
  367. package/dist/memory-sync-client.js +8 -5
  368. package/dist/model-compat.d.ts +17 -8
  369. package/dist/model-compat.js +6 -2
  370. package/dist/model-context-window.d.ts +57 -0
  371. package/dist/model-context-window.js +21 -0
  372. package/dist/model-entry-headers.d.ts +46 -4
  373. package/dist/model-entry-headers.js +2 -2
  374. package/dist/model-entry-refusal.d.ts +40 -20
  375. package/dist/model-entry-refusal.js +57 -30
  376. package/dist/model-plane-face.d.ts +19 -11
  377. package/dist/model-plane-face.js +9 -1
  378. package/dist/model-plane-probe.d.ts +2 -0
  379. package/dist/model-plane-probe.js +17 -0
  380. package/dist/model-provider.d.ts +3 -3
  381. package/dist/model-reach-scope.d.ts +2 -1
  382. package/dist/model-route-endpoint.d.ts +9 -5
  383. package/dist/model-route-endpoint.js +29 -7
  384. package/dist/model-select.d.ts +16 -0
  385. package/dist/model-select.js +4 -0
  386. package/dist/mountinfo.d.ts +37 -0
  387. package/dist/mountinfo.js +47 -0
  388. package/dist/namespaced-rule-name.d.ts +23 -14
  389. package/dist/namespaced-rule-name.js +8 -11
  390. package/dist/net-address.d.ts +1 -1
  391. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  392. package/dist/observability/corrupt-read-seat.js +5 -3
  393. package/dist/observability/fail-open.d.ts +72 -40
  394. package/dist/observability/fail-open.js +74 -40
  395. package/dist/observability/logger.d.ts +22 -1
  396. package/dist/observability/logger.js +89 -12
  397. package/dist/observability/metrics.js +4 -5
  398. package/dist/observability/otel-exporter.js +2 -1
  399. package/dist/observability/principal-context.d.ts +14 -7
  400. package/dist/observability/principal-context.js +8 -3
  401. package/dist/observability/run-terminal.d.ts +7 -1
  402. package/dist/observability/run-terminal.js +6 -2
  403. package/dist/observability/secret-env-scrub.d.ts +1 -1
  404. package/dist/observability/secret-env-scrub.js +1 -1
  405. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  406. package/dist/orchestration/hardened-vm-runner.js +11 -5
  407. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  408. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  409. package/dist/orchestration/hardened-vm-worker.js +2 -1
  410. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  411. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  412. package/dist/org-delivery-gate.d.ts +36 -10
  413. package/dist/org-delivery-gate.js +12 -8
  414. package/dist/outbound-dispatcher.d.ts +1 -1
  415. package/dist/outbound-dispatcher.js +6 -12
  416. package/dist/owner-brands.d.ts +81 -0
  417. package/dist/owner-brands.js +42 -0
  418. package/dist/owner-faces.d.ts +532 -0
  419. package/dist/owner-faces.js +126 -0
  420. package/dist/park-row-commit.d.ts +67 -0
  421. package/dist/park-row-commit.js +76 -0
  422. package/dist/parked-decide.d.ts +76 -12
  423. package/dist/parked-decide.js +152 -11
  424. package/dist/parked-revive-surface.d.ts +14 -4
  425. package/dist/parked-revive-surface.js +5 -4
  426. package/dist/peer-directory.d.ts +7 -9
  427. package/dist/peer-directory.js +3 -2
  428. package/dist/permission-rule-vocab.d.ts +53 -8
  429. package/dist/permission-rule-vocab.js +30 -2
  430. package/dist/plugins/adoption-log-sql.d.ts +3 -25
  431. package/dist/plugins/adoption-log-sql.js +23 -21
  432. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  433. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  434. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  435. package/dist/plugins/approval-ask-store-file.js +37 -14
  436. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  437. package/dist/plugins/approval-ask-store-memory.js +24 -10
  438. package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
  439. package/dist/plugins/approval-ask-store-sql.js +44 -15
  440. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  441. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  442. package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
  443. package/dist/plugins/approval-exemption-skill-m46.js +21 -0
  444. package/dist/plugins/approval-exemption-store.d.ts +32 -2
  445. package/dist/plugins/approval-exemption-store.js +42 -19
  446. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  447. package/dist/plugins/approval-nonce-store.js +72 -23
  448. package/dist/plugins/blob-backend.d.ts +2 -0
  449. package/dist/plugins/blob-backend.js +9 -6
  450. package/dist/plugins/caching-session-store.d.ts +13 -1
  451. package/dist/plugins/caching-session-store.js +43 -4
  452. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  453. package/dist/plugins/checkpoint-index-columns.js +36 -1
  454. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  455. package/dist/plugins/checkpoint-store-face.js +18 -1
  456. package/dist/plugins/device-store-sql.js +1 -0
  457. package/dist/plugins/ensure-index.d.ts +13 -1
  458. package/dist/plugins/ensure-index.js +154 -21
  459. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
  460. package/dist/plugins/ensure-schema-lock-policy.js +76 -9
  461. package/dist/plugins/file-run-store.d.ts +85 -32
  462. package/dist/plugins/file-run-store.js +177 -94
  463. package/dist/plugins/host-platform.d.ts +24 -3
  464. package/dist/plugins/host-platform.js +15 -1
  465. package/dist/plugins/image-bake-store-sql.js +2 -0
  466. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  467. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  468. package/dist/plugins/k8s-pod-reaper.js +0 -1
  469. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  470. package/dist/plugins/leader-run-store-sql.js +34 -4
  471. package/dist/plugins/local-checkpoint-store.d.ts +62 -23
  472. package/dist/plugins/local-checkpoint-store.js +197 -77
  473. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  474. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  475. package/dist/plugins/local-data-root-admission.js +100 -0
  476. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  477. package/dist/plugins/local-docker-capacity.js +194 -0
  478. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  479. package/dist/plugins/local-docker-reaper.js +102 -0
  480. package/dist/plugins/local-engine-high-water.d.ts +29 -6
  481. package/dist/plugins/local-engine-high-water.js +27 -19
  482. package/dist/plugins/local-session-store.d.ts +458 -140
  483. package/dist/plugins/local-session-store.js +906 -292
  484. package/dist/plugins/local-session-window.d.ts +3 -2
  485. package/dist/plugins/local-session-window.js +3 -2
  486. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  487. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  488. package/dist/plugins/local-task-attachment-store.js +22 -1
  489. package/dist/plugins/memory-embedder.js +9 -7
  490. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  491. package/dist/plugins/memory-engine-pg.js +14 -5
  492. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  493. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  494. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  495. package/dist/plugins/memory-engine-tidb.js +11 -2
  496. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  497. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  498. package/dist/plugins/memory-run-store.d.ts +53 -36
  499. package/dist/plugins/memory-run-store.js +116 -88
  500. package/dist/plugins/one-time-migration-marker.d.ts +26 -0
  501. package/dist/plugins/one-time-migration-marker.js +13 -0
  502. package/dist/plugins/one-time-migrations.d.ts +214 -47
  503. package/dist/plugins/one-time-migrations.js +481 -135
  504. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  505. package/dist/plugins/org-delivery-quota-store.js +31 -15
  506. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  507. package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
  508. package/dist/plugins/permission-rule-store-sql.js +11 -95
  509. package/dist/plugins/pg-pool.d.ts +2 -32
  510. package/dist/plugins/pg-pool.js +24 -17
  511. package/dist/plugins/remote-env-device.d.ts +3 -2
  512. package/dist/plugins/remote-env-e2b.d.ts +8 -32
  513. package/dist/plugins/remote-env-e2b.js +44 -32
  514. package/dist/plugins/remote-env-host.d.ts +51 -17
  515. package/dist/plugins/remote-env-host.js +111 -42
  516. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  517. package/dist/plugins/remote-env-k8s.js +111 -60
  518. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  519. package/dist/plugins/remote-env-local-docker.js +352 -72
  520. package/dist/plugins/remote-scratchpad.js +4 -0
  521. package/dist/plugins/retention-deployment.d.ts +49 -17
  522. package/dist/plugins/retention-deployment.js +39 -8
  523. package/dist/plugins/run-preview-m45.d.ts +11 -0
  524. package/dist/plugins/run-preview-m45.js +19 -0
  525. package/dist/plugins/run-store-sql.d.ts +82 -75
  526. package/dist/plugins/run-store-sql.js +164 -125
  527. package/dist/plugins/s3-answer.d.ts +2 -1
  528. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  529. package/dist/plugins/sandbox-reaper.js +2 -0
  530. package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
  531. package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
  532. package/dist/plugins/scheduler-support.d.ts +16 -1
  533. package/dist/plugins/scheduler-support.js +22 -2
  534. package/dist/plugins/schema-consistency.d.ts +131 -14
  535. package/dist/plugins/schema-consistency.js +388 -18
  536. package/dist/plugins/schema-drift-sentence.d.ts +10 -6
  537. package/dist/plugins/schema-drift-sentence.js +15 -7
  538. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  539. package/dist/plugins/schema-ensure-legs.js +1 -1
  540. package/dist/plugins/schema-indexes.js +3 -0
  541. package/dist/plugins/schema-live-columns.d.ts +14 -5
  542. package/dist/plugins/schema-live-columns.js +10 -10
  543. package/dist/plugins/send-user-file.js +2 -1
  544. package/dist/plugins/session-birth.d.ts +37 -0
  545. package/dist/plugins/session-birth.js +38 -0
  546. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  547. package/dist/plugins/session-epoch-anchor.js +33 -11
  548. package/dist/plugins/session-ext-table.d.ts +27 -3
  549. package/dist/plugins/session-ext-table.js +19 -6
  550. package/dist/plugins/session-fork.d.ts +15 -1
  551. package/dist/plugins/session-fork.js +3 -0
  552. package/dist/plugins/session-ownership.d.ts +1 -1
  553. package/dist/plugins/session-placement.d.ts +27 -20
  554. package/dist/plugins/session-placement.js +15 -12
  555. package/dist/plugins/session-row-sql.d.ts +12 -0
  556. package/dist/plugins/session-row-sql.js +3 -3
  557. package/dist/plugins/session-run-rollup.d.ts +29 -0
  558. package/dist/plugins/session-run-rollup.js +40 -0
  559. package/dist/plugins/session-store-sql.d.ts +38 -12
  560. package/dist/plugins/session-store-sql.js +130 -30
  561. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  562. package/dist/plugins/session-withdraw-sql.js +42 -0
  563. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  564. package/dist/plugins/shared-memory-store-sql.js +2 -1
  565. package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
  566. package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
  567. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  568. package/dist/plugins/sql-driver.d.ts +1 -1
  569. package/dist/plugins/sql-driver.js +2 -1
  570. package/dist/plugins/sql-errors.d.ts +32 -5
  571. package/dist/plugins/sql-errors.js +55 -7
  572. package/dist/plugins/sql-json-column.d.ts +8 -7
  573. package/dist/plugins/sql-json-column.js +10 -6
  574. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  575. package/dist/plugins/stop-then-start-sentence.js +7 -0
  576. package/dist/plugins/store-backend.d.ts +99 -16
  577. package/dist/plugins/store-backend.js +230 -65
  578. package/dist/plugins/store-contracts.d.ts +123 -33
  579. package/dist/plugins/store-contracts.js +38 -1
  580. package/dist/plugins/store-fault.d.ts +28 -2
  581. package/dist/plugins/store-fault.js +20 -2
  582. package/dist/plugins/task-attachment-store.d.ts +15 -3
  583. package/dist/plugins/task-attachment-store.js +22 -9
  584. package/dist/plugins/tidb-pool.d.ts +11 -6
  585. package/dist/plugins/tidb-pool.js +39 -18
  586. package/dist/plugins/web-search.js +5 -3
  587. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  588. package/dist/plugins/workflow-run-store-sql.js +11 -5
  589. package/dist/plugins/workspace-custody.d.ts +44 -0
  590. package/dist/plugins/workspace-custody.js +47 -0
  591. package/dist/principal-jwt.d.ts +4 -4
  592. package/dist/principal-jwt.js +20 -5
  593. package/dist/principal-shape.d.ts +41 -0
  594. package/dist/principal-shape.js +19 -0
  595. package/dist/project-identity.d.ts +8 -7
  596. package/dist/project-identity.js +40 -17
  597. package/dist/project-layer-key.d.ts +13 -2
  598. package/dist/project-layer-key.js +9 -1
  599. package/dist/question.d.ts +13 -23
  600. package/dist/question.js +21 -39
  601. package/dist/read-deny-floor-notice.d.ts +36 -0
  602. package/dist/read-deny-floor-notice.js +40 -0
  603. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  604. package/dist/request-declaration-disposition.js +39 -0
  605. package/dist/request-declaration-refusal.d.ts +35 -12
  606. package/dist/request-declaration-refusal.js +21 -9
  607. package/dist/request-form.d.ts +58 -0
  608. package/dist/request-form.js +72 -0
  609. package/dist/request-image-urls.d.ts +8 -2
  610. package/dist/request-image-urls.js +2 -1
  611. package/dist/request-images.d.ts +20 -0
  612. package/dist/request-images.js +59 -0
  613. package/dist/request-key-closure.d.ts +6 -7
  614. package/dist/request-key-closure.js +15 -2
  615. package/dist/resource-suspend.d.ts +7 -16
  616. package/dist/resource-suspend.js +1 -1
  617. package/dist/retired-name-host-notice.d.ts +21 -0
  618. package/dist/retired-name-host-notice.js +12 -0
  619. package/dist/rule-entry-list.d.ts +2 -2
  620. package/dist/rule-entry-list.js +3 -4
  621. package/dist/rule-issue-reading.d.ts +58 -0
  622. package/dist/rule-issue-reading.js +14 -0
  623. package/dist/rules-consent.d.ts +5 -3
  624. package/dist/rules-consent.js +1 -0
  625. package/dist/run-acceptance.d.ts +3 -1
  626. package/dist/run-acceptance.js +3 -0
  627. package/dist/run-cancel-card.d.ts +28 -0
  628. package/dist/run-cancel-card.js +19 -0
  629. package/dist/run-cancel-context.d.ts +10 -0
  630. package/dist/run-cancel-context.js +1 -0
  631. package/dist/run-local.d.ts +14 -6
  632. package/dist/run-local.js +117 -90
  633. package/dist/run-stale-default.d.ts +7 -0
  634. package/dist/run-stale-default.js +2 -0
  635. package/dist/runs.d.ts +56 -21
  636. package/dist/runs.js +73 -43
  637. package/dist/runtime-caps-resolver.d.ts +21 -6
  638. package/dist/runtime-caps-resolver.js +17 -4
  639. package/dist/runtime-governance.d.ts +2 -2
  640. package/dist/runtime-governance.js +5 -3
  641. package/dist/sealed-key-layout.d.ts +12 -5
  642. package/dist/sealed-key-layout.js +5 -0
  643. package/dist/sealed-key.d.ts +12 -2
  644. package/dist/sealed-key.js +115 -27
  645. package/dist/security.d.ts +128 -158
  646. package/dist/security.js +163 -59
  647. package/dist/sema-config-dir.d.ts +20 -0
  648. package/dist/sema-config-dir.js +25 -0
  649. package/dist/server-secret-env.d.ts +55 -25
  650. package/dist/server-secret-env.js +75 -22
  651. package/dist/session-agent.d.ts +3 -2
  652. package/dist/session-children-retire.d.ts +13 -8
  653. package/dist/session-children-retire.js +9 -7
  654. package/dist/session-deletion.d.ts +88 -0
  655. package/dist/session-deletion.js +8 -0
  656. package/dist/session-erase.d.ts +145 -0
  657. package/dist/session-erase.js +115 -0
  658. package/dist/session-error-wire.d.ts +5 -5
  659. package/dist/session-error-wire.js +1 -1
  660. package/dist/session-incarnation.d.ts +52 -5
  661. package/dist/session-incarnation.js +19 -2
  662. package/dist/session-policy-wire.d.ts +6 -3
  663. package/dist/session-policy-wire.js +11 -1
  664. package/dist/session-resident-background.d.ts +0 -71
  665. package/dist/session-resident-background.js +4 -3
  666. package/dist/session-row.d.ts +2 -1
  667. package/dist/session-rules-seat.d.ts +12 -0
  668. package/dist/session-rules-seat.js +19 -0
  669. package/dist/session-titler.d.ts +7 -15
  670. package/dist/session-titler.js +1 -1
  671. package/dist/session-workspace.d.ts +3 -3
  672. package/dist/spec-fields.d.ts +57 -3
  673. package/dist/spec-fields.js +72 -51
  674. package/dist/store-admission.d.ts +33 -0
  675. package/dist/store-admission.js +49 -0
  676. package/dist/store-posture.d.ts +141 -20
  677. package/dist/store-posture.js +205 -3
  678. package/dist/stored-request-hooks-m20.js +2 -2
  679. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  680. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  681. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  682. package/dist/stores-sql/checkpoint-store-sql.js +78 -49
  683. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  684. package/dist/stores-sql/file-history-store-sql.js +3 -5
  685. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  686. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  687. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  688. package/dist/stores-sql/pg-session-storage.js +54 -46
  689. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  690. package/dist/stores-sql/retention-store-sql.js +92 -27
  691. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  692. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  693. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  694. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  695. package/dist/stores-sql/tidb-session-storage.js +13 -8
  696. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  697. package/dist/stores-sql/tidb-session-store.js +69 -39
  698. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  699. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  700. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  701. package/dist/stores-sql/windowed-session-storage.js +9 -0
  702. package/dist/submission-exit.d.ts +50 -0
  703. package/dist/submission-exit.js +108 -0
  704. package/dist/task-a2a.d.ts +3 -8
  705. package/dist/task-a2a.js +28 -30
  706. package/dist/task-cwd.d.ts +43 -7
  707. package/dist/task-cwd.js +11 -0
  708. package/dist/task-mcp.d.ts +3 -3
  709. package/dist/task-mcp.js +4 -4
  710. package/dist/task-settings.d.ts +14 -10
  711. package/dist/task-settings.js +19 -7
  712. package/dist/terminal.d.ts +27 -43
  713. package/dist/terminal.js +49 -14
  714. package/dist/tool-approval.d.ts +173 -163
  715. package/dist/tool-approval.js +247 -232
  716. package/dist/trace/core-keyset-guard.d.ts +13 -6
  717. package/dist/trace/core-vocab-wire.d.ts +95 -0
  718. package/dist/trace/core-vocab-wire.js +15 -0
  719. package/dist/trace/engine-notice-wire.d.ts +24 -21
  720. package/dist/trace/engine-notice-wire.js +7 -3
  721. package/dist/trace/exit-seat.d.ts +30 -4
  722. package/dist/trace/exit-seat.js +40 -36
  723. package/dist/trace/extension-call-face.d.ts +3 -2
  724. package/dist/trace/extension-call-face.js +3 -1
  725. package/dist/trace/ledger-events.d.ts +4 -7
  726. package/dist/trace/ledger-sink.d.ts +4 -31
  727. package/dist/trace/ledger-sink.js +0 -11
  728. package/dist/trace/model-segment.d.ts +5 -5
  729. package/dist/trace/model-segment.js +5 -5
  730. package/dist/trace/project.d.ts +59 -44
  731. package/dist/trace/project.js +60 -26
  732. package/dist/trace/redact.d.ts +135 -27
  733. package/dist/trace/redact.js +884 -260
  734. package/dist/trace/self-minted-wire.d.ts +567 -20
  735. package/dist/trace/self-minted-wire.js +205 -24
  736. package/dist/trace/wire-projection-faces.d.ts +5 -6
  737. package/dist/trace/wire-projection-faces.js +2 -2
  738. package/dist/upstream-body.d.ts +23 -0
  739. package/dist/upstream-body.js +16 -0
  740. package/dist/url-refusal.d.ts +3 -3
  741. package/dist/url-refusal.js +11 -4
  742. package/dist/user-authored-text.d.ts +1 -1
  743. package/dist/user-input-ledger.d.ts +7 -8
  744. package/dist/user-input-ledger.js +1 -1
  745. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  746. package/dist/web-admin-client/apply-effective.js +33 -23
  747. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  748. package/dist/web-admin-client/apply-ledger.js +5 -2
  749. package/dist/web-admin-client/center-request.d.ts +2 -2
  750. package/dist/web-admin-client/center-request.js +15 -15
  751. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  752. package/dist/web-admin-client/effective-keys.js +1 -1
  753. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  754. package/dist/web-admin-client/entry-metadata.js +13 -0
  755. package/dist/web-admin-client/http-client.d.ts +1 -1
  756. package/dist/web-admin-client/http-client.js +23 -4
  757. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  758. package/dist/web-admin-client/mcp-revocation.js +2 -1
  759. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  760. package/dist/web-admin-client/read-warnings.js +1 -0
  761. package/dist/web-admin-client/restart-signal.js +8 -4
  762. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  763. package/dist/web-admin-client/types.d.ts +1 -2
  764. package/dist/workspace-space.d.ts +3 -2
  765. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  766. package/docs/error-text-lexicon.json +317 -0
  767. package/package.json +8 -3
  768. package/scripts/drain-check-local.mjs +118 -147
  769. package/scripts/drain-check.mysql.sql +22 -2
  770. package/scripts/drain-check.pg.sql +22 -2
  771. package/scripts/embed-minimal.mjs +183 -0
  772. package/wire-changes/server@7.148.0.json +1517 -0
  773. package/wire-changes/server@7.149.0.json +372 -0
  774. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  775. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  776. package/dist/http/memory-layer-reply.d.ts +0 -30
  777. package/dist/http/memory-layer-reply.js +0 -24
  778. package/dist/lsp/e2b-bridge.d.ts +0 -57
  779. package/dist/lsp/e2b-bridge.js +0 -139
  780. package/dist/lsp/e2b-manager.d.ts +0 -93
  781. package/dist/lsp/e2b-manager.js +0 -178
  782. package/dist/lsp/lsp-frames.d.ts +0 -14
  783. package/dist/lsp/lsp-frames.js +0 -25
  784. package/dist/lsp/manager.d.ts +0 -129
  785. package/dist/lsp/manager.js +0 -127
  786. package/dist/lsp/types.d.ts +0 -12
  787. package/dist/lsp/types.js +0 -2
  788. package/dist/lsp/ws-transport.d.ts +0 -40
  789. package/dist/lsp/ws-transport.js +0 -210
  790. package/dist/plain-string-record.js +0 -70
@@ -2,8 +2,9 @@ import path from "node:path";
2
2
  import { spawn } from "node:child_process";
3
3
  import { hostSubprocessEnv } from "../server-secret-env.js";
4
4
  import { LANE_HOME_PROBE_COMMAND, LaneHomeSeat } from "../lane-home-probe.js";
5
- import { randomBytes } from "node:crypto";
5
+ import { createHash, randomBytes } from "node:crypto";
6
6
  import { shellQuote, armPipeDestroyGrace, appendFileStaged, readyUpload, writeFileStaged } from "./remote-shell.js";
7
+ import { createWorkspaceCustody } from "./workspace-custody.js";
7
8
  import { signalNumber } from "./host-platform.js";
8
9
  import { buildLivenessCut, commandBoundsOf } from "../exec-bounds.js";
9
10
  import { buildCapturedOutput, createCutError } from "../exec-cut.js";
@@ -16,6 +17,12 @@ const PROVIDER = "local-docker";
16
17
  const DEFAULT_MOUNT_PATH = "/workspace";
17
18
  const DEFAULT_COMMAND_TIMEOUT_MS = 30 * 60_000;
18
19
  const DEFAULT_CONTROL_TIMEOUT_MS = 60_000;
20
+ const INSPECT_ID_STATE_AND_LABELS = "{{.Id}}\t{{.State.Status}}\t{{json .Config.Labels}}";
21
+ const DOCKER_STATES = ["created", "running", "paused", "restarting", "removing", "exited", "dead"];
22
+ const NO_CUSTODY = Object.freeze({ kind: "none" });
23
+ function isNameConflict(stderr, name) {
24
+ return stderr.includes(`The container name "/${name}" is already in use`);
25
+ }
19
26
  const ok = (value) => ({ ok: true, value });
20
27
  const unsupported = (op) => ({
21
28
  ok: false,
@@ -33,12 +40,18 @@ export class RemoteLocalDockerExecutionEnv {
33
40
  cfg;
34
41
  spawnFn;
35
42
  containerName;
43
+ custody;
36
44
  containerId;
45
+ removedAny = false;
46
+ teardown;
47
+ teardownSettled = false;
37
48
  handle;
38
49
  destroyed = false;
39
50
  connecting;
40
51
  connectRefusal;
41
52
  homeSeat;
53
+ lifecycle = new AbortController();
54
+ capacityDeadline;
42
55
  constructor(config, deps = {}) {
43
56
  if (!config.image || !config.image.trim()) {
44
57
  config = { ...config, image: config.image ?? "" };
@@ -56,9 +69,24 @@ export class RemoteLocalDockerExecutionEnv {
56
69
  this.spawnFn = deps.spawn ?? spawn;
57
70
  this.floor = deps.readFloor ?? createSandboxReadFloor({ lane: PROVIDER, knob: config.sandboxReadFloor });
58
71
  this.capabilities = capabilitiesFor({ remoteExec: { provider: PROVIDER }, sandboxReadFloor: config.sandboxReadFloor });
59
- const id = config.id ?? randomBytes(6).toString("hex");
60
- const suffix = randomBytes(4).toString("hex");
61
- this.containerName = `sema-docker-${sanitizeId(id)}-${suffix}`;
72
+ this.containerName = localDockerContainerNameOf(config.workerLabel, config.id ?? randomBytes(6).toString("hex"));
73
+ this.custody = config.leftover ?? NO_CUSTODY;
74
+ }
75
+ get instance() {
76
+ return this.custody.kind === "held" ? this.custody.id : undefined;
77
+ }
78
+ get leftover() {
79
+ const c = this.custody;
80
+ return c.kind === "doomed" || c.kind === "doomed-unknown" ? c : undefined;
81
+ }
82
+ get releasing() {
83
+ return this.teardown;
84
+ }
85
+ get released() {
86
+ return this.teardownSettled;
87
+ }
88
+ get settled() {
89
+ return this.teardownSettled && this.leftover === undefined;
62
90
  }
63
91
  resolve(p) {
64
92
  return path.posix.isAbsolute(p) ? path.posix.normalize(p) : path.posix.normalize(path.posix.join(this.cwd, p));
@@ -77,18 +105,142 @@ export class RemoteLocalDockerExecutionEnv {
77
105
  return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted") };
78
106
  if (this.containerId)
79
107
  return ok(this.workspaceHandle());
108
+ return this.connectOnce(config, "start-or-attach");
109
+ }
110
+ async connectOnce(config, mode) {
80
111
  if (this.connecting)
81
112
  return this.connecting;
82
- this.connecting = this.doConnect(config);
113
+ this.connecting = this.doConnect(config, mode);
83
114
  const r = await this.connecting;
84
115
  if (!r.ok)
85
116
  this.connecting = undefined;
86
117
  return r;
87
118
  }
88
- async doConnect(config) {
89
- if (!this.cfg.image.trim()) {
119
+ async doConnect(config, mode) {
120
+ if (mode === "start-or-attach" && !this.cfg.image.trim()) {
90
121
  return { ok: false, error: new RemoteExecutionError("connect_failed", "local-docker: no base image configured (the image is required — no docker.io default)") };
91
122
  }
123
+ const owed = this.custody;
124
+ if (owed.kind === "doomed" && !(await this.removeInstance(owed.id)))
125
+ return this.stillOwed(owed.id);
126
+ let seen = await this.sightContainer(config?.abortSignal);
127
+ if (this.custody.kind === "doomed-unknown") {
128
+ switch (seen.kind) {
129
+ case "unreadable":
130
+ return { ok: false, error: seen.error };
131
+ case "ours":
132
+ if (!(await this.removeInstance(seen.id)))
133
+ return this.stillOwed(seen.id);
134
+ seen = { kind: "absent" };
135
+ break;
136
+ case "absent":
137
+ this.custody = NO_CUSTODY;
138
+ this.cfg.capacity?.removed(this.containerName);
139
+ break;
140
+ case "foreign":
141
+ this.custody = NO_CUSTODY;
142
+ break;
143
+ }
144
+ }
145
+ switch (seen.kind) {
146
+ case "unreadable":
147
+ return { ok: false, error: seen.error };
148
+ case "foreign":
149
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `a container named '${this.containerName}' exists on the docker daemon but this worker did not start it (it does not carry the label ${this.cfg.workerLabel}) — nothing was started or removed; remove or rename that container`) };
150
+ case "absent":
151
+ return mode === "attach-only" ? this.notResumable("gone") : this.startContainer(config);
152
+ case "ours":
153
+ switch (seen.state) {
154
+ case "running":
155
+ return this.attachContainer(seen.id, config?.abortSignal);
156
+ case "exited": {
157
+ const admitted = await this.admitStart(config);
158
+ if (!admitted.ok)
159
+ return admitted;
160
+ this.custody = { kind: "held", id: seen.id };
161
+ const started = await this.docker(["start", seen.id], { signal: config?.abortSignal, timeoutMs: this.cfg.controlTimeoutMs });
162
+ admitted.ticket?.settle(this.startOutcomeOf(started));
163
+ if (!started.ok)
164
+ return { ok: false, error: this.dockerToRemoteError(started.error, "connect_failed") };
165
+ if (started.value.exitCode !== 0)
166
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker is exited and docker start failed: ${started.value.stderr.trim() || `exit ${started.value.exitCode}`} — nothing was removed`) };
167
+ return this.attachContainer(seen.id, config?.abortSignal);
168
+ }
169
+ case "created": {
170
+ if (mode === "attach-only")
171
+ return this.notResumable("created, never started");
172
+ if (!(await this.removeInstance(seen.id))) {
173
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker was created but never started and could not be removed — nothing was started; remove it and retry`) };
174
+ }
175
+ return this.startContainer(config);
176
+ }
177
+ case "paused":
178
+ case "restarting":
179
+ case "removing":
180
+ case "dead":
181
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker is ${seen.state} — it was neither attached nor removed (its workspace may still be there); resolve it with docker and retry`) };
182
+ default: {
183
+ const unhandled = seen.state;
184
+ throw new Error(`local-docker: no ruling for container state ${String(unhandled)}`);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ stillOwed(id) {
190
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `container ${id.slice(0, 12)} of this worker ('${this.containerName}') is due for removal and docker rm could not confirm it — it is never attached; nothing was started; remove it and retry`) };
191
+ }
192
+ notResumable(why) {
193
+ return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' is not running (${why}) — no managed snapshot to resume`) };
194
+ }
195
+ async sightContainer(signal) {
196
+ const r = await this.docker(["inspect", "--type", "container", "--format", INSPECT_ID_STATE_AND_LABELS, this.containerName], { signal, timeoutMs: this.cfg.controlTimeoutMs });
197
+ if (!r.ok)
198
+ return { kind: "unreadable", error: this.dockerToRemoteError(r.error, "connect_failed") };
199
+ if (r.value.exitCode !== 0) {
200
+ return /no such (object|container)/i.test(r.value.stderr)
201
+ ? { kind: "absent" }
202
+ : { kind: "unreadable", error: new RemoteExecutionError("connect_failed", `docker inspect of '${this.containerName}' failed: ${r.value.stderr.trim() || `exit ${r.value.exitCode}`}`) };
203
+ }
204
+ const line = r.value.stdout.trim();
205
+ const [id = "", state = "", ...rest] = line.split("\t");
206
+ let labels;
207
+ try {
208
+ labels = rest.length === 1 ? JSON.parse(rest[0]) : undefined;
209
+ }
210
+ catch {
211
+ labels = undefined;
212
+ }
213
+ const known = DOCKER_STATES.find((s) => s === state);
214
+ if (!/^[0-9a-f]{12,64}$/.test(id) || known === undefined || labels === undefined || (labels !== null && typeof labels !== "object")) {
215
+ return { kind: "unreadable", error: new RemoteExecutionError("connect_failed", `docker inspect of '${this.containerName}' answered a form this adapter does not read (${JSON.stringify(line.slice(0, 160))}) — nothing was started or removed`) };
216
+ }
217
+ const ours = labels !== null && Object.entries(labels).some(([k, v]) => `${k}=${String(v)}` === this.cfg.workerLabel);
218
+ return ours ? { kind: "ours", id, state: known } : { kind: "foreign" };
219
+ }
220
+ async attachContainer(id, signal) {
221
+ this.custody = { kind: "held", id };
222
+ if (this.homeSeat.asks && !(await this.untilOrAborted(this.probeContainerShell(), signal))) {
223
+ return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted while detecting the container's shell") };
224
+ }
225
+ const home = await this.homeVerdict(signal);
226
+ if (home !== undefined)
227
+ return { ok: false, error: home };
228
+ await this.floor.attach(this.floorTransport(), { origin: "resumed", workspaceRoot: this.cfg.mountPath });
229
+ if (this.destroyed)
230
+ return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
231
+ const filled = await this.fillWorkspace("restored");
232
+ if (!filled.ok) {
233
+ if (filled.standing)
234
+ this.connectRefusal = filled.error;
235
+ return { ok: false, error: filled.error };
236
+ }
237
+ if (this.destroyed)
238
+ return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
239
+ this.containerId = id;
240
+ this.handle = { sandboxId: this.containerName, provider: PROVIDER, mountPath: this.cfg.mountPath, sessionToken: this.containerName };
241
+ return ok(this.handle);
242
+ }
243
+ async startContainer(config) {
92
244
  const pidsLimit = this.cfg.pidsLimit ?? 512;
93
245
  const runArgs = [
94
246
  "run",
@@ -96,6 +248,7 @@ export class RemoteLocalDockerExecutionEnv {
96
248
  "--init",
97
249
  "--name",
98
250
  this.containerName,
251
+ "--label", this.cfg.workerLabel,
99
252
  "-w",
100
253
  this.cfg.mountPath,
101
254
  "--security-opt",
@@ -110,48 +263,71 @@ export class RemoteLocalDockerExecutionEnv {
110
263
  "-c",
111
264
  `mkdir -p ${shellQuote(this.cfg.mountPath)} && exec tail -f /dev/null`,
112
265
  ];
266
+ const admitted = await this.admitStart(config);
267
+ if (!admitted.ok)
268
+ return admitted;
113
269
  const run = await this.docker(runArgs, { signal: config?.abortSignal, timeoutMs: this.cfg.controlTimeoutMs });
114
- if (!run.ok) {
115
- await this.forceRemove().catch(() => { });
116
- return { ok: false, error: this.dockerToRemoteError(run.error, "connect_failed") };
117
- }
118
- if (run.value.exitCode !== 0) {
119
- await this.forceRemove().catch(() => { });
120
- return { ok: false, error: new RemoteExecutionError("connect_failed", `docker run failed: ${run.value.stderr.trim() || `exit ${run.value.exitCode}`}`) };
270
+ const outcome = this.startOutcomeOf(run);
271
+ admitted.ticket?.settle(outcome);
272
+ const id = run.ok && run.value.exitCode === 0 ? run.value.stdout.trim() : "";
273
+ if (id === "") {
274
+ if (outcome !== "absent")
275
+ await this.claimLeftoverOfThisStart();
276
+ const error = !run.ok ? this.dockerToRemoteError(run.error, "connect_failed") : new RemoteExecutionError("connect_failed", `docker run failed: ${run.value.stderr.trim() || (run.value.exitCode === 0 ? "it printed no container id" : `exit ${run.value.exitCode}`)}`);
277
+ return { ok: false, error };
121
278
  }
279
+ this.custody = { kind: "held", id };
122
280
  if (this.destroyed) {
123
- await this.forceRemove().catch(() => { });
281
+ await this.removeInstance(id);
124
282
  return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
125
283
  }
126
284
  if (this.homeSeat.asks && !(await this.untilOrAborted(this.probeContainerShell(), config?.abortSignal))) {
127
- await this.forceRemove().catch(() => { });
285
+ await this.removeInstance(id);
128
286
  return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted while detecting the container's shell") };
129
287
  }
130
288
  const home = await this.homeVerdict(config?.abortSignal);
131
289
  if (home !== undefined) {
132
- await this.forceRemove().catch(() => { });
290
+ await this.removeInstance(id);
133
291
  return { ok: false, error: home };
134
292
  }
135
293
  await this.floor.attach(this.floorTransport(), { origin: "created", workspaceRoot: this.cfg.mountPath });
136
294
  if (this.destroyed) {
137
- await this.forceRemove().catch(() => { });
295
+ await this.removeInstance(id);
138
296
  return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
139
297
  }
140
- const filled = await this.fillWorkspace();
298
+ const filled = await this.fillWorkspace("minted");
141
299
  if (!filled.ok || this.destroyed) {
142
- await this.forceRemove().catch(() => { });
300
+ await this.removeInstance(id);
143
301
  if (!filled.ok && filled.standing)
144
302
  this.connectRefusal = filled.error;
145
303
  return { ok: false, error: filled.ok ? new RemoteExecutionError("connect_failed", "execution env destroyed during connect") : filled.error };
146
304
  }
147
- this.containerId = run.value.stdout.trim() || this.containerName;
305
+ this.containerId = id;
148
306
  this.handle = { sandboxId: this.containerName, provider: PROVIDER, mountPath: this.cfg.mountPath, sessionToken: this.containerName };
149
307
  if (config?.secrets?.length) {
150
308
  }
151
309
  return ok(this.handle);
152
310
  }
153
- fillWorkspace() {
154
- return this.cfg.workspaceFill === undefined ? Promise.resolve({ ok: true }) : this.cfg.workspaceFill.fill(this.fillChannel(), this.cfg.mountPath, "minted");
311
+ async admitStart(config) {
312
+ const capacity = this.cfg.capacity;
313
+ if (capacity === undefined)
314
+ return { ok: true };
315
+ this.capacityDeadline ??= Date.now() + this.cfg.controlTimeoutMs;
316
+ const signal = config?.abortSignal ? AbortSignal.any([config.abortSignal, this.lifecycle.signal]) : this.lifecycle.signal;
317
+ const admitted = await capacity.admit({ name: this.containerName, read: (budgetMs, readSignal) => this.readLaneRegistry(budgetMs, readSignal), deadline: this.capacityDeadline, readBoundMs: this.cfg.controlTimeoutMs, signal });
318
+ if (!admitted.ok)
319
+ return { ok: false, error: new RemoteExecutionError(admitted.refusal.verdict === "aborted" ? "aborted" : "connect_failed", admitted.refusal.message) };
320
+ return { ok: true, ticket: admitted.ticket };
321
+ }
322
+ startOutcomeOf(r) {
323
+ if (!r.ok)
324
+ return r.error.code === "spawn_error" ? "absent" : "unknown";
325
+ if (r.value.exitCode === 0)
326
+ return "present";
327
+ return isNameConflict(r.value.stderr, this.containerName) ? "absent" : "unknown";
328
+ }
329
+ fillWorkspace(origin) {
330
+ return this.cfg.workspaceFill === undefined ? Promise.resolve({ ok: true }) : this.cfg.workspaceFill.fill(this.fillChannel(), this.cfg.mountPath, origin);
155
331
  }
156
332
  fillChannel() {
157
333
  const run = async (command, input) => {
@@ -201,47 +377,100 @@ export class RemoteLocalDockerExecutionEnv {
201
377
  if (sessionToken && sessionToken !== this.containerName) {
202
378
  return { ok: false, error: new RemoteExecutionError("connect_failed", `reconnect token '${String(sessionToken)}' does not match this env's container '${this.containerName}'`) };
203
379
  }
204
- if (this.connecting !== undefined && this.containerId === undefined) {
205
- const joined = await this.connecting;
206
- if (!joined.ok || this.containerId !== undefined)
207
- return joined;
208
- }
209
- const insp = await this.docker(["inspect", "-f", "{{.State.Running}}", this.containerName], { timeoutMs: this.cfg.controlTimeoutMs });
210
- if (insp.ok && insp.value.exitCode === 0 && insp.value.stdout.trim() === "true") {
211
- if (this.containerId === undefined && this.homeSeat.asks)
212
- await this.probeContainerShell();
213
- const home = this.containerId === undefined ? await this.homeVerdict() : undefined;
214
- if (home !== undefined)
215
- return { ok: false, error: home };
216
- if (this.destroyed || this.connectRefusal)
217
- return { ok: false, error: this.connectRefusal ?? new RemoteExecutionError("connect_failed", "execution env destroyed during reconnect") };
218
- this.containerId = this.containerName;
219
- this.handle ??= { sandboxId: this.containerName, provider: PROVIDER, mountPath: this.cfg.mountPath, sessionToken: this.containerName };
220
- return ok(this.handle);
221
- }
222
- return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' is not running (gone or stopped) — no managed snapshot to resume`) };
223
- }
224
- async destroy() {
225
- if (this.destroyed)
226
- return;
227
- this.destroyed = true;
228
- const inflight = this.connecting;
229
- this.connecting = undefined;
230
- this.containerId = undefined;
231
- await inflight?.catch(() => { });
232
- this.floor.dispose();
233
- await this.forceRemove().catch(() => { });
380
+ if (this.containerId === undefined)
381
+ return this.connectOnce(undefined, "attach-only");
382
+ const seen = await this.sightContainer(undefined);
383
+ if (seen.kind === "ours" && seen.state === "running" && seen.id === this.containerId)
384
+ return ok(this.workspaceHandle());
385
+ if (seen.kind === "unreadable")
386
+ return { ok: false, error: seen.error };
387
+ return this.notResumable(seen.kind === "absent" ? "gone" : seen.kind === "foreign" ? "the name now holds a container this worker did not start" : seen.id !== this.containerId ? "the name now holds another container" : seen.state);
388
+ }
389
+ destroy() {
390
+ this.teardown ??= (async () => {
391
+ this.destroyed = true;
392
+ this.lifecycle.abort();
393
+ const inflight = this.connecting;
394
+ this.connecting = undefined;
395
+ this.containerId = undefined;
396
+ await inflight?.catch(() => { });
397
+ this.floor.dispose();
398
+ const owed = this.custody;
399
+ switch (owed.kind) {
400
+ case "held":
401
+ case "doomed":
402
+ await this.removeInstance(owed.id);
403
+ break;
404
+ case "doomed-unknown":
405
+ await this.claimLeftoverOfThisStart();
406
+ break;
407
+ case "none":
408
+ break;
409
+ }
410
+ })().finally(() => {
411
+ this.teardownSettled = true;
412
+ });
413
+ return this.teardown;
234
414
  }
235
415
  async cleanup() {
236
416
  return this.destroy();
237
417
  }
238
- async forceRemove() {
239
- await this.docker(["rm", "-f", this.containerName], { timeoutMs: this.cfg.controlTimeoutMs }).catch(() => { });
418
+ async reapWorkspace() {
419
+ if (this.custody.kind === "none")
420
+ this.custody = { kind: "doomed-unknown" };
421
+ await this.destroy();
422
+ return this.leftover !== undefined ? "owed" : this.removedAny ? "removed" : "nothing";
423
+ }
424
+ async removeInstance(id) {
425
+ this.custody = { kind: "doomed", id };
426
+ const r = await this.docker(["rm", "-f", id], { timeoutMs: this.cfg.controlTimeoutMs }).catch(() => undefined);
427
+ const removed = r?.ok === true && (r.value.exitCode === 0 || /no such container/i.test(r.value.stderr));
428
+ if (r?.ok === true && r.value.exitCode === 0)
429
+ this.removedAny = true;
430
+ if (removed) {
431
+ this.cfg.capacity?.removed(this.containerName);
432
+ if (this.custody.kind === "doomed" && this.custody.id === id)
433
+ this.custody = NO_CUSTODY;
434
+ }
435
+ return removed;
436
+ }
437
+ async claimLeftoverOfThisStart() {
438
+ const seen = await this.sightContainer(undefined);
439
+ switch (seen.kind) {
440
+ case "ours":
441
+ await this.removeInstance(seen.id);
442
+ return;
443
+ case "absent":
444
+ this.custody = NO_CUSTODY;
445
+ this.cfg.capacity?.removed(this.containerName);
446
+ return;
447
+ case "foreign":
448
+ this.custody = NO_CUSTODY;
449
+ return;
450
+ case "unreadable":
451
+ this.custody = { kind: "doomed-unknown" };
452
+ return;
453
+ }
454
+ }
455
+ async readLaneRegistry(budgetMs, signal) {
456
+ const r = await this.docker(["ps", "-a", "--filter", `label=${this.cfg.workerLabel}`, "--format", "{{.Names}}\t{{.State}}"], { timeoutMs: Math.max(1, budgetMs), ...(signal !== undefined ? { signal } : {}) });
457
+ if (!r.ok)
458
+ return { ok: false, reason: r.error.message };
459
+ if (r.value.exitCode !== 0)
460
+ return { ok: false, reason: r.value.stderr.trim() || `exit ${r.value.exitCode}` };
461
+ const rows = r.value.stdout
462
+ .split("\n")
463
+ .filter((line) => line.trim().length > 0)
464
+ .map((line) => {
465
+ const [name = "", state = ""] = line.split("\t");
466
+ return { name: name.trim(), state: state.trim().toLowerCase() };
467
+ });
468
+ return { ok: true, rows };
240
469
  }
241
470
  async exec(command, options) {
242
471
  if (options?.abortSignal?.aborted)
243
472
  return { ok: false, error: new ExecutionError("aborted", "exec aborted before start") };
244
- const ready = await this.ensureConnectedExec();
473
+ const ready = await this.ensureConnectedExec(options?.abortSignal);
245
474
  if (!ready.ok)
246
475
  return ready;
247
476
  const execArgs = this.startArgv(engineStart(options?.readFloor), command, { cwd: options?.cwd, env: options?.env });
@@ -258,9 +487,9 @@ export class RemoteLocalDockerExecutionEnv {
258
487
  return ok({ stdout: r.value.stdout, stderr: r.value.stderr, exitCode: r.value.exitCode });
259
488
  }
260
489
  async *execStream(command, options) {
261
- const ready = await this.ensureConnectedExec();
490
+ const ready = await this.ensureConnectedExec(options?.signal);
262
491
  if (!ready.ok)
263
- throw new RemoteExecutionError("connect_failed", ready.error.message, ready.error);
492
+ throw new RemoteExecutionError(ready.error.code === "aborted" ? "aborted" : "connect_failed", ready.error.message, ready.error);
264
493
  const execArgs = this.startArgv(engineStart(undefined), command, { cwd: options?.cwd, env: options?.env });
265
494
  if (!execArgs.ok)
266
495
  throw new RemoteExecutionError("unsupported", execArgs.error.message, execArgs.error);
@@ -392,7 +621,7 @@ export class RemoteLocalDockerExecutionEnv {
392
621
  return ok(path.posix.join(...parts));
393
622
  }
394
623
  async readBinaryFile(p, abortSignal) {
395
- const ready = await this.fsReady(p);
624
+ const ready = await this.fsReady(p, abortSignal);
396
625
  if (!ready.ok)
397
626
  return ready;
398
627
  const abs = this.resolve(p);
@@ -423,13 +652,13 @@ export class RemoteLocalDockerExecutionEnv {
423
652
  return { prepare: readyUpload((dest, signal) => this.pipeIn(content, dest, signal)), run: (cmd, signal) => this.fsExec(cmd, signal), provider: PROVIDER, logger: this.cfg.logger };
424
653
  }
425
654
  async writeFile(p, content, abortSignal) {
426
- const ready = await this.fsReady(p);
655
+ const ready = await this.fsReady(p, abortSignal);
427
656
  if (!ready.ok)
428
657
  return ready;
429
658
  return writeFileStaged(this.stagedLane(content), this.resolve(p), abortSignal);
430
659
  }
431
660
  async appendFile(p, content, abortSignal) {
432
- const ready = await this.fsReady(p);
661
+ const ready = await this.fsReady(p, abortSignal);
433
662
  if (!ready.ok)
434
663
  return ready;
435
664
  const abs = this.resolve(p);
@@ -455,7 +684,9 @@ export class RemoteLocalDockerExecutionEnv {
455
684
  if (this.destroyed)
456
685
  return { ok: false, error: new ExecutionError("shell_unavailable", "execution env already destroyed") };
457
686
  if (!this.containerId) {
458
- const c = await this.connect();
687
+ const c = await this.joinConnect(abortSignal);
688
+ if (!c.ok && c.error.code === "aborted" && abortSignal?.aborted)
689
+ return { ok: false, error: new ExecutionError("aborted", "exec aborted before start (file operation; the container was still connecting)", c.error) };
459
690
  if (!c.ok)
460
691
  return { ok: false, error: new ExecutionError("shell_unavailable", `local-docker connect failed: ${c.error.message}`, c.error) };
461
692
  }
@@ -512,7 +743,9 @@ export class RemoteLocalDockerExecutionEnv {
512
743
  for (const [k, v] of Object.entries(mergedEnv))
513
744
  args.push("-e", `${k}=${v}`);
514
745
  }
515
- args.push(this.containerName, ...floorArgv(launch.value, [o.shell ?? this.containerShell, "-c", command]));
746
+ if (this.instance === undefined)
747
+ return { ok: false, error: new ExecutionError("shell_unavailable", "no container instance is held by this execution env") };
748
+ args.push(this.instance, ...floorArgv(launch.value, [o.shell ?? this.containerShell, "-c", command]));
516
749
  return ok(args);
517
750
  }
518
751
  floorTransport() {
@@ -538,7 +771,12 @@ export class RemoteLocalDockerExecutionEnv {
538
771
  return r.value.exitCode === 0 ? { ok: true } : { ok: false, error: r.value.stderr.trim() || `exit ${r.value.exitCode}` };
539
772
  },
540
773
  openRelay: (identity, command, events) => {
541
- const args = ["exec", "-i", ...dockerIdentityFlags({ mode: "control", identity }), this.containerName, "/bin/sh", "-c", command];
774
+ const instance = this.instance;
775
+ if (instance === undefined) {
776
+ queueMicrotask(() => events.closed("no container instance is held by this execution env"));
777
+ return { send: () => { }, close: () => { } };
778
+ }
779
+ const args = ["exec", "-i", ...dockerIdentityFlags({ mode: "control", identity }), instance, "/bin/sh", "-c", command];
542
780
  const child = this.spawnFn(this.cfg.dockerPath, this.withHostFlag(args), { stdio: ["pipe", "pipe", "pipe"], env: this.cliEnv() });
543
781
  let closed = false;
544
782
  const close = (why) => {
@@ -567,7 +805,14 @@ export class RemoteLocalDockerExecutionEnv {
567
805
  return new Promise((resolve) => {
568
806
  let settled = false;
569
807
  let forceSettleTimer;
570
- const child = this.spawnFn(this.cfg.dockerPath, this.withHostFlag(args), { stdio: [opts?.input !== undefined ? "pipe" : "ignore", "pipe", "pipe"], env: this.cliEnv() });
808
+ let child;
809
+ try {
810
+ child = this.spawnFn(this.cfg.dockerPath, this.withHostFlag(args), { stdio: [opts?.input !== undefined ? "pipe" : "ignore", "pipe", "pipe"], env: this.cliEnv() });
811
+ }
812
+ catch (e) {
813
+ resolve({ ok: false, error: new ExecutionError("spawn_error", `docker spawn failed (is '${this.cfg.dockerPath}' installed?): ${errMsg(e)}`, e instanceof Error ? e : undefined) });
814
+ return;
815
+ }
571
816
  const killGrace = () => {
572
817
  try {
573
818
  child.kill("SIGKILL");
@@ -635,6 +880,21 @@ export class RemoteLocalDockerExecutionEnv {
635
880
  });
636
881
  });
637
882
  }
883
+ joinConnect(signal) {
884
+ const shared = this.connect();
885
+ if (signal === undefined)
886
+ return shared;
887
+ if (signal.aborted)
888
+ return Promise.resolve({ ok: false, error: new RemoteExecutionError("aborted", "aborted while connecting") });
889
+ return new Promise((resolve) => {
890
+ const onAbort = () => resolve({ ok: false, error: new RemoteExecutionError("aborted", "aborted while connecting") });
891
+ signal.addEventListener("abort", onAbort, { once: true });
892
+ void shared.then((r) => {
893
+ signal.removeEventListener("abort", onAbort);
894
+ resolve(r);
895
+ });
896
+ });
897
+ }
638
898
  containerShell = "/bin/sh";
639
899
  containerShellReady;
640
900
  async untilOrAborted(shared, signal) {
@@ -668,25 +928,27 @@ export class RemoteLocalDockerExecutionEnv {
668
928
  catch {
669
929
  }
670
930
  }
671
- async ensureConnectedExec() {
931
+ async ensureConnectedExec(signal) {
672
932
  if (this.destroyed)
673
933
  return { ok: false, error: new ExecutionError("shell_unavailable", "execution env already destroyed") };
674
934
  if (this.containerId) {
675
935
  await this.probeContainerShell();
676
936
  return ok(undefined);
677
937
  }
678
- const c = await this.connect();
938
+ const c = await this.joinConnect(signal);
939
+ if (!c.ok && c.error.code === "aborted" && signal?.aborted)
940
+ return { ok: false, error: new ExecutionError("aborted", "exec aborted before start (the container was still connecting)", c.error) };
679
941
  if (!c.ok)
680
942
  return { ok: false, error: new ExecutionError("shell_unavailable", `local-docker connect failed: ${c.error.message}`, c.error) };
681
943
  await this.probeContainerShell();
682
944
  return ok(undefined);
683
945
  }
684
- async fsReady(p) {
946
+ async fsReady(p, signal) {
685
947
  if (this.destroyed)
686
948
  return { ok: false, error: new FileError("unknown", "execution env already destroyed", this.resolve(p)) };
687
949
  if (this.containerId)
688
950
  return ok(undefined);
689
- const c = await this.connect();
951
+ const c = await this.joinConnect(signal);
690
952
  if (!c.ok)
691
953
  return { ok: false, error: fileErrorFromExec(c.error, this.resolve(p)) };
692
954
  return ok(undefined);
@@ -702,14 +964,32 @@ export class RemoteLocalDockerExecutionEnv {
702
964
  function sanitizeId(id) {
703
965
  return id.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 48) || "task";
704
966
  }
967
+ export function localDockerContainerNameOf(workerLabel, identity) {
968
+ const digest = createHash("sha256").update(workerLabel).update("\0").update(identity).digest("hex").slice(0, 12);
969
+ return `sema-docker-${sanitizeId(identity)}-${digest}`;
970
+ }
971
+ export function localDockerIdentityOfName(workerLabel, name) {
972
+ const m = /^sema-docker-(.+)-[0-9a-f]{12}$/.exec(name);
973
+ const candidate = m?.[1];
974
+ return candidate !== undefined && localDockerContainerNameOf(workerLabel, candidate) === name ? candidate : undefined;
975
+ }
705
976
  function errMsg(e) {
706
977
  return e instanceof Error ? e.message : String(e);
707
978
  }
708
979
  export function localDockerExecutionEnvFactory(config, deps = {}) {
709
980
  const { workspaceFillOf, ...base } = config;
710
- return (ctx) => {
711
- const workspaceFill = workspaceFillOf?.(ctx);
712
- return new RemoteLocalDockerExecutionEnv({ ...base, id: base.id ?? ctx.taskId ?? ctx.sessionId, ...(workspaceFill !== undefined ? { workspaceFill } : {}) }, deps);
981
+ const custody = createWorkspaceCustody();
982
+ const envOf = (identity, ctx) => custody.envOf(identity, (leftover) => {
983
+ const workspaceFill = ctx !== undefined ? workspaceFillOf?.(ctx) : undefined;
984
+ return new RemoteLocalDockerExecutionEnv({ ...base, id: identity, ...(workspaceFill !== undefined ? { workspaceFill } : {}), ...(leftover !== undefined ? { leftover } : {}) }, deps);
985
+ });
986
+ let lister;
987
+ const reapPort = {
988
+ label: base.workerLabel,
989
+ list: () => (lister ??= new RemoteLocalDockerExecutionEnv({ ...base, id: "reaper-lister" }, deps)).readLaneRegistry(base.controlTimeoutMs ?? DEFAULT_CONTROL_TIMEOUT_MS, undefined),
990
+ identityOf: (name) => localDockerIdentityOfName(base.workerLabel, name),
991
+ settle: async (identity) => (await envOf(identity, undefined)).reapWorkspace(),
713
992
  };
993
+ return Object.assign((ctx) => envOf(ctx.taskId ?? ctx.sessionId, ctx), { reapPort });
714
994
  }
715
995
  //# sourceMappingURL=remote-env-local-docker.js.map
@@ -6,8 +6,11 @@ export function remoteScratchpadDirFor(sessionId) {
6
6
  return `/tmp/scratchpad/${sessionId}`;
7
7
  }
8
8
  export function withRemoteScratchpad(factory, logger) {
9
+ const decorated = new WeakSet();
9
10
  return async (ctx) => {
10
11
  const env = await factory(ctx);
12
+ if (decorated.has(env))
13
+ return env;
11
14
  const dir = remoteScratchpadDirFor(ctx.sessionId);
12
15
  if (dir === undefined) {
13
16
  if (ctx.sessionId)
@@ -17,6 +20,7 @@ export function withRemoteScratchpad(factory, logger) {
17
20
  const e = env;
18
21
  if (typeof e.exec !== "function")
19
22
  return env;
23
+ decorated.add(env);
20
24
  const origExec = e.exec.bind(e);
21
25
  let ensured;
22
26
  const ensure = () => (ensured ??= (async () => {