@sema-agent/core 7.51.2 → 7.53.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 (446) hide show
  1. package/CHANGELOG.md +698 -2
  2. package/README.md +3 -1
  3. package/dist/agents/agent-transcript-tool.d.ts +1 -1
  4. package/dist/agents/cascade.js +4 -0
  5. package/dist/agents/cross-session-envelope.d.ts +8 -0
  6. package/dist/agents/cross-session-envelope.js +6 -0
  7. package/dist/agents/cross-session-judge.d.ts +21 -1
  8. package/dist/agents/cross-session-judge.js +8 -0
  9. package/dist/agents/cross-session-ref.d.ts +5 -0
  10. package/dist/agents/cross-session-ref.js +1 -0
  11. package/dist/agents/cumulative-stats.d.ts +3 -0
  12. package/dist/agents/cumulative-stats.js +3 -0
  13. package/dist/agents/list-agents-tool.d.ts +1 -1
  14. package/dist/agents/org-delivery-gate.d.ts +122 -0
  15. package/dist/agents/org-delivery-gate.js +69 -0
  16. package/dist/agents/peer-held-queue.d.ts +9 -4
  17. package/dist/agents/peer-held-queue.js +6 -5
  18. package/dist/agents/peer-session-drain.d.ts +35 -5
  19. package/dist/agents/peer-session-drain.js +271 -180
  20. package/dist/agents/read-inbox-tool.d.ts +8 -1
  21. package/dist/agents/read-inbox-tool.js +5 -1
  22. package/dist/agents/repair-loop.js +4 -0
  23. package/dist/agents/send-message-tool.d.ts +11 -16
  24. package/dist/agents/send-message-tool.js +11 -13
  25. package/dist/agents/subagent.d.ts +3 -0
  26. package/dist/agents/subagent.js +105 -76
  27. package/dist/agents/tool-filter.d.ts +58 -13
  28. package/dist/agents/tool-filter.js +34 -14
  29. package/dist/bench/metrics.d.ts +1 -0
  30. package/dist/brain/anthropic.d.ts +6 -1
  31. package/dist/brain/anthropic.js +17 -13
  32. package/dist/brain/model-presets.d.ts +4 -5
  33. package/dist/brain/model-presets.js +6 -5
  34. package/dist/brain/open-responses.js +16 -12
  35. package/dist/brain/openai.js +16 -12
  36. package/dist/brain/request-params.d.ts +12 -33
  37. package/dist/brain/request-params.js +5 -2
  38. package/dist/brain/request-route.d.ts +9 -8
  39. package/dist/brain/request-route.js +1 -0
  40. package/dist/brain/route-adjudicator.d.ts +123 -47
  41. package/dist/brain/route-adjudicator.js +171 -42
  42. package/dist/brain/route-conformance.js +2 -2
  43. package/dist/brain/routing.d.ts +24 -1
  44. package/dist/brain/routing.js +54 -19
  45. package/dist/brain/status-sink.d.ts +18 -0
  46. package/dist/brain/status-sink.js +7 -0
  47. package/dist/brain/timeout.js +5 -4
  48. package/dist/core/a2a.d.ts +5 -2
  49. package/dist/core/a2a.js +30 -13
  50. package/dist/core/allow-entry.d.ts +42 -9
  51. package/dist/core/allow-entry.js +25 -18
  52. package/dist/core/auto-compaction.d.ts +80 -20
  53. package/dist/core/auto-compaction.js +65 -18
  54. package/dist/core/auto-promote.d.ts +2 -1
  55. package/dist/core/auto-promote.js +2 -2
  56. package/dist/core/caller-tool-name.d.ts +9 -0
  57. package/dist/core/caller-tool-name.js +13 -0
  58. package/dist/core/checkpoint-requirements.d.ts +7 -1
  59. package/dist/core/checkpoint-requirements.js +2 -0
  60. package/dist/core/checkpoint-store.d.ts +57 -24
  61. package/dist/core/checkpoint-store.js +3 -3
  62. package/dist/core/child-clamp-seats.d.ts +6 -0
  63. package/dist/core/child-clamp-seats.js +2 -1
  64. package/dist/core/compliance.js +3 -1
  65. package/dist/core/credential-vocabulary.d.ts +33 -8
  66. package/dist/core/credential-vocabulary.js +32 -7
  67. package/dist/core/decision-receipt.d.ts +2 -2
  68. package/dist/core/delegation-frames.d.ts +9 -2
  69. package/dist/core/delegation-name.d.ts +18 -0
  70. package/dist/core/delegation-name.js +47 -0
  71. package/dist/core/effective-path-target.d.ts +25 -6
  72. package/dist/core/effective-path-target.js +24 -2
  73. package/dist/core/engine-capabilities.d.ts +8 -1
  74. package/dist/core/engine-capabilities.js +1 -1
  75. package/dist/core/engine-notice.d.ts +49 -21
  76. package/dist/core/frontmatter-fence.d.ts +10 -0
  77. package/dist/core/frontmatter-fence.js +6 -0
  78. package/dist/core/gate-fold.js +8 -25
  79. package/dist/core/gate-lanes.js +358 -274
  80. package/dist/core/gate-outcome.d.ts +11 -6
  81. package/dist/core/governance-codes.d.ts +11 -4
  82. package/dist/core/governance-codes.js +12 -3
  83. package/dist/core/hands-band-screen.d.ts +7 -0
  84. package/dist/core/hands-band-screen.js +32 -0
  85. package/dist/core/hooks.d.ts +283 -739
  86. package/dist/core/hooks.js +100 -193
  87. package/dist/{tools/fs → core}/image-admission.d.ts +21 -3
  88. package/dist/{tools/fs → core}/image-admission.js +24 -6
  89. package/dist/core/locked-config.d.ts +84 -32
  90. package/dist/core/locked-config.js +128 -42
  91. package/dist/core/mcp-connection-pool.d.ts +4 -1
  92. package/dist/core/mcp-connection-pool.js +7 -2
  93. package/dist/core/mcp-probe.d.ts +12 -9
  94. package/dist/core/mcp-probe.js +3 -3
  95. package/dist/core/mcp-server-spec.d.ts +104 -10
  96. package/dist/core/mcp-server-spec.js +183 -33
  97. package/dist/core/mcp.d.ts +31 -20
  98. package/dist/core/mcp.js +66 -56
  99. package/dist/core/memory-engine/data-plane.js +5 -1
  100. package/dist/core/memory-engine/distiller.js +16 -2
  101. package/dist/core/memory-engine/engine.d.ts +22 -30
  102. package/dist/core/memory-engine/engine.js +16 -10
  103. package/dist/core/memory-engine/frontmatter.d.ts +6 -0
  104. package/dist/core/memory-engine/frontmatter.js +19 -16
  105. package/dist/core/memory.d.ts +2 -2
  106. package/dist/core/mode-policy.d.ts +5 -16
  107. package/dist/core/mode-policy.js +7 -19
  108. package/dist/core/model-seat.d.ts +4 -1
  109. package/dist/core/mods/dollar.d.ts +109 -0
  110. package/dist/core/mods/dollar.js +154 -0
  111. package/dist/core/mods/host.d.ts +23 -0
  112. package/dist/core/mods/host.js +21 -0
  113. package/dist/core/mods/kernel/budget.d.ts +43 -0
  114. package/dist/core/mods/kernel/budget.js +83 -0
  115. package/dist/core/mods/kernel/dispatch.d.ts +100 -0
  116. package/dist/core/mods/kernel/dispatch.js +699 -0
  117. package/dist/core/mods/kernel/events.d.ts +245 -0
  118. package/dist/core/mods/kernel/events.js +210 -0
  119. package/dist/core/mods/kernel/index.d.ts +6 -0
  120. package/dist/core/mods/kernel/index.js +5 -0
  121. package/dist/core/mods/kernel/receive.d.ts +94 -0
  122. package/dist/core/mods/kernel/receive.js +188 -0
  123. package/dist/core/mods/kernel/registration.d.ts +131 -0
  124. package/dist/core/mods/kernel/registration.js +102 -0
  125. package/dist/core/mods/kernel/site-rules.d.ts +149 -0
  126. package/dist/core/mods/kernel/site-rules.js +296 -0
  127. package/dist/core/mods/stations.d.ts +344 -0
  128. package/dist/core/mods/stations.js +437 -0
  129. package/dist/core/mounted-mcp.d.ts +57 -0
  130. package/dist/core/mounted-mcp.js +71 -2
  131. package/dist/core/own-property-receipt.d.ts +13 -0
  132. package/dist/core/own-property-receipt.js +13 -23
  133. package/dist/core/parent-spec-seat.d.ts +18 -7
  134. package/dist/core/parent-spec-seat.js +6 -2
  135. package/dist/core/path-identity.js +2 -1
  136. package/dist/core/permission-rule-model.d.ts +58 -9
  137. package/dist/core/permission-rule-model.js +81 -7
  138. package/dist/core/permission-rule-org.d.ts +163 -33
  139. package/dist/core/permission-rule-org.js +205 -71
  140. package/dist/core/permission-rule-syntax.d.ts +15 -0
  141. package/dist/core/permission-rule-syntax.js +24 -16
  142. package/dist/core/permission-rules.d.ts +14 -2
  143. package/dist/core/permission-rules.js +63 -23
  144. package/dist/core/prompt-section-seat.d.ts +15 -27
  145. package/dist/core/prompt-section-seat.js +73 -40
  146. package/dist/core/protocol-http-auth.d.ts +3 -1
  147. package/dist/core/protocol-http-auth.js +2 -0
  148. package/dist/core/reminder-mint.d.ts +2 -2
  149. package/dist/core/remote-env.d.ts +24 -12
  150. package/dist/core/remote-env.js +1 -0
  151. package/dist/core/resume-startup-cause.d.ts +16 -1
  152. package/dist/core/resume-startup-cause.js +4 -1
  153. package/dist/core/retention.js +7 -2
  154. package/dist/core/retired-keys.d.ts +12 -2
  155. package/dist/core/retired-keys.js +15 -1
  156. package/dist/core/roles.js +60 -10
  157. package/dist/core/rule-lane-reads.js +1 -1
  158. package/dist/core/runner/announce-once-ledger.d.ts +31 -1
  159. package/dist/core/runner/announce-once-ledger.js +22 -0
  160. package/dist/core/runner/assemble-result.d.ts +9 -0
  161. package/dist/core/runner/assemble-result.js +3 -1
  162. package/dist/core/runner/call-hook-stations.d.ts +23 -27
  163. package/dist/core/runner/call-hook-stations.js +58 -42
  164. package/dist/core/runner/caller-stop-gate.d.ts +25 -0
  165. package/dist/core/runner/caller-stop-gate.js +7 -0
  166. package/dist/core/runner/compaction-seams.d.ts +8 -22
  167. package/dist/core/runner/compaction-seams.js +28 -53
  168. package/dist/core/runner/construction-doors.js +11 -1
  169. package/dist/core/runner/contracts.d.ts +86 -83
  170. package/dist/core/runner/credential-origin-seat.d.ts +2 -0
  171. package/dist/core/runner/credential-origin-seat.js +19 -0
  172. package/dist/core/runner/extra-body-dropped-seat.d.ts +2 -6
  173. package/dist/core/runner/gate-exit.d.ts +47 -36
  174. package/dist/core/runner/gate-exit.js +12 -5
  175. package/dist/core/runner/image.js +1 -2
  176. package/dist/core/runner/inline-image.js +1 -1
  177. package/dist/core/runner/mcp-redial.d.ts +52 -10
  178. package/dist/core/runner/mcp-redial.js +38 -9
  179. package/dist/core/runner/notice-seat-input.d.ts +11 -0
  180. package/dist/core/runner/notice-seat-input.js +1 -0
  181. package/dist/core/runner/permission-rule-lanes.d.ts +5 -2
  182. package/dist/core/runner/permission-rule-lanes.js +22 -10
  183. package/dist/core/runner/person-path-rows.d.ts +3 -1
  184. package/dist/core/runner/person-path-rows.js +3 -2
  185. package/dist/core/runner/prepare-acquire-reconcile.js +5 -1
  186. package/dist/core/runner/prepare-ask-lane.d.ts +5 -7
  187. package/dist/core/runner/prepare-ask-lane.js +6 -15
  188. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
  189. package/dist/core/runner/prepare-caps-and-workflow.js +25 -8
  190. package/dist/core/runner/prepare-config-doors.d.ts +52 -1
  191. package/dist/core/runner/prepare-config-doors.js +168 -143
  192. package/dist/core/runner/prepare-defer-classify.js +7 -11
  193. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  194. package/dist/core/runner/prepare-delegation-surface.js +7 -5
  195. package/dist/core/runner/prepare-gate-stations.d.ts +8 -11
  196. package/dist/core/runner/prepare-gate-stations.js +11 -10
  197. package/dist/core/runner/prepare-hands-readface.d.ts +1 -1
  198. package/dist/core/runner/prepare-hands-readface.js +2 -1
  199. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -12
  200. package/dist/core/runner/prepare-inherited-gate.js +10 -23
  201. package/dist/core/runner/prepare-listings.d.ts +1 -1
  202. package/dist/core/runner/prepare-listings.js +4 -2
  203. package/dist/core/runner/prepare-memory-engine-session.d.ts +0 -6
  204. package/dist/core/runner/prepare-memory-engine-session.js +20 -7
  205. package/dist/core/runner/prepare-memory.d.ts +3 -2
  206. package/dist/core/runner/prepare-memory.js +6 -2
  207. package/dist/core/runner/prepare-offload-wrappers.d.ts +4 -4
  208. package/dist/core/runner/prepare-offload-wrappers.js +2 -1
  209. package/dist/core/runner/prepare-park-ask.js +10 -14
  210. package/dist/core/runner/prepare-policy-chain.d.ts +17 -15
  211. package/dist/core/runner/prepare-policy-chain.js +104 -109
  212. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  213. package/dist/core/runner/prepare-project-context.js +11 -12
  214. package/dist/core/runner/prepare-prompt-assembly.d.ts +45 -40
  215. package/dist/core/runner/prepare-prompt-assembly.js +138 -101
  216. package/dist/core/runner/prepare-prompt-inputs.d.ts +28 -23
  217. package/dist/core/runner/prepare-prompt-inputs.js +11 -10
  218. package/dist/core/runner/prepare-protocol-tools.d.ts +11 -7
  219. package/dist/core/runner/prepare-protocol-tools.js +20 -13
  220. package/dist/core/runner/prepare-question-face.d.ts +4 -2
  221. package/dist/core/runner/prepare-question-face.js +4 -3
  222. package/dist/core/runner/prepare-safety-scan.js +6 -10
  223. package/dist/core/runner/prepare-suspend-saga.d.ts +6 -0
  224. package/dist/core/runner/prepare-suspend-saga.js +7 -5
  225. package/dist/core/runner/prepare-task.js +41 -23
  226. package/dist/core/runner/prepare-turn-wiring.d.ts +13 -15
  227. package/dist/core/runner/prepare-turn-wiring.js +29 -27
  228. package/dist/core/runner/prepare-wiring-manifest.d.ts +13 -9
  229. package/dist/core/runner/prepare-wiring-manifest.js +14 -11
  230. package/dist/core/runner/resume-admission.d.ts +4 -1
  231. package/dist/core/runner/resume-admission.js +7 -5
  232. package/dist/core/runner/resume-apply.d.ts +5 -2
  233. package/dist/core/runner/resume-apply.js +24 -42
  234. package/dist/core/runner/resume-checkpoint-screen.d.ts +1 -0
  235. package/dist/core/runner/resume-checkpoint-screen.js +9 -1
  236. package/dist/core/runner/resume-internals-and-config.d.ts +3 -3
  237. package/dist/core/runner/resume-internals-and-config.js +3 -8
  238. package/dist/core/runner/resume-preflight.js +38 -16
  239. package/dist/core/runner/retired-runner-deps.d.ts +5 -6
  240. package/dist/core/runner/retired-runner-deps.js +4 -5
  241. package/dist/core/runner/run-brain-sinks.d.ts +3 -2
  242. package/dist/core/runner/run-brain-sinks.js +5 -1
  243. package/dist/core/runner/run-compaction-machinery.d.ts +7 -1
  244. package/dist/core/runner/run-compaction-machinery.js +7 -33
  245. package/dist/core/runner/run-harness-handlers.js +4 -2
  246. package/dist/core/runner/run-identity-wiring.d.ts +3 -1
  247. package/dist/core/runner/run-identity-wiring.js +3 -2
  248. package/dist/core/runner/run-leg.js +103 -95
  249. package/dist/core/runner/run-notification-lane.js +1 -0
  250. package/dist/core/runner/run-recovery-lanes.d.ts +3 -0
  251. package/dist/core/runner/run-recovery-lanes.js +14 -11
  252. package/dist/core/runner/run-settle-and-teardown.js +9 -28
  253. package/dist/core/runner/run-stop-and-final-verify.js +18 -25
  254. package/dist/core/runner/run-terminal-adoption.d.ts +3 -0
  255. package/dist/core/runner/run-terminal-adoption.js +34 -22
  256. package/dist/core/runner/run-tool-mount-facts.js +5 -3
  257. package/dist/core/runner/run-turn-boundary.js +32 -37
  258. package/dist/core/runner/runtask.d.ts +6 -7
  259. package/dist/core/runner/runtask.js +15 -73
  260. package/dist/core/runner/session-rule-policy.d.ts +5 -5
  261. package/dist/core/runner/session-rule-policy.js +13 -8
  262. package/dist/core/runner/side-call-account.d.ts +68 -0
  263. package/dist/core/runner/side-call-account.js +61 -0
  264. package/dist/core/runner/skills-seat.d.ts +15 -0
  265. package/dist/core/runner/skills-seat.js +57 -0
  266. package/dist/core/runner/stream-halt-verbs.js +12 -17
  267. package/dist/core/runner/stream-lifecycle-verbs.js +8 -5
  268. package/dist/core/runner/stream-steer-verb.d.ts +1 -1
  269. package/dist/core/runner/stream-steer-verb.js +20 -38
  270. package/dist/core/runner/sub-agent-deny-lists.d.ts +124 -23
  271. package/dist/core/runner/sub-agent-deny-lists.js +230 -71
  272. package/dist/core/runner/synthetic-tools.d.ts +5 -2
  273. package/dist/core/runner/synthetic-tools.js +2 -12
  274. package/dist/core/runner/tool-end-body.d.ts +5 -6
  275. package/dist/core/runner/tool-end-body.js +6 -4
  276. package/dist/core/runner/tool-not-executed.d.ts +15 -0
  277. package/dist/core/runner/tool-not-executed.js +30 -0
  278. package/dist/core/runner/tool-occurrence.d.ts +8 -7
  279. package/dist/core/runner/tool-occurrence.js +5 -5
  280. package/dist/core/runner/tool-result-media-seat.d.ts +1 -1
  281. package/dist/core/runner-deps.d.ts +43 -36
  282. package/dist/core/safety-merge-corpus.js +18 -2
  283. package/dist/core/secret-env.d.ts +88 -20
  284. package/dist/core/secret-env.js +192 -38
  285. package/dist/core/session-policy-store.d.ts +71 -16
  286. package/dist/core/session-policy-store.js +138 -28
  287. package/dist/core/session-reconcile.d.ts +4 -0
  288. package/dist/core/session-reconcile.js +2 -1
  289. package/dist/core/shell-read-silence.js +3 -32
  290. package/dist/core/side-query.d.ts +5 -3
  291. package/dist/core/skill-grant.d.ts +3 -2
  292. package/dist/core/skill-grant.js +17 -9
  293. package/dist/core/skills-directory.d.ts +31 -11
  294. package/dist/core/skills-directory.js +655 -104
  295. package/dist/core/store-contracts/mailbox-store-contract.js +13 -0
  296. package/dist/core/task-event.d.ts +49 -3
  297. package/dist/core/task-notification.js +2 -2
  298. package/dist/core/task-result.d.ts +8 -0
  299. package/dist/core/task-spec.d.ts +20 -19
  300. package/dist/core/task-stream.d.ts +14 -4
  301. package/dist/core/tighten-task-spec.d.ts +4 -3
  302. package/dist/core/tighten-task-spec.js +2 -4
  303. package/dist/core/tool-check-reading.d.ts +74 -0
  304. package/dist/core/tool-check-reading.js +80 -0
  305. package/dist/core/tool-policy.d.ts +62 -18
  306. package/dist/core/tool-policy.js +86 -15
  307. package/dist/core/tool-registry.d.ts +20 -0
  308. package/dist/core/tool-registry.js +4 -0
  309. package/dist/core/tool-spec.d.ts +10 -6
  310. package/dist/core/tools.js +2 -0
  311. package/dist/core/trace.d.ts +51 -32
  312. package/dist/core/types.d.ts +2 -2
  313. package/dist/core/types.js +1 -1
  314. package/dist/core/unc-spelling.d.ts +10 -0
  315. package/dist/core/unc-spelling.js +3 -0
  316. package/dist/core/untrusted-egress.d.ts +8 -0
  317. package/dist/core/untrusted-egress.js +4 -1
  318. package/dist/core/untrusted-text.d.ts +16 -0
  319. package/dist/core/untrusted-text.js +7 -2
  320. package/dist/core/user-attachment.d.ts +25 -4
  321. package/dist/core/user-attachment.js +63 -42
  322. package/dist/core/wiring-manifest.d.ts +18 -15
  323. package/dist/core/wiring-manifest.js +2 -2
  324. package/dist/engine/compaction/utils.js +1 -2
  325. package/dist/engine/execution-env/node-execution-env.d.ts +4 -3
  326. package/dist/engine/execution-env/symlink-chain.js +1 -1
  327. package/dist/engine/harness/agent-harness.d.ts +1 -1
  328. package/dist/engine/harness/agent-harness.js +5 -4
  329. package/dist/engine/harness/types.d.ts +20 -16
  330. package/dist/engine/harness/types.js +7 -1
  331. package/dist/engine/llm/types.d.ts +12 -7
  332. package/dist/engine/loop/agent-loop.d.ts +12 -1
  333. package/dist/engine/loop/agent-loop.js +18 -6
  334. package/dist/engine/loop/types.d.ts +8 -2
  335. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  336. package/dist/engine/session/import-validate.js +3 -10
  337. package/dist/engine/session/session.d.ts +4 -4
  338. package/dist/engine/session/session.js +4 -4
  339. package/dist/index.d.ts +33 -23
  340. package/dist/index.js +23 -15
  341. package/dist/internal/harness.d.ts +2 -1
  342. package/dist/internal/harness.js +2 -1
  343. package/dist/orchestration/goal.d.ts +24 -1
  344. package/dist/orchestration/goal.js +3 -2
  345. package/dist/orchestration/run-spec.d.ts +4 -6
  346. package/dist/orchestration/run-spec.js +39 -63
  347. package/dist/orchestration/run-workflow-tool.js +1 -2
  348. package/dist/orchestration/workflow.d.ts +11 -3
  349. package/dist/orchestration/workflow.js +11 -2
  350. package/dist/prompt-assembly/artifact-store.d.ts +72 -56
  351. package/dist/prompt-assembly/artifact-store.js +60 -52
  352. package/dist/prompt-assembly/artifact.d.ts +90 -76
  353. package/dist/prompt-assembly/artifact.js +197 -145
  354. package/dist/prompt-assembly/assemble.d.ts +36 -29
  355. package/dist/prompt-assembly/assemble.js +34 -220
  356. package/dist/prompt-assembly/bands.d.ts +20 -0
  357. package/dist/prompt-assembly/bands.js +18 -0
  358. package/dist/prompt-assembly/catalog/constitution.d.ts +23 -0
  359. package/dist/prompt-assembly/catalog/constitution.js +69 -0
  360. package/dist/prompt-assembly/catalog/core-behavior.d.ts +9 -0
  361. package/dist/prompt-assembly/catalog/core-behavior.js +85 -0
  362. package/dist/prompt-assembly/catalog/index.d.ts +11 -0
  363. package/dist/prompt-assembly/catalog/index.js +60 -0
  364. package/dist/prompt-assembly/catalog/memory.d.ts +13 -0
  365. package/dist/prompt-assembly/catalog/memory.js +6 -0
  366. package/dist/prompt-assembly/catalog/modes.d.ts +15 -0
  367. package/dist/prompt-assembly/catalog/modes.js +137 -0
  368. package/dist/prompt-assembly/catalog/role.d.ts +10 -0
  369. package/dist/prompt-assembly/catalog/role.js +157 -0
  370. package/dist/prompt-assembly/catalog/schema.d.ts +138 -0
  371. package/dist/prompt-assembly/catalog/schema.js +25 -0
  372. package/dist/prompt-assembly/catalog/sections.d.ts +9 -0
  373. package/dist/prompt-assembly/catalog/sections.js +98 -0
  374. package/dist/prompt-assembly/catalog/team.d.ts +4 -0
  375. package/dist/prompt-assembly/catalog/team.js +258 -0
  376. package/dist/prompt-assembly/composer.d.ts +26 -28
  377. package/dist/prompt-assembly/composer.js +124 -46
  378. package/dist/prompt-assembly/epoch.d.ts +89 -79
  379. package/dist/prompt-assembly/epoch.js +115 -142
  380. package/dist/prompt-assembly/explain.d.ts +58 -34
  381. package/dist/prompt-assembly/explain.js +21 -24
  382. package/dist/prompt-assembly/overlay.d.ts +137 -0
  383. package/dist/prompt-assembly/overlay.js +339 -0
  384. package/dist/prompt-assembly/renderers.d.ts +21 -0
  385. package/dist/prompt-assembly/renderers.js +39 -0
  386. package/dist/prompt-assembly/section-usage.d.ts +3 -3
  387. package/dist/prompt-assembly/section-usage.js +1 -1
  388. package/dist/prompt-assembly/select.d.ts +71 -0
  389. package/dist/prompt-assembly/select.js +106 -0
  390. package/dist/prompt-assembly/sugar.d.ts +31 -0
  391. package/dist/prompt-assembly/sugar.js +20 -0
  392. package/dist/prompt-assembly/turn-snapshot.d.ts +3 -2
  393. package/dist/prompt-assembly/types.d.ts +45 -148
  394. package/dist/prompts/coordinator.d.ts +2 -21
  395. package/dist/prompts/coordinator.js +3 -255
  396. package/dist/prompts/cowork.d.ts +27 -16
  397. package/dist/prompts/cowork.js +2 -23
  398. package/dist/prompts/default.d.ts +38 -511
  399. package/dist/prompts/default.js +20 -288
  400. package/dist/prompts/supervisor.d.ts +6 -71
  401. package/dist/prompts/supervisor.js +6 -117
  402. package/dist/stores/file/permission-rule-store.d.ts +1 -1
  403. package/dist/stores/file/permission-rule-store.js +2 -1
  404. package/dist/tools/artifact/artifact-tool.js +4 -3
  405. package/dist/tools/fs/bash-readonly-classifier.d.ts +6 -5
  406. package/dist/tools/fs/dir-entries.d.ts +4 -2
  407. package/dist/tools/fs/dir-entries.js +16 -4
  408. package/dist/tools/fs/fs-bash.d.ts +1 -1
  409. package/dist/tools/fs/fs-bash.js +22 -11
  410. package/dist/tools/fs/fs-pdf.js +17 -13
  411. package/dist/tools/fs/fs-read.js +4 -3
  412. package/dist/tools/fs/fs-shared.d.ts +1 -10
  413. package/dist/tools/fs/fs-shared.js +3 -4
  414. package/dist/tools/fs/fs-write.js +2 -1
  415. package/dist/tools/fs/notebook.js +1 -1
  416. package/dist/tools/fs/pdf.d.ts +20 -10
  417. package/dist/tools/fs/pdf.js +19 -10
  418. package/dist/tools/fs/program-read-model.d.ts +68 -8
  419. package/dist/tools/fs/program-read-model.js +112 -33
  420. package/dist/tools/fs/program-read-model.rows.js +30 -10
  421. package/dist/tools/fs/read-deny-home.d.ts +25 -9
  422. package/dist/tools/fs/read-deny-home.js +28 -27
  423. package/dist/tools/fs/read-deny.d.ts +41 -11
  424. package/dist/tools/fs/read-deny.js +51 -5
  425. package/dist/tools/fs/safety.d.ts +4 -26
  426. package/dist/tools/fs/safety.js +10 -32
  427. package/dist/tools/fs/search.js +15 -10
  428. package/dist/tools/fs/shell-read-argv.d.ts +3 -2
  429. package/dist/tools/fs/shell-read-argv.js +118 -38
  430. package/dist/tools/fs/shell-read-establish.d.ts +5 -5
  431. package/dist/tools/fs/shell-read-establish.js +11 -61
  432. package/dist/tools/fs/shell-read-identity.js +6 -3
  433. package/dist/tools/fs/shell-read-judge.d.ts +13 -15
  434. package/dist/tools/fs/shell-read-judge.js +18 -4
  435. package/dist/tools/fs/shell-read-plan.d.ts +2 -2
  436. package/dist/tools/web.js +1 -1
  437. package/package.json +13 -1
  438. package/test/export-surface.snapshot.json +306 -103
  439. package/wire-changes/core@7.52.0.json +5859 -0
  440. package/wire-changes/core@7.53.0.json +1946 -0
  441. package/dist/core/hook-seats.d.ts +0 -66
  442. package/dist/core/hook-seats.js +0 -37
  443. package/dist/prompt-assembly/packs/sema-default.d.ts +0 -2
  444. package/dist/prompt-assembly/packs/sema-default.js +0 -147
  445. package/dist/prompts/simple-sections.d.ts +0 -58
  446. package/dist/prompts/simple-sections.js +0 -43
