@duckmind/dm-windows-x64 0.61.4 → 0.61.9

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 (279) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +211 -67
  3. package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
  4. package/extensions/dm-subagents/agents/claude-code.md +15 -0
  5. package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
  6. package/extensions/dm-subagents/agents/codex-exec.md +15 -0
  7. package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
  8. package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
  9. package/extensions/dm-subagents/agents/delegate.md +3 -2
  10. package/extensions/dm-subagents/agents/oracle.md +10 -5
  11. package/extensions/dm-subagents/agents/researcher.md +2 -2
  12. package/extensions/dm-subagents/agents/reviewer.md +17 -7
  13. package/extensions/dm-subagents/agents/scout.md +5 -5
  14. package/extensions/dm-subagents/agents/worker.md +6 -2
  15. package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
  16. package/extensions/dm-subagents/index.js +4 -0
  17. package/extensions/dm-subagents/inspector-runner.mjs +10 -0
  18. package/extensions/dm-subagents/install.mjs +3 -2
  19. package/extensions/dm-subagents/package.json +2 -2
  20. package/extensions/dm-subagents/prompts/council.md +60 -0
  21. package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
  22. package/extensions/dm-subagents/prompts/review-loop.md +13 -7
  23. package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
  24. package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  25. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
  26. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
  27. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
  28. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
  29. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
  30. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
  31. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
  32. package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
  33. package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
  34. package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
  35. package/extensions/dm-subagents/src/agents/agents.js +1447 -299
  36. package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
  37. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
  38. package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
  39. package/extensions/dm-subagents/src/agents/identity.js +1 -1
  40. package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
  41. package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
  42. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
  43. package/extensions/dm-subagents/src/agents/skills.js +52 -35
  44. package/extensions/dm-subagents/src/api/agents.js +6 -0
  45. package/extensions/dm-subagents/src/api/background-work.js +151 -0
  46. package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
  47. package/extensions/dm-subagents/src/api/control-channel.js +3 -0
  48. package/extensions/dm-subagents/src/api/delegation.js +5 -0
  49. package/extensions/dm-subagents/src/api/dm-args.js +3 -0
  50. package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
  51. package/extensions/dm-subagents/src/api/external-runs.js +233 -0
  52. package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
  53. package/extensions/dm-subagents/src/api/preflight.js +322 -0
  54. package/extensions/dm-subagents/src/api/project-panes.js +11 -0
  55. package/extensions/dm-subagents/src/api/shared-types.js +4 -0
  56. package/extensions/dm-subagents/src/extension/config.js +175 -0
  57. package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
  58. package/extensions/dm-subagents/src/extension/doctor.js +71 -17
  59. package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
  60. package/extensions/dm-subagents/src/extension/index.js +711 -265
  61. package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
  62. package/extensions/dm-subagents/src/extension/rpc.js +427 -22
  63. package/extensions/dm-subagents/src/extension/schemas.js +158 -65
  64. package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
  65. package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
  66. package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
  67. package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
  68. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
  69. package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
  70. package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
  71. package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
  72. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
  73. package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
  74. package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
  75. package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
  76. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
  77. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
  78. package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
  79. package/extensions/dm-subagents/src/missions/actions.js +394 -0
  80. package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
  81. package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
  82. package/extensions/dm-subagents/src/missions/store.js +548 -0
  83. package/extensions/dm-subagents/src/missions/types.js +9 -0
  84. package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
  85. package/extensions/dm-subagents/src/policy/authority.js +37 -0
  86. package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
  87. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
  88. package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
  89. package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
  90. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
  91. package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
  92. package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
  93. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
  94. package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
  95. package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
  96. package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
  97. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
  98. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
  99. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
  100. package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
  101. package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
  102. package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
  103. package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
  104. package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
  105. package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
  106. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
  107. package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
  108. package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
  109. package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
  110. package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
  111. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
  112. package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
  113. package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
  114. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
  115. package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
  116. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
  117. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
  118. package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
  119. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
  120. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
  121. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
  122. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
  123. package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
  124. package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
  125. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
  126. package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
  127. package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
  128. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
  129. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
  130. package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
  131. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
  132. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
  133. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
  134. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
  135. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
  136. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
  137. package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
  138. package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
  139. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
  140. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
  141. package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
  142. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
  143. package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
  144. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
  145. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
  146. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
  147. package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
  148. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
  149. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
  150. package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
  151. package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
  152. package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
  153. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
  154. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
  155. package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
  156. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
  157. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
  158. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
  159. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
  160. package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
  161. package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
  162. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
  163. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
  164. package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
  165. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
  166. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
  167. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
  168. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
  169. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
  170. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
  171. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
  172. package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
  173. package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
  174. package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
  175. package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
  176. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
  177. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
  178. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
  179. package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
  180. package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
  181. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
  182. package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
  183. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
  184. package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
  185. package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
  186. package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
  187. package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
  188. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
  189. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
  190. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
  191. package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
  192. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
  193. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
  194. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
  195. package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
  196. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
  197. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
  198. package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
  199. package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
  200. package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
  201. package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
  202. package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
  203. package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
  204. package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
  205. package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
  206. package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
  207. package/extensions/dm-subagents/src/shared/display-text.js +142 -0
  208. package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
  209. package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
  210. package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
  211. package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
  212. package/extensions/dm-subagents/src/shared/formatters.js +21 -7
  213. package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
  214. package/extensions/dm-subagents/src/shared/model-info.js +10 -5
  215. package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
  216. package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
  217. package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
  218. package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
  219. package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
  220. package/extensions/dm-subagents/src/shared/settings.js +39 -47
  221. package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
  222. package/extensions/dm-subagents/src/shared/status-format.js +9 -2
  223. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
  224. package/extensions/dm-subagents/src/shared/types.js +47 -7
  225. package/extensions/dm-subagents/src/shared/utf8.js +12 -0
  226. package/extensions/dm-subagents/src/shared/utils.js +151 -131
  227. package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
  228. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
  229. package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
  230. package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
  231. package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
  232. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
  233. package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
  234. package/extensions/dm-subagents/src/slash/selector.js +101 -0
  235. package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
  236. package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
  237. package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
  238. package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
  239. package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
  240. package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
  241. package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
  242. package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
  243. package/extensions/dm-subagents/src/tui/render.js +1511 -261
  244. package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
  245. package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
  246. package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
  247. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
  248. package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
  249. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
  250. package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
  251. package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
  252. package/extensions/dm-subagents/src/watchdog/render.js +54 -0
  253. package/extensions/dm-subagents/src/watchdog/review.js +251 -0
  254. package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
  255. package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
  256. package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
  257. package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
  258. package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
  259. package/extensions/dm-subagents/src/watchdog/types.js +29 -0
  260. package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
  261. package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
  262. package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
  263. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
  264. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
  265. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
  266. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
  267. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
  268. package/package.json +4 -3
  269. package/extensions/dm-fff/package.json +0 -21
  270. package/extensions/dm-fff/src/index.js +0 -691
  271. package/extensions/dm-fff/src/query.js +0 -60
  272. package/extensions/dm-subagents/agents/context-builder.md +0 -46
  273. package/extensions/dm-subagents/agents/planner.md +0 -55
  274. package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
  275. package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
  276. package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
  277. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
  278. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
  279. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +0 -50
