@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
@@ -3,11 +3,13 @@ import { FULL_SHELL_CONTRACT_ID } from "../../tools/fs/index.js";
3
3
  import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
4
4
  import { MEMORY_ENGINE_TOOL_NAMES } from "../memory-engine/tools.js";
5
5
  import { SHARED_MEMORY_TOOL_NAMES } from "../shared-memory/types.js";
6
+ import { announceMemoryNotMounted } from "./announce-once-ledger.js";
6
7
  import { protocolOf } from "../protocol-table.js";
7
8
  import { classifyDeferredWithGate } from "./tool-defer-gate.js";
8
9
  import { TOOL_SEARCH_NAME } from "./tool-disclosure.js";
9
10
  import { resolveToolSearch, toolSearchSettingOf } from "../tool-search-setting.js";
10
11
  import { RosterBuilder } from "../tool-roster.js";
12
+ import { valveLeaves } from "../../agents/tool-filter.js";
11
13
  function explicitlyDeferredMemoryTrio(mounted, roster, callerDeferNames) {
12
14
  return mounted ? MEMORY_ENGINE_TOOL_NAMES.filter((n) => roster.some((t) => t.name === n) && (callerDeferNames ?? []).includes(n)) : [];
13
15
  }
@@ -18,12 +20,8 @@ export function prepareDeferClassify(input) {
18
20
  const { spec, deps, roster, toolFaceSnapshot, handsEnabled, fullShellReachable, promptProfile, model, mcp, a2a, sharedMemoryPairMounted, memoryEnginePairMounted, memoryRecallSegment, onceLedger, sessionId } = input;
19
21
  const tools = roster.tools;
20
22
  let memoryBlock = input.memoryBlock;
21
- if (spec.excludeAllTools === true) {
22
- roster.unmountWhere(() => true);
23
- }
24
- else {
25
- roster.unmountWhere((t) => !toolFaceSnapshot.selector.admits(t));
26
- }
23
+ const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
24
+ roster.unmountWhere((t) => !leaves(t));
27
25
  if (handsEnabled) {
28
26
  const fullShellOnRoster = tools.some((t) => t.name === "Bash" && getToolContract(t, "core").contractId === FULL_SHELL_CONTRACT_ID);
29
27
  if (fullShellOnRoster !== fullShellReachable) {
@@ -47,7 +45,7 @@ export function prepareDeferClassify(input) {
47
45
  .map((t) => t.name);
48
46
  const resolvedToolSearch = resolveToolSearch(deps.toolSearch);
49
47
  const toolSearchSeat = toolSearchSettingOf(resolvedToolSearch);
50
- const toolSearchAdmitted = toolFaceSnapshot.selector.admits({ name: TOOL_SEARCH_NAME });
48
+ const toolSearchAdmitted = leaves({ name: TOOL_SEARCH_NAME });
51
49
  const classifyDeferredOverFace = (face, builtinDeferNames) => {
52
50
  const mounted = new Set(face.map((t) => t.name));
53
51
  const classified = classifyDeferredWithGate({
@@ -87,8 +85,7 @@ export function prepareDeferClassify(input) {
87
85
  const retractNames = memoryGroupRetractionSet(builtinDeferPairNames, memoryEnginePair.length > 0);
88
86
  roster.unmountWhere((t) => retractNames.has(t.name));
89
87
  if (sharedMemoryPair.length > 0) {
90
- onceLedger.onError(new Error(`Shared memory tools ${SHARED_MEMORY_TOOL_NAMES.join("/")} were NOT mounted: mounting them would inject ` +
91
- `the "${TOOL_SEARCH_NAME}" tool, whose name this task already declares — the pair mounts together or not at all.`), { phase: "config", sessionId, classification: "shared-memory-not-mounted" });
88
+ announceMemoryNotMounted(onceLedger, sessionId, "shared", SHARED_MEMORY_TOOL_NAMES, `mounting them would inject the "${TOOL_SEARCH_NAME}" tool, whose name this task already declares`);
92
89
  }
93
90
  if (memoryEnginePair.length > 0) {
94
91
  if (memoryBlock !== undefined && memoryRecallSegment !== undefined) {
@@ -100,8 +97,7 @@ export function prepareDeferClassify(input) {
100
97
  else if (memoryBlock.startsWith(`${segment}\n\n`))
101
98
  memoryBlock = memoryBlock.slice(segment.length + 2);
102
99
  }
103
- onceLedger.onError(new Error(`Memory tools ${MEMORY_ENGINE_TOOL_NAMES.join("/")} were NOT mounted: mounting them would inject ` +
104
- `the "${TOOL_SEARCH_NAME}" tool, whose name this task already declares — these tools mount together or not at all.`), { phase: "config", sessionId, classification: "memory-tools-not-mounted" });
100
+ announceMemoryNotMounted(onceLedger, sessionId, "engine", MEMORY_ENGINE_TOOL_NAMES, `mounting them would inject the "${TOOL_SEARCH_NAME}" tool, whose name this task already declares`);
105
101
  }
106
102
  deferred = d0;
107
103
  }
@@ -30,11 +30,11 @@ export interface PrepareDelegationSurfaceInput {
30
30
  /** borrowed-readonly — the REBOUND spec. Read: `tools` (the shadow checks and the revival spawner's delegation-tool
31
31
  * lookup), `oneShot` (the read/kill faces' completion promises), `retainBackgroundProcesses` (the Monitor receipt),
32
32
  * `handsReadOnly` is NOT read here (the hands mount decided the surface). Never mutated. */
33
- spec: Pick<TaskSpec, "tools" | "oneShot" | "retainBackgroundProcesses">;
33
+ spec: Pick<TaskSpec, "tools" | "oneShot" | "retainBackgroundProcesses" | "excludeAllTools">;
34
34
  /** borrowed-readonly — the deployment seats the mounts read: `workflowRunStore` / `backgroundAgentStore` / `mailboxStore` (the
35
35
  * read/kill faces and the tier-3 revival seams), `rosterStore`, `peerLane`, `peerDirectory`, `onNotice`,
36
36
  * `onBackgroundChildEvent`, `tracer`. */
37
- deps: Pick<RunnerDeps, "workflowRunStore" | "backgroundAgentStore" | "mailboxStore" | "rosterStore" | "peerLane" | "peerDirectory" | "onNotice" | "onBackgroundChildEvent" | "tracer">;
37
+ deps: Pick<RunnerDeps, "workflowRunStore" | "backgroundAgentStore" | "mailboxStore" | "rosterStore" | "peerLane" | "peerDirectory" | "principalInboxConsumer" | "onNotice" | "onBackgroundChildEvent" | "tracer">;
38
38
  /** borrowed-readonly — the trusted spawn-side channel: `parentNotify` (the delegated-child door), the uplink / sibling /
39
39
  * identity seats the SendMessage mount forwards, `onTaskNotification`, `onSubagentSpawn`. Never mutated. */
40
40
  internals: Pick<RunInternals, "parentNotify" | "parentPeerRef" | "uplinkSessionId" | "parentRetainLedger" | "explicitAgentName" | "parentTaskId" | "parentSessionId" | "peerSelfRef" | "peerInboundChainRef" | "onTaskNotification" | "onSubagentSpawn"> | undefined;
@@ -1,8 +1,9 @@
1
1
  import { createAgentTranscriptTool, AGENT_TRANSCRIPT_TOOL_NAME } from "../../agents/agent-transcript-tool.js";
2
2
  import { createSendMessageTool, SEND_MESSAGE_TOOL_NAME } from "../../agents/send-message-tool.js";
3
- import { listAgentsMountable, mountListAgents, peerLaneSendMessageSeats } from "../../agents/peer-session-drain.js";
3
+ import { listAgentsMountable, mountListAgents, peerLaneSendMessageSeats, terminalsDrainPrincipalInbox } from "../../agents/peer-session-drain.js";
4
4
  import { resolvePeerLaneConfig } from "../../agents/peer-admission.js";
5
5
  import { createReadInboxTool, READ_INBOX_TOOL_NAME } from "../../agents/read-inbox-tool.js";
6
+ import { valveLeaves } from "../../agents/tool-filter.js";
6
7
  import { createMonitorTool } from "../../tools/monitor.js";
7
8
  import { createWorktreeTools } from "../../tools/worktree.js";
8
9
  import { createTaskOutputTool, createTaskStopTool, defaultTaskRegistry } from "../task-registry.js";
@@ -15,6 +16,7 @@ export function prepareDelegationSurface(input) {
15
16
  const { spec, deps, internals, resume, sessionId, hostTaskId, taskScope, taskRootFinal, taskRootCanonical, executionEnv, runnerSelf, backgroundTaskToolsActive, workflowToolsActive, peerLaneActive, peerSendMessageBuiltIn, peerLaneRefs, sessionBox, roster, toolEffects, axisExplicitNegatives, envHandToolNames, toolFaceSnapshot, firstPartyOffload, offloadStore, subagentRetain, enrichSpecToolCtx, checkpointSeat, handsCwdRef, wsSnapshot, rebaseWsPath, rebaseRestoredPath, workspaceStateSettle } = input;
16
17
  let worktreeSessionRef;
17
18
  const delegationSurfaceActive = backgroundTaskToolsActive || workflowToolsActive;
19
+ const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
18
20
  let sendMessageTier;
19
21
  if (delegationSurfaceActive || internals?.parentNotify !== undefined || peerLaneActive) {
20
22
  if (delegationSurfaceActive) {
@@ -54,7 +56,7 @@ export function prepareDelegationSurface(input) {
54
56
  ...(deps.backgroundAgentStore !== undefined ? { agentStore: deps.backgroundAgentStore } : {}),
55
57
  ...(deps.mailboxStore !== undefined ? { mailbox: deps.mailboxStore } : {}),
56
58
  ...(reviveSpawn !== undefined ? { reviveSpawn } : {}),
57
- ...(peerLaneActive ? peerLaneSendMessageSeats({ peerDirectory: deps.peerDirectory, sessionId, scope: taskScope, ...(internals?.explicitAgentName !== undefined ? { name: internals.explicitAgentName } : {}), refs: peerLaneRefs, listingMounted: listAgentsMountable({ selector: toolFaceSnapshot.selector, specTools: spec.tools ?? [] }) }) : {}),
59
+ ...(peerLaneActive ? peerLaneSendMessageSeats({ peerDirectory: deps.peerDirectory, sessionId, scope: taskScope, ...(internals?.explicitAgentName !== undefined ? { name: internals.explicitAgentName } : {}), refs: peerLaneRefs, listingMounted: listAgentsMountable({ leaves, specTools: spec.tools ?? [] }) }) : {}),
58
60
  onNotifyError: (f) => emitTrace(deps.tracer, () => ({ kind: "observer.notify_failed", version: 1, taskId: hostTaskId, site: f.site, message: f.error.message, ts: Date.now() })),
59
61
  onTranscriptIntegrityGap: (handle, scope) => deliverEngineNotice(deps.onNotice, {
60
62
  code: "delegation.transcript_integrity",
@@ -80,11 +82,11 @@ export function prepareDelegationSurface(input) {
80
82
  }
81
83
  }
82
84
  }
83
- if (sessionBox !== undefined && internals?.onTaskNotification !== undefined && toolFaceSnapshot.selector.admits({ name: READ_INBOX_TOOL_NAME }) && !(spec.tools ?? []).some((t) => t.name === READ_INBOX_TOOL_NAME)) {
85
+ if (sessionBox !== undefined && internals?.onTaskNotification !== undefined && leaves({ name: READ_INBOX_TOOL_NAME }) && !(spec.tools ?? []).some((t) => t.name === READ_INBOX_TOOL_NAME)) {
84
86
  toolEffects.set(READ_INBOX_TOOL_NAME, "read");
85
- roster.mount(firstPartyOffload(createReadInboxTool({ pull: () => peerLaneRefs.pull })), { source: "builtin", mountedBy: "peerLane" });
87
+ roster.mount(firstPartyOffload(createReadInboxTool({ pull: () => peerLaneRefs.pull, ...(terminalsDrainPrincipalInbox(deps) ? { coversPrincipalInbox: true } : {}) })), { source: "builtin", mountedBy: "peerLane" });
86
88
  }
87
- const listAgents = (peerLaneActive || delegationSurfaceActive) && peerSendMessageBuiltIn && listAgentsMountable({ selector: toolFaceSnapshot.selector, specTools: spec.tools ?? [] }) ? mountListAgents({ ...(peerLaneActive ? { peerDirectory: deps.peerDirectory } : {}), freshWindowMs: resolvePeerLaneConfig(deps.peerLane, deps.onNotice).listingFreshWindowMs, sessionId, scope: taskScope, hostTaskId, ...(internals?.parentTaskId !== undefined ? { parentTaskId: internals.parentTaskId } : {}), ...(internals?.parentSessionId !== undefined ? { parentSessionId: internals.parentSessionId } : {}), registry: defaultTaskRegistry, ...(deps.rosterStore !== undefined ? { roster: deps.rosterStore } : {}), ...(sendMessageTier !== undefined ? { continuationTier: sendMessageTier } : {}), ...(checkpointSeat !== undefined ? { readSeats: { checkpointSeat } } : {}), specTools: spec.tools ?? [], toolEffects }) : undefined;
89
+ const listAgents = (peerLaneActive || delegationSurfaceActive) && peerSendMessageBuiltIn && listAgentsMountable({ leaves, specTools: spec.tools ?? [] }) ? mountListAgents({ ...(peerLaneActive ? { peerDirectory: deps.peerDirectory } : {}), freshWindowMs: resolvePeerLaneConfig(deps.peerLane, deps.onNotice).listingFreshWindowMs, sessionId, scope: taskScope, hostTaskId, ...(internals?.parentTaskId !== undefined ? { parentTaskId: internals.parentTaskId } : {}), ...(internals?.parentSessionId !== undefined ? { parentSessionId: internals.parentSessionId } : {}), registry: defaultTaskRegistry, ...(deps.rosterStore !== undefined ? { roster: deps.rosterStore } : {}), ...(sendMessageTier !== undefined ? { continuationTier: sendMessageTier } : {}), ...(checkpointSeat !== undefined ? { readSeats: { checkpointSeat } } : {}), specTools: spec.tools ?? [], toolEffects }) : undefined;
88
90
  if (listAgents !== undefined)
89
91
  roster.mount(firstPartyOffload(listAgents), { source: "builtin", mountedBy: "peerLane" });
90
92
  if (backgroundTaskToolsActive) {
@@ -30,7 +30,8 @@ import type { Arbitration, ToolMarkSource } from "../ask-origin.js";
30
30
  import { type PermissionModeController } from "../mode-policy.js";
31
31
  import type { AutoModeDecider, AutoModeDenialTracker } from "../auto-mode.js";
32
32
  import { type ComplianceCapability } from "../compliance.js";
33
- import { type HookEnvCapabilities, type HookInvocationIdentity, type Hooks } from "../hooks.js";
33
+ import type { InheritedToolCheck, LegModBus } from "../mods/stations.js";
34
+ import { type HookEnvCapabilities, type HookInvocationIdentity } from "../hooks.js";
34
35
  import type { ToolPolicy } from "../tool-policy.js";
35
36
  import { type GateOutcome } from "../gate-outcome.js";
36
37
  import type { RunnerDeps, TaskSpec, ToolEffect } from "../types.js";
@@ -95,9 +96,11 @@ export interface PrepareGateStationsInput {
95
96
  };
96
97
  /** borrowed-readonly — the policy chain's effective policy, or undefined; presence only (the arming predicate). */
97
98
  effectivePolicy: ToolPolicy | undefined;
98
- /** borrowed-readonly — the resolved hook record: `preToolUse` presence (arming), the two post seats and the failure seat
99
- * (the `tool_result` station), called through the record so a class-instance keeps its receiver. */
100
- hooks: Hooks | undefined;
99
+ /** borrowed-readonly — the leg's mods bus: `classic.PreToolUse` presence arms the gate; the screenings and the post-call
100
+ * events are raised on it. */
101
+ modBus: LegModBus;
102
+ /** borrowed-readonly — the inherited installations the gate raises `tool.check` on after `modBus` (the inherited-gate phase's). */
103
+ inheritedToolChecks: readonly InheritedToolCheck[];
101
104
  /** borrowed-readonly — the egress vocabulary: arming, and the per-call `egress` flag handed to the gate. */
102
105
  egressTools: ReadonlySet<string>;
103
106
  /** borrowed-readonly — the irreversible vocabulary: arming only. */
@@ -138,7 +141,7 @@ export interface PrepareGateStationsInput {
138
141
  batchHaltRef: Prepared["batchHaltRef"];
139
142
  /** borrowed-readonly — whether blocked/suspended ids are tracked at all (the post-tool callbacks exist). */
140
143
  blockedTracked: boolean;
141
- /** borrowed-readonly — the leg's identity envelope every HookToolContext and PermissionDeniedPayload carries. */
144
+ /** borrowed-readonly — the leg's identity envelope every classic event and PermissionDeniedPayload carries. */
142
145
  hookIdentity: HookInvocationIdentity;
143
146
  /** borrowed-readonly — the leg's reminder provenance mark (every model-facing deny reason and hook context carries it). */
144
147
  reminderMark: string;
@@ -146,10 +149,6 @@ export interface PrepareGateStationsInput {
146
149
  hostTaskId: string;
147
150
  /** borrowed-readonly — the acquired session id (the settlement defects' error tag). */
148
151
  sessionId: string;
149
- /** borrowed-readonly — the screening face as the gate must see it (the observational wrapper or the face itself). */
150
- ownGatePreToolUse: Hooks["preToolUse"] | undefined;
151
- /** borrowed-readonly — the validated per-prepare hook seat bound. */
152
- hookTimeoutMs: number;
153
152
  /** borrowed-readonly — the hand's live tracked cwd, or undefined; `current` is read per screening / per post seat. Not
154
153
  * written here. */
155
154
  handsCwdRef: CwdRef | undefined;
@@ -237,8 +236,6 @@ export interface PrepareGateStationsInput {
237
236
  delegation: {
238
237
  isDelegatedChild: boolean;
239
238
  };
240
- /** borrowed-readonly — the own hook-crash reporter (an expired post seat is reported through it). */
241
- notifyOwnHookCrash: (err: unknown) => void;
242
239
  /** borrowed-mutable — the leg's settlement seam. Writer here: the `tool_result` station marks a carrier whose output
243
240
  * a host hook rewrote (`noteHostRewrite`), so a frame the rewrite removed settles as the host's decision. */
244
241
  frameSettlement: FrameSettlement;
@@ -1,9 +1,9 @@
1
1
  import { SEND_MESSAGE_TOOL_NAME } from "../../agents/send-message-tool.js";
2
2
  import { mountedToolRequiresUserInteraction } from "../mode-policy.js";
3
3
  import { complianceCallDenial } from "../compliance.js";
4
- import { cloneObserverInput, formatHookFeedback, runToolGate } from "../hooks.js";
4
+ import { formatHookFeedback, runToolGate } from "../hooks.js";
5
5
  import { screenGateOutcome } from "../gate-outcome.js";
6
- import { directDeny, frozenInputSnapshot } from "./gate-exit.js";
6
+ import { cloneObserverInput, directDeny, frozenInputSnapshot } from "./gate-exit.js";
7
7
  import { emitTrace } from "../trace.js";
8
8
  import { deliverEngineNotice } from "../engine-notice.js";
9
9
  import { askUnresolvableNotice } from "../ask-unresolvable-notice.js";
@@ -46,8 +46,7 @@ export function maybeHumanRejectionHalt(input) {
46
46
  };
47
47
  }
48
48
  export function prepareGateStations(input) {
49
- const { askLane, parkAsk, tools, toolRosterDeltas, toolEffects, deps, toolCallGateArmedRef, effectivePolicy, hooks, egressTools, irreversibleTools, spec, complianceDenies, harness, blockedToolCalls, inheritedAskGrants, inheritedUnavailableAsks, foldAskClasses, ancestorSandboxAdmissions, preToolContexts, toolOccurrences, batchHaltRef, blockedTracked, hookIdentity, reminderMark, hostTaskId, sessionId, ownGatePreToolUse, hookTimeoutMs, handsCwdRef, stampCallTarget, hookEnvFace, writeProtectionCheck, shellReadCheck, readFace, irreversibilityTier, reversibilityProbes, abortController, shellGatedTools, autoModeDecider, autoModeDenialTracking, askRoute, permissionMode, toolMarkSources, a2aIsolatePeers, ancestorArbitrations, runId, stopForDenialLimit, permissionRuleLane, permissionRuleOrgLane, questionToolMounted, sandboxAdmissionArmed, sandboxBoundaryCapable, emitSandboxAdmitted, delegation, notifyOwnHookCrash, frameSettlement, seatInputsFor } = input;
50
- const gatePreToolUse = ownGatePreToolUse !== undefined ? (name, args, ctx) => ownGatePreToolUse(name, args, { ...ctx, permissionMode: permissionMode.observed }) : undefined;
49
+ const { askLane, parkAsk, tools, toolRosterDeltas, toolEffects, deps, toolCallGateArmedRef, effectivePolicy, egressTools, irreversibleTools, spec, complianceDenies, harness, blockedToolCalls, inheritedAskGrants, inheritedUnavailableAsks, foldAskClasses, ancestorSandboxAdmissions, preToolContexts, toolOccurrences, batchHaltRef, blockedTracked, hookIdentity, reminderMark, hostTaskId, sessionId, handsCwdRef, stampCallTarget, hookEnvFace, writeProtectionCheck, shellReadCheck, readFace, irreversibilityTier, reversibilityProbes, abortController, shellGatedTools, autoModeDecider, autoModeDenialTracking, askRoute, permissionMode, toolMarkSources, a2aIsolatePeers, ancestorArbitrations, runId, stopForDenialLimit, permissionRuleLane, permissionRuleOrgLane, questionToolMounted, sandboxAdmissionArmed, sandboxBoundaryCapable, emitSandboxAdmitted, delegation, frameSettlement, seatInputsFor, modBus, inheritedToolChecks } = input;
51
50
  const releasesAnnounced = new Map();
52
51
  const onModeReleased = (info) => {
53
52
  const table = info.readUnestablished === true ? input.readDenyInForce(info.toolCallId) : undefined;
@@ -81,7 +80,7 @@ export function prepareGateStations(input) {
81
80
  const writeProtectionArmed = writeProtectionCheck !== undefined && tools.some((t) => PATH_CONFINABLE_WRITE_TOOLS.has(t.name));
82
81
  toolCallGateArmedRef.armed =
83
82
  effectivePolicy !== undefined ||
84
- hooks?.preToolUse !== undefined ||
83
+ modBus.hasHandlers("classic.PreToolUse") ||
85
84
  egressTools.size > 0 ||
86
85
  irreversibleTools.size > 0 ||
87
86
  spec.enablePlanMode === true ||
@@ -119,8 +118,9 @@ export function prepareGateStations(input) {
119
118
  ...(e.signal !== undefined ? { callSignal: e.signal } : {}),
120
119
  identity: hookIdentity,
121
120
  reminderMark,
122
- ...(gatePreToolUse !== undefined ? { preToolUse: gatePreToolUse } : {}),
123
- hookTimeoutMs,
121
+ modBus,
122
+ ...(inheritedToolChecks.length > 0 ? { inheritedToolChecks } : {}),
123
+ observedPermissionMode: () => permissionMode.observed,
124
124
  ...(handsCwdRef !== undefined ? { trackedCwd: () => handsCwdRef.current } : {}),
125
125
  ...(stampCallTarget !== undefined ? { stampCallTarget } : {}),
126
126
  ...(hookEnvFace !== undefined ? { hookEnv: hookEnvFace } : {}),
@@ -137,7 +137,6 @@ export function prepareGateStations(input) {
137
137
  irreversibility: tierSeat?.value,
138
138
  reversibilityProbe: tierSeat?.read(reversibilityProbes),
139
139
  abortSignal: abortController.signal,
140
- ...(notifyPermissionDenied ? { permissionDenied: (p) => notifyPermissionDenied({ ...p, permissionMode: permissionMode.observed }) } : {}),
141
140
  onHookError: notifyHookError,
142
141
  shellGated: tierSeat?.shellGated(shellGatedTools, toolMarkSources) === true,
143
142
  ...(autoModeDecider.current !== undefined ? { autoMode: { decider: autoModeDecider.current, ...(autoModeDenialTracking.current !== undefined ? { denialTracking: autoModeDenialTracking.current } : {}), unavailable: classifierUnavailableSeat({ station: "leg", ...(autoModeDecider.current.timeoutMs !== undefined ? { budgetMs: autoModeDecider.current.timeoutMs } : {}), route: approvalRouteOf(askRoute), onNotice: deps.onNotice, sessionId, runId }) } } : {}),
@@ -241,13 +240,15 @@ export function prepareGateStations(input) {
241
240
  }
242
241
  return { block: true, reason: result.reason, ...details };
243
242
  }
243
+ if (result.suspend === undefined)
244
+ toolOccurrences.release(e.toolCallId);
244
245
  return result.updatedInput !== undefined ? { updatedInput: result.updatedInput } : undefined;
245
246
  });
246
247
  }
247
248
  }
248
- const toolResultStation = createToolResultStation({ hooks, blockedToolCalls, toolRosterDeltas, preToolContexts, hookTimeoutMs, abortController, spec, handsCwdRef, hookEnvFace, hookIdentity, permissionMode, notifyOwnHookCrash, reminderMark, frameSettlement });
249
+ const toolResultStation = createToolResultStation({ modBus, blockedToolCalls, toolRosterDeltas, preToolContexts, abortController, spec, handsCwdRef, hookEnvFace, hookIdentity, permissionMode, reminderMark, frameSettlement });
249
250
  if (toolResultStation !== undefined)
250
251
  harness.on("tool_result", toolResultStation);
251
- const approvedCallScreen = createApprovedCallScreen({ preToolUse: gatePreToolUse, hookTimeoutMs, abortController, handsCwdRef, hookEnvFace, hookIdentity, notifyOwnHookCrash, preToolContexts });
252
+ const approvedCallScreen = createApprovedCallScreen({ modBus, permissionMode, abortController, handsCwdRef, hookEnvFace, hookIdentity, preToolContexts });
252
253
  return { toolCallStationArmed: toolCallGateArmedRef.armed, toolResultStationArmed: toolResultStation !== undefined, ...(approvedCallScreen !== undefined ? { approvedCallScreen } : {}) };
253
254
  }
@@ -88,7 +88,7 @@ export interface PrepareHandsReadFaceInput {
88
88
  /** borrowed-readonly — the task-spec seats this phase reads, as a Pick over the SAME spec object
89
89
  * (R-4). `tools` feeds only the band shadow check; `envFacts` only the advertised scratchpad;
90
90
  * `retainBackgroundProcesses` only the band's retain lane (Bash's lifetime sentence + row stamp). */
91
- spec: Pick<TaskSpec, "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "handsReadOnly" | "readDenyPatterns" | "readFace" | "writeFace" | "oneShot" | "resumeAt" | "retainBackgroundProcesses" | "sessionId" | "tools">;
91
+ spec: Pick<TaskSpec, "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "handsReadOnly" | "readDenyPatterns" | "readFace" | "writeFace" | "oneShot" | "resumeAt" | "retainBackgroundProcesses" | "sessionId" | "tools" | "excludeAllTools">;
92
92
  /** borrowed-readonly — the deployment seats this phase reads, as a Pick over the SAME deps
93
93
  * object (R-4: `deps.onError?.()` keeps its receiver; a new deps read must widen this Pick).
94
94
  * `readDenyBuiltinTiers`/`readDenyBuiltinExclude` are SNAPSHOTTED before the first await that
@@ -21,6 +21,7 @@ import { RosterBuilder } from "../tool-roster.js";
21
21
  import { unionAddOnly } from "../child-clamp-seats.js";
22
22
  import { assertStringArraySeat } from "../read-face-seats.js";
23
23
  import { modePolicyOf } from "../mode-policy.js";
24
+ import { valveLeaves } from "../../agents/tool-filter.js";
24
25
  const faceClampAnnouncedSinks = { read: new WeakSet(), write: new WeakSet() };
25
26
  const faceClampConsoleAnnounced = { read: false, write: false };
26
27
  function announceDeploymentFaceClamp(kind, sink) {
@@ -370,7 +371,7 @@ export async function prepareHandsMount(input) {
370
371
  return memoryWriteGate?.(w);
371
372
  },
372
373
  mountBackgroundTaskTools: false,
373
- monitorToolActive: backgroundTaskToolsActive && toolFaceSnapshot.selector.admits({ name: "Monitor" }),
374
+ monitorToolActive: backgroundTaskToolsActive && valveLeaves(spec, toolFaceSnapshot.selector)({ name: "Monitor" }),
374
375
  });
375
376
  {
376
377
  const bandNames = new Set(band.flatMap((t) => [t.name, ...(t.aliases ?? [])]));
@@ -31,14 +31,15 @@ import type { AgentHarness, ExecutionEnv } from "../../internal/harness.js";
31
31
  import type { SubagentWorktreeIsolation } from "../../agents/subagent.js";
32
32
  import { forkGovernanceDenial } from "../../agents/subagent.js";
33
33
  import type { SubagentRetainLedger } from "../../agents/retain-ledger.js";
34
- import type { PromptEpochArtifact } from "../../prompt-assembly/artifact.js";
34
+ import type { PromptArtifact } from "../../prompt-assembly/artifact.js";
35
35
  import type { ContainmentFace } from "../../tools/fs/index.js";
36
36
  import type { AutoModeArmingRecipe } from "../auto-mode-arming.js";
37
37
  import type { AutoModeDecider, AutoModeDenialTracker } from "../auto-mode.js";
38
38
  import { type OnQuestion } from "../ask-question.js";
39
39
  import { type ParentSpecSeat } from "../parent-spec-seat.js";
40
+ import { type HookEnvCapabilities } from "../hooks.js";
41
+ import { type LegModBus, type ModChainLink } from "../mods/stations.js";
40
42
  import { type ChildClampSource } from "../child-clamp-seats.js";
41
- import { type HookEnvCapabilities, type Hooks } from "../hooks.js";
42
43
  import type { LockedPreflight } from "../locked-config.js";
43
44
  import type { OwnOrgAdmissionVerdict } from "../memory-admission.js";
44
45
  import type { DelegationContentSafety } from "../memory-engine/delegation-provenance.js";
@@ -157,13 +158,10 @@ export interface PrepareInheritedGateInput {
157
158
  /** borrowed-readonly — LATE-BOUND: the per-principal entitlements the caps phase resolves after this one; read only inside
158
159
  * `inheritedGateForChildren` (the two mandate tests), at spawn time. */
159
160
  runtimeCaps: () => RuntimeCaps | undefined;
160
- /** borrowed-readonly — LATE-BOUND: the resolved hook record (`spec.hooks ?? deps.hooks`), read inside the chain assembly for
161
- * this task's own screening face. */
162
- hooks: () => Hooks | undefined;
163
- /** borrowed-readonly — LATE-BOUND: whether the deployment declared its screening face observational (then it rides no entry). */
164
- preToolUseObservational: () => boolean;
165
- /** borrowed-readonly — LATE-BOUND: the validated per-invocation hook bound the screening-face entry's policy runs under. */
166
- hookTimeoutMs: () => number;
161
+ /** borrowed-readonly — the leg's mods bus: the chain assembly mints this leg's screening entry over its `classic.PreToolUse` chain. */
162
+ modBus: LegModBus;
163
+ /** borrowed-readonly — this leg's chain identity as its admission recorded it (`chainOfBus`) — the installation identity's chain term. */
164
+ ownModChain: readonly ModChainLink[];
167
165
  /** borrowed-readonly — LATE-BOUND: the hook-env capability face the screening-face entry's policy resolves paths in. */
168
166
  hookEnvFace: () => HookEnvCapabilities | undefined;
169
167
  /** borrowed-readonly — LATE-BOUND: the armed classifier (undefined = not armed), read where the chain freezes it onto both
@@ -192,7 +190,7 @@ export interface PrepareInheritedGateInput {
192
190
  handsLessResolvedWriteFace: () => WriteFaceSeat | undefined;
193
191
  /** borrowed-readonly — LATE-BOUND: the adopted center artifact (ctx `centerArtifactDigest` / `centerSourceRevision`). */
194
192
  centerAdoption: () => {
195
- artifact: PromptEpochArtifact;
193
+ artifact: PromptArtifact;
196
194
  sourceRevision?: string;
197
195
  } | undefined;
198
196
  /** borrowed-readonly — LATE-BOUND: the memory-engine session (the ctx's capture-floor getters read it at THEIR call time). */
@@ -296,8 +294,6 @@ export interface PrepareInheritedGateResult {
296
294
  /** owned — the env the screening face sees through `ctx.env` (identity half of a chain entry's `hookEnv`); the policy-chain
297
295
  * station's pass-through arm compares against it. */
298
296
  hookEnvSource: unknown;
299
- /** owned — the deployment lane for a screening face that crashes while screening a descendant's call (phase "hook"). */
300
- notifyOwnHookCrash: (err: unknown) => void;
301
297
  /** owned — the FROZEN question seat (spec over deps), the content-ask twin of `frozenOnAsk`. */
302
298
  frozenOnQuestion: OnQuestion | undefined;
303
299
  /** owned — the parent SPEC seat this run hands its children (`parentSpecSeatOf(spec, frozenOnQuestion)`): the ctx seat and the Workflow mount dep are this one value; both lanes apply it with `applyParentSpecSeat` (one law). */
@@ -1,11 +1,12 @@
1
1
  import { forkGovernanceDenial, resolveDelegationEntryCaps } from "../../agents/subagent.js";
2
2
  import { isLiveQuestionFace } from "../ask-question.js";
3
3
  import { parentSpecSeatOf } from "../parent-spec-seat.js";
4
- import { childClampSeats, clampSourceOf } from "../child-clamp-seats.js";
5
4
  import { createPreToolUseConstraintPolicy } from "../hooks.js";
5
+ import { chainJudges, sameInstallation } from "../mods/stations.js";
6
+ import { childClampSeats, clampSourceOf } from "../child-clamp-seats.js";
6
7
  import { continuesLineage } from "../session-policy-store.js";
7
8
  import { StubExecutionEnv } from "../stub-env.js";
8
- import { askApproverIdentity, durableMandateSourceOf } from "../tool-policy.js";
9
+ import { durableMandateSourceOf } from "../tool-policy.js";
9
10
  import { chainAnchorRecords } from "./child-tree.js";
10
11
  import { deliverEngineNotice } from "../types.js";
11
12
  import { PermissionModeController, autoModeFaceOf, modeRequestAfterResume } from "../mode-policy.js";
@@ -13,7 +14,7 @@ import { SessionModeSeats } from "./session-mode-seats.js";
13
14
  import { recordedModeSeed } from "../checkpoint-store.js";
14
15
  import { frozenSkillGrants } from "../skill-grant.js";
15
16
  import { attachRebuiltDenialTrackers, createDenialLimitStop } from "./denial-limit-arms.js";
16
- import { asThrownError } from "../thrown-value.js";
17
+ import { valveLeaves } from "../../agents/tool-filter.js";
17
18
  export function prepareInheritedGate(input) {
18
19
  const { spec, deps, askSeat, internals, resume, sessions, sessionId, runId, hostTaskId, taskRootFinal, executionEnv, ownedEnv, lockedPreflight, pathRuleAnchors, toolFaceSnapshot, mountsCallerTool, promptProfile, resolvedInteractionPosture, permissionModeSeat, handsEnabled, reportUsage, harnessRef, skillGrants, forwardEvent, subagentRetain, worktreeIsolation, requestReview, requestStopAfterTurn, enterPlanMode, reminderMark, reminderDisclosureCounts, fileHistoryEnabled, historyScope, historyRoot, historyFs, abortRun } = input;
19
20
  const liveInheritedGate = internals?.inheritedGate;
@@ -117,13 +118,6 @@ export function prepareInheritedGate(input) {
117
118
  const skillGrantCheckpointSection = () => frozenSkillGrants(skillGrants);
118
119
  const frozenOnAsk = askSeat.value;
119
120
  const hookEnvSource = (ownedEnv ?? deps.executionEnv) != null ? executionEnv : undefined;
120
- const notifyOwnHookCrash = (err) => {
121
- try {
122
- deps.onError?.(asThrownError(err), { phase: "hook", sessionId });
123
- }
124
- catch {
125
- }
126
- };
127
121
  const frozenOnQuestion = spec.onQuestion ?? deps.onQuestion;
128
122
  const parentSpecSeat = parentSpecSeatOf(spec, frozenOnQuestion);
129
123
  const provenanceForChildrenRef = {};
@@ -142,18 +136,12 @@ export function prepareInheritedGate(input) {
142
136
  const durableMandate = durableMandateSourceOf({ forceDurableGate: input.runtimeCaps()?.forceDurableGate === true, durableApprovalDeclared: spec.durableApproval !== undefined, onAsk: frozenOnAsk }) !== undefined;
143
137
  const contentMandate = input.runtimeCaps()?.forceDurableGate === true ||
144
138
  (spec.durableApproval !== undefined && !isLiveQuestionFace(frozenOnQuestion));
145
- const ownPreToolUse = input.preToolUseObservational() ? undefined : input.hooks()?.preToolUse;
146
- const hookConstraint = ownPreToolUse !== undefined &&
147
- !(inheritedParentConstraints ?? []).some((pc) => pc.preToolUse === ownPreToolUse &&
148
- askApproverIdentity(pc.onAsk) === askApproverIdentity(frozenOnAsk) &&
149
- (pc.durableMandate === true) === durableMandate &&
150
- (pc.contentMandate === true) === contentMandate &&
151
- pc.hookEnv === hookEnvSource &&
152
- pc.autoMode?.decider === autoModeDecider)
139
+ const ownInstallation = { chain: input.ownModChain, onAsk: frozenOnAsk, durableMandate, contentMandate, hookEnv: hookEnvSource, decider: autoModeDecider };
140
+ const hookConstraint = chainJudges(input.modBus) && !(inheritedParentConstraints ?? []).some((pc) => sameInstallation(pc, ownInstallation))
153
141
  ? [
154
142
  {
155
- policy: createPreToolUseConstraintPolicy(ownPreToolUse, input.hookEnvFace(), notifyOwnHookCrash, input.hookTimeoutMs()),
156
- preToolUse: ownPreToolUse,
143
+ policy: createPreToolUseConstraintPolicy(input.modBus, input.hookEnvFace()),
144
+ mods: input.ownModChain,
157
145
  ...(hookEnvSource !== undefined ? { hookEnv: hookEnvSource } : {}),
158
146
  ...(frozenOnAsk !== undefined ? { onAsk: frozenOnAsk } : {}),
159
147
  ...(durableMandate ? { durableMandate: true } : {}),
@@ -205,8 +193,7 @@ export function prepareInheritedGate(input) {
205
193
  const fullShellReachable = handsEnabled &&
206
194
  !(executionEnv instanceof StubExecutionEnv) &&
207
195
  spec.handsReadOnly !== true &&
208
- spec.excludeAllTools !== true &&
209
- toolFaceSnapshot.selector.admits({ name: "Bash" });
196
+ valveLeaves(spec, toolFaceSnapshot.selector)({ name: "Bash" });
210
197
  const { gateStopRef, stopForDenialLimit } = createDenialLimitStop({ sessionId, runId, onNotice: deps.onNotice, abort: abortRun });
211
198
  const delegationEntryCapsResolved = resolveDelegationEntryCaps(deps.delegationEntryCaps);
212
199
  const enrichSpecToolCtx = (ctx) => {
@@ -305,5 +292,5 @@ export function prepareInheritedGate(input) {
305
292
  ...(spec.enablePlanMode === true ? { enterPlanMode } : {}),
306
293
  };
307
294
  };
308
- return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, commitModeSeats, endModeCeiling, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, runClampSource, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
295
+ return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, commitModeSeats, endModeCeiling, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, runClampSource, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, frozenOnAsk, hookEnvSource, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
309
296
  }
@@ -5,7 +5,7 @@ import type { ResolvedSkillListingBudget } from "../skill-listing-budget.js";
5
5
  export interface PrepareListingsInput {
6
6
  /** borrowed-readonly — the REBOUND spec (`spec′`). Read: `tools` (the roster-bearing delegation tool, by its `agentListing`
7
7
  * marker), `sessionId` (continuation ⇒ seeded/removal projections), `attachments` (the two opt-outs). Never mutated. */
8
- spec: Pick<TaskSpec, "agents" | "tools" | "sessionId" | "attachments">;
8
+ spec: Pick<TaskSpec, "agents" | "tools" | "sessionId" | "attachments" | "excludeAllTools">;
9
9
  /** borrowed-readonly — the once-per-session ledger: its deduplicated operator sink (`onError`) and
10
10
  * the whole announced snapshot (`arms()`) the mirror is seeded from. */
11
11
  onceLedger: AnnounceOnceSink & {
@@ -1,17 +1,19 @@
1
1
  import { formatLocalDate } from "../../prompts/default.js";
2
+ import { valveLeaves } from "../../agents/tool-filter.js";
2
3
  import { SKILL_TOOL_NAME } from "./synthetic-tools.js";
3
4
  import { renderAgentListingDelta } from "./turn-attachments.js";
4
5
  export function prepareListings(input) {
5
6
  const { spec, onceLedger, sessionId, toolFaceSnapshot, activeTools, deferred, resume, skillsListing, listingBudget, listingRideRef, renderWithDate, envFacts, tzValid, userTz, dateAnchor } = input;
6
7
  const rosterBearingSpec = (spec.tools ?? []).find((t) => t.agentListing !== undefined && t.agentListing.length > 0);
8
+ const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
7
9
  const rosterFaceDeferred = rosterBearingSpec !== undefined &&
8
- toolFaceSnapshot.selector.admits(rosterBearingSpec) &&
10
+ leaves(rosterBearingSpec) &&
9
11
  (toolFaceSnapshot.defer?.includes(rosterBearingSpec.name) ?? false) &&
10
12
  deferred.has(rosterBearingSpec.name) &&
11
13
  !activeTools.has(rosterBearingSpec.name);
12
14
  const agentListingSpec = rosterBearingSpec !== undefined &&
13
15
  !rosterFaceDeferred &&
14
- toolFaceSnapshot.selector.admits(rosterBearingSpec)
16
+ leaves(rosterBearingSpec)
15
17
  ? rosterBearingSpec
16
18
  : undefined;
17
19
  const agentListing = agentListingSpec
@@ -12,12 +12,8 @@
12
12
  * installs, which run at tool-call time), so the phase adds no yield between the deferred classification before it
13
13
  * and the prompt assembly after it (a stretch with no await is extracted as a sync function).
14
14
  * Read-stability of the host handles for the call: {@link RunInternals} (`@contract prepare.deps-read-stable`).
15
- *
16
- * One read changed spelling and nothing else: the declared-class announcement read `mcp?.statuses` while `mcp` had
17
- * long been the protocol-tools phase's non-null handle; the optional chain was dead and is now the plain member read.
18
15
  */
19
16
  import type { LockedPreflight } from "../locked-config.js";
20
- import type { MaterializedMcp } from "../mcp.js";
21
17
  import { type DelegationContentSafety } from "../memory-engine/delegation-provenance.js";
22
18
  import type { RunnerDeps, TaskSpec } from "../types.js";
23
19
  import type { Prepared, RunInternals } from "./contracts.js";
@@ -40,8 +36,6 @@ export interface PrepareMemoryEngineSessionInput {
40
36
  lockedPreflight: Pick<LockedPreflight, "mcp">;
41
37
  /** borrowed-readonly — the run's MCP mount, read at call time (present iff the run declared a server): the children a delegation tool spawns inherit it, so its tools are rows of their pool. */
42
38
  mountedMcp?: () => import("../mounted-mcp.js").MountedMcp;
43
- /** borrowed-readonly — the materialized MCP handle; only `statuses` (the announcement's mounted-tool count). */
44
- mcp: Pick<MaterializedMcp, "statuses">;
45
39
  /** borrowed-readonly — the acquired session id (notice detail). */
46
40
  sessionId: string;
47
41
  /** borrowed-readonly — the run's invocation id (notice detail; the once-per-leg claims are per-RUN claims). */
@@ -1,15 +1,16 @@
1
1
  import { classifyToolContentOrigin, contentOriginPollutes, delegationCallIsExternal } from "../memory-engine/content-origin.js";
2
- import { mountedMcpPoolRows } from "../mounted-mcp.js";
2
+ import { mountedMcpPoolRows, toolNamesOfServer } from "../mounted-mcp.js";
3
3
  import { narrowContentSafety, readCardAttestation } from "../memory-engine/delegation-provenance.js";
4
4
  import { recordSyncUnattestable, sessionSettlements } from "../memory-engine/delegation-settlement.js";
5
5
  import { protocolOf } from "../protocol-table.js";
6
6
  import { deliverEngineNotice } from "../types.js";
7
7
  import { inlineUntrusted } from "../untrusted-text.js";
8
- import { fileArgPath } from "../../tools/fs/safety.js";
8
+ import { fileArgPath } from "../tool-registry.js";
9
9
  import { RosterBuilder } from "../tool-roster.js";
10
+ import { isNotStartedDelegationResult } from "../../agents/subagent.js";
10
11
  import { thrownText } from "../thrown-value.js";
11
12
  export function prepareMemoryEngineSession(input) {
12
- const { memoryEngineSession, internals, memoryDelegationEvidence, externalContentTargetActive, lockedPreflight, mcp, mountedMcp, sessionId, runId, deps, provenanceForChildrenRef, delegationSettlementRef, spec, envHandToolNames, roster, contentOriginWrapRef } = input;
13
+ const { memoryEngineSession, internals, memoryDelegationEvidence, externalContentTargetActive, lockedPreflight, mountedMcp, sessionId, runId, deps, provenanceForChildrenRef, delegationSettlementRef, spec, envHandToolNames, roster, contentOriginWrapRef } = input;
13
14
  const tools = roster.tools;
14
15
  const delegationProvenanceChannel = internals?.delegationProvenance;
15
16
  if (memoryEngineSession !== undefined || delegationProvenanceChannel !== undefined) {
@@ -22,7 +23,7 @@ export function prepareMemoryEngineSession(input) {
22
23
  provenanceForChildrenRef.current = { trustedTools: [...trustedTools], execIsExternalContent };
23
24
  announceDeclaredMcpContentClasses({
24
25
  entries: lockedPreflight.mcp,
25
- statuses: mcp.statuses,
26
+ mountedNames: roster.tools.map((t) => t.name),
26
27
  execIsExternalContent,
27
28
  sessionId,
28
29
  runId,
@@ -133,6 +134,9 @@ export function prepareMemoryEngineSession(input) {
133
134
  isPolluting: poolToolPollutes,
134
135
  });
135
136
  const result = await inner(toolCallId, params, signal, onUpdate);
137
+ const delivery = delegationDeliveryOf(result);
138
+ if (delivery === "none")
139
+ return result;
136
140
  const att = readCardAttestation(result?.details);
137
141
  if (att === "external") {
138
142
  mark(`tool "${t.name}" returned the output of a delegated agent that invoked an external-content-class tool at runtime` +
@@ -141,8 +145,11 @@ export function prepareMemoryEngineSession(input) {
141
145
  }
142
146
  else if (att !== "clean") {
143
147
  if (external) {
144
- const staticFaceReason = `tool "${t.name}" returned the output of a delegated agent whose tool face can reach external content` +
145
- (typeof requested === "string" ? ` (subagent_type "${requested}")` : " (no subagent_type named — classified fail-closed)");
148
+ const staticFaceReason = (delivery === "launched"
149
+ ? `tool "${t.name}" launched a background delegated agent whose tool face can reach external content`
150
+ : `tool "${t.name}" returned the output of a delegated agent whose tool face can reach external content`) +
151
+ (typeof requested === "string" ? ` (subagent_type "${requested}")` : " (no subagent_type named — classified fail-closed)") +
152
+ (delivery === "launched" ? " — its output enters this session when it finishes" : "");
146
153
  if (!delegationEvidenceAttestedOnly) {
147
154
  mark(staticFaceReason, "static");
148
155
  }
@@ -207,13 +214,19 @@ export function prepareMemoryEngineSession(input) {
207
214
  }
208
215
  return { armed: memoryEngineSession !== undefined || delegationProvenanceChannel !== undefined };
209
216
  }
217
+ function delegationDeliveryOf(result) {
218
+ if (isNotStartedDelegationResult(result))
219
+ return "none";
220
+ const details = typeof result === "object" && result !== null ? result.details : undefined;
221
+ return typeof details === "object" && details !== null && details.status === "async_launched" ? "launched" : "report";
222
+ }
210
223
  function announceDeclaredMcpContentClasses(args) {
211
224
  for (const entry of args.entries ?? []) {
212
225
  const declaredClass = entry.contentOrigin;
213
226
  if (declaredClass === undefined)
214
227
  continue;
215
228
  const server = inlineUntrusted(String(entry.name), 160);
216
- const toolCount = args.statuses?.find((s) => s.name === entry.name)?.toolNames?.length ?? 0;
229
+ const toolCount = toolNamesOfServer(args.mountedNames, entry.name).length;
217
230
  const resourceFaceCaveat = " (Not covered: the cross-server resource faces — ListMcpResourcesTool/ReadMcpResourceTool/ReadMcpResourceDirTool — stay externally classified and still mark.)";
218
231
  const posture = declaredClass === "local"
219
232
  ? `this server's mounted tools' invocations will not mark this session's memory as externally exposed.${resourceFaceCaveat}`
@@ -208,11 +208,12 @@ export interface PrepareMemoryResult {
208
208
  * BEFORE it). It performs the one destructive read this phase has — `inject()` drains the announcement queue —
209
209
  * so a hands-phase refusal cannot consume announcements a later prepare should deliver, and it takes the
210
210
  * roster-wide persistence verdict the driver can only read off the MOUNTED roster (`rosterCanPersist`: the
211
- * `TaskSpec.memoryPersistenceCapable` declaration when set, else the known-store-path inference over the
212
- * assembled tools). Call exactly once per prepare.
211
+ * `memoryPersistenceCapable` declaration when set, else the store-path inference over the assembled tools) and
212
+ * `isSubagent` (a non-fork delegated child — no user conversation, no not-mounted notice). Call once per prepare.
213
213
  */
214
214
  composeInjection: (facts: {
215
215
  rosterCanPersist: boolean;
216
+ isSubagent: boolean;
216
217
  }) => MemoryInjectionComposition;
217
218
  /**
218
219
  * The FROZEN org-admission verdict of this prepare: every org scope the task actually mounts
@@ -6,7 +6,7 @@ import { classifyScopePlanes, derivePersonalControlDir, derivePersonalMemoryDir,
6
6
  import { memoryProjectScopeAbsentNotice, normalizeMemorySpec } from "../memory.js";
7
7
  import { deriveSupersededSet } from "../memory-engine/consolidation.js";
8
8
  import { shadowNamesOf } from "../memory-engine/shadowing.js";
9
- import { MEMORY_ANNOUNCEMENT_CAPTURE_OPTOUT_CODA, MEMORY_ANNOUNCEMENT_READONLY_CODA, MEMORY_CAPTURE_INDETERMINATE_NOTICE, MEMORY_CAPTURE_OPTOUT_NOTICE, MEMORY_PREFERENCE_DISCIPLINE, MEMORY_READONLY_NOTICE, MemoryEngine, entryFileHeadCarriesOrigin, memoryCaptureOptedOutNotice, memoryCaptureOptOutUnpersistedNotice, memoryConsolidationRecommendedNotice, memoryHarvestQuarantinedNotice, memoryHoldNotices, memoryRecallDisciplineSegment, memoryRestoreWithheldNotice, memorySessionPollutedNotice, pollutionContainmentCounts, } from "../memory-engine/engine.js";
9
+ import { MEMORY_ANNOUNCEMENT_CAPTURE_OPTOUT_CODA, MEMORY_ANNOUNCEMENT_READONLY_CODA, MEMORY_CAPTURE_OPTOUT_NOTICE, MEMORY_PREFERENCE_DISCIPLINE, MEMORY_READONLY_NOTICE, MemoryEngine, entryFileHeadCarriesOrigin, memoryCaptureOptedOutNotice, memoryCaptureOptOutUnpersistedNotice, memoryConsolidationRecommendedNotice, memoryHarvestQuarantinedNotice, memoryHoldNotices, memoryRecallDisciplineSegment, memoryRestoreWithheldNotice, memorySessionPollutedNotice, memoryUnavailableNotice, pollutionContainmentCounts, } from "../memory-engine/engine.js";
10
10
  import { adjudicateCaptureOptOut, captureOptOutDeniedError, captureOptOutUnpersistedError } from "./memory-capture-optout.js";
11
11
  import { readSessionCaptureOptOut } from "../memory-engine/layout.js";
12
12
  import { sessionIncarnationResolver } from "../memory-engine/session-incarnation.js";
@@ -14,6 +14,7 @@ import { createMemoryEngineTools } from "../memory-engine/tools.js";
14
14
  import { assertScopeContractPlacement, parseScopeKey, resolveProjectId } from "../memory-engine/scope-contract.js";
15
15
  import { FileMemoryEngineBackend } from "../memory-engine/file-backend.js";
16
16
  import { writableRootOf } from "../memory-engine/types.js";
17
+ import { catalogText } from "../../prompt-assembly/catalog/index.js";
17
18
  import { asThrownError, thrownText } from "../thrown-value.js";
18
19
  let undeclaredCapturePostureAnnounced = false;
19
20
  export async function prepareMemory(input) {
@@ -781,7 +782,7 @@ export async function prepareMemory(input) {
781
782
  blockBody = [MEMORY_CAPTURE_OPTOUT_NOTICE, injection.index, injection.announceBlock].filter((s) => Boolean(s && s.trim())).join("\n\n");
782
783
  }
783
784
  else if (captureIndeterminate && facts.rosterCanPersist) {
784
- blockBody = [MEMORY_CAPTURE_INDETERMINATE_NOTICE, injection.index, injection.announceBlock].filter((s) => Boolean(s && s.trim())).join("\n\n");
785
+ blockBody = [memoryUnavailableNotice({ what: "capture-record-unreadable", notesReadable: true }), injection.index, injection.announceBlock].filter((s) => Boolean(s && s.trim())).join("\n\n");
785
786
  }
786
787
  else if (!facts.rosterCanPersist && injection.instruction === "" && injection.readOnlyNotice === undefined) {
787
788
  blockBody = blockBody.trim() ? `${MEMORY_READONLY_NOTICE}\n\n${blockBody}` : MEMORY_READONLY_NOTICE;
@@ -817,6 +818,9 @@ export async function prepareMemory(input) {
817
818
  if (memoryBlock !== undefined && injection.indexSeed !== undefined && facts.rosterCanPersist && !captureOptedOut && !captureIndeterminate)
818
819
  seedFiles = [injection.indexSeed];
819
820
  }
821
+ else if (!facts.rosterCanPersist && !facts.isSubagent) {
822
+ memoryBlock = effectiveMemoryScopes?.reason === "mount-failed" ? memoryUnavailableNotice({ what: "mount-failed", notesReadable: false }) : catalogText("core/memory.no-persistent-store");
823
+ }
820
824
  return {
821
825
  memoryBlock,
822
826
  ...(recallDisciplineSegment !== undefined ? { recallDisciplineSegment } : {}),