@sema-agent/server 7.146.0 → 7.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (850) hide show
  1. package/MIGRATION.md +1423 -24
  2. package/README.md +21 -8
  3. package/README.zh-CN.md +15 -9
  4. package/USAGE.md +537 -216
  5. package/deploy/facts/lanes.json +7 -0
  6. package/deploy/sema-up/README.md +18 -7
  7. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -4
  11. package/deploy/sema-up/chart/values.yaml +4 -3
  12. package/deploy/sema-up/cluster-up.sh +75 -176
  13. package/deploy/sema-up/kube-up.sh +29 -49
  14. package/deploy/sema-up/lib/chart-run.sh +23 -0
  15. package/deploy/sema-up/lib/dataroot.sh +3 -3
  16. package/deploy/sema-up/lib/flagshape.sh +4 -0
  17. package/deploy/sema-up/lib/health.sh +62 -13
  18. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  19. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  20. package/deploy/sema-up/lib/lanes.json +2 -5
  21. package/deploy/sema-up/lib/regcred.py +8 -0
  22. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  23. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  24. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  25. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  26. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  27. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  28. package/deploy/sema-up/lib/render-stack.py +17 -0
  29. package/deploy/sema-up/lib/shell-text.sh +87 -0
  30. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  31. package/deploy/sema-up/lib/usage-head.txt +1 -0
  32. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  33. package/deploy/sema-up/preflight.sh +10 -8
  34. package/deploy/sema-up/sema-up.sh +26 -48
  35. package/deploy/sema-up/smoke.sh +7 -6
  36. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  37. package/deploy/sema-up/stack/compose.yaml +18 -5
  38. package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
  39. package/dist/adoption/plan.d.ts +24 -0
  40. package/dist/adoption/plan.js +53 -1
  41. package/dist/adoption/runner.d.ts +10 -1
  42. package/dist/adoption/runner.js +36 -16
  43. package/dist/adoption/wire.d.ts +3 -3
  44. package/dist/approval-card.d.ts +32 -34
  45. package/dist/approval-gate-currency.js +3 -2
  46. package/dist/approval-reconciler.d.ts +4 -13
  47. package/dist/approval-reconciler.js +2 -2
  48. package/dist/approval.d.ts +16 -14
  49. package/dist/approval.js +3 -3
  50. package/dist/audit.d.ts +10 -3
  51. package/dist/audit.js +17 -9
  52. package/dist/auth-bridge.d.ts +0 -14
  53. package/dist/auth-bridge.js +0 -7
  54. package/dist/auto-mode-face.d.ts +10 -7
  55. package/dist/auto-mode-face.js +7 -4
  56. package/dist/background-agent-name.d.ts +19 -1
  57. package/dist/background-agent-name.js +12 -2
  58. package/dist/background-session-reap.d.ts +1 -1
  59. package/dist/bake-runner/main.js +9 -6
  60. package/dist/bench/s1/arms.js +6 -5
  61. package/dist/bench/s1/live-deps.js +8 -3
  62. package/dist/bench/s1/run-firm.js +6 -5
  63. package/dist/bind-host.d.ts +25 -0
  64. package/dist/bind-host.js +25 -0
  65. package/dist/boot/adoption.d.ts +3 -0
  66. package/dist/boot/adoption.js +1 -0
  67. package/dist/boot/crash-last.js +2 -1
  68. package/dist/boot/deployment-mods.d.ts +1 -1
  69. package/dist/boot/device-lane.js +5 -5
  70. package/dist/boot/engine-lease.d.ts +12 -11
  71. package/dist/boot/execution-env.d.ts +19 -8
  72. package/dist/boot/execution-env.js +80 -62
  73. package/dist/boot/execution-lane.d.ts +37 -9
  74. package/dist/boot/execution-lane.js +74 -20
  75. package/dist/boot/exit-boundary.d.ts +3 -3
  76. package/dist/boot/exit-boundary.js +6 -5
  77. package/dist/boot/exit-last.js +2 -1
  78. package/dist/boot/fatal-exit.d.ts +3 -5
  79. package/dist/boot/fatal-exit.js +2 -2
  80. package/dist/boot/governance-seams.d.ts +2 -2
  81. package/dist/boot/leader.d.ts +15 -0
  82. package/dist/boot/leader.js +18 -16
  83. package/dist/boot/memory-boundary.d.ts +11 -11
  84. package/dist/boot/memory-boundary.js +3 -3
  85. package/dist/boot/memory-consolidation.d.ts +50 -53
  86. package/dist/boot/memory-consolidation.js +11 -18
  87. package/dist/boot/org-memory.js +4 -3
  88. package/dist/boot/parked-revive-gate.d.ts +1 -1
  89. package/dist/boot/parked-revive-gate.js +3 -3
  90. package/dist/boot/reapers.d.ts +4 -3
  91. package/dist/boot/reapers.js +20 -17
  92. package/dist/boot/resolve-spec.d.ts +5 -3
  93. package/dist/boot/resolve-spec.js +133 -165
  94. package/dist/boot/retention-lane.d.ts +7 -45
  95. package/dist/boot/retention-lane.js +2 -2
  96. package/dist/boot/runner-deps.d.ts +28 -7
  97. package/dist/boot/runner-deps.js +11 -4
  98. package/dist/boot/runtime-caps.d.ts +2 -2
  99. package/dist/boot/runtime-caps.js +16 -2
  100. package/dist/boot/session-faces.d.ts +17 -7
  101. package/dist/boot/session-faces.js +122 -96
  102. package/dist/boot/shutdown.d.ts +5 -4
  103. package/dist/boot/shutdown.js +6 -4
  104. package/dist/boot/stage-01-config.d.ts +1 -1
  105. package/dist/boot/stage-01-config.js +14 -2
  106. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
  107. package/dist/boot/stage-02-web-admin-pull.js +15 -8
  108. package/dist/boot/stage-03-store-backend.d.ts +4 -1
  109. package/dist/boot/stage-03-store-backend.js +4 -3
  110. package/dist/boot/stage-04-stores.d.ts +3 -1
  111. package/dist/boot/stage-04-stores.js +2 -2
  112. package/dist/boot/stage-05-execution-env.d.ts +9 -5
  113. package/dist/boot/stage-05-execution-env.js +5 -5
  114. package/dist/boot/stage-06-runners.d.ts +13 -15
  115. package/dist/boot/stage-06-runners.js +24 -18
  116. package/dist/boot/stage-07-capability-layer.d.ts +14 -11
  117. package/dist/boot/stage-07-capability-layer.js +9 -12
  118. package/dist/boot/stage-08-reapers.d.ts +14 -11
  119. package/dist/boot/stage-08-reapers.js +3 -3
  120. package/dist/boot/stage-09-leader.d.ts +16 -18
  121. package/dist/boot/stage-09-leader.js +12 -4
  122. package/dist/boot/stage-10-http-server.d.ts +16 -18
  123. package/dist/boot/stage-10-http-server.js +9 -5
  124. package/dist/boot/store-evidence.d.ts +20 -0
  125. package/dist/boot/store-evidence.js +13 -0
  126. package/dist/boot/stores.d.ts +12 -0
  127. package/dist/boot/stores.js +39 -17
  128. package/dist/boot/task-list-lane.d.ts +4 -4
  129. package/dist/boot/web-admin.d.ts +4 -2
  130. package/dist/boot/web-admin.js +58 -38
  131. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  132. package/dist/boot-reclaim.d.ts +3 -1
  133. package/dist/boot-reclaim.js +1 -1
  134. package/dist/brain.d.ts +7 -18
  135. package/dist/brain.js +5 -17
  136. package/dist/budget.js +6 -6
  137. package/dist/capabilities/center-plugins.d.ts +9 -1
  138. package/dist/capabilities/center-plugins.js +37 -11
  139. package/dist/capabilities/center-wiring.js +1 -1
  140. package/dist/capabilities/composite-members.d.ts +3 -2
  141. package/dist/capabilities/composite-members.js +3 -2
  142. package/dist/capabilities/execution-lane.d.ts +7 -7
  143. package/dist/capabilities/execution-lane.js +2 -2
  144. package/dist/capabilities/hands-lane.d.ts +1 -1
  145. package/dist/capabilities/repo-tools.d.ts +2 -0
  146. package/dist/capabilities/repo-tools.js +14 -12
  147. package/dist/capabilities/scenarios.d.ts +38 -33
  148. package/dist/capabilities/scenarios.js +24 -25
  149. package/dist/capabilities/settings-contract.d.ts +29 -0
  150. package/dist/capabilities/settings-contract.js +14 -0
  151. package/dist/capabilities/skills.d.ts +6 -6
  152. package/dist/capabilities/tool-defer.d.ts +1 -1
  153. package/dist/capability-facts.d.ts +69 -4
  154. package/dist/capability-facts.js +77 -5
  155. package/dist/card-void.d.ts +4 -4
  156. package/dist/card-void.js +1 -1
  157. package/dist/center-credential-renewer.d.ts +6 -2
  158. package/dist/center-credential-renewer.js +10 -5
  159. package/dist/config-catalog.d.ts +16 -1
  160. package/dist/config-catalog.js +68 -61
  161. package/dist/config-dir-trust.d.ts +37 -4
  162. package/dist/config-dir-trust.js +88 -44
  163. package/dist/config-invariants.d.ts +58 -4
  164. package/dist/config-invariants.js +104 -23
  165. package/dist/config-lkg.d.ts +24 -2
  166. package/dist/config-lkg.js +22 -9
  167. package/dist/config-provider.d.ts +9 -9
  168. package/dist/config-provider.js +25 -108
  169. package/dist/config-pull-failure.d.ts +50 -0
  170. package/dist/config-pull-failure.js +48 -0
  171. package/dist/config-types.d.ts +215 -202
  172. package/dist/config.d.ts +69 -14
  173. package/dist/config.js +188 -96
  174. package/dist/degenerate-instrument.js +1 -1
  175. package/dist/delegated-session-owner.d.ts +1 -1
  176. package/dist/deleted-session-ids.d.ts +3 -2
  177. package/dist/deploy-facts.js +3 -2
  178. package/dist/deployment-governance.d.ts +3 -3
  179. package/dist/deployment-shape.d.ts +51 -16
  180. package/dist/deployment-shape.js +31 -6
  181. package/dist/egress-redirect.d.ts +25 -7
  182. package/dist/egress-redirect.js +20 -2
  183. package/dist/elicitation.d.ts +6 -5
  184. package/dist/elicitation.js +23 -22
  185. package/dist/engine-identity.d.ts +28 -0
  186. package/dist/engine-identity.js +10 -0
  187. package/dist/entry-problems.d.ts +5 -7
  188. package/dist/entry-problems.js +1 -1
  189. package/dist/env-facts.d.ts +7 -5
  190. package/dist/env-facts.js +12 -7
  191. package/dist/env-witness.d.ts +7 -0
  192. package/dist/env-witness.js +16 -0
  193. package/dist/execution-config-root.d.ts +5 -5
  194. package/dist/execution-config-root.js +5 -5
  195. package/dist/execution-env-purpose.d.ts +14 -0
  196. package/dist/execution-env-purpose.js +29 -0
  197. package/dist/execution-lane-caps.d.ts +53 -103
  198. package/dist/execution-lane-caps.js +51 -83
  199. package/dist/execution-placement.d.ts +65 -9
  200. package/dist/execution-placement.js +58 -0
  201. package/dist/field-conflict.d.ts +7 -11
  202. package/dist/field-conflict.js +3 -3
  203. package/dist/file-history-capture.d.ts +3 -3
  204. package/dist/file-history-disclosure.d.ts +2 -2
  205. package/dist/file-history-disclosure.js +1 -0
  206. package/dist/fleet/drain-entry.d.ts +17 -10
  207. package/dist/fleet/drain-entry.js +1 -1
  208. package/dist/fleet/fleet-bus.d.ts +21 -3
  209. package/dist/fleet/fleet-bus.js +35 -25
  210. package/dist/fleet/fleet-reconciler.js +2 -2
  211. package/dist/fleet/serving-lease.js +6 -7
  212. package/dist/fleet-client.js +3 -3
  213. package/dist/fleet-lease.d.ts +0 -1
  214. package/dist/fleet-lease.js +4 -5
  215. package/dist/history-anchor.d.ts +42 -0
  216. package/dist/history-anchor.js +34 -0
  217. package/dist/hitl-delivery.d.ts +90 -0
  218. package/dist/hitl-delivery.js +98 -0
  219. package/dist/hooks/classic-stations.d.ts +8 -11
  220. package/dist/hooks/classic-stations.js +0 -7
  221. package/dist/hooks/command-spawn.d.ts +1 -4
  222. package/dist/hooks/command-spawn.js +0 -11
  223. package/dist/hooks/hook-llm.d.ts +5 -1
  224. package/dist/hooks/hook-llm.js +24 -15
  225. package/dist/hooks/hook-runner.d.ts +119 -65
  226. package/dist/hooks/hook-runner.js +415 -217
  227. package/dist/host-lsp-manager.d.ts +22 -8
  228. package/dist/host-lsp-manager.js +4 -1
  229. package/dist/http/active-run-conflict.d.ts +2 -43
  230. package/dist/http/active-run-conflict.js +3 -7
  231. package/dist/http/admission.d.ts +4 -18
  232. package/dist/http/admission.js +75 -78
  233. package/dist/http/approval-sweeps.d.ts +5 -8
  234. package/dist/http/approval-sweeps.js +55 -30
  235. package/dist/http/caller-trust.d.ts +8 -10
  236. package/dist/http/caller-trust.js +1 -2
  237. package/dist/http/checkpoint-ctx.d.ts +17 -0
  238. package/dist/http/checkpoint-ctx.js +6 -0
  239. package/dist/http/claim-heartbeat.d.ts +49 -0
  240. package/dist/http/claim-heartbeat.js +46 -0
  241. package/dist/http/claim-latency.d.ts +10 -0
  242. package/dist/http/claim-latency.js +12 -0
  243. package/dist/http/claimed-run.d.ts +4 -3
  244. package/dist/http/dispatch.d.ts +8 -1
  245. package/dist/http/dispatch.js +77 -31
  246. package/dist/http/durable-run-leg.d.ts +3 -3
  247. package/dist/http/durable-run-leg.js +18 -12
  248. package/dist/http/execution-context.d.ts +18 -42
  249. package/dist/http/execution-context.js +11 -5
  250. package/dist/http/health-reader.d.ts +36 -0
  251. package/dist/http/health-reader.js +21 -0
  252. package/dist/http/health-self-report.d.ts +9 -9
  253. package/dist/http/health-self-report.js +4 -4
  254. package/dist/http/idempotency.d.ts +9 -5
  255. package/dist/http/idempotency.js +4 -4
  256. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  257. package/dist/http/memory-compliance-failure-reply.js +7 -2
  258. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  259. package/dist/http/memory-face-fault-reply.js +71 -0
  260. package/dist/http/memory-store-refusal-reply.d.ts +3 -3
  261. package/dist/http/memory-store-refusal-reply.js +6 -0
  262. package/dist/http/owner-access.d.ts +391 -56
  263. package/dist/http/owner-access.js +372 -33
  264. package/dist/http/principal-gate.d.ts +26 -94
  265. package/dist/http/principal-gate.js +24 -81
  266. package/dist/http/refusal-body.d.ts +35 -2
  267. package/dist/http/refusal-body.js +34 -0
  268. package/dist/http/request-guards.d.ts +10 -14
  269. package/dist/http/request-guards.js +34 -68
  270. package/dist/http/resume-composition.d.ts +37 -0
  271. package/dist/http/resume-composition.js +18 -0
  272. package/dist/http/resume-ctx-read.d.ts +35 -12
  273. package/dist/http/resume-ctx-read.js +25 -6
  274. package/dist/http/resume-legs.d.ts +24 -24
  275. package/dist/http/resume-legs.js +260 -171
  276. package/dist/http/retired-skill-manifest.d.ts +1 -1
  277. package/dist/http/rewind-files-reply.d.ts +34 -0
  278. package/dist/http/rewind-files-reply.js +36 -0
  279. package/dist/http/route-ctx.d.ts +56 -47
  280. package/dist/http/route-table.js +2 -0
  281. package/dist/http/routes/a2a-serve.d.ts +43 -5
  282. package/dist/http/routes/a2a-serve.js +58 -37
  283. package/dist/http/routes/admin-config-refresh.js +2 -2
  284. package/dist/http/routes/admin-drain.js +2 -2
  285. package/dist/http/routes/admin-memory-optout.js +4 -3
  286. package/dist/http/routes/adoption.d.ts +3 -0
  287. package/dist/http/routes/adoption.js +17 -10
  288. package/dist/http/routes/agents-roster.js +13 -7
  289. package/dist/http/routes/approvals-assistant.js +73 -88
  290. package/dist/http/routes/attachments.js +2 -2
  291. package/dist/http/routes/background.d.ts +3 -3
  292. package/dist/http/routes/background.js +9 -17
  293. package/dist/http/routes/capabilities.js +23 -20
  294. package/dist/http/routes/config-catalog.js +2 -2
  295. package/dist/http/routes/devices.d.ts +3 -3
  296. package/dist/http/routes/devices.js +5 -5
  297. package/dist/http/routes/diagnostics.d.ts +27 -3
  298. package/dist/http/routes/diagnostics.js +27 -21
  299. package/dist/http/routes/engine.js +2 -2
  300. package/dist/http/routes/fleet.js +5 -3
  301. package/dist/http/routes/images.js +10 -6
  302. package/dist/http/routes/leader.d.ts +7 -2
  303. package/dist/http/routes/leader.js +12 -3
  304. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  305. package/dist/http/routes/mcp-reconnect.js +7 -15
  306. package/dist/http/routes/memory-bundle.js +4 -7
  307. package/dist/http/routes/memory-compliance.js +4 -4
  308. package/dist/http/routes/memory-consolidation.js +6 -9
  309. package/dist/http/routes/memory-origin.d.ts +3 -1
  310. package/dist/http/routes/memory-origin.js +7 -8
  311. package/dist/http/routes/memory-policy.js +17 -12
  312. package/dist/http/routes/notify-wake.js +12 -20
  313. package/dist/http/routes/observability.js +3 -3
  314. package/dist/http/routes/principal-inbox.d.ts +1 -1
  315. package/dist/http/routes/principal-inbox.js +2 -2
  316. package/dist/http/routes/projects.d.ts +70 -0
  317. package/dist/http/routes/projects.js +87 -0
  318. package/dist/http/routes/retention-ops.js +6 -9
  319. package/dist/http/routes/rules.js +50 -7
  320. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  321. package/dist/http/routes/run-memory-capture.js +6 -12
  322. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  323. package/dist/http/routes/run-permission-mode.js +10 -17
  324. package/dist/http/routes/runs.js +148 -233
  325. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  326. package/dist/http/routes/session-memory-sync.js +7 -13
  327. package/dist/http/routes/session-sync.d.ts +4 -2
  328. package/dist/http/routes/session-sync.js +48 -30
  329. package/dist/http/routes/sessions-list.d.ts +3 -3
  330. package/dist/http/routes/sessions-list.js +9 -9
  331. package/dist/http/routes/sessions.d.ts +7 -1
  332. package/dist/http/routes/sessions.js +177 -112
  333. package/dist/http/routes/shared-memory.js +6 -6
  334. package/dist/http/routes/side-query.js +2 -2
  335. package/dist/http/routes/tasks.js +144 -122
  336. package/dist/http/routes/trace-usage.d.ts +0 -12
  337. package/dist/http/routes/trace-usage.js +40 -46
  338. package/dist/http/routes/workflows.d.ts +39 -4
  339. package/dist/http/routes/workflows.js +42 -14
  340. package/dist/http/run-concurrency-cap.d.ts +20 -12
  341. package/dist/http/run-concurrency-cap.js +39 -26
  342. package/dist/http/run-read-face.d.ts +3 -5
  343. package/dist/http/run-read-face.js +8 -13
  344. package/dist/http/send.d.ts +12 -3
  345. package/dist/http/send.js +42 -6
  346. package/dist/http/server.d.ts +63 -50
  347. package/dist/http/server.js +52 -16
  348. package/dist/http/sse-log.d.ts +17 -10
  349. package/dist/http/sse-log.js +7 -7
  350. package/dist/http/stored-body-replay.d.ts +17 -3
  351. package/dist/http/stored-body-replay.js +11 -2
  352. package/dist/http/submit-ctx.d.ts +16 -8
  353. package/dist/http/submit-ctx.js +6 -2
  354. package/dist/http/submit-replay.d.ts +19 -6
  355. package/dist/http/submit-replay.js +18 -6
  356. package/dist/http/sync-submit-body.d.ts +3 -4
  357. package/dist/http/sync-submit-body.js +4 -5
  358. package/dist/http/wire-types.d.ts +23 -13
  359. package/dist/identity-source.d.ts +36 -5
  360. package/dist/identity-source.js +27 -0
  361. package/dist/index.d.ts +3 -2
  362. package/dist/index.js +2 -1
  363. package/dist/instruction-source-notice.d.ts +1 -1
  364. package/dist/key-resolver.d.ts +32 -0
  365. package/dist/key-resolver.js +23 -9
  366. package/dist/leader/diffup.js +2 -1
  367. package/dist/leader/endpoint.d.ts +26 -5
  368. package/dist/leader/endpoint.js +154 -14
  369. package/dist/leader/fanout.d.ts +3 -0
  370. package/dist/leader/fanout.js +78 -63
  371. package/dist/leader/leader.d.ts +16 -0
  372. package/dist/leader/leader.js +43 -3
  373. package/dist/leader/merge.d.ts +9 -1
  374. package/dist/leader/merge.js +16 -1
  375. package/dist/leader/repair-wire.js +1 -1
  376. package/dist/leader/wire.d.ts +36 -3
  377. package/dist/leader/wire.js +59 -18
  378. package/dist/lsp-evict.d.ts +6 -4
  379. package/dist/lsp-evict.js +2 -3
  380. package/dist/memory-embedder-reembed.d.ts +38 -0
  381. package/dist/memory-embedder-reembed.js +20 -0
  382. package/dist/memory-incident-sink.d.ts +0 -28
  383. package/dist/memory-incident-sink.js +5 -0
  384. package/dist/memory-operator-faces.d.ts +5 -4
  385. package/dist/memory-operator-faces.js +1 -1
  386. package/dist/memory-scope.d.ts +31 -4
  387. package/dist/memory-scope.js +65 -16
  388. package/dist/memory-store-refusal.d.ts +20 -4
  389. package/dist/memory-store-refusal.js +1 -1
  390. package/dist/memory-sync-client.d.ts +5 -2
  391. package/dist/memory-sync-client.js +19 -14
  392. package/dist/memory-sync.js +1 -1
  393. package/dist/model-compat.d.ts +51 -28
  394. package/dist/model-compat.js +55 -23
  395. package/dist/model-context-window.d.ts +18 -0
  396. package/dist/model-context-window.js +2 -0
  397. package/dist/model-entry-headers.d.ts +46 -4
  398. package/dist/model-entry-headers.js +2 -2
  399. package/dist/model-entry-refusal.d.ts +46 -17
  400. package/dist/model-entry-refusal.js +47 -27
  401. package/dist/model-plane-face.d.ts +19 -11
  402. package/dist/model-plane-face.js +9 -1
  403. package/dist/model-plane-probe.d.ts +2 -0
  404. package/dist/model-plane-probe.js +17 -0
  405. package/dist/model-provider.d.ts +3 -3
  406. package/dist/model-route-endpoint.d.ts +9 -5
  407. package/dist/model-route-endpoint.js +29 -7
  408. package/dist/model-select.d.ts +16 -0
  409. package/dist/model-select.js +4 -0
  410. package/dist/mountinfo.d.ts +37 -0
  411. package/dist/mountinfo.js +47 -0
  412. package/dist/namespaced-rule-name.d.ts +28 -2
  413. package/dist/namespaced-rule-name.js +10 -1
  414. package/dist/net-address.d.ts +1 -1
  415. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  416. package/dist/observability/corrupt-read-seat.js +5 -3
  417. package/dist/observability/fail-open.d.ts +75 -47
  418. package/dist/observability/fail-open.js +77 -47
  419. package/dist/observability/logger.d.ts +22 -1
  420. package/dist/observability/logger.js +89 -12
  421. package/dist/observability/metrics.d.ts +2 -0
  422. package/dist/observability/metrics.js +5 -4
  423. package/dist/observability/otel-exporter.js +2 -1
  424. package/dist/observability/principal-context.d.ts +14 -7
  425. package/dist/observability/principal-context.js +8 -3
  426. package/dist/observability/run-terminal.d.ts +7 -1
  427. package/dist/observability/run-terminal.js +5 -2
  428. package/dist/observability/secret-env-scrub.d.ts +30 -4
  429. package/dist/observability/secret-env-scrub.js +15 -3
  430. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  431. package/dist/orchestration/hardened-vm-runner.js +11 -5
  432. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  433. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  434. package/dist/orchestration/hardened-vm-worker.js +2 -1
  435. package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
  436. package/dist/orchestration/workflow-agent-session-index.js +1 -6
  437. package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
  438. package/dist/orchestration/workflow-completion-inbox.js +65 -46
  439. package/dist/org-delivery-gate.d.ts +5 -4
  440. package/dist/org-delivery-gate.js +7 -6
  441. package/dist/org-memory-admission.d.ts +5 -2
  442. package/dist/org-memory-admission.js +25 -10
  443. package/dist/outbound-dispatcher.d.ts +1 -1
  444. package/dist/outbound-dispatcher.js +6 -12
  445. package/dist/owner-brands.d.ts +81 -0
  446. package/dist/owner-brands.js +42 -0
  447. package/dist/owner-faces.d.ts +531 -0
  448. package/dist/owner-faces.js +126 -0
  449. package/dist/parked-decide.d.ts +100 -31
  450. package/dist/parked-decide.js +162 -48
  451. package/dist/parked-revive-surface.d.ts +14 -4
  452. package/dist/parked-revive-surface.js +5 -4
  453. package/dist/peer-directory.d.ts +6 -8
  454. package/dist/peer-directory.js +3 -2
  455. package/dist/permission-rule-vocab.d.ts +53 -8
  456. package/dist/permission-rule-vocab.js +30 -2
  457. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  458. package/dist/plugins/adoption-log-sql.js +5 -3
  459. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  460. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  461. package/dist/plugins/approval-ask-store-file.d.ts +28 -9
  462. package/dist/plugins/approval-ask-store-file.js +74 -18
  463. package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
  464. package/dist/plugins/approval-ask-store-memory.js +35 -12
  465. package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
  466. package/dist/plugins/approval-ask-store-sql.js +44 -11
  467. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  468. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  469. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  470. package/dist/plugins/approval-exemption-store.js +14 -0
  471. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  472. package/dist/plugins/approval-nonce-store.js +72 -23
  473. package/dist/plugins/blob-backend.d.ts +40 -195
  474. package/dist/plugins/blob-backend.js +41 -234
  475. package/dist/plugins/caching-session-store.d.ts +22 -5
  476. package/dist/plugins/caching-session-store.js +43 -4
  477. package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
  478. package/dist/plugins/checkpoint-index-columns.js +39 -3
  479. package/dist/plugins/checkpoint-store-face.d.ts +84 -11
  480. package/dist/plugins/checkpoint-store-face.js +18 -1
  481. package/dist/plugins/device-store-sql.d.ts +2 -2
  482. package/dist/plugins/device-store-sql.js +6 -10
  483. package/dist/plugins/ensure-index.d.ts +13 -1
  484. package/dist/plugins/ensure-index.js +154 -21
  485. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  486. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  487. package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
  488. package/dist/plugins/execution-lane-rename-m40.js +10 -0
  489. package/dist/plugins/execution-placement-sql.d.ts +63 -88
  490. package/dist/plugins/execution-placement-sql.js +94 -54
  491. package/dist/plugins/file-run-store.d.ts +89 -35
  492. package/dist/plugins/file-run-store.js +197 -142
  493. package/dist/plugins/host-platform.d.ts +24 -3
  494. package/dist/plugins/host-platform.js +15 -1
  495. package/dist/plugins/image-bake-store-sql.js +2 -0
  496. package/dist/plugins/imported-layer-root-retirement.d.ts +19 -10
  497. package/dist/plugins/imported-layer-root-retirement.js +4 -8
  498. package/dist/plugins/inbox-payload-column.d.ts +14 -0
  499. package/dist/plugins/inbox-payload-column.js +13 -0
  500. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  501. package/dist/plugins/k8s-pod-reaper.js +0 -1
  502. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  503. package/dist/plugins/leader-run-store-sql.js +34 -4
  504. package/dist/plugins/local-checkpoint-store.d.ts +63 -23
  505. package/dist/plugins/local-checkpoint-store.js +204 -81
  506. package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
  507. package/dist/plugins/local-data-dir-modes-m39.js +183 -0
  508. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  509. package/dist/plugins/local-docker-capacity.js +194 -0
  510. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  511. package/dist/plugins/local-docker-reaper.js +102 -0
  512. package/dist/plugins/local-engine-high-water.d.ts +13 -0
  513. package/dist/plugins/local-engine-high-water.js +62 -0
  514. package/dist/plugins/local-session-store.d.ts +442 -143
  515. package/dist/plugins/local-session-store.js +941 -289
  516. package/dist/plugins/local-session-window.d.ts +3 -2
  517. package/dist/plugins/local-session-window.js +3 -2
  518. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  519. package/dist/plugins/local-task-attachment-store.d.ts +20 -1
  520. package/dist/plugins/local-task-attachment-store.js +32 -12
  521. package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
  522. package/dist/plugins/memory-embedder-fingerprint.js +52 -12
  523. package/dist/plugins/memory-embedder.d.ts +1 -1
  524. package/dist/plugins/memory-embedder.js +11 -9
  525. package/dist/plugins/memory-engine-pg.d.ts +7 -5
  526. package/dist/plugins/memory-engine-pg.js +18 -9
  527. package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
  528. package/dist/plugins/memory-engine-sql-apply.js +7 -9
  529. package/dist/plugins/memory-engine-tidb.d.ts +12 -7
  530. package/dist/plugins/memory-engine-tidb.js +18 -10
  531. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  532. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  533. package/dist/plugins/memory-run-store.d.ts +39 -27
  534. package/dist/plugins/memory-run-store.js +72 -70
  535. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  536. package/dist/plugins/one-time-migration-marker.js +7 -0
  537. package/dist/plugins/one-time-migrations.d.ts +325 -74
  538. package/dist/plugins/one-time-migrations.js +705 -230
  539. package/dist/plugins/org-delivery-quota-store.js +2 -1
  540. package/dist/plugins/owner-only-file-mode.d.ts +29 -0
  541. package/dist/plugins/owner-only-file-mode.js +141 -0
  542. package/dist/plugins/permission-rule-store-file.d.ts +11 -11
  543. package/dist/plugins/permission-rule-store-file.js +14 -2
  544. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  545. package/dist/plugins/permission-rule-store-sql.js +6 -86
  546. package/dist/plugins/pg-pool.d.ts +3 -32
  547. package/dist/plugins/pg-pool.js +27 -11
  548. package/dist/plugins/release-version.d.ts +20 -0
  549. package/dist/plugins/release-version.js +28 -0
  550. package/dist/plugins/remote-env-adb.d.ts +20 -4
  551. package/dist/plugins/remote-env-adb.js +39 -11
  552. package/dist/plugins/remote-env-e2b.d.ts +19 -28
  553. package/dist/plugins/remote-env-e2b.js +40 -29
  554. package/dist/plugins/remote-env-host.d.ts +11 -10
  555. package/dist/plugins/remote-env-host.js +40 -27
  556. package/dist/plugins/remote-env-k8s.d.ts +45 -47
  557. package/dist/plugins/remote-env-k8s.js +122 -62
  558. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  559. package/dist/plugins/remote-env-local-docker.js +370 -75
  560. package/dist/plugins/remote-env-ssh.d.ts +8 -2
  561. package/dist/plugins/remote-env-ssh.js +26 -24
  562. package/dist/plugins/remote-scratchpad.js +4 -0
  563. package/dist/plugins/remote-shell.d.ts +59 -30
  564. package/dist/plugins/remote-shell.js +175 -62
  565. package/dist/plugins/retention-declaration.d.ts +37 -0
  566. package/dist/plugins/retention-declaration.js +9 -0
  567. package/dist/plugins/retention-deployment.d.ts +158 -0
  568. package/dist/plugins/retention-deployment.js +119 -0
  569. package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
  570. package/dist/plugins/retention-lane-store-sql.js +103 -1
  571. package/dist/plugins/retention-sql.d.ts +29 -0
  572. package/dist/plugins/retention-sql.js +8 -0
  573. package/dist/plugins/run-preview-m45.d.ts +11 -0
  574. package/dist/plugins/run-preview-m45.js +19 -0
  575. package/dist/plugins/run-store-sql.d.ts +56 -68
  576. package/dist/plugins/run-store-sql.js +127 -116
  577. package/dist/plugins/s3-answer.d.ts +2 -1
  578. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  579. package/dist/plugins/sandbox-reaper.js +2 -0
  580. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  581. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  582. package/dist/plugins/scheduler-support.d.ts +16 -1
  583. package/dist/plugins/scheduler-support.js +22 -2
  584. package/dist/plugins/schema-consistency.d.ts +42 -15
  585. package/dist/plugins/schema-consistency.js +213 -13
  586. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  587. package/dist/plugins/schema-drift-sentence.js +4 -4
  588. package/dist/plugins/schema-ensure-legs.d.ts +10 -1
  589. package/dist/plugins/schema-ensure-legs.js +12 -2
  590. package/dist/plugins/schema-indexes.js +3 -0
  591. package/dist/plugins/schema-live-columns.d.ts +14 -5
  592. package/dist/plugins/schema-live-columns.js +10 -10
  593. package/dist/plugins/send-user-file.js +2 -1
  594. package/dist/plugins/session-birth.d.ts +37 -0
  595. package/dist/plugins/session-birth.js +38 -0
  596. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  597. package/dist/plugins/session-epoch-anchor.js +33 -11
  598. package/dist/plugins/session-ext-table.d.ts +98 -0
  599. package/dist/plugins/session-ext-table.js +134 -0
  600. package/dist/plugins/session-fork.d.ts +16 -2
  601. package/dist/plugins/session-fork.js +3 -0
  602. package/dist/plugins/session-ownership.d.ts +1 -1
  603. package/dist/plugins/session-placement.d.ts +22 -16
  604. package/dist/plugins/session-placement.js +15 -12
  605. package/dist/plugins/session-row-sql.d.ts +20 -7
  606. package/dist/plugins/session-row-sql.js +16 -8
  607. package/dist/plugins/session-run-rollup.d.ts +29 -0
  608. package/dist/plugins/session-run-rollup.js +40 -0
  609. package/dist/plugins/session-store-sql.d.ts +157 -0
  610. package/dist/plugins/session-store-sql.js +398 -0
  611. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  612. package/dist/plugins/session-withdraw-sql.js +42 -0
  613. package/dist/plugins/session-workspace-cell.d.ts +2 -2
  614. package/dist/plugins/session-workspace-cell.js +2 -2
  615. package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
  616. package/dist/plugins/shared-memory-store-sql.js +15 -14
  617. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  618. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  619. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  620. package/dist/plugins/snapshot-bucket-presence.js +1 -1
  621. package/dist/plugins/sql-driver.d.ts +24 -8
  622. package/dist/plugins/sql-driver.js +43 -9
  623. package/dist/plugins/sql-errors.d.ts +35 -5
  624. package/dist/plugins/sql-errors.js +55 -3
  625. package/dist/plugins/sql-json-column.d.ts +8 -7
  626. package/dist/plugins/sql-json-column.js +10 -6
  627. package/dist/plugins/store-backend.d.ts +114 -18
  628. package/dist/plugins/store-backend.js +340 -87
  629. package/dist/plugins/store-contracts.d.ts +97 -30
  630. package/dist/plugins/store-contracts.js +23 -1
  631. package/dist/plugins/store-fault.d.ts +28 -2
  632. package/dist/plugins/store-fault.js +20 -2
  633. package/dist/plugins/task-attachment-store.d.ts +21 -11
  634. package/dist/plugins/task-attachment-store.js +37 -19
  635. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  636. package/dist/plugins/text-column-capacity.d.ts +21 -0
  637. package/dist/plugins/text-column-capacity.js +5 -0
  638. package/dist/plugins/tidb-pool.d.ts +3 -2
  639. package/dist/plugins/tidb-pool.js +42 -39
  640. package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
  641. package/dist/plugins/web-search.js +5 -3
  642. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  643. package/dist/plugins/workflow-run-store-sql.js +11 -5
  644. package/dist/principal-jwt.d.ts +4 -4
  645. package/dist/principal-jwt.js +20 -5
  646. package/dist/principal-shape.d.ts +41 -0
  647. package/dist/principal-shape.js +19 -0
  648. package/dist/question.d.ts +13 -23
  649. package/dist/question.js +21 -39
  650. package/dist/read-face-posture.d.ts +6 -6
  651. package/dist/read-face-posture.js +2 -2
  652. package/dist/request-declaration-refusal.d.ts +35 -12
  653. package/dist/request-declaration-refusal.js +21 -9
  654. package/dist/request-form.d.ts +58 -0
  655. package/dist/request-form.js +72 -0
  656. package/dist/request-image-urls.d.ts +8 -2
  657. package/dist/request-image-urls.js +2 -1
  658. package/dist/request-images.d.ts +20 -0
  659. package/dist/request-images.js +59 -0
  660. package/dist/request-key-closure.d.ts +6 -7
  661. package/dist/request-key-closure.js +15 -2
  662. package/dist/request-value-closure.d.ts +5 -5
  663. package/dist/request-value-closure.js +1 -1
  664. package/dist/resource-suspend.d.ts +7 -16
  665. package/dist/resource-suspend.js +1 -1
  666. package/dist/retired-name-host-notice.d.ts +21 -0
  667. package/dist/retired-name-host-notice.js +12 -0
  668. package/dist/rule-entry-list.d.ts +2 -2
  669. package/dist/rule-entry-list.js +3 -4
  670. package/dist/rule-issue-reading.d.ts +58 -0
  671. package/dist/rule-issue-reading.js +14 -0
  672. package/dist/rules-consent.d.ts +46 -16
  673. package/dist/rules-consent.js +102 -53
  674. package/dist/run-acceptance.d.ts +3 -1
  675. package/dist/run-acceptance.js +3 -0
  676. package/dist/run-local.d.ts +14 -6
  677. package/dist/run-local.js +109 -93
  678. package/dist/run-stale-default.d.ts +7 -0
  679. package/dist/run-stale-default.js +2 -0
  680. package/dist/runs.d.ts +73 -44
  681. package/dist/runs.js +65 -43
  682. package/dist/runtime-caps-resolver.d.ts +36 -14
  683. package/dist/runtime-caps-resolver.js +31 -14
  684. package/dist/runtime-governance.d.ts +2 -2
  685. package/dist/runtime-governance.js +5 -3
  686. package/dist/sealed-key-layout.d.ts +12 -6
  687. package/dist/sealed-key-layout.js +5 -1
  688. package/dist/sealed-key.d.ts +12 -2
  689. package/dist/sealed-key.js +116 -26
  690. package/dist/security.d.ts +133 -161
  691. package/dist/security.js +163 -59
  692. package/dist/sema-config-dir.d.ts +20 -0
  693. package/dist/sema-config-dir.js +27 -2
  694. package/dist/server-secret-env.d.ts +23 -5
  695. package/dist/server-secret-env.js +14 -4
  696. package/dist/service-version.d.ts +2 -1
  697. package/dist/service-version.js +2 -2
  698. package/dist/session-children-retire.d.ts +7 -5
  699. package/dist/session-children-retire.js +7 -2
  700. package/dist/session-deletion.d.ts +88 -0
  701. package/dist/session-deletion.js +8 -0
  702. package/dist/session-erase.d.ts +145 -0
  703. package/dist/session-erase.js +115 -0
  704. package/dist/session-error-wire.d.ts +6 -6
  705. package/dist/session-error-wire.js +1 -1
  706. package/dist/session-incarnation.d.ts +60 -10
  707. package/dist/session-incarnation.js +19 -2
  708. package/dist/session-policy-wire.d.ts +6 -3
  709. package/dist/session-policy-wire.js +11 -1
  710. package/dist/session-resident-background.d.ts +29 -47
  711. package/dist/session-resident-background.js +77 -8
  712. package/dist/session-row.d.ts +3 -2
  713. package/dist/session-rules-seat.d.ts +12 -0
  714. package/dist/session-rules-seat.js +19 -0
  715. package/dist/session-sync-kernel.d.ts +1 -1
  716. package/dist/session-titler.d.ts +7 -15
  717. package/dist/session-titler.js +1 -1
  718. package/dist/session-workspace.d.ts +11 -2
  719. package/dist/session-workspace.js +5 -0
  720. package/dist/sighup-idle.d.ts +1 -1
  721. package/dist/spec-fields.d.ts +57 -3
  722. package/dist/spec-fields.js +72 -51
  723. package/dist/store-posture.d.ts +138 -21
  724. package/dist/store-posture.js +188 -3
  725. package/dist/stored-request-hooks-m20.d.ts +3 -2
  726. package/dist/stored-request-hooks-m20.js +21 -16
  727. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  728. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  729. package/dist/stores-sql/blob-index-sql.d.ts +148 -0
  730. package/dist/stores-sql/blob-index-sql.js +154 -0
  731. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  732. package/dist/stores-sql/checkpoint-store-sql.js +86 -71
  733. package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
  734. package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
  735. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  736. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  737. package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
  738. package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
  739. package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
  740. package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
  741. package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
  742. package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
  743. package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
  744. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  745. package/dist/stores-sql/session-write-hooks.d.ts +65 -0
  746. package/dist/stores-sql/session-write-hooks.js +2 -0
  747. package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
  748. package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
  749. package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
  750. package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
  751. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  752. package/dist/stores-sql/tool-result-store-sql.js +1 -1
  753. package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
  754. package/dist/stores-sql/windowed-session-storage.js +70 -0
  755. package/dist/submission-exit.d.ts +50 -0
  756. package/dist/submission-exit.js +108 -0
  757. package/dist/task-a2a.d.ts +7 -1
  758. package/dist/task-a2a.js +18 -17
  759. package/dist/task-cwd.d.ts +31 -3
  760. package/dist/task-cwd.js +25 -1
  761. package/dist/task-mcp.d.ts +11 -3
  762. package/dist/task-mcp.js +16 -19
  763. package/dist/task-settings.d.ts +23 -14
  764. package/dist/task-settings.js +35 -13
  765. package/dist/terminal.d.ts +25 -43
  766. package/dist/terminal.js +31 -11
  767. package/dist/tool-approval.d.ts +152 -137
  768. package/dist/tool-approval.js +199 -199
  769. package/dist/trace/core-keyset-guard.d.ts +22 -9
  770. package/dist/trace/core-vocab-wire.d.ts +95 -0
  771. package/dist/trace/core-vocab-wire.js +15 -0
  772. package/dist/trace/engine-notice-wire.d.ts +1 -1
  773. package/dist/trace/engine-notice-wire.js +2 -0
  774. package/dist/trace/exit-seat.d.ts +52 -4
  775. package/dist/trace/exit-seat.js +43 -36
  776. package/dist/trace/extension-call-face.d.ts +3 -2
  777. package/dist/trace/extension-call-face.js +3 -1
  778. package/dist/trace/ledger-events.d.ts +4 -7
  779. package/dist/trace/ledger-sink.d.ts +1 -30
  780. package/dist/trace/ledger-sink.js +0 -11
  781. package/dist/trace/model-segment.d.ts +5 -5
  782. package/dist/trace/model-segment.js +5 -5
  783. package/dist/trace/project.d.ts +88 -58
  784. package/dist/trace/project.js +64 -28
  785. package/dist/trace/redact.d.ts +124 -28
  786. package/dist/trace/redact.js +936 -328
  787. package/dist/trace/self-minted-wire.d.ts +750 -29
  788. package/dist/trace/self-minted-wire.js +262 -25
  789. package/dist/trace/sema-provenance.d.ts +45 -41
  790. package/dist/trace/sema-provenance.js +81 -10
  791. package/dist/trace/task-notification-facets.d.ts +70 -2
  792. package/dist/trace/task-notification-facets.js +71 -1
  793. package/dist/trace/wire-projection-faces.d.ts +43 -8
  794. package/dist/trace/wire-projection-faces.js +28 -3
  795. package/dist/unread-request-members.d.ts +66 -0
  796. package/dist/unread-request-members.js +41 -0
  797. package/dist/upstream-body.d.ts +23 -0
  798. package/dist/upstream-body.js +16 -0
  799. package/dist/url-refusal.d.ts +3 -3
  800. package/dist/url-refusal.js +11 -4
  801. package/dist/user-authored-text.d.ts +1 -1
  802. package/dist/user-input-ledger.d.ts +7 -8
  803. package/dist/user-input-ledger.js +1 -1
  804. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  805. package/dist/web-admin-client/apply-effective.js +33 -40
  806. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  807. package/dist/web-admin-client/apply-ledger.js +5 -2
  808. package/dist/web-admin-client/candidate-gate.d.ts +35 -3
  809. package/dist/web-admin-client/candidate-gate.js +53 -5
  810. package/dist/web-admin-client/center-request.d.ts +6 -3
  811. package/dist/web-admin-client/center-request.js +17 -16
  812. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  813. package/dist/web-admin-client/effective-keys.js +1 -2
  814. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  815. package/dist/web-admin-client/entry-metadata.js +13 -0
  816. package/dist/web-admin-client/facade.d.ts +1 -1
  817. package/dist/web-admin-client/http-client.d.ts +2 -1
  818. package/dist/web-admin-client/http-client.js +40 -13
  819. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  820. package/dist/web-admin-client/mcp-revocation.js +2 -1
  821. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  822. package/dist/web-admin-client/read-warnings.js +1 -0
  823. package/dist/web-admin-client/restart-signal.js +13 -6
  824. package/dist/web-admin-client/skills-mcp.d.ts +22 -8
  825. package/dist/web-admin-client/skills-mcp.js +26 -21
  826. package/dist/web-admin-client/types.d.ts +35 -51
  827. package/dist/workspace-space.d.ts +3 -2
  828. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  829. package/package.json +16 -12
  830. package/scripts/drain-check-local.mjs +118 -173
  831. package/scripts/drain-check.mysql.sql +20 -16
  832. package/scripts/drain-check.pg.sql +20 -16
  833. package/wire-changes/server@7.147.0.json +813 -0
  834. package/wire-changes/server@7.148.0.json +1517 -0
  835. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  836. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  837. package/dist/http/memory-layer-reply.d.ts +0 -30
  838. package/dist/http/memory-layer-reply.js +0 -24
  839. package/dist/lsp/e2b-bridge.d.ts +0 -57
  840. package/dist/lsp/e2b-bridge.js +0 -139
  841. package/dist/lsp/e2b-manager.d.ts +0 -93
  842. package/dist/lsp/e2b-manager.js +0 -178
  843. package/dist/lsp/lsp-frames.d.ts +0 -14
  844. package/dist/lsp/lsp-frames.js +0 -25
  845. package/dist/lsp/manager.d.ts +0 -129
  846. package/dist/lsp/manager.js +0 -127
  847. package/dist/lsp/types.d.ts +0 -12
  848. package/dist/lsp/types.js +0 -2
  849. package/dist/lsp/ws-transport.d.ts +0 -40
  850. package/dist/lsp/ws-transport.js +0 -210
