@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,6 +1,9 @@
1
1
  import * as fs from "node:fs";
2
+ import * as os from "node:os";
2
3
  import * as path from "node:path";
4
+ import { discoverAgents, formatUnknownAgentError, unknownAgentDiagnosticContext } from "../agents/agents.js";
3
5
  import { normalizeSkillInput } from "../agents/skills.js";
6
+ import { normalizeOutputOverride } from "../runs/shared/child-launch-plan.js";
4
7
  import { CHAIN_RUNS_DIR } from "./types.js";
5
8
  const CHAIN_DIR_MAX_AGE_MS = 24 * 60 * 60 * 1000;
6
9
  const INITIAL_PROGRESS_CONTENT = `# Progress
@@ -14,9 +17,13 @@ In Progress
14
17
 
15
18
  ## Notes
16
19
  `;
17
- function normalizeOutputOverride(output) {
18
- return output === "false" ? false : output;
19
- }
20
+ export {
21
+ planChildLaunch,
22
+ resolveStepBehavior,
23
+ resolveTaskTextForFileUpdatePolicy,
24
+ suppressProgressForReadOnlyTask,
25
+ taskDisallowsFileUpdates
26
+ } from "../runs/shared/child-launch-plan.js";
20
27
  export function isParallelStep(step) {
21
28
  return "parallel" in step && Array.isArray(step.parallel);
22
29
  }
@@ -80,56 +87,38 @@ export function resolveChainTemplates(steps) {
80
87
  return i === 0 ? "{task}" : "{previous}";
81
88
  });
82
89
  }
