@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,151 @@
1
+ import { THINKING_LEVELS } from "../shared/model-info.js";
2
+ import { buildWatchdogStatus } from "./register-main.js";
3
+ import { parseWatchdogThinkingInput, recommendStrongWatchdogModel, resolveWatchdogModelInput } from "./model-selection.js";
4
+ import { writeWatchdogModelSettings } from "./settings.js";
5
+ function result(text, isError = false) {
6
+ return {
7
+ content: [{ type: "text", text }],
8
+ ...isError ? { isError: true } : {},
9
+ details: { mode: "management", results: [] }
10
+ };
11
+ }
12
+ function messageFromError(error) {
13
+ return error instanceof Error ? error.message : String(error);
14
+ }
15
+ function parseScope(raw) {
16
+ if (raw === undefined || raw === "session")
17
+ return "session";
18
+ if (raw === "user" || raw === "project")
19
+ return raw;
20
+ throw new Error("watchdog.configure scope must be 'session', 'user', or 'project'.");
21
+ }
22
+ function parseTarget(params) {
23
+ const target = params.target ?? "main";
24
+ if (target === "main")
25
+ return { kind: "main" };
26
+ if (target === "children")
27
+ return { kind: "children" };
28
+ if (target === "child") {
29
+ if (!params.agent?.trim())
30
+ throw new Error("watchdog.configure target='child' requires agent.");
31
+ return { kind: "child", agent: params.agent.trim() };
32
+ }
33
+ throw new Error("watchdog.configure target must be 'main', 'children', or 'child'.");
34
+ }
35
+ function parseThinking(raw) {
36
+ if (raw === undefined)
37
+ return;
38
+ if (raw === "inherit")
39
+ return null;
40
+ return parseWatchdogThinkingInput(raw, "watchdog.configure thinking") ?? undefined;
41
+ }
42
+ function resolveConfiguredValue(ctx, params) {
43
+ const thinking = parseThinking(params.thinking);
44
+ const rawModel = params.model?.trim();
45
+ if (!rawModel) {
46
+ if (thinking === undefined)
47
+ throw new Error("watchdog.configure requires model, thinking, or both.");
48
+ return { thinking, description: `thinking ${thinking === null ? "inherit" : thinking === false ? "off" : thinking}` };
49
+ }
50
+ if (rawModel === "inherit")
51
+ return { model: null, thinking: thinking ?? null, description: "inherit" };
52
+ if (rawModel === "recommended") {
53
+ const recommendation = recommendStrongWatchdogModel(ctx);
54
+ return {
55
+ model: recommendation.model,
56
+ thinking: recommendation.thinking,
57
+ description: `${recommendation.model}:${recommendation.thinking}`
58
+ };
59
+ }
60
+ const resolved = resolveWatchdogModelInput(ctx, rawModel);
61
+ return {
62
+ model: resolved.model,
63
+ thinking: resolved.thinking ?? thinking,
64
+ description: `${resolved.model}${resolved.thinking ?? thinking ? `:${resolved.thinking ?? thinking}` : ""}`
65
+ };
66
+ }
67
+ function buildRecommendationText(ctx) {
68
+ const recommendation = recommendStrongWatchdogModel(ctx);
69
+ return [
70
+ "Subagent watchdog recommended model",
71
+ `Recommended: ${recommendation.model}:${recommendation.thinking}`,
72
+ `Reason: ${recommendation.reason}`,
73
+ 'Apply temporarily with subagent({ action: "watchdog.configure", scope: "session", model: "recommended" }).',
74
+ 'Persist with scope: "project" or scope: "user" only when the user asks for that scope.'
75
+ ].join(`
76
+ `);
77
+ }
78
+ function buildCheckText(runtime, ctx) {
79
+ if (!runtime)
80
+ return "Subagent watchdog runtime is unavailable.";
81
+ const snapshot = runtime.getSnapshot(ctx.cwd);
82
+ if (!snapshot.configOk)
83
+ return ["Subagent watchdog config check", "Config errors:", ...snapshot.errors.map((error) => `- ${error.message}`)].join(`
84
+ `);
85
+ const lines = ["Subagent watchdog config check", "Config: ok"];
86
+ if (snapshot.config.main.model) {
87
+ const resolved = resolveWatchdogModelInput(ctx, snapshot.config.main.model);
88
+ lines.push(`Main model: ${resolved.model} auth ok`);
89
+ } else {
90
+ lines.push("Main model: current session");
91
+ }
92
+ lines.push(`LSP diagnostics: ${snapshot.lsp.enabled ? "on" : "off"} · ${snapshot.lsp.status}`);
93
+ try {
94
+ const recommendation = recommendStrongWatchdogModel(ctx);
95
+ lines.push(`Recommended strong watchdog: ${recommendation.model}:${recommendation.thinking}`);
96
+ } catch (error) {
97
+ lines.push(`Recommended strong watchdog unavailable: ${messageFromError(error)}`);
98
+ }
99
+ return lines.join(`
100
+ `);
101
+ }
102
+ export function handleWatchdogToolAction(action, params, ctx, runtime) {
103
+ try {
104
+ if (action === "watchdog.status") {
105
+ if (!runtime)
106
+ return result("Subagent watchdog runtime is unavailable.", true);
107
+ return result(buildWatchdogStatus(runtime.getSnapshot(ctx.cwd), ctx));
108
+ }
109
+ if (action === "watchdog.recommend-model")
110
+ return result(buildRecommendationText(ctx));
111
+ if (action === "watchdog.check")
112
+ return result(buildCheckText(runtime, ctx));
113
+ if (action !== "watchdog.configure")
114
+ return result(`Unknown watchdog action: ${action}`, true);
115
+ const scope = parseScope(params.scope);
116
+ const target = parseTarget(params);
117
+ const value = resolveConfiguredValue(ctx, params);
118
+ if (scope === "session") {
119
+ if (!runtime)
120
+ return result("Subagent watchdog runtime is unavailable.", true);
121
+ if (target.kind !== "main")
122
+ return result("Session-scoped watchdog.configure currently supports target='main' only.", true);
123
+ runtime.setSessionModel({ model: value.model, thinking: value.thinking }, ctx.cwd);
124
+ return result([
125
+ `Subagent watchdog session model configured: ${value.description}.`,
126
+ "No settings files were changed.",
127
+ "",
128
+ buildWatchdogStatus(runtime.getSnapshot(ctx.cwd), ctx)
129
+ ].join(`
130
+ `));
131
+ }
132
+ const settingsPath = writeWatchdogModelSettings({
133
+ scope,
134
+ cwd: ctx.cwd,
135
+ target,
136
+ model: value.model,
137
+ thinking: value.thinking
138
+ });
139
+ runtime?.refreshConfig(ctx.cwd);
140
+ const targetLabel = target.kind === "child" ? `child ${target.agent}` : target.kind;
141
+ return result([
142
+ `Subagent watchdog ${targetLabel} model configured: ${value.description}.`,
143
+ `Updated: ${settingsPath}`
144
+ ].join(`
145
+ `));
146
+ } catch (error) {
147
+ return result(`Subagent watchdog action failed: ${messageFromError(error)}`, true);
148
+ }
149
+ }
150
+ export const WATCHDOG_TOOL_ACTIONS = ["watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model"];
151
+ export const WATCHDOG_THINKING_VALUES = ["inherit", ...THINKING_LEVELS];
@@ -0,0 +1,169 @@
1
+ import { SUBAGENT_WATCHDOG_WARNING_TYPE } from "./types.js";
2
+ function textFromContent(content) {
3
+ if (typeof content === "string")
4
+ return content;
5
+ if (Array.isArray(content)) {
6
+ return content.map((block) => {
7
+ if (typeof block === "string")
8
+ return block;
9
+ if (block && typeof block === "object") {
10
+ const item = block;
11
+ if (item.type === "text" && typeof item.text === "string")
12
+ return item.text;
13
+ if (item.type === "thinking" && typeof item.thinking === "string")
14
+ return ["Thinking:", item.thinking].join(`
15
+ `);
16
+ if (item.type === "toolCall")
17
+ return formatToolCall(item.name, item.input ?? item.args ?? item.arguments);
18
+ if (typeof item.content === "string")
19
+ return item.content;
20
+ }
21
+ return "";
22
+ }).filter(Boolean).join(`
23
+ `);
24
+ }
25
+ if (content === undefined || content === null)
26
+ return "";
27
+ return formatValue(content);
28
+ }
29
+ function formatValue(value, indent = "") {
30
+ if (typeof value === "string")
31
+ return value;
32
+ if (value === undefined)
33
+ return "undefined";
34
+ if (value === null || typeof value === "number" || typeof value === "boolean")
35
+ return JSON.stringify(value);
36
+ if (Array.isArray(value)) {
37
+ return value.map((item) => `${indent}- ${formatValue(item, `${indent} `)}`).join(`
38
+ `);
39
+ }
40
+ if (typeof value === "object") {
41
+ const lines = [];
42
+ for (const [key, item] of Object.entries(value)) {
43
+ if (typeof item === "string" && item.includes(`
44
+ `))
45
+ lines.push(`${indent}${key}:
46
+ ${item}`);
47
+ else
48
+ lines.push(`${indent}${key}: ${formatValue(item, `${indent} `)}`);
49
+ }
50
+ return lines.join(`
51
+ `);
52
+ }
53
+ return String(value);
54
+ }
55
+ function redactEditWriteInput(input) {
56
+ if (Array.isArray(input))
57
+ return input.map(redactEditWriteInput);
58
+ if (!input || typeof input !== "object")
59
+ return input;
60
+ const sanitized = {};
61
+ for (const [key, value] of Object.entries(input)) {
62
+ sanitized[key] = ["oldText", "newText", "content"].includes(key) && typeof value === "string" ? `[omitted ${value.length} chars; use tool result diff]` : redactEditWriteInput(value);
63
+ }
64
+ return sanitized;
65
+ }
66
+ function formatToolArguments(name, input) {
67
+ if (name === "edit" || name === "write")
68
+ return formatValue(redactEditWriteInput(input));
69
+ return formatValue(input);
70
+ }
71
+ function formatToolCall(name, input) {
72
+ const toolName = typeof name === "string" && name ? name : "tool";
73
+ return [`Tool call: ${toolName}`, "Arguments:", formatToolArguments(toolName, input ?? {})].join(`
74
+ `);
75
+ }
76
+ function formatToolResult(name, content, details, error, isError) {
77
+ const failed = isError === true || Boolean(error);
78
+ const lines = [`Tool result: ${name}`];
79
+ if (failed)
80
+ lines.push(`Error: ${error ? typeof error === "string" ? error : formatValue(error) : "tool reported an error"}`);
81
+ if (!failed && details && typeof details === "object" && "diff" in details && typeof details.diff === "string") {
82
+ lines.push("Diff:", details.diff);
83
+ } else {
84
+ const body = textFromContent(content);
85
+ if (body)
86
+ lines.push(failed ? "Output:" : "Result:", body);
87
+ }
88
+ return lines.join(`
89
+ `);
90
+ }
91
+ function messagesFromEvent(event) {
92
+ if (!event || typeof event !== "object")
93
+ return [];
94
+ const input = event;
95
+ if (input.type === "turn_end" || input.event === "turn_end") {
96
+ return [input.message, ...Array.isArray(input.toolResults) ? input.toolResults : []].filter(Boolean);
97
+ }
98
+ if (input.message)
99
+ return [input.message];
100
+ if (input.type === "tool_execution_start" || input.event === "tool_execution_start") {
101
+ return [{ role: "toolCall", name: input.toolName ?? input.name, input: input.args ?? input.input }];
102
+ }
103
+ if (input.type === "tool_execution_end" || input.event === "tool_execution_end") {
104
+ const result = input.result && typeof input.result === "object" && !Array.isArray(input.result) ? input.result : undefined;
105
+ return [{
106
+ role: "toolResult",
107
+ toolName: input.toolName ?? input.name,
108
+ content: result?.content ?? input.content ?? input.result,
109
+ details: result?.details ?? input.details,
110
+ error: input.error,
111
+ isError: input.isError
112
+ }];
113
+ }
114
+ if (input.type === "tool_result" || input.event === "tool_result") {
115
+ return [{ role: "toolResult", toolName: input.toolName ?? input.name, content: input.content, details: input.details, error: input.error, isError: input.isError }];
116
+ }
117
+ return [];
118
+ }
119
+ export function formatWatchdogReviewMessage(message) {
120
+ if (!message || typeof message !== "object")
121
+ return;
122
+ const input = message;
123
+ if (input.role === "custom" && input.customType === SUBAGENT_WATCHDOG_WARNING_TYPE)
124
+ return;
125
+ if (input.role === "assistant") {
126
+ const text = textFromContent(input.content);
127
+ const lines = text ? ["Assistant:", text] : ["Assistant: (no text)"];
128
+ if (input.stopReason === "stop")
129
+ lines.push("Assistant stop: stop");
130
+ return lines.join(`
131
+ `);
132
+ }
133
+ if (input.role === "toolCall")
134
+ return formatToolCall(input.name ?? input.toolName, input.input ?? input.args ?? input.arguments);
135
+ if (input.role === "toolResult" || input.role === "tool") {
136
+ return formatToolResult(input.toolName ?? input.name ?? "tool", input.content, input.details, input.error, input.isError);
137
+ }
138
+ if (input.role === "user") {
139
+ const text = textFromContent(input.content);
140
+ return text ? ["User:", text].join(`
141
+ `) : undefined;
142
+ }
143
+ return;
144
+ }
145
+ export function formatWatchdogTurnDelta(input) {
146
+ const sections = [];
147
+ if (input.includeUserPrompt && input.userPrompt?.trim())
148
+ sections.push(["User prompt:", input.userPrompt].join(`
149
+ `));
150
+ for (const message of input.messages ?? []) {
151
+ const section = formatWatchdogReviewMessage(message);
152
+ if (section)
153
+ sections.push(section);
154
+ }
155
+ for (const event of input.events ?? []) {
156
+ for (const message of messagesFromEvent(event)) {
157
+ const section = formatWatchdogReviewMessage(message);
158
+ if (section)
159
+ sections.push(section);
160
+ }
161
+ }
162
+ if (input.finalAssistantStop)
163
+ sections.push("Final assistant stop: stop without tool call");
164
+ return sections.join(`
165
+
166
+ ---
167
+
168
+ `);
169
+ }
@@ -0,0 +1,29 @@
1
+ export const SUBAGENT_WATCHDOG_WARNING_TYPE = "subagent_watchdog_warning";
2
+ export const WATCHDOG_WARNING_SEVERITIES = ["concern", "blocker"];
3
+ export const WATCHDOG_WARNING_CATEGORIES = [
4
+ "correctness",
5
+ "missed-constraint",
6
+ "test-gap",
7
+ "unsafe-change",
8
+ "scope-drift",
9
+ "stale-fact",
10
+ "loop-risk",
11
+ "other"
12
+ ];
13
+ export const WATCHDOG_WARNING_CONFIDENCES = ["medium", "high"];
14
+ export const WATCHDOG_WARNING_SOURCES = ["main", "child", "async-completion", "lsp"];
15
+ export const WATCHDOG_LSP_DIAGNOSTIC_SEVERITIES = ["error", "warning", "info", "hint"];
16
+ export const WATCHDOG_LSP_STATUSES = ["disabled", "ok", "skipped", "unavailable", "timeout", "failed"];
17
+ export const WATCHDOG_RUNTIME_STATUSES = ["idle", "queued", "reviewing", "waiting-at-agent-end", "stale", "failed"];
18
+ export const WATCHDOG_WARNING_STATES = [
19
+ "candidate",
20
+ "confirmed",
21
+ "displayed",
22
+ "stale",
23
+ "failed",
24
+ "resolved",
25
+ "stalemate",
26
+ "suppressed"
27
+ ];
28
+ export const WATCHDOG_LATE_WARNING_POLICIES = ["show-stale-no-autofollow"];
29
+ export const WATCHDOG_DELIVERY_MODES = ["held"];
@@ -0,0 +1,58 @@
1
+ import {
2
+ SUBAGENT_WATCHDOG_WARNING_TYPE
3
+ } from "./types.js";
4
+ function escapeXmlText(value) {
5
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
6
+ }
7
+ function escapeXmlAttribute(value) {
8
+ return escapeXmlText(value).replace(/"/g, "&quot;");
9
+ }
10
+ function tag(name, value) {
11
+ if (value === undefined)
12
+ return;
13
+ return `<${name}>${escapeXmlText(String(value))}</${name}>`;
14
+ }
15
+ export function normalizeWatchdogWarningDetails(warning, extras = {}) {
16
+ return {
17
+ ...warning,
18
+ category: warning.category ?? extras.category ?? "other",
19
+ source: warning.source ?? extras.source ?? "main",
20
+ ...extras
21
+ };
22
+ }
23
+ export function formatWatchdogWarningContent(warning) {
24
+ const details = normalizeWatchdogWarningDetails(warning);
25
+ const attrs = [
26
+ `severity="${escapeXmlAttribute(details.severity)}"`,
27
+ `category="${escapeXmlAttribute(details.category)}"`,
28
+ `source="${escapeXmlAttribute(details.source)}"`,
29
+ `guidance="weigh, don't blindly obey"`
30
+ ];
31
+ const optionalTags = [
32
+ tag("confidence", details.confidence),
33
+ tag("agent", details.agent),
34
+ tag("run_id", details.runId),
35
+ tag("state", details.state),
36
+ tag("stale", details.stale),
37
+ tag("auto_follow_attempt", details.autoFollowAttempt)
38
+ ];
39
+ return [
40
+ `<subagent_watchdog ${attrs.join(" ")}>`,
41
+ `<summary>${escapeXmlText(details.summary)}</summary>`,
42
+ `<evidence>${escapeXmlText(details.evidence)}</evidence>`,
43
+ `<recommended_action>${escapeXmlText(details.recommendedAction)}</recommended_action>`,
44
+ ...optionalTags.filter((line) => Boolean(line)),
45
+ details.severity === "blocker" ? "<blocker_guidance>If this warning changes the outcome, produce a new self-contained final answer after addressing it.</blocker_guidance>" : undefined,
46
+ "</subagent_watchdog>"
47
+ ].filter((line) => Boolean(line)).join(`
48
+ `);
49
+ }
50
+ export function createWatchdogWarningMessage(warning, options = {}) {
51
+ const details = normalizeWatchdogWarningDetails(warning, options.details);
52
+ return {
53
+ customType: SUBAGENT_WATCHDOG_WARNING_TYPE,
54
+ content: formatWatchdogWarningContent(details),
55
+ display: options.display ?? true,
56
+ details
57
+ };
58
+ }
@@ -0,0 +1,116 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ export const WORKFLOW_CHAT_PROGRESS_MODES = ["auto", "off", "live-card"];
5
+ function git(cwd, args) {
6
+ const result = spawnSync("git", ["-C", cwd, ...args], { encoding: "utf-8", windowsHide: true });
7
+ if (result.status !== 0)
8
+ return;
9
+ const output = result.stdout.trim();
10
+ return output || undefined;
11
+ }
12
+ function realPath(value) {
13
+ try {
14
+ return fs.realpathSync.native(value);
15
+ } catch {
16
+ return path.resolve(value);
17
+ }
18
+ }
19
+ export function resolveGitRepositoryIdentity(cwd) {
20
+ if (git(cwd, ["rev-parse", "--is-inside-work-tree"]) !== "true")
21
+ return;
22
+ const root = git(cwd, ["rev-parse", "--show-toplevel"]);
23
+ const commonDir = git(cwd, ["rev-parse", "--git-common-dir"]);
24
+ if (!root || !commonDir)
25
+ return;
26
+ const commonDirPath = path.isAbsolute(commonDir) ? commonDir : [path.resolve(cwd, commonDir), path.resolve(root, commonDir)].find((candidate) => fs.existsSync(candidate)) ?? path.resolve(root, commonDir);
27
+ return {
28
+ root: realPath(root),
29
+ commonDir: realPath(commonDirPath)
30
+ };
31
+ }
32
+ function isSameGitRepositoryIdentity(left, right) {
33
+ if (!left || !right)
34
+ return false;
35
+ return left.commonDir === right.commonDir || left.root === right.root;
36
+ }
37
+ export function isSameGitRepository(leftCwd, rightCwd) {
38
+ return isSameGitRepositoryIdentity(resolveGitRepositoryIdentity(leftCwd), resolveGitRepositoryIdentity(rightCwd));
39
+ }
40
+ function normalizeRequestedMode(value) {
41
+ if (value === undefined)
42
+ return { mode: "auto" };
43
+ if (typeof value !== "string" || !WORKFLOW_CHAT_PROGRESS_MODES.includes(value)) {
44
+ return { error: `chatProgress must be one of: ${WORKFLOW_CHAT_PROGRESS_MODES.join(", ")}.` };
45
+ }
46
+ return { mode: value };
47
+ }
48
+ export function resolveWorkflowChatProgress(input) {
49
+ const requested = normalizeRequestedMode(input.requested);
50
+ if (requested.error)
51
+ return { error: requested.error };
52
+ const parentIdentity = resolveGitRepositoryIdentity(input.parentCwd);
53
+ const workflowIdentity = resolveGitRepositoryIdentity(input.workflowCwd);
54
+ const sameRepo = !!(parentIdentity && workflowIdentity && (parentIdentity.commonDir === workflowIdentity.commonDir || parentIdentity.root === workflowIdentity.root));
55
+ const repoLabel = workflowIdentity ? path.basename(workflowIdentity.root) : undefined;
56
+ const repoRelation = sameRepo ? "same" : "other";
57
+ const requestedMode = requested.mode ?? "auto";
58
+ let mode;
59
+ if (requestedMode === "auto")
60
+ mode = sameRepo && !input.background ? "live-card" : "off";
61
+ else
62
+ mode = requestedMode;
63
+ if (mode === "live-card" && !sameRepo)
64
+ return { error: "chatProgress: 'live-card' is only available for workflowScript runs in the same Git repository." };
65
+ if (mode === "live-card" && input.background)
66
+ return { error: "chatProgress: 'live-card' is unavailable for async workflowScript. Async workflows have no inline live card; omit chatProgress or use auto/off. Use async:false only when the parent must block." };
67
+ return { projection: { mode, repoRelation, ...repoLabel ? { repoLabel } : {} } };
68
+ }
69
+ function cleanLabel(value) {
70
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
71
+ }
72
+ export function buildWorkflowChatProgressRows(trace, preflight) {
73
+ const rows = new Map;
74
+ for (const lane of preflight?.lanes ?? [])
75
+ rows.set(lane.key, { key: lane.key, state: "planned", preflight: lane });
76
+ for (const entry of trace) {
77
+ if (entry.operation !== "run")
78
+ continue;
79
+ const existing = rows.get(entry.key);
80
+ if (entry.state === "reused") {
81
+ if (existing) {
82
+ const label = cleanLabel(entry.label);
83
+ const phase = cleanLabel(entry.phase);
84
+ if (label)
85
+ existing.label = label;
86
+ if (phase)
87
+ existing.phase = phase;
88
+ }
89
+ continue;
90
+ }
91
+ const next = existing ?? { key: entry.key, state: "running" };
92
+ if (existing?.preflight)
93
+ next.preflight = existing.preflight;
94
+ next.state = entry.state === "completed" ? "complete" : entry.state === "failed" ? "failed" : entry.state === "detached" ? "detached" : entry.state === "stopped" ? "stopped" : "running";
95
+ const label = cleanLabel(entry.label);
96
+ const phase = cleanLabel(entry.phase);
97
+ if (label)
98
+ next.label = label;
99
+ if (phase)
100
+ next.phase = phase;
101
+ if (entry.runId === undefined)
102
+ delete next.runId;
103
+ else
104
+ next.runId = entry.runId;
105
+ if (entry.durationMs === undefined)
106
+ delete next.durationMs;
107
+ else
108
+ next.durationMs = entry.durationMs;
109
+ if (entry.error === undefined)
110
+ delete next.error;
111
+ else
112
+ next.error = entry.error;
113
+ rows.set(entry.key, next);
114
+ }
115
+ return [...rows.values()];
116
+ }