@@ -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";
@@ -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");
@@ -227,7 +231,13 @@ function rowOrUnknown(read) {
227
231
  return read.kind === "row" ? read.row : null;
228
232
  }
229
233
  function askRowVisibleTo(row, principal) {
230
- return row !== null && askOwnerAdmits(row.owner, principal);
234
+ return row !== null && askOwnerAdmitsAnswer(row.owner, principal);
235
+ }
236
+ function askOwnerAdmitsAnswer(owner, principal) {
237
+ return keyAdmits("ask.answer", { subject: recoveredSubject(principal), operator: false }, ownerCellOf(owner));
238
+ }
239
+ function receiptAnswersNow(redeemedGeneration, openGenerationNow) {
240
+ return redeemedGeneration === undefined || openGenerationNow === undefined || openGenerationNow <= redeemedGeneration;
231
241
  }
232
242
  function waitingLegsReached(entry, othersReached) {
233
243
  return (entry.adopted === true ? 0 : 1) + othersReached;
@@ -257,8 +267,10 @@ function livePendingRowOf(e) {
257
267
  ...(e.adopted === true ? { consumerState: ASK_DECISION_CONSUMER_ABSENT } : {}),
258
268
  };
259
269
  }
270
+ const _legFamiliesAreFrameFamilies = true;
271
+ void _legFamiliesAreFrameFamilies;
260
272
  function canPresentWithoutDurableRow(c) {
261
- return c.emitCard === undefined;
273
+ return c.family === "tool_approval";
262
274
  }
