@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
@@ -0,0 +1,54 @@
1
+ import { Container, Spacer, Text } from "@duckmind/dm-tui";
2
+ function titleCase(value) {
3
+ return value.split("-").map((part) => part ? `${part[0]?.toUpperCase()}${part.slice(1)}` : part).join(" ");
4
+ }
5
+ function stateLabels(warning) {
6
+ const labels = [];
7
+ if (warning.state === "displayed")
8
+ labels.push("displayed");
9
+ if (warning.stale || warning.state === "stale")
10
+ labels.push("stale · no auto-follow");
11
+ if (warning.state === "failed")
12
+ labels.push("failed review");
13
+ if (warning.state === "stalemate")
14
+ labels.push("stalemate · auto-follow stopped");
15
+ if (warning.autoFollowAttempt !== undefined)
16
+ labels.push(`auto-follow attempt ${warning.autoFollowAttempt}`);
17
+ return labels;
18
+ }
19
+ export function formatWatchdogWarningRenderText(warning) {
20
+ const labels = stateLabels(warning);
21
+ const subject = warning.severity === "blocker" ? "Blocker" : "Concern";
22
+ const lines = [
23
+ `Subagent watchdog ${subject}${labels.length ? ` (${labels.join(", ")})` : ""}: ${warning.summary}`,
24
+ `Evidence: ${warning.evidence}`,
25
+ `Recommended action: ${warning.recommendedAction}`,
26
+ `Category: ${titleCase(warning.category)} · Source: ${warning.source}${warning.agent ? ` · Agent: ${warning.agent}` : ""}${warning.runId ? ` · Run: ${warning.runId}` : ""}`
27
+ ];
28
+ if (warning.state === "failed" && warning.error)
29
+ lines.push(`Failure: ${warning.error}`);
30
+ if (warning.state === "stalemate" && warning.stalemateRepeats !== undefined) {
31
+ lines.push(`Auto-follow stopped after ${warning.stalemateRepeats} repeated blocker warning${warning.stalemateRepeats === 1 ? "" : "s"}.`);
32
+ }
33
+ if (warning.stale || warning.state === "stale")
34
+ lines.push("This warning arrived after the watchdog catch-up timeout and must not auto-follow.");
35
+ return lines.join(`
36
+ `);
37
+ }
38
+ export function renderWatchdogWarning(warning, options, theme) {
39
+ const text = formatWatchdogWarningRenderText(warning);
40
+ const lines = text.split(`
41
+ `);
42
+ const container = new Container;
43
+ const color = warning.severity === "blocker" ? "error" : "warning";
44
+ const bold = theme.bold ?? ((value) => value);
45
+ container.addChild(new Text(theme.fg(color, bold(lines[0] ?? "Subagent watchdog warning")), 0, 0));
46
+ if (options.expanded) {
47
+ container.addChild(new Spacer(1));
48
+ for (const line of lines.slice(1))
49
+ container.addChild(new Text(theme.fg("dim", line), 0, 0));
50
+ } else if (lines[1]) {
51
+ container.addChild(new Text(theme.fg("dim", ` ⎿ ${lines[1]}`), 0, 0));
52
+ }
53
+ return container;
54
+ }
@@ -0,0 +1,251 @@
1
+ import { Agent } from "@duckmind/dm-agent-core";
2
+ import { createReadOnlyTools, convertToLlm } from "@duckmind/dm-coding-agent";
3
+ import { streamSimple } from "@duckmind/dm-ai/compat";
4
+ import { Type } from "typebox";
5
+ import { resolveModelCandidate } from "../runs/shared/model-fallback.js";
6
+ import { agentStreamOptions } from "../shared/agent-stream-options.js";
7
+ import { resolveEffectiveThinking, splitKnownThinkingSuffix, THINKING_LEVELS, toModelInfo } from "../shared/model-info.js";
8
+ import {
9
+ WATCHDOG_WARNING_CATEGORIES,
10
+ WATCHDOG_WARNING_CONFIDENCES,
11
+ WATCHDOG_WARNING_SEVERITIES
12
+ } from "./types.js";
13
+ const WATCHDOG_ALLOWED_TOOL_NAMES = new Set(["read", "grep", "find", "ls", "watchdog_warn"]);
14
+ const WatchdogWarnParams = Type.Object({
15
+ severity: Type.String({ enum: WATCHDOG_WARNING_SEVERITIES, description: "concern for actionable risk, blocker for a likely wrong or unsafe outcome" }),
16
+ summary: Type.String({ description: "One concise sentence naming the issue." }),
17
+ evidence: Type.String({ description: "Specific evidence from the turn delta or inspected files." }),
18
+ recommendedAction: Type.String({ description: "Specific action the parent should take before accepting or continuing." }),
19
+ category: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CATEGORIES })),
20
+ confidence: Type.Optional(Type.String({ enum: WATCHDOG_WARNING_CONFIDENCES }))
21
+ }, { additionalProperties: false });
22
+ function fullModelId(model) {
23
+ return `${model.provider}/${model.id}`;
24
+ }
25
+ function splitProviderModel(value) {
26
+ const slashIndex = value.indexOf("/");
27
+ if (slashIndex <= 0 || slashIndex === value.length - 1)
28
+ return;
29
+ return { provider: value.slice(0, slashIndex), id: value.slice(slashIndex + 1) };
30
+ }
31
+ function assertThinkingLevel(value, source) {
32
+ if (THINKING_LEVELS.includes(value))
33
+ return value;
34
+ throw new Error(`Unsupported watchdog thinking level '${value}' from ${source}; expected ${THINKING_LEVELS.join(", ")} or false.`);
35
+ }
36
+ function contextThinkingLevel(ctx, currentThinkingLevel) {
37
+ if (currentThinkingLevel)
38
+ return currentThinkingLevel;
39
+ const value = ctx.thinkingLevel;
40
+ return typeof value === "string" && THINKING_LEVELS.includes(value) ? value : undefined;
41
+ }
42
+ function resolveReviewThinking(input) {
43
+ const fromModelOrConfig = resolveEffectiveThinking(input.modelString, input.configThinking);
44
+ if (fromModelOrConfig)
45
+ return assertThinkingLevel(fromModelOrConfig, "watchdog model/config");
46
+ if (input.configThinking === false)
47
+ return "off";
48
+ if (input.configThinking !== undefined)
49
+ return assertThinkingLevel(input.configThinking, "watchdog config");
50
+ if (input.allowContextThinking)
51
+ return contextThinkingLevel(input.ctx, input.currentThinkingLevel) ?? "off";
52
+ return "off";
53
+ }
54
+ function resolveConfiguredModel(ctx, rawModel) {
55
+ const availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);
56
+ const preferredProvider = typeof ctx.model?.provider === "string" ? ctx.model.provider : undefined;
57
+ const resolved = resolveModelCandidate(rawModel, availableModels, preferredProvider);
58
+ if (!resolved) {
59
+ throw new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);
60
+ }
61
+ const { baseModel } = splitKnownThinkingSuffix(resolved);
62
+ const named = splitProviderModel(baseModel);
63
+ if (!named) {
64
+ throw new Error(`Configured watchdog model '${rawModel}' did not match exactly one authenticated available model. Use provider/model or configure credentials for the intended provider.`);
65
+ }
66
+ const model = ctx.modelRegistry.find(named.provider, named.id);
67
+ if (!model)
68
+ throw new Error(`Configured watchdog model '${rawModel}' was not found as '${baseModel}'.`);
69
+ if (!ctx.modelRegistry.hasConfiguredAuth(model)) {
70
+ throw new Error(`Configured watchdog model '${baseModel}' is not authenticated. Configure credentials for provider '${named.provider}' or choose an authenticated model.`);
71
+ }
72
+ return { model, modelString: resolved };
73
+ }
74
+ async function resolveReviewAuth(ctx, model) {
75
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
76
+ if (auth.ok === false)
77
+ throw new Error(`Watchdog model auth failed for ${fullModelId(model)}: ${auth.error}`);
78
+ return {
79
+ ...auth.apiKey ? { apiKey: auth.apiKey } : {},
80
+ ...auth.headers ? { headers: auth.headers } : {},
81
+ ...auth.env ? { env: auth.env } : {}
82
+ };
83
+ }
84
+ export async function resolveWatchdogReviewModel(ctx, config, options = {}) {
85
+ if (config.main.model) {
86
+ const resolved = resolveConfiguredModel(ctx, config.main.model);
87
+ return {
88
+ model: resolved.model,
89
+ thinkingLevel: resolveReviewThinking({
90
+ modelString: resolved.modelString,
91
+ configThinking: config.main.thinking,
92
+ ctx,
93
+ allowContextThinking: false,
94
+ currentThinkingLevel: options.currentThinkingLevel
95
+ }),
96
+ auth: await resolveReviewAuth(ctx, resolved.model),
97
+ explicit: true
98
+ };
99
+ }
100
+ const currentModel = ctx.model;
101
+ if (!currentModel) {
102
+ throw new Error("Main watchdog review cannot run because the current DM session model is unavailable and subagents.watchdog.main.model is not configured.");
103
+ }
104
+ return {
105
+ model: currentModel,
106
+ thinkingLevel: resolveReviewThinking({
107
+ modelString: fullModelId(currentModel),
108
+ configThinking: config.main.thinking,
109
+ ctx,
110
+ allowContextThinking: true,
111
+ currentThinkingLevel: options.currentThinkingLevel
112
+ }),
113
+ auth: await resolveReviewAuth(ctx, currentModel),
114
+ explicit: false
115
+ };
116
+ }
117
+ function nonEmptyString(value, field) {
118
+ const trimmed = value.trim();
119
+ if (!trimmed)
120
+ throw new Error(`watchdog_warn.${field} must be a non-empty string.`);
121
+ return trimmed;
122
+ }
123
+ function toWatchdogWarning(params) {
124
+ return {
125
+ severity: params.severity,
126
+ category: params.category ?? "other",
127
+ confidence: params.confidence ?? "medium",
128
+ source: "main",
129
+ summary: nonEmptyString(params.summary, "summary"),
130
+ evidence: nonEmptyString(params.evidence, "evidence"),
131
+ recommendedAction: nonEmptyString(params.recommendedAction, "recommendedAction")
132
+ };
133
+ }
134
+ function createWatchdogWarnTool(request) {
135
+ return {
136
+ name: "watchdog_warn",
137
+ label: "Watchdog warning",
138
+ description: [
139
+ "Emit one actionable main-session watchdog warning.",
140
+ "Use only for medium/high confidence concerns or blockers that the parent should consider before accepting the work.",
141
+ "Do not use for nits, praise, informational notes, or clean reviews."
142
+ ].join(" "),
143
+ parameters: WatchdogWarnParams,
144
+ executionMode: "sequential",
145
+ async execute(_toolCallId, params) {
146
+ const warning = toWatchdogWarning(params);
147
+ const accepted = request.emitWarning(warning);
148
+ return {
149
+ content: [{
150
+ type: "text",
151
+ text: accepted ? "Watchdog warning recorded." : "Watchdog warning was ignored by the runtime guard because it was stale, duplicate, or over budget."
152
+ }],
153
+ details: { accepted }
154
+ };
155
+ }
156
+ };
157
+ }
158
+ function buildWatchdogSystemPrompt(ctx, options = {}) {
159
+ return [
160
+ "You are the main-session subagent watchdog for DM.",
161
+ `Working directory: ${ctx.cwd}`,
162
+ "Review only the supplied parent turn delta. Inspect repository files only when needed to verify a concrete concern.",
163
+ options.hasScope ? "When the review input includes a Current scope block, treat newer scope prompts as superseding/mutating older prompts and use category='scope-drift' for work that serves no current scope item." : undefined,
164
+ "You are read-only. You may use read, grep, find, and ls. Do not edit files, run shell commands, spawn agents, or mutate state.",
165
+ "Emit warnings only by calling watchdog_warn. Freeform assistant text is ignored and must not be used to report warnings.",
166
+ "Emit only medium/high confidence actionable concerns or blockers: missed user constraints, correctness risks, test gaps that matter, unsafe changes, stale facts, loop risks, or scope drift.",
167
+ "Do not emit nits, style preferences, low-confidence guesses, informational notes, praise, or summaries.",
168
+ "If the turn is clean, call no tools and end normally.",
169
+ "Use severity='blocker' only when the issue should stop acceptance until addressed; otherwise use severity='concern'."
170
+ ].filter((line) => Boolean(line)).join(`
171
+ `);
172
+ }
173
+ function buildReviewPrompt(request, selection) {
174
+ return [
175
+ "Review this parent-session turn delta for subagent-watchdog-worthy issues.",
176
+ `Review id: ${request.reviewId}; epoch: ${request.epoch}; review model: ${fullModelId(selection.model)}; thinking: ${selection.thinkingLevel}.`,
177
+ "Call watchdog_warn for each qualifying concern or blocker. Call no tools when clean.",
178
+ "<turn_delta>",
179
+ request.delta,
180
+ "</turn_delta>"
181
+ ].join(`
182
+
183
+ `);
184
+ }
185
+ function finalStopReason(agent) {
186
+ for (let index = agent.state.messages.length - 1;index >= 0; index--) {
187
+ const message = agent.state.messages[index];
188
+ if (message && typeof message === "object" && message.role === "assistant") {
189
+ const stopReason = message.stopReason;
190
+ if (stopReason === "error" || stopReason === "aborted" || stopReason === "length")
191
+ return stopReason;
192
+ return "stop";
193
+ }
194
+ }
195
+ return "stop";
196
+ }
197
+ function resolveContext(provider) {
198
+ return typeof provider === "function" ? provider() : provider;
199
+ }
200
+ export function createMainWatchdogReview(provider, options = {}) {
201
+ return async (request) => {
202
+ const ctx = resolveContext(provider);
203
+ if (!ctx)
204
+ throw new Error("Main watchdog review cannot run without an active DM extension context.");
205
+ if (ctx.signal?.aborted || request.signal?.aborted)
206
+ return { stopReason: "aborted" };
207
+ const selection = await resolveWatchdogReviewModel(ctx, request.config, {
208
+ currentThinkingLevel: options.getThinkingLevel?.()
209
+ });
210
+ if (ctx.signal?.aborted || request.signal?.aborted)
211
+ return { stopReason: "aborted" };
212
+ const auth = selection.auth;
213
+ const registeredProvider = ctx.modelRegistry.getRegisteredProviderConfig?.(selection.model.provider);
214
+ const baseStreamFn = options.streamFn ?? (registeredProvider?.streamSimple && registeredProvider.api === selection.model.api ? registeredProvider.streamSimple : streamSimple);
215
+ const streamFn = (model, context, streamOptions) => baseStreamFn(model, context, {
216
+ ...streamOptions,
217
+ ...auth.apiKey ? { apiKey: auth.apiKey } : {},
218
+ env: auth.env || streamOptions?.env ? { ...auth.env ?? {}, ...streamOptions?.env ?? {} } : undefined,
219
+ headers: { ...streamOptions?.headers ?? {}, ...auth.headers ?? {} }
220
+ });
221
+ const tools = [
222
+ ...(options.createReadOnlyTools ?? createReadOnlyTools)(ctx.cwd).filter((tool) => WATCHDOG_ALLOWED_TOOL_NAMES.has(tool.name) && tool.name !== "watchdog_warn"),
223
+ createWatchdogWarnTool(request)
224
+ ];
225
+ const agent = new Agent({
226
+ initialState: {
227
+ systemPrompt: buildWatchdogSystemPrompt(ctx, { hasScope: request.hasScope }),
228
+ model: selection.model,
229
+ thinkingLevel: selection.thinkingLevel,
230
+ tools
231
+ },
232
+ convertToLlm,
233
+ ...agentStreamOptions(streamFn),
234
+ getApiKey: (providerName) => providerName === selection.model.provider ? auth.apiKey : undefined,
235
+ beforeToolCall: async ({ toolCall }) => WATCHDOG_ALLOWED_TOOL_NAMES.has(toolCall.name) ? undefined : { block: true, reason: `Watchdog reviews are read-only; tool '${toolCall.name}' is not allowed.` },
236
+ toolExecution: "sequential"
237
+ });
238
+ const abort = () => agent.abort();
239
+ ctx.signal?.addEventListener("abort", abort, { once: true });
240
+ request.signal?.addEventListener("abort", abort, { once: true });
241
+ try {
242
+ if (ctx.signal?.aborted || request.signal?.aborted)
243
+ return { stopReason: "aborted" };
244
+ await agent.prompt(buildReviewPrompt(request, selection));
245
+ } finally {
246
+ ctx.signal?.removeEventListener("abort", abort);
247
+ request.signal?.removeEventListener("abort", abort);
248
+ }
249
+ return { stopReason: finalStopReason(agent) };
250
+ };
251
+ }