@@ -1,33 +1,79 @@
1
+ import { createHash } from "node:crypto";
1
2
  import * as fs from "node:fs";
2
3
  import * as os from "node:os";
3
4
  import * as path from "node:path";
4
5
  import { fileURLToPath } from "node:url";
5
- import { encodeNestedPathEnv, parseNestedPathEnv } from "./nested-path.js";
6
- import { resolveMcpDirectToolNames } from "./mcp-direct-tool-allowlist.js";
7
- import { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from "./structured-output.js";
8
- import { TEMP_ROOT_DIR } from "../../shared/types.js";
9
- import { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from "./tool-budget.js";
10
- const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
6
+ import {
7
+ encodeNestedPathEnv,
8
+ parseNestedPathEnv
9
+ } from "./nested-path.js";
10
+ import {
11
+ formatUnresolvedMcpDirectToolSelectors,
12
+ resolveMcpDirectToolResolution
13
+ } from "./mcp-direct-tool-allowlist.js";
14
+ import { resolvePiPackageRoot } from "./dm-spawn.js";
15
+ import { encodeExtensionBindings, DM_SUBAGENT_EXTENSION_BINDINGS_ENV } from "./extension-bindings.js";
16
+ import { RUNTIME_EXTENSION_ACK_PATH_ENV } from "./runtime-acknowledged-extensions.js";
17
+ import {
18
+ STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV,
19
+ STRUCTURED_OUTPUT_CAPTURE_ENV,
20
+ STRUCTURED_OUTPUT_SCHEMA_ENV
21
+ } from "./structured-output.js";
22
+ import {
23
+ TEMP_ROOT_DIR
24
+ } from "../../shared/types.js";
25
+ import { THINKING_LEVELS } from "../../shared/model-info.js";
26
+ import { decodeThinkingCeiling, intersectThinkingCeilings, SUBAGENT_THINKING_CEILING_ENV } from "../../shared/thinking-ceiling.js";
27
+ import { encodeRunFanoutBudgetDescriptor, RUN_FANOUT_BUDGET_ENV } from "./run-fanout-budget.js";
28
+ import {
29
+ TOOL_BUDGET_ENV,
30
+ TOOL_BUDGET_ZERO_AUTH_ENV,
31
+ encodeToolBudgetEnv
32
+ } from "./tool-budget.js";
33
+ import {
34
+ CHILD_TOOL_DIAGNOSTIC_PATH_ENV,
35
+ MCP_DIRECT_CHILD_TOOLS_ENV,
36
+ REQUIRED_CHILD_TOOLS_ENV
37
+ } from "./tool-availability.js";
38
+ import {
39
+ CHILD_WATCHDOG_CONFIG_ENV,
40
+ encodeChildWatchdogConfig
41
+ } from "../../watchdog/child-status.js";
42
+ import { WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV, WAIT_TOOL_ENABLED_ENV } from "../background/wait-config.js";
43
+ import {
44
+ DM_CODING_AGENT_PACKAGE_ROOT_ENV,
45
+ getAgentDir
46
+ } from "../../shared/utils.js";
47
+ import {
48
+ encodePermissionRules,
49
+ PERMISSION_AUDIT_PATH_ENV,
50
+ PERMISSION_POLICY_ENV
51
+ } from "./permissions.js";
52
+ import {
53
+ SUBAGENT_CAPABILITY_CEILING_ENV,
54
+ capabilityCeilingAgentRestrictionSources,
55
+ decodeSubagentCapabilityCeiling,
56
+ encodeSubagentCapabilityCeiling,
57
+ intersectSubagentCapabilityCeilings,
58
+ isAgentAllowedByCapabilityCeiling
59
+ } from "./capability-ceiling.js";
11
60
  const TASK_ARG_LIMIT = 8000;
12
- export function resolveRuntimeExtensionPath(moduleUrl, relativeStem) {
13
- const modulePath = fileURLToPath(moduleUrl);
14
- const moduleSuffix = path.extname(modulePath);
15
- const runtimeSuffix = [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"].includes(moduleSuffix) ? moduleSuffix : ".ts";
16
- return path.join(path.dirname(modulePath), `${relativeStem}${runtimeSuffix}`);
61
+ export const SUBAGENT_TASK_DELIVERY_ENV = "DM_SUBAGENT_TASK_DELIVERY";
62
+ export function resolveSubagentTaskDelivery(env = process.env) {
63
+ return env[SUBAGENT_TASK_DELIVERY_ENV]?.trim().toLowerCase() === "file" ? "file" : "auto";
17
64
  }
18
- function isStandaloneDmArgsModule(moduleUrl) {
19
- return path.basename(fileURLToPath(moduleUrl)).startsWith("dm-args.");
65
+ function shouldDeliverTaskViaFile(task, delivery) {
66
+ return delivery === "file" || task.length > TASK_ARG_LIMIT;
20
67
  }
21
- export function resolvePromptRuntimePath(moduleUrl = import.meta.url) {
22
- const promptStem = isStandaloneDmArgsModule(moduleUrl) ? "subagent-prompt-runtime" : path.join("..", "runs", "shared", "subagent-prompt-runtime");
23
- return resolveRuntimeExtensionPath(moduleUrl, promptStem);
24
- }
25
- export function resolveFanoutChildPath(moduleUrl = import.meta.url) {
26
- const fanoutStem = isStandaloneDmArgsModule(moduleUrl) ? path.join("..", "..", "extension", "fanout-child") : "fanout-child";
27
- return resolveRuntimeExtensionPath(moduleUrl, fanoutStem);
28
- }
29
- const PROMPT_RUNTIME_EXTENSION_PATH = resolvePromptRuntimePath();
30
- const FANOUT_CHILD_EXTENSION_PATH = resolveFanoutChildPath();
68
+ const MAX_LAUNCH_RESOLVED_EXTENSION_IDS = 32;
69
+ const PROMPT_RUNTIME_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-prompt-runtime.js");
70
+ const FANOUT_CHILD_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "extension", "fanout-child.js");
71
+ const FAST_MODE_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "fast-mode-extension.js");
72
+ const FAST_MODE_ALLOWED_MODELS = new Set([
73
+ "openai-codex/gpt-5.6-luna",
74
+ "openai-codex/gpt-5.6-sol"
75
+ ]);
76
+ const OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH = 64;
31
77
  export const SUBAGENT_CHILD_ENV = "DM_SUBAGENT_CHILD";
32
78
  export const SUBAGENT_ORCHESTRATOR_TARGET_ENV = "DM_SUBAGENT_ORCHESTRATOR_TARGET";
33
79
  export const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = "DM_SUBAGENT_ORCHESTRATOR_SESSION_ID";
@@ -45,7 +91,20 @@ export const SUBAGENT_PARENT_DEPTH_ENV = "DM_SUBAGENT_PARENT_DEPTH";
45
91
  export const SUBAGENT_PARENT_PATH_ENV = "DM_SUBAGENT_PARENT_PATH";
46
92
  export const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "DM_SUBAGENT_PARENT_CAPABILITY_TOKEN";
47
93
  export const SUBAGENT_PARENT_SESSION_ENV = "DM_SUBAGENT_PARENT_SESSION";
94
+ export const SUBAGENT_FORK_CACHE_KEY_ENV = "DM_SUBAGENT_FORK_CACHE_KEY";
48
95
  export const SUBAGENT_STEER_INBOX_ENV = "DM_SUBAGENT_STEER_INBOX";
96
+ export const SUBAGENT_STEER_CAPABILITY_ENV = "DM_SUBAGENT_STEER_CAPABILITY";
97
+ export const SUBAGENT_STEER_ACK_DIR_ENV = "DM_SUBAGENT_STEER_ACK_DIR";
98
+ export const PI_INTERCOM_STABLE_ID_ENV = "PI_INTERCOM_STABLE_ID";
99
+ export const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
100
+ export const SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV = "DM_SUBAGENT_INHERIT_GLOBAL_CONTEXT";
101
+ export function deriveForkPromptCacheKey(parentSessionId) {
102
+ const parent = parentSessionId?.trim();
103
+ if (!parent)
104
+ return;
105
+ const digest = createHash("sha256").update(parent).digest("hex").slice(0, OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH - "dm-fork:".length);
106
+ return `dm-fork:${digest}`;
107
+ }
49
108
  function sanitizeSupervisorChannelSegment(value) {
50
109
  return value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "unknown";
51
110
  }
@@ -56,11 +115,247 @@ export function applyThinkingSuffix(model, thinking, replaceExisting = false) {
56
115
  if (!model || !thinking)
57
116
  return model;
58
117
  const colonIdx = model.lastIndexOf(":");
59
- if (colonIdx !== -1 && THINKING_LEVELS.includes(model.substring(colonIdx + 1))) {
118
+ if (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {
60
119
  return replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;
61
120
  }
62
121
  return `${model}:${thinking}`;
63
122
  }
123
+ function stripThinkingSuffix(model) {
124
+ const colonIdx = model.lastIndexOf(":");
125
+ if (colonIdx === -1)
126
+ return model;
127
+ return THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1)) ? model.slice(0, colonIdx) : model;
128
+ }
129
+ function resolveFastModeExtension(input) {
130
+ if (!input.fast)
131
+ return [];
132
+ const candidates = ((input.modelCandidates?.length) ? input.modelCandidates : input.model ? [input.model] : []).map(stripThinkingSuffix);
133
+ if (candidates.length === 0) {
134
+ throw new Error(`fast mode requires an explicit supported native OpenAI-Codex model${input.agentName ? ` for agent '${input.agentName}'` : ""}.`);
135
+ }
136
+ const unsupported = candidates.filter((model) => !FAST_MODE_ALLOWED_MODELS.has(model));
137
+ if (unsupported.length > 0) {
138
+ throw new Error(`fast mode supports only ${[...FAST_MODE_ALLOWED_MODELS].join(", ")}; unsupported model${unsupported.length === 1 ? "" : "s"}: ${unsupported.join(", ")}.`);
139
+ }
140
+ return [FAST_MODE_EXTENSION_PATH];
141
+ }
142
+ function extensionIdentifier(value) {
143
+ return `sha256:${createHash("sha256").update(path.normalize(value.trim())).digest("hex").slice(0, 16)}`;
144
+ }
145
+ function boundedExtensionIdentifiers(values) {
146
+ const ids = [...new Set(values.map(extensionIdentifier))];
147
+ return {
148
+ ids: ids.slice(0, MAX_LAUNCH_RESOLVED_EXTENSION_IDS),
149
+ omitted: Math.max(0, ids.length - MAX_LAUNCH_RESOLVED_EXTENSION_IDS)
150
+ };
151
+ }
152
+ function hasPermissionRules(rules) {
153
+ return rules !== undefined && Object.keys(rules).length > 0;
154
+ }
155
+ function filterRuntimeMcpConfig(config, runtimeServerNames, effectiveRuntimeServerNames) {
156
+ const runtimeNames = new Set(runtimeServerNames);
157
+ const effectiveNames = new Set(effectiveRuntimeServerNames);
158
+ return {
159
+ ...config,
160
+ mcpServers: Object.fromEntries(Object.entries(config.mcpServers).filter(([name]) => !runtimeNames.has(name) || effectiveNames.has(name)))
161
+ };
162
+ }
163
+ export function projectLaunchResolvedChildExtensions(toolPlan) {
164
+ const runtime = boundedExtensionIdentifiers(toolPlan.runtimeExtensions);
165
+ const configured = boundedExtensionIdentifiers(toolPlan.configuredExtensions);
166
+ const effective = boundedExtensionIdentifiers(toolPlan.extensionArgs);
167
+ return {
168
+ version: 1,
169
+ source: "launch-resolved",
170
+ disableAmbientExtensions: toolPlan.disableAmbientExtensions,
171
+ runtime: runtime.ids,
172
+ configured: configured.ids,
173
+ effective: effective.ids,
174
+ omitted: {
175
+ runtime: runtime.omitted,
176
+ configured: configured.omitted,
177
+ effective: effective.omitted
178
+ }
179
+ };
180
+ }
181
+ export function resolvePermissionSystemExtension() {
182
+ const agentDir = getAgentDir();
183
+ const candidates = [
184
+ path.join(agentDir, "npm", "node_modules", "@gotgenes", "dm-permission-system"),
185
+ path.join(agentDir, "extensions", "dm-permission-system")
186
+ ];
187
+ const errors = [];
188
+ for (const extDir of candidates) {
189
+ if (!fs.existsSync(extDir))
190
+ continue;
191
+ const pkgPath = path.join(extDir, "package.json");
192
+ if (!fs.existsSync(pkgPath)) {
193
+ errors.push(new Error(`Permission-system package manifest is missing at ${pkgPath}.`));
194
+ continue;
195
+ }
196
+ try {
197
+ let pkg;
198
+ const parsed = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
199
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
200
+ throw new Error("manifest root must be an object");
201
+ }
202
+ pkg = parsed;
203
+ const extensions = pkg.dm?.extensions;
204
+ const entry = Array.isArray(extensions) ? extensions[0] : undefined;
205
+ if (typeof entry !== "string" || !entry.trim()) {
206
+ throw new Error(`Permission-system package manifest at ${pkgPath} must declare dm.extensions[0] as a non-empty string.`);
207
+ }
208
+ const resolved = path.resolve(extDir, entry);
209
+ if (fs.existsSync(resolved))
210
+ return resolved;
211
+ throw new Error(`Permission-system extension entry ${JSON.stringify(entry)} in ${pkgPath} does not exist at ${resolved}.`);
212
+ } catch (error) {
213
+ const message = error instanceof Error ? error.message : String(error);
214
+ errors.push(message.startsWith("Permission-system") ? new Error(message) : new Error(`Cannot read permission-system package manifest at ${pkgPath}: ${message}`));
215
+ }
216
+ }
217
+ if (errors.length > 0)
218
+ throw errors[0];
219
+ return;
220
+ }
221
+ export function resolvePiLaunchToolPlan(input) {
222
+ const capabilityCeiling = intersectSubagentCapabilityCeilings(input.capabilityCeiling, input.inheritedCapabilityCeiling);
223
+ const allowedToolSet = capabilityCeiling?.allowedTools === undefined ? undefined : new Set(capabilityCeiling.allowedTools);
224
+ const requestedBuiltinTools = input.tools?.filter((tool) => !(tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) ?? [];
225
+ if (input.requireReadTool && allowedToolSet && !allowedToolSet.has("read")) {
226
+ throw new Error(`Capability ceiling from ${capabilityCeiling?.sources.join(", ") || "unknown source"} excludes required tool 'read' for lazy skill loading.`);
227
+ }
228
+ const declaredBuiltinTools = input.tools === undefined ? allowedToolSet ? [...allowedToolSet] : [] : (input.requireReadTool && requestedBuiltinTools.length > 0 && !requestedBuiltinTools.includes("read") && !allowedToolSet ? ["read", ...requestedBuiltinTools] : requestedBuiltinTools).filter((tool) => !allowedToolSet || allowedToolSet.has(tool));
229
+ const fanoutAuthorized = declaredBuiltinTools.includes("subagent") || input.allowNestedSubagents === true && (!allowedToolSet || allowedToolSet.has("subagent"));
230
+ const toolExtensionPaths = capabilityCeiling?.denyExtensions ? [] : (input.tools ?? []).filter((tool) => !requestedBuiltinTools.includes(tool) && (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")));
231
+ const mcpResolution = capabilityCeiling?.denyExtensions ? { selections: [], unresolvedSelectors: [] } : resolveMcpDirectToolResolution(input.mcpDirectTools, input.cwd, input.runtimeSnapshotHost, input.mcpConfig);
232
+ if (mcpResolution.unresolvedSelectors.length > 0) {
233
+ throw new Error(formatUnresolvedMcpDirectToolSelectors(mcpResolution.unresolvedSelectors));
234
+ }
235
+ const resolvedMcpSelections = mcpResolution.selections;
236
+ const resolvedMcpNames = new Set(resolvedMcpSelections.map((selection) => selection.name));
237
+ const legacyMcpNameCounts = countLegacyUnderscoreMcpToolNames(resolvedMcpSelections);
238
+ const effectiveMcpSelections = resolvedMcpSelections.filter((selection) => !allowedToolSet || allowedToolSet.has(selection.name) || isLegacyUnderscoreMcpToolAllowed(selection, allowedToolSet, resolvedMcpNames, legacyMcpNameCounts));
239
+ const effectiveMcpTools = effectiveMcpSelections.map((selection) => selection.name);
240
+ const runtimeServerNames = mcpResolution.runtimeServerNames ?? input.runtimeServerNames ?? [];
241
+ const effectiveRuntimeServerNames = runtimeServerNames.filter((serverName) => effectiveMcpSelections.some((selection) => selection.selector.startsWith(`${serverName}/`)));
242
+ const effectiveMcpConfig = mcpResolution.mcpConfig ?? input.mcpConfig;
243
+ const filteredMcpConfig = effectiveMcpConfig ? filterRuntimeMcpConfig(effectiveMcpConfig, runtimeServerNames, effectiveRuntimeServerNames) : undefined;
244
+ const explicitToolAllowlist = input.tools !== undefined || (input.mcpDirectTools?.length ?? 0) > 0 || allowedToolSet !== undefined;
245
+ const internalTools = input.structuredOutput ? ["structured_output"] : [];
246
+ const effectiveToolAllowlist = [
247
+ ...new Set([
248
+ ...declaredBuiltinTools,
249
+ ...effectiveMcpTools,
250
+ ...internalTools
251
+ ])
252
+ ];
253
+ const legacySupervisorPairing = declaredBuiltinTools.includes("contact_supervisor");
254
+ const requiredChildTools = explicitToolAllowlist ? [
255
+ ...new Set([
256
+ ...input.tools !== undefined ? declaredBuiltinTools : [],
257
+ ...input.mcpDirectTools?.length ? effectiveMcpTools : [],
258
+ ...internalTools
259
+ ].filter((tool) => tool !== "contact_supervisor" && (!legacySupervisorPairing || tool !== "intercom")))
260
+ ] : [];
261
+ const permSystemExt = capabilityCeiling?.denyExtensions ? undefined : hasPermissionRules(input.permissionRules) ? resolvePermissionSystemExtension() : undefined;
262
+ if (input.fast && capabilityCeiling?.denyExtensions)
263
+ throw new Error("fast mode requires a child runtime extension, but this launch denies extensions.");
264
+ const fastModeExtensions = resolveFastModeExtension({ fast: input.fast, model: input.model, modelCandidates: input.modelCandidates, agentName: input.agentName });
265
+ const runtimeExtensions = [
266
+ PROMPT_RUNTIME_EXTENSION_PATH,
267
+ ...fastModeExtensions,
268
+ ...fanoutAuthorized ? [FANOUT_CHILD_EXTENSION_PATH] : [],
269
+ ...permSystemExt ? [permSystemExt] : []
270
+ ];
271
+ const disableAmbientExtensions = capabilityCeiling?.denyExtensions === true || input.extensions !== undefined;
272
+ const warnings = [];
273
+ if (capabilityCeiling?.denyExtensions !== true && Array.isArray(input.extensions) && input.extensions.length === 0) {
274
+ const agentLabel = input.agentName ? ` for agent '${input.agentName}'` : "";
275
+ warnings.push(`extensions: [] override${agentLabel} disables ALL ambient extensions for this child (not just "adds nothing"), ` + "including any model-provider extension needed to resolve a provider-qualified model. " + "List the extensions this child actually needs instead of an empty array.");
276
+ }
277
+ const configuredExtensions = capabilityCeiling?.denyExtensions ? [] : [
278
+ ...toolExtensionPaths,
279
+ ...input.extensions ?? [],
280
+ ...input.subagentOnlyExtensions ?? []
281
+ ];
282
+ const extensionArgs = disableAmbientExtensions ? [...new Set([...runtimeExtensions, ...configuredExtensions])] : [
283
+ ...new Set([
284
+ ...runtimeExtensions,
285
+ ...toolExtensionPaths,
286
+ ...input.subagentOnlyExtensions ?? []
287
+ ])
288
+ ];
289
+ const requestedToolNames = input.tools !== undefined ? [
290
+ ...new Set([
291
+ ...requestedBuiltinTools,
292
+ ...resolvedMcpSelections.map((selection) => selection.name)
293
+ ])
294
+ ] : undefined;
295
+ const capabilityAudit = capabilityCeiling ? {
296
+ ceiling: capabilityCeiling,
297
+ ...requestedToolNames ? { requestedTools: requestedToolNames } : {},
298
+ effectiveTools: effectiveToolAllowlist,
299
+ removedTools: requestedToolNames?.filter((tool) => !effectiveToolAllowlist.includes(tool)) ?? [],
300
+ internalTools,
301
+ extensionsDenied: capabilityCeiling.denyExtensions,
302
+ removedExtensionCount: capabilityCeiling.denyExtensions ? (input.extensions?.length ?? 0) + (input.subagentOnlyExtensions?.length ?? 0) + (input.tools ?? []).filter((tool) => tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")).length : 0,
303
+ requestedMcpToolCount: input.mcpDirectTools?.length ?? 0,
304
+ effectiveMcpTools,
305
+ agentAllowed: input.agentName === undefined ? true : isAgentAllowedByCapabilityCeiling(input.agentName, capabilityCeiling),
306
+ ...capabilityCeilingAgentRestrictionSources(capabilityCeiling) ? {
307
+ agentRestrictionSources: capabilityCeilingAgentRestrictionSources(capabilityCeiling)
308
+ } : {}
309
+ } : undefined;
310
+ return {
311
+ ...capabilityCeiling ? { capabilityCeiling } : {},
312
+ requestedBuiltinTools,
313
+ declaredBuiltinTools,
314
+ toolExtensionPaths,
315
+ resolvedMcpSelections,
316
+ effectiveMcpSelections,
317
+ effectiveMcpTools,
318
+ explicitToolAllowlist,
319
+ internalTools,
320
+ effectiveToolAllowlist,
321
+ requiredChildTools,
322
+ fanoutAuthorized,
323
+ runtimeExtensions,
324
+ configuredExtensions,
325
+ extensionArgs,
326
+ disableAmbientExtensions,
327
+ warnings,
328
+ ...effectiveRuntimeServerNames.length > 0 && filteredMcpConfig ? { mcpConfig: filteredMcpConfig, runtimeServerNames: effectiveRuntimeServerNames } : {},
329
+ ...capabilityAudit ? { capabilityAudit } : {}
330
+ };
331
+ }
332
+ function countLegacyUnderscoreMcpToolNames(selections) {
333
+ const counts = new Map;
334
+ for (const selection of selections) {
335
+ const legacyName = legacyUnderscoreMcpToolName(selection);
336
+ if (legacyName !== selection.name)
337
+ counts.set(legacyName, (counts.get(legacyName) ?? 0) + 1);
338
+ }
339
+ return counts;
340
+ }
341
+ function isLegacyUnderscoreMcpToolAllowed(selection, allowedToolSet, resolvedMcpNames, legacyMcpNameCounts) {
342
+ const legacyName = legacyUnderscoreMcpToolName(selection);
343
+ return legacyMcpNameCounts.get(legacyName) === 1 && !resolvedMcpNames.has(legacyName) && allowedToolSet.has(legacyName);
344
+ }
345
+ function legacyUnderscoreMcpToolName(selection) {
346
+ const slash = selection.selector.indexOf("/");
347
+ if (slash < 1)
348
+ return selection.name;
349
+ const toolName = selection.selector.slice(slash + 1);
350
+ const suffix = `_${toolName}`;
351
+ if (!selection.name.endsWith(suffix))
352
+ return selection.name;
353
+ const prefix = selection.name.slice(0, -suffix.length);
354
+ return `${prefix.replace(/-/g, "_")}${suffix}`;
355
+ }
356
+ function escapeXmlAttr(value) {
357
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
358
+ }
64
359
  export function buildPiArgs(input) {
65
360
  const args = [...input.baseArgs];
66
361
  if (input.sessionFile) {
@@ -79,47 +374,62 @@ export function buildPiArgs(input) {
79
374
  if (modelArg) {
80
375
  args.push("--model", modelArg);
81
376
  }
82
- const declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) ?? [];
83
- const declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes("read") ? ["read", ...declaredBuiltinToolsBase] : declaredBuiltinToolsBase;
84
- const fanoutAuthorized = declaredBuiltinTools.includes("subagent");
85
- const toolExtensionPaths = [];
86
- if (input.tools?.length) {
87
- const builtinTools = [...declaredBuiltinTools];
88
- for (const tool of input.tools) {
89
- if (!declaredBuiltinTools.includes(tool) && (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) {
90
- toolExtensionPaths.push(tool);
91
- }
92
- }
93
- if (builtinTools.length > 0) {
94
- if (input.mcpDirectTools?.length) {
95
- builtinTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));
96
- }
97
- args.push("--tools", builtinTools.join(","));
98
- }
377
+ const toolPlan = resolvePiLaunchToolPlan({
378
+ tools: input.tools,
379
+ allowNestedSubagents: input.allowNestedSubagents,
380
+ extensions: input.extensions,
381
+ subagentOnlyExtensions: input.subagentOnlyExtensions,
382
+ mcpDirectTools: input.mcpDirectTools,
383
+ mcpConfig: input.mcpConfig,
384
+ runtimeServerNames: input.runtimeServerNames,
385
+ cwd: input.cwd,
386
+ requireReadTool: input.requireReadTool,
387
+ structuredOutput: input.structuredOutput,
388
+ fast: input.fast,
389
+ model: modelArg,
390
+ modelCandidates: input.modelCandidates,
391
+ capabilityCeiling: input.capabilityCeiling,
392
+ inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
393
+ agentName: input.childAgentName,
394
+ permissionRules: input.permissionRules,
395
+ runtimeSnapshotHost: input.runtimeSnapshotHost
396
+ });
397
+ if (toolPlan.explicitToolAllowlist) {
398
+ args.push(toolPlan.effectiveToolAllowlist.length > 0 ? "--tools" : "--no-tools");
399
+ if (toolPlan.effectiveToolAllowlist.length > 0)
400
+ args.push(toolPlan.effectiveToolAllowlist.join(","));
99
401
  }
100
- const runtimeExtensions = fanoutAuthorized ? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH] : [PROMPT_RUNTIME_EXTENSION_PATH];
101
- if (input.extensions !== undefined) {
402
+ if (toolPlan.disableAmbientExtensions) {
102
403
  args.push("--no-extensions");
103
- for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...input.subagentOnlyExtensions ?? []])]) {
104
- args.push("--extension", extPath);
105
- }
106
- } else {
107
- for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.subagentOnlyExtensions ?? []])]) {
108
- args.push("--extension", extPath);
109
- }
404
+ }
405
+ for (const extPath of toolPlan.extensionArgs)
406
+ args.push("--extension", extPath);
407
+ let tempDir;
408
+ if (toolPlan.mcpConfig && toolPlan.runtimeServerNames?.length) {
409
+ if (!tempDir)
410
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
411
+ const mcpConfigPath = path.join(tempDir, "mcp-config.json");
412
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(toolPlan.mcpConfig, null, 2), { mode: 384 });
413
+ args.push("--mcp-config", mcpConfigPath);
414
+ }
415
+ if (!input.inheritProjectContext) {
416
+ args.push("--no-context-files");
110
417
  }