263
275
  export const PERSIST_RULE_TEXT_ERROR = `persistRule.rule must be a non-empty string of at most ${MAX_RULE_TEXT_CHARS} characters`;
264
276
  export const PERSIST_RULE_EDITED_FLAG_ERROR = "persistRule.edited must be a boolean when present";
@@ -435,49 +447,6 @@ export function declaredApprovalFrameFamilies(settings) {
435
447
  const raw = Reflect.get(settings, "approvalFrameFamilies");
436
448
  return new Set(Array.isArray(raw) ? raw.filter((w) => APPROVAL_FRAME_FAMILIES.includes(w)) : []);
437
449
  }
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
450
  export function resolveApprovalLeg(input) {
482
451
  const active = input.streamApprovalOn;
483
452
  const tightDeadline = active && input.legWalltimeMs !== undefined && input.legWalltimeMs - input.windowMarginMs <= 0;
@@ -512,7 +481,8 @@ export function outcomeOfDecidedRow(row) {
512
481
  const allow = row.decision === "approve";
513
482
  const source = row.settledBy !== null ? { settledBy: row.settledBy, ...(row.decidedVia !== null ? { decidedVia: row.decidedVia } : {}) } : {};
514
483
  const edit = allow && row.updatedInput !== undefined ? { updatedInput: row.updatedInput } : {};
515
- return row.settledBy === null && !("updatedInput" in edit) ? allow : { allow, ...edit, ...source };
484
+ const denyReason = !allow && row.decisionNote ? { reason: row.decisionNote } : {};
485
+ return row.settledBy === null && !("updatedInput" in edit) && !("reason" in denyReason) ? allow : { allow, ...edit, ...denyReason, ...source };
516
486
  }
517
487
  function settleArgsOfDecided(outcome) {
518
488
  if (typeof outcome === "boolean")
@@ -521,6 +491,7 @@ function settleArgsOfDecided(outcome) {
521
491
  allowed: outcome.allow,
522
492
  ...(outcome.updatedInput !== undefined ? { updatedInput: outcome.updatedInput } : {}),
523
493
  ...(outcome.settledBy !== undefined ? { source: { settledBy: outcome.settledBy, ...(outcome.decidedVia !== undefined ? { decidedVia: outcome.decidedVia } : {}) } } : {}),
494
+ ...(!outcome.allow && outcome.reason !== undefined ? { denyReason: outcome.reason } : {}),
524
495
  };
525
496
  }
526
497
  function verdictOfDecided(args) {
@@ -529,6 +500,7 @@ function verdictOfDecided(args) {
529
500
  allowed: args.allowed,
530
501
  ...(args.updatedInput !== undefined ? { updatedInput: args.updatedInput } : {}),
531
502
  ...(args.source !== undefined ? { hostSource: args.source } : {}),
503
+ ...(args.denyReason !== undefined ? { denyReason: args.denyReason } : {}),
532
504
  };
533
505
  }
534
506
  function settleArgsOf(outcome) {
@@ -764,14 +736,14 @@ export class ToolApprovalCoordinator {
764
736
  }
765
737
  });
