@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
@@ -3,18 +3,20 @@ import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, POLICY
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
4
  import { uuidv7, classifyAsk, foldArbitrationRow, policyCannotAnswer, screenAskClassMembers, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
5
5
  import { precheckCardRuleText } from "./rules-consent.js";
6
- import { cardTakesWholeToolConsent } from "./permission-rule-vocab.js";
6
+ import { CARD_RULE_FORM_OF_MATCH, cardRuleFormOf } from "./permission-rule-vocab.js";
7
7
  import { redactDeep, redactSecrets, redactSecretsWithArms } from "./trace/redact.js";
8
8
  import { seatText } from "./trace/exit-seat.js";
9
9
  import { hasBidiControls } from "./text-bidi.js";
10
10
  import { approvalPayloadFingerprint } from "./plugins/approval-payload-fingerprint.js";
11
11
  import { createLogger } from "./observability/logger.js";
12
12
  import { errorKindOf } from "./observability/err-text.js";
13
+ import { createHitlOpenRace, deliverHitlNotice } from "./hitl-delivery.js";
13
14
  import { recordFailOpen } from "./observability/fail-open.js";
14
15
  import { ownerOfCheckpointScope } from "./security.js";
16
+ import { keyAdmits, ownerCellOf, recoveredSubject } from "./owner-faces.js";
15
17
  import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt, readBoundInputHash } from "./approval-ask-machine.js";
