@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,3 +1,5 @@
1
+ import { previewSimpleWorkflowRun } from "../workflows/scripted-workflow.js";
2
+ import { deriveChildSessionName } from "../shared/child-session-name.js";
1
3
  import { SLASH_RESULT_TYPE } from "../shared/types.js";
2
4
  const liveSnapshots = new Map;
3
5
  const finalSnapshots = new Map;
@@ -18,15 +20,19 @@ function cloneUsage() {
18
20
  return { ...EMPTY_USAGE };
19
21
  }
20
22
  function createPlaceholderResult(agent, task, status, index) {
23
+ const sessionName = deriveChildSessionName({ agent, task });
21
24
  return {
22
25
  agent,
23
26
  task,
27
+ ...sessionName ? { sessionName } : {},
28
+ index,
24
29
  exitCode: 0,
25
30
  messages: EMPTY_MESSAGES,
26
31
  usage: cloneUsage(),
27
32
  progress: {
28
- ...index !== undefined ? { index } : {},
33
+ index,
29
34
  agent,
35
+ ...sessionName ? { sessionName } : {},
30
36
  status,
31
37
  task,
32
38
  recentTools: [],
@@ -45,19 +51,24 @@ function buildParallelInitialResult(params) {
45
51
  `) }],
46
52
  details: {
47
53
  mode: "parallel",
48
- ...params.context ? { context: params.context } : {},
54
+ ...params.async ? { background: true } : {},
55
+ ...params.context === "fresh" || params.context === "fork" ? { context: params.context } : {},
49
56
  results: tasks.map((task, index) => createPlaceholderResult(task.agent, task.task, "running", index)),
50
- progress: tasks.map((task, index) => ({
51
- index,
52
- agent: task.agent,
53
- status: "running",
54
- task: task.task,
55
- recentTools: [],
56
- recentOutput: [],
57
- toolCount: 0,
58
- tokens: 0,
59
- durationMs: 0
60
- }))
57
+ progress: tasks.map((task, index) => {
58
+ const sessionName = deriveChildSessionName({ agent: task.agent, task: task.task });
59
+ return {
60
+ index,
61
+ agent: task.agent,
62
+ ...sessionName ? { sessionName } : {},
63
+ status: "running",
64
+ task: task.task,
65
+ recentTools: [],
66
+ recentOutput: [],
67
+ toolCount: 0,
68
+ tokens: 0,
69
+ durationMs: 0
70
+ };
71
+ })
61
72
  }
62
73
  };
63
74
  }
@@ -99,11 +110,13 @@ ${result.task}`).join(`
99
110
  }],
100
111
  details: {
101
112
  mode: "chain",
102
- ...params.context ? { context: params.context } : {},
113
+ ...params.async ? { background: true } : {},
114
+ ...params.context === "fresh" || params.context === "fork" ? { context: params.context } : {},
103
115
  results,
104
116
  progress: results.map((result, index) => ({
105
117
  index,
106
118
  agent: result.agent,
119
+ ...result.sessionName ? { sessionName: result.sessionName } : {},
107
120
  status: index === 0 ? "running" : "pending",
108
121
  task: result.task,
109
122
  recentTools: [],
@@ -119,16 +132,21 @@ ${result.task}`).join(`
119
132
  };
120
133
  }
121
134
  function buildSingleInitialResult(params) {
122
- const agent = params.agent ?? "subagent";
123
- const task = params.task ?? "";
135
+ const preview = previewSimpleWorkflowRun(params.workflowScript) ?? {};
136
+ const agent = params.agent ?? preview.agent ?? "subagent";
137
+ const task = params.task ?? preview.task ?? "";
138
+ const sessionName = deriveChildSessionName({ agent, task });
124
139
  return {
125
140
  content: [{ type: "text", text: task }],
126
141
  details: {
127
142
  mode: "single",
128
- ...params.context ? { context: params.context } : {},
129
- results: [createPlaceholderResult(agent, task, "running")],
143
+ ...params.async ? { background: true } : {},
144
+ ...params.context === "fresh" || params.context === "fork" ? { context: params.context } : {},
145
+ results: [createPlaceholderResult(agent, task, "running", 0)],
130
146
  progress: [{
147
+ index: 0,
131
148
  agent,
149
+ ...sessionName ? { sessionName } : {},
132
150
  status: "running",
133
151
  task,
134
152
  recentTools: [],
@@ -148,7 +166,7 @@ export function buildSlashInitialResult(requestId, params) {
148
166
  }
149
167
  function cloneResultsWithProgress(results, progress) {
150
168
  return results.map((result, index) => {
151
- const nextProgress = progress?.find((entry) => entry.index === index) ?? progress?.[index] ?? result.progress;
169
+ const nextProgress = progress?.find((entry) => entry.index === index || entry.index === undefined && entry.agent === result.agent) ?? result.progress;
152
170
  return nextProgress ? { ...result, progress: nextProgress } : result;
153
171
  });
154
172
  }
@@ -0,0 +1,410 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import {
4
+ agentHasFrontmatterField,
5
+ discoverAgentsAll,
6
+ EXTRA_AGENT_DIRS_ENV,
7
+ frontmatterNameForConfig,
8
+ mergeBuiltinAgentOverride,
9
+ removeBuiltinAgentOverrideFields
10
+ } from "../agents/agents.js";
11
+ import { serializeAgent } from "../agents/agent-serializer.js";
12
+ import { editableAgentConfig, preservedAgentFrontmatterFields } from "../agents/agent-management.js";
13
+ import { findModelInfo, getSupportedThinkingLevels, toModelInfo } from "../shared/model-info.js";
14
+ import { SelectorComponent } from "./selector.js";
15
+ const ADMIN_MESSAGE_TYPE = "subagents-admin";
16
+ const INHERIT_MODEL_CHOICE = "Default / inherit session model";
17
+ const INHERIT_THINKING_CHOICE = "Default / inherit session thinking";
18
+ function sourceRank(source) {
19
+ if (source === "project")
20
+ return 0;
21
+ if (source === "user")
22
+ return 1;
23
+ if (source === "package")
24
+ return 2;
25
+ return 3;
26
+ }
27
+ function allVisibleAgents(cwd) {
28
+ const d = discoverAgentsAll(cwd);
29
+ return [...d.project, ...d.user, ...d.package, ...d.builtin].filter((agent) => !agent.disabled).sort((a, b) => a.name.localeCompare(b.name) || sourceRank(a.source) - sourceRank(b.source));
30
+ }
31
+ function agentLabel(agent) {
32
+ const model = agent.model ? ` · ${agent.model}` : "";
33
+ return `${agent.name} [${agent.source}]${model} — ${agent.description}`;
34
+ }
35
+ function agentChoices(agents) {
36
+ const labels = agents.map(agentLabel);
37
+ const counts = new Map;
38
+ for (const label of labels)
39
+ counts.set(label, (counts.get(label) ?? 0) + 1);
40
+ return new Map(agents.map((agent, index) => {
41
+ const label = labels[index];
42
+ return [counts.get(label) === 1 ? label : `${label} · ${agent.filePath}`, agent];
43
+ }));
44
+ }
45
+ function agentSelectItems(byLabel) {
46
+ return [...byLabel.keys()].map((label) => ({ value: label, label }));
47
+ }
48
+ function agentMatches(agent, rawName) {
49
+ const name = rawName.trim();
50
+ return agent.name === name || frontmatterNameForConfig(agent) === name;
51
+ }
52
+ function sendAdminMessage(dm, content) {
53
+ dm.sendMessage({
54
+ customType: ADMIN_MESSAGE_TYPE,
55
+ content,
56
+ display: true
57
+ });
58
+ }
59
+ function modelFullId(model) {
60
+ return `${model.provider}/${model.id}`;
61
+ }
62
+ function liveAvailableModels(ctx) {
63
+ try {
64
+ ctx.modelRegistry.refresh?.();
65
+ } catch (error) {
66
+ const message = error instanceof Error ? error.message : String(error);
67
+ ctx.ui.notify(`Could not refresh the model registry; using the last loaded choices. ${message}`, "warning");
68
+ }
69
+ return ctx.modelRegistry.getAvailable();
70
+ }
71
+ function buildBuiltinBase(agent) {
72
+ return {
73
+ ...agent.model !== undefined ? { model: agent.model } : {},
74
+ ...agent.fallbackModels !== undefined ? { fallbackModels: [...agent.fallbackModels] } : {},
75
+ ...agent.thinking !== undefined ? { thinking: agent.thinking } : {},
76
+ systemPromptMode: agent.systemPromptMode,
77
+ inheritProjectContext: agent.inheritProjectContext,
78
+ inheritGlobalContext: agent.inheritGlobalContext,
79
+ inheritSkills: agent.inheritSkills,
80
+ ...agent.defaultContext !== undefined ? { defaultContext: agent.defaultContext } : {},
81
+ ...agent.acceptanceRole !== undefined ? { acceptanceRole: agent.acceptanceRole } : {},
82
+ ...agent.disabled !== undefined ? { disabled: agent.disabled } : {},
83
+ systemPrompt: agent.systemPrompt,
84
+ ...agent.skills !== undefined ? { skills: [...agent.skills] } : {},
85
+ ...agent.tools !== undefined ? { tools: [...agent.tools] } : {},
86
+ ...agent.mcpDirectTools !== undefined ? { mcpDirectTools: [...agent.mcpDirectTools] } : {},
87
+ ...agent.subagentOnlyExtensions !== undefined ? { subagentOnlyExtensions: [...agent.subagentOnlyExtensions] } : {},
88
+ ...agent.mutationTools !== undefined ? { mutationTools: [...agent.mutationTools] } : {},
89
+ ...agent.completionGuard !== undefined ? { completionGuard: agent.completionGuard } : {},
90
+ ...agent.toolBudget !== undefined ? { toolBudget: agent.toolBudget } : {}
91
+ };
92
+ }
93
+ function savesThroughSettings(agent, field) {
94
+ if (agent.source === "builtin")
95
+ return true;
96
+ if (agent.source === "package") {
97
+ if (field === "systemPrompt")
98
+ return false;
99
+ return !agentHasFrontmatterField(agent, field);
100
+ }
101
+ if (!agent.override)
102
+ return false;
103
+ if (agent.source !== agent.override.scope)
104
+ return false;
105
+ return agent[field] !== agent.override.base[field];
106
+ }
107
+ function isReadOnlyExtraAgent(agent) {
108
+ const configured = process.env[EXTRA_AGENT_DIRS_ENV];
109
+ if (!configured || agent.source !== "user")
110
+ return false;
111
+ const filePath = path.resolve(agent.filePath);
112
+ return configured.split(path.delimiter).map((dir) => dir.trim()).filter(Boolean).some((dir) => {
113
+ const root = path.resolve(dir);
114
+ const relative = path.relative(root, filePath);
115
+ return relative !== "" && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
116
+ });
117
+ }
118
+ function readOnlyAgentMessage(agent, field) {
119
+ if (agent.source === "package") {
120
+ return `Cannot update '${agent.name}' ${field} because that field is owned by its read-only package definition.`;
121
+ }
122
+ return isReadOnlyExtraAgent(agent) ? `Cannot update '${agent.name}' because its definition in DM_SUBAGENT_EXTRA_AGENT_DIRS is read-only.` : undefined;
123
+ }
124
+ async function selectAgent(ctx, args) {
125
+ const agents = allVisibleAgents(ctx.cwd);
126
+ const requestedName = args.trim().split(/\s+/)[0] ?? "";
127
+ if (agents.length === 0)
128
+ return { kind: "not-found", agents, requestedName: requestedName || undefined };
129
+ if (requestedName) {
130
+ const matches = agents.filter((agent) => agentMatches(agent, requestedName));
131
+ if (matches.length === 1)
132
+ return { kind: "selected", agent: matches[0] };
133
+ if (matches.length > 1 && !ctx.hasUI)
134
+ return { kind: "ambiguous", requestedName, matches };
135
+ if (matches.length > 1) {
136
+ const byLabel = agentChoices(matches);
137
+ const choice = await selectFromList(ctx, `Multiple subagents named '${requestedName}'`, undefined, agentSelectItems(byLabel));
138
+ return choice ? { kind: "selected", agent: byLabel.get(choice) } : { kind: "cancelled" };
139
+ }
140
+ return { kind: "not-found", agents, requestedName };
141
+ }
142
+ if (!ctx.hasUI)
143
+ return { kind: "not-found", agents };
144
+ const byLabel = agentChoices(agents);
145
+ const choice = await selectFromList(ctx, "Select subagent", undefined, agentSelectItems(byLabel));
146
+ return choice ? { kind: "selected", agent: byLabel.get(choice) } : { kind: "cancelled" };
147
+ }
148
+ function metadataFor(agent) {
149
+ const tools = [...agent.tools ?? [], ...(agent.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`)];
150
+ const lines = [
151
+ `Agent: ${agent.name} (${agent.source})`,
152
+ `Path: ${agent.filePath}`,
153
+ `Description: ${agent.description}`
154
+ ];
155
+ if (agent.packageName) {
156
+ lines.push(`Local name: ${frontmatterNameForConfig(agent)}`);
157
+ lines.push(`Package: ${agent.packageName}`);
158
+ }
159
+ lines.push(`Model: ${agent.model ?? "default / inherit"}`);
160
+ if (agent.fallbackModels?.length)
161
+ lines.push(`Fallback models: ${agent.fallbackModels.join(", ")}`);
162
+ if (agent.thinking !== undefined)
163
+ lines.push(`Thinking: ${agent.thinking === false ? "off" : agent.thinking}`);
164
+ if (tools.length)
165
+ lines.push(`Tools: ${tools.join(", ")}`);
166
+ if (agent.skills?.length)
167
+ lines.push(`Skills: ${agent.skills.join(", ")}`);
168
+ lines.push(`System prompt mode: ${agent.systemPromptMode}`);
169
+ lines.push(`Inherit project context: ${agent.inheritProjectContext ? "true" : "false"}`);
170
+ lines.push(`Inherit global context: ${agent.inheritGlobalContext ? "true" : "false"}`);
171
+ lines.push(`Inherit skills: ${agent.inheritSkills ? "true" : "false"}`);
172
+ if (agent.defaultContext)
173
+ lines.push(`Default context: ${agent.defaultContext}`);
174
+ if (agent.output)
175
+ lines.push(`Output: ${agent.output}`);
176
+ if (agent.defaultReads?.length)
177
+ lines.push(`Reads: ${agent.defaultReads.join(", ")}`);
178
+ if (agent.defaultProgress)
179
+ lines.push("Progress: true");
180
+ if (agent.maxSubagentDepth !== undefined)
181
+ lines.push(`Max subagent depth: ${agent.maxSubagentDepth}`);
182
+ if (agent.source === "builtin")
183
+ lines.push(`Disabled: ${agent.disabled ? "true" : "false"}`);
184
+ if (agent.override)
185
+ lines.push(`Override: ${agent.override.scope} (${agent.override.path})`);
186
+ if (agent.systemPrompt.trim())
187
+ lines.push("", "System Prompt:", agent.systemPrompt);
188
+ return lines.join(`
189
+ `);
190
+ }
191
+ async function selectFromList(ctx, title, subtitle, items) {
192
+ if (typeof ctx.ui.custom === "function") {
193
+ const result = await ctx.ui.custom((tui, theme, kb, done) => new SelectorComponent(tui, theme, kb, { title, subtitle, items, done }), { overlay: false });
194
+ return result?.confirmed ? result.value : undefined;
195
+ }
196
+ const flatTitle = subtitle ? `${title}
197
+ Current: ${subtitle}` : title;
198
+ const labelToValue = new Map(items.map((item) => [item.label, item.value]));
199
+ const choice = await ctx.ui.select(flatTitle, items.map((item) => item.value));
200
+ return choice ? items.find((item) => item.value === choice)?.value ?? labelToValue.get(choice) : undefined;
201
+ }
202
+ async function chooseModel(ctx, agent) {
203
+ const models = liveAvailableModels(ctx);
204
+ const current = agent.model ?? INHERIT_MODEL_CHOICE;
205
+ const items = [{ value: INHERIT_MODEL_CHOICE, label: INHERIT_MODEL_CHOICE, current: !agent.model }];
206
+ if (agent.model && !models.some((model) => modelFullId(model) === agent.model)) {
207
+ items.push({ value: agent.model, label: agent.model, current: true });
208
+ }
209
+ for (const model of models) {
210
+ const fullId = modelFullId(model);
211
+ items.push({ value: fullId, label: model.id, badge: model.provider, current: fullId === agent.model });
212
+ }
213
+ const choice = await selectFromList(ctx, `Select model for ${agent.name}`, current, items);
214
+ if (choice === undefined)
215
+ return null;
216
+ return choice === INHERIT_MODEL_CHOICE ? undefined : choice;
217
+ }
218
+ async function chooseThinking(ctx, agent) {
219
+ const availableModels = liveAvailableModels(ctx).map(toModelInfo);
220
+ const effectiveModel = agent.model ?? (ctx.model ? modelFullId(ctx.model) : undefined);
221
+ const modelInfo = findModelInfo(effectiveModel, availableModels, ctx.model?.provider);
222
+ const levels = getSupportedThinkingLevels(modelInfo);
223
+ const current = agent.thinking === false ? "off" : agent.thinking ?? INHERIT_THINKING_CHOICE;
224
+ const values = [INHERIT_THINKING_CHOICE, ...levels];
225
+ if (current !== INHERIT_THINKING_CHOICE && !values.includes(current))
226
+ values.splice(1, 0, current);
227
+ const modelNote = agent.model ? `Model: ${agent.model}` : effectiveModel ? `Session model: ${effectiveModel}` : "Model: default / inherit";
228
+ const items = values.map((value) => ({ value, label: value, current: value === current }));
229
+ const choice = await selectFromList(ctx, `Select thinking level for ${agent.name}`, `${modelNote} · ${current}`, items);
230
+ if (choice === undefined)
231
+ return null;
232
+ return choice === INHERIT_THINKING_CHOICE ? undefined : choice;
233
+ }
234
+ async function chooseOverrideScope(ctx, agent) {
235
+ if (agent.override?.scope)
236
+ return agent.override.scope;
237
+ const d = discoverAgentsAll(ctx.cwd);
238
+ if (!d.projectSettingsPath || !ctx.hasUI)
239
+ return "user";
240
+ const choice = await ctx.ui.select(`Save builtin override for ${agent.name}`, ["user", "project"]);
241
+ return choice === "user" || choice === "project" ? choice : undefined;
242
+ }
243
+ function persistSettingsField(ctx, agent, scope, field, value) {
244
+ const base = agent.override?.base ?? buildBuiltinBase(agent);
245
+ if (value === undefined || value === base[field]) {
246
+ return {
247
+ filePath: removeBuiltinAgentOverrideFields(ctx.cwd, agent.name, scope, [field]).path,
248
+ overridden: false
249
+ };
250
+ }
251
+ return {
252
+ filePath: mergeBuiltinAgentOverride(ctx.cwd, agent.name, scope, { [field]: value }),
253
+ overridden: true
254
+ };
255
+ }
256
+ async function saveAgentModel(ctx, agent, selectedModel) {
257
+ if (savesThroughSettings(agent, "model")) {
258
+ const scope = await chooseOverrideScope(ctx, agent);
259
+ if (!scope)
260
+ return null;
261
+ const { filePath, overridden } = persistSettingsField(ctx, agent, scope, "model", selectedModel);
262
+ return overridden ? `Saved ${scope} settings override for '${agent.name}' with model '${selectedModel}' in ${filePath}.` : `Cleared model settings override for '${agent.name}' in ${filePath}.`;
263
+ }
264
+ const readOnlyMessage = readOnlyAgentMessage(agent, "model");
265
+ if (readOnlyMessage)
266
+ return readOnlyMessage;
267
+ const updated = editableAgentConfig(agent);
268
+ if (selectedModel === undefined)
269
+ delete updated.model;
270
+ else
271
+ updated.model = selectedModel;
272
+ fs.writeFileSync(updated.filePath, serializeAgent(updated, {
273
+ preserveFrontmatterFields: preservedAgentFrontmatterFields(agent, { model: selectedModel })
274
+ }), "utf-8");
275
+ return selectedModel ? `Updated '${agent.name}' model to '${selectedModel}' in ${updated.filePath}.` : `Cleared '${agent.name}' model in ${updated.filePath}.`;
276
+ }
277
+ async function saveAgentThinking(ctx, agent, selectedThinking) {
278
+ if (savesThroughSettings(agent, "thinking")) {
279
+ const scope = await chooseOverrideScope(ctx, agent);
280
+ if (!scope)
281
+ return null;
282
+ const { filePath, overridden } = persistSettingsField(ctx, agent, scope, "thinking", selectedThinking);
283
+ return overridden ? `Saved ${scope} settings override for '${agent.name}' with thinking '${selectedThinking}' in ${filePath}.` : `Cleared thinking settings override for '${agent.name}' in ${filePath}.`;
284
+ }
285
+ const readOnlyMessage = readOnlyAgentMessage(agent, "thinking");
286
+ if (readOnlyMessage)
287
+ return readOnlyMessage;
288
+ const updated = editableAgentConfig(agent);
289
+ if (selectedThinking === undefined)
290
+ delete updated.thinking;
291
+ else
292
+ updated.thinking = selectedThinking;
293
+ fs.writeFileSync(updated.filePath, serializeAgent(updated, {
294
+ preserveFrontmatterFields: preservedAgentFrontmatterFields(agent, { thinking: selectedThinking })
295
+ }), "utf-8");
296
+ return selectedThinking ? `Updated '${agent.name}' thinking to '${selectedThinking}' in ${updated.filePath}.` : `Cleared '${agent.name}' thinking in ${updated.filePath}.`;
297
+ }
298
+ function metadataSummary(agent) {
299
+ return [
300
+ `Source: ${agent.source}`,
301
+ `Model: ${agent.model ?? "default / inherit"}`,
302
+ `Thinking: ${agent.thinking === false ? "off" : agent.thinking ?? "default / inherit"}`
303
+ ].join(" · ");
304
+ }
305
+ async function saveAgentSystemPrompt(ctx, agent, systemPrompt) {
306
+ const nextPrompt = systemPrompt.replace(/\s+$/, "");
307
+ if (savesThroughSettings(agent, "systemPrompt")) {
308
+ const scope = await chooseOverrideScope(ctx, agent);
309
+ if (!scope)
310
+ return null;
311
+ const { filePath, overridden } = persistSettingsField(ctx, agent, scope, "systemPrompt", nextPrompt);
312
+ return overridden ? `Saved ${scope} settings override for '${agent.name}' system prompt in ${filePath}.` : `Cleared system prompt settings override for '${agent.name}' in ${filePath}.`;
313
+ }
314
+ const readOnlyMessage = readOnlyAgentMessage(agent, "systemPrompt");
315
+ if (readOnlyMessage)
316
+ return readOnlyMessage;
317
+ const updated = { ...editableAgentConfig(agent), systemPrompt: nextPrompt };
318
+ fs.writeFileSync(updated.filePath, serializeAgent(updated, {
319
+ preserveFrontmatterFields: preservedAgentFrontmatterFields(agent, { systemPrompt: nextPrompt })
320
+ }), "utf-8");
321
+ return `Updated '${agent.name}' system prompt in ${updated.filePath}.`;
322
+ }
323
+ async function editSystemPrompt(ctx, agent) {
324
+ if (!savesThroughSettings(agent, "systemPrompt")) {
325
+ const readOnlyMessage = readOnlyAgentMessage(agent, "systemPrompt");
326
+ if (readOnlyMessage)
327
+ return readOnlyMessage;
328
+ }
329
+ const edited = await ctx.ui.editor(`Edit '${agent.name}' system prompt`, agent.systemPrompt ?? "");
330
+ if (edited === undefined)
331
+ return null;
332
+ if (edited.replace(/\s+$/, "") === (agent.systemPrompt ?? "").replace(/\s+$/, "")) {
333
+ return `System prompt for '${agent.name}' left unchanged.`;
334
+ }
335
+ return saveAgentSystemPrompt(ctx, agent, edited);
336
+ }
337
+ export async function openSubagentsAdmin(dm, ctx, args = "") {
338
+ const selection = await selectAgent(ctx, args);
339
+ if (selection.kind === "cancelled")
340
+ return;
341
+ if (selection.kind === "ambiguous") {
342
+ sendAdminMessage(dm, `Subagent '${selection.requestedName}' is ambiguous. Choose a scope in interactive mode:
343
+ ${selection.matches.map((agent) => `- ${agent.source}: ${agent.filePath}`).join(`
344
+ `)}`);
345
+ return;
346
+ }
347
+ if (selection.kind === "not-found") {
348
+ const text = selection.requestedName ? `Subagent '${selection.requestedName}' not found.
349
+
350
+ Available subagents:
351
+ ${selection.agents.map((agent) => `- ${agent.name} (${agent.source})`).join(`
352
+ `) || "- (none)"}` : `Available subagents:
353
+ ${selection.agents.map((agent) => `- ${agent.name} (${agent.source})`).join(`
354
+ `) || "- (none)"}`;
355
+ sendAdminMessage(dm, text);
356
+ return;
357
+ }
358
+ const agent = selection.agent;
359
+ if (!ctx.hasUI) {
360
+ sendAdminMessage(dm, metadataFor(agent));
361
+ return;
362
+ }
363
+ const requestedAction = args.trim().split(/\s+/)[1]?.toLowerCase();
364
+ let action;
365
+ if (requestedAction === "model")
366
+ action = "Change model";
367
+ else if (requestedAction === "thinking")
368
+ action = "Change thinking level";
369
+ else if (requestedAction === "prompt" || requestedAction === "system-prompt" || requestedAction === "edit")
370
+ action = "Edit system prompt";
371
+ else if (requestedAction === "details" || requestedAction === "info")
372
+ action = "Show details";
373
+ if (!action) {
374
+ action = await ctx.ui.select(`Administer ${agent.name}
375
+ ${metadataSummary(agent)}`, ["Change model", "Change thinking level", "Edit system prompt", "Show details", "Done"]);
376
+ }
377
+ try {
378
+ if (action === "Change model") {
379
+ const selectedModel = await chooseModel(ctx, agent);
380
+ if (selectedModel === null)
381
+ return;
382
+ const message = await saveAgentModel(ctx, agent, selectedModel);
383
+ if (message === null)
384
+ return;
385
+ ctx.ui.notify(message, "info");
386
+ sendAdminMessage(dm, message);
387
+ } else if (action === "Change thinking level") {
388
+ const selectedThinking = await chooseThinking(ctx, agent);
389
+ if (selectedThinking === null)
390
+ return;
391
+ const message = await saveAgentThinking(ctx, agent, selectedThinking);
392
+ if (message === null)
393
+ return;
394
+ ctx.ui.notify(message, "info");
395
+ sendAdminMessage(dm, message);
396
+ } else if (action === "Edit system prompt") {
397
+ const message = await editSystemPrompt(ctx, agent);
398
+ if (message === null)
399
+ return;
400
+ ctx.ui.notify(message, "info");
401
+ sendAdminMessage(dm, message);
402
+ } else if (action === "Show details") {
403
+ sendAdminMessage(dm, metadataFor(agent));
404
+ }
405
+ } catch (error) {
406
+ const message = error instanceof Error ? error.message : String(error);
407
+ ctx.ui.notify(message, "error");
408
+ sendAdminMessage(dm, `Failed to update '${agent.name}': ${message}`);
409
+ }
410
+ }