766
738
  }
767
- static ruleOfferDerivedFactsAgree(offer) {
739
+ static ruleOfferDerivedFactsAgree(offer, cardTool) {
768
740
  const derive = (rule) => {
769
741
  const p = parseRuleText(rule, "allow");
770
742
  return "rule" in p ? p.rule : undefined;
771
743
  };
772
744
  if (offer.kind === "single") {
773
745
  const d = derive(offer.rule);
774
- return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.singleOfferToolAgrees(d.match, d.tool);
746
+ return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.singleOfferBelongsOnCard(d.match, d.tool, cardTool);
775
747
  }
776
748
  return offer.rules.every((m) => {
777
749
  const d = derive(m.rule);
@@ -787,40 +759,21 @@ export class ToolApprovalCoordinator {
787
759
  }
788
760
  });
789
761
  }
790
- static singleOfferToolAgrees(match, tool) {
791
- switch (match) {
792
- case "exact":
793
- case "prefix":
794
- case "wildcard":
795
- case "pattern":
796
- return tool === "Bash";
797
- case "tool":
798
- return cardTakesWholeToolConsent(tool);
799
- case "subpath":
800
- case "path":
801
- case "name":
802
- case "name_prefix":
803
- case "host":
804
- case "subdomain":
805
- return false;
806
- default: {
807
- const unknown = match;
808
- void unknown;
809
- return false;
810
- }
811
- }
762
+ static singleOfferBelongsOnCard(match, ruleTool, cardTool) {
763
+ const form = CARD_RULE_FORM_OF_MATCH[match];
764
+ return ruleTool === cardTool && form !== undefined && form === cardRuleFormOf(cardTool);
812
765
  }
813
- static boundRuleOfferTexts(offers) {
766
+ static boundRuleOfferTexts(offers, cardTool) {
814
767
  const over = (s) => s.length > MAX_RULE_TEXT_CHARS;
815
768
  const clipSegment = (s) => (over(s) ? s.slice(0, MAX_RULE_TEXT_CHARS) : s);
816
769
  const out = [];
817
770
  for (const { offer } of readRuleOfferList(offers)) {
818
771
  if (ToolApprovalCoordinator.ruleOfferTextsOverSize(offer))
819
772
  return undefined;
820
- if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer)) {
773
+ if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer, cardTool)) {
821
774
  defaultLogger.warn("rule_offer_dropped_derived_facts_disagree", {
822
775
  kind: offer.kind,
823
- 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?)",
776
+ 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?)",
824
777
  });
825
778
  continue;
826
779
  }
