@sema-agent/core 7.54.1 → 7.56.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 (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -2,14 +2,17 @@ import { Type } from "typebox";
2
2
  import { isAbsolute } from "node:path";
3
3
  import { backgroundChildTerminal } from "../core/delegation-frames.js";
4
4
  import { bindDelegationName } from "../core/delegation-name.js";
5
+ import { principalNameOf } from "../core/principal-name.js";
5
6
  import { resumeRefusalDetailOf, resumeStartupCauseOf } from "../core/resume-startup-cause.js";
6
7
  import { errorCodeOf, thrownFailureOf } from "../core/runner/terminal-account.js";
7
8
  import { applyParentSpecSeat, parentSpecSeatOfCtx } from "../core/parent-spec-seat.js";
9
+ import { ADVISOR_FORK_SENTENCE, ADVISOR_TOOL_NAME } from "../core/advisor-verdict.js";
8
10
  import { applyClampSeats, assertClampRecord, childClampSeats, clampSeatsOf, clampSourceOf, engineHeadlessLegSeats, foldClampSources, postureUnderClamps } from "../core/child-clamp-seats.js";
9
11
  import { assertNoRetiredKeys } from "../core/retired-keys.js";
10
12
  import { stripSpawnTurnQuestionFace } from "../core/ask-question.js";
11
13
  import { withDelegationProvenance } from "../core/tool-policy.js";
12
14
  import { errorResult } from "../core/tools.js";
15
+ import { notStartedResult } from "../core/delegation-not-started.js";
13
16
  import { isHighSurrogate, isLowSurrogate } from "../core/surrogate-safe-slice.js";
14
17
  import { newDelegationProvenanceAggregate, reduceDelegationAttestation } from "../core/memory-engine/delegation-provenance.js";
15
18
  import { registerDelegationLaunch, replayExternalSettlementEffects, settleDelegation } from "../core/memory-engine/delegation-settlement.js";
@@ -17,15 +20,17 @@ import { enqueueMemoryAnnouncement } from "../core/memory-engine/layout.js";
17
20
  import { resolveModel, resolveModelDisplayLabel } from "../core/roles.js";
18
21
  import { childModelSeat, childThinkingSeat, deploymentStatesSubagentModel, deploymentSubagentThinking, forkModelSeat, inheritedParentModel, runnerRoleMap } from "./child-model-seat.js";
19
22
  export { childThinkingSeat, deploymentSubagentThinking, deploymentSubagentTierModel } from "./child-model-seat.js";
20
- import { OUTPUT_TOOL_NAME, REPORT_BLOCKED_TOOL_NAME } from "../core/runner/synthetic-tools.js";
23
+ import { REPORT_BLOCKED_TOOL_NAME } from "../core/runner/synthetic-tools.js";
21
24
  import { TOOL_SEARCH_NAME } from "../core/runner/tool-disclosure.js";
22
25
  import { OFFLOAD_TOOL_NAME } from "../core/tool-result-store.js";
23
- import { compileToolSelector, delegationListWhere, snapshotDefinitionLists, toolListsDigest, toolNameAllowed, toolNameListFlaw } from "./tool-filter.js";
26
+ import { compileToolSelector, delegationListWhere, namesEveryTool, snapshotDefinitionLists, toolListsDigest, toolNameAllowed, toolNameListFlaw } from "./tool-filter.js";
24
27
  import { readToolNameList, snapshotToolNameList } from "../core/tool-name-list.js";
25
28
  import { EXTRA_TOOL_NAMES_CODE, delegationPoolFace, extraToolNamesError, firstUndeclaredExtraTool, readExtraToolNames } from "./extra-tool-names.js";
26
29
  import { builtinAgentDefinitions } from "./builtin-agents.js";
27
30
  import { normalizePeerName, reservedPeerNameReason } from "./cross-session-ref.js";
28
31
  import { SUBAGENT_PROMPT } from "../prompts/default.js";
32
+ import { roleBaseOf } from "../prompt-assembly/role-base.js";
33
+ import { readPromptRole } from "../prompt-assembly/select.js";
29
34
  import { hasSessionFork } from "../core/session.js";
30
35
  import { isDurablePause, pauseFamily } from "./suspend-guard.js";
31
36
  import { childRejection, childTerminalFace, childThrownText } from "./child-failure.js";
@@ -73,7 +78,8 @@ import { recordRosterSpawn } from "./roster-store.js";
73
78
  import { LAUNCH_RECEIPT_OWN_WORDS_CLAUSE, launchReceiptNoQuoteClause } from "./launch-receipt-contract.js";
74
79
  import { ObserverDigestTap, ObserverPairing, createObserverReportToolSpec, markObserverTaskId, unmarkObserverTaskId, isObserverTaskId, ObserverResumeStateError, ObserverStoppedByUserError, observerFramingPrompt, observerSlug, resolveObserverDeclaration, } from "./observer.js";
75
80
  import { SubagentStepRecorder } from "./subagent-steps.js";
76
- import { toolFace } from "../core/tool-catalog-entries.js";
81
+ import { OUTPUT_TOOL_NAME, mountRuleFace, toolFace } from "../core/tool-catalog-entries.js";
82
+ import { canonicalNameValue } from "../core/permission-rule-model.js";
77
83
  import { inheritedChildPool, inheritedMcpDeclarations } from "./inherited-tool-pool.js";
78
84
  import { readMember, thrownText } from "../core/thrown-value.js";
79
85
  const BG_AGENT_RESULT_MAX = 4_000;
@@ -278,19 +284,6 @@ const WORKTREE_UNAVAILABLE = {
278
284
  seatSilent: worktreeUnavailableSentence("the runner this tool runs children on does not declare whether it can place a child in a tree other than the caller's (its seat has no canRerootChild), and an undeclared answer is read as no; use a Runner, or add that method to the seat"),
279
285
  };
280
286
  const placementRefused = (terminal) => terminal?.kind === "failed" && terminal.code === "isolation.unavailable";
281
- const NOT_STARTED_RESULTS = new WeakSet();
282
- function notStartedResult(result) {
283
- const details = result.details;
284
- if (typeof details === "object" && details !== null)
285
- NOT_STARTED_RESULTS.add(details);
286
- return result;
287
- }
288
- export function isNotStartedDelegationResult(result) {
289
- if (typeof result !== "object" || result === null)
290
- return false;
291
- const details = result.details;
292
- return typeof details === "object" && details !== null && NOT_STARTED_RESULTS.has(details);
293
- }
294
287
  const isolationUnavailable = (content) => notStartedResult({
295
288
  isError: true,
296
289
  content,
@@ -350,6 +343,14 @@ const ccElapsedTag = (ms) => {
350
343
  return sec >= 60 ? ` \u00b7 ${Math.floor(sec / 60)}m${sec % 60}s` : ` \u00b7 ${sec}s`;
351
344
  };
352
345
  const ccCompletionText = (desc, settled, rawStatus, elapsedMs) => `Agent "${desc}" ${settled === "killed" ? "stopped" : settled === "completed" ? "finished" : rawStatus}${ccElapsedTag(elapsedMs)}`;
346
+ const SYNC_ESCAPE_SENTENCE = "Pass `run_in_background: false` for a synchronous run when you need the result before continuing (a named agent always runs in the background).";
347
+ function continuationSentence(toolName, durableRevival, forkOffered) {
348
+ return (`Where the SendMessage tool is mounted, use it with the agent's ID or name to message a RUNNING agent, or — when session retention${durableRevival ? " or durable named-agent revival" : ""} is enabled — ` +
349
+ `to continue a COMPLETED one with its context intact; a new ${toolName} call starts fresh${forkOffered ? ` (except subagent_type: "${FORK_SUBAGENT_TYPE}", which inherits your context)` : ""}.`);
350
+ }
351
+ function launchContinuationSentence(taskId) {
352
+ return `Where the SendMessage tool is mounted, use it with to: '${taskId}', summary: '<5-10 word recap>' to continue this agent.`;
353
+ }
353
354
  function resumabilityClaim(f) {
354
355
  if (f.status === "killed" && f.stoppedBy === "user")
355
356
  return false;
@@ -1182,18 +1183,36 @@ function chargeDelegationEntryHandle(registry, key, store, handle) {
1182
1183
  armDelegationLedgerLifecycle(registry);
1183
1184
  sweepDelegationLedgerRound(registry, 3);
1184
1185
  }
1185
- export function normalizeSubagentType(value) {
1186
- return value.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{Pd}_]+/gu, "");
1187
- }
1188
- function foldGeneralPurposeAlias(args, shadowed) {
1189
- if (shadowed)
1186
+ export { normalizeSubagentType } from "../core/permission-rule-model.js";
1187
+ function canonicalSubagentTypeArgs(args, accepted, generalPurposeShadowed) {
1188
+ if (args === null || typeof args !== "object" || Array.isArray(args))
1190
1189
  return args;
1191
1190
  const raw = args;
1192
- if (raw !== null && typeof raw === "object" && raw.subagent_type === GENERAL_PURPOSE_SUBAGENT_TYPE) {
1193
- const { subagent_type: _dropped, ...rest } = raw;
1194
- return rest;
1191
+ const requested = raw["subagent_type"];
1192
+ if (requested === undefined || requested === "") {
1193
+ if (!generalPurposeShadowed)
1194
+ return { ...raw, subagent_type: GENERAL_PURPOSE_SUBAGENT_TYPE };
1195
+ if (requested === undefined)
1196
+ return args;
1197
+ const { subagent_type: _empty, ...omitted } = raw;
1198
+ return omitted;
1195
1199
  }
1196
- return args;
1200
+ if (typeof requested !== "string")
1201
+ return args;
1202
+ const resolved = canonicalNameValue(requested, accepted);
1203
+ return resolved.kind === "entry" && resolved.entry !== requested ? { ...raw, subagent_type: resolved.entry } : args;
1204
+ }
1205
+ function subagentTypeRefusal(requested, accepted) {
1206
+ if (requested === undefined || requested === "")
1207
+ return undefined;
1208
+ if (typeof requested !== "string")
1209
+ return { content: `Sub-agent not started: subagent_type must be a string. Available subagent_type values: ${accepted.join(", ")}.`, error: "unknown subagent_type" };
1210
+ const resolved = canonicalNameValue(requested, accepted);
1211
+ if (resolved.kind === "ambiguous")
1212
+ return { content: `Sub-agent not started: subagent_type "${requested}" is ambiguous — it matches ${resolved.entries.join(", ")}. Use the exact name.`, error: "ambiguous subagent_type" };
1213
+ if (resolved.kind === "unknown")
1214
+ return { content: `Sub-agent not started: unknown subagent_type "${requested}". Available subagent_type values: ${accepted.join(", ")}.`, error: "unknown subagent_type" };
1215
+ return undefined;
1197
1216
  }
1198
1217
  export const SUBAGENT_SYSTEM_NOTE = "You can delegate a self-contained subtask to an isolated sub-agent via the delegation tool. " +
1199
1218
  "The sub-agent runs in a clean context and returns a single report. Delegate slow, parallelizable, " +
@@ -1228,7 +1247,7 @@ export function asyncLaunchedReceipt(p) {
1228
1247
  const noteLines = (p.notes ?? []).filter((n) => n !== undefined && n !== "");
1229
1248
  const oneShotBlocked = p.notify && p.oneShot === true;
1230
1249
  return (`Async agent launched successfully. (${launchReceiptNoQuoteClause(", including the task_id below,")})\n` +
1231
- `task_id: ${p.taskId} (internal ID - do not mention to user. Use SendMessage with to: '${p.taskId}', summary: '<5-10 word recap>' to continue this agent.)\n` +
1250
+ `task_id: ${p.taskId} (internal ID - do not mention to user. ${launchContinuationSentence(p.taskId)})\n` +
1232
1251
  (oneShotBlocked
1233
1252
  ? `${p.workingLine} This is a ONE-SHOT submission — there is no later turn for a background notification to land in, so do NOT end your turn expecting one. Actively wait instead: TaskOutput(task_id: "${p.taskId}", block: true). If it is still running after the wait, wait again (bounded) rather than ending the turn, or write out your best available answer now if you are near your own time budget.\n`
1234
1253
  : p.notify
@@ -1250,6 +1269,7 @@ function runnerModelCatalog(runner) {
1250
1269
  }
1251
1270
  }
1252
1271
  export function createSubagentTool(opts) {
1272
+ readPromptRole("SubagentToolOptions.promptRole", opts.promptRole);
1253
1273
  const catalog = opts.runner.agentCatalog;
1254
1274
  if (opts.agents === undefined && catalog?.agents)
1255
1275
  opts = { ...opts, agents: catalog.agents };
@@ -1306,7 +1326,7 @@ export function createSubagentTool(opts) {
1306
1326
  export function agentToolsNote(def) {
1307
1327
  const allowRead = readToolNameList(def.allowTools);
1308
1328
  const allow = allowRead.kind === "entries" ? allowRead.entries.filter((entry) => typeof entry === "string") : [];
1309
- const hasAllow = allow.length > 0 && !allow.includes("*");
1329
+ const hasAllow = allow.length > 0 && !allow.some(namesEveryTool);
1310
1330
  const denyRead = readToolNameList(def.denyTools);
1311
1331
  const deny = denyRead.kind === "entries" ? denyRead.entries.filter((entry) => typeof entry === "string") : [];
1312
1332
  const hasDeny = deny.length > 0;
@@ -1379,6 +1399,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1379
1399
  return bindDelegationName(delegationToolName, {
1380
1400
  name: opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME,
1381
1401
  ...toolFace("agent"),
1402
+ ruleFace: { ...mountRuleFace("agent"), nameValues: acceptedSubagentTypes() },
1382
1403
  agentListing,
1383
1404
  agentToolFaces,
1384
1405
  ...(depth === 0 && opts.allowTools !== undefined ? { agentToolLevelAllowTools: opts.allowTools } : {}),
@@ -1406,41 +1427,41 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1406
1427
  : `- Each agent type's model, thinking level, and tools come from its agent definition.\n`) +
1407
1428
  `- \`isolation: "worktree"\` gives the agent its own git worktree (auto-cleaned if unchanged).` +
1408
1429
  (opts.background
1409
- ? `\n- Subagents run in the background by default${opts.background.notify ? "; you'll be notified when one completes" : "; the receipt's task_id retrieves progress and results via the TaskOutput tool where mounted"}. Pass \`run_in_background: false\` for a synchronous run when you need the result before continuing. Never fabricate or predict a pending agent's results — ${opts.background.notify ? "the notification is never something you write yourself; " : ""}if the user asks before it arrives, say it's still running.\n` +
1410
- `- Where the SendMessage tool is mounted, use it with the agent's ID or name to message a RUNNING agent, or — when session retention${opts.background.agentStore !== undefined ? " or durable named-agent revival" : ""} is enabled — to continue a COMPLETED one with its context intact; a new ${opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME} call starts fresh${forkOffered ? ` (except subagent_type: "${FORK_SUBAGENT_TYPE}", which inherits your context)` : ""}.`
1430
+ ? `\n- Subagents run in the background by default${opts.background.notify ? "; you'll be notified when one completes" : "; the receipt's task_id retrieves progress and results via the TaskOutput tool where mounted"}. ${SYNC_ESCAPE_SENTENCE} Never fabricate or predict a pending agent's results — ${opts.background.notify ? "the notification is never something you write yourself; " : ""}if the user asks before it arrives, say it's still running.\n` +
1431
+ `- ${continuationSentence(opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME, opts.background.agentStore !== undefined, forkOffered)}`
1411
1432
  : `\n- \`run_in_background\` is unavailable here — only synchronous subagents.`),
1412
- descriptionClassic: `Launch a new agent. Delegate a self-contained subtask to an isolated sub-agent and get back a single report. ` +
1413
- (opts.purpose ? `This sub-agent is for: ${opts.purpose}. ` : "") +
1414
- (hasAgents ? `Available agent types are listed in <system-reminder> messages in the conversation. If \`subagent_type\` is omitted, a general-purpose sub-agent is used.\n` : "") +
1415
- `The sub-agent starts with a clean context (it does NOT see this conversation), so put everything it needs in 'prompt'. ` +
1416
- `It returns status (completed/blocked/failed) and a result you must verify before deciding the overall task is done.\n\n` +
1417
- `When NOT to delegate (do it yourself — it's faster and you keep the understanding):\n` +
1418
- `- Reading a specific known file → use Read directly.\n` +
1419
- `- Finding a known symbol/class/definition, or searching within 2-3 known files → use Grep/Glob/Read.\n` +
1420
- `- A lookup where you already know what you want and roughly where it is → just do it. Delegate open-ended INVESTIGATIONS (you don't know where the answer is), not lookups.\n\n` +
1421
- `Writing the 'prompt' — brief the agent like a smart colleague who just walked into the room — it hasn't seen this conversation, doesn't know what you've tried, doesn't understand why this task matters:\n` +
1422
- `- Make it fully self-contained and highly detailed: the sub-agent does the whole task end-to-end in one shot — you can't course-correct mid-run.\n` +
1423
- `- State exactly what it must RETURN (e.g. "report the file:line of each call site", not "look into the call sites").\n` +
1424
- `- Say explicitly whether you want it to WRITE CODE or only RESEARCH/REPORT — otherwise it may guess wrong.\n` +
1425
- `- Never delegate understanding. Don't write "based on your findings, fix the bug" or "based on the research, implement it." Those phrases push synthesis onto the agent instead of doing it yourself. Write prompts that prove you understood: include file paths, line numbers, what specifically to change.\n\n` +
1426
- `Use it for self-contained, parallelizable subtasks (e.g. independent searches/investigations) — it protects your main context; don't overuse it for trivial steps you can do directly. ` +
1427
- `Once you delegate a piece of research, rely on the sub-agent's report rather than repeating that search yourself. ` +
1428
- `The agent's final message is returned to you as the tool result; it is not shown to the user — relay what matters.\n\n` +
1429
- `If the agent reports an action was refused because an approval could not be resolved, do not send the approval back as a message — messages never clear a permission gate. Surface the agent's report of the prepared action and its refusal text to your user. (An agent PARKED at an approval gate is not refused — it is waiting, and resumes when the pending approval is decided.)\n\n` +
1430
- `Orchestration: When you launch multiple agents for independent work, send them in a single message with multiple tool uses so they run concurrently. Keep anything that needs shared context single-threaded. Once you've delegated a piece of work, don't also do it yourself — wait for the report.` +
1431
- (forkOffered
1432
- ? `\n\nsubagent_type "${FORK_SUBAGENT_TYPE}" is built in: it spawns a child that INHERITS your full current context (this entire conversation — no re-explaining, shared prompt cache) and works on 'prompt' as its directive. The fork always runs on YOUR model (the 'model' parameter is ignored for forks) and is not available inside a forked agent.`
1433
- : `\n\nNote: this deployment defines its own "${FORK_SUBAGENT_TYPE}" agent type, which OVERRIDES the built-in context-inheriting fork routing — subagent_type "${FORK_SUBAGENT_TYPE}" delegates to that definition instead.`) +
1434
- `\n\nThe 'model' parameter optionally overrides the sub-agent's model. If omitted, the agent definition's model (or the inherited default) applies.` +
1435
- `\nSet isolation: "worktree" to give the agent its own detached git worktree (auto-removed if it made no changes; kept for you to inspect/merge when it did).` +
1436
- (opts.background
1437
- ?
1438
- (opts.background.notify
1439
- ? `\n\nAgents run in the background by default. When an agent runs in the background, you will be automatically notified when it completes — do NOT sleep, poll, or proactively check on its progress. Continue with other work or respond to the user instead. Pass \`run_in_background: false\` for a synchronous run when you need the result before continuing.`
1440
- : `\n\nAgents run in the background by default. A background agent's result is not pushed automatically — the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. Pass \`run_in_background: false\` for a synchronous run when you need the result before continuing.`) +
1441
- ` Use SendMessage with a completed agent's ID to continue it with its context intact; a new ${opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME} call starts fresh.` +
1442
- `\n\n**Don't race.** After launching, you know nothing about what the agent found. Never fabricate or predict agent results in any format — not as prose, summary, or structured output. ${opts.background.notify ? "The notification arrives as a user-role message in a later turn; it is never something you write yourself." : "The result exists only when you retrieve it; it is never something you write yourself."}`
1443
- : `\n\nThe run_in_background parameter is not available in this context. Only synchronous subagents are supported.`),
1433
+ descriptionVariants: [{ id: "classic", traits: { noneOf: ["lean_prompt"] }, text: `Launch a new agent. Delegate a self-contained subtask to an isolated sub-agent and get back a single report. ` +
1434
+ (opts.purpose ? `This sub-agent is for: ${opts.purpose}. ` : "") +
1435
+ (hasAgents ? `Available agent types are listed in <system-reminder> messages in the conversation. If \`subagent_type\` is omitted, a general-purpose sub-agent is used.\n` : "") +
1436
+ `The sub-agent starts with a clean context (it does NOT see this conversation), so put everything it needs in 'prompt'. ` +
1437
+ `It returns status (completed/blocked/failed) and a result you must verify before deciding the overall task is done.\n\n` +
1438
+ `When NOT to delegate (do it yourself — it's faster and you keep the understanding):\n` +
1439
+ `- Reading a specific known file → use Read directly.\n` +
1440
+ `- Finding a known symbol/class/definition, or searching within 2-3 known files → use Grep/Glob/Read.\n` +
1441
+ `- A lookup where you already know what you want and roughly where it is → just do it. Delegate open-ended INVESTIGATIONS (you don't know where the answer is), not lookups.\n\n` +
1442
+ `Writing the 'prompt' — brief the agent like a smart colleague who just walked into the room — it hasn't seen this conversation, doesn't know what you've tried, doesn't understand why this task matters:\n` +
1443
+ `- Make it fully self-contained and highly detailed: the sub-agent does the whole task end-to-end in one shot — you can't course-correct mid-run.\n` +
1444
+ `- State exactly what it must RETURN (e.g. "report the file:line of each call site", not "look into the call sites").\n` +
1445
+ `- Say explicitly whether you want it to WRITE CODE or only RESEARCH/REPORT — otherwise it may guess wrong.\n` +
1446
+ `- Never delegate understanding. Don't write "based on your findings, fix the bug" or "based on the research, implement it." Those phrases push synthesis onto the agent instead of doing it yourself. Write prompts that prove you understood: include file paths, line numbers, what specifically to change.\n\n` +
1447
+ `Use it for self-contained, parallelizable subtasks (e.g. independent searches/investigations) — it protects your main context; don't overuse it for trivial steps you can do directly. ` +
1448
+ `Once you delegate a piece of research, rely on the sub-agent's report rather than repeating that search yourself. ` +
1449
+ `The agent's final message is returned to you as the tool result; it is not shown to the user — relay what matters.\n\n` +
1450
+ `If the agent reports an action was refused because an approval could not be resolved, do not send the approval back as a message — messages never clear a permission gate. Surface the agent's report of the prepared action and its refusal text to your user. (An agent PARKED at an approval gate is not refused — it is waiting, and resumes when the pending approval is decided.)\n\n` +
1451
+ `Orchestration: When you launch multiple agents for independent work, send them in a single message with multiple tool uses so they run concurrently. Keep anything that needs shared context single-threaded. Once you've delegated a piece of work, don't also do it yourself — wait for the report.` +
1452
+ (forkOffered
1453
+ ? `\n\nsubagent_type "${FORK_SUBAGENT_TYPE}" is built in: it spawns a child that INHERITS your full current context (this entire conversation — no re-explaining, shared prompt cache) and works on 'prompt' as its directive. The fork always runs on YOUR model (the 'model' parameter is ignored for forks) and is not available inside a forked agent.`
1454
+ : `\n\nNote: this deployment defines its own "${FORK_SUBAGENT_TYPE}" agent type, which OVERRIDES the built-in context-inheriting fork routing — subagent_type "${FORK_SUBAGENT_TYPE}" delegates to that definition instead.`) +
1455
+ `\n\nThe 'model' parameter optionally overrides the sub-agent's model. If omitted, the agent definition's model (or the inherited default) applies.` +
1456
+ `\nSet isolation: "worktree" to give the agent its own detached git worktree (auto-removed if it made no changes; kept for you to inspect/merge when it did).` +
1457
+ (opts.background
1458
+ ?
1459
+ (opts.background.notify
1460
+ ? `\n\nAgents run in the background by default. When an agent runs in the background, you will be automatically notified when it completes — do NOT sleep, poll, or proactively check on its progress. Continue with other work or respond to the user instead. ${SYNC_ESCAPE_SENTENCE}`
1461
+ : `\n\nAgents run in the background by default. A background agent's result is not pushed automatically — the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. ${SYNC_ESCAPE_SENTENCE}`) +
1462
+ ` ${continuationSentence(opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME, opts.background.agentStore !== undefined, forkOffered)}` +
1463
+ `\n\n**Don't race.** After launching, you know nothing about what the agent found. Never fabricate or predict agent results in any format — not as prose, summary, or structured output. ${opts.background.notify ? "The notification arrives as a user-role message in a later turn; it is never something you write yourself." : "The result exists only when you retrieve it; it is never something you write yourself."}`
1464
+ : `\n\nThe run_in_background parameter is not available in this context. Only synchronous subagents are supported.`) }],
1444
1465
  parameters: Type.Object({
1445
1466
  subagent_type: Type.Optional(Type.String({ description: "The type of specialized agent to use for this task" })),
1446
1467
  description: Type.String({ description: "A short (3-5 word) description of the task." }),
@@ -1448,7 +1469,9 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1448
1469
  name: Type.Optional(Type.String({
1449
1470
  maxLength: 64,
1450
1471
  pattern: "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$",
1451
- description: 'Name for the spawned agent. Where the SendMessage tool is mounted, it makes a background agent addressable via SendMessage({to: name}). "main" is reserved.',
1472
+ description: opts.background
1473
+ ? 'Name for the spawned agent. Where the SendMessage tool is mounted, the name makes the agent addressable via SendMessage({to: name}); either way a named agent always runs in the background (omit name to run one synchronously). "main" is reserved.'
1474
+ : 'Name for the spawned agent — a label only: agents on this mount run synchronously, so a name does not make one addressable. "main" is reserved.',
1452
1475
  })),
1453
1476
  cwd: Type.Optional(Type.String({
1454
1477
  description: 'Absolute path to run the agent in. Overrides the working directory for all filesystem and shell operations within this agent. Mutually exclusive with isolation: "worktree".',
@@ -1465,15 +1488,19 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1465
1488
  ? {
1466
1489
  run_in_background: Type.Optional(Type.Boolean({
1467
1490
  description: opts.background.notify
1468
- ? "Agents run in the background by default; you will be notified when one completes. Set to false to run this agent synchronously when you need its result before continuing."
1469
- : "Agents run in the background by default; the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. Set to false to run this agent synchronously when you need its result before continuing.",
1491
+ ? "Agents run in the background by default; you will be notified when one completes. Set to false to run this agent synchronously when you need its result before continuing (a named agent always runs in the background)."
1492
+ : "Agents run in the background by default; the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. Set to false to run this agent synchronously when you need its result before continuing (a named agent always runs in the background).",
1470
1493
  })),
1471
1494
  }
1472
1495
  : {}),
1473
1496
  }),
1474
- prepareArguments: (args) => foldGeneralPurposeAlias(args, generalPurposeShadowed),
1497
+ prepareArguments: (args) => canonicalSubagentTypeArgs(args, acceptedSubagentTypes(), generalPurposeShadowed),
1498
+ validateInput: (args) => {
1499
+ const refusal = subagentTypeRefusal(args.subagent_type, acceptedSubagentTypes());
1500
+ return refusal === undefined ? { ok: true } : { ok: false, message: refusal.content, code: refusal.error };
1501
+ },
1475
1502
  execute: async (args, ctx) => {
1476
- const a = foldGeneralPurposeAlias(args, generalPurposeShadowed);
1503
+ const a = canonicalSubagentTypeArgs(args, acceptedSubagentTypes(), generalPurposeShadowed);
1477
1504
  const parentSpecSeat = parentSpecSeatOfCtx(ctx);
1478
1505
  const reviveClaim = ctx.reviveClaim;
1479
1506
  if (reviveClaim !== undefined && opts.background === undefined) {
@@ -1487,46 +1514,17 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1487
1514
  if (!prompt) {
1488
1515
  return notStartedResult({ isError: true, content: "Sub-agent not started: 'prompt' was empty.", details: { error: "empty prompt" } });
1489
1516
  }
1490
- if (a.subagent_type !== undefined && typeof a.subagent_type !== "string") {
1491
- return notStartedResult({
1492
- isError: true,
1493
- content: `Sub-agent not started: subagent_type must be a string. Available subagent_type values: ${acceptedSubagentTypes().join(", ")}.`,
1494
- details: { error: "unknown subagent_type" },
1495
- });
1496
- }
1497
- const requestedType = a.subagent_type ?? "";
1498
- let rawType = requestedType;
1499
- if (requestedType !== "") {
1500
- const accepted = acceptedSubagentTypes();
1501
- if (!accepted.includes(requestedType)) {
1502
- const wanted = normalizeSubagentType(requestedType);
1503
- const hits = wanted === "" ? [] : accepted.filter((n) => normalizeSubagentType(n) === wanted);
1504
- if (hits.length > 1) {
1505
- return notStartedResult({
1506
- isError: true,
1507
- content: `Sub-agent not started: subagent_type "${requestedType}" is ambiguous — it matches ${hits.join(", ")}. Use the exact name.`,
1508
- details: { error: "ambiguous subagent_type" },
1509
- });
1510
- }
1511
- if (hits.length === 1)
1512
- rawType = hits[0];
1513
- }
1514
- }
1517
+ const typeRefusal = subagentTypeRefusal(a.subagent_type, acceptedSubagentTypes());
1518
+ if (typeRefusal !== undefined)
1519
+ return notStartedResult({ isError: true, content: typeRefusal.content, details: { error: typeRefusal.error } });
1520
+ const rawType = typeof a.subagent_type === "string" ? a.subagent_type : "";
1515
1521
  const wantsFork = forkOffered && rawType === FORK_SUBAGENT_TYPE;
1516
1522
  if (reviveClaim !== undefined && wantsFork) {
1517
1523
  return notStartedResult({ isError: true, content: `Sub-agent not revived: a "${FORK_SUBAGENT_TYPE}" agent cannot be revived — launch a new agent with the needed context instead.`, details: { error: "revive.fork_unsupported" } });
1518
1524
  }
1519
1525
  const omitted = rawType === "" || (!generalPurposeShadowed && rawType === GENERAL_PURPOSE_SUBAGENT_TYPE);
1520
1526
  const def = hasAgents && !wantsFork && !omitted ? agentMap.get(rawType) : undefined;
1521
- const wantsBackground = opts.background !== undefined && (a.run_in_background !== false || def?.background === true);
1522
1527
  const spawnAgentType = wantsFork ? FORK_SUBAGENT_TYPE : omitted ? GENERAL_PURPOSE_SUBAGENT_TYPE : rawType;
1523
- if (!def && !wantsFork && !omitted) {
1524
- return notStartedResult({
1525
- isError: true,
1526
- content: `Sub-agent not started: unknown subagent_type "${rawType}". Available subagent_type values: ${acceptedSubagentTypes().join(", ")}.`,
1527
- details: { error: "unknown subagent_type" },
1528
- });
1529
- }
1530
1528
  const allowFlaw = toolNameListFlaw(delegationListWhere(toolName, def?.name), "allowed", def !== undefined ? def.allowTools : opts.allowTools);
1531
1529
  if (allowFlaw !== undefined)
1532
1530
  return notStartedResult({ isError: true, content: `Sub-agent not started: ${inlineUntrusted(allowFlaw, 480)}`, details: { error: "config.agent.unknown_tool" } });
@@ -1556,6 +1554,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1556
1554
  });
1557
1555
  }
1558
1556
  }
1557
+ const wantsBackground = opts.background !== undefined && (a.run_in_background !== false || def?.background === true || agentName !== undefined);
1559
1558
  if (a.cwd !== undefined && typeof a.cwd !== "string") {
1560
1559
  return notStartedResult({ isError: true, content: "Sub-agent not started: cwd must be an absolute path string.", details: { error: "cwd.relative" } });
1561
1560
  }
@@ -1846,8 +1845,9 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1846
1845
  const parentMcp = opts.tools === undefined && extraToolsNote === undefined ? ctx.mountedMcp?.() : undefined;
1847
1846
  const childMcp = parentMcp !== undefined ? inheritedMcpDeclarations(parentMcp, compileToolSelector([...childCeiling, childOwnLayer])) : undefined;
1848
1847
  const childTools = [...childPool];
1849
- const childSystemPrompt = def?.systemPrompt ?? opts.systemPrompt;
1850
- const childDefaultPersona = childSystemPrompt === undefined && !wantsFork ? SUBAGENT_PROMPT : undefined;
1848
+ const childRoleBase = roleBaseOf([def !== undefined ? { systemPrompt: def.systemPrompt } : undefined, { promptRole: opts.promptRole, systemPrompt: opts.systemPrompt }]);
1849
+ const childSystemPrompt = childRoleBase?.systemPrompt;
1850
+ const childDefaultPersona = childRoleBase === undefined && !wantsFork ? SUBAGENT_PROMPT : undefined;
1851
1851
  const defMaxTurns = typeof def?.maxTurns === "number" && Number.isFinite(def.maxTurns) && def.maxTurns > 0 ? def.maxTurns : undefined;
1852
1852
  const childLimits = defMaxTurns !== undefined ? { ...opts.limits, maxTurns: defMaxTurns } : opts.limits;
1853
1853
  const nextExcluded = def ? new Set([...excluded, def.name]) : excluded;
@@ -1922,10 +1922,11 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1922
1922
  ...(ctx.getApiKeyAndHeaders !== undefined ? { getApiKeyAndHeaders: ctx.getApiKeyAndHeaders } : {}),
1923
1923
  ...(ctx.checkpointStoreForChildren !== undefined ? { checkpointStore: ctx.checkpointStoreForChildren } : {}),
1924
1924
  tools: [reportTool],
1925
+ ...(parentSpecSeat?.advisorModel !== undefined ? { excludeTools: [ADVISOR_TOOL_NAME] } : {}),
1925
1926
  ...(ctx.deferTools !== undefined ? { deferTools: [...ctx.deferTools] } : {}),
1926
1927
  ...(ctx.alwaysLoadTools !== undefined ? { alwaysLoadTools: [...ctx.alwaysLoadTools] } : {}),
1927
1928
  ...(ctx.restoreGatedTools !== undefined ? { restoreGatedTools: ctx.restoreGatedTools === true ? true : [...ctx.restoreGatedTools] } : {}),
1928
- ...(ctx.promptProfile !== undefined ? { promptProfile: ctx.promptProfile } : {}),
1929
+ ...(ctx.promptLean !== undefined ? { promptLean: ctx.promptLean } : {}),
1929
1930
  ...engineHeadlessLegSeats(),
1930
1931
  ...childClampSeats(clampSourceOf(ctx)),
1931
1932
  enableBlockedReport: false,
@@ -1942,6 +1943,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
1942
1943
  const observerGate = parentGate === undefined
1943
1944
  ? undefined
1944
1945
  : {
1946
+ ...(parentGate.ancestorRules !== undefined ? { ancestorRules: parentGate.ancestorRules } : {}),
1945
1947
  ...(parentGate.permissionMode !== undefined ? { permissionMode: parentGate.permissionMode } : {}),
1946
1948
  ...(parentGate.permissionModeCeiling !== undefined ? { permissionModeCeiling: parentGate.permissionModeCeiling } : {}),
1947
1949
  ...(parentGate.shellGate !== undefined ? { shellGate: parentGate.shellGate } : {}),
@@ -2201,6 +2203,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
2201
2203
  tools: childTools,
2202
2204
  ...(childMcp !== undefined && childMcp.length > 0 ? { mcp: childMcp } : {}),
2203
2205
  systemPrompt: childSystemPrompt,
2206
+ ...(childRoleBase?.promptRole !== undefined ? { promptRole: childRoleBase.promptRole } : {}),
2204
2207
  ...(def?.memory ? { memory: def.memory } : {}),
2205
2208
  ...(def?.skills?.length ? { skills: def.skills } : {}),
2206
2209
  ...(def?.memoryPersistenceCapable !== undefined ? { memoryPersistenceCapable: def.memoryPersistenceCapable } : {}),
@@ -2212,7 +2215,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
2212
2215
  ...(ctx.deferTools !== undefined ? { deferTools: [...ctx.deferTools] } : {}),
2213
2216
  ...(ctx.alwaysLoadTools !== undefined ? { alwaysLoadTools: [...ctx.alwaysLoadTools] } : {}),
2214
2217
  ...(ctx.restoreGatedTools !== undefined ? { restoreGatedTools: ctx.restoreGatedTools === true ? true : [...ctx.restoreGatedTools] } : {}),
2215
- ...(ctx.promptProfile !== undefined ? { promptProfile: ctx.promptProfile } : {}),
2218
+ ...(ctx.promptLean !== undefined ? { promptLean: ctx.promptLean } : {}),
2216
2219
  ...(ctx.getApiKeyAndHeaders !== undefined ? { getApiKeyAndHeaders: ctx.getApiKeyAndHeaders } : {}),
2217
2220
  enableBlockedReport: true,
2218
2221
  limits: childLimits,
@@ -2377,6 +2380,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
2377
2380
  objective: objectiveSample.text,
2378
2381
  tools: spawnToolNames,
2379
2382
  systemPrompt: systemPromptSample?.text,
2383
+ ...(childRoleBase?.promptRole !== undefined ? { promptRole: childRoleBase.promptRole } : {}),
2380
2384
  ...(spawnCoverage ? { reviewCoverage: spawnCoverage } : {}),
2381
2385
  },
2382
2386
  toolCallId: ctx.toolCallId,
@@ -2409,7 +2413,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
2409
2413
  releaseForked = forkHandle?.release;
2410
2414
  }
2411
2415
  else {
2412
- forkedId = (await opts.runner.sessions.fork?.(ctx.sessionId, ctx.principal ?? null)) ?? null;
2416
+ forkedId = (await opts.runner.sessions.fork?.(ctx.sessionId, principalNameOf(ctx.principal) ?? null)) ?? null;
2413
2417
  }
2414
2418
  }
2415
2419
  catch (e) {
@@ -2423,7 +2427,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
2423
2427
  const forkInternals = { ...childInternals, insideFork: true, ...(ctx.reminderMark !== undefined ? { reminderMark: ctx.reminderMark } : {}) };
2424
2428
  stepRecorder.lockTo(forkedId);
2425
2429
  const forkWorktreeNote = worktreeDir !== undefined ? forkWorktreeTranslationNote(ctx.parentCwd, worktreeDir) : undefined;
2426
- const forkObjective = `${FORK_DIRECTIVE_FRAME}${prompt}${forkWorktreeNote !== undefined ? `\n\n${forkWorktreeNote}` : ""}`;
2430
+ const forkObjective = `${FORK_DIRECTIVE_FRAME}${prompt}${forkWorktreeNote !== undefined ? `\n\n${forkWorktreeNote}` : ""}${parentSpecSeat?.advisorModel !== undefined ? `\n\n${ADVISOR_FORK_SENTENCE}` : ""}`;
2427
2431
  if (wantsBackground) {
2428
2432
  const bg = opts.background;
2429
2433
  const notify = ctx.onTaskNotification ?? bg.notify;
@@ -3835,7 +3839,6 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
3835
3839
  : "",
3836
3840
  `stats: turns=${child.stats.turns} tokens=${child.stats.tokens}`,
3837
3841
  !retainEntry && failureRetained ? `transcript_id: ${child.sessionId} (internal ID - do not mention to user; inspect via AgentTranscript where mounted)` : "",
3838
- retainEntry ? `resumable: true` : "",
3839
3842
  failureRetained
3840
3843
  ? `session_retained: this child's session is kept for a short time (~15 min) so its transcript stays inspectable via transcript_id; it is released automatically afterwards.`
3841
3844
  : "",
@@ -1,6 +1,5 @@
1
1
  import type { AgentDefinition, ToolSpec } from "../core/types.js";
2
2
  import { type ToolLegKind, type ToolSelector, type ToolSelectorLayer } from "../core/tool-face.js";
3
- import { type ProtocolId } from "../core/protocol-table.js";
4
3
  import { type ToolNameListReading } from "../core/tool-name-list.js";
5
4
  /**
6
5
  * The tool selector (design/38 1A, one operation since #1623): what tools a run may use, read once over the universe it can get
@@ -10,27 +9,23 @@ import { type ToolNameListReading } from "../core/tool-name-list.js";
10
9
  * run that spawned it), so there is no spawn-time filter and no complement anywhere.
11
10
  *
12
11
  * - an allowed list absent, or holding `"*"` (any spelling the rule syntax reads as it: `*()`, `*(*)`), sets no allowlist on
13
- * its layer; otherwise the layer keeps only what it names
14
- * (`[]` keeps nothing — intentional, not a mistake);
12
+ * its layer; otherwise the layer keeps only what it names (`[]` keeps nothing — intentional);
15
13
  * - a denied list removes what it names from whatever remains (a denied tool always loses);
16
14
  * - a layer above a run (its ceiling) bounds it: a child's `"*"` never widens what its parent could use.
17
15
  *
18
- * An entry is read by the rule syntax ({@link readDeniedEntry}: `Tool(content)` names `Tool`, the content is not read, the
19
- * whole tool is hidden; an entry the syntax cannot read names no tool); a protocol spelling (`mcp__srv`, `mcp__srv__*`, a glob over the tool segment) reaches the
20
- * tools of that peer, including ones it lists later; an entry no tool answers to is kept by name and reaches one mounted later.
21
- * Judged at the prepare that receives it: a spelling no tool name can have is refused, an unknown name told (`sub-agent-deny-lists.ts`).
16
+ * An entry is read by the rule syntax ({@link readDeniedEntry}); a protocol spelling (`mcp__srv`, `mcp__srv__*`, a glob over the
17
+ * tool segment) reaches the tools of that peer, including ones it lists later, and on a denied list any glob (`Re*d`, `*`) the
18
+ * names it matches; an entry no tool answers to is kept by name and reaches one mounted later. Judged at the prepare that receives it.
22
19
  *
23
- * `"*"` in an allowed list is the "allow all" sentinel and never a name: no tool is named `*` (the caller tool name
24
- * contract, `caller-tool-name.ts`, refuses it at the mount; engine and protocol-minted names never are).
20
+ * `"*"` in an allowed list is the "allow all" sentinel and never a name (`caller-tool-name.ts` refuses it at the mount).
25
21
  */
26
22
  /**
27
23
  * How ONE denied-tools entry is read — by the rule syntax's own test of a rule spelling (`ruleSpellingOf`, the one every entry
28
24
  * list's reader asks), exactly as written: `Tool(content)` names `Tool` (the content is not read here, so the whole tool is
29
25
  * hidden), `Tool()` and `Tool(*)` are the bare name. An entry the syntax cannot read — surrounding whitespace, a tool name
30
26
  * outside its spelling (a blank or an invisible character before the `(`, a leading `-`), a parenthesis that does not close
31
- * the entry — names no tool: `unreadable`, the entry as written. A value that is not a string (a list a host read from a file
32
- * can hold anything) names no tool either: it reads as `not_a_string` with a fixed label of its TYPE, and nothing about the
33
- * value is read, converted or printed — `typeof` and the array test only.
27
+ * the entry — names no tool: `unreadable`, the entry as written. A value that is not a string names no tool either: it reads as
28
+ * `not_a_string` with a fixed label of its TYPE, and nothing about the value is read, converted or printed.
34
29
  */
35
30
  export type DeniedEntryReading = {
36
31
  readonly kind: "name";
@@ -57,9 +52,9 @@ export declare function notAListSentence(where: string, side: ToolNameListSide,
57
52
  export declare function delegationListWhere(toolName: string, definitionName: string | undefined): string;
58
53
  /**
59
54
  * The digest of a run's own two tool lists as its selector reads them (an absent denied list reads as an empty one): sha256 over the
60
- * binding serializer's canonical form — the serializer the checkpoint row digest uses. It is the evidence that the spawning run judged
61
- * EXACTLY these lists (`RunInternals.toolListsJudged`, and the row's `CheckpointState.toolListsJudged` on a resume); `undefined` for
62
- * lists the serializer cannot encode, which therefore never match any evidence.
55
+ * binding serializer's canonical form. It is the evidence that the spawning run judged EXACTLY these lists
56
+ * (`RunInternals.toolListsJudged`, and the row's `CheckpointState.toolListsJudged` on a resume); `undefined` for lists the
57
+ * serializer cannot encode, which therefore never match any evidence.
63
58
  */
64
59
  export declare function toolListsDigest(allow: readonly unknown[] | undefined, deny: readonly unknown[] | undefined): string | undefined;
65
60
  /**
@@ -67,46 +62,38 @@ export declare function toolListsDigest(allow: readonly unknown[] | undefined, d
67
62
  * of strings. The one reading the judgment before the run and the spawn-time check of a tool that never went through prepare share.
68
63
  */
69
64
  export declare function toolNameListFlaw(where: string, side: ToolNameListSide, value: unknown): string | undefined;
70
- /** A definition with its two tool-name lists replaced by their one copy — the copy every later reader (the judgment before the
71
- * run, the roster, the filter at each spawn) takes instead of the host's container. */
65
+ /** A definition with its two tool-name lists replaced by their one copy — the copy every later reader takes instead of the host's container. */
72
66
  export declare function snapshotDefinitionLists(def: AgentDefinition): AgentDefinition;
73
67
  /**
74
- * What ONE tool-name list reaches — the single reading every consumer of an allowed or a denied list takes (the spawn-time
75
- * filter, the nested-delegation check, the memory content-origin face, the judgment before the run):
76
- * - `names`: exact spellings; a tool answers to its wire name and to every alias it declares;
77
- * - `covering`: the protocol spellings that cover a SET — a peer (`mcp__srv`), the same set written with the star
78
- * (`mcp__srv__*`), a glob over the tool segment (`mcp__srv__get_*`) — matched by the allow layer's own covering matcher,
79
- * peers compared exactly, both sides in the same namespace;
80
- * - `wholeProtocols`: a denied list's `mcp__*` — every tool of that protocol. An allowed list reads it as nothing (the
81
- * reference's allow resolution has no such form: it keeps no MCP tool by it).
68
+ * What ONE tool-name list reaches — the single reading every consumer of an allowed or a denied list takes: `names` are exact
69
+ * spellings (a tool answers to its wire name and every alias it declares); `covering` the spellings that cover a SET
70
+ * ({@link isCoveringRuleName}: `mcp__srv`, `mcp__srv__get_*`; on a denied list any glob, `Re*d`, `*`).
82
71
  */
83
72
  export interface ToolNameListReach {
84
73
  readonly names: ReadonlySet<string>;
85
74
  readonly covering: readonly string[];
86
- readonly wholeProtocols: ReadonlySet<ProtocolId>;
87
75
  }
88
76
  /**
89
77
  * The tool ONE entry of a list on `side` reaches ({@link readDeniedEntry}) — the one per-entry reading every list reader takes:
90
- * `Tool()` / `Tool(*)` are the bare `Tool` (`*()` / `*(*)` the wildcard `*`); a denied `Tool(content)` hides the whole `Tool`;
91
- * an allowed one, an unreadable entry or a non-string reaches nothing (`undefined`).
78
+ * `Tool()` / `Tool(*)` are the bare `Tool`; a denied `Tool(content)` hides the whole `Tool`; an allowed one, an unreadable entry
79
+ * or a non-string reaches nothing (`undefined`).
92
80
  */
93
81
  export declare function toolNameOfEntry(entry: unknown, side: ToolNameListSide): string | undefined;
94
82
  /**
95
- * Is this entry a bare tool name as the rule syntax reads it, written as such (`Read`, `mcp__srv__*`, `*`; never `Read()`,
96
- * `Read(*)`, `Read(x)`, an unreadable spelling or a non-string)? The one form a checkpoint row records and is read back in.
97
- */
83
+ * Is this entry a bare tool name as the rule syntax reads it, written as such (`Read`, `mcp__srv__*`, `*`; never `Read()` or
84
+ * `Read(x)`)? The one form a checkpoint row records and is read back in. */
98
85
  export declare function isCanonicalToolName(entry: unknown): boolean;
99
86
  /**
100
- * A tool-name list as a checkpoint row records it: each entry as {@link toolNameOfEntry} reads it, in canonical spelling, an
101
- * allowed entry that admits nothing left out — the copy reaches what the list reached, in the spelling a reader accepts
102
- * ({@link isCanonicalToolName}). An unreadable entry stays as written: prepare refuses it before the park, the reader again.
87
+ * A tool-name list as a checkpoint row records it: each entry as {@link toolNameOfEntry} reads it, in canonical spelling
88
+ * ({@link isCanonicalToolName}), an allowed entry that admits nothing left out. An unreadable entry stays as written: prepare
89
+ * refuses it before the park, the reader again.
103
90
  */
104
91
  export declare function persistedToolNameList(entries: readonly string[], side: ToolNameListSide): string[];
92
+ /** Is this allowed-tools entry the selector's wildcard (`*`, `*()`, `*(*)`) — no allowlist on its layer? The one test every reader asks. */
93
+ export declare function namesEveryTool(entry: unknown): boolean;
105
94
  /**
106
- * What an allowed-tools value admits, or `undefined` when it names no allowlist: absent, `null`, or a list holding the
107
- * wildcard — an entry {@link toolNameOfEntry} reads as `*` (`*`, `*()`, `*(*)`). A list admits its string entries (an entry that
108
- * is not a string admits nothing); a value that is not a list admits NOTHING — the judge before the run refuses it, and a
109
- * reader that meets it first fails closed.
95
+ * What an allowed-tools value admits, or `undefined` when it names no allowlist: absent, `null`, or a list holding the wildcard
96
+ * ({@link namesEveryTool}). A value that is not a list admits NOTHING (refused before the run).
110
97
  */
111
98
  export declare function readAllowedToolList(allowTools: unknown): ToolNameListReach | undefined;
112
99
  /** What a denied value hides: its string entries read as {@link readDeniedEntry} reads them (an entry it reads as `unreadable` or not a string, or a value that is not a list, hides nothing here — the judgment before the run refuses each). */
@@ -132,17 +119,15 @@ export declare function isToolSelectorLayer(layer: unknown): layer is ToolSelect
132
119
  /**
133
120
  * Compile ONE run's tool selector from its layers (the ceiling it was spawned under, then its own lists — the LAST layer is its own)
134
121
  * and the kinds of leg it is. Each list is read by the one reading ({@link readAllowedToolList} / {@link readDeniedToolList}) and
135
- * matched by the one matcher ({@link listReaches}); a protocol tool of one of `legs` is admitted whatever the leg's own lists say —
136
- * and whatever the ceiling says too, unless a kind of its row shares its spawner's tool surface ({@link protocolRowUnderCeiling}):
137
- * the ceiling layers decide it. Whether a list may reach a protocol tool at all is judged at prepare. The layers are kept as handed —
138
- * the producer passes frozen copies of the lists it read.
122
+ * matched by the one matcher ({@link listReaches}); a protocol tool of one of `legs` is admitted whatever the leg's own lists say,
123
+ * and whatever the ceiling says unless a kind of its row shares its spawner's tool surface ({@link protocolRowUnderCeiling}), when
124
+ * the ceiling layers decide it. Whether a list may reach a protocol tool at all is judged at prepare.
139
125
  */
140
126
  export declare function compileToolSelector(layers: readonly ToolSelectorLayer[], legs?: readonly ToolLegKind[]): ToolSelector;
141
127
  /**
142
128
  * What a leg's tool valve leaves mounted — its one reading: nothing under the run's whole-face switch (`excludeAllTools`: every
143
129
  * tool unmounts, protocol tools included), else what the compiled selector admits. The valve unmounts by it, and every question
144
- * prepare asks about the post-valve roster before the valve runs (the full shell's reachability, the memory write channel, the
145
- * persistence verdict, the two memory pairs' planning) asks it too.
130
+ * prepare asks about the post-valve roster before the valve runs asks it too.
146
131
  */
147
132
  export declare function valveLeaves(spec: {
148
133
  readonly excludeAllTools?: true;
@@ -150,8 +135,8 @@ export declare function valveLeaves(spec: {
150
135
  /**
151
136
  * The valve's reading at the SERVER level — {@link valveLeaves} asked of a whole peer before any of its tools is known: can the valve
152
137
  * leave a tool of the peer `prefix` (`mcp__srv__`) at all? Nothing under the run's whole-face switch; else what the compiled selector's
153
- * lists can reach of the peer ({@link ToolSelector.admitsPeer} — read off the lists, never off what the server lists). A peer this
154
- * answers `false` for leaves no tool on the roster whatever it lists, so a run has no reason to dial it or to teach its instructions.
138
+ * lists can reach of the peer ({@link ToolSelector.admitsPeer}). A peer answered `false` leaves no tool on the roster, so a run has no
139
+ * reason to dial it or to teach its instructions.
155
140
  */
156
141
  export declare function valveLeavesPeer(spec: {
157
142
  readonly excludeAllTools?: true;