111
418
  if (!input.inheritSkills) {
112
419
  args.push("--no-skills");
113
420
  }
114
- let tempDir;
115
421
  if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
116
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
422
+ if (!tempDir)
423
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
117
424
  const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
118
425
  const promptPath = path.join(tempDir, `${stem}.md`);
119
- fs.writeFileSync(promptPath, input.systemPrompt, { mode: 384 });
426
+ const taggedPrompt = input.childAgentName ? `<active_agent name="${escapeXmlAttr(input.childAgentName)}"/>
427
+
428
+ ${input.systemPrompt}` : input.systemPrompt;
429
+ fs.writeFileSync(promptPath, taggedPrompt, { mode: 384 });
120
430
  args.push(input.systemPromptMode === "replace" ? "--system-prompt" : "--append-system-prompt", promptPath);
121
431
  }
122
- if (input.task.length > TASK_ARG_LIMIT) {
432
+ if (shouldDeliverTaskViaFile(input.task, input.taskDelivery ?? resolveSubagentTaskDelivery())) {
123
433
  if (!tempDir) {
124
434
  tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
125
435
  }
@@ -130,8 +440,31 @@ export function buildPiArgs(input) {
130
440
  args.push(`Task: ${input.task}`);
131
441
  }
132
442
  const env = {};
443
+ env[DM_SUBAGENT_EXTENSION_BINDINGS_ENV] = encodeExtensionBindings(input.extensionBindings);
444
+ const piPackageRoot = process.env[DM_CODING_AGENT_PACKAGE_ROOT_ENV] ?? resolvePiPackageRoot();
445
+ if (piPackageRoot)
446
+ env[DM_CODING_AGENT_PACKAGE_ROOT_ENV] = piPackageRoot;
447
+ if (!tempDir)
448
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
449
+ const runtimeAcknowledgedExtensionsPath = path.join(tempDir, "runtime-acknowledged-extensions.json");
450
+ env[RUNTIME_EXTENSION_ACK_PATH_ENV] = runtimeAcknowledgedExtensionsPath;
451
+ let toolDiagnosticPath;
452
+ if (toolPlan.requiredChildTools.length > 0) {
453
+ if (!tempDir)
454
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
455
+ toolDiagnosticPath = path.join(tempDir, "tool-diagnostic.json");
456
+ env[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(toolPlan.requiredChildTools);
457
+ env[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;
458
+ }
459
+ env[MCP_DIRECT_CHILD_TOOLS_ENV] = toolPlan.effectiveMcpTools.length > 0 ? JSON.stringify(toolPlan.effectiveMcpTools) : undefined;
133
460
  env[SUBAGENT_CHILD_ENV] = "1";
134
- env[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? "1" : "0";
461
+ env[SUBAGENT_FANOUT_CHILD_ENV] = toolPlan.fanoutAuthorized ? "1" : "0";
462
+ if (input.waitToolEnabled !== undefined) {
463
+ env[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? "true" : "false";
464
+ }
465
+ if (input.waitToolDefaultTimeoutMs !== undefined) {
466
+ env[WAIT_TOOL_DEFAULT_TIMEOUT_MS_ENV] = String(input.waitToolDefaultTimeoutMs);
467
+ }
135
468
  const inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);
136
469
  const parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? "";
137
470
  const parentChildIndex = input.parentChildIndex !== undefined ? String(input.parentChildIndex) : input.childIndex !== undefined ? String(input.childIndex) : process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? "";
@@ -139,31 +472,41 @@ export function buildPiArgs(input) {
139
472
  const parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);
140
473
  const parentPath = input.parentPath ?? [
141
474
  ...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),
142
- ...parentRunId ? [{
143
- runId: parentRunId,
144
- ...parentChildIndex && /^\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {},
145
- ...input.childAgentName ? { agent: input.childAgentName } : {}
146
- }] : []
475
+ ...parentRunId ? [
476
+ {
477
+ runId: parentRunId,
478
+ ...parentChildIndex && /^\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {},
479
+ ...input.childAgentName ? { agent: input.childAgentName } : {}
480
+ }
481
+ ] : []
147
482
  ];
148
- env[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized ? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? "" : "";
149
- env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized ? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? "" : "";
150
- env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized ? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? "" : "";
151
- env[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : "";
152
- env[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : "";
153
- env[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : "";
154
- env[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : "";
155
- env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized ? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? "" : "";
483
+ env[SUBAGENT_PARENT_EVENT_SINK_ENV] = toolPlan.fanoutAuthorized ? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? "" : "";
484
+ env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = toolPlan.fanoutAuthorized ? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? "" : "";
485
+ env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = toolPlan.fanoutAuthorized ? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? "" : "";
486
+ env[SUBAGENT_PARENT_RUN_ID_ENV] = toolPlan.fanoutAuthorized ? parentRunId : "";
487
+ env[SUBAGENT_PARENT_CHILD_INDEX_ENV] = toolPlan.fanoutAuthorized ? parentChildIndex : "";
488
+ env[SUBAGENT_PARENT_DEPTH_ENV] = toolPlan.fanoutAuthorized ? String(parentDepth) : "";
489
+ env[SUBAGENT_PARENT_PATH_ENV] = toolPlan.fanoutAuthorized ? encodeNestedPathEnv(parentPath) : "";
490
+ env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = toolPlan.fanoutAuthorized ? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? "" : "";
491
+ env[RUN_FANOUT_BUDGET_ENV] = toolPlan.fanoutAuthorized ? input.runFanoutBudget ? encodeRunFanoutBudgetDescriptor(input.runFanoutBudget) : process.env[RUN_FANOUT_BUDGET_ENV] : undefined;
156
492
  env.DM_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? "1" : "0";
493
+ env[SUBAGENT_INHERIT_GLOBAL_CONTEXT_ENV] = input.inheritGlobalContext ? "1" : "0";
157
494
  env.DM_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
495
+ env[PI_INTERCOM_STABLE_ID_ENV] = input.intercomSessionName || undefined;
496
+ env[PI_INTERCOM_SESSION_ID_ENV] = undefined;
158
497
  if (input.intercomSessionName) {
159
498
  env.DM_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
160
499
  }
500
+ if (input.sessionName?.trim()) {
501
+ env.DM_SUBAGENT_SESSION_NAME = input.sessionName.trim();
502
+ }
161
503
  if (input.orchestratorIntercomTarget) {
162
504
  env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;
163
505
  }
164
506
  if (input.parentSessionId) {
165
507
  env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;
166
508
  }
509
+ const encodedPermissionRules = encodePermissionRules(input.permissionRules);
167
510
  if (input.orchestratorIntercomTarget && input.parentSessionId && input.runId && input.childAgentName) {
168
511
  const childIndex = input.childIndex ?? 0;
169
512
  const channelDir = supervisorChannelDir(input.runId, input.childAgentName, childIndex);
@@ -171,6 +514,8 @@ export function buildPiArgs(input) {
171
514
  fs.mkdirSync(path.join(channelDir, "replies"), { recursive: true });
172
515
  env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;
173
516
  }
517
+ if (encodedPermissionRules)
518
+ env[PERMISSION_AUDIT_PATH_ENV] = input.permissionAuditPath ?? path.join(tempDir, "permission-audit.jsonl");
174
519
  if (input.runId) {
175
520
  env[SUBAGENT_RUN_ID_ENV] = input.runId;
176
521
  }
@@ -180,23 +525,51 @@ export function buildPiArgs(input) {
180
525
  if (input.childIndex !== undefined) {
181
526
  env[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);
182
527
  }
183
- if (input.mcpDirectTools?.length) {
528
+ if (!toolPlan.capabilityCeiling && input.mcpDirectTools?.length)
184
529
  env.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(",");
185
- } else {
530
+ else if (toolPlan.capabilityCeiling && toolPlan.effectiveMcpSelections.length && !toolPlan.capabilityCeiling.denyExtensions)
531
+ env.MCP_DIRECT_TOOLS = toolPlan.effectiveMcpSelections.map((selection) => selection.selector).join(",");
532
+ else
186
533
  env.MCP_DIRECT_TOOLS = "__none__";
187
- }
534
+ const encodedCapabilityCeiling = encodeSubagentCapabilityCeiling(toolPlan.capabilityCeiling);
535
+ const thinkingCeiling = intersectThinkingCeilings(input.thinkingCeiling, decodeThinkingCeiling(process.env[SUBAGENT_THINKING_CEILING_ENV]));
536
+ if (thinkingCeiling)
537
+ env[SUBAGENT_THINKING_CEILING_ENV] = thinkingCeiling;
538
+ if (encodedCapabilityCeiling)
539
+ env[SUBAGENT_CAPABILITY_CEILING_ENV] = encodedCapabilityCeiling;
540
+ if (encodedPermissionRules)
541
+ env[PERMISSION_POLICY_ENV] = encodedPermissionRules;
188
542
  if (input.structuredOutput) {
189
543
  env[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;
190
544
  env[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;
545
+ if (input.structuredOutput.acceptanceReportPath)
546
+ env[STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV] = input.structuredOutput.acceptanceReportPath;
191
547
  }
192
548
  if (input.steerInboxDir) {
193
549
  env[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;
194
550
  }
551
+ if (input.steerCapabilityPath)
552
+ env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;
553
+ if (input.steerAckDir)
554
+ env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;
195
555
  const encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);
196
556
  if (encodedToolBudget)
197
557
  env[TOOL_BUDGET_ENV] = encodedToolBudget;
558
+ env[TOOL_BUDGET_ZERO_AUTH_ENV] = input.allowZeroToolBudget ? "1" : undefined;
559
+ const encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);
560
+ if (encodedChildWatchdog)
561
+ env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;
198
562
  env[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? "";
199
- return { args, env, tempDir };
563
+ env[SUBAGENT_FORK_CACHE_KEY_ENV] = input.forkCacheKey?.trim() || undefined;
564
+ return {
565
+ args,
566
+ env,
567
+ warnings: toolPlan.warnings,
568
+ tempDir,
569
+ toolDiagnosticPath,
570
+ runtimeAcknowledgedExtensionsPath,
571
+ capabilityAudit: toolPlan.capabilityAudit
572
+ };
200
573
  }
201
574
  export const parseParentPathEnv = parseNestedPathEnv;
202
575
  export function cleanupTempDir(tempDir) {