@@ -857,11 +810,9 @@ export class ToolApprovalCoordinator {
857
810
  return out;
858
811
  }
859
812
  static cardBindingOf(args, offers) {
860
- const isWholeTool = (o) => o.kind === "single" && o.match === "tool";
861
- if (offers.length > 0 && offers.every(isWholeTool))
862
- return "";
863
- if (offers.some(isWholeTool))
864
- return undefined;
813
+ const valueOffers = offers.filter((o) => o.kind === "single" && CARD_RULE_FORM_OF_MATCH[o.match] !== "command");
814
+ if (valueOffers.length > 0)
815
+ return valueOffers.length === 1 && offers.length === 1 ? valueOffers[0].command : undefined;
865
816
  if (args === null || typeof args !== "object" || Array.isArray(args))
866
817
  return undefined;
867
818
  const command = args.command;
@@ -878,7 +829,7 @@ export class ToolApprovalCoordinator {
878
829
  if (!Array.isArray(rawOffers) || rawOffers.length === 0)
879
830
  return undefined;
880
831
  const capped = rawOffers.length > MAX_RULE_OFFERS ? rawOffers.slice(0, MAX_RULE_OFFERS) : rawOffers;
881
- const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped);
832
+ const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped, req.toolName);
882
833
  if (offers === undefined)