83
- export function resolveStepBehavior(agentConfig, stepOverrides, chainSkills) {
84
- const stepOutput = normalizeOutputOverride(stepOverrides.output);
85
- const output = stepOutput !== undefined ? stepOutput : normalizeOutputOverride(agentConfig.output) ?? false;
86
- const reads = stepOverrides.reads !== undefined ? stepOverrides.reads : agentConfig.defaultReads ?? false;
87
- const progress = stepOverrides.progress !== undefined ? stepOverrides.progress : agentConfig.defaultProgress ?? false;
88
- let skills;
89
- if (stepOverrides.skills === false) {
90
- skills = false;
91
- } else if (stepOverrides.skills !== undefined) {
92
- skills = [...stepOverrides.skills];
93
- if (chainSkills && chainSkills.length > 0) {
94
- skills = [...new Set([...skills, ...chainSkills])];
95
- }
96
- } else {
97
- skills = agentConfig.skills ? [...agentConfig.skills] : [];
98
- if (chainSkills && chainSkills.length > 0) {
99
- skills = [...new Set([...skills, ...chainSkills])];
100
- }
101
- }
102
- const outputMode = stepOverrides.outputMode ?? "inline";
103
- const model = stepOverrides.model ?? agentConfig.model;
104
- return { output, outputMode, reads, progress, skills, model };
105
- }
106
- export function resolveTaskTextForFileUpdatePolicy(task, originalTask) {
107
- if (!task)
108
- return originalTask;
109
- return originalTask ? task.replaceAll("{task}", originalTask) : task;
110
- }
111
- export function taskDisallowsFileUpdates(task) {
112
- if (!task)
113
- return false;
114
- return /\breview[- ]only\b/i.test(task) || /\bread[- ]only\s+(?:review|audit|inspection|pass)\b/i.test(task) || /\b(?:no|without)\s+(?:file\s+)?edits?\b/i.test(task) || /\b(?:do not|don't|must not)\s+(?:edit|modify|write|touch)\b/i.test(task) || /\bleave\s+files?\s+unchanged\b/i.test(task);
115
- }
116
- export function suppressProgressForReadOnlyTask(behavior, task, originalTask) {
117
- const policyTask = resolveTaskTextForFileUpdatePolicy(task, originalTask);
118
- return behavior.progress && taskDisallowsFileUpdates(policyTask) ? { ...behavior, progress: false } : behavior;
90
+ export function expandHomePath(filePath) {
91
+ if (filePath === "~")
92
+ return os.homedir();
93
+ if (filePath.startsWith("~/"))
94
+ return path.join(os.homedir(), filePath.slice(2));
95
+ return filePath;
96
+ }
97
+ export function resolveChainPath(filePath, chainDir) {
98
+ const expanded = expandHomePath(filePath);
99
+ return path.isAbsolute(expanded) ? expanded : path.join(chainDir, expanded);
100
+ }
101
+ export function resolveExistingReadInstructionPaths(reads, instructionCwd, existenceCwd = instructionCwd) {
102
+ return reads.flatMap((filePath) => {
103
+ const instructionPath = resolveChainPath(filePath, instructionCwd);
104
+ const existencePath = resolveChainPath(filePath, existenceCwd);
105
+ return fs.existsSync(existencePath) ? [instructionPath] : [];
106
+ });
119
107
  }
120
- function resolveChainPath(filePath, chainDir) {
121
- return path.isAbsolute(filePath) ? filePath : path.join(chainDir, filePath);
108
+ export function resolveExistingReadPaths(reads, cwd) {
109
+ return resolveExistingReadInstructionPaths(reads, cwd);
122
110
  }
123
111
  export function writeInitialProgressFile(progressDir) {
124
112
  fs.mkdirSync(progressDir, { recursive: true });
125
113
  fs.writeFileSync(path.join(progressDir, "progress.md"), INITIAL_PROGRESS_CONTENT);
126
114
  }
127
- export function buildChainInstructions(behavior, chainDir, isFirstProgressAgent, previousSummary) {
115
+ export function buildChainInstructions(behavior, chainDir, isFirstProgressAgent, previousSummary, readExistenceDir = chainDir) {
128
116
  const prefixParts = [];
129
117
  const suffixParts = [];
130
118
  if (behavior.reads && behavior.reads.length > 0) {
131
- const files = behavior.reads.map((f) => resolveChainPath(f, chainDir));
132
- prefixParts.push(`[Read from: ${files.join(", ")}]`);
119
+ const files = resolveExistingReadInstructionPaths(behavior.reads, chainDir, readExistenceDir);
120
+ if (files.length > 0)
121
+ prefixParts.push(`[Read from: ${files.join(", ")}]`);
133
122
  }
134
123
  if (behavior.output) {
135
124
  const outputPath = resolveChainPath(behavior.output, chainDir);
@@ -158,11 +147,14 @@ ${previousSummary.trim()}`);
158
147
  `) : "";
159
148
  return { prefix, suffix };
160
149
  }
161
- export function resolveParallelBehaviors(tasks, agentConfigs, stepIndex, chainSkills) {
150
+ export function resolveParallelBehaviors(tasks, agentConfigs, stepIndex, chainSkills, diagnostics) {
162
151
  return tasks.map((task, taskIndex) => {
163
152
  const config = agentConfigs.find((a) => a.name === task.agent);
164
153
  if (!config) {
165
- throw new Error(`Unknown agent: ${task.agent}`);
154
+ if (!diagnostics)
155
+ throw new Error("resolveParallelBehaviors requires unknown-agent diagnostic context or fallback discovery input.");
156
+ const context = "directories" in diagnostics ? diagnostics : unknownAgentDiagnosticContext(discoverAgents(path.resolve(diagnostics.cwd), diagnostics.scope ?? "both"));
157
+ throw new Error(formatUnknownAgentError(task.agent, context));
166
158
  }
167
159
  const subdir = path.join(`parallel-${stepIndex}`, `${taskIndex}-${task.agent}`);
168
160
  let output = false;
@@ -196,7 +188,7 @@ export function resolveParallelBehaviors(tasks, agentConfigs, stepIndex, chainSk
196
188
  skills = [...new Set([...skills, ...chainSkills])];
197
189
  }
198
190
  }
199
- const outputMode = task.outputMode ?? "inline";
191
+ const outputMode = task.outputMode ?? config.outputMode ?? "inline";
200
192
  const model = task.model ?? config.model;
201
193
  return { output, outputMode, reads, progress, skills, model };
202
194
  });
@@ -0,0 +1,16 @@
1
+ import { Key } from "@duckmind/dm-tui";
2
+ export const FLEET_OPEN_SHORTCUT = Key.ctrlAlt("f");
3
+ export function formatShortcutLabel(shortcut) {
4
+ return shortcut.split("+").map((part) => {
5
+ const normalized = part.trim().toLowerCase();
6
+ if (normalized === "ctrl")
7
+ return "Ctrl";
8
+ if (normalized === "alt")
9
+ return "Alt";
10
+ if (normalized === "shift")
11
+ return "Shift";
12
+ if (normalized === "super")
13
+ return "Super";
14
+ return normalized.length === 1 ? normalized.toUpperCase() : part.trim();
15
+ }).join("+");
16
+ }
@@ -16,8 +16,10 @@ export function formatActivityLabel(lastActivityAt, activityState, now = Date.no
16
16
  const age = formatActivityAge(Math.max(0, now - lastActivityAt));
17
17
  if (activityState === "needs_attention")
18
18
  return `no activity for ${age}`;
19
- if (activityState === "active_long_running")
20
- return `active but long-running · last activity ${age} ago`;
19
+ if (activityState === "active_long_running") {
20
+ const activityAge = age === "now" ? "now" : `${age} ago`;
21
+ return `active but long-running · last activity ${activityAge}`;
22
+ }
21
23
  return age === "now" ? "active now" : `active ${age} ago`;
22
24
  }
23
25
  function isCompletedStepStatus(status) {
@@ -28,6 +30,8 @@ export function aggregateStepStatus(steps) {
28
30
  return "running";
29
31
  if (steps.some((step) => step.status === "failed"))
30
32
  return "failed";
33
+ if (steps.some((step) => step.status === "stopped"))
34
+ return "stopped";
31
35
  if (steps.some((step) => step.status === "paused"))
32
36
  return "paused";
33
37
  if (steps.length > 0 && steps.every((step) => isCompletedStepStatus(step.status)))
@@ -41,12 +45,15 @@ export function formatParallelOutcome(steps, total, options = {}) {
41
45
  const running = steps.filter((step) => step.status === "running").length;
42
46
  const done = steps.filter((step) => isCompletedStepStatus(step.status)).length;
43
47
  const failed = steps.filter((step) => step.status === "failed").length;
48
+ const stopped = steps.filter((step) => step.status === "stopped").length;
44
49
  const paused = steps.filter((step) => step.status === "paused").length;
45
50
  const parts = [`${done}/${total} done`];
46
51
  if (options.showRunning !== false && running > 0)
47
52
  parts.unshift(formatAgentRunningLabel(running));
48
53
  if (failed > 0)
49
54
  parts.push(`${failed} failed`);
55
+ if (stopped > 0)
56
+ parts.push(`${stopped} stopped`);
50
57
  if (paused > 0)
51
58
  parts.push(`${paused} paused`);
52
59
  return parts.join(" · ");
@@ -0,0 +1,41 @@
1
+ import { resolveEffectiveThinking, THINKING_LEVELS } from "./model-info.js";
2
+ export const SUBAGENT_THINKING_CEILING_ENV = "DM_SUBAGENT_THINKING_CEILING";
3
+ const thinkingLevelRanks = new Map(THINKING_LEVELS.map((level, index) => [level, index]));
4
+ export function parseThinkingLevel(value, field = "thinking level") {
5
+ if (typeof value === "string") {
6
+ const trimmed = value.trim();
7
+ if (thinkingLevelRanks.has(trimmed))
8
+ return trimmed;
9
+ }
10
+ throw new Error(`Invalid ${field}; expected one of ${THINKING_LEVELS.join(", ")}.`);
11
+ }
12
+ export function compareThinkingLevels(left, right) {
13
+ const leftRank = thinkingLevelRanks.get(left);
14
+ const rightRank = thinkingLevelRanks.get(right);
15
+ if (leftRank === undefined || rightRank === undefined)
16
+ throw new Error(`Invalid thinking level comparison; expected one of ${THINKING_LEVELS.join(", ")}.`);
17
+ return leftRank - rightRank;
18
+ }
19
+ export function intersectThinkingCeilings(...ceilings) {
20
+ const active = ceilings.filter((ceiling) => ceiling !== undefined);
21
+ if (active.length === 0)
22
+ return;
23
+ return active.reduce((lowest, ceiling) => compareThinkingLevels(ceiling, lowest) < 0 ? ceiling : lowest);
24
+ }
25
+ export function decodeThinkingCeiling(value) {
26
+ if (value === undefined || value === "")
27
+ return;
28
+ return parseThinkingLevel(value, "inherited thinking ceiling");
29
+ }
30
+ export function assertThinkingWithinCeiling(input) {
31
+ if (!input.ceiling)
32
+ return;
33
+ const requested = resolveEffectiveThinking(input.model, input.configThinking);
34
+ if (!requested)
35
+ return;
36
+ const requestedLevel = parseThinkingLevel(requested, "requested thinking level");
37
+ if (compareThinkingLevels(requestedLevel, input.ceiling) <= 0)
38
+ return;
39
+ const subject = [input.agent ? `agent '${input.agent}'` : undefined, input.runId ? `run '${input.runId}'` : undefined].filter((value) => Boolean(value)).join(" ");
40
+ throw new Error(`Thinking level '${requestedLevel}' exceeds configured maximum '${input.ceiling}'${subject ? ` for ${subject}` : ""}.`);
41
+ }
@@ -1,20 +1,41 @@
1
1
  import * as os from "node:os";
2
2
  import * as path from "node:path";
3
- export const SUBAGENT_LIFECYCLE_ARTIFACT_VERSION = 1;
4
- export const INTERCOM_DETACH_REQUEST_EVENT = "pi-intercom:detach-request";
5
- export const INTERCOM_DETACH_RESPONSE_EVENT = "pi-intercom:detach-response";
3
+ export const SUBAGENT_LIFECYCLE_ARTIFACT_VERSION = 3;
4
+ export const INTERCOM_DETACH_REQUEST_EVENT = "dm-intercom:detach-request";
5
+ export const INTERCOM_DETACH_RESPONSE_EVENT = "dm-intercom:detach-response";
6
6
  export const SUBAGENT_ASYNC_STARTED_EVENT = "subagent:async-started";
7
7
  export const SUBAGENT_ASYNC_COMPLETE_EVENT = "subagent:async-complete";
8
+ export const SUBAGENT_PROCESS_TERMINAL_EVENT = "subagent:process-terminal";
9
+ export const SUBAGENT_FOREGROUND_COMPLETE_EVENT = "subagent:foreground-complete";
8
10
  export const SUBAGENT_CONTROL_EVENT = "subagent:control-event";
9
11
  export const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
12
+ export const SUBAGENT_STEERING_NOTICE_EVENT = "subagent:steering-notice";
13
+ export const SUBAGENT_CHILD_STATUS_EVENT = "subagent:child-status";
10
14
  export const SUBAGENT_RESULT_INTERCOM_EVENT = "subagent:result-intercom";
11
15
  export const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = "subagent:result-intercom-delivery";
16
+ export const FLEET_KEYBINDING_ACTIONS = [
17
+ "close",
18
+ "scrollUp",
19
+ "scrollDown",
20
+ "selectUp",
21
+ "selectDown",
22
+ "selectFirst",
23
+ "selectLast",
24
+ "pageUp",
25
+ "pageDown",
26
+ "refresh",
27
+ "steer",
28
+ "inspect",
29
+ "stop",
30
+ "toggleTools"
31
+ ];
12
32
  export const DEFAULT_MAX_OUTPUT = {
13
33
  bytes: 200 * 1024,
14
34
  lines: 5000
15
35
  };
16
36
  export const DEFAULT_ARTIFACT_CONFIG = {
17
37
  enabled: true,
38
+ dir: "session",
18
39
  includeInput: true,
19
40
  includeOutput: true,
20
41
  includeJsonl: false,
@@ -56,11 +77,18 @@ export function resolveTempScopeId(options) {
56
77
  }
57
78
  const MAX_PARALLEL = 8;
58
79
  export const MAX_CONCURRENCY = 4;
59
- export const TEMP_ROOT_DIR = path.join(os.tmpdir(), `dm-subagents-${resolveTempScopeId()}`);
80
+ const configuredTempRoot = process.env.DM_SUBAGENTS_TEMP_ROOT?.trim();
81
+ export const TEMP_ROOT_DIR = configuredTempRoot ? path.resolve(configuredTempRoot) : path.join(os.tmpdir(), `dm-subagents-${resolveTempScopeId()}`);
60
82
  export const RESULTS_DIR = path.join(TEMP_ROOT_DIR, "async-subagent-results");
61
83
  export const ASYNC_DIR = path.join(TEMP_ROOT_DIR, "async-subagent-runs");
62
84
  export const CHAIN_RUNS_DIR = path.join(TEMP_ROOT_DIR, "chain-runs");
63
85
  export const TEMP_ARTIFACTS_DIR = path.join(TEMP_ROOT_DIR, "artifacts");
86
+ export const DIRS = {
87
+ results: RESULTS_DIR,
88
+ async: ASYNC_DIR,
89
+ chain: CHAIN_RUNS_DIR,
90
+ artifacts: TEMP_ARTIFACTS_DIR
91
+ };
64
92
  export const WIDGET_KEY = "subagent-async";
65
93
  export const SLASH_RESULT_TYPE = "subagent-slash-result";
66
94
  export const SLASH_TEXT_RESULT_TYPE = "subagent-slash-text-result";
@@ -70,10 +98,10 @@ export const SLASH_SUBAGENT_RESPONSE_EVENT = "subagent:slash:response";
70
98
  export const SLASH_SUBAGENT_UPDATE_EVENT = "subagent:slash:update";
71
99
  export const SLASH_SUBAGENT_CANCEL_EVENT = "subagent:slash:cancel";
72
100
  export const POLL_INTERVAL_MS = 250;
101
+ export const WIDGET_ANIMATION_INTERVAL_MS = 1000;
73
102
  export const MAX_WIDGET_JOBS = 4;
74
103
  export const DEFAULT_SUBAGENT_MAX_DEPTH = 2;
75
- export const DEFAULT_MAX_SUBAGENT_SPAWNS_PER_SESSION = 40;
76
- export const SUBAGENT_ACTIONS = ["list", "get", "models", "create", "update", "delete", "eject", "disable", "enable", "reset", "status", "interrupt", "resume", "steer", "append-step", "doctor", "schedule", "schedule-list", "schedule-status", "schedule-cancel"];
104
+ export const SUBAGENT_ACTIONS = ["list", "get", "models", "children.list", "guide", "validate", "create", "update", "delete", "eject", "disable", "enable", "reset", "mission.create", "mission.list", "mission.show", "mission.update", "mission.resolve-decision", "mission.attach-run", "mission.close", "worktree.discard", "worktree.cleanup", "lane.status", "lane.recordMerge", "lane.recordSupersession", "refine", "refine.show", "refine.rollback", "inspector.open", "inspector.status", "inspector.close", "project.open", "project.status", "project.close", "status", "debug.run", "grant-spawn-budget", "interrupt", "resume", "steer", "stop", "dismiss", "doctor", "watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model", "schedule.create", "schedule.list", "schedule.show", "schedule.history", "schedule.pause", "schedule.resume", "schedule.run", "schedule.run-due", "schedule.delete"];
77
105
  export const DEFAULT_FORK_PREAMBLE = "You are a delegated subagent running from a fork of the parent session. " + "Treat the inherited conversation as reference-only context, not a live thread to continue. " + "Do not continue or answer prior messages as if they are waiting for a reply. " + "Your sole job is to execute the task below and return a focused result for that task using your tools.";
78
106
  function normalizeTopLevelParallelValue(value) {
79
107
  const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
@@ -137,7 +165,19 @@ export function normalizeMaxSubagentSpawnsPerSession(value) {
137
165
  return normalizeNonNegativeInteger(value);
138
166
  }
139
167
  export function resolveMaxSubagentSpawnsPerSession(configMaxSpawns) {
140
- return normalizeMaxSubagentSpawnsPerSession(process.env.DM_SUBAGENT_MAX_SPAWNS_PER_SESSION) ?? normalizeMaxSubagentSpawnsPerSession(configMaxSpawns) ?? DEFAULT_MAX_SUBAGENT_SPAWNS_PER_SESSION;
168
+ const envMaxSpawns = normalizeMaxSubagentSpawnsPerSession(process.env.DM_SUBAGENT_MAX_SPAWNS_PER_SESSION);
169
+ if (envMaxSpawns !== undefined)
170
+ return envMaxSpawns === 0 ? undefined : envMaxSpawns;
171
+ const configuredMaxSpawns = normalizeMaxSubagentSpawnsPerSession(configMaxSpawns);
172
+ return configuredMaxSpawns === 0 ? undefined : configuredMaxSpawns;
173
+ }
174
+ export const DEFAULT_MAX_SUBAGENT_SPAWNS_PER_RUN = 64;
175
+ export function normalizeMaxSubagentSpawnsPerRun(value) {
176
+ const normalized = normalizeNonNegativeInteger(value);
177
+ return normalized !== undefined && normalized > 0 ? normalized : undefined;
178
+ }
179
+ export function resolveMaxSubagentSpawnsPerRun(configMaxSpawns) {
180
+ return normalizeMaxSubagentSpawnsPerRun(process.env.DM_SUBAGENT_MAX_SPAWNS_PER_RUN) ?? normalizeMaxSubagentSpawnsPerRun(configMaxSpawns) ?? DEFAULT_MAX_SUBAGENT_SPAWNS_PER_RUN;
141
181
  }
142
182
  function formatBytes(bytes) {
143
183
  if (bytes < 1024)
@@ -0,0 +1,12 @@
1
+ export function decodeUtf8Tail(bytes) {
2
+ let start = 0;
3
+ while (start < bytes.length && (bytes[start] & 192) === 128)
4
+ start += 1;
5
+ return bytes.subarray(start).toString("utf-8");
6
+ }
7
+ export function utf8Tail(value, maxBytes) {
8
+ const bytes = Buffer.from(value, "utf-8");
9
+ if (bytes.length <= maxBytes)
10
+ return { text: value, truncated: false };
11
+ return { text: decodeUtf8Tail(bytes.subarray(bytes.length - maxBytes)), truncated: true };
12
+ }