@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.
- package/dm.exe +0 -0
- package/extensions/.dm-extensions.json +211 -67
- package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
- package/extensions/dm-subagents/agents/claude-code.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec.md +15 -0
- package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
- package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
- package/extensions/dm-subagents/agents/delegate.md +3 -2
- package/extensions/dm-subagents/agents/oracle.md +10 -5
- package/extensions/dm-subagents/agents/researcher.md +2 -2
- package/extensions/dm-subagents/agents/reviewer.md +17 -7
- package/extensions/dm-subagents/agents/scout.md +5 -5
- package/extensions/dm-subagents/agents/worker.md +6 -2
- package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
- package/extensions/dm-subagents/index.js +4 -0
- package/extensions/dm-subagents/inspector-runner.mjs +10 -0
- package/extensions/dm-subagents/install.mjs +3 -2
- package/extensions/dm-subagents/package.json +2 -2
- package/extensions/dm-subagents/prompts/council.md +60 -0
- package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
- package/extensions/dm-subagents/prompts/review-loop.md +13 -7
- package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
- package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
- package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
- package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
- package/extensions/dm-subagents/src/agents/agents.js +1447 -299
- package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
- package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
- package/extensions/dm-subagents/src/agents/identity.js +1 -1
- package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
- package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
- package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
- package/extensions/dm-subagents/src/agents/skills.js +52 -35
- package/extensions/dm-subagents/src/api/agents.js +6 -0
- package/extensions/dm-subagents/src/api/background-work.js +151 -0
- package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
- package/extensions/dm-subagents/src/api/control-channel.js +3 -0
- package/extensions/dm-subagents/src/api/delegation.js +5 -0
- package/extensions/dm-subagents/src/api/dm-args.js +3 -0
- package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
- package/extensions/dm-subagents/src/api/external-runs.js +233 -0
- package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
- package/extensions/dm-subagents/src/api/preflight.js +322 -0
- package/extensions/dm-subagents/src/api/project-panes.js +11 -0
- package/extensions/dm-subagents/src/api/shared-types.js +4 -0
- package/extensions/dm-subagents/src/extension/config.js +175 -0
- package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
- package/extensions/dm-subagents/src/extension/doctor.js +71 -17
- package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
- package/extensions/dm-subagents/src/extension/index.js +711 -265
- package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
- package/extensions/dm-subagents/src/extension/rpc.js +427 -22
- package/extensions/dm-subagents/src/extension/schemas.js +158 -65
- package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
- package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
- package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
- package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
- package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
- package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
- package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
- package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
- package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
- package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
- package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
- package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
- package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
- package/extensions/dm-subagents/src/missions/actions.js +394 -0
- package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
- package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
- package/extensions/dm-subagents/src/missions/store.js +548 -0
- package/extensions/dm-subagents/src/missions/types.js +9 -0
- package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
- package/extensions/dm-subagents/src/policy/authority.js +37 -0
- package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
- package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
- package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
- package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
- package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
- package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
- package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
- package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
- package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
- package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
- package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
- package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
- package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
- package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
- package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
- package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
- package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
- package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
- package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
- package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
- package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
- package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
- package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
- package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
- package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
- package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
- package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
- package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
- package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
- package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
- package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
- package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
- package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
- package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
- package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
- package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
- package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
- package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
- package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
- package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
- package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
- package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
- package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
- package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
- package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
- package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
- package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
- package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
- package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
- package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
- package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
- package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
- package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
- package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
- package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
- package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
- package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
- package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
- package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
- package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
- package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
- package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
- package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
- package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
- package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
- package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
- package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
- package/extensions/dm-subagents/src/shared/display-text.js +142 -0
- package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
- package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
- package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
- package/extensions/dm-subagents/src/shared/formatters.js +21 -7
- package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
- package/extensions/dm-subagents/src/shared/model-info.js +10 -5
- package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
- package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
- package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
- package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
- package/extensions/dm-subagents/src/shared/settings.js +39 -47
- package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
- package/extensions/dm-subagents/src/shared/status-format.js +9 -2
- package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
- package/extensions/dm-subagents/src/shared/types.js +47 -7
- package/extensions/dm-subagents/src/shared/utf8.js +12 -0
- package/extensions/dm-subagents/src/shared/utils.js +151 -131
- package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
- package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
- package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
- package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
- package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
- package/extensions/dm-subagents/src/slash/selector.js +101 -0
- package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
- package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
- package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
- package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
- package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
- package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
- package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
- package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
- package/extensions/dm-subagents/src/tui/render.js +1511 -261
- package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
- package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
- package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
- package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
- package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
- package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
- package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
- package/extensions/dm-subagents/src/watchdog/render.js +54 -0
- package/extensions/dm-subagents/src/watchdog/review.js +251 -0
- package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
- package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
- package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
- package/extensions/dm-subagents/src/watchdog/types.js +29 -0
- package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
- package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
- package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
- package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
- package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
- package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
- package/package.json +4 -3
- package/extensions/dm-fff/package.json +0 -21
- package/extensions/dm-fff/src/index.js +0 -691
- package/extensions/dm-fff/src/query.js +0 -60
- package/extensions/dm-subagents/agents/context-builder.md +0 -46
- package/extensions/dm-subagents/agents/planner.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
- package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
- 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
|
-
|
|
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.
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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.
|
|
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
|
|
123
|
-
const
|
|
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.
|
|
129
|
-
|
|
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
|
|
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
|
+
}
|