883
834
  return undefined;
884
835
  const command = ToolApprovalCoordinator.cardBindingOf(req.args, offers);
@@ -1221,15 +1172,9 @@ export class ToolApprovalCoordinator {
1221
1172
  emitRevokeTo(ctxs, frame) {
1222
1173
  if (frame.askIds.length === 0)
1223
1174
  return;
1224
- for (const c of ctxs) {
1225
- if (!c.emitRevoke)
1226
- continue;
1227
- try {
1228
- void Promise.resolve(c.emitRevoke(frame)).catch(() => undefined);
1229
- }
1230
- catch {
1231
- }
1232
- }
1175
+ for (const c of ctxs)
1176
+ if (c.family === "approval_request")
1177
+ void deliverHitlNotice(c.transport, frame);
1233
1178
  }
1234
1179
  emitRevoke(frame, target) {
1235
1180
  const targets = new Set();
@@ -1580,6 +1525,7 @@ export class ToolApprovalCoordinator {
1580
1525
  const allowedP = new Promise((resolve) => { resolveAllowed = resolve; });
1581
1526
  let lastOutcome = SETTLE_OUTCOME.EXPIRED;
1582
1527
  let lastCause;
1528
+ let completeFrame;
1583
1529
  const abortListeners = [];
1584
1530
  let selfEntry;
1585
1531
  let hostSettled;
@@ -1643,8 +1589,10 @@ export class ToolApprovalCoordinator {
1643
1589
  }
1644
1590
  lastOutcome = outcome;
1645
1591
  lastCause = verdict.by === "system" ? verdict.cause : undefined;
1646
- if (lastLiveRegistration && askId !== undefined) {
1647
- this.notifyPresentedCardWatchers(askId, buildApprovalCompleteFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, outcome, ...(lastCause !== undefined ? { cause: lastCause } : {}), parked: parkRouted, nowMs: Date.now() }));
1592
+ if (askId !== undefined) {
1593
+ completeFrame = buildApprovalCompleteFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, outcome, ...(lastCause !== undefined ? { cause: lastCause } : {}), parked: parkRouted, nowMs: Date.now() });
1594
+ if (lastLiveRegistration)
1595
+ this.notifyPresentedCardWatchers(askId, completeFrame);
1648
1596
  }
1649
1597
  releaseAdmission();
1650
1598
  if (selfEntry)