16
18
  import { askDemandsAPerson, storedPersonDemandRecord, currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, adoptStoredLiveFacts, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readAskReasons, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
17
- import { askOwnerAdmits, askRowCarriesOwner, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
19
+ import { askRowCarriesOwner, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
18
20
  import { APPROVAL_ENDING_CAUSES, SETTLE_OUTCOME, askRowEndingCause, askRowParkTrigger } from "./approval-deny-reasons.js";
19
21
  import { settleByPolicy } from "./approval-policy-settlement.js";
20
22
  import { governanceAskMarksFor, runWithGovernanceAskScope } from "./governance-ask-marks.js";
@@ -35,7 +37,7 @@ const ADOPT_OPEN_ASKS_MAX = 1_000;
35
37
  const EDITED_DECISION_MARK_CAP_MS = 10_000;
36
38
  const DEFAULT_WINDOW_MARGIN_MS = 10_000;
37
39
  const SHUTDOWN_DRAIN_POLL_MS = 50;
38
- const MAX_ALLOW_SESSIONS = 4096;
40
+ export const MAX_ALLOW_SESSIONS = 4096;
39
41
  const DEFAULT_ADMIT_MAX_PER_TASK = 32;
40
42
  const DEFAULT_ADMIT_MAX_PER_OWNER = 256;
41
43
  const DEFAULT_PARK_REDEMPTION_MAX = 2000;
@@ -46,8 +48,10 @@ const PARKING_RETRY_AFTER_MS = 250;
46
48
  export function approvalDecidePath(sessionId) {
47
49
  return `/v1/approvals/${encodeURIComponent(sessionId)}/decide`;
48
50
  }
49
- function parkSessionOf(row) {
50
- return row.sourceSessionId === row.sessionId && row.sessionId !== row.taskId ? row.sessionId : undefined;
51
+ export function parkSessionOf(row) {
52
+ if (row.state === "PARKED")
53
+ return row.sourceSessionId;
54
+ return row.sourceSessionId !== row.taskId ? row.sourceSessionId : undefined;
51
55
  }
52
56
  function ruleMaterialCarriesCredentialShape(command) {
53
57
  return redactSecretsWithArms(command, { observe: false }).arms.has("full");
@@ -111,8 +115,10 @@ const FS_WRITE_TOOLS = pathConfinableWriteToolNames();
111
115
  function sessionAllowCategory(toolName) {
112
116
  return FS_WRITE_TOOLS.has(toolName) ? "fs-write" : `tool:${toolName}`;
113
117
  }
114
- function sessionAllowKey(owner, sessionId, category, binding) {
115
- return JSON.stringify([owner, sessionId, category, binding.kind === "bound" ? binding.digest : null]);
118
+ function sessionAllowKey(owner, sessionId, incarnation, category, binding) {
119
+ if (!sessionId || !incarnation)
120
+ return undefined;
121
+ return JSON.stringify([owner, sessionId, incarnation, category, binding.kind === "bound" ? binding.digest : null]);
116
122
  }
117
123
  function askStandingAnswerFacts(req, governanceForced, deploymentListAsks) {
118
124
  const classes = screenAskClassMembers(req.askClass, req.classes)?.classes;
@@ -223,11 +229,14 @@ function mandatedFromSeat(seat) {
223
229
  return false;
224
230
  }
225
231
  }
226
- function rowOrUnknown(read) {
227
- return read.kind === "row" ? read.row : null;
228
- }
229
232
  function askRowVisibleTo(row, principal) {
230
- return row !== null && askOwnerAdmits(row.owner, principal);
233
+ return row !== null && askOwnerAdmitsAnswer(row.owner, principal);
234
+ }
235
+ function askOwnerAdmitsAnswer(owner, principal) {
236
+ return keyAdmits("ask.answer", { subject: recoveredSubject(principal), operator: false }, ownerCellOf(owner));
237
+ }
238
+ function receiptAnswersNow(redeemedGeneration, openGenerationNow) {
239
+ return redeemedGeneration === undefined || openGenerationNow === undefined || openGenerationNow <= redeemedGeneration;
231
240
  }
232
241
  function waitingLegsReached(entry, othersReached) {
233
242
  return (entry.adopted === true ? 0 : 1) + othersReached;
@@ -257,8 +266,10 @@ function livePendingRowOf(e) {
257
266
  ...(e.adopted === true ? { consumerState: ASK_DECISION_CONSUMER_ABSENT } : {}),
258
267
  };
259
268
  }
269
+ const _legFamiliesAreFrameFamilies = true;
270
+ void _legFamiliesAreFrameFamilies;
260
271
  function canPresentWithoutDurableRow(c) {
261
- return c.emitCard === undefined;
272
+ return c.family === "tool_approval";
262
273
  }
263
274
  export const PERSIST_RULE_TEXT_ERROR = `persistRule.rule must be a non-empty string of at most ${MAX_RULE_TEXT_CHARS} characters`;
264
275
  export const PERSIST_RULE_EDITED_FLAG_ERROR = "persistRule.edited must be a boolean when present";
@@ -435,49 +446,6 @@ export function declaredApprovalFrameFamilies(settings) {
435
446
  const raw = Reflect.get(settings, "approvalFrameFamilies");
436
447
  return new Set(Array.isArray(raw) ? raw.filter((w) => APPROVAL_FRAME_FAMILIES.includes(w)) : []);
437
448
  }
438
- export function createApprovalCardEmitter(sinks) {
439
- const present = [sinks.appendDurable, sinks.writeLive].filter((w) => w !== undefined);
440
- const attempt = (write, frame) => (async () => {
441
- try {
442
- await write(frame);
443
- return true;
444
- }
445
- catch (err) {
446
- defaultLogger.warn("approval_card_sink_write_failed", { frame: frame.type, approvalId: frame.approvalId, errKind: errorKindOf(err) });
447
- return false;
448
- }
449
- })();
450
- const opened = new Map();
451
- return async (frame, registration) => {
452
- if (frame.type === "approval_request") {
453
- const results = present.map((write) => attempt(write, frame));
454
- opened.set(registration, results);
455
- const accepted = await new Promise((resolve) => {
456
- let pending = results.length;
457
- if (pending === 0)
458
- resolve(false);
459
- for (const r of results) {
460
- void r.then((ok) => {
461
- if (ok)
462
- resolve(true);
463
- else if (--pending === 0)
464
- resolve(false);
465
- });
466
- }
467
- });
468
- if (!accepted) {
469
- opened.delete(registration);
470
- throw new Error("approval card undeliverable — no sink accepted the frame (live stream closed and/or the durable append failed)");
471
- }
472
- return;
473
- }
474
- const results = opened.get(registration);
475
- opened.delete(registration);
476
- if (results === undefined)
477
- return;
478
- await Promise.all(present.map((write, i) => results[i].then((ok) => (ok ? attempt(write, frame) : false))));
479
- };
480
- }
481
449
  export function resolveApprovalLeg(input) {
482
450
  const active = input.streamApprovalOn;
483
451
  const tightDeadline = active && input.legWalltimeMs !== undefined && input.legWalltimeMs - input.windowMarginMs <= 0;
@@ -767,14 +735,14 @@ export class ToolApprovalCoordinator {
767
735
  }
768
736
  });
769
737
  }
770
- static ruleOfferDerivedFactsAgree(offer) {
738
+ static ruleOfferDerivedFactsAgree(offer, cardTool) {
771
739
  const derive = (rule) => {
772
740
  const p = parseRuleText(rule, "allow");
773
741
  return "rule" in p ? p.rule : undefined;
774
742
  };
775
743
  if (offer.kind === "single") {
776
744
  const d = derive(offer.rule);
777
- return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.singleOfferToolAgrees(d.match, d.tool);
745
+ return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.singleOfferBelongsOnCard(d.match, d.tool, cardTool);
778
746
  }
779
747
  return offer.rules.every((m) => {
780
748
  const d = derive(m.rule);
@@ -790,40 +758,21 @@ export class ToolApprovalCoordinator {
790
758
  }
791
759
  });
792
760
  }
793
- static singleOfferToolAgrees(match, tool) {
794
- switch (match) {
795
- case "exact":
796
- case "prefix":
797
- case "wildcard":
798
- case "pattern":
799
- return tool === "Bash";
800
- case "tool":
801
- return cardTakesWholeToolConsent(tool);
802
- case "subpath":
803
- case "path":
804
- case "name":
805
- case "name_prefix":
806
- case "host":
807
- case "subdomain":
808
- return false;
809
- default: {
810
- const unknown = match;
811
- void unknown;
812
- return false;
813
- }
814
- }
761
+ static singleOfferBelongsOnCard(match, ruleTool, cardTool) {
762
+ const form = CARD_RULE_FORM_OF_MATCH[match];
763
+ return ruleTool === cardTool && form !== undefined && form === cardRuleFormOf(cardTool);
815
764
  }
816
- static boundRuleOfferTexts(offers) {
765
+ static boundRuleOfferTexts(offers, cardTool) {
817
766
  const over = (s) => s.length > MAX_RULE_TEXT_CHARS;
818
767
  const clipSegment = (s) => (over(s) ? s.slice(0, MAX_RULE_TEXT_CHARS) : s);
819
768
  const out = [];
820
769
  for (const { offer } of readRuleOfferList(offers)) {
821
770
  if (ToolApprovalCoordinator.ruleOfferTextsOverSize(offer))
822
771
  return undefined;
823
- if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer)) {
772
+ if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer, cardTool)) {
824
773
  defaultLogger.warn("rule_offer_dropped_derived_facts_disagree", {
825
774
  kind: offer.kind,
826
- note: "an offer's kind/match/command/directory seats do not agree with what the shared validator derives from its rule text — dropped whole so the card never shows one grant while redeeming another (core/dist skew or forged material?)",
775
+ note: "an offer's kind/match/command/directory seats do not agree with what the shared validator derives from its rule text, or it is not this card's tool / card form — dropped whole so the card never shows one grant while redeeming another (core/dist skew or forged material?)",
827
776
  });
828
777
  continue;
829
778
  }
@@ -860,11 +809,9 @@ export class ToolApprovalCoordinator {
860
809
  return out;
861
810
  }
862
811
  static cardBindingOf(args, offers) {
863
- const isWholeTool = (o) => o.kind === "single" && o.match === "tool";
864
- if (offers.length > 0 && offers.every(isWholeTool))
865
- return "";
866
- if (offers.some(isWholeTool))
867
- return undefined;
812
+ const valueOffers = offers.filter((o) => o.kind === "single" && CARD_RULE_FORM_OF_MATCH[o.match] !== "command");
813
+ if (valueOffers.length > 0)
814
+ return valueOffers.length === 1 && offers.length === 1 ? valueOffers[0].command : undefined;
868
815
  if (args === null || typeof args !== "object" || Array.isArray(args))
869
816
  return undefined;
870
817
  const command = args.command;
@@ -881,7 +828,7 @@ export class ToolApprovalCoordinator {
881
828
  if (!Array.isArray(rawOffers) || rawOffers.length === 0)
882
829
  return undefined;
883
830
  const capped = rawOffers.length > MAX_RULE_OFFERS ? rawOffers.slice(0, MAX_RULE_OFFERS) : rawOffers;
884
- const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped);
831
+ const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped, req.toolName);
885
832
  if (offers === undefined)
886
833
  return undefined;
887
834
  const command = ToolApprovalCoordinator.cardBindingOf(req.args, offers);
@@ -1012,7 +959,8 @@ export class ToolApprovalCoordinator {
1012
959
  const sessionId = origin.sessionId;
1013
960
  if (!sessionId)
1014
961
  return false;
1015
- const live = this.allowAllSessions.has(sessionAllowKey(origin.owner, sessionId, sessionAllowCategory(req.toolName), facts.grantBinding));
962
+ const liveKey = sessionAllowKey(origin.owner, sessionId, origin.incarnation, sessionAllowCategory(req.toolName), facts.grantBinding);
963
+ const live = liveKey !== undefined && this.allowAllSessions.has(liveKey);
1016
964
  const durable = !live && facts.grantBinding.kind === "none" && (await this.durableGrantHas(sessionId, req.toolName));
1017
965
  if (!live && !durable)
1018
966
  return false;
@@ -1036,7 +984,14 @@ export class ToolApprovalCoordinator {
1036
984
  }
1037
985
  boundUnattendedAsk = (identity, why) => {
1038
986
  return async (req) => {
1039
- const origin = { owner: identity.owner, taskId: identity.taskId, ...(identity.sessionId !== undefined ? { sessionId: identity.sessionId } : {}), legKey: "", executionLane: identity.executionLane };
987
+ const origin = {
988
+ owner: identity.owner,
989
+ taskId: identity.taskId,
990
+ ...(identity.sessionId !== undefined ? { sessionId: identity.sessionId } : {}),
991
+ legKey: "",
992
+ executionLane: identity.executionLane,
993
+ ...(identity.incarnation !== undefined ? { incarnation: identity.incarnation } : {}),
994
+ };
1040
995
  if (await this.standingGrantSettles(origin, req, this.governanceForcedOf(origin, req)))
1041
996
  return true;
1042
997
  return this.unattendedAskOutcome({ ...why, taskId: identity.taskId, owner: identity.owner, toolName: req.toolName });
@@ -1224,15 +1179,9 @@ export class ToolApprovalCoordinator {
1224
1179
  emitRevokeTo(ctxs, frame) {
1225
1180
  if (frame.askIds.length === 0)
1226
1181
  return;
1227
- for (const c of ctxs) {
1228
- if (!c.emitRevoke)
1229
- continue;
1230
- try {
1231
- void Promise.resolve(c.emitRevoke(frame)).catch(() => undefined);
1232
- }
1233
- catch {
1234
- }
1235
- }
1182
+ for (const c of ctxs)
1183
+ if (c.family === "approval_request")
1184
+ void deliverHitlNotice(c.transport, frame);
1236
1185
  }
1237
1186
  emitRevoke(frame, target) {
1238
1187
  const targets = new Set();
@@ -1288,6 +1237,7 @@ export class ToolApprovalCoordinator {
1288
1237
  ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
1289
1238
  legKey: ctx.legKey ?? "",
1290
1239
  executionLane: ctx.executionLane,
1240
+ ...(ctx.incarnation !== undefined ? { incarnation: ctx.incarnation } : {}),
1291
1241
  ...(ctx.legDeadlineMonotonic !== undefined ? { legDeadlineMonotonic: ctx.legDeadlineMonotonic } : {}),
1292
1242
  }, [ctx], req, signal);
1293
1243
  };
@@ -1301,6 +1251,7 @@ export class ToolApprovalCoordinator {
1301
1251
  ...(identity.sessionId !== undefined ? { sessionId: identity.sessionId } : {}),
1302
1252
  legKey: identity.legKey ?? "",
1303
1253
  executionLane: identity.executionLane,
1254
+ ...(identity.incarnation !== undefined ? { incarnation: identity.incarnation } : {}),
1304
1255
  ...(identity.legDeadlineMonotonic !== undefined ? { legDeadlineMonotonic: identity.legDeadlineMonotonic } : {}),
1305
1256
  }, live, req, signal);
1306
1257
  };
@@ -1583,6 +1534,7 @@ export class ToolApprovalCoordinator {
1583
1534
  const allowedP = new Promise((resolve) => { resolveAllowed = resolve; });
1584
1535
  let lastOutcome = SETTLE_OUTCOME.EXPIRED;
1585
1536
  let lastCause;
1537
+ let completeFrame;
1586
1538
  const abortListeners = [];
1587
1539
  let selfEntry;
1588
1540
  let hostSettled;
@@ -1646,8 +1598,10 @@ export class ToolApprovalCoordinator {
1646
1598
  }
1647
1599
  lastOutcome = outcome;
1648
1600
  lastCause = verdict.by === "system" ? verdict.cause : undefined;
1649
- if (lastLiveRegistration && askId !== undefined) {
1650
- this.notifyPresentedCardWatchers(askId, buildApprovalCompleteFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, outcome, ...(lastCause !== undefined ? { cause: lastCause } : {}), parked: parkRouted, nowMs: Date.now() }));
1601
+ if (askId !== undefined) {
1602
+ completeFrame = buildApprovalCompleteFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, outcome, ...(lastCause !== undefined ? { cause: lastCause } : {}), parked: parkRouted, nowMs: Date.now() });
1603
+ if (lastLiveRegistration)
1604
+ this.notifyPresentedCardWatchers(askId, completeFrame);
1651
1605
  }
1652
1606
  releaseAdmission();
1653
1607
  if (selfEntry)
@@ -1952,10 +1906,12 @@ export class ToolApprovalCoordinator {
1952
1906
  forceParkNow,
1953
1907
  settleParkRoute: (cause) => settleParkRouteIfUnsettled(undefined, cause),
1954
1908
  owner: origin.owner,
1909
+ ownerReadSeq: this.rowReadSeq,
1955
1910
  ...(primary ? { ctxTaskId: primary.taskId, originCtx: primary } : {}),
1956
1911
  ...(reachability === "unreached" ? { suspended: true } : {}),
1957
1912
  ...(child ? { originTaskId: req.sourceSessionId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
1958
1913
  ...(origin.sessionId ? { sessionId: origin.sessionId } : {}),
1914
+ ...(origin.incarnation !== undefined ? { incarnation: origin.incarnation } : {}),
1959
1915
  frame,
1960
1916
  ...(cardFrame !== undefined ? { cardFrame } : {}),
1961
1917
  approvalId: wireApprovalId,
@@ -2014,38 +1970,24 @@ export class ToolApprovalCoordinator {
2014
1970
  frame.serverNowMs = serverNowMs;
2015
1971
  frame.expiresInMs = Math.max(0, persistedExpiresAtMs - serverNowMs);
2016
1972
  }
2017
- const emitOne = async (c) => {
2018
- let family;
2019
- let send;
2020
- if (c.emitCard !== undefined) {
2021
- if (cardFrame === undefined) {
2022
- defaultLogger.warn("approval card leg cannot present this ask: it has no confirmed durable identity (no approval_request frame is minted without one)", {
2023
- taskId: origin.taskId,
2024
- approvalId: wireApprovalId,
2025
- toolName: req.toolName,
2026
- });
2027
- return { delivered: false };
2028
- }
2029
- family = "approval_request";
2030
- send = () => c.emitCard(cardFrame, id);
2031
- }
2032
- else {
2033
- family = "tool_approval";
2034
- send = () => c.emit(frame);
2035
- }
2036
- try {
2037
- await send();
2038
- return { delivered: true };
2039
- }
2040
- catch (err) {
2041
- defaultLogger.warn("approval_card_delivery_failed", { taskId: origin.taskId, approvalId: wireApprovalId, family, errKind: errorKindOf(err) });
2042
- return { delivered: false };
2043
- }
2044
- };
2045
- const openByCtx = new Map(aliveCtxs.map((c) => [c, emitOne(c)]));
1973
+ const cardCtxs = aliveCtxs.filter((c) => c.family === "approval_request");
1974
+ const legacyCtxs = aliveCtxs.filter((c) => c.family === "tool_approval");
1975
+ if (cardFrame === undefined && cardCtxs.length > 0) {
1976
+ defaultLogger.warn("approval card leg cannot present this ask: it has no confirmed durable identity (no approval_request frame is minted without one)", {
1977
+ taskId: origin.taskId,
1978
+ approvalId: wireApprovalId,
1979
+ toolName: req.toolName,
1980
+ });
1981
+ }
1982
+ const cardRace = cardFrame !== undefined && cardCtxs.length > 0
1983
+ ? createHitlOpenRace({ targets: cardCtxs.map((c) => ({ transport: c.transport, frame: cardFrame })), settled: allowedP })
1984
+ : undefined;
1985
+ const legacyRace = legacyCtxs.length > 0 ? createHitlOpenRace({ targets: legacyCtxs.map((c) => ({ transport: c.transport, frame })), settled: allowedP }) : undefined;
1986
+ if (cardRace !== undefined && cardFrame !== undefined)
1987
+ cardCtxs.forEach((c, i) => this.notePresentedCardRegistration(cardFrame.askId, c.transport, cardRace.acceptedLive(i)));
2046
1988
  const emitAllP = (async () => {
2047
- const results = await Promise.all(openByCtx.values());
2048
- const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) || results.some((r) => r.delivered);
1989
+ const landings = await Promise.all([cardRace?.landing, legacyRace?.landing]);
1990
+ const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) || landings.includes("delivered");
2049
1991
  emitSettled = true;
2050
1992
  if (!anySucceeded && !done) {
2051
1993
  if (this.askStore && askId !== undefined && batchId !== undefined) {
@@ -2086,35 +2028,15 @@ export class ToolApprovalCoordinator {
2086
2028
  })();
2087
2029
  await Promise.race([emitAllP, allowedP]);
2088
2030
  const settled = await allowedP;
2089
- for (const c of aliveCtxs) {
2090
- void openByCtx
2091
- .get(c)
2092
- .then(({ delivered }) => {
2093
- if (!delivered)
2094
- return undefined;
2095
- if (c.emitCard !== undefined) {
2096
- if (cardFrame === undefined)
2097
- return undefined;
2098
- return c.emitCard(buildApprovalCompleteFrame({
2099
- askId: cardFrame.askId,
2100
- taskId: cardFrame.taskId,
2101
- approvalId: wireApprovalId,
2102
- outcome: lastOutcome,
2103
- ...(lastCause !== undefined ? { cause: lastCause } : {}),
2104
- parked: parkRouted,
2105
- nowMs: Date.now(),
2106
- }), id);
2107
- }
2108
- return c.emit({
2109
- type: "tool_approval_complete",
2110
- approvalId: wireApprovalId,
2111
- outcome: lastOutcome,
2112
- ...(lastCause !== undefined ? { cause: lastCause } : {}),
2113
- ...(parkRouted ? { parked: true } : {}),
2114
- });
2115
- })
2116
- .catch(() => undefined);
2117
- }
2031
+ if (cardRace !== undefined && completeFrame !== undefined)
2032
+ cardRace.close(completeFrame);
2033
+ legacyRace?.close({
2034
+ type: "tool_approval_complete",
2035
+ approvalId: wireApprovalId,
2036
+ outcome: lastOutcome,
2037
+ ...(lastCause !== undefined ? { cause: lastCause } : {}),
2038
+ ...(parkRouted ? { parked: true } : {}),
2039
+ });
2118
2040
  if (emitFailed)
2119
2041
  return this.unattendedOutcome({ arm: "emit_failed", taskId: origin.taskId, ...(origin.owner !== null ? { owner: origin.owner } : {}), toolName: req.toolName, reachability });
2120
2042
  if (windowRouteUnavailable)
@@ -2133,7 +2055,7 @@ export class ToolApprovalCoordinator {
2133
2055
  const entry = this.liveEntryFor(id);
2134
2056
  if (entry?.adopted === true)
2135
2057
  return this.respondByRow(entry, id, principal, parsed, httpReq);
2136
- if (entry !== undefined && askOwnerAdmits(entry.owner, principal))
2058
+ if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal))
2137
2059
  return this.answerRegistration(entry, entry.owner, id, principal, parsed, httpReq);
2138
2060
  if (entry !== undefined && this.registrationHasRow(entry))
2139
2061
  return this.respondByRow(entry, id, principal, parsed, httpReq);
@@ -2145,10 +2067,10 @@ export class ToolApprovalCoordinator {
2145
2067
  async respondByRow(entry, id, principal, parsed, httpReq) {
2146
2068
  const store = this.askStore;
2147
2069
  if (!store)
2148
- return this.notPending();
2149
- const row = rowOrUnknown(await this.askRowFor(store, id, "getAsk(respond-by-row)"));
2070
+ return this.askNotVisible();
2071
+ const row = await this.askRowFollowingOwner(store, id, "getAsk(respond-by-row)");
2150
2072
  if (!askRowVisibleTo(row, principal))
2151
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2073
+ return this.askNotVisible();
2152
2074
  if (row.state !== "STREAM_PENDING")
2153
2075
  return this.dispatchRowTruth(row, id, parsed, httpReq, principal);
2154
2076
  return this.answerRegistration(entry, row.owner, id, principal, parsed, httpReq);
@@ -2240,31 +2162,27 @@ export class ToolApprovalCoordinator {
2240
2162
  }),
2241
2163
  };
2242
2164
  }
2165
+ askNotVisible() {
2166
+ return { status: 404, body: refusalBody({ errorCode: "not_found.ask", message: "no such approval ask (never existed, no longer kept, or not yours)" }) };
2167
+ }
2243
2168
  readApproval(id, principal) {
2244
2169
  const entry = this.liveEntryFor(id);
2245
2170
  if (entry !== undefined && this.registrationHasRow(entry))
2246
2171
  return this.readByRow(entry, id, principal);
2247
- if (entry !== undefined && askOwnerAdmits(entry.owner, principal)) {
2172
+ if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal)) {
2248
2173
  const body = { state: "pending", ...livePendingRowOf(entry) };
2249
2174
  return { status: 200, body };
2250
2175
  }
2251
2176
  const store = this.askStore;
2252
2177
  if (!store)
2253
- return this.notPending();
2178
+ return this.askNotVisible();
2254
2179
  return this.readAskRowState(store, id, principal);
2255
2180
  }
2256
2181
  async readByRow(entry, id, principal) {
2257
2182
  const store = this.askStore;
2258
2183
  if (!store)
2259
- return this.notPending();
2260
- const read = await this.askRowFor(store, id, "getAsk(read-by-row)");
2261
- if (read.kind === "unreadable") {
2262
- if (entry.adopted === true || !askOwnerAdmits(entry.owner, principal))
2263
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2264
- const body = { state: "pending", ...livePendingRowOf(entry) };
2265
- return { status: 200, body };
2266
- }
2267
- const row = rowOrUnknown(read);
2184
+ return this.askNotVisible();
2185
+ const row = await this.askRowFollowingOwner(store, id, "getAsk(read-by-row)");
2268
2186
  if (askRowVisibleTo(row, principal) && row.state === "STREAM_PENDING") {
2269
2187
  const body = { state: "pending", ...livePendingRowOf(entry) };
2270
2188
  return { status: 200, body };
@@ -2272,23 +2190,27 @@ export class ToolApprovalCoordinator {
2272
2190
  return this.readStateOfRow(row, principal);
2273
2191
  }
2274
2192
  async readAskRowState(store, id, principal) {
2275
- return this.readStateOfRow(rowOrUnknown(await this.askRowFor(store, id, "getAsk(read)")), principal);
2193
+ return this.readStateOfRow(await this.askRowFor(store, id, "getAsk(read)"), principal);
2276
2194
  }
2277
2195
  async readParkedGate(row) {
2278
2196
  const gate = this.parkedGate;
2279
2197
  if (gate === undefined || row.gateToken === null)
2280
- return { kind: "open" };
2198
+ return undefined;
2281
2199
  try {
2282
2200
  return await this.withStoreDeadline(gate({ gateToken: row.gateToken, gateBoundCallId: row.gateBoundCallId }), "readParkedGate", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2283
2201
  }
2284
2202
  catch (err) {
2285
2203
  this.noteStoreError(err, "readParkedGate");
2286
- return { kind: "open" };
2204
+ return undefined;
2287
2205
  }
2288
2206
  }
2207
+ async openGateGeneration(row) {
2208
+ const gate = await this.readParkedGate(row);
2209
+ return gate?.kind === "open" ? gate.generation : undefined;
2210
+ }
2289
2211
  async readStateOfRow(row, principal) {
2290
2212
  if (!askRowVisibleTo(row, principal))
2291
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2213
+ return this.askNotVisible();
2292
2214
  const projection = buildAskRowReadProjection(row, Date.now());
2293
2215
  let body;
2294
2216
  switch (row.state) {
@@ -2301,13 +2223,13 @@ export class ToolApprovalCoordinator {
2301
2223
  }
2302
2224
  case "PARKING":
2303
2225
  case "PARKED": {
2304
- const gate = row.state === "PARKED" ? await this.readParkedGate(row) : { kind: "open" };
2226
+ const gate = row.state === "PARKED" ? await this.readParkedGate(row) : undefined;
2227
+ if (gate === undefined || gate.kind === "open") {
2228
+ const parkSession = parkSessionOf(row);
2229
+ body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate?.reopened !== undefined ? { reopened: gate.reopened } : {}) };
2230
+ break;
2231
+ }
2305
2232
  switch (gate.kind) {
2306
- case "open": {
2307
- const parkSession = parkSessionOf(row);
2308
- body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate.reopened !== undefined ? { reopened: gate.reopened } : {}) };
2309
- break;
2310
- }
2311
2233
  case "decided":
2312
2234
  body = { state: "decided", ...projection, decision: gate.decision, decidedAtMs: gate.decidedAtMs, ...(gate.decisionNote !== undefined ? { decisionNote: gate.decisionNote } : {}) };
2313
2235
  break;
@@ -2350,11 +2272,11 @@ export class ToolApprovalCoordinator {
2350
2272
  respondLate(id, principal, parsed, httpReq) {
2351
2273
  const store = this.askStore;
2352
2274
  if (!store)
2353
- return this.notPending();
2275
+ return this.askNotVisible();
2354
2276
  return this.dispatchLateByRow(store, id, parsed, httpReq, principal);
2355
2277
  }
2356
- watchPresentedCards(askIds, deliver) {
2357
- const watcher = { deliver, askIds: new Set() };
2278
+ watchPresentedCards(askIds, deliver, connection) {
2279
+ const watcher = { deliver, connection, askIds: new Set(), registrationsOnConnection: new Map() };
2358
2280
  for (const askId of askIds) {
2359
2281
  if (!this.pendingByAskId.has(askId))
2360
2282
  continue;
@@ -2370,13 +2292,26 @@ export class ToolApprovalCoordinator {
2370
2292
  for (const askId of watcher.askIds)
2371
2293
  this.dropPresentedCardWatcher(askId, watcher);
2372
2294
  watcher.askIds.clear();
2295
+ watcher.registrationsOnConnection.clear();
2373
2296
  };
2374
2297
  }
2298
+ notePresentedCardRegistration(askId, transport, acceptedLive) {
2299
+ for (const watcher of this.presentedCardWatchers.get(askId) ?? []) {
2300
+ if (watcher.connection() !== transport)
2301
+ continue;
2302
+ const opens = watcher.registrationsOnConnection.get(askId);
2303
+ if (opens === undefined)
2304
+ watcher.registrationsOnConnection.set(askId, [acceptedLive]);
2305
+ else
2306
+ opens.push(acceptedLive);
2307
+ }
2308
+ }
2375
2309
  dropPresentedCardWatcher(askId, watcher) {
2376
2310
  const set = this.presentedCardWatchers.get(askId);
2377
2311
  if (set === undefined)
2378
2312
  return;
2379
2313
  set.delete(watcher);
2314
+ watcher.registrationsOnConnection.delete(askId);
2380
2315
  if (set.size === 0)
2381
2316
  this.presentedCardWatchers.delete(askId);
2382
2317
  }
@@ -2387,12 +2322,20 @@ export class ToolApprovalCoordinator {
2387
2322
  this.presentedCardWatchers.delete(askId);
2388
2323
  for (const watcher of set) {
2389
2324
  watcher.askIds.delete(askId);
2390
- try {
2391
- watcher.deliver(frame);
2392
- }
2393
- catch (err) {
2394
- defaultLogger.warn("presented-card completion notice could not be written to its connection", { askId, error: err instanceof Error ? err.message : String(err) });
2395
- }
2325
+ const opens = watcher.registrationsOnConnection.get(askId) ?? [];
2326
+ watcher.registrationsOnConnection.delete(askId);
2327
+ const write = () => {
2328
+ try {
2329
+ watcher.deliver(frame);
2330
+ }
2331
+ catch (err) {
2332
+ defaultLogger.warn("presented-card completion notice could not be written to its connection", { askId, error: err instanceof Error ? err.message : String(err) });
2333
+ }
2334
+ };
2335
+ if (opens.length === 0)
2336
+ write();
2337
+ else
2338
+ void Promise.all(opens).then((accepted) => (accepted.includes(true) ? undefined : write()));
2396
2339
  }
2397
2340
  }
2398
2341
  liveEntryFor(id) {
@@ -2404,24 +2347,27 @@ export class ToolApprovalCoordinator {
2404
2347
  return undefined;
2405
2348
  }
2406
2349
  async dispatchLateByRow(store, id, parsed, httpReq, principal) {
2407
- return this.dispatchRowTruth(rowOrUnknown(await this.askRowFor(store, id, "getAsk(respond-late)")), id, parsed, httpReq, principal);
2350
+ return this.dispatchRowTruth(await this.askRowFor(store, id, "getAsk(respond-late)"), id, parsed, httpReq, principal);
2408
2351
  }
2409
2352
  async askRowFor(store, id, label) {
2410
2353
  try {
2411
- const row = await this.withStoreDeadline(store.getAsk(id), label, DURABLE_CONVERGE_READ_TIMEOUT_MS);
2412
- return row === null ? { kind: "absent" } : { kind: "row", row };
2354
+ return await this.withStoreDeadline(store.getAsk(id), label, DURABLE_CONVERGE_READ_TIMEOUT_MS);
2413
2355
  }
2414
2356
  catch (err) {
2415
2357
  this.noteStoreError(err, label);
2416
- return { kind: "unreadable" };
2358
+ return null;
2417
2359
  }
2418
2360
  }
2361
+ async askRowFollowingOwner(store, id, label) {
2362
+ const readSeq = this.nextRowReadSeq();
2363
+ const row = await this.askRowFor(store, id, label);
2364
+ if (row?.state === "STREAM_PENDING")
2365
+ this.followRowOwner(row.askId, row.owner, readSeq);
2366
+ return row;
2367
+ }
2419
2368
  async dispatchRowTruth(row, id, parsed, httpReq, principal) {
2420
2369
  if (!askRowVisibleTo(row, principal))
2421
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2422
- const receipt = this.lookupParkRedemption(row.askId);
2423
- if (receipt?.redeemed !== undefined)
2424
- return this.replayRedeemReceipt(id, receipt, row, receipt.redeemed, parsed);
2370
+ return this.askNotVisible();
2425
2371
  switch (row.state) {
2426
2372
  case "DECIDED":
2427
2373
  return this.replayDecidedAsk(id, row, parsed);
@@ -2494,14 +2440,17 @@ export class ToolApprovalCoordinator {
2494
2440
  defaultLogger.error("tool approval parked row carries no gate token — nothing to redeem", { askId: row.askId });
2495
2441
  return this.notPending();
2496
2442
  }
2443
+ const openGenerationNow = this.lookupParkRedemption(row.askId) !== undefined ? await this.openGateGeneration(row) : undefined;
2497
2444
  const prior = this.lookupParkRedemption(row.askId);
2498
- if (prior?.redeemed !== undefined)
2445
+ if (prior?.redeemed !== undefined && receiptAnswersNow(prior.redeemed.gateGeneration, openGenerationNow))
2499
2446
  return this.replayRedeemReceipt(id, prior, row, prior.redeemed, parsed);
2500
2447
  if (prior?.inflight !== undefined) {
2501
2448
  const shared = await prior.inflight;
2502
2449
  if (shared.status < 200 || shared.status >= 300)
2503
2450
  return shared;
2504
- return this.replayRedeemReceipt(id, prior, row, { decision: shared.decision, body: shared.body, ...(shared.rule?.terminal === true ? { rule: shared.rule.body } : {}) }, parsed);
2451
+ if (!receiptAnswersNow(shared.gateGeneration, openGenerationNow))
2452
+ return this.redeemParkedAsk(id, row, parsed, httpReq, principal);
2453
+ return this.replayRedeemReceipt(id, prior, row, { decision: shared.decision, body: shared.body, gateGeneration: shared.gateGeneration, ...(shared.rule?.terminal === true ? { rule: shared.rule.body } : {}) }, parsed);
2505
2454
  }
2506
2455
  const admission = this.parkRedemptionAdmission(row.owner);
2507
2456
  if (admission !== undefined)
@@ -2550,7 +2499,7 @@ export class ToolApprovalCoordinator {
2550
2499
  }
2551
2500
  const rule = out.rule;
2552
2501
  if (this.retainParkRedemption(row.askId, memo))
2553
- memo.redeemed = { decision, body: out.body, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
2502
+ memo.redeemed = { decision, body: out.body, gateGeneration: out.gateGeneration, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
2554
2503
  return {
2555
2504
  status: out.status,
2556
2505
  body: {
@@ -2779,17 +2728,33 @@ export class ToolApprovalCoordinator {
2779
2728
  this.noteStoreError(err, "decideAsk");
2780
2729
  ruleEligibility.eligible = false;
2781
2730
  try {
2731
+ const confirmSeq = this.nextRowReadSeq();
2782
2732
  const row = await this.withStoreDeadline(askStore.getAsk(askId), "getAsk(decideAsk-confirm)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2783
- if (row !== null && !askRowCarriesOwner(row, owner))
2733
+ if (row?.state === "STREAM_PENDING")
2734
+ this.followRowOwner(askId, row.owner, confirmSeq);
2735
+ if (row === null || !askRowCarriesOwner(row, owner))
2784
2736
  return { lost: true, row: null };
2785
- if (row?.state === "DECIDED" && row.decision === (parsed.value === "deny" ? "deny" : "approve")) {
2737
+ if (row.state === "DECIDED" && row.decision === (parsed.value === "deny" ? "deny" : "approve")) {
2786
2738
  winnerRow = row;
2787
2739
  ambiguousConfirmedRow = row;
2788
2740
  noteLanded = noteLandedOnRow(parsed.note, row.decisionNote);
2789
2741
  }
2742
+ else if (row.state !== "STREAM_PENDING") {
2743
+ return { lost: true, row };
2744
+ }
2790
2745
  }
2791
2746
  catch (confirmErr) {
2792
2747
  this.noteStoreError(confirmErr, "getAsk(decideAsk-confirm)");
2748
+ return {
2749
+ lost: false,
2750
+ result: {
2751
+ status: 500,
2752
+ body: refusalBody({
2753
+ errorCode: "internal.error",
2754
+ message: "the approval store failed while recording this answer and could not be read back, so whether the answer was recorded is unknown — retry: a retry returns the recorded answer if it was recorded, or records it if it was not",
2755
+ }),
2756
+ },
2757
+ };
2793
2758
  }
2794
2759
  }
2795
2760
  const wantAllowed = parsed.value !== "deny";
@@ -2831,15 +2796,20 @@ export class ToolApprovalCoordinator {
2831
2796
  throw new Error(`unhandled standing-answer home: ${String(unhandled)}`);
2832
2797
  }
2833
2798
  }
2834
- if (parsed.value === "allow_session")
2835
- rememberApplied = Boolean(entry.sessionId) && grantable;
2836
- if (parsed.value === "allow_session" && entry.sessionId && grantable) {
2837
- if (this.allowAllSessions.size >= MAX_ALLOW_SESSIONS) {
2838
- const oldest = this.allowAllSessions.values().next().value;
2839
- if (oldest !== undefined)
2840
- this.allowAllSessions.delete(oldest);
2799
+ if (parsed.value === "allow_session") {
2800
+ const grantKey = grantable ? sessionAllowKey(judgedOwner, entry.sessionId, entry.incarnation, sessionAllowCategory(entry.toolName), entry.grantBinding) : undefined;
2801
+ rememberApplied = grantKey !== undefined;
2802
+ if (grantKey !== undefined) {
2803
+ if (this.allowAllSessions.size >= MAX_ALLOW_SESSIONS) {
2804
+ const oldest = this.allowAllSessions.values().next().value;
2805
+ if (oldest !== undefined)
2806
+ this.allowAllSessions.delete(oldest);
2807
+ }
2808
+ this.allowAllSessions.add(grantKey);
2809
+ }
2810
+ else if (grantable && entry.sessionId) {
2811
+ defaultLogger.warn("session_grant_refused_occupant_unreadable", { sessionId: entry.sessionId, toolName: entry.toolName });
2841
2812
  }
2842
- this.allowAllSessions.add(sessionAllowKey(judgedOwner, entry.sessionId, sessionAllowCategory(entry.toolName), entry.grantBinding));
2843
2813
  }
2844
2814
  const allowed = parsed.value !== "deny";
2845
2815
  const settleArgs = opts?.settleOutcome !== undefined
@@ -2939,6 +2909,7 @@ export class ToolApprovalCoordinator {
2939
2909
  forceParkNow: release,
2940
2910
  settleParkRoute: (cause) => leave({ outcome: SETTLE_OUTCOME.EXPIRED, cause, parked: this.unattendedRoutesToPark }),
2941
2911
  owner: row.owner,
2912
+ ownerReadSeq: this.rowReadSeq,
2942
2913
  executionLane: row.executionLane,
2943
2914
  ...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
2944
2915
  ...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
@@ -2972,10 +2943,42 @@ export class ToolApprovalCoordinator {
2972
2943
  for (const watcher of watchers)
2973
2944
  watcher.askIds.delete(askId);
2974
2945
  }
2975
- followAdoptedOwner(askId, owner) {
2976
- for (const e of this.pendingByAskId.get(askId) ?? [])
2977
- if (e.adopted === true)
2978
- e.owner = owner;
2946
+ followRowOwner(askId, owner, readSeq) {
2947
+ for (const e of this.pendingByAskId.get(askId) ?? []) {
2948
+ if (e.ownerReadSeq >= readSeq)
2949
+ continue;
2950
+ e.owner = owner;
2951
+ e.ownerReadSeq = readSeq;
2952
+ }
2953
+ }
2954
+ rowReadSeq = 0;
2955
+ nextRowReadSeq() {
2956
+ this.rowReadSeq += 1;
2957
+ return this.rowReadSeq;
2958
+ }
2959
+ async followRowOwners() {
2960
+ const store = this.askStore;
2961
+ const out = { read: 0, followed: 0, unreadable: 0 };
2962
+ if (!store)
2963
+ return out;
2964
+ for (const askId of [...this.pendingByAskId.keys()]) {
2965
+ out.read += 1;
2966
+ const readSeq = this.nextRowReadSeq();
2967
+ let row;
2968
+ try {
2969
+ row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(follow-row-owners)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2970
+ }
2971
+ catch (err) {
2972
+ this.noteStoreError(err, "getAsk(follow-row-owners)");
2973
+ out.unreadable += 1;
2974
+ continue;
2975
+ }
2976
+ if (row?.state !== "STREAM_PENDING")
2977
+ continue;
2978
+ this.followRowOwner(askId, row.owner, readSeq);
2979
+ out.followed += 1;
2980
+ }
2981
+ return out;
2979
2982
  }
2980
2983
  waitingRegistrationCount(askId) {
2981
2984
  let n = 0;
@@ -2984,18 +2987,29 @@ export class ToolApprovalCoordinator {
2984
2987
  n += 1;
2985
2988
  return n;
2986
2989
  }
2987
- listLivePending(scope) {
2988
- const rows = [];
2990
+ async listLivePending(scope) {
2989
2991
  const owner = scope === undefined ? undefined : ownerOfCheckpointScope(scope);
2990
- const seen = new Set();
2991
- for (const e of this.pending.values()) {
2992
- if (owner !== undefined && e.owner !== owner)
2993
- continue;
2994
- if (seen.has(e.approvalId))
2995
- continue;
2996
- seen.add(e.approvalId);
2997
- rows.push(livePendingRowOf(e));
2998
- }
2992
+ const inScope = (rowOwner) => owner === undefined || rowOwner === owner;
2993
+ const candidates = new Map();
2994
+ for (const e of this.pending.values())
2995
+ if (!candidates.has(e.approvalId))
2996
+ candidates.set(e.approvalId, e);
2997
+ const store = this.askStore;
2998
+ const ids = [...candidates.keys()];
2999
+ const listed = await Promise.all([...candidates.values()].map(async (entry) => {
3000
+ if (store === undefined || !this.registrationHasRow(entry))
3001
+ return inScope(entry.owner);
3002
+ const ask = await this.askRowFollowingOwner(store, entry.askId, "getAsk(list-live)");
3003
+ return ask?.state === "STREAM_PENDING" && inScope(ask.owner);
3004
+ }));
3005
+ const rows = [];
3006
+ ids.forEach((id, i) => {
3007
+ if (!listed[i])
3008
+ return;
3009
+ const current = this.liveEntryFor(id);
3010
+ if (current !== undefined)
3011
+ rows.push(livePendingRowOf(current));
3012
+ });
2999
3013
  return rows;
3000
3014
  }
3001
3015
  hasLivePendingFromLeg(names) {
@@ -3051,6 +3065,7 @@ export class ToolApprovalCoordinator {
3051
3065
  else
3052
3066
  this.adoptedPollOffset = adoptedStart + ++polledAdopted;
3053
3067
  let row;
3068
+ const readSeq = this.nextRowReadSeq();
3054
3069
  try {
3055
3070
  row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(poll-suspended)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
3056
3071
  }
@@ -3063,7 +3078,7 @@ export class ToolApprovalCoordinator {
3063
3078
  continue;
3064
3079
  }
3065
3080
  if (row.state === "STREAM_PENDING") {
3066
- this.followAdoptedOwner(askId, row.owner);
3081
+ this.followRowOwner(askId, row.owner, readSeq);
3067
3082
  continue;
3068
3083
  }
3069
3084
  if (this.editedDecisionInFlight(askId))