@@ -1,10 +1,12 @@
1
1
  import { openSystemReminder } from "../reminder-mint.js";
2
- import { formatHookFeedback, hookSeatExpiredError, runHookSeat } from "../hooks.js";
2
+ import { formatHookFeedback } from "../hooks.js";
3
+ import { classicEventBase, dispatchClassic, stopEventOf, stringMembersAnswer, stringMembersOf } from "../mods/stations.js";
3
4
  import { asThrownError } from "../thrown-value.js";
4
5
  const STOP_HOOK_BLOCK_CAP = 8;
5
6
  export function runStopAndFinalVerify(input) {
6
7
  const { spec, prepared, queue, rs, stats, ident, walltimeMonotonicDeadline, runner } = input;
7
- const stopHook = (spec.hooks ?? runner.deps.hooks)?.stop;
8
+ const stopEvent = stopEventOf(prepared.hookIdentity);
9
+ const stopArmed = prepared.modBus.hasHandlers(stopEvent);
8
10
  const finalVerificationOn = spec.finalVerification === true;
9
11
  const finalVerifyBudgetFill = () => {
10
12
  let worst = 0;
@@ -22,7 +24,7 @@ export function runStopAndFinalVerify(input) {
22
24
  const emitFinalVerifyEcho = (body) => {
23
25
  queue.push({ type: "steering_injected", source: "final_verification", preview: body.slice(0, 220), ...ident() });
24
26
  };
25
- if (stopHook || finalVerificationOn) {
27
+ if (stopArmed || finalVerificationOn) {
26
28
  let consecutiveBlocks = 0;
27
29
  prepared.harness.setStopGate(async () => {
28
30
  if (prepared.abortController.signal.aborted || prepared.pausedRef.current !== undefined || prepared.batchHaltRef.current !== undefined)
@@ -100,32 +102,23 @@ export function runStopAndFinalVerify(input) {
100
102
  },
101
103
  ];
102
104
  }
103
- if (!stopHook)
105
+ if (!stopArmed)
104
106
  return [];
105
- let result;
106
- try {
107
- const stopSeat = await runHookSeat("stop", { timeoutMs: prepared.hookTimeoutMs, signal: prepared.abortController.signal, abortEnds: true }, (sig) => stopHook({
108
- stopHookActive: consecutiveBlocks > 0,
109
- consecutiveBlocks,
110
- getBranch: () => prepared.session.getBranch(),
111
- backgroundTasks: () => prepared.listBackgroundTasks(),
112
- identity: prepared.hookIdentity,
113
- permissionMode: prepared.permissionMode.observed,
114
- signal: sig,
115
- }));
116
- if (stopSeat.expired) {
117
- if (stopSeat.cause === "timeout") {
118
- runner.deps.onError?.(hookSeatExpiredError("stop", prepared.hookTimeoutMs, stopSeat.cause, "the run was allowed to END (the seat's own no-opinion answer); no pushback and no additional context were injected"), { phase: "hook", sessionId: prepared.sessionId });
119
- }
120
- consecutiveBlocks = 0;
121
- return [];
122
- }
123
- result = stopSeat.value;
124
- }
125
- catch (err) {
107
+ const outcome = await dispatchClassic(prepared.modBus, stopEvent, {
108
+ ...classicEventBase(prepared.hookIdentity, prepared.permissionMode.observed),
109
+ stopHookActive: consecutiveBlocks > 0,
110
+ consecutiveBlocks,
111
+ getBranch: () => prepared.session.getBranch(),
112
+ backgroundTasks: () => prepared.listBackgroundTasks(),
113
+ }, { signal: prepared.abortController.signal, checkAnswer: stringMembersAnswer(stopEvent, ["block", "additionalContext"]) }).catch((err) => {
126
114
  runner.deps.onError?.(asThrownError(err), { phase: "hook", sessionId: prepared.sessionId });
115
+ return undefined;
116
+ });
117
+ if (outcome?.kind !== "answered") {
118
+ consecutiveBlocks = 0;
127
119
  return [];
128
120
  }
121
+ const result = stringMembersOf(outcome.answer, ["block", "additionalContext"]);
129
122
  const messages = [];
130
123
  if (result?.additionalContext) {
131
124
  messages.push({
@@ -22,6 +22,7 @@ import type { PushQueue } from "../push-queue.js";
22
22
  import type { Brain, OwedUserInputAccount, TaskEvent, TaskSpec } from "../types.js";
23
23
  import { type Stats } from "./assemble-result.js";
24
24
  import type { EndOfTaskCompaction, Prepared, RunnerDepsSeat, RunState } from "./contracts.js";
25
+ import type { CallerStopGate } from "./caller-stop-gate.js";
25
26
  export interface RunTerminalAdoptionInput<R> {
26
27
  /** borrowed-readonly — the task spec: the task id the account's notices name; `finish`'s first argument (the end-of-task pass below). */
27
28
  spec: TaskSpec;
@@ -78,6 +79,8 @@ export interface RunTerminalAdoptionInput<R> {
78
79
  abortedLive: boolean;
79
80
  /** borrowed-readonly — the leg's snapshot of `loopLatch.userInterrupted` (gates the interruption marker). */
80
81
  userInterruptedLive: boolean;
82
+ /** borrowed-readonly — the run's caller-stop gate: the end-of-task pass admits on it and carries it (read LIVE, never snapshot). */
83
+ callerStop: CallerStopGate;
81
84
  /** borrowed-readonly — the Runner's deployment deps, read LIVE (`onError`, `checkpointStore`, `onNotice`, `mediaByteCapBytes`); the one home of why it is
82
85
  * a seat and not a captured object is {@link RunnerDepsSeat}. */
83
86
  runner: RunnerDepsSeat;
@@ -1,4 +1,4 @@
1
- import { DEFAULT_COMPACTION_INSTRUCTIONS, maybeCompact } from "../auto-compaction.js";
1
+ import { compactionPassReport, DEFAULT_COMPACTION_INSTRUCTIONS, isCompactionManualCancel, maybeCompact } from "../auto-compaction.js";
2
2
  import { eventDefaultOn } from "../../prompt-assembly/event-registry.js";
3
3
  import { appendInterruptionMarker, reconcileInterruptedSession } from "../session-reconcile.js";
4
4
  import { emitTrace } from "../trace.js";
@@ -12,7 +12,7 @@ import { MAX_CONSECUTIVE_COMPACTION_FAILURES } from "./compaction-knobs.js";
12
12
  import { emitSettled, reconciledEnd } from "./tool-end-body.js";
13
13
  import { asThrownError, thrownText } from "../thrown-value.js";
14
14
  export async function runTerminalAdoption(input) {
15
- const { spec, queue, prepared, rs, stats, ident, emitCommitted, startedToolCallIds, toolLabels, timeout, compactionBrain, compactionBreaker, windowSafetyOptions, undrainedUserAtEnd, userInputLostAtEnd, final, abortedLive, userInterruptedLive, runner, sessions, next } = input;
15
+ const { spec, queue, prepared, rs, stats, ident, emitCommitted, startedToolCallIds, toolLabels, timeout, compactionBrain, compactionBreaker, windowSafetyOptions, undrainedUserAtEnd, userInputLostAtEnd, final, abortedLive, userInterruptedLive, callerStop, runner, sessions, next } = input;
16
16
  let { threw } = input;
17
17
  const settled = answerSettled(final, userInputLostAtEnd.current || prepared.undeliveredContinuationRef.current.parkedSteers.length > 0 || prepared.workCutRef.continuation || prepared.workCutRef.abortedBeforeTurnEnd);
18
18
  if (threw === undefined && prepared.brainCallGuardrailRef.timedOut !== undefined) {
@@ -115,12 +115,13 @@ export async function runTerminalAdoption(input) {
115
115
  }
116
116
  const comp = await finish(spec, prepared, {
117
117
  telemetry: { tracer: rs.telemetry.tracer, taskId: rs.telemetry.taskId },
118
- skipCompaction: durablyPaused || (abortedLive && settled) || compactionBreaker.failures >= MAX_CONSECUTIVE_COMPACTION_FAILURES,
118
+ skipCompaction: durablyPaused || (abortedLive && settled) || callerStop.signal.aborted || compactionBreaker.failures >= MAX_CONSECUTIVE_COMPACTION_FAILURES,
119
+ callerStop,
119
120
  minTokens: rs.counters.compactionFloor,
120
121
  brain: compactionBrain,
121
122
  windowSafety: windowSafetyOptions(prepared.harness.getModel()),
122
- onCompactionFailed: (reason) => queue.push({ type: "compaction_outcome", outcome: "failed", trigger: "auto", reason, ...ident() }),
123
- cancelled: abortedLive,
123
+ passReport: compactionPassReport(queue, ident),
124
+ onCompactionOutcome: (outcome, reason, end) => queue.push({ type: "compaction_outcome", outcome, trigger: "auto", reason, ...end, ...ident() }),
124
125
  }, runner, sessions);
125
126
  return await next({ threw, comp, answerSettled: settled, owedUserInput });
126
127
  }
@@ -130,7 +131,7 @@ async function finish(spec, prepared, opts, runner, sessions) {
130
131
  try {
131
132
  const finishComp = await maybeCompact({
132
133
  session: prepared.session,
133
- epochDeclaredSections: prepared.epochDeclaredSections,
134
+ promptIdentity: prepared.promptIdentity,
134
135
  ...centerAdoptionOption(prepared),
135
136
  model: prepared.harness.getModel(),
136
137
  ...legContextOverlayOption(prepared, runner),
@@ -141,6 +142,8 @@ async function finish(spec, prepared, opts, runner, sessions) {
141
142
  thinking: prepared.thinking,
142
143
  settings: legCompactionSettings(spec, legContextOverlayOption(prepared, runner).contextOverlay),
143
144
  customInstructions: spec.compaction?.instructions ?? DEFAULT_COMPACTION_INSTRUCTIONS,
145
+ signal: opts.callerStop.signal,
146
+ manualCancelSignal: opts.callerStop.signal,
144
147
  minTokens: opts?.minTokens,
145
148
  overheadTokens: prepared.promptOverheadTokens,
146
149
  ...(prepared.activeTools.size > 0 ? { activeTools: [...prepared.activeTools] } : {}),
@@ -151,10 +154,7 @@ async function finish(spec, prepared, opts, runner, sessions) {
151
154
  ...(prepared.onCompactionApplied ? { onApplied: prepared.onCompactionApplied } : {}),
152
155
  ...seamCCompactionOptions(runner, prepared),
153
156
  ...compactionRestateOptions(prepared),
154
- ...compactionHookOptions(runner, spec, prepared.sessionId, "auto", prepared.hookIdentity, {
155
- timeoutMs: prepared.hookTimeoutMs,
156
- ...(opts?.cancelled === true ? { signal: prepared.abortController.signal } : {}),
157
- }),
157
+ ...compactionHookOptions(runner, prepared, "auto", opts.callerStop.signal), onStarted: opts.passReport.onStarted,
158
158
  });
159
159
  recordCompactionReuse(runner, prepared, finishComp);
160
160
  if (finishComp.unevaluableWindow) {
@@ -163,18 +163,30 @@ async function finish(spec, prepared, opts, runner, sessions) {
163
163
  comp = finishComp;
164
164
  }
165
165
  catch (err) {
166
- const failMsg = thrownText(err);
167
- const failReason = failMsg.length > 512 ? `${failMsg.slice(0, 512)}…` : failMsg;
168
- emitTrace(opts?.telemetry?.tracer ?? spec.tracer ?? runner.deps.tracer, () => ({
169
- kind: "compaction.failed",
170
- version: 1,
171
- taskId: opts?.telemetry?.taskId ?? spec.taskId ?? prepared.sessionId,
172
- trigger: "auto",
173
- reason: failReason,
174
- ts: Date.now(),
175
- }));
176
- opts?.onCompactionFailed?.(failReason);
177
- runner.deps.onError?.(err, { phase: "compaction", sessionId: prepared.sessionId });
166
+ if (isCompactionManualCancel(err)) {
167
+ emitTrace(opts?.telemetry?.tracer ?? spec.tracer ?? runner.deps.tracer, () => ({
168
+ kind: "compaction.mooted",
169
+ version: 1,
170
+ taskId: opts?.telemetry?.taskId ?? spec.taskId ?? prepared.sessionId,
171
+ reason: "cancelled",
172
+ ts: Date.now(),
173
+ }));
174
+ opts?.onCompactionOutcome?.("mooted", "cancelled", opts.passReport.end);
175
+ }
176
+ else {
177
+ const failMsg = thrownText(err);
178
+ const failReason = failMsg.length > 512 ? `${failMsg.slice(0, 512)}…` : failMsg;
179
+ emitTrace(opts?.telemetry?.tracer ?? spec.tracer ?? runner.deps.tracer, () => ({
180
+ kind: "compaction.failed",
181
+ version: 1,
182
+ taskId: opts?.telemetry?.taskId ?? spec.taskId ?? prepared.sessionId,
183
+ trigger: "auto",
184
+ reason: failReason,
185
+ ts: Date.now(),
186
+ }));
187
+ opts?.onCompactionOutcome?.("failed", failReason, opts.passReport.end);
188
+ runner.deps.onError?.(err, { phase: "compaction", sessionId: prepared.sessionId });
189
+ }
178
190
  }
179
191
  }
180
192
  try {
@@ -21,11 +21,13 @@ export function runToolMountFacts(input) {
21
21
  emitTrace(rs.telemetry.tracer, () => ({ kind: "task.start", version: 1, taskId: rs.telemetry.taskId, runId: rs.telemetry.runId, model: prepared.model.id, engineVersion: engineVersion(), ts: rs.telemetry.taskStart }));
22
22
  emitTrace(rs.telemetry.tracer, () => ({
23
23
  kind: "prompt.assembled",
24
- version: 1,
24
+ version: 3,
25
25
  taskId: rs.telemetry.taskId,
26
- constitution: prepared.promptManifest.constitution,
26
+ identity: prepared.promptManifest.identity,
27
+ selectors: prepared.promptManifest.selectors,
27
28
  blocks: prepared.promptManifest.blocks,
28
- ...(prepared.promptManifest.sections ? { sections: prepared.promptManifest.sections } : {}),
29
+ sections: prepared.promptManifest.sections,
30
+ ...(prepared.promptManifest.superseded ? { superseded: prepared.promptManifest.superseded } : {}),
29
31
  ...(prepared.promptManifest.tools ? { tools: prepared.promptManifest.tools } : {}),
30
32
  ...(prepared.promptManifest.snapshot ? { snapshot: prepared.promptManifest.snapshot } : {}),
31
33
  ...(prepared.promptManifest.lowering ? { lowering: prepared.promptManifest.lowering } : {}),
@@ -1,13 +1,13 @@
1
1
  import { compactionKindOf } from "../task-notification.js";
2
2
  import { mintSystemReminder } from "../reminder-mint.js";
3
3
  import { eventDefaultOn } from "../../prompt-assembly/event-registry.js";
4
- import { DEFAULT_COMPACTION_INSTRUCTIONS, isCompactionManualCancel, maybeCompact, mintCompactedEvent, nextTrimForceBackoff, recordCompactionAndCheckRapidRefill } from "../auto-compaction.js";
4
+ import { compactionPassReport, DEFAULT_COMPACTION_INSTRUCTIONS, isCompactionManualCancel, maybeCompact, mintCompactedEvent, nextTrimForceBackoff, recordCompactionAndCheckRapidRefill } from "../auto-compaction.js";
5
5
  import { emitTrace } from "../trace.js";
6
6
  import { redactThenCut } from "../../agents/subagent-steps.js";
7
7
  import { ATTACHMENT_BYTE_CAP, CHANGED_FILES_MAX, TOTAL_TOKENS_REMINDER_DEFAULT_MODE, attachmentEnvelopeTags, clipToBytes, collectDateChange, collectDueAttachments, collectInstructionsChange, commitAgentListing, commitInstructionsChange, commitSkillsListing, isIntactSource, rebaseCadenceWindows, renderAgentListingFrame, renderMcpDroppedTools, renderMcpInstructionsDelta, selectMcpDroppedBatch, renderSkillsListingFrame, renderToolsDelta } from "./turn-attachments.js";
8
8
  import { announceListingTruncation } from "../skill-listing-budget.js";
9
9
  import { buildWorkingFileAttachments, centerAdoptionOption, contextInstructionFilesOption, emitInputTruncated, forkContextOption, legCompactionSettings, legContextOverlayOption } from "./compaction-call-options.js";
10
- import { hookSeatExpiredError, runHookSeat } from "../hooks.js";
10
+ import { classicEventBase, dispatchClassic, stringMembersAnswer, stringMembersOf } from "../mods/stations.js";
11
11
  import { sanitizeUntrustedText, SHELLED_BODY_ENVELOPE_TAGS } from "../untrusted-text.js";
12
12
  import { droppedToolDigest, withAnnounceDigests } from "./announce-once-ledger.js";
13
13
  import { formatDiagnosticsBlock, withholdListedDiagnostics } from "../lsp-diagnostics.js";
@@ -23,7 +23,7 @@ const BATCH_CONTEXT_MIN_KEEP_BYTES = 160;
23
23
  const BATCH_TRUNCATION_MARKER = "\n…[truncated]";
24
24
  export function createTurnBoundary(input) {
25
25
  const { prepared, stats, rs, deps } = input;
26
- const { spec, queue, manualCompactRef, todoToolMounted, taskToolsMounted, walltimeMonotonicDeadline, timeout, ident, postToolBatchHook, batchArgs, compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions, rapidRefill, drainManualCompact, runnerHooks, runner } = deps;
26
+ const { spec, queue, loopLatch: { callerStop }, manualCompactRef, todoToolMounted, taskToolsMounted, walltimeMonotonicDeadline, timeout, ident, postToolBatchArmed, batchArgs, compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions, rapidRefill, drainManualCompact, runnerHooks, runner } = deps;
27
27
  let finalVerifySeenAtLastBoundary = 0;
28
28
  let legContinues = true;
29
29
  const boundaryPass = async (event) => {
@@ -464,35 +464,30 @@ export function createTurnBoundary(input) {
464
464
  let batchContextBlock;
465
465
  const finalVerifyInjectedThisTurn = rs.counters.finalVerifyInjections !== finalVerifySeenAtLastBoundary;
466
466
  finalVerifySeenAtLastBoundary = rs.counters.finalVerifyInjections;
467
- if (postToolBatchHook !== undefined && rs.turn.toolBatch.length > 0) {
467
+ if (postToolBatchArmed && rs.turn.toolBatch.length > 0) {
468
468
  const batch = rs.turn.toolBatch;
469
469
  rs.turn.toolBatch = [];
470
470
  batchArgs?.clear();
471
471
  const injectedThisTurn = finalVerifyInjectedThisTurn ? "final_verification" : undefined;
472
472
  if (!boundarySteered && !prepared.abortController.signal.aborted) {
473
- try {
474
- const batchSeat = await runHookSeat("postToolBatch", { timeoutMs: prepared.hookTimeoutMs, signal: prepared.abortController.signal }, (sig) => postToolBatchHook(batch, injectedThisTurn !== undefined ? { injectedThisTurn } : undefined, { identity: prepared.hookIdentity, permissionMode: prepared.permissionMode.observed, signal: sig }));
475
- if (batchSeat.expired) {
476
- runnerHooks.onError?.(hookSeatExpiredError("postToolBatch", prepared.hookTimeoutMs, batchSeat.cause, "the boundary observation was abandoned and its additionalContext dropped; the turn boundary itself is unchanged"), { phase: "hook", sessionId: prepared.sessionId });
477
- }
478
- const r = batchSeat.expired ? undefined : batchSeat.value;
479
- if (r?.additionalContext && injectedThisTurn === undefined) {
480
- const body = sanitizeUntrustedText(r.additionalContext, SHELLED_BODY_ENVELOPE_TAGS);
481
- const budget = ATTACHMENT_BYTE_CAP - boundaryAttachmentBytes;
482
- if (budget >= BATCH_CONTEXT_MIN_KEEP_BYTES) {
483
- const clipped = clipToBytes(body, budget) === body
484
- ? body
485
- : `${clipToBytes(body, budget - Buffer.byteLength(BATCH_TRUNCATION_MARKER, "utf8"))}${BATCH_TRUNCATION_MARKER}`;
486
- batchContextBlock = mintSystemReminder(clipped, prepared.reminderMark);
487
- }
488
- }
489
- }
490
- catch (err) {
473
+ const outcome = await dispatchClassic(prepared.modBus, "classic.PostToolBatch", { ...classicEventBase(prepared.hookIdentity, prepared.permissionMode.observed), batch, ...(injectedThisTurn !== undefined ? { injectedThisTurn } : {}) }, { signal: prepared.abortController.signal, checkAnswer: stringMembersAnswer("classic.PostToolBatch", ["additionalContext"]) }).catch((err) => {
491
474
  try {
492
475
  runnerHooks.onError?.(asThrownError(err), { phase: "hook", sessionId: prepared.sessionId });
493
476
  }
494
477
  catch {
495
478
  }
479
+ return undefined;
480
+ });
481
+ const r = outcome?.kind === "answered" ? stringMembersOf(outcome.answer, ["additionalContext"]) : undefined;
482
+ if (r?.additionalContext && injectedThisTurn === undefined) {
483
+ const body = sanitizeUntrustedText(r.additionalContext, SHELLED_BODY_ENVELOPE_TAGS);
484
+ const budget = ATTACHMENT_BYTE_CAP - boundaryAttachmentBytes;
485
+ if (budget >= BATCH_CONTEXT_MIN_KEEP_BYTES) {
486
+ const clipped = clipToBytes(body, budget) === body
487
+ ? body
488
+ : `${clipToBytes(body, budget - Buffer.byteLength(BATCH_TRUNCATION_MARKER, "utf8"))}${BATCH_TRUNCATION_MARKER}`;
489
+ batchContextBlock = mintSystemReminder(clipped, prepared.reminderMark);
490
+ }
496
491
  }
497
492
  }
498
493
  }
@@ -507,6 +502,7 @@ export function createTurnBoundary(input) {
507
502
  const forceManual = manualCompactRef.requested;
508
503
  if ((!withinTaskCompaction() && !forceManual) ||
509
504
  prepared.abortController.signal.aborted ||
505
+ callerStop.signal.aborted ||
510
506
  prepared.pausedRef.current !== undefined) {
511
507
  if (forceManual) {
512
508
  emitTrace(rs.telemetry.tracer, () => ({ kind: "compaction.mooted", version: 1, taskId: rs.telemetry.taskId, reason: "task_ending", ts: Date.now() }));
@@ -553,14 +549,8 @@ export function createTurnBoundary(input) {
553
549
  w.resolve(outcome);
554
550
  };
555
551
  const claimedCancelSignals = claimedManual?.waiters.flatMap((w) => (w.signal !== undefined ? [w.signal] : [])) ?? [];
556
- const manualCancelSignal = claimedCancelSignals.length === 0
557
- ? undefined
558
- : claimedCancelSignals.length === 1
559
- ? claimedCancelSignals[0]
560
- : AbortSignal.any(claimedCancelSignals);
561
- const compactionPassSignal = claimedCancelSignals.length > 0
562
- ? AbortSignal.any([prepared.abortController.signal, ...claimedCancelSignals])
563
- : prepared.abortController.signal;
552
+ const manualCancelSignal = claimedCancelSignals.length === 0 ? callerStop.signal : AbortSignal.any([callerStop.signal, ...claimedCancelSignals]);
553
+ const compactionPassSignal = AbortSignal.any([prepared.abortController.signal, manualCancelSignal]);
564
554
  const trimPressureArmed = prepared.trimPressureRef.droppedMessages;
565
555
  if (trimPressureArmed)
566
556
  prepared.trimPressureRef.droppedMessages = false;
@@ -568,10 +558,11 @@ export function createTurnBoundary(input) {
568
558
  const passTrigger = trimPressure ? "forced" : forceManual ? "manual" : "auto";
569
559
  let manualOutcome = "failed";
570
560
  const manualInstructions = claimedManual?.instructions;
561
+ const passReport = compactionPassReport(queue, ident);
571
562
  try {
572
563
  const comp = await maybeCompact({
573
564
  session: prepared.session,
574
- epochDeclaredSections: prepared.epochDeclaredSections,
565
+ promptIdentity: prepared.promptIdentity,
575
566
  ...centerAdoptionOption(prepared),
576
567
  model: event.model,
577
568
  ...legContextOverlayOption(prepared, runner),
@@ -583,7 +574,7 @@ export function createTurnBoundary(input) {
583
574
  settings: legCompactionSettings(spec, legContextOverlayOption(prepared, runner).contextOverlay),
584
575
  customInstructions: manualInstructions ?? spec.compaction?.instructions ?? DEFAULT_COMPACTION_INSTRUCTIONS,
585
576
  signal: compactionPassSignal,
586
- ...(manualCancelSignal !== undefined ? { manualCancelSignal } : {}),
577
+ manualCancelSignal,
587
578
  minTokens: forceManual ? 0 : rs.counters.compactionFloor,
588
579
  force: forceManual,
589
580
  onInputTruncated: emitInputTruncated(rs.telemetry.tracer, rs.telemetry.taskId),
@@ -596,7 +587,8 @@ export function createTurnBoundary(input) {
596
587
  ...seamCCompactionOptions(runner, prepared),
597
588
  ...compactionRestateOptions(prepared),
598
589
  ...windowSafetyOptions(event.model),
599
- ...compactionHookOptions(runner, spec, prepared.sessionId, passTrigger, prepared.hookIdentity, { timeoutMs: prepared.hookTimeoutMs, signal: prepared.abortController.signal }),
590
+ ...compactionHookOptions(runner, prepared, passTrigger, compactionPassSignal),
591
+ onStarted: passReport.onStarted,
600
592
  });
601
593
  if (comp.blocked) {
602
594
  emitTrace(rs.telemetry.tracer, () => ({
@@ -678,10 +670,9 @@ export function createTurnBoundary(input) {
678
670
  }
679
671
  }
680
672
  catch (err) {
681
- const manualCancelAbort = !prepared.abortController.signal.aborted && isCompactionManualCancel(err);
682
- if (manualCancelAbort) {
673
+ if (isCompactionManualCancel(err)) {
683
674
  emitTrace(rs.telemetry.tracer, () => ({ kind: "compaction.mooted", version: 1, taskId: rs.telemetry.taskId, reason: "cancelled", ts: Date.now() }));
684
- queue.push({ type: "compaction_outcome", outcome: "mooted", trigger: passTrigger, reason: "cancelled", ...ident() });
675
+ queue.push({ type: "compaction_outcome", outcome: "mooted", trigger: passTrigger, reason: "cancelled", ...passReport.end, ...ident() });
685
676
  manualOutcome = "mooted";
686
677
  }
687
678
  else if (!prepared.abortController.signal.aborted) {
@@ -697,11 +688,15 @@ export function createTurnBoundary(input) {
697
688
  reason: failReason,
698
689
  ts: Date.now(),
699
690
  }));
700
- queue.push({ type: "compaction_outcome", outcome: "failed", trigger: passTrigger, reason: failReason, ...ident() });
691
+ queue.push({ type: "compaction_outcome", outcome: "failed", trigger: passTrigger, reason: failReason, ...passReport.end, ...ident() });
701
692
  manualOutcome = "failed";
702
693
  }
703
694
  else {
704
695
  manualOutcome = "mooted";
696
+ if (passReport.pass !== undefined) {
697
+ emitTrace(rs.telemetry.tracer, () => ({ kind: "compaction.mooted", version: 1, taskId: rs.telemetry.taskId, reason: "task_ending", ts: Date.now() }));
698
+ queue.push({ type: "compaction_outcome", outcome: "mooted", trigger: passTrigger, reason: "task_ending", ...passReport.end, ...ident() });
699
+ }
705
700
  }
706
701
  }
707
702
  if (forceManual)
@@ -88,13 +88,13 @@ export declare class Runner implements RunnerSelfSeat {
88
88
  * followed) against the seat and catalog in force, so a `swapDeps` reaches legs already running. */
89
89
  contextOverlayOf(ref: ModelRef | undefined): ContextWindowOverlay | undefined;
90
90
  /** The deployment-level gating baseline, exposed READ-ONLY so thin
91
- * assemblers over the Runner (`runSpec`) can COMPOSE with it. The task-level engine semantic is a
92
- * WHOLE-SLOT override (`spec.toolPolicy ?? deps.toolPolicy`, same for hooks — prepare-task), so any
93
- * assembler that sets `spec.toolPolicy`/`spec.hooks` without folding these in silently shadows the
94
- * deployment baseline. Getter only — nothing here is writable from outside. */
91
+ * assemblers over the Runner (`runSpec`) can COMPOSE with it. The task-level engine semantic for the policy is a
92
+ * WHOLE-SLOT override (`spec.toolPolicy ?? deps.toolPolicy` — prepare-task), so any assembler that sets
93
+ * `spec.toolPolicy` without folding this in silently shadows the deployment baseline. (The mods bus needs no
94
+ * baseline: its two seats run side by side, so an assembler's task registrations never shadow `deps.mods`.)
95
+ * Getter only — nothing here is writable from outside. */
95
96
  get gateBaseline(): {
96
97
  toolPolicy?: RunnerDeps["toolPolicy"];
97
- hooks?: RunnerDeps["hooks"];
98
98
  };
99
99
  /** Acquire the lock for a sessionId; returns a release fn. The one lock every leg holds on its session, from the moment it
100
100
  * knows the id to the leg's end (through `holdSessionLock` in `runTaskStream`, one per leg). */
@@ -122,8 +122,7 @@ export declare class Runner implements RunnerSelfSeat {
122
122
  * engine default); a key absent is kept. `tiers` omitted beside `models` ⇒ the current bindings are
123
123
  * re-applied over the new catalog.
124
124
  * - **Announced per seat.** `config.models_swapped` (models/tiers counts — key material only, never the
125
- * catalog itself; plus the advisory `route.base_url_changed_key_unchanged` for same-name entries
126
- * whose URL moved while the Model-visible credential fingerprint did not) and
125
+ * catalog itself) and
127
126
  * `config.read_face_swapped` / `config.write_face_swapped` (`{ from, to, occurrenceId }`, the seat's
128
127
  * previous and new value, `null` = no declaration) — the table {@link SWAP_SEAT_NOTICE} binds every
129
128
  * seat to its line.
@@ -7,7 +7,6 @@ import { createRapidRefillState } from "../auto-compaction.js";
7
7
  import { boundInputHashOf } from "../canonical-json.js";
8
8
  import { emitTrace } from "../trace.js";
9
9
  import { emitTaskOutcome } from "../task-outcome.js";
10
- import { authCarrierFingerprint, displayUrlOf, routeKeyOf } from "../../brain/route-adjudicator.js";
11
10
  import { runWithReasoningWireFacts } from "../../brain/status-sink.js";
12
11
  import { expandTiers } from "../roles.js";
13
12
  import { announceReadDenySwap, screenSwappableDeps } from "../swappable-deps.js";
@@ -142,48 +141,12 @@ export class Runner {
142
141
  }
143
142
  get gateBaseline() {
144
143
  const deps = this.deps;
145
- const h = deps.hooks;
146
- const hooks = h
147
- ? {
148
- ...(typeof h.preToolUse === "function" ? { preToolUse: (t, i, c) => h.preToolUse(t, i, c) } : {}),
149
- ...(typeof h.preToolUse === "function" && h.preToolUseObservational === true ? { preToolUseObservational: true } : {}),
150
- ...(typeof h.postToolUse === "function" ? { postToolUse: (t, i, o, c) => h.postToolUse(t, i, o, c) } : {}),
151
- ...(typeof h.userPromptSubmit === "function" ? { userPromptSubmit: (p, c) => h.userPromptSubmit(p, c) } : {}),
152
- ...(typeof h.stop === "function" ? { stop: (c) => h.stop(c) } : {}),
153
- ...(typeof h.postToolUseFailure === "function"
154
- ? { postToolUseFailure: (t, i, f, c) => h.postToolUseFailure(t, i, f, c) }
155
- : {}),
156
- ...(typeof h.postToolBatch === "function" ? { postToolBatch: (b, m, c) => h.postToolBatch(b, m, c) } : {}),
157
- ...(typeof h.preCompact === "function" ? { preCompact: (c) => h.preCompact(c) } : {}),
158
- ...(typeof h.postCompact === "function" ? { postCompact: (c) => h.postCompact(c) } : {}),
159
- ...(typeof h.stopFailure === "function" ? { stopFailure: (c) => h.stopFailure(c) } : {}),
160
- ...(typeof h.permissionDenied === "function" ? { permissionDenied: (p) => h.permissionDenied(p) } : {}),
161
- ...(h.timeoutMs !== undefined ? { timeoutMs: h.timeoutMs } : {}),
162
- }
163
- : undefined;
164
- const MIRRORED_HOOK_KEYS = [
165
- "preToolUse",
166
- "preToolUseObservational",
167
- "postToolUse",
168
- "userPromptSubmit",
169
- "stop",
170
- "postToolUseFailure",
171
- "postToolBatch",
172
- "preCompact",
173
- "postCompact",
174
- "stopFailure",
175
- "permissionDenied",
176
- "timeoutMs",
177
- ];
178
- const _mirrorIsComplete = true;
179
- void _mirrorIsComplete;
180
144
  return {
181
145
  ...(deps.toolPolicy !== undefined
182
146
  ? {
183
147
  toolPolicy: wrapToolPolicy(deps.toolPolicy, (req, signal) => deps.toolPolicy.check(req, signal)),
184
148
  }
185
149
  : {}),
186
- ...(hooks !== undefined ? { hooks } : {}),
187
150
  };
188
151
  }
189
152
  async acquireSessionLock(sessionId) {
@@ -210,19 +173,10 @@ export class Runner {
210
173
  const catalogSwap = seats.includes("models");
211
174
  let expanded;
212
175
  let tiers;
213
- const movedEntries = [];
214
176
  if (catalogSwap) {
215
177
  const models = candidate.models;
216
178
  tiers = Object.hasOwn(candidate, "tiers") ? candidate.tiers : this.deps.tiers;
217
179
  expanded = tiers && Object.keys(tiers).length > 0 ? expandTiers({ ...models }, tiers) : { ...models };
218
- for (const [name, nextModel] of Object.entries(expanded ?? {})) {
219
- const prior = this.deps.models?.[name];
220
- if (!prior)
221
- continue;
222
- if (routeKeyOf(prior.baseUrl) !== routeKeyOf(nextModel.baseUrl) && authCarrierFingerprint(prior.headers) === authCarrierFingerprint(nextModel.headers)) {
223
- movedEntries.push({ modelId: name, from: displayUrlOf(prior.baseUrl), to: displayUrlOf(nextModel.baseUrl) });
224
- }
225
- }
226
180
  }
227
181
  const faceSeats = ["readFace", "writeFace"].filter((seat) => seats.includes(seat));
228
182
  const priorFaces = {
@@ -254,18 +208,6 @@ export class Runner {
254
208
  message: `model catalog swapped: ${modelCount} model(s), ${tiers ? Object.keys(tiers).length : 0} tier binding(s); in-flight tasks finish on their resolved models, new tasks resolve against the new catalog`,
255
209
  detail: { models: modelCount, tiers: tiers ? Object.keys(tiers).length : 0, occurrenceId: uuidv7() },
256
210
  });
257
- if (movedEntries.length > 0) {
258
- const RENDER_CAP = 8;
259
- const rendered = movedEntries.slice(0, RENDER_CAP);
260
- deliverEngineNotice(this.deps.onNotice, {
261
- code: "route.base_url_changed_key_unchanged",
262
- message: `model catalog swap moved ${movedEntries.length} entry/entries to a new baseUrl while the Model-visible credential half stayed unchanged: ` +
263
- rendered.map((e) => `"${e.modelId}" ${e.from || "(config root)"} → ${e.to || "(config root)"}`).join("; ") +
264
- (movedEntries.length > rendered.length ? `; +${movedEntries.length - rendered.length} more` : "") +
265
- " — if the provider changed (not just its domain), update the credential reference in the same step",
266
- detail: { entries: rendered, total: movedEntries.length, occurrenceId: uuidv7() },
267
- });
268
- }
269
211
  }
270
212
  if (seats.includes("contextSettings")) {
271
213
  const to = candidate.contextSettings;
@@ -461,27 +403,27 @@ export class Runner {
461
403
  const { effectiveTimeoutMs, walltimeMonotonicDeadline, timeout, pushContent, ownCommittedTailRef, emitCommitted } = runClockAndContent({ spec, prepared, queue, internals, rs, ident, parentToolCallId, startedToolCallIds });
462
404
  const toolProgress = createToolProgressLane(pushContent, ident, prepared.toolOccurrences);
463
405
  prepared.toolProgressRef.current = toolProgress;
464
- const { withBrainSinks, withExtraBodyDroppedSink } = runBrainSinks({ queue, internals, rs, ident, observeReasoningWireFacts, notice: { onNotice: this.deps.onNotice, sessionId: prepared.sessionId, runId: prepared.runId } });
406
+ const { withBrainSinks, withLegRequestSinks } = runBrainSinks({ queue, internals, rs, ident, observeReasoningWireFacts, notice: { onNotice: this.deps.onNotice, sessionId: prepared.sessionId, runId: prepared.runId } });
465
407
  const toolLabels = new Map(prepared.tools.flatMap((t) => (t.label !== undefined && t.label !== t.name ? [[t.name, t.label]] : [])));
466
408
  for (const orphan of prepared.wakeRecovered) {
467
409
  emitSettled(prepared.toolOccurrences, { toolCallId: orphan.toolCallId, spelledName: orphan.toolName, ...(toolLabels.has(orphan.toolName) ? { label: toolLabels.get(orphan.toolName) } : {}), args: orphan.args }, reconciledEnd(orphan), { push: (f) => queue.push({ ...f, ...ident() }), structured: prepared.structuredProjector, mediaByteCapBytes: this.deps.mediaByteCapBytes });
468
410
  emitCommitted(orphan.entryId, "toolResult", orphan.toolCallId);
469
411
  }
470
- const postToolBatchHook = (spec.hooks ?? this.deps.hooks)?.postToolBatch;
471
- const batchArgs = postToolBatchHook ? new Map() : undefined;
412
+ const postToolBatchArmed = prepared.modBus.hasHandlers("classic.PostToolBatch");
413
+ const batchArgs = postToolBatchArmed ? new Map() : undefined;
472
414
  rs.turn.toolBatch = [];
473
415
  const { onMessageUpdate, onMessageEnd, onToolStart, onToolEnd, onTurnEnd, announceWorkspaceMove } = createHarnessHandlers({
474
416
  prepared, stats, rs,
475
417
  deps: {
476
418
  spec, queue, internals, ident, mediaByteCapBytes: this.deps.mediaByteCapBytes,
477
419
  pushContent, emitCommitted, startedToolCallIds, toolStartAt, toolProgress, writeFamilyOf,
478
- toolLabels, postToolBatchHook, batchArgs, internalsNotifier,
420
+ toolLabels, postToolBatchArmed, batchArgs, internalsNotifier,
479
421
  runnerHooks: { onError: (e, info) => this.deps.onError?.(e, info), onNotice: this.deps.onNotice },
480
422
  },
481
423
  });
482
- const { compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions } = runCompactionMachinery({ spec, prepared, rs, stats, noteUnevaluablePriceTable, runner: this.depsSeat });
424
+ const { compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions } = runCompactionMachinery({ spec, prepared, rs, stats, noteUnevaluablePriceTable, modelCatalog, runner: this.depsSeat });
483
425
  runStopAndFinalVerify({ spec, prepared, queue, rs, stats, ident, walltimeMonotonicDeadline, runner: this.depsSeat });
484
- runRecoveryLanes({ spec, prepared, queue, rs, ident, compactionBrain, compactionBreaker, windowSafetyOptions, runner: this.depsSeat });
426
+ runRecoveryLanes({ spec, prepared, queue, rs, ident, compactionBrain, compactionBreaker, windowSafetyOptions, callerStop: loopLatch.callerStop, runner: this.depsSeat });
485
427
  const rapidRefill = createRapidRefillState();
486
428
  const drainManualCompact = (outcome) => {
487
429
  manualCompactRef.requested = false;
@@ -493,20 +435,20 @@ export class Runner {
493
435
  deps: {
494
436
  spec, queue, loopLatch, manualCompactRef, todoToolMounted, taskToolsMounted,
495
437
  walltimeMonotonicDeadline,
496
- timeout, ident, postToolBatchHook, batchArgs, compactionBrain, withinTaskCompaction,
438
+ timeout, ident, postToolBatchArmed, batchArgs, compactionBrain, withinTaskCompaction,
497
439
  compactionBreaker, windowSafetyOptions, rapidRefill, drainManualCompact,
498
440
  runnerHooks: { onError: this.deps.onError },
499
441
  runner: this.depsSeat,
500
442
  },
501
443
  });
502
444
  const { flushGitMirror, unsubGitRetry, unsubBoundary, unsub } = runGitLane({ prepared, queue, rs, ident, onMessageUpdate, onMessageEnd, onToolStart, onToolEnd, onTurnEnd, onTurnBoundary, runner: this.depsSeat });
503
- return withExtraBodyDroppedSink(() => runLeg({
445
+ return withLegRequestSinks(() => runLeg({
504
446
  spec, queue, prepared, resume, rs, entryActor, effectiveTimeoutMs, timeout, pushContent, ident, emitCommitted, writeFamilyOf, startedToolCallIds,
505
447
  announceWorkspaceMove, withBrainSinks, flushGitMirror, loopLatch, notificationLane, unsubscribeTaskNotifications, unsubGitRetry, unsubBoundary, unsub,
506
448
  runner: this.depsSeat,
507
449
  next: ({ final, threw, abortedLive, userInterruptedLive, strandedHumanAnswers }) => runTerminalAdoption({
508
450
  spec, queue, prepared, rs, stats, ident, emitCommitted, startedToolCallIds, toolLabels, timeout, compactionBrain, compactionBreaker, windowSafetyOptions,
509
- undrainedUserAtEnd, userInputLostAtEnd, final, threw, abortedLive, userInterruptedLive, runner: this.depsSeat, sessions: this.sessions,
451
+ undrainedUserAtEnd, userInputLostAtEnd, final, threw, abortedLive, userInterruptedLive, callerStop: loopLatch.callerStop, runner: this.depsSeat, sessions: this.sessions,
510
452
  next: ({ threw, comp, answerSettled, owedUserInput }) => runSettleAndTeardown({
511
453
  spec, queue, prepared, resume, internals, rs, stats, ident, loopLatch, timeout, ownCommittedTailRef,
512
454
  emitDelegationLifecycle, taskIdRef, manualCompactRef, drainManualCompact, final, threw, abortedLive, userInterruptedLive, answerSettled, strandedHumanAnswers, reasoningResolution, comp, compactionBreaker, owedUserInput,
@@ -539,7 +481,7 @@ export class Runner {
539
481
  outcome,
540
482
  taskConfig,
541
483
  internals,
542
- runner: this.depsSeat,
484
+ runner: this.depsSeat, sessions: this.sessions,
543
485
  parentConstraintRegistry: this.parentConstraintRegistry,
544
486
  next: (admitted) => this.resumeLadder(token, outcome, admitted),
545
487
  });
@@ -548,7 +490,7 @@ export class Runner {
548
490
  const { config, internals, store, cp, outcomeGate, resumeSignal, wakeMessage } = admitted;
549
491
  const { plainReviewOutcome, plainParkOutcome } = resumeReviewOutcome({ cp, outcome, outcomeGate, wakeMessage });
550
492
  const { plainPolicyOutcome: capturedPolicyOutcome, redeemedAnswer } = resumePolicyOutcome({ cp, outcome, config, runner: this.depsSeat });
551
- const { resumeInternals } = resumeCheckpointScreen({ cp, resumeSignal, internals, runner: this.depsSeat });
493
+ const { resumeInternals } = resumeCheckpointScreen({ cp, resumeSignal, internals, tools: config.tools, runner: this.depsSeat });
552
494
  const { recheckGovernanceWindow, windowEntrance } = resumeInternalsAndConfig({ cp, config, internals, outcomeGate, runner: this.depsSeat });
553
495
  if (windowEntrance !== undefined)
554
496
  await windowEntrance;
@@ -556,19 +498,19 @@ export class Runner {
556
498
  cp, config, internals, outcomeGate, wakeMessage, resumeSignal, recheckGovernanceWindow,
557
499
  plainPolicyOutcome: capturedPolicyOutcome, plainReviewOutcome, plainParkOutcome,
558
500
  runner: this.depsSeat, effectiveDelegationFacts,
559
- next: ({ wakeHookContext, plainPolicyOutcome, outcomeForStore }) => resumePreflight({
501
+ next: ({ wakeHookContext, legMods, plainPolicyOutcome, outcomeForStore }) => resumePreflight({
560
502
  token, cp, resumeSignal, recheckGovernanceWindow, store, runner: this.depsSeat,
561
503
  locallyClaimedTokens: this.locallyClaimedTokens, parentConstraintRegistry: this.parentConstraintRegistry, suspendedEnvReaps: this.suspendedEnvReaps,
562
504
  next: () => resumeClaim({
563
505
  token, cp, store, outcomeForStore,
564
506
  locallyClaimedTokens: this.locallyClaimedTokens, parentConstraintRegistry: this.parentConstraintRegistry,
565
- next: () => this.resumeHandoff({ token, cp, store, config, internals, resumeInternals, plainPolicyOutcome, redeemedAnswer, outcomeForStore, wakeMessage, wakeHookContext, resumeSignal }),
507
+ next: () => this.resumeHandoff({ token, cp, store, config, internals, resumeInternals, plainPolicyOutcome, redeemedAnswer, outcomeForStore, wakeMessage, wakeHookContext, legMods, resumeSignal }),
566
508
  }),
567
509
  }),
568
510
  });
569
511
  }
570
512
  async resumeHandoff(claimed) {
571
- const { token, cp, store, config, internals, resumeInternals, plainPolicyOutcome, redeemedAnswer, outcomeForStore, wakeMessage, wakeHookContext, resumeSignal } = claimed;
513
+ const { token, cp, store, config, internals, resumeInternals, plainPolicyOutcome, redeemedAnswer, outcomeForStore, wakeMessage, wakeHookContext, legMods, resumeSignal } = claimed;
572
514
  let consumeFlipDone = false;
573
515
  if (internals?.afterCheckpointResolve !== undefined) {
574
516
  await internals.afterCheckpointResolve();
@@ -616,7 +558,7 @@ export class Runner {
616
558
  ? new CheckpointError("checkpoint.reopen_failed", "the resume was aborted before the approved action could run AND the store refused to reopen the checkpoint — the approval is terminally consumed and the suspended work was not executed; a retry needs a fresh approval")
617
559
  : new CheckpointError("checkpoint.reopen_failed", "the resume was aborted before the approved action could run and the reopen attempt FAILED IN FLIGHT — the checkpoint's state is unprovable from here: it may already be pending again. Re-read it before deciding; do NOT issue a fresh approval on the assumption the old one is dead (the approved action did NOT run either way)");
618
560
  }
619
- return this.runTaskStream(spec, { cp, outcome: outcomeForStore, onEnvRestoreFailed, recordExecutionOutcome, ...(wakeMessage !== undefined ? { wakeMessage } : {}), ...(wakeHookContext !== undefined ? { wakeMessageHookContext: wakeHookContext } : {}) }, resumeInternals);
561
+ return this.runTaskStream(spec, { cp, outcome: outcomeForStore, onEnvRestoreFailed, recordExecutionOutcome, ...(wakeMessage !== undefined ? { wakeMessage } : {}), ...(wakeHookContext !== undefined ? { wakeMessageHookContext: wakeHookContext } : {}), ...(legMods !== undefined ? { legMods } : {}) }, resumeInternals);
620
562
  }
621
563
  }
622
564
  export function runTask(spec, deps) {