@@ -1949,6 +1897,7 @@ export class ToolApprovalCoordinator {
1949
1897
  forceParkNow,
1950
1898
  settleParkRoute: (cause) => settleParkRouteIfUnsettled(undefined, cause),
1951
1899
  owner: origin.owner,
1900
+ ownerReadSeq: this.rowReadSeq,
1952
1901
  ...(primary ? { ctxTaskId: primary.taskId, originCtx: primary } : {}),
1953
1902
  ...(reachability === "unreached" ? { suspended: true } : {}),
1954
1903
  ...(child ? { originTaskId: req.sourceSessionId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
@@ -2011,38 +1960,24 @@ export class ToolApprovalCoordinator {
2011
1960
  frame.serverNowMs = serverNowMs;
2012
1961
  frame.expiresInMs = Math.max(0, persistedExpiresAtMs - serverNowMs);
2013
1962
  }
2014
- const emitOne = async (c) => {
2015
- let family;
2016
- let send;
2017
- if (c.emitCard !== undefined) {
2018
- if (cardFrame === undefined) {
2019
- defaultLogger.warn("approval card leg cannot present this ask: it has no confirmed durable identity (no approval_request frame is minted without one)", {
2020
- taskId: origin.taskId,
2021
- approvalId: wireApprovalId,
2022
- toolName: req.toolName,
2023
- });
2024
- return { delivered: false };
2025
- }
2026
- family = "approval_request";
2027
- send = () => c.emitCard(cardFrame, id);
2028
- }
2029
- else {
2030
- family = "tool_approval";
2031
- send = () => c.emit(frame);
2032
- }
2033
- try {
2034
- await send();
2035
- return { delivered: true };
2036
- }
2037
- catch (err) {
2038
- defaultLogger.warn("approval_card_delivery_failed", { taskId: origin.taskId, approvalId: wireApprovalId, family, errKind: errorKindOf(err) });
2039
- return { delivered: false };
2040
- }
2041
- };
2042
- const openByCtx = new Map(aliveCtxs.map((c) => [c, emitOne(c)]));
1963
+ const cardCtxs = aliveCtxs.filter((c) => c.family === "approval_request");
1964
+ const legacyCtxs = aliveCtxs.filter((c) => c.family === "tool_approval");
1965
+ if (cardFrame === undefined && cardCtxs.length > 0) {
1966
+ defaultLogger.warn("approval card leg cannot present this ask: it has no confirmed durable identity (no approval_request frame is minted without one)", {
1967
+ taskId: origin.taskId,
1968
+ approvalId: wireApprovalId,
1969
+ toolName: req.toolName,
1970
+ });
1971
+ }
1972
+ const cardRace = cardFrame !== undefined && cardCtxs.length > 0
1973
+ ? createHitlOpenRace({ targets: cardCtxs.map((c) => ({ transport: c.transport, frame: cardFrame })), settled: allowedP })
1974
+ : undefined;
1975
+ const legacyRace = legacyCtxs.length > 0 ? createHitlOpenRace({ targets: legacyCtxs.map((c) => ({ transport: c.transport, frame })), settled: allowedP }) : undefined;
1976
+ if (cardRace !== undefined && cardFrame !== undefined)
1977
+ cardCtxs.forEach((c, i) => this.notePresentedCardRegistration(cardFrame.askId, c.transport, cardRace.acceptedLive(i)));
2043
1978
  const emitAllP = (async () => {
2044
- const results = await Promise.all(openByCtx.values());
2045
- const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) || results.some((r) => r.delivered);
1979
+ const landings = await Promise.all([cardRace?.landing, legacyRace?.landing]);
1980
+ const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) || landings.includes("delivered");
2046
1981
  emitSettled = true;
2047
1982
  if (!anySucceeded && !done) {
2048
1983
  if (this.askStore && askId !== undefined && batchId !== undefined) {
@@ -2083,35 +2018,15 @@ export class ToolApprovalCoordinator {
2083
2018
  })();
2084
2019
  await Promise.race([emitAllP, allowedP]);
2085
2020
  const settled = await allowedP;
2086
- for (const c of aliveCtxs) {
2087
- void openByCtx
2088
- .get(c)
2089
- .then(({ delivered }) => {
2090
- if (!delivered)
2091
- return undefined;
2092
- if (c.emitCard !== undefined) {
2093
- if (cardFrame === undefined)
2094
- return undefined;
2095
- return c.emitCard(buildApprovalCompleteFrame({
2096
- askId: cardFrame.askId,
2097
- taskId: cardFrame.taskId,
2098
- approvalId: wireApprovalId,
2099
- outcome: lastOutcome,
2100
- ...(lastCause !== undefined ? { cause: lastCause } : {}),
2101
- parked: parkRouted,
2102
- nowMs: Date.now(),
2103
- }), id);
2104
- }
2105
- return c.emit({
2106
- type: "tool_approval_complete",
2107
- approvalId: wireApprovalId,
2108
- outcome: lastOutcome,
2109
- ...(lastCause !== undefined ? { cause: lastCause } : {}),
2110
- ...(parkRouted ? { parked: true } : {}),
2111
- });
2112
- })
2113
- .catch(() => undefined);
2114
- }
2021
+ if (cardRace !== undefined && completeFrame !== undefined)
2022
+ cardRace.close(completeFrame);
2023
+ legacyRace?.close({
2024
+ type: "tool_approval_complete",
2025
+ approvalId: wireApprovalId,
2026
+ outcome: lastOutcome,
2027
+ ...(lastCause !== undefined ? { cause: lastCause } : {}),
2028
+ ...(parkRouted ? { parked: true } : {}),
2029
+ });
2115
2030
  if (emitFailed)
2116
2031
  return this.unattendedOutcome({ arm: "emit_failed", taskId: origin.taskId, ...(origin.owner !== null ? { owner: origin.owner } : {}), toolName: req.toolName, reachability });
2117
2032
  if (windowRouteUnavailable)
@@ -2130,7 +2045,7 @@ export class ToolApprovalCoordinator {
2130
2045
  const entry = this.liveEntryFor(id);
2131
2046
  if (entry?.adopted === true)
2132
2047
  return this.respondByRow(entry, id, principal, parsed, httpReq);
2133
- if (entry !== undefined && askOwnerAdmits(entry.owner, principal))
2048
+ if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal))
2134
2049
  return this.answerRegistration(entry, entry.owner, id, principal, parsed, httpReq);
2135
2050
  if (entry !== undefined && this.registrationHasRow(entry))
2136
2051
  return this.respondByRow(entry, id, principal, parsed, httpReq);
@@ -2142,10 +2057,13 @@ export class ToolApprovalCoordinator {
2142
2057
  async respondByRow(entry, id, principal, parsed, httpReq) {
2143
2058
  const store = this.askStore;
2144
2059
  if (!store)
2145
- return this.notPending();
2060
+ return this.askNotVisible();
2061
+ const readSeq = this.nextRowReadSeq();
2146
2062
  const row = rowOrUnknown(await this.askRowFor(store, id, "getAsk(respond-by-row)"));
2063
+ if (row?.state === "STREAM_PENDING")
2064
+ this.followRowOwner(row.askId, row.owner, readSeq);
2147
2065
  if (!askRowVisibleTo(row, principal))
2148
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2066
+ return this.askNotVisible();
2149
2067
  if (row.state !== "STREAM_PENDING")
2150
2068
  return this.dispatchRowTruth(row, id, parsed, httpReq, principal);
2151
2069
  return this.answerRegistration(entry, row.owner, id, principal, parsed, httpReq);
@@ -2237,31 +2155,37 @@ export class ToolApprovalCoordinator {
2237
2155
  }),
2238
2156
  };
2239
2157
  }
2158
+ askNotVisible() {
2159
+ return { status: 404, body: refusalBody({ errorCode: "not_found.ask", message: "no such approval ask (never existed, no longer kept, or not yours)" }) };
2160
+ }
2240
2161
  readApproval(id, principal) {
2241
2162
  const entry = this.liveEntryFor(id);
2242
2163
  if (entry !== undefined && this.registrationHasRow(entry))
2243
2164
  return this.readByRow(entry, id, principal);
2244
- if (entry !== undefined && askOwnerAdmits(entry.owner, principal)) {
2165
+ if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal)) {
2245
2166
  const body = { state: "pending", ...livePendingRowOf(entry) };
2246
2167
  return { status: 200, body };
2247
2168
  }
2248
2169
  const store = this.askStore;
2249
2170
  if (!store)
2250
- return this.notPending();
2171
+ return this.askNotVisible();
2251
2172
  return this.readAskRowState(store, id, principal);
2252
2173
  }
2253
2174
  async readByRow(entry, id, principal) {
2254
2175
  const store = this.askStore;
2255
2176
  if (!store)
2256
- return this.notPending();
2177
+ return this.askNotVisible();
2178
+ const readSeq = this.nextRowReadSeq();
2257
2179
  const read = await this.askRowFor(store, id, "getAsk(read-by-row)");
2258
2180
  if (read.kind === "unreadable") {
2259
- if (entry.adopted === true || !askOwnerAdmits(entry.owner, principal))
2260
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2181
+ if (entry.adopted === true || !askOwnerAdmitsAnswer(entry.owner, principal))
2182
+ return this.askNotVisible();
2261
2183
  const body = { state: "pending", ...livePendingRowOf(entry) };
2262
2184
  return { status: 200, body };
2263
2185
  }
2264
2186
  const row = rowOrUnknown(read);
2187
+ if (row?.state === "STREAM_PENDING")
2188
+ this.followRowOwner(row.askId, row.owner, readSeq);
2265
2189
  if (askRowVisibleTo(row, principal) && row.state === "STREAM_PENDING") {
2266
2190
  const body = { state: "pending", ...livePendingRowOf(entry) };
2267
2191
  return { status: 200, body };
@@ -2274,18 +2198,22 @@ export class ToolApprovalCoordinator {
2274
2198
  async readParkedGate(row) {
2275
2199
  const gate = this.parkedGate;
2276
2200
  if (gate === undefined || row.gateToken === null)
2277
- return { kind: "open" };
2201
+ return undefined;
2278
2202
  try {
2279
2203
  return await this.withStoreDeadline(gate({ gateToken: row.gateToken, gateBoundCallId: row.gateBoundCallId }), "readParkedGate", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2280
2204
  }
2281
2205
  catch (err) {
2282
2206
  this.noteStoreError(err, "readParkedGate");
2283
- return { kind: "open" };
2207
+ return undefined;
2284
2208
  }
2285
2209
  }
2210
+ async openGateGeneration(row) {
2211
+ const gate = await this.readParkedGate(row);
2212
+ return gate?.kind === "open" ? gate.generation : undefined;
2213
+ }
2286
2214
  async readStateOfRow(row, principal) {
2287
2215
  if (!askRowVisibleTo(row, principal))
2288
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2216
+ return this.askNotVisible();
2289
2217
  const projection = buildAskRowReadProjection(row, Date.now());
2290
2218
  let body;
2291
2219
  switch (row.state) {
@@ -2298,13 +2226,13 @@ export class ToolApprovalCoordinator {
2298
2226
  }
2299
2227
  case "PARKING":
2300
2228
  case "PARKED": {
2301
- const gate = row.state === "PARKED" ? await this.readParkedGate(row) : { kind: "open" };
2229
+ const gate = row.state === "PARKED" ? await this.readParkedGate(row) : undefined;
2230
+ if (gate === undefined || gate.kind === "open") {
2231
+ const parkSession = parkSessionOf(row);
2232
+ body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate?.reopened !== undefined ? { reopened: gate.reopened } : {}) };
2233
+ break;
2234
+ }
2302
2235
  switch (gate.kind) {
2303
- case "open": {
2304
- const parkSession = parkSessionOf(row);
2305
- body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate.reopened !== undefined ? { reopened: gate.reopened } : {}) };
2306
- break;
2307
- }
2308
2236
  case "decided":
2309
2237
  body = { state: "decided", ...projection, decision: gate.decision, decidedAtMs: gate.decidedAtMs, ...(gate.decisionNote !== undefined ? { decisionNote: gate.decisionNote } : {}) };
2310
2238
  break;
@@ -2347,11 +2275,11 @@ export class ToolApprovalCoordinator {
2347
2275
  respondLate(id, principal, parsed, httpReq) {
2348
2276
  const store = this.askStore;
2349
2277
  if (!store)
2350
- return this.notPending();
2278
+ return this.askNotVisible();
2351
2279
  return this.dispatchLateByRow(store, id, parsed, httpReq, principal);
2352
2280
  }
2353
- watchPresentedCards(askIds, deliver) {
2354
- const watcher = { deliver, askIds: new Set() };
2281
+ watchPresentedCards(askIds, deliver, connection) {
2282
+ const watcher = { deliver, connection, askIds: new Set(), registrationsOnConnection: new Map() };
2355
2283
  for (const askId of askIds) {
2356
2284
  if (!this.pendingByAskId.has(askId))
2357
2285
  continue;
@@ -2367,13 +2295,26 @@ export class ToolApprovalCoordinator {
2367
2295
  for (const askId of watcher.askIds)
2368
2296
  this.dropPresentedCardWatcher(askId, watcher);
2369
2297
  watcher.askIds.clear();
2298
+ watcher.registrationsOnConnection.clear();
2370
2299
  };
2371
2300
  }
2301
+ notePresentedCardRegistration(askId, transport, acceptedLive) {
2302
+ for (const watcher of this.presentedCardWatchers.get(askId) ?? []) {
2303
+ if (watcher.connection() !== transport)
2304
+ continue;
2305
+ const opens = watcher.registrationsOnConnection.get(askId);
2306
+ if (opens === undefined)
2307
+ watcher.registrationsOnConnection.set(askId, [acceptedLive]);
2308
+ else
2309
+ opens.push(acceptedLive);
2310
+ }
2311
+ }
2372
2312
  dropPresentedCardWatcher(askId, watcher) {
2373
2313
  const set = this.presentedCardWatchers.get(askId);
2374
2314
  if (set === undefined)
2375
2315
  return;
2376
2316
  set.delete(watcher);
2317
+ watcher.registrationsOnConnection.delete(askId);
2377
2318
  if (set.size === 0)
2378
2319
  this.presentedCardWatchers.delete(askId);
2379
2320
  }
@@ -2384,12 +2325,20 @@ export class ToolApprovalCoordinator {
2384
2325
  this.presentedCardWatchers.delete(askId);
2385
2326
  for (const watcher of set) {
2386
2327
  watcher.askIds.delete(askId);
2387
- try {
2388
- watcher.deliver(frame);
2389
- }
2390
- catch (err) {
2391
- defaultLogger.warn("presented-card completion notice could not be written to its connection", { askId, error: err instanceof Error ? err.message : String(err) });
2392
- }
2328
+ const opens = watcher.registrationsOnConnection.get(askId) ?? [];
2329
+ watcher.registrationsOnConnection.delete(askId);
2330
+ const write = () => {
2331
+ try {
2332
+ watcher.deliver(frame);
2333
+ }
2334
+ catch (err) {
2335
+ defaultLogger.warn("presented-card completion notice could not be written to its connection", { askId, error: err instanceof Error ? err.message : String(err) });
2336
+ }
2337
+ };
2338
+ if (opens.length === 0)
2339
+ write();
2340
+ else
2341
+ void Promise.all(opens).then((accepted) => (accepted.includes(true) ? undefined : write()));
2393
2342
  }
2394
2343
  }
2395
2344
  liveEntryFor(id) {
@@ -2415,10 +2364,7 @@ export class ToolApprovalCoordinator {
2415
2364
  }
2416
2365
  async dispatchRowTruth(row, id, parsed, httpReq, principal) {
2417
2366
  if (!askRowVisibleTo(row, principal))
2418
- return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
2419
- const receipt = this.lookupParkRedemption(row.askId);
2420
- if (receipt?.redeemed !== undefined)
2421
- return this.replayRedeemReceipt(id, receipt, row, receipt.redeemed, parsed);
2367
+ return this.askNotVisible();
2422
2368
  switch (row.state) {
2423
2369
  case "DECIDED":
2424
2370
  return this.replayDecidedAsk(id, row, parsed);
@@ -2478,7 +2424,6 @@ export class ToolApprovalCoordinator {
2478
2424
  askId: row.askId,
2479
2425
  idempotent: true,
2480
2426
  ...decided,
2481
- ...(parsed.value === "allow_session" ? { rememberApplied: false } : {}),
2482
2427
  ...noteRecordedReceipt(parsed.note, noteLandedOnRow(parsed.note, row.decisionNote)),
2483
2428
  ...this.lateRuleRefusal(parsed),
2484
2429
  },
@@ -2492,14 +2437,17 @@ export class ToolApprovalCoordinator {
2492
2437
  defaultLogger.error("tool approval parked row carries no gate token — nothing to redeem", { askId: row.askId });
2493
2438
  return this.notPending();
2494
2439
  }
2440
+ const openGenerationNow = this.lookupParkRedemption(row.askId) !== undefined ? await this.openGateGeneration(row) : undefined;
2495
2441
  const prior = this.lookupParkRedemption(row.askId);
2496
- if (prior?.redeemed !== undefined)
2442
+ if (prior?.redeemed !== undefined && receiptAnswersNow(prior.redeemed.gateGeneration, openGenerationNow))
2497
2443
  return this.replayRedeemReceipt(id, prior, row, prior.redeemed, parsed);
2498
2444
  if (prior?.inflight !== undefined) {
2499
2445
  const shared = await prior.inflight;
2500
2446
  if (shared.status < 200 || shared.status >= 300)
2501
2447
  return shared;
2502
- return this.replayRedeemReceipt(id, prior, row, { decision: shared.decision, body: shared.body, ...(shared.rule?.terminal === true ? { rule: shared.rule.body } : {}) }, parsed);
2448
+ if (!receiptAnswersNow(shared.gateGeneration, openGenerationNow))
2449
+ return this.redeemParkedAsk(id, row, parsed, httpReq, principal);
2450
+ return this.replayRedeemReceipt(id, prior, row, { decision: shared.decision, body: shared.body, gateGeneration: shared.gateGeneration, ...(shared.rule?.terminal === true ? { rule: shared.rule.body } : {}) }, parsed);
2503
2451
  }
2504
2452
  const admission = this.parkRedemptionAdmission(row.owner);
2505
2453
  if (admission !== undefined)
@@ -2519,6 +2467,7 @@ export class ToolApprovalCoordinator {
2519
2467
  ...(parsed.note !== undefined ? { note: parsed.note } : {}),
2520
2468
  decider: parsed.decider,
2521
2469
  ...(parsed.updatedInput !== undefined && parsed.value !== "deny" ? { updatedInput: parsed.updatedInput } : {}),
2470
+ ...(parsed.value === "allow_session" ? { remember: "session" } : {}),
2522
2471
  ...(principal !== undefined ? { principal } : {}),
2523
2472
  ...(httpReq !== undefined ? { httpReq } : {}),
2524
2473
  });
@@ -2547,7 +2496,7 @@ export class ToolApprovalCoordinator {
2547
2496
  }
2548
2497
  const rule = out.rule;
2549
2498
  if (this.retainParkRedemption(row.askId, memo))
2550
- memo.redeemed = { decision, body: out.body, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
2499
+ memo.redeemed = { decision, body: out.body, gateGeneration: out.gateGeneration, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
2551
2500
  return {
2552
2501
  status: out.status,
2553
2502
  body: {
@@ -2555,7 +2504,7 @@ export class ToolApprovalCoordinator {
2555
2504
  approvalId: id,
2556
2505
  askId: row.askId,
2557
2506
  accepted: "parked_redeemed",
2558
- ...(parsed.value === "allow_session" ? { rememberApplied: false } : {}),
2507
+ ...(parsed.value === "allow_session" ? { rememberApplied: out.rememberApplied === true } : {}),
2559
2508
  ...(rule?.body ?? {}),
2560
2509
  },
2561
2510
  };
@@ -2667,7 +2616,6 @@ export class ToolApprovalCoordinator {
2667
2616
  accepted: "parked_redeemed",
2668
2617
  idempotent: true,
2669
2618
  decision: receipt.decision === "approve" ? "allow" : "deny",
2670
- ...(parsed.value === "allow_session" ? { rememberApplied: false } : {}),
2671
2619
  ...(rule ?? {}),
2672
2620
  },
2673
2621
  };
@@ -2777,17 +2725,33 @@ export class ToolApprovalCoordinator {
2777
2725
  this.noteStoreError(err, "decideAsk");
2778
2726
  ruleEligibility.eligible = false;
2779
2727
  try {
2728
+ const confirmSeq = this.nextRowReadSeq();
2780
2729
  const row = await this.withStoreDeadline(askStore.getAsk(askId), "getAsk(decideAsk-confirm)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2781
- if (row !== null && !askRowCarriesOwner(row, owner))
2730
+ if (row?.state === "STREAM_PENDING")
2731
+ this.followRowOwner(askId, row.owner, confirmSeq);
2732
+ if (row === null || !askRowCarriesOwner(row, owner))
2782
2733
  return { lost: true, row: null };
2783
- if (row?.state === "DECIDED" && row.decision === (parsed.value === "deny" ? "deny" : "approve")) {
2734
+ if (row.state === "DECIDED" && row.decision === (parsed.value === "deny" ? "deny" : "approve")) {
2784
2735
  winnerRow = row;
2785
2736
  ambiguousConfirmedRow = row;
2786
2737
  noteLanded = noteLandedOnRow(parsed.note, row.decisionNote);
2787
2738
  }
2739
+ else if (row.state !== "STREAM_PENDING") {
2740
+ return { lost: true, row };
2741
+ }
2788
2742
  }
2789
2743
  catch (confirmErr) {
2790
2744
  this.noteStoreError(confirmErr, "getAsk(decideAsk-confirm)");
2745
+ return {
2746
+ lost: false,
2747
+ result: {
2748
+ status: 500,
2749
+ body: refusalBody({
2750
+ errorCode: "internal.error",
2751
+ 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",
2752
+ }),
2753
+ },
2754
+ };
2791
2755
  }
2792
2756
  }
2793
2757
  const wantAllowed = parsed.value !== "deny";
@@ -2840,14 +2804,16 @@ export class ToolApprovalCoordinator {
2840
2804
  this.allowAllSessions.add(sessionAllowKey(judgedOwner, entry.sessionId, sessionAllowCategory(entry.toolName), entry.grantBinding));
2841
2805
  }
2842
2806
  const allowed = parsed.value !== "deny";
2843
- const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput, source: liveHostSource(parsed.decider) };
2807
+ const settleArgs = opts?.settleOutcome !== undefined
2808
+ ? settleArgsOfDecided(opts.settleOutcome)
2809
+ : { allowed, updatedInput: parsed.updatedInput, source: liveHostSource(parsed.decider), ...(!allowed && parsed.note !== undefined ? { denyReason: parsed.note } : {}) };
2844
2810
  const readRootGrant = opts?.settleOutcome === undefined || opts.settleOutcomeIsThisRequest === true ? parsed.readRootGrant : undefined;
2845
2811
  entry.settle({
2846
2812
  by: "human",
2847
2813
  allowed: settleArgs.allowed,
2848
2814
  updatedInput: settleArgs.updatedInput,
2849
2815
  ...(settleArgs.source !== undefined ? { hostSource: settleArgs.source } : {}),
2850
- ...(!settleArgs.allowed && parsed.note !== undefined ? { denyReason: parsed.note } : {}),
2816
+ ...(settleArgs.denyReason !== undefined ? { denyReason: settleArgs.denyReason } : {}),
2851
2817
  ...(readRootGrant !== undefined ? { readRootGrant } : {}),
2852
2818
  });
2853
2819
  const updatedInputDelivered = opts?.updatedInputDelivered ?? true;
@@ -2935,6 +2901,7 @@ export class ToolApprovalCoordinator {
2935
2901
  forceParkNow: release,
2936
2902
  settleParkRoute: (cause) => leave({ outcome: SETTLE_OUTCOME.EXPIRED, cause, parked: this.unattendedRoutesToPark }),
2937
2903
  owner: row.owner,
2904
+ ownerReadSeq: this.rowReadSeq,
2938
2905
  executionLane: row.executionLane,
2939
2906
  ...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
2940
2907
  ...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
@@ -2968,10 +2935,42 @@ export class ToolApprovalCoordinator {
2968
2935
  for (const watcher of watchers)
2969
2936
  watcher.askIds.delete(askId);
2970
2937
  }
2971
- followAdoptedOwner(askId, owner) {
2972
- for (const e of this.pendingByAskId.get(askId) ?? [])
2973
- if (e.adopted === true)
2974
- e.owner = owner;
2938
+ followRowOwner(askId, owner, readSeq) {
2939
+ for (const e of this.pendingByAskId.get(askId) ?? []) {
2940
+ if (e.ownerReadSeq >= readSeq)
2941
+ continue;
2942
+ e.owner = owner;
2943
+ e.ownerReadSeq = readSeq;
2944
+ }
2945
+ }
2946
+ rowReadSeq = 0;
2947
+ nextRowReadSeq() {
2948
+ this.rowReadSeq += 1;
2949
+ return this.rowReadSeq;
2950
+ }
2951
+ async followRowOwners() {
2952
+ const store = this.askStore;
2953
+ const out = { read: 0, followed: 0, unreadable: 0 };
2954
+ if (!store)
2955
+ return out;
2956
+ for (const askId of [...this.pendingByAskId.keys()]) {
2957
+ out.read += 1;
2958
+ const readSeq = this.nextRowReadSeq();
2959
+ let row;
2960
+ try {
2961
+ row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(follow-row-owners)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
2962
+ }
2963
+ catch (err) {
2964
+ this.noteStoreError(err, "getAsk(follow-row-owners)");
2965
+ out.unreadable += 1;
2966
+ continue;
2967
+ }
2968
+ if (row?.state !== "STREAM_PENDING")
2969
+ continue;
2970
+ this.followRowOwner(askId, row.owner, readSeq);
2971
+ out.followed += 1;
2972
+ }
2973
+ return out;
2975
2974
  }
2976
2975
  waitingRegistrationCount(askId) {
2977
2976
  let n = 0;
@@ -3047,6 +3046,7 @@ export class ToolApprovalCoordinator {
3047
3046
  else
3048
3047
  this.adoptedPollOffset = adoptedStart + ++polledAdopted;
3049
3048
  let row;
3049
+ const readSeq = this.nextRowReadSeq();
3050
3050
  try {
3051
3051
  row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(poll-suspended)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
3052
3052
  }
@@ -3059,7 +3059,7 @@ export class ToolApprovalCoordinator {
3059
3059
  continue;
3060
3060
  }
3061
3061
  if (row.state === "STREAM_PENDING") {
3062
- this.followAdoptedOwner(askId, row.owner);
3062
+ this.followRowOwner(askId, row.owner, readSeq);
3063
3063
  continue;
3064
3064
  }
3065
3065
  if (this.editedDecisionInFlight(askId))