@duckmind/dm-darwin-x64 0.43.2 → 0.43.8
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 +0 -0
- package/extensions/.dm-extensions.json +242 -49
- package/extensions/dm-9router-ext/package.json +2 -19
- package/extensions/dm-9router-ext/src/index.js +5 -0
- package/extensions/dm-ask-user/index.js +10 -0
- package/extensions/dm-ask-user/package.json +1 -21
- package/extensions/dm-cli-anything/package.json +0 -6
- package/extensions/dm-context/package.json +2 -12
- package/extensions/dm-context/src/context.js +1 -0
- package/extensions/dm-context/src/index.js +7 -0
- package/extensions/dm-context/src/utils.js +1 -0
- package/extensions/dm-cua/package.json +0 -7
- package/extensions/dm-fff/package.json +1 -28
- package/extensions/dm-fff/src/index.js +15 -0
- package/extensions/dm-fff/src/query.js +1 -0
- package/extensions/dm-goal/package.json +2 -31
- package/extensions/dm-goal/src/goal.js +43 -0
- package/extensions/dm-grill-me/index.js +174 -0
- package/extensions/dm-grill-me/package.json +1 -26
- package/extensions/dm-image2/package.json +0 -7
- package/extensions/dm-subagents/package.json +1 -32
- package/extensions/dm-subagents/src/agents/agent-management.js +37 -0
- package/extensions/dm-subagents/src/agents/agent-memory.js +6 -0
- package/extensions/dm-subagents/src/agents/agent-scope.js +1 -0
- package/extensions/dm-subagents/src/agents/agent-selection.js +1 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +7 -0
- package/extensions/dm-subagents/src/agents/agents.js +11 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -0
- package/extensions/dm-subagents/src/agents/frontmatter.js +6 -0
- package/extensions/dm-subagents/src/agents/identity.js +1 -0
- package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -0
- package/extensions/dm-subagents/src/agents/skills.js +6 -0
- package/extensions/dm-subagents/src/extension/config.js +2 -0
- package/extensions/dm-subagents/src/extension/control-notices.js +4 -0
- package/extensions/dm-subagents/src/extension/doctor.js +16 -0
- package/extensions/dm-subagents/src/extension/fanout-child.js +231 -0
- package/extensions/dm-subagents/src/extension/index.js +367 -0
- package/extensions/dm-subagents/src/extension/rpc.js +8 -0
- package/extensions/dm-subagents/src/extension/schemas.js +1 -0
- package/extensions/dm-subagents/src/extension/{tool-description.ts → tool-description.js} +6 -126
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +13 -0
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +5 -0
- package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -0
- package/extensions/dm-subagents/src/profiles/profiles.js +3 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +46 -0
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +14 -0
- package/extensions/dm-subagents/src/runs/background/async-resume.js +8 -0
- package/extensions/dm-subagents/src/runs/background/async-status.js +12 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +2 -0
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +1 -0
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +1 -0
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +1 -0
- package/extensions/dm-subagents/src/runs/background/control-channel.js +1 -0
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +17 -0
- package/extensions/dm-subagents/src/runs/background/notify.js +3 -0
- package/extensions/dm-subagents/src/runs/background/parallel-groups.js +1 -0
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +8 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +4 -0
- package/extensions/dm-subagents/src/runs/background/run-status.js +23 -0
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +4 -0
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +11 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +78 -0
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -0
- package/extensions/dm-subagents/src/runs/background/wait.js +11 -0
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +12 -0
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +102 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +51 -0
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +228 -0
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +8 -0
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +14 -0
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +7 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +3 -0
- package/extensions/dm-subagents/src/shared/artifacts.js +2 -0
- package/extensions/dm-subagents/src/shared/atomic-json.js +1 -0
- package/extensions/dm-subagents/src/shared/child-transcript.js +5 -0
- package/extensions/dm-subagents/src/shared/file-coalescer.js +1 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +6 -0
- package/extensions/dm-subagents/src/shared/formatters.js +9 -0
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +2 -0
- package/extensions/dm-subagents/src/shared/model-info.js +1 -0
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +1 -0
- package/extensions/dm-subagents/src/shared/session-identity.js +1 -0
- package/extensions/dm-subagents/src/shared/session-tokens.js +2 -0
- package/extensions/dm-subagents/src/shared/settings.js +23 -0
- package/extensions/dm-subagents/src/shared/status-format.js +1 -0
- package/extensions/dm-subagents/src/shared/types.js +8 -0
- package/extensions/dm-subagents/src/shared/utils.js +2 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +1 -0
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +7 -0
- package/extensions/dm-subagents/src/slash/slash-bridge.js +1 -0
- package/extensions/dm-subagents/src/slash/slash-commands.js +38 -0
- package/extensions/dm-subagents/src/slash/slash-live-state.js +6 -0
- package/extensions/dm-subagents/src/tui/render-helpers.js +1 -0
- package/extensions/dm-subagents/src/tui/render.js +4 -0
- package/extensions/dm-tasks/package.json +1 -30
- package/extensions/dm-tasks/src/auto-clear.js +1 -0
- package/extensions/dm-tasks/src/index.js +212 -0
- package/extensions/dm-tasks/src/process-tracker.js +1 -0
- package/extensions/dm-tasks/src/task-store.js +1 -0
- package/extensions/dm-tasks/src/tasks-config.js +1 -0
- package/extensions/dm-tasks/src/types.js +0 -0
- package/extensions/dm-tasks/src/ui/settings-menu.js +1 -0
- package/extensions/dm-tasks/src/ui/task-widget.js +1 -0
- package/extensions/dm-usage/index.js +9 -0
- package/extensions/dm-usage/package.json +1 -18
- package/extensions/greedysearch-dm/bin/search.mjs +135 -135
- package/extensions/greedysearch-dm/index.js +20 -0
- package/extensions/greedysearch-dm/package.json +1 -22
- package/extensions/greedysearch-dm/src/formatters/results.js +8 -0
- package/extensions/greedysearch-dm/src/formatters/sources.js +1 -0
- package/extensions/greedysearch-dm/src/formatters/synthesis.js +1 -0
- package/extensions/greedysearch-dm/src/search/engines.mjs +9 -9
- package/extensions/greedysearch-dm/src/search/paths.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/research.mjs +100 -100
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +10 -10
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +20 -0
- package/extensions/greedysearch-dm/src/tools/shared.js +9 -0
- package/extensions/greedysearch-dm/src/types.js +0 -0
- package/extensions/greedysearch-dm/src/utils/helpers.js +1 -0
- package/package.json +1 -1
- package/extensions/dm-9router-ext/src/index.ts +0 -541
- package/extensions/dm-ask-user/index.ts +0 -857
- package/extensions/dm-context/src/context.ts +0 -158
- package/extensions/dm-context/src/index.ts +0 -439
- package/extensions/dm-context/src/utils.ts +0 -6
- package/extensions/dm-fff/src/index.ts +0 -1023
- package/extensions/dm-fff/src/query.ts +0 -87
- package/extensions/dm-goal/src/goal.ts +0 -1073
- package/extensions/dm-grill-me/index.ts +0 -1085
- package/extensions/dm-subagents/src/agents/agent-management.ts +0 -1052
- package/extensions/dm-subagents/src/agents/agent-memory.ts +0 -254
- package/extensions/dm-subagents/src/agents/agent-scope.ts +0 -6
- package/extensions/dm-subagents/src/agents/agent-selection.ts +0 -25
- package/extensions/dm-subagents/src/agents/agent-serializer.ts +0 -121
- package/extensions/dm-subagents/src/agents/agents.ts +0 -1553
- package/extensions/dm-subagents/src/agents/chain-serializer.ts +0 -277
- package/extensions/dm-subagents/src/agents/frontmatter.ts +0 -93
- package/extensions/dm-subagents/src/agents/identity.ts +0 -30
- package/extensions/dm-subagents/src/agents/proactive-skills.ts +0 -191
- package/extensions/dm-subagents/src/agents/skills.ts +0 -729
- package/extensions/dm-subagents/src/extension/config.ts +0 -39
- package/extensions/dm-subagents/src/extension/control-notices.ts +0 -92
- package/extensions/dm-subagents/src/extension/doctor.ts +0 -214
- package/extensions/dm-subagents/src/extension/fanout-child.ts +0 -172
- package/extensions/dm-subagents/src/extension/index.ts +0 -656
- package/extensions/dm-subagents/src/extension/rpc.ts +0 -369
- package/extensions/dm-subagents/src/extension/schemas.ts +0 -309
- package/extensions/dm-subagents/src/intercom/intercom-bridge.ts +0 -180
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.ts +0 -519
- package/extensions/dm-subagents/src/intercom/result-intercom.ts +0 -377
- package/extensions/dm-subagents/src/profiles/profiles.ts +0 -637
- package/extensions/dm-subagents/src/runs/background/async-execution.ts +0 -1065
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.ts +0 -441
- package/extensions/dm-subagents/src/runs/background/async-resume.ts +0 -391
- package/extensions/dm-subagents/src/runs/background/async-status.ts +0 -395
- package/extensions/dm-subagents/src/runs/background/chain-append.ts +0 -282
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.ts +0 -191
- package/extensions/dm-subagents/src/runs/background/completion-batcher.ts +0 -166
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.ts +0 -63
- package/extensions/dm-subagents/src/runs/background/control-channel.ts +0 -332
- package/extensions/dm-subagents/src/runs/background/fleet-view.ts +0 -515
- package/extensions/dm-subagents/src/runs/background/notify.ts +0 -225
- package/extensions/dm-subagents/src/runs/background/parallel-groups.ts +0 -45
- package/extensions/dm-subagents/src/runs/background/result-watcher.ts +0 -315
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.ts +0 -84
- package/extensions/dm-subagents/src/runs/background/run-status.ts +0 -434
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.ts +0 -514
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.ts +0 -368
- package/extensions/dm-subagents/src/runs/background/subagent-runner.ts +0 -3171
- package/extensions/dm-subagents/src/runs/background/top-level-async.ts +0 -13
- package/extensions/dm-subagents/src/runs/background/wait.ts +0 -353
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.ts +0 -1333
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.ts +0 -1313
- package/extensions/dm-subagents/src/runs/foreground/execution.ts +0 -1239
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.ts +0 -3613
- package/extensions/dm-subagents/src/runs/shared/acceptance.ts +0 -879
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.ts +0 -116
- package/extensions/dm-subagents/src/runs/shared/completion-guard.ts +0 -147
- package/extensions/dm-subagents/src/runs/shared/dm-args.ts +0 -271
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.ts +0 -147
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.ts +0 -295
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.ts +0 -175
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -365
- package/extensions/dm-subagents/src/runs/shared/model-fallback.ts +0 -292
- package/extensions/dm-subagents/src/runs/shared/model-scope.ts +0 -128
- package/extensions/dm-subagents/src/runs/shared/nested-events.ts +0 -908
- package/extensions/dm-subagents/src/runs/shared/nested-path.ts +0 -52
- package/extensions/dm-subagents/src/runs/shared/nested-render.ts +0 -115
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.ts +0 -198
- package/extensions/dm-subagents/src/runs/shared/run-history.ts +0 -60
- package/extensions/dm-subagents/src/runs/shared/single-output.ts +0 -180
- package/extensions/dm-subagents/src/runs/shared/structured-output.ts +0 -77
- package/extensions/dm-subagents/src/runs/shared/subagent-control.ts +0 -223
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.ts +0 -342
- package/extensions/dm-subagents/src/runs/shared/tool-budget.ts +0 -74
- package/extensions/dm-subagents/src/runs/shared/turn-budget.ts +0 -52
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.ts +0 -206
- package/extensions/dm-subagents/src/runs/shared/worktree.ts +0 -600
- package/extensions/dm-subagents/src/shared/artifacts.ts +0 -113
- package/extensions/dm-subagents/src/shared/atomic-json.ts +0 -86
- package/extensions/dm-subagents/src/shared/child-transcript.ts +0 -212
- package/extensions/dm-subagents/src/shared/file-coalescer.ts +0 -40
- package/extensions/dm-subagents/src/shared/fork-context.ts +0 -194
- package/extensions/dm-subagents/src/shared/formatters.ts +0 -133
- package/extensions/dm-subagents/src/shared/jsonl-writer.ts +0 -81
- package/extensions/dm-subagents/src/shared/model-info.ts +0 -78
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
- package/extensions/dm-subagents/src/shared/session-identity.ts +0 -10
- package/extensions/dm-subagents/src/shared/session-tokens.ts +0 -44
- package/extensions/dm-subagents/src/shared/settings.ts +0 -450
- package/extensions/dm-subagents/src/shared/status-format.ts +0 -49
- package/extensions/dm-subagents/src/shared/types.ts +0 -1257
- package/extensions/dm-subagents/src/shared/utils.ts +0 -554
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.ts +0 -420
- package/extensions/dm-subagents/src/slash/prompt-workflows.ts +0 -330
- package/extensions/dm-subagents/src/slash/slash-bridge.ts +0 -176
- package/extensions/dm-subagents/src/slash/slash-commands.ts +0 -1296
- package/extensions/dm-subagents/src/slash/slash-live-state.ts +0 -292
- package/extensions/dm-subagents/src/tui/render-helpers.ts +0 -80
- package/extensions/dm-subagents/src/tui/render.ts +0 -1748
- package/extensions/dm-tasks/src/auto-clear.ts +0 -91
- package/extensions/dm-tasks/src/index.ts +0 -1145
- package/extensions/dm-tasks/src/process-tracker.ts +0 -140
- package/extensions/dm-tasks/src/task-store.ts +0 -305
- package/extensions/dm-tasks/src/tasks-config.ts +0 -23
- package/extensions/dm-tasks/src/types.ts +0 -40
- package/extensions/dm-tasks/src/ui/settings-menu.ts +0 -100
- package/extensions/dm-tasks/src/ui/task-widget.ts +0 -265
- package/extensions/dm-usage/index.ts +0 -1718
- package/extensions/greedysearch-dm/index.ts +0 -177
- package/extensions/greedysearch-dm/src/formatters/results.ts +0 -163
- package/extensions/greedysearch-dm/src/formatters/sources.ts +0 -116
- package/extensions/greedysearch-dm/src/formatters/synthesis.ts +0 -87
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.ts +0 -370
- package/extensions/greedysearch-dm/src/tools/shared.ts +0 -187
- package/extensions/greedysearch-dm/src/types.ts +0 -110
- package/extensions/greedysearch-dm/src/utils/helpers.ts +0 -40
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{randomUUID as k}from"node:crypto";import*as o from"node:fs";import*as F from"node:path";import{SessionManager as v}from"@duckmind/dm-coding-agent";function B(e){return e==="fork"?"fork":"fresh"}function I(e,t){if(!e||!t||typeof t!=="object"||!("type"in t))return!1;let n=typeof e.provider==="string"?e.provider.toLowerCase():"",r=typeof e.api==="string"?e.api.toLowerCase():"",s=typeof e.model==="string"?e.model.toLowerCase():"",c=n==="anthropic"||r==="anthropic-messages"||s.startsWith("anthropic/");if(t.type==="redacted_thinking")return!0;if(t.type!=="thinking"||!c)return!1;let h="thinkingSignature"in t?t.thinkingSignature:("signature"in t)?t.signature:void 0;return t.redacted===!0||typeof h==="string"&&h.length>0}function O(e){let t=new Set(e.map((n)=>n.id).filter((n)=>typeof n==="string"));for(let n=0;n<100;n++){let r=k().slice(0,8);if(!t.has(r))return r}return k()}function C(e){let t=e[e.length-1];if(t?.type==="thinking_level_change"&&t.thinkingLevel==="off")return;let n=[...e].reverse().find((r)=>typeof r.id==="string");e.push({type:"thinking_level_change",id:O(e),parentId:n?.id??null,timestamp:new Date().toISOString(),thinkingLevel:"off"})}function m(e){let t=!1;for(let n of e){if(n.type!=="message"||n.message?.role!=="assistant"||!Array.isArray(n.message.content))continue;let r=n.message.content.filter((s)=>!I(n.message,s));if(r.length===n.message.content.length)continue;n.message.content=r,t=!0}if(t)C(e);return t}function b(e){return o.readFileSync(e,"utf-8").split(`
|
|
2
|
+
`).filter((n)=>n.trim().length>0).map((n,r)=>{try{return JSON.parse(n)}catch(s){let c=s instanceof Error?s:Error(String(s));throw Error(`Unable to inspect forked session ${e}: invalid JSONL on line ${r+1}: ${c.message}`,{cause:c})}})}function D(e,t,n={}){if(B(t)!=="fork")return{sessionFileForIndex:()=>{return},thinkingOverrideForIndex:()=>{return}};let r=e.getSessionFile();if(!r)throw Error("Forked subagent context requires a persisted parent session.");let s=e.getLeafId();if(!s)throw Error("Forked subagent context requires a current leaf to fork from.");let c=n.openSession??e.openSession,h=typeof e.createBranchedSession==="function"?e:void 0,E=c??((a,u)=>v.open(a,u)),x=e.getSessionDir?.(),p=new Map,S=(a=0)=>{let u=p.get(a);if(u)return u;try{if(!o.existsSync(r))throw Error(`Parent session file does not exist: ${r}. DM has not persisted enough history to fork yet.`);let f=typeof e.createBranchedSession==="function"?e:E(r,x),i=f.createBranchedSession(s);if(!i)throw Error("Session manager did not return a forked session file.");let l;if(!o.existsSync(i)){let d=f.getHeader?.(),g=f.getEntries?.();if(!d||!g)throw Error(`Session manager returned a forked session file that does not exist and cannot be persisted by fallback: ${i}`);if(m(g))l="off";o.mkdirSync(F.dirname(i),{recursive:!0}),o.writeFileSync(i,`${[d,...g].map((w)=>JSON.stringify(w)).join(`
|
|
3
|
+
`)}
|
|
4
|
+
`,"utf-8")}else{let d=b(i);if(m(d))l="off",o.writeFileSync(i,`${d.map((g)=>JSON.stringify(g)).join(`
|
|
5
|
+
`)}
|
|
6
|
+
`,"utf-8")}let y={sessionFile:i,...l?{thinkingOverride:l}:{}};return p.set(a,y),y}catch(f){let i=f instanceof Error?f:Error(String(f));throw Error(`Failed to create forked subagent session: ${i.message}`,{cause:i})}};return{sessionFileForIndex(a=0){return S(a).sessionFile},thinkingOverrideForIndex(a=0){return S(a).thinkingOverride}}}export{B as resolveSubagentContext,D as createForkContextResolver};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import*as O from"node:fs";import*as R from"node:path";import*as B from"node:os";import*as U from"node:path";function j(Q){return Q.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function I(Q){let Y=Q?.env??process.env,Z=Q&&Object.hasOwn(Q,"getuid")?Q.getuid:process.getuid?.bind(process);if(typeof Z==="function")return`uid-${Z()}`;for(let W of["USERNAME","USER","LOGNAME"]){let G=Y[W];if(G)return`user-${j(G)}`}let $=Q&&Object.hasOwn(Q,"userInfo")?Q.userInfo:B.userInfo;try{let W=$?.().username;if(W)return`user-${j(W)}`}catch{}let J=Y.USERPROFILE??Y.HOME;if(J)return`home-${j(J)}`;let q=Q&&Object.hasOwn(Q,"homedir")?Q.homedir:B.homedir;try{let W=q?.();if(W)return`home-${j(W)}`}catch{}return"shared"}var _=U.join(B.tmpdir(),`dm-subagents-${I()}`),h=U.join(_,"async-subagent-results"),c=U.join(_,"async-subagent-runs"),C=U.join(_,"chain-runs"),g=U.join(_,"artifacts");function F(Q){return"parallel"in Q&&Array.isArray(Q.parallel)}function M(Q){return"expand"in Q&&"collect"in Q&&"parallel"in Q&&!Array.isArray(Q.parallel)}var A=["off","minimal","low","medium","high","xhigh"];function T(Q){let Y=Q.lastIndexOf(":");if(Y===-1)return{baseModel:Q,thinkingSuffix:""};let Z=A.find(($)=>$===Q.substring(Y+1));if(!Z)return{baseModel:Q,thinkingSuffix:""};return{baseModel:Q.substring(0,Y),thinkingSuffix:`:${Z}`}}function H(Q){return Q<1000?String(Q):Q<1e4?`${(Q/1000).toFixed(1)}k`:`${Math.round(Q/1000)}k`}function t(Q,Y){let Z=Q?T(Q):void 0,$=Z?.baseModel??Q,J=A.find((W)=>W===Y?.trim()),q=Z?.thinkingSuffix?Z.thinkingSuffix.slice(1):J;if($){let W=$.lastIndexOf("/");if(W!==-1)$=$.slice(W+1)}return[$,q?`thinking ${q}`:void 0].filter(Boolean).join(" · ")}function e(Q,Y){let Z=[];if(Q.turns)Z.push(`${Q.turns} turn${Q.turns>1?"s":""}`);if(Q.input)Z.push(`in:${H(Q.input)}`);if(Q.output)Z.push(`out:${H(Q.output)}`);if(Q.cacheRead)Z.push(`R${H(Q.cacheRead)}`);if(Q.cacheWrite)Z.push(`W${H(Q.cacheWrite)}`);if(Q.cost)Z.push(`$${Q.cost.toFixed(4)}`);if(Y)Z.push(Y);return Z.join(" ")}function b(Q){if(Q<1000)return`${Q}ms`;if(Q<60000)return`${(Q/1000).toFixed(1)}s`;return`${Math.floor(Q/60000)}m${Math.floor(Q%60000/1000)}s`}function QQ(Q,Y,Z,$,J){let q=Q.map((X)=>F(X)?`parallel[${X.parallel.length}]`:M(X)?`expand:${X.parallel.agent}`:X.agent).join(" → "),W=Y.reduce((X,V)=>X+(V.progress?.durationMs||0),0),G=b(W),z=R.join(Z,"progress.md"),E=O.existsSync(z),L=new Set;for(let X of Y)if(X.skills)X.skills.forEach((V)=>L.add(V));let K=L.size>0?`\uD83D\uDD27 Skills: ${[...L].join(", ")}`:"";if($==="completed"){let X=Y.length===1?"step":"steps";return`✅ Chain completed: ${q} (${Y.length} ${X}, ${G})${K?`
|
|
2
|
+
${K}`:""}
|
|
3
|
+
|
|
4
|
+
\uD83D\uDCCB Progress: ${E?z:"(none)"}
|
|
5
|
+
\uD83D\uDCC1 Artifacts: ${Z}`}else{let X=J?` at step ${J.index+1}`:"",V=J?.error?`: ${J.error}`:"";return`❌ Chain failed${X}${V}${K?`
|
|
6
|
+
${K}`:""}
|
|
7
|
+
|
|
8
|
+
\uD83D\uDCCB Progress: ${E?z:"(none)"}
|
|
9
|
+
\uD83D\uDCC1 Artifacts: ${Z}`}}function N(Q,Y,Z=!1){switch(Q){case"bash":{let $=typeof Y.command==="string"?Y.command:"",J=Z?240:60;return`$ ${$.slice(0,J)}${$.length>J?"...":""}`}case"read":case"write":case"edit":{let $=typeof Y.path==="string"?Y.path:typeof Y.file_path==="string"?Y.file_path:"";return`${Q} ${w($)}`}default:{let $=JSON.stringify(Y),J=Z?160:40;return`${Q} ${$.slice(0,J)}${$.length>J?"...":""}`}}}function w(Q){let Y=process.env.HOME;if(Y&&Q.startsWith(Y))return`~${Q.slice(Y.length)}`;return Q}export{w as shortenPath,e as formatUsage,N as formatToolCall,H as formatTokens,t as formatModelThinking,b as formatDuration,QQ as buildChainSummary};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as u from"node:fs";var W=52428800;function S(s,a,o={}){if(!s)return{writeLine(){},async close(){}};let f=o.createWriteStream??((r)=>u.createWriteStream(r,{flags:"a"})),e;try{e=f(s)}catch{return{writeLine(){},async close(){}}}let i=!1,t=!1,c=0,m=o.maxBytes??W;return{writeLine(r){if(!e||t||!r.trim())return;let n=`${r}
|
|
2
|
+
`,l=Buffer.byteLength(n,"utf-8");if(c+l>m)return;try{let d=e.write(n);if(c+=l,!d&&!i)i=!0,a.pause(),e.once("drain",()=>{if(i=!1,!t)a.resume()})}catch{}},async close(){if(!e||t)return;t=!0;let r=e;e=void 0,await new Promise((n)=>r.end(()=>n()))}}}export{S as createJsonlWriter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var C=["off","minimal","low","medium","high","xhigh"];function Q(j){return{provider:j.provider,id:j.id,fullId:`${j.provider}/${j.id}`,reasoning:j.reasoning,thinkingLevelMap:j.thinkingLevelMap}}function U(j,q){if(!j)return;let{thinkingSuffix:z}=J(j);if(z)return z.slice(1);return C.find((A)=>A===q)}function J(j){let q=j.lastIndexOf(":");if(q===-1)return{baseModel:j,thinkingSuffix:""};let z=C.find((A)=>A===j.substring(q+1));if(!z)return{baseModel:j,thinkingSuffix:""};return{baseModel:j.substring(0,q),thinkingSuffix:`:${z}`}}function W(j,q,z){if(!j||!q||q.length===0)return;let{baseModel:A}=J(j),F=q.find((B)=>B.fullId===A);if(F)return F;let D=q.filter((B)=>B.id===A);if(z){let B=D.find((O)=>O.provider===z);if(B)return B}return D.length===1?D[0]:void 0}function X(j){if(!j)return[...C];if(j.reasoning===!1)return["off"];if(!j.thinkingLevelMap)return[...C];return C.filter((z)=>{let A=j.thinkingLevelMap?.[z];if(A===null)return!1;if(z==="xhigh")return A!==void 0;return!0})}export{Q as toModelInfo,J as splitKnownThinkingSuffix,U as resolveEffectiveThinking,X as getSupportedThinkingLevels,W as findModelInfo,C as THINKING_LEVELS};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function c(e,n){try{return e.kill(n)}catch{return!1}}function m(e,n){let{idleMs:a,hardMs:f}=n,u=!1,o=!1,d=!1,t,r,l=()=>{if(!o)try{e.stdout?.destroy()}catch{}if(!d)try{e.stderr?.destroy()}catch{}},i=()=>{if(t)clearTimeout(t),t=void 0;if(r)clearTimeout(r),r=void 0},s=()=>{if(!u)return;if(t)clearTimeout(t);t=setTimeout(l,a),t.unref?.()};return e.stdout?.on("data",s),e.stderr?.on("data",s),e.stdout?.on("end",()=>{if(o=!0,o&&d)i()}),e.stderr?.on("end",()=>{if(d=!0,o&&d)i()}),e.on("exit",()=>{if(u=!0,s(),r)return;r=setTimeout(l,f),r.unref?.()}),e.on("close",i),e.on("error",i),i}export{c as trySignalChild,m as attachPostExitStdioGuard};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function i(e){let n=e.getSessionFile()??e.getSessionId();if(!n)throw Error("Current session identity is unavailable.");return n}export{i as resolveCurrentSessionId};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as k from"node:fs";import*as C from"node:path";function E(w){try{let m=k.readdirSync(w).filter((j)=>j.endsWith(".jsonl")).map((j)=>C.join(w,j));if(m.length===0)return null;return m.sort((j,q)=>k.statSync(q).mtimeMs-k.statSync(j).mtimeMs),m[0]??null}catch{return null}}function G(w){let m=E(w);if(!m)return null;try{let j=k.readFileSync(m,"utf-8"),q=0,z=0;for(let A of j.split(`
|
|
2
|
+
`)){if(!A.trim())continue;try{let B=JSON.parse(A),v=B.usage??B.message?.usage;if(v)q+=v.inputTokens??v.input??0,z+=v.outputTokens??v.output??0}catch{}}return{input:q,output:z,total:q+z}}catch{return null}}export{G as parseSessionTokens};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import*as U from"node:fs";import*as B from"node:path";function S(Q,Z=(Y,J)=>`=== Parallel Task ${Y+1} (${J}) ===`){return Q.map((Y,J)=>{let $=Z(Y.taskIndex??J,Y.agent),q=Boolean(Y.output?.trim()),W=Y.timedOut?`TIMED OUT${Y.error?`: ${Y.error}`:""}`:Y.exitCode===-1?"SKIPPED":Y.exitCode!==0&&Y.exitCode!==null?`FAILED (exit code ${Y.exitCode})${Y.error?`: ${Y.error}`:""}`:Y.error?`WARNING: ${Y.error}`:!q&&Y.outputTargetPath&&Y.outputTargetExists===!1?`EMPTY OUTPUT (expected output file missing: ${Y.outputTargetPath})`:!q&&!Y.outputTargetPath?"EMPTY OUTPUT (no textual response returned)":"",X=W?q?`${W}
|
|
2
|
+
${Y.output}`:W:Y.output;return`${$}
|
|
3
|
+
${X}`}).join(`
|
|
4
|
+
|
|
5
|
+
`)}function T(Q){if(Q===!1)return!1;if(Q===!0||Q===void 0)return;if(Array.isArray(Q))return[...new Set(Q.map((Y)=>Y.trim()).filter((Y)=>Y.length>0))];let Z=Q.trim();if(Z.startsWith("["))try{let Y=JSON.parse(Z);if(Array.isArray(Y))return T(Y)}catch{}return[...new Set(Q.split(",").map((Y)=>Y.trim()).filter((Y)=>Y.length>0))]}import*as j from"node:os";import*as _ from"node:path";function z(Q){return Q.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function D(Q){let Z=Q?.env??process.env,Y=Q&&Object.hasOwn(Q,"getuid")?Q.getuid:process.getuid?.bind(process);if(typeof Y==="function")return`uid-${Y()}`;for(let W of["USERNAME","USER","LOGNAME"]){let X=Z[W];if(X)return`user-${z(X)}`}let J=Q&&Object.hasOwn(Q,"userInfo")?Q.userInfo:j.userInfo;try{let W=J?.().username;if(W)return`user-${z(W)}`}catch{}let $=Z.USERPROFILE??Z.HOME;if($)return`home-${z($)}`;let q=Q&&Object.hasOwn(Q,"homedir")?Q.homedir:j.homedir;try{let W=q?.();if(W)return`home-${z(W)}`}catch{}return"shared"}var L=_.join(j.tmpdir(),`dm-subagents-${D()}`),t=_.join(L,"async-subagent-results"),e=_.join(L,"async-subagent-runs"),H=_.join(L,"chain-runs"),QQ=_.join(L,"artifacts");var x=86400000,y=`# Progress
|
|
6
|
+
|
|
7
|
+
## Status
|
|
8
|
+
In Progress
|
|
9
|
+
|
|
10
|
+
## Tasks
|
|
11
|
+
|
|
12
|
+
## Files Changed
|
|
13
|
+
|
|
14
|
+
## Notes
|
|
15
|
+
`;function A(Q){return Q==="false"?!1:Q}function F(Q){return"parallel"in Q&&Array.isArray(Q.parallel)}function M(Q){return"expand"in Q&&"collect"in Q&&"parallel"in Q&&!Array.isArray(Q.parallel)}function JQ(Q){if(F(Q))return Q.parallel.map((Z)=>Z.agent);if(M(Q))return[Q.parallel.agent];return[Q.agent]}function WQ(Q,Z){let Y=B.join(Z?B.resolve(Z):H,Q);return U.mkdirSync(Y,{recursive:!0}),Y}function XQ(Q){try{U.rmSync(Q,{recursive:!0})}catch{}}function qQ(){if(!U.existsSync(H))return;let Q=Date.now(),Z;try{Z=U.readdirSync(H)}catch{return}for(let Y of Z)try{let J=B.join(H,Y),$=U.statSync(J);if($.isDirectory()&&Q-$.mtimeMs>x)U.rmSync(J,{recursive:!0})}catch{}}function BQ(Q){return Q.map((Z,Y)=>{if(F(Z))return Z.parallel.map(($)=>{if($.task)return $.task;return"{previous}"});if(M(Z))return Z.parallel.task??"{previous}";let J=Z;if(J.task)return J.task;return Y===0?"{task}":"{previous}"})}function UQ(Q,Z,Y){let J=A(Z.output),$=J!==void 0?J:A(Q.output)??!1,q=Z.reads!==void 0?Z.reads:Q.defaultReads??!1,W=Z.progress!==void 0?Z.progress:Q.defaultProgress??!1,X;if(Z.skills===!1)X=!1;else if(Z.skills!==void 0){if(X=[...Z.skills],Y&&Y.length>0)X=[...new Set([...X,...Y])]}else if(X=Q.skills?[...Q.skills]:[],Y&&Y.length>0)X=[...new Set([...X,...Y])];let V=Z.outputMode??"inline",G=Z.model??Q.model;return{output:$,outputMode:V,reads:q,progress:W,skills:X,model:G}}function v(Q,Z){if(!Q)return Z;return Z?Q.replaceAll("{task}",Z):Q}function P(Q){if(!Q)return!1;return/\breview[- ]only\b/i.test(Q)||/\bread[- ]only\s+(?:review|audit|inspection|pass)\b/i.test(Q)||/\b(?:no|without)\s+(?:file\s+)?edits?\b/i.test(Q)||/\b(?:do not|don't|must not)\s+(?:edit|modify|write|touch)\b/i.test(Q)||/\bleave\s+files?\s+unchanged\b/i.test(Q)}function VQ(Q,Z,Y){let J=v(Z,Y);return Q.progress&&P(J)?{...Q,progress:!1}:Q}function R(Q,Z){return B.isAbsolute(Q)?Q:B.join(Z,Q)}function GQ(Q){U.mkdirSync(Q,{recursive:!0}),U.writeFileSync(B.join(Q,"progress.md"),y)}function KQ(Q,Z,Y,J){let $=[],q=[];if(Q.reads&&Q.reads.length>0){let V=Q.reads.map((G)=>R(G,Z));$.push(`[Read from: ${V.join(", ")}]`)}if(Q.output){let V=R(Q.output,Z);$.push(`[Write to: ${V}]`)}if(Q.progress){let V=B.join(Z,"progress.md");if(Y)q.push(`Create and maintain progress at: ${V}`);else q.push(`Update progress at: ${V}`)}if(J&&J.trim())q.push(`Previous step output:
|
|
16
|
+
${J.trim()}`);let W=$.length>0?$.join(`
|
|
17
|
+
`)+`
|
|
18
|
+
|
|
19
|
+
`:"",X=q.length>0?`
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
`+q.join(`
|
|
23
|
+
`):"";return{prefix:W,suffix:X}}function jQ(Q,Z,Y,J){return Q.map(($,q)=>{let W=Z.find((w)=>w.name===$.agent);if(!W)throw Error(`Unknown agent: ${$.agent}`);let X=B.join(`parallel-${Y}`,`${q}-${$.agent}`),V=!1,G=A($.output),O=A(W.output);if(G!==void 0)if(G===!1)V=!1;else if(B.isAbsolute(G))V=G;else V=B.join(X,G);else if(O)V=B.join(X,O);let N=$.reads!==void 0?$.reads:W.defaultReads??!1,I=$.progress!==void 0?$.progress:W.defaultProgress??!1,E=T($.skill),K;if(E===!1)K=!1;else if(E!==void 0){if(K=[...E],J&&J.length>0)K=[...new Set([...K,...J])]}else if(K=W.skills?[...W.skills]:[],J&&J.length>0)K=[...new Set([...K,...J])];let C=$.outputMode??"inline",b=$.model??W.model;return{output:V,outputMode:C,reads:N,progress:I,skills:K,model:b}})}function _Q(Q,Z,Y,J){for(let $=0;$<Y;$++){let q=B.join(Q,`parallel-${Z}`,`${$}-${J[$]}`);U.mkdirSync(q,{recursive:!0})}}export{GQ as writeInitialProgressFile,P as taskDisallowsFileUpdates,VQ as suppressProgressForReadOnlyTask,v as resolveTaskTextForFileUpdatePolicy,UQ as resolveStepBehavior,jQ as resolveParallelBehaviors,BQ as resolveChainTemplates,XQ as removeChainDir,F as isParallelStep,M as isDynamicParallelStep,JQ as getStepAgents,_Q as createParallelDirs,WQ as createChainDir,qQ as cleanupOldChainDirs,KQ as buildChainInstructions,S as aggregateParallelOutputs};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function g(n){if(n<1000)return"now";if(n<60000)return`${Math.floor(n/1000)}s`;return`${Math.floor(n/60000)}m`}function c(n,t,u=Date.now()){if(n===void 0){if(t==="needs_attention")return"needs attention";if(t==="active_long_running")return"active but long-running";return}let e=g(Math.max(0,u-n));if(t==="needs_attention")return`no activity for ${e}`;if(t==="active_long_running")return`active but long-running · last activity ${e} ago`;return e==="now"?"active now":`active ${e} ago`}function s(n){return n==="complete"||n==="completed"}function d(n){if(n.some((t)=>t.status==="running"))return"running";if(n.some((t)=>t.status==="failed"))return"failed";if(n.some((t)=>t.status==="paused"))return"paused";if(n.length>0&&n.every((t)=>s(t.status)))return"complete";return"pending"}function l(n){return n===1?"1 agent running":`${n} agents running`}function p(n,t,u={}){let e=n.filter((r)=>r.status==="running").length,f=n.filter((r)=>s(r.status)).length,o=n.filter((r)=>r.status==="failed").length,a=n.filter((r)=>r.status==="paused").length,i=[`${f}/${t} done`];if(u.showRunning!==!1&&e>0)i.unshift(l(e));if(o>0)i.push(`${o} failed`);if(a>0)i.push(`${a} paused`);return i.join(" · ")}export{p as formatParallelOutcome,l as formatAgentRunningLabel,c as formatActivityLabel,d as aggregateStepStatus};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import*as Z from"node:os";import*as Q from"node:path";var k=1,M="pi-intercom:detach-request",P="pi-intercom:detach-response",y="subagent:async-started",D="subagent:async-complete",S="subagent:control-event",b="subagent:control-intercom",x="subagent:result-intercom",d="subagent:result-intercom-delivery",m={bytes:204800,lines:5000},h={enabled:!0,includeInput:!0,includeOutput:!0,includeJsonl:!1,includeTranscript:!0,includeMetadata:!0,cleanupDays:7};function O(j){return j.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function E(j){let q=j?.env??process.env,J=j&&Object.hasOwn(j,"getuid")?j.getuid:process.getuid?.bind(process);if(typeof J==="function")return`uid-${J()}`;for(let C of["USERNAME","USER","LOGNAME"]){let R=q[C];if(R)return`user-${O(R)}`}let K=j&&Object.hasOwn(j,"userInfo")?j.userInfo:Z.userInfo;try{let C=K?.().username;if(C)return`user-${O(C)}`}catch{}let Y=q.USERPROFILE??q.HOME;if(Y)return`home-${O(Y)}`;let F=j&&Object.hasOwn(j,"homedir")?j.homedir:Z.homedir;try{let C=F?.();if(C)return`home-${O(C)}`}catch{}return"shared"}var _=8,A=4,B=Q.join(Z.tmpdir(),`dm-subagents-${E()}`),v=Q.join(B,"async-subagent-results"),g=Q.join(B,"async-subagent-runs"),c=Q.join(B,"chain-runs"),f=Q.join(B,"artifacts"),r="subagent-async",u="subagent-slash-result",l="subagent-slash-text-result",p="subagent:slash:request",s="subagent:slash:started",n="subagent:slash:response",i="subagent:slash:update",o="subagent:slash:cancel",a=250,t=4,H=2,T=40,e=["list","get","models","create","update","delete","eject","disable","enable","reset","status","interrupt","resume","steer","append-step","doctor","schedule","schedule-list","schedule-status","schedule-cancel"],w="You are a delegated subagent running from a fork of the parent session. Treat the inherited conversation as reference-only context, not a live thread to continue. Do not continue or answer prior messages as if they are waiting for a reply. Your sole job is to execute the task below and return a focused result for that task using your tools.";function I(j){let q=typeof j==="number"?j:typeof j==="string"?Number(j):NaN;if(!Number.isInteger(q)||q<1)return;return q}function jj(j){return I(j)??_}function qj(j,q){return I(j)??I(q)??A}function Cj(j){return Q.join(B,`async-cfg-${j}.json`)}function Jj(j,q){if(q===!1)return j;let K=`${q??w}
|
|
2
|
+
|
|
3
|
+
Task:
|
|
4
|
+
`;if(j.startsWith(K))return j;return`${K}${j}`}function L(j){let q=typeof j==="number"?j:typeof j==="string"?Number(j):NaN;if(!Number.isInteger(q)||q<0)return;return q}function $(j){return L(j)}function N(j){return $(process.env.DM_SUBAGENT_MAX_DEPTH)??$(j)??H}function Kj(j,q){let J=$(j)??H,K=$(q);return K===void 0?J:Math.min(J,K)}function Qj(j){let q=Number(process.env.DM_SUBAGENT_DEPTH??"0"),J=N(j);return{blocked:Number.isFinite(q)&&q>=J,depth:q,maxDepth:J}}function Yj(j){let q=Number(process.env.DM_SUBAGENT_DEPTH??"0"),J=Number.isFinite(q)?q+1:1;return{DM_SUBAGENT_DEPTH:String(J),DM_SUBAGENT_MAX_DEPTH:String($(j)??N())}}function U(j){return L(j)}function Zj(j){return U(process.env.DM_SUBAGENT_MAX_SPAWNS_PER_SESSION)??U(j)??T}function V(j){if(j<1024)return`${j}B`;if(j<1048576)return`${(j/1024).toFixed(1)}KB`;return`${(j/1048576).toFixed(1)}MB`}function $j(j,q,J){let K=j.split(`
|
|
5
|
+
`),Y=Buffer.byteLength(j,"utf-8");if(Y<=q.bytes&&K.length<=q.lines)return{text:j,truncated:!1};let F=K;if(K.length>q.lines)F=K.slice(0,q.lines);let C=F.join(`
|
|
6
|
+
`);if(Buffer.byteLength(C,"utf-8")>q.bytes){let G=0,W=C.length;while(G<W){let X=Math.floor((G+W+1)/2);if(Buffer.byteLength(C.slice(0,X),"utf-8")<=q.bytes)G=X;else W=X-1}C=C.slice(0,G)}return{text:`[TRUNCATED: showing first ${C.split(`
|
|
7
|
+
`).length} of ${K.length} lines, ${V(Buffer.byteLength(C))} of ${V(Y)}${J?` - full output at ${J}`:""}]
|
|
8
|
+
`+C,truncated:!0,originalBytes:Y,originalLines:K.length,artifactPath:J}}export{Jj as wrapForkTask,$j as truncateOutput,jj as resolveTopLevelParallelMaxTasks,qj as resolveTopLevelParallelConcurrency,E as resolveTempScopeId,Zj as resolveMaxSubagentSpawnsPerSession,N as resolveCurrentMaxSubagentDepth,Kj as resolveChildMaxSubagentDepth,U as normalizeMaxSubagentSpawnsPerSession,$ as normalizeMaxSubagentDepth,Yj as getSubagentDepthEnv,Cj as getAsyncConfigPath,Qj as checkSubagentDepth,r as WIDGET_KEY,B as TEMP_ROOT_DIR,f as TEMP_ARTIFACTS_DIR,x as SUBAGENT_RESULT_INTERCOM_EVENT,d as SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT,k as SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,b as SUBAGENT_CONTROL_INTERCOM_EVENT,S as SUBAGENT_CONTROL_EVENT,y as SUBAGENT_ASYNC_STARTED_EVENT,D as SUBAGENT_ASYNC_COMPLETE_EVENT,e as SUBAGENT_ACTIONS,l as SLASH_TEXT_RESULT_TYPE,i as SLASH_SUBAGENT_UPDATE_EVENT,s as SLASH_SUBAGENT_STARTED_EVENT,n as SLASH_SUBAGENT_RESPONSE_EVENT,p as SLASH_SUBAGENT_REQUEST_EVENT,o as SLASH_SUBAGENT_CANCEL_EVENT,u as SLASH_RESULT_TYPE,v as RESULTS_DIR,a as POLL_INTERVAL_MS,t as MAX_WIDGET_JOBS,A as MAX_CONCURRENCY,P as INTERCOM_DETACH_RESPONSE_EVENT,M as INTERCOM_DETACH_REQUEST_EVENT,H as DEFAULT_SUBAGENT_MAX_DEPTH,T as DEFAULT_MAX_SUBAGENT_SPAWNS_PER_SESSION,m as DEFAULT_MAX_OUTPUT,w as DEFAULT_FORK_PREAMBLE,h as DEFAULT_ARTIFACT_CONFIG,c as CHAIN_RUNS_DIR,g as ASYNC_DIR};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as U from"node:fs";import*as z from"node:os";import*as G from"node:path";import*as j from"node:os";import*as _ from"node:path";function L(Q){return Q.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function x(Q){let Y=Q?.env??process.env,Z=Q&&Object.hasOwn(Q,"getuid")?Q.getuid:process.getuid?.bind(process);if(typeof Z==="function")return`uid-${Z()}`;for(let J of["USERNAME","USER","LOGNAME"]){let X=Y[J];if(X)return`user-${L(X)}`}let $=Q&&Object.hasOwn(Q,"userInfo")?Q.userInfo:j.userInfo;try{let J=$?.().username;if(J)return`user-${L(J)}`}catch{}let W=Y.USERPROFILE??Y.HOME;if(W)return`home-${L(W)}`;let B=Q&&Object.hasOwn(Q,"homedir")?Q.homedir:j.homedir;try{let J=B?.();if(J)return`home-${L(J)}`}catch{}return"shared"}var A=_.join(j.tmpdir(),`dm-subagents-${x()}`),i=_.join(A,"async-subagent-results"),r=_.join(A,"async-subagent-runs"),y=_.join(A,"chain-runs"),a=_.join(A,"artifacts");async function v(Q,Y,Z,$){let W=Math.max(1,Math.floor(Y)||1),B=Array(Q.length),J=0;async function X(q){while(J<Q.length){let V=J++;if($){await $.acquire();try{B[V]=await Z(Q[V],V)}finally{$.release()}}else B[V]=await Z(Q[V],V)}}return await Promise.all(Array.from({length:Math.min(W,Q.length)},(q,V)=>X(V))),B}function F(Q,Y,Z=!1){switch(Q){case"bash":{let $=typeof Y.command==="string"?Y.command:"",W=Z?240:60;return`$ ${$.slice(0,W)}${$.length>W?"...":""}`}case"read":case"write":case"edit":{let $=typeof Y.path==="string"?Y.path:typeof Y.file_path==="string"?Y.file_path:"";return`${Q} ${P($)}`}default:{let $=JSON.stringify(Y),W=Z?160:40;return`${Q} ${$.slice(0,W)}${$.length>W?"...":""}`}}}function P(Q){let Y=process.env.HOME;if(Y&&Q.startsWith(Y))return`~${Q.slice(Y.length)}`;return Q}var f=".dm",k="@duckmind/dm-coding-agent",m="DM_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";function C(Q){return typeof Q==="string"&&Q.trim()?Q:void 0}function N(Q){if(!Q)return;try{let Y=JSON.parse(U.readFileSync(G.join(Q,"package.json"),"utf-8"));if(Y.name!==k)return;return C(Y.piConfig?.configDir)}catch{return}}function h(Q=process.argv[1],Y=process.env[m]){let Z=N(Y);if(Z)return Z;if(!Q)return;try{let $=G.dirname(U.realpathSync(Q));while($!==G.dirname($)){let W=N($);if(W)return W;$=G.dirname($)}}catch{}return}function c(Q,Y,Z){return(Q&&typeof Q==="object"?C(Q.CONFIG_DIR_NAME):void 0)??h(Y,Z)??f}function b(){return c()}function S(Q){return G.join(Q,b())}function D(){let Q=process.env.DM_CODING_AGENT_DIR;if(Q==="~")return z.homedir();if(Q?.startsWith("~/"))return G.join(z.homedir(),Q.slice(2));return Q||G.join(z.homedir(),b(),"agent")}var H=new Map;function M(Q){return Q instanceof Error?Q.message:String(Q)}function _Q(Q,Y){if(!Y)return Q;return G.isAbsolute(Y)?Y:G.resolve(Q,Y)}function I(Q){return typeof Q==="object"&&Q!==null&&"code"in Q&&Q.code==="ENOENT"}function HQ(Q){let Y=G.join(Q,"status.json"),Z;try{Z=U.statSync(Y)}catch(J){if(I(J))return null;throw Error(`Failed to inspect async status file '${Y}': ${M(J)}`,{cause:J instanceof Error?J:void 0})}let $=H.get(Y);if($&&$.mtime===Z.mtimeMs)return $.status;let W;try{W=U.readFileSync(Y,"utf-8")}catch(J){if(I(J))return null;throw Error(`Failed to read async status file '${Y}': ${M(J)}`,{cause:J instanceof Error?J:void 0})}let B;try{B=JSON.parse(W)}catch(J){throw Error(`Failed to parse async status file '${Y}': ${M(J)}`,{cause:J instanceof Error?J:void 0})}if(H.set(Y,{mtime:Z.mtimeMs,status:B}),H.size>50){let J=H.keys().next().value;if(J)H.delete(J)}return B}function zQ(Q){if(!Q)return"";try{let Y=U.statSync(Q),Z=Date.now()-Y.mtimeMs;if(Z<1000)return"active now";if(Z<60000)return`active ${Math.floor(Z/1000)}s ago`;return`active ${Math.floor(Z/60000)}m ago`}catch{return""}}function LQ(Q){if(!U.existsSync(Q))return null;let Y=U.readdirSync(Q).filter((Z)=>Z.endsWith(".jsonl")).map((Z)=>{let $=G.join(Q,Z);return{path:$,mtime:U.statSync($).mtimeMs}}).sort((Z,$)=>$.mtime-Z.mtime);return Y.length>0?Y[0].path:null}function g(Q){let Y=[];for(let Z=Q.length-1;Z>=0;Z--){let $=Q[Z];if($.role!=="assistant")continue;if("errorMessage"in $&&typeof $.errorMessage==="string"&&$.errorMessage.length>0||"stopReason"in $&&$.stopReason==="error")continue;for(let B=$.content.length-1;B>=0;B--){let J=$.content[B];if(J.type!=="text"||J.text.trim().length===0)continue;if(Y.push(J.text),/```acceptance-report\s*\n[\s\S]*?```/i.test(J.text))return J.text;for(let X of J.text.matchAll(/```(?:json|jsonc|json5)\s*\n([\s\S]*?)```/gi)){let q=X[1]??"";if(/"criteriaSatisfied"/.test(q)&&/"(?:changedFiles|testsAddedOrUpdated|commandsRun|validationOutput|residualRisks|noStagedFiles|diffSummary|reviewFindings|manualNotes)"/.test(q))return J.text}if(/ACCEPTANCE_REPORT\s*:/i.test(J.text))return J.text}}return Y[0]??""}function AQ(Q){return Q.finalOutput??g(Q.messages??[])}function EQ(Q){if(!Q||Q.length===0)return[];let Y=[];for(let Z of Q)if(Z.role==="assistant"){for(let $ of Z.content)if($.type==="text")Y.push({type:"text",text:$.text});else if($.type==="toolCall")Y.push({type:"tool",name:$.name,args:$.arguments})}return Y}function u(Q){if(Q.status==="running")return Q;return{index:Q.index,agent:Q.agent,status:Q.status,activityState:Q.activityState,task:Q.task,skills:Q.skills,toolCount:Q.toolCount,tokens:Q.tokens,durationMs:Q.durationMs,error:Q.error,failedTool:Q.failedTool,recentTools:[],recentOutput:[]}}function d(Q){if(!Q?.length)return[];let Y=[];for(let Z of Q){if(Z.role!=="assistant")continue;for(let $ of Z.content){if($.type!=="toolCall")continue;let W=typeof $.arguments==="object"&&$.arguments!==null&&!Array.isArray($.arguments)?$.arguments:{};Y.push({text:F($.name,W),expandedText:F($.name,W,!0)})}}return Y}function FQ(Q){let Y={input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0};for(let Z of Q)Y.input+=Z.usage.input,Y.output+=Z.usage.output,Y.cacheRead+=Z.usage.cacheRead,Y.cacheWrite+=Z.usage.cacheWrite,Y.cost+=Z.usage.cost,Y.turns+=Z.usage.turns;return Y}function T(Q,Y){for(let Z of Y??[]){if(Z.totalCost){Q.inputTokens+=Z.totalCost.inputTokens,Q.outputTokens+=Z.totalCost.outputTokens,Q.costUsd+=Z.totalCost.costUsd;continue}T(Q,Z.children);for(let $ of Z.steps??[])T(Q,$.children)}}function MQ(Q){let Y={inputTokens:0,outputTokens:0,costUsd:0};for(let Z of Q)Y.inputTokens+=Z.usage.input,Y.outputTokens+=Z.usage.output,Y.costUsd+=Z.usage.cost,T(Y,Z.children);return Y}function p(Q){if(Q.progress?.status==="running")return Q;let Y=Q.toolCalls?.length?Q.toolCalls:d(Q.messages);return{...Q,messages:void 0,progress:void 0,toolCalls:Y.length?Y:void 0}}function TQ(Q){return{...Q,results:Q.results.map(p),progress:Q.progress?Q.progress.map(u):void 0}}function OQ(Q){let Y=-1;for(let $=Q.length-1;$>=0;$--){let W=Q[$];if(W.role==="assistant"){if(Array.isArray(W.content)&&W.content.some((J)=>J.type==="text"&&("text"in J)&&typeof J.text==="string"&&J.text.trim().length>0)){Y=$;break}}}let Z=Y>=0?Y+1:0;for(let $=Q.length-1;$>=Z;$--){let W=Q[$];if(W.role!=="toolResult")continue;let B="toolName"in W&&typeof W.toolName==="string"?W.toolName:void 0;if("isError"in W&&W.isError===!0){let K=W.content.find((w)=>w.type==="text"),O=K&&"text"in K?K.text:void 0,R=O?.match(/exit(?:ed)?\s*(?:with\s*)?(?:code|status)?\s*[:\s]?\s*(\d+)/i);return{hasError:!0,exitCode:R?parseInt(R[1],10):1,errorType:B||"tool",details:O?.slice(0,200)}}if(B!=="bash")continue;let X=W.content.find((K)=>K.type==="text");if(!X||!("text"in X))continue;let q=X.text,V=q.match(/exit(?:ed)?\s*(?:with\s*)?(?:code|status)?\s*[:\s]?\s*(\d+)/i);if(V){let K=parseInt(V[1],10);if(K!==0)return{hasError:!0,exitCode:K,errorType:"bash",details:q.slice(0,200)}}let E=[/command not found/i,/permission denied/i,/no such file or directory/i,/segmentation fault/i,/killed|terminated/i,/out of memory/i,/connection refused/i,/timeout/i];for(let K of E)if(K.test(q))return{hasError:!0,exitCode:1,errorType:"bash",details:q.slice(0,200)}}return{hasError:!1}}function RQ(Q){let Y=(X,q)=>X.length>q?`${X.slice(0,q-3)}...`:X,Z=(X)=>{if(typeof X==="string"&&X.trim().length>0)return X;if(typeof X==="number"||typeof X==="boolean")return String(X);return},$=(X)=>{if(!Array.isArray(X)||X.length===0)return;let q=Z(X[0]);if(!q)return;let V=X.length>1?` (+${X.length-1} more)`:"";return`${q}${V}`};if(Q.tool&&typeof Q.tool==="string"){let X=Q.server&&typeof Q.server==="string"?`${Q.server}/`:"",q=Q.args&&typeof Q.args==="string"?` ${Q.args.slice(0,40)}`:"";return`${X}${Q.tool}${q}`}let W=$(Q.queries);if(W)return Y(W,60);if(typeof Q.query==="string"&&Q.query.trim().length>0)return Y(Q.query,60);if(typeof Q.workflow==="string"&&Q.workflow.trim().length>0)return`workflow=${Y(Q.workflow,48)}`;if(typeof Q.url==="string"&&Q.url.trim().length>0)return Y(Q.url,60);let B=$(Q.urls);if(B)return Y(B,60);if(typeof Q.prompt==="string"&&Q.prompt.trim().length>0)return Y(Q.prompt,60);let J=["command","path","file_path","pattern","query","url","task","describe","search"];for(let X of J)if(Q[X]&&typeof Q[X]==="string"){let q=Q[X];return Y(q,60)}for(let[X,q]of Object.entries(Q)){let V=$(q);if(V)return`${X}=${Y(V,50)}`;if(typeof q==="string"&&q.length>0){let E=Y(q,50);return`${X}=${E}`}}return""}function n(Q){if(!Q)return"";if(typeof Q==="string")return Q;if(!Array.isArray(Q))return"";let Y=[];for(let Z of Q)if(Z&&typeof Z==="object"){if("type"in Z&&Z.type==="text"&&"text"in Z)Y.push(String(Z.text));else if("type"in Z&&Z.type==="tool_result"&&"content"in Z){let $=n(Z.content);if($)Y.push($)}else if("text"in Z)Y.push(String(Z.text))}return Y.join(`
|
|
2
|
+
`)}export{FQ as sumResultsUsage,MQ as sumResultsCost,c as resolveConfigDirName,_Q as resolveChildCwd,HQ as readStatus,v as mapConcurrent,AQ as getSingleResultOutput,S as getProjectConfigDir,zQ as getLastActivity,g as getFinalOutput,EQ as getDisplayItems,b as getConfigDirName,D as getAgentDir,LQ as findLatestSessionFile,RQ as extractToolArgsPreview,n as extractTextFromContent,OQ as detectSubagentError,p as compactForegroundResult,TQ as compactForegroundDetails,m as PI_CODING_AGENT_PACKAGE_ROOT_ENV};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var N="prompt-template:subagent:request",S="prompt-template:subagent:started",h="prompt-template:subagent:response",C="prompt-template:subagent:update",D="prompt-template:subagent:cancel";function b(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(!t||typeof t!=="object")return[];let s=t;if(typeof s.agent!=="string"||!s.agent.trim())return[];if(typeof s.task!=="string"||!s.task.trim())return[];let i=typeof s.model==="string"&&s.model.trim().length>0?s.model:void 0,o=typeof s.cwd==="string"&&s.cwd.trim().length>0?s.cwd:void 0;e.push({agent:s.agent,task:s.task,...i?{model:i}:{},...o?{cwd:o}:{}})}return e}function O(n){if(!n||typeof n!=="object")return;let e=n;if(typeof e.requestId!=="string"||!e.requestId)return;if(typeof e.model!=="string"||!e.model)return;if(typeof e.cwd!=="string"||!e.cwd)return;if(e.context!=="fresh"&&e.context!=="fork")return;let t=b(e.tasks),s=e.worktree===!0?!0:void 0,i=typeof e.agent==="string"&&e.agent.length>0&&typeof e.task==="string"&&e.task.length>0;if(!i&&t.length===0)return;let o=t[0];return{requestId:e.requestId,agent:i?e.agent:o.agent,task:i?e.task:o.task,...t.length>0?{tasks:t}:{},context:e.context,model:e.model,cwd:e.cwd,...s?{worktree:s}:{}}}function R(n){if(!Array.isArray(n))return;for(let e of n){if(!e||typeof e!=="object")continue;if(e.type!=="text")continue;let t=e.text;if(typeof t==="string"&&t.trim())return t.trim()}return}function E(n){if(!n||n.length===0)return;let e=n.filter((t)=>typeof t==="string"&&t.trim()&&t.trim()!=="(running...)");if(e.length===0)return;return e}function P(n){if(!n||n.length===0)return;let e=n.flatMap((t)=>{if(typeof t.tool!=="string"||t.tool.trim().length===0)return[];return[{tool:t.tool,args:typeof t.args==="string"?t.args:String(t.args??"")}]});return e.length>0?e:void 0}function x(n,e){let t=n.details?.results;if(!t||t.length===0)return;if(typeof e.index==="number"&&e.index>=0){let i=t[e.index];if(typeof i?.model==="string")return i.model}if(e.agent){let i=t.find((o)=>o.agent===e.agent&&typeof o.model==="string");if(i?.model)return i.model}return t.find((i)=>typeof i.model==="string")?.model}function M(n){let e=typeof n.expandedText==="string"&&n.expandedText.trim().length>0?n.expandedText.trim():typeof n.text==="string"?n.text.trim():"";if(!e)return;if(e.startsWith("$ "))return"bash";return e.match(/^[A-Za-z_][\w.-]*/)?.[0]}function A(n,e){if(Array.isArray(n.messages)&&n.messages.length>0)return n.messages;let t=(n.toolCalls??[]).flatMap((o)=>{let r=M(o);return r?[{type:"toolCall",name:r,arguments:{summary:o.expandedText??o.text??""}}]:[]}),s=typeof n.finalOutput==="string"&&n.finalOutput.trim().length>0?n.finalOutput.trim():e,i=[...t,...s?[{type:"text",text:s}]:[]];if(i.length===0)return[];return[{role:"assistant",content:i}]}function w(n,e){let t=e.details?.progress?.[0],s=e.details?.progress?.map((r)=>{let a=r.recentOutput?.[r.recentOutput.length-1],d=typeof a==="string"&&a.trim()&&a!=="(running...)"?a:void 0;return{index:r.index,agent:r.agent??"delegate",status:r.status,currentTool:r.currentTool,currentToolArgs:r.currentToolArgs,recentOutput:d,recentOutputLines:E(r.recentOutput),recentTools:P(r.recentTools),model:x(e,r),toolCount:r.toolCount,durationMs:r.durationMs,tokens:r.tokens}});if(!t&&(!s||s.length===0))return;let i=t?.recentOutput?.[t.recentOutput.length-1],o=typeof i==="string"&&i.trim()&&i!=="(running...)"?i:void 0;return{requestId:n,currentTool:t?.currentTool,currentToolArgs:t?.currentToolArgs,recentOutput:o,recentOutputLines:E(t?.recentOutput),recentTools:P(t?.recentTools),model:t?x(e,t):void 0,toolCount:t?.toolCount,durationMs:t?.durationMs,tokens:t?.tokens,taskProgress:s}}function y(n){let e=new Map,t=new Set,s=[],i=(o,r)=>{let a=n.events.on(o,r);if(typeof a==="function")s.push(a)};return i("prompt-template:subagent:cancel",(o)=>{if(!o||typeof o!=="object")return;let r=o.requestId;if(typeof r!=="string")return;let a=e.get(r);if(a){a.abort();return}t.add(r)}),i("prompt-template:subagent:request",async(o)=>{let r=O(o);if(!r)return;let a=n.getContext();if(!a){let u={...r,messages:[],isError:!0,errorText:"No active extension context for delegated subagent execution."};n.events.emit("prompt-template:subagent:response",u);return}let d=new AbortController;if(e.set(r.requestId,d),t.delete(r.requestId)){d.abort();let u={...r,messages:[],isError:!0,errorText:"Delegated prompt cancelled."};n.events.emit("prompt-template:subagent:response",u),e.delete(r.requestId);return}n.events.emit("prompt-template:subagent:started",{requestId:r.requestId});try{let u=await n.execute(r.requestId,r,d.signal,a,(p)=>{let c=w(r.requestId,p);if(!c)return;n.events.emit("prompt-template:subagent:update",c)}),l=R(u.content),k=A(u.details?.results?.[0]??{},l),T=r.tasks?r.tasks.map((p,c)=>{let g=u.details?.results?.[c];if(!g)return{agent:p.agent,messages:[],isError:!0,errorText:"Missing result for delegated parallel task."};let f=typeof g.exitCode==="number"?g.exitCode:void 0,m=g.error;return{agent:g.agent??p.agent,messages:A(g),isError:f!==void 0&&f!==0||!!m,errorText:m||void 0}}):void 0,_={...r,messages:k,...T?{parallelResults:T}:{},...l?{contentText:l}:{},isError:u.isError===!0,errorText:u.isError?l:void 0};n.events.emit("prompt-template:subagent:response",_)}catch(u){let l={...r,messages:[],isError:!0,errorText:u instanceof Error?u.message:String(u)};n.events.emit("prompt-template:subagent:response",l)}finally{e.delete(r.requestId)}}),{cancelAll:()=>{for(let o of e.values())o.abort();e.clear(),t.clear()},dispose:()=>{for(let o of s)o();s.length=0,t.clear()}}}export{y as registerPromptTemplateDelegationBridge,C as PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT,S as PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT,h as PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT,N as PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT,D as PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import*as N from"node:fs";import*as K from"node:path";import{fileURLToPath as t}from"node:url";function f(W){return W.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function S(W){let Q={},$=W.replace(/\r\n/g,`
|
|
2
|
+
`);if(!$.startsWith("---"))return{frontmatter:Q,body:$};let Y=$.indexOf(`
|
|
3
|
+
---`,3);if(Y===-1)return{frontmatter:Q,body:$};let Z=$.slice(4,Y),J=$.slice(Y+4).trim(),X=Z.split(`
|
|
4
|
+
`),U=null,q=null,V=null;for(let j of X){let H=j.search(/\S|$/),_=j.trim();if(U!==null&&q!==null&&H>(V??0)){q.push(j);continue}if(U!==null&&q!==null){let G=q.join(`
|
|
5
|
+
`),b=G.match(/^([ \t]+)/m)?.[1]??"",g=b?G.replace(new RegExp(`^${f(b)}`,"gm"),"").replace(/^\n/,""):G;Q[U]=g,U=null,q=null,V=null}let A=j.match(/^([\w-]+):\s*(.*)$/);if(A){let G=A[2].trim();if(G.startsWith('"')&&G.endsWith('"')||G.startsWith("'")&&G.endsWith("'"))G=G.slice(1,-1);if(G==="")U=A[1],q=[],V=H;else Q[A[1]]=G}}if(U!==null&&q!==null){let j=q.join(`
|
|
6
|
+
`),_=j.match(/^([ \t]+)/m)?.[1]??"",A=_?j.replace(new RegExp(`^${f(_)}`,"gm"),"").replace(/^\n/,""):j;Q[U]=A}return{frontmatter:Q,body:J}}import*as B from"node:fs";import*as T from"node:os";import*as E from"node:path";import*as M from"node:os";import*as F from"node:path";function z(W){return W.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function u(W){let Q=W?.env??process.env,$=W&&Object.hasOwn(W,"getuid")?W.getuid:process.getuid?.bind(process);if(typeof $==="function")return`uid-${$()}`;for(let X of["USERNAME","USER","LOGNAME"]){let U=Q[X];if(U)return`user-${z(U)}`}let Y=W&&Object.hasOwn(W,"userInfo")?W.userInfo:M.userInfo;try{let X=Y?.().username;if(X)return`user-${z(X)}`}catch{}let Z=Q.USERPROFILE??Q.HOME;if(Z)return`home-${z(Z)}`;let J=W&&Object.hasOwn(W,"homedir")?W.homedir:M.homedir;try{let X=J?.();if(X)return`home-${z(X)}`}catch{}return"shared"}var O=F.join(M.tmpdir(),`dm-subagents-${u()}`),GW=F.join(O,"async-subagent-results"),BW=F.join(O,"async-subagent-runs"),p=F.join(O,"chain-runs"),EW=F.join(O,"artifacts");var d=".dm",o="@duckmind/dm-coding-agent",r="DM_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";function D(W){return typeof W==="string"&&W.trim()?W:void 0}function y(W){if(!W)return;try{let Q=JSON.parse(B.readFileSync(E.join(W,"package.json"),"utf-8"));if(Q.name!==o)return;return D(Q.piConfig?.configDir)}catch{return}}function l(W=process.argv[1],Q=process.env[r]){let $=y(Q);if($)return $;if(!W)return;try{let Y=E.dirname(B.realpathSync(W));while(Y!==E.dirname(Y)){let Z=y(Y);if(Z)return Z;Y=E.dirname(Y)}}catch{}return}function i(W,Q,$){return(W&&typeof W==="object"?D(W.CONFIG_DIR_NAME):void 0)??l(Q,$)??d}function x(){return i()}function w(W){return E.join(W,x())}function C(){let W=process.env.DM_CODING_AGENT_DIR;if(W==="~")return T.homedir();if(W?.startsWith("~/"))return E.join(T.homedir(),W.slice(2));return W||E.join(T.homedir(),x(),"agent")}var a=new Set(["chain-prompts","prompt-workflow","run","chain","parallel","run-chain","subagents-doctor","subagents-models"]);function s(){return K.resolve(K.dirname(t(import.meta.url)),"..","..","prompts")}function e(W){return[s(),K.join(C(),"prompts"),K.join(w(W),"prompts")]}function WW(W){let Q=[];for(let $ of e(W)){let Y;try{Y=N.readdirSync($,{withFileTypes:!0})}catch{continue}for(let Z of Y)if(Z.isFile()&&Z.name.endsWith(".md"))Q.push(K.join($,Z.name))}return Q}function $W(W){return W.split(/\r?\n/).map((Q)=>Q.trim()).find(Boolean)??"Prompt workflow"}function L(W,Q){let $=W[Q]?.trim();return $?$:void 0}function R(W,Q){let $=W[Q]?.trim().toLowerCase();if($==="true"||$==="yes"||$==="1")return!0;if($==="false"||$==="no"||$==="0")return!1;return}function QW(W){if(!W)return;if(W==="false")return!1;let Q=W.split(",").map(($)=>$.trim()).filter(Boolean);return Q.length>1?Q:Q[0]}function YW(W){let Q=L(W,"subagent");if(!Q||Q==="true")return"delegate";return Q}function ZW(W){let Q=N.readFileSync(W,"utf-8"),{frontmatter:$,body:Y}=S(Q),Z=K.basename(W,".md");if(!Z||a.has(Z))return;let J=L($,"model"),X=QW(L($,"skill")),U=L($,"cwd"),q=L($,"chain");return{name:Z,description:L($,"description")??$W(Y),body:Y,filePath:W,agent:YW($),...R($,"inheritContext")===!0||R($,"fork")===!0?{context:"fork"}:{},...R($,"fresh")===!0?{context:"fresh"}:{},...J?{model:J}:{},...X!==void 0?{skill:X}:{},...U?{cwd:U}:{},...R($,"worktree")===!0?{worktree:!0}:{},...q?{chain:q}:{}}}function P(W){let Q=new Map;for(let $ of WW(W)){let Y=ZW($);if(Y)Q.set(Y.name,Y)}return[...Q.values()].sort(($,Y)=>$.name.localeCompare(Y.name))}function v(W){let Q=[],$="",Y,Z=!1;for(let J of W){if(Z){$+=J,Z=!1;continue}if(J==="\\"){Z=!0;continue}if(Y){if(J===Y)Y=void 0;else $+=J;continue}if(J==="'"||J==='"'){Y=J;continue}if(/\s/.test(J)){if($)Q.push($),$="";continue}$+=J}if($)Q.push($);return Q}function qW(W,Q){let $=Q.join(" ");return W.replace(/\$ARGUMENTS/g,$).replace(/\$@/g,$).replace(/\$\{(\d+):-([^}]*)\}/g,(Y,Z,J)=>Q[Number(Z)-1]||J).replace(/\$(\d+)/g,(Y,Z)=>Q[Number(Z)-1]??"")}function m(W){let Q=[],$,Y=!1,Z=!1,J=!1,X=!1;for(let U=0;U<W.length;U++){let q=W[U];if(q==="--fork"){Y=!0;continue}if(q==="--fresh"){Z=!0;continue}if(q==="--worktree"){J=!0;continue}if(q==="--bg"||q==="--async"){X=!0;continue}if(q==="--subagent"){$=W[++U];continue}let V=q.match(/^--subagent(?:=|:)(.+)$/);if(V){$=V[1];continue}Q.push(q)}return{args:Q,agentOverride:$,fork:Y,fresh:Z,worktree:J,bg:X}}function JW(W){let Q=W.indexOf(" -- ");if(Q===-1)return{declaration:W.trim(),argsText:""};return{declaration:W.slice(0,Q).trim(),argsText:W.slice(Q+4).trim()}}function k(W){return W.split(" -> ").map((Q)=>Q.trim()).filter(Boolean)}function n(W,Q,$){let Y=qW(W.body,Q).trim(),Z=$.fork?"fork":$.fresh?"fresh":W.context;return{agent:$.agentOverride??W.agent,task:Y,clarify:!1,agentScope:"both",...Z?{context:Z}:{},...W.model?{model:W.model}:{},...W.skill!==void 0?{skill:W.skill}:{},...W.cwd?{cwd:W.cwd}:{},...$.worktree||W.worktree?{worktree:!0}:{},...$.bg?{async:!0}:{}}}function h(W,Q,$){let Y=n(W,Q,$);return{agent:Y.agent??"delegate",task:Y.task,...Y.model?{model:Y.model}:{},...Y.skill!==void 0?{skill:Y.skill}:{},...Y.cwd?{cwd:Y.cwd}:{}}}function I(W,Q){return W.find(($)=>$.name===Q)}function c(W){if(W.length===0)return"No prompt workflows found in package, user, or project prompts.";return["Prompt workflows:",...W.map((Q)=>`- ${Q.name}: ${Q.description} (${Q.filePath})`)].join(`
|
|
7
|
+
`)}function kW(W){let{pi:Q,run:$}=W;Q.registerCommand("prompt-workflow",{description:"Run a prompt template through native dm-subagents: /prompt-workflow <name> [args]",handler:async(Y,Z)=>{let J=v(Y),X=J.shift(),U=P(Z.cwd);if(!X||X==="list"){Q.sendMessage({content:c(U),display:!0});return}let q=I(U,X);if(!q){Z.ui.notify(`Unknown prompt workflow: ${X}`,"error");return}let V=m(J);try{if(q.chain){let H=k(q.chain).map((_)=>{let A=I(U,_);if(!A)throw Error(`Unknown prompt workflow in chain '${q.name}': ${_}`);return h(A,V.args,V)});await $({chain:H,task:V.args.join(" "),clarify:!1,agentScope:"both",...V.bg?{async:!0}:{}},Z);return}await $(n(q,V.args,V),Z)}catch(j){Z.ui.notify(j instanceof Error?j.message:String(j),"error")}}}),Q.registerCommand("chain-prompts",{description:"Run prompt templates as a native subagent chain: /chain-prompts analyze -> fix -- args",handler:async(Y,Z)=>{let{declaration:J,argsText:X}=JW(Y),U=P(Z.cwd);if(!J||J==="list"){Q.sendMessage({content:c(U),display:!0});return}let q=m(v(X)),V=k(J);if(V.length===0){Z.ui.notify("Usage: /chain-prompts prompt-a -> prompt-b -- args","error");return}try{let j=V.map((H)=>{let _=I(U,H);if(!_)throw Error(`Unknown prompt workflow: ${H}`);return h(_,q.args,q)});await $({chain:j,task:q.args.join(" "),clarify:!1,agentScope:"both",...q.bg?{async:!0}:{}},Z)}catch(j){Z.ui.notify(j instanceof Error?j.message:String(j),"error")}}})}export{kW as registerPromptWorkflowCommands,P as discoverPromptWorkflows};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as Q from"node:os";import*as W from"node:path";function R(j){return j.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function D(j){let $=j?.env??process.env,F=j&&Object.hasOwn(j,"getuid")?j.getuid:process.getuid?.bind(process);if(typeof F==="function")return`uid-${F()}`;for(let K of["USERNAME","USER","LOGNAME"]){let J=$[K];if(J)return`user-${R(J)}`}let X=j&&Object.hasOwn(j,"userInfo")?j.userInfo:Q.userInfo;try{let K=X?.().username;if(K)return`user-${R(K)}`}catch{}let C=$.USERPROFILE??$.HOME;if(C)return`home-${R(C)}`;let Y=j&&Object.hasOwn(j,"homedir")?j.homedir:Q.homedir;try{let K=Y?.();if(K)return`home-${R(K)}`}catch{}return"shared"}var w=W.join(Q.tmpdir(),`dm-subagents-${D()}`),q=W.join(w,"async-subagent-results"),x=W.join(w,"async-subagent-runs"),N=W.join(w,"chain-runs"),A=W.join(w,"artifacts");var M="subagent:slash:request",L="subagent:slash:started",O="subagent:slash:response",U="subagent:slash:update",y="subagent:slash:cancel";function m(j){let $=new Map,F=new Set,X=[],C=(Y,K)=>{let J=j.events.on(Y,K);if(typeof J==="function")X.push(J)};return C(y,(Y)=>{if(!Y||typeof Y!=="object")return;let K=Y.requestId;if(typeof K!=="string")return;let J=$.get(K);if(J){J.abort();return}F.add(K)}),C(M,async(Y)=>{if(!Y||typeof Y!=="object")return;let K=Y;if(typeof K.requestId!=="string"||!K.params)return;let{requestId:J,params:I}=K,V=K.ctx??j.getContext();if(!V){let Z={requestId:J,result:{content:[{type:"text",text:"No active extension context for slash subagent execution."}],details:{mode:"single",results:[]}},isError:!0,errorText:"No active extension context."};j.events.emit(O,Z);return}let z=new AbortController;if($.set(J,z),F.delete(J)){z.abort();let Z={requestId:J,result:{content:[{type:"text",text:"Cancelled."}],details:{mode:"single",results:[]}},isError:!0,errorText:"Cancelled before start."};j.events.emit(O,Z),$.delete(J);return}j.events.emit(L,{requestId:J});try{let Z=await j.execute(J,I,z.signal,(G)=>{let k=G.details?.progress,H=k?.[0],P={requestId:J,progress:k,currentTool:H?.currentTool,toolCount:H?.toolCount};j.events.emit(U,P)},V),B={requestId:J,result:Z,isError:Z.isError===!0,errorText:Z.isError?Z.content.find((G)=>G.type==="text")?.text:void 0};j.events.emit(O,B)}catch(Z){let B={requestId:J,result:{content:[{type:"text",text:Z instanceof Error?Z.message:String(Z)}],details:{mode:"single",results:[]}},isError:!0,errorText:Z instanceof Error?Z.message:String(Z)};j.events.emit(O,B)}finally{$.delete(J)}}),{cancelAll:()=>{for(let Y of $.values())Y.abort();$.clear(),F.clear()},dispose:()=>{for(let Y of X)Y();X.length=0,F.clear()}}}export{m as registerSlashSubagentBridge};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import{randomUUID as EB}from"node:crypto";import*as _$ from"node:fs";import*as g from"node:path";import{keyText as IB}from"@duckmind/dm-coding-agent";import{Key as DB,matchesKey as SB}from"@duckmind/dm-tui";import{execSync as qJ}from"node:child_process";import*as F from"node:fs";import*as H$ from"node:os";import*as C from"node:path";import{fileURLToPath as CJ}from"node:url";import*as I from"node:fs";import*as X$ from"node:os";import*as y from"node:path";import*as o from"node:os";import*as l from"node:path";function j$($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function g1($){let J=$?.env??process.env,B=$&&Object.hasOwn($,"getuid")?$.getuid:process.getuid?.bind(process);if(typeof B==="function")return`uid-${B()}`;for(let U of["USERNAME","USER","LOGNAME"]){let X=J[U];if(X)return`user-${j$(X)}`}let W=$&&Object.hasOwn($,"userInfo")?$.userInfo:o.userInfo;try{let U=W?.().username;if(U)return`user-${j$(U)}`}catch{}let Z=J.USERPROFILE??J.HOME;if(Z)return`home-${j$(Z)}`;let Q=$&&Object.hasOwn($,"homedir")?$.homedir:o.homedir;try{let U=Q?.();if(U)return`home-${j$(U)}`}catch{}return"shared"}var N$=l.join(o.tmpdir(),`dm-subagents-${g1()}`),$W=l.join(N$,"async-subagent-results"),JW=l.join(N$,"async-subagent-runs"),u1=l.join(N$,"chain-runs"),BW=l.join(N$,"artifacts");var s="subagent-slash-result",q0="subagent-slash-text-result",C0="subagent:slash:request",_0="subagent:slash:started",A0="subagent:slash:response",j0="subagent:slash:update",N0="subagent:slash:cancel";function i($){return"parallel"in $&&Array.isArray($.parallel)}function d($){return"expand"in $&&"collect"in $&&"parallel"in $&&!Array.isArray($.parallel)}var W$=["off","minimal","low","medium","high","xhigh"];function Z$($){return{provider:$.provider,id:$.id,fullId:`${$.provider}/${$.id}`,reasoning:$.reasoning,thinkingLevelMap:$.thinkingLevelMap}}function Q$($){let J=$.lastIndexOf(":");if(J===-1)return{baseModel:$,thinkingSuffix:""};let B=W$.find((W)=>W===$.substring(J+1));if(!B)return{baseModel:$,thinkingSuffix:""};return{baseModel:$.substring(0,J),thinkingSuffix:`:${B}`}}function O$($,J,B){if(!$||!J||J.length===0)return;let{baseModel:W}=Q$($),Z=J.find((U)=>U.fullId===W);if(Z)return Z;let Q=J.filter((U)=>U.id===W);if(B){let U=Q.find((X)=>X.provider===B);if(U)return U}return Q.length===1?Q[0]:void 0}function O0($){if(!$)return[...W$];if($.reasoning===!1)return["off"];if(!$.thinkingLevelMap)return[...W$];return W$.filter((B)=>{let W=$.thinkingLevelMap?.[B];if(W===null)return!1;if(B==="xhigh")return W!==void 0;return!0})}function U$($){return $<1000?String($):$<1e4?`${($/1000).toFixed(1)}k`:`${Math.round($/1000)}k`}var m1=".dm",c1="@duckmind/dm-coding-agent",d1="DM_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";function F0($){return typeof $==="string"&&$.trim()?$:void 0}function w0($){if(!$)return;try{let J=JSON.parse(I.readFileSync(y.join($,"package.json"),"utf-8"));if(J.name!==c1)return;return F0(J.piConfig?.configDir)}catch{return}}function n1($=process.argv[1],J=process.env[d1]){let B=w0(J);if(B)return B;if(!$)return;try{let W=y.dirname(I.realpathSync($));while(W!==y.dirname(W)){let Z=w0(W);if(Z)return Z;W=y.dirname(W)}}catch{}return}function p1($,J,B){return($&&typeof $==="object"?F0($.CONFIG_DIR_NAME):void 0)??n1(J,B)??m1}function L0(){return p1()}function b($){return y.join($,L0())}function T(){let $=process.env.DM_CODING_AGENT_DIR;if($==="~")return X$.homedir();if($?.startsWith("~/"))return y.join(X$.homedir(),$.slice(2));return $||y.join(X$.homedir(),L0(),"agent")}var o1=/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/;function l1($){let J=$?.trim();if(!J)return;return J.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9.-]/g,"").replace(/-+/g,"-").replace(/\.+/g,".").replace(/(?:^[-.]+|[-.]+$)/g,"")}function a($,J="package"){if($===void 0||$===!1||$==="")return{packageName:void 0};if(typeof $!=="string")return{error:`${J} must be a string or false when provided.`};let B=l1($);if(!B||!o1.test(B))return{error:`${J} is invalid after sanitization.`};return{packageName:B}}function r($,J){let B=J?.trim();return B?`${B}.${$}`:$}var M0=new Set(["name","package","description","tools","model","fallbackModels","thinking","systemPromptMode","inheritProjectContext","inheritSkills","defaultContext","skill","skills","extensions","subagentOnlyExtensions","output","defaultReads","defaultProgress","interactive","maxSubagentDepth","completionGuard","toolBudget","memory"]);function T0($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function t($){let J={},B=$.replace(/\r\n/g,`
|
|
2
|
+
`);if(!B.startsWith("---"))return{frontmatter:J,body:B};let W=B.indexOf(`
|
|
3
|
+
---`,3);if(W===-1)return{frontmatter:J,body:B};let Z=B.slice(4,W),Q=B.slice(W+4).trim(),U=Z.split(`
|
|
4
|
+
`),X=null,G=null,H=null;for(let V of U){let K=V.search(/\S|$/),Y=V.trim();if(X!==null&&G!==null&&K>(H??0)){G.push(V);continue}if(X!==null&&G!==null){let q=G.join(`
|
|
5
|
+
`),j=q.match(/^([ \t]+)/m)?.[1]??"",O=j?q.replace(new RegExp(`^${T0(j)}`,"gm"),"").replace(/^\n/,""):q;J[X]=O,X=null,G=null,H=null}let z=V.match(/^([\w-]+):\s*(.*)$/);if(z){let q=z[2].trim();if(q.startsWith('"')&&q.endsWith('"')||q.startsWith("'")&&q.endsWith("'"))q=q.slice(1,-1);if(q==="")X=z[1],G=[],H=K;else J[z[1]]=q}}if(X!==null&&G!==null){let V=G.join(`
|
|
6
|
+
`),Y=V.match(/^([ \t]+)/m)?.[1]??"",z=Y?V.replace(new RegExp(`^${T0(Y)}`,"gm"),"").replace(/^\n/,""):V;J[X]=z}return{frontmatter:J,body:Q}}import{Compile as MW}from"typebox/compile";function w$($,J="outputSchema"){if(!$||typeof $!=="object"||Array.isArray($))throw Error(`${J} must be a JSON Schema object.`)}class w extends Error{}var i1=/^[A-Za-z_][A-Za-z0-9_]*$/,a1=/^[A-Za-z_][A-Za-z0-9_]*$/,F$=/\{([A-Za-z_][A-Za-z0-9_]*)(?:\.([^{}]+))?\}/g,r1=new Set(["task","previous","chain_dir","outputs"]),D0=new Set(["expand","parallel","collect","concurrency","failFast","phase","label","acceptance"]),t1=new Set([...D0,"effectiveAcceptance","sessionFiles","thinkingOverrides"]),e1=new Set(["from","item","key","maxItems","onEmpty"]),$J=new Set(["output","path"]),S0=new Set(["agent","task","phase","label","outputSchema","cwd","output","outputMode","reads","progress","skill","model","toolBudget","acceptance"]),JJ=new Set([...S0,"outputName","structured","inheritProjectContext","inheritSkills","skills","outputPath","maxSubagentDepth","structuredOutput","structuredOutputSchema","tools","extensions","subagentOnlyExtensions","mcpDirectTools","completionGuard","systemPrompt","systemPromptMode","thinking","modelCandidates","sessionFile","effectiveAcceptance","parentSessionId"]),BJ=new Set(["as","outputSchema"]);function E0($){return i1.test($)}function I0($,J){if($==="")return;if(!$.startsWith("/"))throw new w(`${J} must be a JSON Pointer starting with '/'.`);for(let B of $.slice(1).split("/"))if(/~(?![01])/.test(B))throw new w(`${J} contains invalid JSON Pointer escape.`)}function G$($,J,B){if(!$||typeof $!=="object"||Array.isArray($))throw new w(`${B} must be an object.`);for(let W of Object.keys($))if(!J.has(W))throw new w(`${B} does not support field '${W}'.`)}function WJ($,J,B){for(let W of $.matchAll(/\{([^{}]*)\}/g)){let Z=W[0],Q=W[1];if(Q===J||Q.startsWith(`${J}.`)){if(!F$.test(Z)||Q===`${J}.`||Q.includes(".."))throw new w(`Invalid item reference '${Z}' in ${B}.`);F$.lastIndex=0;continue}F$.lastIndex=0;let U=Q.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];if(U===J)throw new w(`Invalid item reference '${Z}' in ${B}.`);if(U&&r1.has(U))continue;if(U)throw new w(`Unsupported template reference '${Z}' in ${B}.`)}if(F$.lastIndex=0,$.includes(`{${J}.}`)||new RegExp(`\\{${J}(?:\\.|$)[^}]*$`).test($))throw new w(`Invalid item reference in ${B}.`)}function y0($){return!!$&&typeof $==="object"&&!Array.isArray($)&&(Object.prototype.hasOwnProperty.call($,"expand")||Object.prototype.hasOwnProperty.call($,"collect"))}function k0($,J,B={}){let W=`Dynamic chain step ${J+1}`;if(G$($,B.allowRunnerFields?t1:D0,W),!$.expand||!$.expand.from)throw new w(`${W} requires expand.from.`);if(G$($.expand,e1,`${W} expand`),G$($.expand.from,$J,`${W} expand.from`),!E0($.expand.from.output))throw new w(`${W} has invalid expand.from.output '${$.expand.from.output}'.`);if(I0($.expand.from.path,`${W} expand.from.path`),$.expand.key!==void 0)I0($.expand.key,`${W} expand.key`);let Z=$.expand.item??"item";if(!a1.test(Z))throw new w(`${W} has invalid expand.item '${Z}'.`);if($.expand.maxItems===void 0&&B.maxItems===void 0)throw new w(`${W} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);if($.expand.maxItems!==void 0&&(!Number.isInteger($.expand.maxItems)||$.expand.maxItems<0))throw new w(`${W} expand.maxItems must be an integer >= 0.`);if(B.maxItems!==void 0&&(!Number.isInteger(B.maxItems)||B.maxItems<0))throw new w("config.chain.dynamicFanout.maxItems must be an integer >= 0.");if(!$.parallel||Array.isArray($.parallel))throw new w(`${W} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);if(G$($.parallel,B.allowRunnerFields?JJ:S0,`${W} parallel`),"expand"in $.parallel)throw new w(`${W} does not support nested dynamic fanout.`);if(!$.parallel.agent)throw new w(`${W} parallel.agent is required.`);if(!$.collect?.as||!E0($.collect.as))throw new w(`${W} requires collect.as with a safe output name.`);G$($.collect,BJ,`${W} collect`);for(let[Q,U]of[["parallel.task",$.parallel.task],["parallel.label",$.parallel.label]])if(U)WJ(U,Z,`${W} ${Q}`)}var ZJ=/\{outputs\.([^}]*)\}/g,b0=/^[A-Za-z_][A-Za-z0-9_]*$/;class f extends Error{}function f0($){if(i($))return $.parallel.map((B)=>B.as).filter((B)=>Boolean(B));if(d($))return[$.collect.as];let J=$.as;return J?[J]:[]}function QJ($){if(i($))return $.parallel.map((J)=>J.task??"{previous}");if(d($))return[$.parallel.task??"{previous}",$.parallel.label??""].filter(Boolean);return[$.task??"{previous}"]}function P0($,J={}){UJ($,J)}function UJ($,J={},B={}){let W=[...B.priorOutputNames??[]],Z=new Set(W),Q=new Set(W);for(let U=0;U<$.length;U++){let X=(B.startStepIndex??0)+U+1,G=$[U];if(y0(G)){if(!d(G))throw new f(`Dynamic chain step ${X} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);try{k0(G,X-1,J)}catch(H){if(H instanceof w)throw new f(H.message);throw H}if(!Z.has(G.expand.from.output))throw new f(`Dynamic chain step ${X} references unknown output '${G.expand.from.output}'. Named outputs are only available after producing step/group completes.`)}for(let H of f0(G)){if(!b0.test(H))throw new f(`Invalid chain output name '${H}' at step ${X}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);if(Q.has(H))throw new f(`Duplicate chain output name '${H}'. Each as name must be unique.`);Q.add(H)}for(let H of QJ(G))for(let V of H.matchAll(ZJ)){let K=V[0],Y=V[1];if(!b0.test(Y))throw new f(`Invalid chain output reference '${K}' at step ${X}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);if(!Z.has(Y))throw new f(`Unknown chain output reference '${K}' at step ${X}. Named outputs are only available after producing step/group completes.`)}for(let H of f0(G))Z.add(H)}}var x0=new Set(["auto","none","attested","checked","verified","reviewed"]),h0=new Set(["changed-files","tests-added","commands-run","validation-output","residual-risks","no-staged-files","diff-summary","review-findings","manual-notes"]),XJ=new Set(["level","criteria","evidence","verify","review","stopRules","reason"]),GJ=new Set(["id","must","evidence","severity"]),YJ=new Set(["id","command","timeoutMs","cwd","env","allowFailure"]),VJ=new Set(["agent","focus","required"]);function e($,J="acceptance"){let B=[];if($===void 0)return B;if($===!1)return B;if(typeof $==="string"){if(!x0.has($))B.push(`${J} has invalid level '${$}'.`);return B}if(!$||typeof $!=="object"||Array.isArray($))return B.push(`${J} must be a string level, false, or an object.`),B;let W=$;for(let Z of Object.keys(W))if(!XJ.has(Z))B.push(`${J}.${Z} is not supported.`);if(W.level!==void 0&&(typeof W.level!=="string"||!x0.has(W.level)))B.push(`${J}.level must be one of auto, none, attested, checked, verified, reviewed.`);if(W.level==="none"&&(typeof W.reason!=="string"||!W.reason.trim()))B.push(`${J}.reason is required when level is none.`);if(W.reason!==void 0&&typeof W.reason!=="string")B.push(`${J}.reason must be a string.`);if(W.criteria!==void 0&&!Array.isArray(W.criteria))B.push(`${J}.criteria must be an array.`);if(Array.isArray(W.criteria))for(let[Z,Q]of W.criteria.entries()){if(typeof Q==="string")continue;let U=`${J}.criteria[${Z}]`;if(!Q||typeof Q!=="object"||Array.isArray(Q)){B.push(`${U} must be a string or an object.`);continue}let X=Q;for(let G of Object.keys(X))if(!GJ.has(G))B.push(`${U}.${G} is not supported.`);if(typeof X.id!=="string"||!X.id.trim())B.push(`${U}.id is required.`);if(typeof X.must!=="string"||!X.must.trim())B.push(`${U}.must is required.`);if(X.evidence!==void 0&&!Array.isArray(X.evidence))B.push(`${U}.evidence must be an array.`);if(Array.isArray(X.evidence)){for(let[G,H]of X.evidence.entries())if(typeof H!=="string"||!h0.has(H))B.push(`${U}.evidence[${G}] is not a supported evidence kind.`)}if(X.severity!==void 0&&X.severity!=="required"&&X.severity!=="recommended")B.push(`${U}.severity must be required or recommended.`)}if(Array.isArray(W.evidence)){for(let[Z,Q]of W.evidence.entries())if(typeof Q!=="string"||!h0.has(Q))B.push(`${J}.evidence[${Z}] is not a supported evidence kind.`)}else if(W.evidence!==void 0)B.push(`${J}.evidence must be an array.`);if(W.verify!==void 0&&!Array.isArray(W.verify))B.push(`${J}.verify must be an array.`);if(Array.isArray(W.verify))for(let[Z,Q]of W.verify.entries()){if(!Q||typeof Q!=="object"||Array.isArray(Q)){B.push(`${J}.verify[${Z}] must be an object.`);continue}let U=Q;for(let X of Object.keys(U))if(!YJ.has(X))B.push(`${J}.verify[${Z}].${X} is not supported.`);if(typeof U.id!=="string"||!U.id.trim())B.push(`${J}.verify[${Z}].id is required.`);if(typeof U.command!=="string"||!U.command.trim())B.push(`${J}.verify[${Z}].command is required.`);if(U.timeoutMs!==void 0&&(typeof U.timeoutMs!=="number"||!Number.isInteger(U.timeoutMs)||U.timeoutMs<1))B.push(`${J}.verify[${Z}].timeoutMs must be an integer >= 1.`);if(U.cwd!==void 0&&typeof U.cwd!=="string")B.push(`${J}.verify[${Z}].cwd must be a string.`);if(U.env!==void 0){if(!U.env||typeof U.env!=="object"||Array.isArray(U.env))B.push(`${J}.verify[${Z}].env must be an object.`);else for(let[X,G]of Object.entries(U.env))if(typeof G!=="string")B.push(`${J}.verify[${Z}].env.${X} must be a string.`)}if(U.allowFailure!==void 0&&typeof U.allowFailure!=="boolean")B.push(`${J}.verify[${Z}].allowFailure must be a boolean.`)}if(W.review!==void 0&&W.review!==!1)if(!W.review||typeof W.review!=="object"||Array.isArray(W.review))B.push(`${J}.review must be false or an object.`);else{let Z=W.review;for(let Q of Object.keys(Z))if(!VJ.has(Q))B.push(`${J}.review.${Q} is not supported.`);if(Z.agent!==void 0&&typeof Z.agent!=="string")B.push(`${J}.review.agent must be a string.`);if(Z.focus!==void 0&&typeof Z.focus!=="string")B.push(`${J}.review.focus must be a string.`);if(Z.required!==void 0&&typeof Z.required!=="boolean")B.push(`${J}.review.required must be a boolean.`)}if(W.stopRules!==void 0&&!Array.isArray(W.stopRules))B.push(`${J}.stopRules must be an array.`);if(Array.isArray(W.stopRules)){for(let[Z,Q]of W.stopRules.entries())if(typeof Q!=="string")B.push(`${J}.stopRules[${Z}] must be a string.`)}return B}var HJ=["read","grep","find","ls"];function KJ($){if($==="*")return"*";if($===void 0)return[...HJ];return[...new Set($.map((J)=>J.trim()).filter(Boolean))]}function d$($,J="toolBudget"){if($===void 0)return{};if(!$||typeof $!=="object"||Array.isArray($))return{error:`${J} must be an object with hard and optional soft/block.`};let B=$;if(typeof B.hard!=="number"||!Number.isInteger(B.hard)||B.hard<1)return{error:`${J}.hard must be an integer >= 1.`};if(B.soft!==void 0&&(typeof B.soft!=="number"||!Number.isInteger(B.soft)||B.soft<1))return{error:`${J}.soft must be an integer >= 1 when provided.`};if(B.soft!==void 0&&B.soft>B.hard)return{error:`${J}.soft must be <= ${J}.hard.`};if(B.block!==void 0&&B.block!=="*"){if(!Array.isArray(B.block))return{error:`${J}.block must be "*" or an array of tool names.`};if(B.block.length===0)return{error:`${J}.block must contain at least one tool name.`};for(let W of B.block)if(typeof W!=="string"||!W.trim())return{error:`${J}.block must contain non-empty tool names.`}}return{budget:{hard:B.hard,...B.soft!==void 0?{soft:B.soft}:{},block:KJ(B.block)}}}function zJ($,J){let B=J.split(`
|
|
7
|
+
`),W=B.findIndex((X)=>X.trim()===""),Z=W===-1?B:B.slice(0,W),Q=(W===-1?"":B.slice(W+1).join(`
|
|
8
|
+
`)).trim(),U={agent:$,task:Q};for(let X of Z){let G=X.match(/^([\w-]+):\s*(.*)$/);if(!G)continue;let H=G[1].trim().toLowerCase(),V=G[2].trim();if(H==="output"){if(V==="false")U.output=!1;else if(V)U.output=V;continue}if(H==="phase"){if(V)U.phase=V;continue}if(H==="label"){if(V)U.label=V;continue}if(H==="as"){if(V)U.as=V;continue}if(H==="outputschema"){if(V.startsWith("{")||V.startsWith("["))throw Error("Inline outputSchema values are not supported in .chain.md files; use a schema file path.");if(V)U.outputSchema=V;continue}if(H==="outputmode"){if(V==="inline"||V==="file-only")U.outputMode=V;continue}if(H==="reads"){if(V==="false")U.reads=!1;else{let K=V.split(",").map((Y)=>Y.trim()).filter(Boolean);U.reads=K.length>0?K:!1}continue}if(H==="model"){if(V)U.model=V;continue}if(H==="skills"){if(V==="false")U.skills=!1;else{let K=V.split(",").map((Y)=>Y.trim()).filter(Boolean);U.skills=K.length>0?K:!1}continue}if(H==="progress"){if(V==="true")U.progress=!0;else if(V==="false")U.progress=!1;continue}if(H==="toolbudget"){let K;try{K=JSON.parse(V)}catch(z){let q=z instanceof Error?z.message:String(z);throw Error(`Invalid toolBudget in .chain.md step '${$}': ${q}`)}let Y=d$(K,`toolBudget for step '${$}'`);if(Y.error)throw Error(Y.error);U.toolBudget=K}}return U}function v0($,J,B){let{frontmatter:W,body:Z}=t($);if(!W.name||!W.description)throw Error("Chain frontmatter must include name and description");let Q=[...Z.matchAll(/^##\s+(.+)[^\S\n]*$/gm)],U=[];for(let K=0;K<Q.length;K++){let Y=Q[K],z=Y[1].trim(),q=Z[Y.index+Y[0].length]===`
|
|
9
|
+
`?1:0,A=Y.index+Y[0].length+q,j=K+1<Q.length?Q[K+1].index:Z.length,O=Z.slice(A,j).trimEnd();U.push(zJ(z,O))}let X=W.name,G=a(W.package,`Chain '${X}' package`);if(G.error)throw Error(G.error);let H=G.packageName,V={};for(let[K,Y]of Object.entries(W)){if(K==="name"||K==="package"||K==="description")continue;V[K]=Y}return{name:r(X,H),localName:X,packageName:H,description:W.description,source:J,filePath:B,steps:U,extraFields:Object.keys(V).length>0?V:void 0}}function n$($,J){let B=d$($,J);if(B.error)throw Error(B.error)}function g0($,J,B){let W;try{W=JSON.parse($)}catch(X){let G=X instanceof Error?X.message:String(X);throw Error(`Invalid JSON chain '${B}': ${G}`)}if(!W||typeof W!=="object"||Array.isArray(W))throw Error(`JSON chain '${B}' must contain an object root.`);let Z=W;if(typeof Z.name!=="string"||!Z.name.trim())throw Error(`JSON chain '${B}' must include string name.`);if(typeof Z.description!=="string"||!Z.description.trim())throw Error(`JSON chain '${B}' must include string description.`);if(!Array.isArray(Z.chain))throw Error(`JSON chain '${B}' must include array chain.`);for(let X=0;X<Z.chain.length;X++){let G=Z.chain[X];if(!G||typeof G!=="object"||Array.isArray(G))throw Error(`JSON chain '${B}' step ${X+1} must be an object.`);let H=G;if(H.toolBudget!==void 0)n$(H.toolBudget,`step ${X+1} toolBudget`);let V=e(H.acceptance,`step ${X+1} acceptance`);if(V.length>0)throw Error(`Invalid JSON chain '${B}': ${V.join(" ")}`);let K=H.parallel;if(Array.isArray(K))for(let Y=0;Y<K.length;Y++){let z=K[Y];if(!z||typeof z!=="object"||Array.isArray(z))continue;let q=z;if(q.toolBudget!==void 0)n$(q.toolBudget,`step ${X+1} parallel task ${Y+1} toolBudget`);let A=e(q.acceptance,`step ${X+1} parallel task ${Y+1} acceptance`);if(A.length>0)throw Error(`Invalid JSON chain '${B}': ${A.join(" ")}`)}else if(K&&typeof K==="object"){let Y=K;if(Y.toolBudget!==void 0)n$(Y.toolBudget,`step ${X+1} dynamic template toolBudget`);let z=e(Y.acceptance,`step ${X+1} dynamic template acceptance`);if(z.length>0)throw Error(`Invalid JSON chain '${B}': ${z.join(" ")}`)}}try{P0(Z.chain,{maxItems:Number.MAX_SAFE_INTEGER})}catch(X){if(X instanceof f)throw Error(`Invalid JSON chain '${B}': ${X.message}`);throw X}let Q=a(typeof Z.package==="string"?Z.package:void 0,`Chain '${Z.name}' package`);if(Q.error)throw Error(Q.error);let U={};for(let[X,G]of Object.entries(Z)){if(X==="name"||X==="package"||X==="description"||X==="chain")continue;if(typeof G==="string")U[X]=G}return{name:r(Z.name.trim(),Q.packageName),localName:Z.name.trim(),packageName:Q.packageName,description:Z.description.trim(),source:J,filePath:B,steps:Z.chain,extraFields:Object.keys(U).length>0?U:void 0}}function u0($,J,B,W=[],Z=[]){let Q=new Map;for(let U of W)Q.set(U.name,U);for(let U of Z)Q.set(U.name,U);if($==="both"){for(let U of J)Q.set(U.name,U);for(let U of B)Q.set(U.name,U)}else if($==="user")for(let U of J)Q.set(U.name,U);else for(let U of B)Q.set(U.name,U);return Array.from(Q.values())}function m0($,J){if($===void 0)return;if(!$||typeof $!=="object"||Array.isArray($))throw Error(`Subagent settings in '${J.filePath}' have invalid 'modelScope'; expected an object.`);let B=$,W={};if("enforce"in B){if(typeof B.enforce!=="boolean")throw Error(`Subagent settings in '${J.filePath}' have invalid 'modelScope.enforce'; expected a boolean.`);W.enforce=B.enforce}if("allow"in B){if(!Array.isArray(B.allow))throw Error(`Subagent settings in '${J.filePath}' have invalid 'modelScope.allow'; expected an array of strings.`);let Z=[];for(let Q of B.allow){if(typeof Q!=="string")throw Error(`Subagent settings in '${J.filePath}' have invalid 'modelScope.allow'; expected an array of strings.`);let U=Q.trim();if(U)Z.push(U)}if(Z.length===0)throw Error(`Subagent settings in '${J.filePath}' have invalid 'modelScope.allow'; expected a non-empty array of patterns.`);W.allow=Z}if(W.enforce===!0&&(!W.allow||W.allow.length===0))throw Error(`Subagent settings in '${J.filePath}' set modelScope.enforce without a non-empty 'allow' list; supply allowed model patterns or disable enforcement.`);return Object.keys(W).length>0?W:void 0}function c0($){let J=$.trim();if(J.startsWith('"')&&J.endsWith('"')||J.startsWith("'")&&J.endsWith("'"))return J.slice(1,-1);return J}function d0($){if(!$)return;let J=new Map,W=$.trim().match(/^\{(.*)\}$/s);if(W)for(let U of W[1].split(",")){let X=U.trim().match(/^([\w-]+)\s*:\s*(.*)$/);if(!X)continue;J.set(X[1],c0(X[2]))}else for(let U of $.split(`
|
|
10
|
+
`)){let X=U.match(/^\s*([\w-]+):\s*(.*)$/);if(!X)continue;J.set(X[1],c0(X[2]))}let Z=J.get("scope"),Q=J.get("path");if(Z!=="project"&&Z!=="user")return;if(!Q)return;return{scope:Z,path:Q}}var s$=["context-builder","delegate","oracle","planner","researcher","reviewer","scout","worker"];function _J($){return $==="delegate"?"append":"replace"}function AJ($){return $==="delegate"}function jJ(){return!1}var M$={overrides:{}},T$=new WeakMap;function NJ(){return C.join(T(),"chains")}var V$=null;function OJ($){try{return JSON.parse(F.readFileSync($,"utf-8"))}catch{return null}}function wJ($){try{return JSON.parse(F.readFileSync($,"utf-8"))}catch(J){if((typeof J==="object"&&J!==null&&"code"in J?J.code:void 0)==="ENOENT")return null;throw J}}function l$($){return $.length>0&&!C.isAbsolute($)&&$.split(/[\\/]/).every((J)=>J.length>0&&J!=="."&&J!=="..")}function FJ($){let J=$.slice(4).trim();if(!J)return;let W=J.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/)?.[1]??J;return l$(W)?W:void 0}function LJ($){let J=$.indexOf("@"),B=$.indexOf("#"),W=[J,B].filter((Z)=>Z>=0).sort((Z,Q)=>Z-Q)[0];return W===void 0?$:$.slice(0,W)}function RJ($){let J=$.slice(4).trim();if(!J)return;let B="",W="",Z=J.match(/^git@([^:]+):(.+)$/);if(Z)B=Z[1]??"",W=Z[2]??"";else if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))try{let U=new URL(J);B=U.hostname,W=U.pathname.replace(/^\/+/,"")}catch{return}else{let U=J.indexOf("/");if(U<0)return;B=J.slice(0,U),W=J.slice(U+1)}let Q=LJ(W).replace(/\.git$/,"").replace(/^\/+/,"");if(!B||!l$(B)||!l$(Q)||Q.split(/[\\/]/).length<2)return;return{host:B,repoPath:Q}}function MJ($,J){let B=$.trim();if(!B)return;if(B.startsWith("git:")){let Z=RJ(B);return Z?C.join(J,"git",Z.host,Z.repoPath):void 0}if(B.startsWith("npm:")){let Z=FJ(B);return Z?C.join(J,"npm","node_modules",Z):void 0}let W=B.startsWith("file:")?B.slice(5):B;if(W==="~")return H$.homedir();if(W.startsWith("~/"))return C.join(H$.homedir(),W.slice(2));if(C.isAbsolute(W))return W;if(W==="."||W===".."||W.startsWith("./")||W.startsWith("../"))return C.resolve(J,W);return}function TJ(){if(V$!==null)return V$;try{return V$=F.realpathSync(qJ("npm root -g",{encoding:"utf-8",timeout:5000}).trim()),V$}catch{return V$="",null}}function n0($){if(!Array.isArray($))return[];return $.filter((J)=>typeof J==="string"&&J.trim().length>0)}function EJ($){let J=C.join($,"package.json"),B=OJ(J);if(!B||typeof B!=="object"||Array.isArray(B))return{agents:[],chains:[]};let W=[],Z=B["dm-subagents"];if(Z&&typeof Z==="object"&&!Array.isArray(Z))W.push(Z);let Q=B.pi;if(Q&&typeof Q==="object"&&!Array.isArray(Q)){let G=Q.subagents;if(G&&typeof G==="object"&&!Array.isArray(G))W.push(G)}let U=[],X=[];for(let G of W){for(let H of n0(G.agents))U.push(C.resolve($,H));for(let H of n0(G.chains))X.push(C.resolve($,H))}return{agents:U,chains:X}}function p$($){let J=[];if(!F.existsSync($))return J;let B;try{B=F.readdirSync($,{withFileTypes:!0})}catch{return J}for(let W of B){if(W.name.startsWith("."))continue;if(!W.isDirectory()&&!W.isSymbolicLink())continue;if(W.name.startsWith("@")){let Z=C.join($,W.name),Q;try{Q=F.readdirSync(Z,{withFileTypes:!0})}catch{continue}for(let U of Q){if(U.name.startsWith("."))continue;if(!U.isDirectory()&&!U.isSymbolicLink())continue;J.push(C.join(Z,U.name))}continue}J.push(C.join($,W.name))}return J}function p0($,J){let B=wJ($);if(!B||typeof B!=="object"||Array.isArray(B))return[];let W=B.packages;if(!Array.isArray(W))return[];let Z=[];for(let Q of W){let U=typeof Q==="string"?Q:typeof Q==="object"&&Q!==null&&typeof Q.source==="string"?Q.source:void 0;if(!U)continue;let X=MJ(U,J);if(X)Z.push(X)}return Z}function s0($,J={includeUser:!0,includeProject:!0}){let B=T(),W=Y$($)??$,Z=[W];if(J.includeProject){let V=b(W);Z.push(...p$(C.join(V,"npm","node_modules")),...p0(C.join(V,"settings.json"),V))}if(J.includeUser)Z.push(...p$(C.join(B,"npm","node_modules")),...p0(C.join(B,"settings.json"),B));if(J.includeUser){let V=TJ();if(V)Z.push(...p$(V))}let Q=new Set,U=new Set,X=new Set,G=[],H=[];for(let V of Z){let K=C.resolve(V);if(Q.has(K))continue;Q.add(K);let Y=EJ(K);for(let z of Y.agents){if(U.has(z))continue;U.add(z),G.push(z)}for(let z of Y.chains){if(X.has(z))continue;X.add(z),H.push(z)}}return{agents:G,chains:H}}function i0($){let J=[],B=[];for(let W of $??[])if(W.startsWith("mcp:"))J.push(W.slice(4));else B.push(W);return{...B.length>0?{tools:B}:{},...J.length>0?{mcpDirectTools:J}:{}}}function i$($){return{model:$.model,fallbackModels:$.fallbackModels?[...$.fallbackModels]:void 0,thinking:$.thinking,systemPromptMode:$.systemPromptMode,inheritProjectContext:$.inheritProjectContext,inheritSkills:$.inheritSkills,defaultContext:$.defaultContext,disabled:$.disabled,systemPrompt:$.systemPrompt,skills:$.skills?[...$.skills]:void 0,tools:$.tools?[...$.tools]:void 0,mcpDirectTools:$.mcpDirectTools?[...$.mcpDirectTools]:void 0,subagentOnlyExtensions:$.subagentOnlyExtensions?[...$.subagentOnlyExtensions]:void 0,completionGuard:$.completionGuard,toolBudget:$.toolBudget}}function Y$($){let J=$;while(!0){if(K$(b(J))||K$(C.join(J,".agents")))return J;let B=C.dirname(J);if(B===J)return null;J=B}}function a0(){return C.join(T(),"settings.json")}function r0($){let J=Y$($);return J?C.join(b(J),"settings.json"):null}function IJ($){if(!F.existsSync($))return{};let J;try{J=F.readFileSync($,"utf-8")}catch(W){let Z=W instanceof Error?W.message:String(W);throw Error(`Failed to read settings file '${$}': ${Z}`,{cause:W})}let B;try{B=JSON.parse(J)}catch(W){let Z=W instanceof Error?W.message:String(W);throw Error(`Failed to parse settings file '${$}': ${Z}`,{cause:W})}if(!B||typeof B!=="object"||Array.isArray(B))throw Error(`Settings file '${$}' must contain a JSON object.`);return B}function L$($,J){if($===void 0)return;if($===!1)return!1;if(!Array.isArray($))throw Error(`Builtin override '${J.name}' in '${J.filePath}' has invalid '${J.field}'; expected an array of strings or false.`);let B=[];for(let W of $){if(typeof W!=="string")throw Error(`Builtin override '${J.name}' in '${J.filePath}' has invalid '${J.field}'; expected an array of strings or false.`);let Z=W.trim();if(Z)B.push(Z)}return B}function DJ($,J,B){if(!J||typeof J!=="object"||Array.isArray(J))throw Error(`Builtin override '${$}' in '${B}' must be an object.`);let W=J,Z={};if("model"in W)if(typeof W.model==="string"||W.model===!1)Z.model=W.model;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'model'; expected a string or false.`);if("thinking"in W)if(typeof W.thinking==="string"||W.thinking===!1)Z.thinking=W.thinking;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'thinking'; expected a string or false.`);if("systemPromptMode"in W)if(W.systemPromptMode==="append"||W.systemPromptMode==="replace")Z.systemPromptMode=W.systemPromptMode;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'systemPromptMode'; expected 'append' or 'replace'.`);if("inheritProjectContext"in W)if(typeof W.inheritProjectContext==="boolean")Z.inheritProjectContext=W.inheritProjectContext;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'inheritProjectContext'; expected a boolean.`);if("inheritSkills"in W)if(typeof W.inheritSkills==="boolean")Z.inheritSkills=W.inheritSkills;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'inheritSkills'; expected a boolean.`);if("defaultContext"in W)if(W.defaultContext==="fresh"||W.defaultContext==="fork"||W.defaultContext===!1)Z.defaultContext=W.defaultContext;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'defaultContext'; expected 'fresh', 'fork', or false.`);if("disabled"in W)if(typeof W.disabled==="boolean")Z.disabled=W.disabled;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'disabled'; expected a boolean.`);if("completionGuard"in W)if(typeof W.completionGuard==="boolean")Z.completionGuard=W.completionGuard;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'completionGuard'; expected a boolean.`);if("toolBudget"in W)if(W.toolBudget===!1)Z.toolBudget=!1;else if(W.toolBudget&&typeof W.toolBudget==="object"&&!Array.isArray(W.toolBudget))Z.toolBudget=W.toolBudget;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'toolBudget'; expected an object or false.`);if("systemPrompt"in W)if(typeof W.systemPrompt==="string")Z.systemPrompt=W.systemPrompt;else throw Error(`Builtin override '${$}' in '${B}' has invalid 'systemPrompt'; expected a string.`);let Q=L$(W.fallbackModels,{filePath:B,name:$,field:"fallbackModels"});if(Q!==void 0)Z.fallbackModels=Q;let U=L$(W.skills,{filePath:B,name:$,field:"skills"});if(U!==void 0)Z.skills=U;let X=L$(W.tools,{filePath:B,name:$,field:"tools"});if(X!==void 0)Z.tools=X;let G=L$(W.subagentOnlyExtensions,{filePath:B,name:$,field:"subagentOnlyExtensions"});if(G!==void 0)Z.subagentOnlyExtensions=G;return Object.keys(Z).length>0?Z:void 0}function E$($){if(!$)return M$;let B=IJ($).subagents;if(!B||typeof B!=="object"||Array.isArray(B))return M$;let W=B,Z;if("disableBuiltins"in W)if(typeof W.disableBuiltins==="boolean")Z=W.disableBuiltins;else throw Error(`Subagent settings in '${$}' have invalid 'disableBuiltins'; expected a boolean.`);let Q;if("disableThinking"in W)if(typeof W.disableThinking==="boolean")Q=W.disableThinking;else throw Error(`Subagent settings in '${$}' have invalid 'disableThinking'; expected a boolean.`);let U;if("defaultModel"in W)if(typeof W.defaultModel==="string"&&W.defaultModel.trim())U=W.defaultModel.trim();else throw Error(`Subagent settings in '${$}' have invalid 'defaultModel'; expected a non-empty string.`);let X=m0(W.modelScope,{filePath:$}),G={},H=W.agentOverrides;if(!H||typeof H!=="object"||Array.isArray(H))return{overrides:G,defaultModel:U,disableBuiltins:Z,disableThinking:Q,modelScope:X};for(let[V,K]of Object.entries(H)){let Y=DJ(V,K,$);if(Y)G[V]=Y}return{overrides:G,defaultModel:U,disableBuiltins:Z,disableThinking:Q,modelScope:X}}function t0($,J,B,W){if(W&&J.defaultModel!==void 0)return{type:"subagents.defaultModel",scope:"project",path:W,model:J.defaultModel};return $.defaultModel!==void 0?{type:"subagents.defaultModel",scope:"user",path:B,model:$.defaultModel}:void 0}function m($,J){if(!J)return $;return $.map((B)=>{if(B.model!==void 0)return B;let W={...B,model:J.model,modelSource:J},Z=T$.get(B);if(Z)T$.set(W,Z);return W})}function R$($,J,B){let W={...$,override:{...B,base:i$($)}};if(J.model!==void 0)W.model=J.model===!1?void 0:J.model;if(J.fallbackModels!==void 0)W.fallbackModels=J.fallbackModels===!1?void 0:[...J.fallbackModels];if(J.thinking!==void 0)W.thinking=J.thinking===!1?void 0:J.thinking;if(J.systemPromptMode!==void 0)W.systemPromptMode=J.systemPromptMode;if(J.inheritProjectContext!==void 0)W.inheritProjectContext=J.inheritProjectContext;if(J.inheritSkills!==void 0)W.inheritSkills=J.inheritSkills;if(J.defaultContext!==void 0)W.defaultContext=J.defaultContext===!1?void 0:J.defaultContext;if(J.disabled!==void 0)W.disabled=J.disabled;if(J.systemPrompt!==void 0)W.systemPrompt=J.systemPrompt;if(J.skills!==void 0)W.skills=J.skills===!1?void 0:[...J.skills];if(J.tools!==void 0){let{tools:Z,mcpDirectTools:Q}=i0(J.tools===!1?[]:J.tools);W.tools=Z,W.mcpDirectTools=Q}if(J.subagentOnlyExtensions!==void 0)W.subagentOnlyExtensions=J.subagentOnlyExtensions===!1?void 0:[...J.subagentOnlyExtensions];if(J.completionGuard!==void 0)W.completionGuard=J.completionGuard;if(J.toolBudget!==void 0)W.toolBudget=J.toolBudget===!1?void 0:J.toolBudget;return W}function SJ($,J){if($.thinking===void 0)return $;return{...$,thinking:void 0,override:$.override??{...J,base:i$($)}}}function e0($,J,B,W,Z){let Q=B.disableBuiltins===!0&&Z!==null,U=B.disableBuiltins===void 0&&J.disableBuiltins===!0,X=B.disableThinking!==void 0&&Z!==null,G=X?B.disableThinking===!0:J.disableThinking===!0,H=X?{scope:"project",path:Z}:{scope:"user",path:W},V=(K,Y)=>{if(!G||Y)return K;return SJ(K,H)};return $.map((K)=>{let Y=B.overrides[K.name];if(Y&&Z)return V(R$(K,Y,{scope:"project",path:Z}),Y.thinking!==void 0);if(Q&&Z)return V(R$(K,{disabled:!0},{scope:"project",path:Z}),!1);let z=J.overrides[K.name];if(z)return V(R$(K,z,{scope:"user",path:W}),!X&&z.thinking!==void 0);if(U)return V(R$(K,{disabled:!0},{scope:"user",path:W}),!1);return V(K,!1)})}function o0($,...J){let B=T$.get($);return B?J.some((W)=>B.has(W)):!1}function l0($,J,B){let W,Z=!1,Q=()=>{return W??={...$},W},U=(X,G,H)=>{if(o0($,...G))return;Q()[X]=H,Z=!0};if(J.model!==void 0)U("model",["model"],J.model===!1?void 0:J.model);if(J.fallbackModels!==void 0)U("fallbackModels",["fallbackModels"],J.fallbackModels===!1?void 0:[...J.fallbackModels]);if(J.thinking!==void 0)U("thinking",["thinking"],J.thinking===!1?void 0:J.thinking);if(J.systemPromptMode!==void 0)U("systemPromptMode",["systemPromptMode"],J.systemPromptMode);if(J.inheritProjectContext!==void 0)U("inheritProjectContext",["inheritProjectContext"],J.inheritProjectContext);if(J.inheritSkills!==void 0)U("inheritSkills",["inheritSkills"],J.inheritSkills);if(J.defaultContext!==void 0)U("defaultContext",["defaultContext"],J.defaultContext===!1?void 0:J.defaultContext);if(J.disabled!==void 0&&$.disabled===void 0)Q().disabled=J.disabled,Z=!0;if(J.skills!==void 0)U("skills",["skill","skills"],J.skills===!1?void 0:[...J.skills]);if(J.tools!==void 0&&!o0($,"tools")){let{tools:X,mcpDirectTools:G}=i0(J.tools===!1?[]:J.tools),H=Q();H.tools=X,H.mcpDirectTools=G,Z=!0}if(J.subagentOnlyExtensions!==void 0)U("subagentOnlyExtensions",["subagentOnlyExtensions"],J.subagentOnlyExtensions===!1?void 0:[...J.subagentOnlyExtensions]);if(J.completionGuard!==void 0)U("completionGuard",["completionGuard"],J.completionGuard);if(J.toolBudget!==void 0)U("toolBudget",["toolBudget"],J.toolBudget===!1?void 0:J.toolBudget);if(!Z||!W)return $;return W.override={...B,base:i$($)},W}function $$($,J,B,W,Z){return $.map((Q)=>{let U=B.overrides[Q.name];if(U&&Z)return l0(Q,U,{scope:"project",path:Z});let X=J.overrides[Q.name];if(X)return l0(Q,X,{scope:"user",path:W});return Q})}function a$($,J){let B=[];if(!F.existsSync($))return B;let W;try{W=F.readdirSync($,{withFileTypes:!0}).sort((Z,Q)=>Z.name.localeCompare(Q.name))}catch{return B}for(let Z of W){let Q=C.join($,Z.name);if(Z.isDirectory()){B.push(...a$(Q,J));continue}if(!Z.isFile()&&!Z.isSymbolicLink())continue;if(!J(Z.name))continue;B.push(Q)}return B}function yJ($,J){let W=C.relative($,J).split(C.sep).map((Z)=>Z.toLowerCase());if(C.basename($).toLowerCase()===".agents")W.unshift(".agents");return W.some((Z,Q)=>Z===".agents"&&W[Q+1]==="skills")}function D($,J){let B=[];for(let W of a$($,(Z)=>Z.endsWith(".md")&&!Z.endsWith(".chain.md"))){if(yJ($,W))continue;let Z;try{Z=F.readFileSync(W,"utf-8")}catch{continue}let{frontmatter:Q,body:U}=t(Z);if(!Q.name||!Q.description)continue;let X=Q.name,G=a(Q.package,`Agent '${X}' package`);if(G.error)continue;let H=G.packageName,V=r(X,H),K=Q.tools?.split(",").map((_)=>_.trim()).filter(Boolean),Y=[],z=[];if(K)for(let _ of K)if(_.startsWith("mcp:"))Y.push(_.slice(4));else z.push(_);let q=Q.defaultReads?.split(",").map((_)=>_.trim()).filter(Boolean),j=(Q.skill||Q.skills)?.split(",").map((_)=>_.trim()).filter(Boolean),O=Q.fallbackModels?.split(",").map((_)=>_.trim()).filter(Boolean),N=Q.systemPromptMode==="replace"?"replace":Q.systemPromptMode==="append"?"append":_J(X),L=Q.inheritProjectContext==="true"?!0:Q.inheritProjectContext==="false"?!1:AJ(X),h=Q.inheritSkills==="true"?!0:Q.inheritSkills==="false"?!1:jJ(),R=Q.defaultContext==="fork"?"fork":Q.defaultContext==="fresh"?"fresh":void 0,k;if(Q.extensions!==void 0)k=Q.extensions.split(",").map((_)=>_.trim()).filter(Boolean);let c;if(Q.subagentOnlyExtensions!==void 0)c=Q.subagentOnlyExtensions.split(",").map((_)=>_.trim()).filter(Boolean);let p={};for(let[_,u]of Object.entries(Q))if(!M0.has(_))p[_]=u;let B$=Number(Q.maxSubagentDepth),A$;if(Q.toolBudget!==void 0&&Q.toolBudget.trim()){let _=JSON.parse(Q.toolBudget);if(!_||typeof _!=="object"||Array.isArray(_))throw Error(`Agent '${X}' has invalid toolBudget frontmatter; expected a JSON object.`);A$=_}let c$=Q.completionGuard==="false"?!1:Q.completionGuard==="true"?!0:void 0,E={name:V,localName:X,packageName:H,description:Q.description,tools:z.length>0?z:void 0,mcpDirectTools:Y.length>0?Y:void 0,model:Q.model,fallbackModels:O&&O.length>0?O:void 0,thinking:Q.thinking,systemPromptMode:N,inheritProjectContext:L,inheritSkills:h,defaultContext:R,systemPrompt:U,source:J,filePath:W,skills:j&&j.length>0?j:void 0,extensions:k,subagentOnlyExtensions:c,output:Q.output,defaultReads:q&&q.length>0?q:void 0,defaultProgress:Q.defaultProgress==="true",interactive:Q.interactive==="true",maxSubagentDepth:Number.isInteger(B$)&&B$>=0?B$:void 0,completionGuard:c$,toolBudget:A$,memory:d0(Q.memory),extraFields:Object.keys(p).length>0?p:void 0};T$.set(E,new Set(Object.keys(Q))),B.push(E)}return B}function o$($,J){let B=new Map,W=[];for(let Z of a$($,(Q)=>Q.endsWith(".chain.md")||Q.endsWith(".chain.json"))){let Q;try{Q=F.readFileSync(Z,"utf-8")}catch{continue}try{let U=Z.endsWith(".chain.json")?g0(Q,J,Z):v0(Q,J,Z),X=B.get(U.name);if(X&&X.filePath.endsWith(".chain.json")&&Z.endsWith(".chain.md"))continue;B.set(U.name,U)}catch(U){W.push({source:J,filePath:Z,error:U instanceof Error?U.message:String(U)});continue}}return{chains:Array.from(B.values()),diagnostics:W}}function K$($){try{return F.statSync($).isDirectory()}catch{return!1}}function $1($){let J=Y$($);if(!J)return{readDirs:[],preferredDir:null};let B=C.join(J,".agents"),W=C.join(b(J),"agents"),Z=[];if(K$(B))Z.push(B);if(K$(W))Z.push(W);return{readDirs:Z,preferredDir:W}}function kJ($){let J=Y$($);if(!J)return{readDirs:[],preferredDir:null};let B=C.join(b(J),"chains");return{readDirs:K$(B)?[B]:[],preferredDir:B}}var J1=C.resolve(C.dirname(CJ(import.meta.url)),"..","..","agents"),bJ="DM_SUBAGENT_EXTRA_AGENT_DIRS";function B1(){let $=process.env[bJ];if(!$)return[];return $.split(C.delimiter).map((J)=>J.trim()).filter((J)=>J.length>0)}function z$($,J){let B=C.join(T(),"agents"),W=C.join(H$.homedir(),".agents"),{readDirs:Z,preferredDir:Q}=$1($),U=a0(),X=r0($),G=J==="project"?M$:E$(U),H=J==="user"?M$:E$(X),V=t0(G,H,U,X),K=H.modelScope??G.modelScope,Y=s0($,{includeUser:J!=="project",includeProject:J!=="user"}),z=e0(m(D(J1,"builtin"),V),G,H,U,X),q=J==="project"?[]:B1().flatMap((R)=>D(R,"user")),A=J==="project"?[]:D(B,"user"),j=J==="project"?[]:D(W,"user"),O=$$(m([...q,...A,...j],V),G,H,U,X),N=$$(m(J==="user"?[]:Z.flatMap((R)=>D(R,"project")),V),G,H,U,X),L=$$(m(Y.agents.flatMap((R)=>D(R,"package")),V),G,H,U,X);return{agents:u0(J,O,N,z,L).filter((R)=>R.disabled!==!0),projectAgentsDir:Q,modelScope:K}}function W1($){let J=C.join(T(),"agents"),B=C.join(H$.homedir(),".agents"),W=NJ(),{readDirs:Z,preferredDir:Q}=$1($),{readDirs:U,preferredDir:X}=kJ($),G=a0(),H=r0($),V=E$(G),K=E$(H),Y=t0(V,K,G,H),z=s0($),q=e0(m(D(J1,"builtin"),Y),V,K,G,H),A=$$(m([...B1().flatMap((E)=>D(E,"user")),...D(J,"user"),...D(B,"user")],Y),V,K,G,H),j=new Map;for(let E of z.agents)for(let _ of D(E,"package"))if(!j.has(_.name))j.set(_.name,_);let O=$$(m(Array.from(j.values()),Y),V,K,G,H),N=new Map;for(let E of Z)for(let _ of D(E,"project"))N.set(_.name,_);let L=$$(m(Array.from(N.values()),Y),V,K,G,H),h=new Map,R=[],k=new Map;for(let E of z.chains){let _=o$(E,"package");R.push(..._.diagnostics);for(let u of _.chains)if(!k.has(u.name))k.set(u.name,u)}let c=[];for(let E of U){let _=o$(E,"project");c.push(..._.diagnostics);for(let u of _.chains)h.set(u.name,u)}let p=o$(W,"user"),B$=[...Array.from(k.values()),...p.chains,...Array.from(h.values())],A$=[...R,...p.diagnostics,...c],c$=process.env.DM_CODING_AGENT_DIR?J:F.existsSync(B)?B:J;return{builtin:q,package:O,user:A,project:L,chains:B$,chainDiagnostics:A$,userDir:c$,projectDir:Q,userChainDir:W,projectChainDir:X,userSettingsPath:G,projectSettingsPath:H}}import*as M from"node:fs";import*as G1 from"node:os";import*as P from"node:path";var q$=7;function $0($){let J=M.readFileSync($,"utf-8"),B=JSON.parse(J);if(!B||typeof B!=="object"||Array.isArray(B))throw Error(`File '${$}' must contain a JSON object.`);return B}function I$($,J){M.mkdirSync(P.dirname($),{recursive:!0}),M.writeFileSync($,`${JSON.stringify(J,null,2)}
|
|
11
|
+
`,"utf-8")}var fJ=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function Y1($,J){let B=$.trim();if(!B)throw Error(`${J} is required.`);if(!fJ.test(B)||B==="."||B===".."||B.includes("/")||B.includes("\\"))throw Error(`${J} must be a safe file name using only letters, numbers, dots, underscores, and hyphens.`);return B}function PJ($){let J=$.trim(),B=J.endsWith(".json")?J.slice(0,-5):J;return Y1(B,"Profile name")}function J0($){return Y1($,"Provider")}function xJ($,J){let B=J.subagents;if(!B||typeof B!=="object"||Array.isArray(B))throw Error(`Profile '${$}' must contain a 'subagents' object.`);let W=B.agentOverrides;if(!W||typeof W!=="object"||Array.isArray(W))throw Error(`Profile '${$}' must contain 'subagents.agentOverrides' as an object.`);for(let[Z,Q]of Object.entries(W)){if(!Q||typeof Q!=="object"||Array.isArray(Q))throw Error(`Profile '${$}' has invalid override '${Z}'; expected an object.`);let U=Q.model;if(U!==void 0&&typeof U!=="string")throw Error(`Profile '${$}' has invalid model for '${Z}'; expected a string.`)}return J}function hJ(){return P.join(T(),"settings.json")}function vJ($){if(!M.existsSync($))return{};return $0($)}function gJ($){let J=$.match(/(\d+(?:\.\d+)?)/g);if(!J||J.length===0)return 0;return Math.max(...J.map((B)=>Number.parseFloat(B)).filter((B)=>Number.isFinite(B)))}function V1($){return $.toLowerCase().replace(/([a-z])([0-9])/g,"$1 $2").replace(/([0-9])([a-z])/g,"$1 $2").split(/[^a-z0-9.]+/).filter(Boolean)}function uJ($){let J=new Set(V1($));if(["spark","flash","nano","tiny","instant"].some((B)=>J.has(B)))return 0;if(["mini","haiku","small"].some((B)=>J.has(B)))return 1;if(["opus","max","ultra","pro"].some((B)=>J.has(B)))return 4;if(["sonnet","turbo","plus"].some((B)=>J.has(B)))return 3;return 2}function B0($){if(!$)return;let J=[$.input,$.output,$.cacheRead,$.cacheWrite].filter((B)=>typeof B==="number"&&Number.isFinite(B));if(J.length===0)return;return J.reduce((B,W)=>B+W,0)}function r$($){let J=$.filter((B)=>typeof B==="number"&&Number.isFinite(B));if(J.length===0)return;return{min:Math.min(...J),max:Math.max(...J)}}function t$($,J){if($===void 0||!J)return;if(J.max<=J.min)return 0.5;return($-J.min)/(J.max-J.min)}function mJ($){return{cost:r$($.map((J)=>B0(J.cost))),contextWindow:r$($.map((J)=>J.contextWindow)),maxTokens:r$($.map((J)=>J.maxTokens))}}function cJ($){if($<=0.33)return"cheap";if($<=0.66)return"medium";return"expensive"}function dJ($){if($<=0.33)return"weak";if($<=0.66)return"medium";return"strong"}function nJ($,J){if($==="strong")return"strong";if($==="medium")return J==="cheap"?"cheap":"medium";return"cheap"}function pJ($){if($==="cheap")return["scout","delegate"];if($==="medium")return["planner","context-builder","researcher"];return["worker","reviewer","oracle"]}function oJ($,J){let B=$.name?.trim()||$.id,W=new Set(V1(B)),Z=uJ(B),Q=gJ($.id),U=t$(B0($.cost),J.cost),X=t$($.contextWindow,J.contextWindow),G=t$($.maxTokens,J.maxTokens),V=U!==void 0||X!==void 0||G!==void 0?["official-metadata","heuristic-name"]:["heuristic-name"],Y=[Z/4,...X!==void 0?[X]:[],...G!==void 0?[G]:[],...$.reasoning===!0?[1]:[],...$.reasoning===!1?[0]:[]],z=W.has("highspeed")||W.has("flash")||W.has("instant")||W.has("turbo"),q=W.has("pro")||W.has("ultra")||W.has("opus")||W.has("max"),A=Y.reduce((k,c)=>k+c,0)/Y.length;if(z)A-=0.2;A=Math.max(0,Math.min(1,A));let j=U!==void 0?cJ(U):Z===0?"cheap":Z>=3?"expensive":"medium",O=dJ(A),N=z?"fast":q?"slow":U!==void 0?U<=0.33?"fast":U<=0.66?"medium":"slow":Z<=1?"fast":Z>=3?"slow":"medium",L=nJ(O,j),h=z?125:0;return{profileRank:Math.round(A*100*10)+Math.round(Q*25)-h,costTier:j,qualityTier:O,latencyTier:N,recommendedRoleTier:L,recommendedAgents:pJ(L),classificationSources:V}}function lJ($,J){if(J)return"timeout";if(!$)return"error";if(/(unauthori[sz]ed|forbidden|api key|auth|billing|credit|quota)/i.test($))return"auth";if(/(not found|unknown model|model unavailable|model disabled|unsupported model|unavailable)/i.test($))return"unavailable";return"error"}async function H1($,J,B){if(typeof $.exec!=="function")return{status:"skipped",message:"DM exec is unavailable in this runtime."};let W=await $.exec("dm",["-p","--model",B,"--no-tools",'Reply with exactly "OK".'],{cwd:G1.tmpdir(),timeout:45000}),Z=typeof W.stdout==="string"?W.stdout.trim():"",U=[typeof W.stderr==="string"?W.stderr.trim():"",Z].filter(Boolean).join(`
|
|
12
|
+
`).trim();if(W.code===0)return{status:"ok",message:Z||"Probe succeeded."};return{status:lJ(U,W.killed===!0),message:U||`Probe exited with code ${W.code??"unknown"}.`}}function e$($,J){if($<=1)return 0;return Math.max(0,Math.min($-1,Math.round(($-1)*J)))}function sJ($){return $==="quota"?{cheap:0,medium:0.3333333333333333,strong:0.6666666666666666}:{cheap:0.3333333333333333,medium:0.6666666666666666,strong:1}}function Z1($,J){if($.length===0)throw Error("No provider models are available for profile generation.");let B=J==="quota"&&$.length>1?$.slice(0,-1):$,W=sJ(J);return{cheap:B[e$(B.length,W.cheap)].fullId,medium:B[e$(B.length,W.medium)].fullId,strong:B[e$(B.length,W.strong)].fullId}}function Q1($){return B0($.observed.cost)}function iJ($,J){let B=Q1($),W=Q1(J);if(B===void 0||W===void 0)return!1;if(B>W)return!1;if($.derived.profileRank<J.derived.profileRank)return!1;if(($.observed.reasoning===!0?1:0)<(J.observed.reasoning===!0?1:0))return!1;if(($.observed.contextWindow??0)<(J.observed.contextWindow??0))return!1;if(($.observed.maxTokens??0)<(J.observed.maxTokens??0))return!1;return B<W||$.derived.profileRank>J.derived.profileRank||$.observed.reasoning===!0&&J.observed.reasoning!==!0||($.observed.contextWindow??0)>(J.observed.contextWindow??0)||($.observed.maxTokens??0)>(J.observed.maxTokens??0)}function aJ($){return $.filter((J,B)=>!$.some((W,Z)=>Z!==B&&iJ(W,J)))}function U1($,J){return{subagents:{agentOverrides:{scout:{model:J.cheap},delegate:{model:J.cheap},planner:{model:J.medium},"context-builder":{model:J.medium},researcher:{model:J.medium},worker:{model:J.strong},reviewer:{model:J.strong},oracle:{model:J.strong}}}}}function rJ($){return $.observed.availableInRegistry&&$.observed.probe.status!=="unavailable"&&$.observed.probe.status!=="auth"&&$.observed.probe.status!=="timeout"&&$.observed.probe.status!=="error"}function K1($){return $.derived.classificationSources.includes("heuristic-name")&&!$.derived.classificationSources.includes("official-metadata")}function tJ(){return"Classification fell back to name heuristics."}function X1($){return $.models.filter(K1).length}function eJ($){let J=W0();return P.join(J,`${PJ($)}.json`)}function z1(){return P.join(T(),"profiles","dm-subagents")}function $B(){return z1()}function W0(){let $=$B();return M.mkdirSync($,{recursive:!0}),$}function JB(){return P.join(z1(),"providers")}function BB(){let $=JB();return M.mkdirSync($,{recursive:!0}),$}function q1($){return P.join(BB(),`${J0($)}.models.json`)}function D$(){let $=W0();return M.readdirSync($,{withFileTypes:!0}).filter((J)=>J.isFile()&&J.name.endsWith(".json")).map((J)=>J.name.slice(0,-5)).sort((J,B)=>J.localeCompare(B))}function S$($){let J=eJ($);if(!M.existsSync(J))throw Error(`Profile not found: ${$}`);let B=$0(J);return{filePath:J,profile:xJ(J,B)}}function C1($){let{filePath:J,profile:B}=S$($),W=hJ(),Z=vJ(W);return Z.subagents=B.subagents,I$(W,Z),{filePath:J,settingsPath:W}}function WB($){let J=q1($);if(!M.existsSync(J))return null;return $0(J)}function ZB($,J=q$){let B=Date.parse($.refreshedAt);if(!Number.isFinite(B))return!0;let W=J*24*60*60*1000;return Date.now()-B>W}async function Z0($,J,B,W={}){let Z=J0(B),Q=W.maxAgeDays??q$,U=q1(Z);if(!W.force){let Y=WB(Z);if(Y&&!ZB(Y,Q))return{filePath:U,catalog:Y,reused:!0,heuristicFallbackCount:X1(Y)}}let X=J.modelRegistry.getAvailable().filter((Y)=>Y.provider===Z);if(X.length===0)throw Error(`No models found in the current registry for provider '${Z}'.`);let G=[];for(let Y of X){let z=Y,q=`${z.provider}/${z.id}`,A=W.probe===!1?{status:"skipped",message:"Live probing disabled."}:await H1($,J,q);G.push({rawModel:Y,modelRecord:z,fullId:q,probe:A})}let H=mJ(G.map(({modelRecord:Y})=>({id:Y.id,...typeof Y.name==="string"?{name:Y.name}:{},...typeof Y.reasoning==="boolean"?{reasoning:Y.reasoning}:{},...typeof Y.contextWindow==="number"?{contextWindow:Y.contextWindow}:{},...typeof Y.maxTokens==="number"?{maxTokens:Y.maxTokens}:{},...Y.cost&&typeof Y.cost==="object"?{cost:Y.cost}:{}}))),V=[];for(let{rawModel:Y,modelRecord:z,fullId:q,probe:A}of G){let j=oJ({id:z.id,...typeof z.name==="string"?{name:z.name}:{},...typeof z.reasoning==="boolean"?{reasoning:z.reasoning}:{},...typeof z.contextWindow==="number"?{contextWindow:z.contextWindow}:{},...typeof z.maxTokens==="number"?{maxTokens:z.maxTokens}:{},...z.cost&&typeof z.cost==="object"?{cost:z.cost}:{}},H),O=j.classificationSources.includes("heuristic-name")&&!j.classificationSources.includes("official-metadata")?[tJ()]:[];V.push({id:z.id,fullId:q,observed:{availableInRegistry:!0,...typeof z.name==="string"?{name:z.name}:{},...typeof z.reasoning==="boolean"?{reasoning:z.reasoning}:{},thinkingLevels:O0(Z$(Y)).map((N)=>N),...typeof z.contextWindow==="number"?{contextWindow:z.contextWindow}:{},...typeof z.maxTokens==="number"?{maxTokens:z.maxTokens}:{},...z.cost&&typeof z.cost==="object"?{cost:z.cost}:{},probe:{status:A.status,checkedAt:new Date().toISOString(),...A.message?{message:A.message}:{}}},derived:j,warnings:O,notes:[]})}V.sort((Y,z)=>Y.derived.profileRank-z.derived.profileRank||Y.fullId.localeCompare(z.fullId));let K={provider:Z,refreshedAt:new Date().toISOString(),maxAgeDays:Q,sources:["runtime-registry",...W.probe===!1?[]:["live-probe"],"heuristic-classifier"],models:V};return I$(U,K),{filePath:U,catalog:K,reused:!1,heuristicFallbackCount:X1(K)}}async function _1($,J,B,W={}){let Z=J0(B),{filePath:Q,catalog:U,heuristicFallbackCount:X}=await Z0($,J,Z,{maxAgeDays:W.maxAgeDays,force:W.forceRefresh,probe:W.probe}),G=U.models.filter(rJ),H=aJ(G);if(H.length===0)throw Error(`Provider '${Z}' has no usable models after filtering.`);let V=Z1(H,"quota"),K=Z1(H,"quality"),Y=W0(),z=P.join(Y,`${Z}.quota.json`),q=P.join(Y,`${Z}.quality.json`);I$(z,U1("quota",V)),I$(q,U1("quality",K));let A=new Set([...Object.values(V),...Object.values(K)]),j=H.filter((O)=>A.has(O.fullId)&&K1(O)).length;return{quotaPath:z,qualityPath:q,catalogPath:Q,quotaModels:V,qualityModels:K,heuristicFallbackCount:X,selectedHeuristicFallbackCount:j}}async function A1($,J,B){let{filePath:W,profile:Z}=S$(B),Q=J.modelRegistry.getAvailable().map(Z$),U=Object.entries(Z.subagents.agentOverrides).filter(([,H])=>typeof H?.model==="string"&&H.model.trim()).map(([H,V])=>({agent:H,model:V.model.trim()})),X=new Map,G=[];for(let H of U){let V=O$(H.model,Q),{thinkingSuffix:K}=Q$(H.model),Y=V?`${V.fullId}${K}`:H.model,z=X.get(Y);if(!z)z=await H1($,J,Y),X.set(Y,z);G.push({agent:H.agent,model:H.model,inRegistry:V!==void 0,probe:z})}return{profileName:B,filePath:W,results:G}}import*as k$ from"node:fs";import*as x from"node:path";import{fileURLToPath as QB}from"node:url";var UB=new Set(["chain-prompts","prompt-workflow","run","chain","parallel","run-chain","subagents-doctor","subagents-models"]);function XB(){return x.resolve(x.dirname(QB(import.meta.url)),"..","..","prompts")}function GB($){return[XB(),x.join(T(),"prompts"),x.join(b($),"prompts")]}function YB($){let J=[];for(let B of GB($)){let W;try{W=k$.readdirSync(B,{withFileTypes:!0})}catch{continue}for(let Z of W)if(Z.isFile()&&Z.name.endsWith(".md"))J.push(x.join(B,Z.name))}return J}function VB($){return $.split(/\r?\n/).map((J)=>J.trim()).find(Boolean)??"Prompt workflow"}function J$($,J){let B=$[J]?.trim();return B?B:void 0}function y$($,J){let B=$[J]?.trim().toLowerCase();if(B==="true"||B==="yes"||B==="1")return!0;if(B==="false"||B==="no"||B==="0")return!1;return}function HB($){if(!$)return;if($==="false")return!1;let J=$.split(",").map((B)=>B.trim()).filter(Boolean);return J.length>1?J:J[0]}function KB($){let J=J$($,"subagent");if(!J||J==="true")return"delegate";return J}function zB($){let J=k$.readFileSync($,"utf-8"),{frontmatter:B,body:W}=t(J),Z=x.basename($,".md");if(!Z||UB.has(Z))return;let Q=J$(B,"model"),U=HB(J$(B,"skill")),X=J$(B,"cwd"),G=J$(B,"chain");return{name:Z,description:J$(B,"description")??VB(W),body:W,filePath:$,agent:KB(B),...y$(B,"inheritContext")===!0||y$(B,"fork")===!0?{context:"fork"}:{},...y$(B,"fresh")===!0?{context:"fresh"}:{},...Q?{model:Q}:{},...U!==void 0?{skill:U}:{},...X?{cwd:X}:{},...y$(B,"worktree")===!0?{worktree:!0}:{},...G?{chain:G}:{}}}function j1($){let J=new Map;for(let B of YB($)){let W=zB(B);if(W)J.set(W.name,W)}return[...J.values()].sort((B,W)=>B.name.localeCompare(W.name))}function N1($){let J=[],B="",W,Z=!1;for(let Q of $){if(Z){B+=Q,Z=!1;continue}if(Q==="\\"){Z=!0;continue}if(W){if(Q===W)W=void 0;else B+=Q;continue}if(Q==="'"||Q==='"'){W=Q;continue}if(/\s/.test(Q)){if(B)J.push(B),B="";continue}B+=Q}if(B)J.push(B);return J}function qB($,J){let B=J.join(" ");return $.replace(/\$ARGUMENTS/g,B).replace(/\$@/g,B).replace(/\$\{(\d+):-([^}]*)\}/g,(W,Z,Q)=>J[Number(Z)-1]||Q).replace(/\$(\d+)/g,(W,Z)=>J[Number(Z)-1]??"")}function O1($){let J=[],B,W=!1,Z=!1,Q=!1,U=!1;for(let X=0;X<$.length;X++){let G=$[X];if(G==="--fork"){W=!0;continue}if(G==="--fresh"){Z=!0;continue}if(G==="--worktree"){Q=!0;continue}if(G==="--bg"||G==="--async"){U=!0;continue}if(G==="--subagent"){B=$[++X];continue}let H=G.match(/^--subagent(?:=|:)(.+)$/);if(H){B=H[1];continue}J.push(G)}return{args:J,agentOverride:B,fork:W,fresh:Z,worktree:Q,bg:U}}function CB($){let J=$.indexOf(" -- ");if(J===-1)return{declaration:$.trim(),argsText:""};return{declaration:$.slice(0,J).trim(),argsText:$.slice(J+4).trim()}}function w1($){return $.split(" -> ").map((J)=>J.trim()).filter(Boolean)}function R1($,J,B){let W=qB($.body,J).trim(),Z=B.fork?"fork":B.fresh?"fresh":$.context;return{agent:B.agentOverride??$.agent,task:W,clarify:!1,agentScope:"both",...Z?{context:Z}:{},...$.model?{model:$.model}:{},...$.skill!==void 0?{skill:$.skill}:{},...$.cwd?{cwd:$.cwd}:{},...B.worktree||$.worktree?{worktree:!0}:{},...B.bg?{async:!0}:{}}}function F1($,J,B){let W=R1($,J,B);return{agent:W.agent??"delegate",task:W.task,...W.model?{model:W.model}:{},...W.skill!==void 0?{skill:W.skill}:{},...W.cwd?{cwd:W.cwd}:{}}}function Q0($,J){return $.find((B)=>B.name===J)}function L1($){if($.length===0)return"No prompt workflows found in package, user, or project prompts.";return["Prompt workflows:",...$.map((J)=>`- ${J.name}: ${J.description} (${J.filePath})`)].join(`
|
|
13
|
+
`)}function M1($){let{pi:J,run:B}=$;J.registerCommand("prompt-workflow",{description:"Run a prompt template through native dm-subagents: /prompt-workflow <name> [args]",handler:async(W,Z)=>{let Q=N1(W),U=Q.shift(),X=j1(Z.cwd);if(!U||U==="list"){J.sendMessage({content:L1(X),display:!0});return}let G=Q0(X,U);if(!G){Z.ui.notify(`Unknown prompt workflow: ${U}`,"error");return}let H=O1(Q);try{if(G.chain){let K=w1(G.chain).map((Y)=>{let z=Q0(X,Y);if(!z)throw Error(`Unknown prompt workflow in chain '${G.name}': ${Y}`);return F1(z,H.args,H)});await B({chain:K,task:H.args.join(" "),clarify:!1,agentScope:"both",...H.bg?{async:!0}:{}},Z);return}await B(R1(G,H.args,H),Z)}catch(V){Z.ui.notify(V instanceof Error?V.message:String(V),"error")}}}),J.registerCommand("chain-prompts",{description:"Run prompt templates as a native subagent chain: /chain-prompts analyze -> fix -- args",handler:async(W,Z)=>{let{declaration:Q,argsText:U}=CB(W),X=j1(Z.cwd);if(!Q||Q==="list"){J.sendMessage({content:L1(X),display:!0});return}let G=O1(N1(U)),H=w1(Q);if(H.length===0){Z.ui.notify("Usage: /chain-prompts prompt-a -> prompt-b -- args","error");return}try{let V=H.map((K)=>{let Y=Q0(X,K);if(!Y)throw Error(`Unknown prompt workflow: ${K}`);return F1(Y,G.args,G)});await B({chain:V,task:G.args.join(" "),clarify:!1,agentScope:"both",...G.bg?{async:!0}:{}},Z)}catch(V){Z.ui.notify(V instanceof Error?V.message:String(V),"error")}}})}var C$=new Map,U0=new Map,_B=1,AB=[],jB={input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0};function f$(){return _B++}function NB(){return{...jB}}function b$($,J,B,W){return{agent:$,task:J,exitCode:0,messages:AB,usage:NB(),progress:{...W!==void 0?{index:W}:{},agent:$,status:B,task:J,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}}}function OB($){let J=$.tasks??[];return{content:[{type:"text",text:J.map((B)=>`${B.agent}: ${B.task}`).join(`
|
|
14
|
+
|
|
15
|
+
`)}],details:{mode:"parallel",...$.context?{context:$.context}:{},results:J.map((B,W)=>b$(B.agent,B.task,"running",W)),progress:J.map((B,W)=>({index:W,agent:B.agent,status:"running",task:B.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}))}}}function T1($){return"parallel"in $&&Array.isArray($.parallel)}function wB($){if(T1($))return`[${$.parallel.map((J)=>J.agent).join("+")}]`;return $.agent}function FB($,J){let B=[],W=0;for(let Z of $){if(T1(Z)){for(let Q of Z.parallel)B.push(b$(Q.agent,Q.task??J??"",B.length===0?"running":"pending",W)),W++;continue}B.push(b$(Z.agent,Z.task??J??"",B.length===0?"running":"pending",W)),W++}return B}function LB($){let J=$.chain??[],B=FB(J,$.task);return{content:[{type:"text",text:B.map((W,Z)=>`Step ${Z+1}: ${W.agent}
|
|
16
|
+
${W.task}`).join(`
|
|
17
|
+
|
|
18
|
+
`)}],details:{mode:"chain",...$.context?{context:$.context}:{},results:B,progress:B.map((W,Z)=>({index:Z,agent:W.agent,status:Z===0?"running":"pending",task:W.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0})),chainAgents:J.map((W)=>wB(W)),totalSteps:J.length,currentStepIndex:0}}}function RB($){let J=$.agent??"subagent",B=$.task??"";return{content:[{type:"text",text:B}],details:{mode:"single",...$.context?{context:$.context}:{},results:[b$(J,B,"running")],progress:[{agent:J,status:"running",task:B,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}]}}}function X0($,J){let B=(J.tasks?.length??0)>0?OB(J):(J.chain?.length??0)>0?LB(J):RB(J);return C$.set($,{result:B,version:f$()}),U0.delete($),{requestId:$,result:B}}function MB($,J){return $.map((B,W)=>{let Z=J?.find((Q)=>Q.index===W)??J?.[W]??B.progress;return Z?{...B,progress:Z}:B})}function E1($,J){let B=C$.get($);if(!B)return;let W=J.progress;if(!W||!B.result.details)return;let Z=W.findIndex((U)=>U.status==="running"),Q={...B.result.details,progress:W,results:MB(B.result.details.results,W),...B.result.details.mode==="chain"&&Z>=0?{currentStepIndex:Z}:{}};C$.set($,{result:{...B.result,details:Q},version:f$()})}function I1($){let J={result:$.result,version:f$()};return U0.set($.requestId,J),C$.delete($.requestId),{requestId:$.requestId,result:$.result}}function D1($,J,B){let W=X0($,J).result,Z=W.details.results.map((X)=>({...X,exitCode:1,error:B,progress:X.progress?{...X.progress,status:"failed"}:X.progress})),Q={content:[{type:"text",text:B}],details:{...W.details,results:Z,progress:Z.map((X)=>X.progress).filter(Boolean)}},U={result:Q,version:f$()};return U0.set($,U),C$.delete($),{requestId:$,result:Q}}function TB($){if(!$||typeof $!=="object")return!1;let J=$;if(typeof J.requestId!=="string"||!J.requestId)return!1;if(!J.result||!Array.isArray(J.result.content))return!1;return!!J.result.details&&Array.isArray(J.result.details.results)}function S1($){return TB($)?$:void 0}var yB=($)=>{let J={};for(let B of $.split(",")){let W=B.trim();if(!W)continue;let Z=W.indexOf("=");if(Z===-1){if(W==="progress")J.progress=!0;continue}let Q=W.slice(0,Z).trim(),U=W.slice(Z+1).trim();switch(Q){case"output":J.output=U==="false"?!1:U;break;case"outputMode":if(U==="inline"||U==="file-only")J.outputMode=U;break;case"reads":J.reads=U==="false"?!1:U.split("+").filter(Boolean);break;case"model":J.model=U||void 0;break;case"skill":case"skills":J.skill=U==="false"?!1:U.split("+").filter(Boolean);break;case"progress":J.progress=U!=="false";break;case"as":J.as=U||void 0;break;case"label":J.label=U||void 0;break;case"phase":J.phase=U||void 0;break;case"cwd":J.cwd=U||void 0;break;case"count":{let X=Number(U);if(Number.isInteger(X)&&X>0)J.count=X;break}case"outputSchema":J.outputSchema=U||void 0;break;case"acceptance":J.acceptance=U||void 0;break}}return J},f1=($)=>{let J=$.indexOf("[");if(J===-1)return{name:$,config:{}};let B=$.lastIndexOf("]");return{name:$.slice(0,J),config:yB($.slice(J+1,B!==-1?B:void 0))}},P$=($)=>{let J=$.trim(),B=!1,W=!1;while(!0){if(J.endsWith(" --bg")||J==="--bg"){B=!0,J=J==="--bg"?"":J.slice(0,-5).trim();continue}if(J.endsWith(" --fork")||J==="--fork"){W=!0,J=J==="--fork"?"":J.slice(0,-7).trim();continue}break}return{args:J,bg:B,fork:W}},G0=($,J)=>(B)=>{if(!$.baseCwd)return null;let W=z$($.baseCwd,"both").agents;if(!J){if(B.includes(" "))return null;return W.filter((K)=>K.name.startsWith(B)).map((K)=>({value:K.name,label:K.name}))}let Z=!1,Q=!1,U=0,X=0;for(let K=0;K<B.length;K++){let Y=B[K];if(Z){if(Y==="'")Z=!1;continue}if(Q){if(Y==='"')Q=!1;continue}if(Y==="'"){Z=!0;continue}if(Y==='"'){Q=!0;continue}if(Y==="("){if(!B.slice(X,K).includes(" -- "))U++,X=K+1}else if(Y===")"){if(U>0)U--,X=K+1}else if(Y==="|"&&U>0)X=K+1;else if(Y===">"&&B[K-1]==="-"&&U===0)X=K+1}if(Z||Q)return null;let G=B.slice(X);if(G.includes(" -- ")||G.includes('"')||G.includes("'"))return null;let H=(G.match(/(\S*)$/)||["",""])[1],V=B.slice(0,B.length-H.length);if(H===""&&/[>|]$/.test(V))V=`${V} `;return W.filter((K)=>K.name.startsWith(H)).map((K)=>({value:`${V}${K.name}`,label:K.name}))},P1=($)=>{let J=new Map;for(let B of W1($).chains)J.set(B.name,B);return Array.from(J.values())},kB=($)=>(J)=>{if(J.includes(" ")||!$.baseCwd)return null;return P1($.baseCwd).filter((B)=>B.name.startsWith(J)).map((B)=>({value:B.name,label:B.name}))},bB=()=>($)=>{if($.includes(" "))return null;return s$.filter((J)=>J.startsWith($)).map((J)=>({value:J,label:J}))},y1=($)=>(J)=>{if(J.includes(" "))return null;let B=$.lastUiContext?.modelRegistry?.getAvailable?.();if(!Array.isArray(B))return null;return[...new Set(B.map((Z)=>typeof Z?.provider==="string"?Z.provider:"").filter(Boolean))].sort((Z,Q)=>Z.localeCompare(Q)).filter((Z)=>Z.startsWith(J)).map((Z)=>({value:Z,label:Z}))};function n($,J){$.sendMessage({customType:q0,content:J,display:!0})}async function x$($,J,B){if($.hasUI)$.ui.setStatus("subagent-slash-text",J);try{return await B()}finally{if($.hasUI)$.ui.setStatus("subagent-slash-text",void 0)}}function Y0(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0}}function h$($,J){$.input+=J.input,$.output+=J.output,$.cacheRead+=J.cacheRead,$.cacheWrite+=J.cacheWrite,$.cost+=J.cost,$.turns+=J.turns}function fB($){return $.input!==0||$.output!==0||$.cacheRead!==0||$.cacheWrite!==0||$.cost!==0||$.turns!==0}function PB($){if(!$||typeof $!=="object")return;let J=$;if(J.role!=="assistant"||!J.usage||typeof J.usage!=="object")return;let B=J.usage;return{input:typeof B.input==="number"?B.input:0,output:typeof B.output==="number"?B.output:0,cacheRead:typeof B.cacheRead==="number"?B.cacheRead:0,cacheWrite:typeof B.cacheWrite==="number"?B.cacheWrite:0,cost:typeof B.cost?.total==="number"?B.cost.total:0,turns:1}}function k1($){if(!$||typeof $!=="object")return!1;let J=$;return typeof J.mode==="string"&&Array.isArray(J.results)}function xB($){if(!$||typeof $!=="object")return;let J=$;if(J.type==="custom_message"&&J.customType===s){let W=S1(J.details)?.result.details;return k1(W)?W:void 0}if(J.type!=="message"||!J.message||typeof J.message!=="object")return;let B=J.message;if(B.role!=="toolResult"||B.toolName!=="subagent")return;return k1(B.details)?B.details:void 0}function v$($,J){let B=[J.cacheRead?`cache read ${U$(J.cacheRead)}`:"",J.cacheWrite?`cache write ${U$(J.cacheWrite)}`:"",J.turns?`${J.turns} turn${J.turns===1?"":"s"}`:""].filter(Boolean);return`${$}: ↑${U$(J.input)} ↓${U$(J.output)} $${J.cost.toFixed(4)}${B.length?` (${B.join(", ")})`:""}`}function hB($){let J=Y0(),B=Y0(),W=Y0(),Z=[];for(let U of $.sessionManager.getBranch()){let X=U.type==="message"?U.message:void 0,G=PB(X);if(G)h$(J,G);let H=xB(U);if(!H)continue;for(let V of H.results){if(!fB(V.usage))continue;let K={...V.usage};Z.push({label:`Child ${Z.length+1} (${V.agent})`,usage:K,...V.sessionFile?{sessionFile:V.sessionFile}:{}}),h$(B,K)}}h$(W,J),h$(W,B);let Q=["Subagent cost","",v$("Parent",J)];if(Z.length===0)Q.push("No subagent child usage found in this session.");else for(let U of Z)if(Q.push(v$(U.label,U.usage)),U.sessionFile)Q.push(` Session: ${U.sessionFile}`);return Q.push("────────────────────────────",v$("Children",B),v$("Total",W)),Q.join(`
|
|
19
|
+
`)}function g$($,J){let B=$.trim().split(/\s+/).filter(Boolean);if(B.length!==1)return{ok:!1,message:J};return{ok:!0,value:B[0]}}function vB($){let J=$.subagents?.agentOverrides?.worker?.model;return typeof J==="string"&&J.trim()?J.trim():void 0}function u$($,J,B){if(B===void 0)return;if(typeof B==="string"){let W=g.isAbsolute(B)?B:g.join(g.dirname($.filePath),B),Z=JSON.parse(_$.readFileSync(W,"utf-8"));return w$(Z,`outputSchema for chain '${$.name}' step '${J}' (${W})`),Z}return w$(B,`outputSchema for chain '${$.name}' step '${J}'`),B}var gB=($,J=!1)=>{return $.steps.map((B)=>{if(i(B)){let Z=B.parallel.map((Q)=>{let{outputSchema:U,...X}=Q,G=u$($,Q.agent,U);return{...X,...G?{outputSchema:G}:{}}});return{...B,parallel:Z,...J?{worktree:!0}:{}}}if(d(B)){let{outputSchema:Z,...Q}=B.parallel,U=u$($,B.parallel.agent,Z),X=u$($,`${B.collect.as} collection`,B.collect.outputSchema);return{...B,parallel:{...Q,...U?{outputSchema:U}:{}},collect:{...B.collect,...X?{outputSchema:X}:{}}}}let W=u$($,B.agent,B.outputSchema);return{agent:B.agent,task:B.task||void 0,...B.phase?{phase:B.phase}:{},...B.label?{label:B.label}:{},...B.as?{as:B.as}:{},...W?{outputSchema:W}:{},...B.acceptance!==void 0?{acceptance:B.acceptance}:{},output:B.output,outputMode:B.outputMode,reads:B.reads,progress:B.progress,skill:B.skill??B.skills,model:B.model}})};async function uB($,J,B,W){return new Promise((Z,Q)=>{let U=!1,X=!1,H=setTimeout(()=>{O(()=>Q(Error("Slash subagent bridge did not start within 15s. Ensure the extension is loaded correctly.")))},15000),V=(N)=>{if(U||!N||typeof N!=="object")return;if(N.requestId!==B)return;if(X=!0,clearTimeout(H),J.hasUI)J.ui.setStatus("subagent-slash","running...")},K=(N)=>{if(U||!N||typeof N!=="object")return;let L=N;if(L.requestId!==B)return;clearTimeout(H),O(()=>Z(L))},Y=(N)=>{if(U||!N||typeof N!=="object")return;let L=N;if(L.requestId!==B)return;if(E1(B,L),!J.hasUI)return;let h=L.currentTool?` ${L.currentTool}`:"",R=L.toolCount??0,k=IB("app.tools.expand");J.ui.setStatus("subagent-slash",`${R} tools${h} | ${k} live detail`)},z=J.hasUI?J.ui.onTerminalInput((N)=>{if(!SB(N,DB.escape))return;return $.events.emit(N0,{requestId:B}),O(()=>Q(Error("Cancelled"))),{consume:!0}}):void 0,q=$.events.on(_0,V),A=$.events.on(A0,K),j=$.events.on(j0,Y),O=(N)=>{if(U)return;U=!0,clearTimeout(H),q(),A(),j(),z?.(),N()};if($.events.emit(C0,{requestId:B,params:W,ctx:J}),!X&&U)return;if(!X)O(()=>Q(Error("No slash subagent bridge responded. Ensure the subagent extension is loaded correctly.")))})}function x1($){if(typeof $==="string")return $;if(!Array.isArray($))return"";return $.filter((J)=>J?.type==="text"&&typeof J.text==="string").map((J)=>J.text).join(`
|
|
20
|
+
`)}function V0($){return $.map((J)=>`- \`${J}\``).join(`
|
|
21
|
+
`)}function H0($,J){return $.map(J).filter((B)=>typeof B==="string"&&B.length>0)}function mB($){let J=x1($.result.content)||$.errorText||"(no output)",B=$.result.details?.results??[],W=H0(B,(X)=>X.sessionFile),Z=H0(B,(X)=>X.savedOutputPath),Q=H0(B,(X)=>X.artifactPaths?.outputPath),U=["## Subagent result",J];if(W.length>0)U.push("## Child session exports",V0(W));if(Z.length>0)U.push("## Saved outputs",V0(Z));if(Q.length>0)U.push("## Artifact outputs",V0(Q));return U.join(`
|
|
22
|
+
|
|
23
|
+
`)}function K0($){try{if(!$.sessionManager)return;let J=$.sessionManager,B=J.getSessionFile();if(!B||typeof J._rewriteFile!=="function")return;_$.mkdirSync(g.dirname(B),{recursive:!0}),J._rewriteFile(),J.flushed=!0}catch(J){console.error("Failed to persist slash session snapshot for export:",J)}}async function v($,J,B){if(J.hasUI)J.ui.setToolsExpanded(!1);let W=EB(),Z=X0(W,B),Q=x1(Z.result.content)||"Running subagent...";$.sendMessage({customType:s,content:Q,display:!0,details:Z}),K0(J);try{let U=await uB($,J,W,B),X=I1(U);if($.sendMessage({customType:s,content:mB(U),display:!J.hasUI,details:X}),K0(J),J.hasUI)J.ui.setStatus("subagent-slash",void 0);if(U.isError&&J.hasUI)J.ui.notify(U.errorText||"Subagent failed","error")}catch(U){let X=U instanceof Error?U.message:String(U),G=D1(W,B,X);if($.sendMessage({customType:s,content:`## Subagent result
|
|
24
|
+
|
|
25
|
+
${X}`,display:!J.hasUI,details:G}),K0(J),J.hasUI)J.ui.setStatus("subagent-slash",void 0);if(X==="Cancelled"){if(J.hasUI)J.ui.notify("Cancelled","warning");return}if(J.hasUI)J.ui.notify(X,"error")}}var D9='Usage: /chain agent "task" -> (agent2 "task" | agent3 "task") -> agent4';class S extends Error{}function b1($){let J=0,B=!1,W=!1;for(let Z=0;Z<$.length;Z++){let Q=$[Z];if(B){if(Q==="'")B=!1;continue}if(W){if(Q==='"')W=!1;continue}if(Q==="'"){B=!0;continue}if(Q==='"'){W=!0;continue}if(Q==="(")J++;else if(Q===")"){if(J--,J<0)return!0}}return J!==0}function h1($){let J=[],B=0,W=!1,Z=!1,Q=0;for(let U=0;U<$.length;U++){let X=$[U];if(W){if(X==="'")W=!1;continue}if(Z){if(X==='"')Z=!1;continue}if(X==="'"){W=!0;continue}if(X==='"'){Z=!0;continue}if(X==="(")B++;else if(X===")")B--;else if(B===0&&X==="-"&&$[U+1]===">"&&$[U+2]===" ")J.push($.slice(Q,U)),U+=2,Q=U+1}return J.push($.slice(Q)),J}function cB($){let J=[],B=0,W=!1,Z=!1,Q=0;for(let U=0;U<$.length;U++){let X=$[U];if(W){if(X==="'")W=!1;continue}if(Z){if(X==='"')Z=!1;continue}if(X==="'"){W=!0;continue}if(X==='"'){Z=!0;continue}if(X==="(")B++;else if(X===")")B--;else if(X==="|"&&B===0)J.push($.slice(Q,U)),Q=U+1}return J.push($.slice(Q)),J}function m$($){let J,B,W=$.match(/^(\S+(?:\[[^\]]*\])?)\s+(?:"([^"]*)"|'([^']*)')$/);if(W)J=W[1],B=(W[2]??W[3])||void 0;else{let Z=$.indexOf(" -- ");if(Z!==-1)J=$.slice(0,Z).trim(),B=$.slice(Z+4).trim()||void 0;else J=$}return{kind:"step",...f1(J),task:B}}var dB=($)=>{let J={};for(let B of $.split(",")){let W=B.trim();if(!W)continue;let Z=W.indexOf("="),Q=Z===-1?W:W.slice(0,Z).trim(),U=Z===-1?"":W.slice(Z+1).trim();switch(Q){case"concurrency":{let X=Number(U);if(Number.isInteger(X)&&X>0)J.concurrency=X;break}case"failFast":J.failFast=Z===-1?!0:U!=="false";break;case"worktree":J.worktree=Z===-1?!0:U!=="false";break}}return J},nB=($)=>{let J=0,B=!1,W=!1,Z=-1;for(let X=0;X<$.length;X++){let G=$[X];if(B){if(G==="'")B=!1;continue}if(W){if(G==='"')W=!1;continue}if(G==="'"){B=!0;continue}if(G==='"'){W=!0;continue}if(G==="(")J++;else if(G===")"){if(J--,J===0){Z=X;break}}}if(Z===-1)throw new S(`Unmatched parentheses in group: '${$}'`);let Q=$.slice(1,Z),U=$.slice(Z+1).trim();if(!U)return{inner:Q,config:{}};if(!U.startsWith("[")||!U.endsWith("]"))throw new S(`Group options must be wrapped in [...]: '${U}'`);return{inner:Q,config:dB(U.slice(1,-1))}};function pB($){let J=$.trim();if(!J.startsWith("("))throw new S(`Parallel group must be wrapped in parentheses: '${J}'`);let{inner:B,config:W}=nB(J),Z=cB(B).map((Q)=>Q.trim()).filter((Q)=>Q.length>0);if(Z.length<2)throw new S("Parallel group must contain at least two tasks separated by ' | '");return{kind:"group",tasks:Z.map((Q)=>m$(Q)),config:W}}function oB($){return h1($).some((J)=>J.trim().startsWith("("))}function lB($){let J=$.trim();if(!J.includes(" -> "))throw new S('Parallel groups in /chain require " -> " between steps');if(b1(J))throw new S("Unmatched parentheses in /chain expression");let B=[];for(let W of h1(J)){let Z=W.trim();if(!Z)continue;if(Z.startsWith("(")){B.push(pB(Z));continue}if(b1(Z))throw new S(`Unmatched parentheses in chain segment: '${Z}'`);B.push(m$(Z))}if(B.length===0)throw new S("/chain expression must include at least one step");return{steps:B}}var v1=($,J,B,W)=>{let Z=J.trim(),Q=`Usage: /${B} agent1 "task1" -> agent2 "task2"`,U,X,G=!1;if(Z.includes(" -> ")){G=!0;let V=Z.split(" -> ");U=[];for(let K of V){let Y=K.trim();if(!Y)continue;U.push(m$(Y))}X=U.find((K)=>K.task)?.task??""}else{let V=Z.indexOf(" -- ");if(V===-1)return W.ui.notify(Q,"error"),null;let K=Z.slice(0,V).trim();if(X=Z.slice(V+4).trim(),!K||!X)return W.ui.notify(Q,"error"),null;U=K.split(/\s+/).filter(Boolean).map((Y)=>m$(Y))}if(U.length===0)return W.ui.notify(Q,"error"),null;if(!$.baseCwd)return W.ui.notify("Subagent session cwd is not initialized yet","error"),null;let H=z$($.baseCwd,"both").agents;for(let V of U)if(!H.find((K)=>K.name===V.name))return W.ui.notify(`Unknown agent: ${V.name}`,"error"),null;if(B==="chain"&&!U[0]?.task&&(G||!X))return W.ui.notify('First step must have a task: /chain agent "task" -> agent2',"error"),null;if(B==="parallel"&&!U.some((V)=>V.task)&&!X)return W.ui.notify("At least one step must have a task","error"),null;return{steps:U,task:X}},sB=new Set(["auto","attested","checked"]);function iB($,J){let B=e($,`acceptance for step '${J}'`);if(B.length>0)throw new S(B[0]);if(!sB.has($))throw new S(`Inline acceptance for step '${J}' supports auto, attested, or checked. Use the subagent tool API or a saved .chain.json file for none, verified, or reviewed acceptance contracts.`)}function aB($,J,B){let W=g.isAbsolute(B)?B:g.join($,B),Z=`outputSchema for step '${J}' (${W})`,Q;try{Q=JSON.parse(_$.readFileSync(W,"utf-8"))}catch(U){throw new S(`Cannot read ${Z}: ${U instanceof Error?U.message:String(U)}`)}return w$(Q,Z),Q}var z0=($,J,B,W)=>{let{name:Z,config:Q,task:U}=$;if(Q.acceptance!==void 0)iB(Q.acceptance,Z);return{agent:Z,...U?{task:U}:B&&J?{task:J}:{},...Q.output!==void 0?{output:Q.output}:{},...Q.outputMode!==void 0?{outputMode:Q.outputMode}:{},...Q.reads!==void 0?{reads:Q.reads}:{},...Q.model?{model:Q.model}:{},...Q.skill!==void 0?{skill:Q.skill}:{},...Q.progress!==void 0?{progress:Q.progress}:{},...Q.as?{as:Q.as}:{},...Q.label?{label:Q.label}:{},...Q.phase?{phase:Q.phase}:{},...Q.cwd?{cwd:Q.cwd}:{},...W.inGroup&&Q.count!==void 0?{count:Q.count}:{},...Q.outputSchema?{outputSchema:aB(W.baseCwd,Z,Q.outputSchema)}:{},...Q.acceptance?{acceptance:Q.acceptance}:{}}};function rB($,J,B){let W=(Y)=>B.ui.notify(Y,"error");if(!oB(J)){let Y=v1($,J,"chain",B);if(!Y)return null;let z=$.baseCwd;try{return{chain:Y.steps.map((A,j)=>z0(A,Y.task||void 0,j===0,{baseCwd:z,inGroup:!1})),task:Y.task}}catch(q){return W(q instanceof Error?q.message:String(q)),null}}let Z;try{Z=lB(J)}catch(Y){return W(Y instanceof Error?Y.message:String(Y)),null}if(!$.baseCwd)return W("Subagent session cwd is not initialized yet"),null;let Q=z$($.baseCwd,"both").agents,U=Z.steps.flatMap((Y)=>Y.kind==="group"?Y.tasks.map((z)=>z.name):[Y.name]);for(let Y of U)if(!Q.find((z)=>z.name===Y))return W(`Unknown agent: ${Y}`),null;for(let Y of Z.steps)if(Y.kind==="group"&&Y.tasks.some((z)=>!z.task))return W('Each task in a parallel group needs a task: (agent "a" | agent "b")'),null;let X=Z.steps[0];if(!(X.kind==="group"?X.tasks.some((Y)=>Boolean(Y.task)):Boolean(X.task)))return W('First step must have a task: /chain agent "task" -> agent2'),null;let H=X.kind==="group"?X.tasks.find((Y)=>Y.task)?.task??"":X.task??"",V=$.baseCwd,K;try{K=Z.steps.map((Y)=>{if(Y.kind==="group")return{parallel:Y.tasks.map((q)=>z0(q,void 0,!1,{baseCwd:V,inGroup:!0})),...Y.config.concurrency!==void 0?{concurrency:Y.config.concurrency}:{},...Y.config.failFast!==void 0?{failFast:Y.config.failFast}:{},...Y.config.worktree!==void 0?{worktree:Y.config.worktree}:{}};return z0(Y,H||void 0,!1,{baseCwd:V,inGroup:!1})})}catch(Y){return W(Y instanceof Error?Y.message:String(Y)),null}return{chain:K,task:H}}function S9($,J){$.registerCommand("run",{description:"Run a subagent directly: /run agent[output=file] [task] [--bg] [--fork]",getArgumentCompletions:G0(J,!1),handler:async(B,W)=>{let{args:Z,bg:Q,fork:U}=P$(B),X=Z.trim(),G=X.indexOf(" ");if(!X){W.ui.notify("Usage: /run <agent> [task] [--bg] [--fork]","error");return}let{name:H,config:V}=f1(G===-1?X:X.slice(0,G)),K=G===-1?"":X.slice(G+1).trim();if(!J.baseCwd){W.ui.notify("Subagent session cwd is not initialized yet","error");return}if(!z$(J.baseCwd,"both").agents.find((A)=>A.name===H)){W.ui.notify(`Unknown agent: ${H}`,"error");return}let z=K;if(V.reads&&Array.isArray(V.reads)&&V.reads.length>0)z=`[Read from: ${V.reads.join(", ")}]
|
|
26
|
+
|
|
27
|
+
${z}`;let q={agent:H,task:z,clarify:!1,agentScope:"both"};if(V.output!==void 0)q.output=V.output;if(V.outputMode!==void 0)q.outputMode=V.outputMode;if(V.skill!==void 0)q.skill=V.skill;if(V.model)q.model=V.model;if(Q)q.async=!0;if(U)q.context="fork";await v($,W,q)}}),$.registerCommand("chain",{description:'Run agents in sequence: /chain scout "task" -> planner [--bg] [--fork]',getArgumentCompletions:G0(J,!0),handler:async(B,W)=>{let{args:Z,bg:Q,fork:U}=P$(B),X=rB(J,Z,W);if(!X)return;let G={chain:X.chain,task:X.task,clarify:!1,agentScope:"both"};if(Q)G.async=!0;if(U)G.context="fork";await v($,W,G)}}),$.registerCommand("run-chain",{description:"Run a saved chain: /run-chain chainName -- task [--bg] [--fork]",getArgumentCompletions:kB(J),handler:async(B,W)=>{let{args:Z,bg:Q,fork:U}=P$(B),X=Z.indexOf(" -- "),G="Usage: /run-chain <chainName> -- <task> [--bg] [--fork]";if(X===-1){W.ui.notify("Usage: /run-chain <chainName> -- <task> [--bg] [--fork]","error");return}let H=Z.slice(0,X).trim(),V=Z.slice(X+4).trim();if(!H||!V){W.ui.notify("Usage: /run-chain <chainName> -- <task> [--bg] [--fork]","error");return}if(!J.baseCwd){W.ui.notify("Subagent session cwd is not initialized yet","error");return}let K=P1(J.baseCwd).find((z)=>z.name===H);if(!K){W.ui.notify(`Unknown chain: ${H}`,"error");return}let Y={chain:gB(K),task:V,clarify:!1,agentScope:"both"};if(Q)Y.async=!0;if(U)Y.context="fork";await v($,W,Y)}}),$.registerCommand("parallel",{description:'Run agents in parallel: /parallel scout "task1" -> reviewer "task2" [--bg] [--fork]',getArgumentCompletions:G0(J,!0),handler:async(B,W)=>{let{args:Z,bg:Q,fork:U}=P$(B),X=v1(J,Z,"parallel",W);if(!X)return;let H={tasks:X.steps.map(({name:V,config:K,task:Y})=>({agent:V,task:Y??X.task,...K.output!==void 0?{output:K.output}:{},...K.outputMode!==void 0?{outputMode:K.outputMode}:{},...K.reads!==void 0?{reads:K.reads}:{},...K.model?{model:K.model}:{},...K.skill!==void 0?{skill:K.skill}:{},...K.progress!==void 0?{progress:K.progress}:{}})),clarify:!1,agentScope:"both"};if(Q)H.async=!0;if(U)H.context="fork";await v($,W,H)}}),$.registerCommand("subagent-cost",{description:"Show parent and subagent child usage cost for this session",handler:async(B,W)=>{n($,hB(W))}}),$.registerCommand("subagents-doctor",{description:"Show subagent diagnostics",handler:async(B,W)=>{await v($,W,{action:"doctor"})}}),$.registerCommand("subagents-fleet",{description:"Show active subagent fleet status and transcript commands",handler:async(B,W)=>{await v($,W,{action:"status",view:"fleet"})}}),M1({pi:$,run:(B,W)=>v($,W,B)}),$.registerCommand("subagents-models",{description:"Show runtime-loaded builtin subagent models",getArgumentCompletions:bB(),handler:async(B,W)=>{let Z=B.trim();if(!Z){await v($,W,{action:"models"});return}let Q=Z.split(/\s+/).filter(Boolean);if(Q.length!==1){W.ui.notify("Usage: /subagents-models [builtin-agent-name]","error");return}let U=Q[0];if(!s$.includes(U)){W.ui.notify(`Unknown builtin agent: ${U}`,"error");return}await v($,W,{action:"models",agent:U})}}),$.registerCommand("subagents-profiles",{description:"List saved subagent profiles",handler:async(B,W)=>{let Z=D$();if(Z.length===0){n($,`Subagent profiles
|
|
28
|
+
|
|
29
|
+
No subagent profiles found in ~/.dm/agent/profiles/dm-subagents/`);return}n($,`Subagent profiles
|
|
30
|
+
|
|
31
|
+
${Z.join(`
|
|
32
|
+
`)}`)}}),$.registerCommand("subagents-load-profile",{description:"Load a subagent profile into ~/.dm/agent/settings.json",getArgumentCompletions:(B)=>{if(B.includes(" "))return null;return D$().filter((W)=>W.startsWith(B)).map((W)=>({value:W,label:W}))},handler:async(B,W)=>{let Z=g$(B,"Usage: /subagents-load-profile <name>");if(!Z.ok){W.ui.notify(Z.message,"error");return}try{await x$(W,`Loading profile ${Z.value}…`,async()=>{let{profile:Q}=S$(Z.value),U=vB(Q),X=C1(Z.value),G=[`Loaded subagent profile: ${Z.value}`,`Profile: ${X.filePath}`,`Updated: ${X.settingsPath}`];if(U&&typeof $.setModel==="function"&&typeof W.modelRegistry?.find==="function"&&typeof W.modelRegistry?.getAvailable==="function"){if(await W.ui.confirm("",`Profile loaded. Also switch this session to the profile worker model?
|
|
33
|
+
|
|
34
|
+
${U}`)){let V=O$(U,W.modelRegistry.getAvailable().map(Z$)),K=V?W.modelRegistry.find(V.provider,V.id):void 0;if(!V||!K)G.push(`Could not switch current session model: '${U}' is not available in the current model registry.`);else if(await $.setModel(K))G.push(`Current session model switched to: ${V.fullId}`);else G.push(`Could not switch current session model to '${U}': no API key or provider access is available.`)}}else if(U)G.push(`Profile worker model: ${U}`);n($,G.join(`
|
|
35
|
+
`))})}catch(Q){W.ui.notify(Q instanceof Error?Q.message:String(Q),"error")}}}),$.registerCommand("subagents-refresh-provider-models",{description:"Refresh the cached model catalog for one provider",getArgumentCompletions:y1(J),handler:async(B,W)=>{let Z=B.trim(),Q=/(?:^|\s)--force$/.test(Z)||/(?:^|\s)force$/.test(Z),U=Z.replace(/(?:^|\s)(?:--force|force)$/,"").trim(),X=g$(U,"Usage: /subagents-refresh-provider-models <provider> [--force]");if(!X.ok){W.ui.notify(X.message,"error");return}try{await x$(W,`Refreshing provider models for ${X.value}…`,async()=>{let G=await Z0($,W,X.value,{force:Q,maxAgeDays:q$}),H=["Provider model catalog",`Provider: ${X.value}`,`Status: ${G.reused?"fresh cache reused":"refreshed"}`,`File: ${G.filePath}`,`Models: ${G.catalog.models.length}`,`Refreshed at: ${G.catalog.refreshedAt}`];if(G.heuristicFallbackCount>0)H.push(`Warning: ${G.heuristicFallbackCount} model${G.heuristicFallbackCount===1?" was":"s were"} classified with name heuristics fallback.`);n($,H.join(`
|
|
36
|
+
`))})}catch(G){W.ui.notify(G instanceof Error?G.message:String(G),"error")}}}),$.registerCommand("subagents-generate-profiles",{description:"Generate <provider>.quota and <provider>.quality subagent profiles",getArgumentCompletions:y1(J),handler:async(B,W)=>{let Z=g$(B,"Usage: /subagents-generate-profiles <provider>");if(!Z.ok){W.ui.notify(Z.message,"error");return}try{await x$(W,`Generating profiles for ${Z.value}…`,async()=>{let Q=await _1($,W,Z.value,{maxAgeDays:q$}),U=["Generated subagent profiles",`Provider: ${Z.value}`,`Catalog: ${Q.catalogPath}`,`Quota: ${Q.quotaPath}`,` cheap=${Q.quotaModels.cheap}`,` medium=${Q.quotaModels.medium}`,` strong=${Q.quotaModels.strong}`,`Quality: ${Q.qualityPath}`,` cheap=${Q.qualityModels.cheap}`,` medium=${Q.qualityModels.medium}`,` strong=${Q.qualityModels.strong}`];if(Q.selectedHeuristicFallbackCount>0)U.push(`Warning: generated profiles depend on heuristic-only classification for ${Q.selectedHeuristicFallbackCount} selected model${Q.selectedHeuristicFallbackCount===1?"":"s"}.`);else if(Q.heuristicFallbackCount>0)U.push(`Warning: provider catalog still contains ${Q.heuristicFallbackCount} heuristic-classified model${Q.heuristicFallbackCount===1?"":"s"}.`);n($,U.join(`
|
|
37
|
+
`))})}catch(Q){W.ui.notify(Q instanceof Error?Q.message:String(Q),"error")}}}),$.registerCommand("subagents-check-profile",{description:"Check whether a saved profile still points to usable models",getArgumentCompletions:(B)=>{if(B.includes(" "))return null;return D$().filter((W)=>W.startsWith(B)).map((W)=>({value:W,label:W}))},handler:async(B,W)=>{let Z=g$(B,"Usage: /subagents-check-profile <name>");if(!Z.ok){W.ui.notify(Z.message,"error");return}try{await x$(W,`Checking profile ${Z.value}…`,async()=>{let Q=await A1($,W,Z.value),U=["Subagent profile check",`Profile: ${Q.profileName}`,`File: ${Q.filePath}`,"",...Q.results.map((X)=>`${X.agent} → ${X.model} — registry ${X.inRegistry?"ok":"missing"}; probe ${X.probe.status}${X.probe.message?` (${X.probe.message.split(/\r?\n/,1)[0]})`:""}`)];n($,U.join(`
|
|
38
|
+
`))})}catch(Q){W.ui.notify(Q instanceof Error?Q.message:String(Q),"error")}}})}export{S9 as registerSlashCommands,m$ as parseSingleTaskToken,pB as parseGroupSegment,lB as parseChainExpression,oB as hasGroupSyntax,rB as buildChainExpressionSteps,S as SlashParseError,D9 as PARALLEL_GROUP_USAGE};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import*as g from"node:os";import*as c from"node:path";function d(t){return t.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function p(t){let n=t?.env??process.env,e=t&&Object.hasOwn(t,"getuid")?t.getuid:process.getuid?.bind(process);if(typeof e==="function")return`uid-${e()}`;for(let i of["USERNAME","USER","LOGNAME"]){let a=n[i];if(a)return`user-${d(a)}`}let s=t&&Object.hasOwn(t,"userInfo")?t.userInfo:g.userInfo;try{let i=s?.().username;if(i)return`user-${d(i)}`}catch{}let r=n.USERPROFILE??n.HOME;if(r)return`home-${d(r)}`;let l=t&&Object.hasOwn(t,"homedir")?t.homedir:g.homedir;try{let i=l?.();if(i)return`home-${d(i)}`}catch{}return"shared"}var h=c.join(g.tmpdir(),`dm-subagents-${p()}`),j=c.join(h,"async-subagent-results"),D=c.join(h,"async-subagent-runs"),E=c.join(h,"chain-runs"),O=c.join(h,"artifacts");var f="subagent-slash-result";var o=new Map,u=new Map,C=1,L=[],x={input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0};function S(){return C++}function y(){return{...x}}function k(t,n,e,s){return{agent:t,task:n,exitCode:0,messages:L,usage:y(),progress:{...s!==void 0?{index:s}:{},agent:t,status:e,task:n,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}}}function A(t){let n=t.tasks??[];return{content:[{type:"text",text:n.map((e)=>`${e.agent}: ${e.task}`).join(`
|
|
2
|
+
|
|
3
|
+
`)}],details:{mode:"parallel",...t.context?{context:t.context}:{},results:n.map((e,s)=>k(e.agent,e.task,"running",s)),progress:n.map((e,s)=>({index:s,agent:e.agent,status:"running",task:e.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}))}}}function R(t){return"parallel"in t&&Array.isArray(t.parallel)}function I(t){if(R(t))return`[${t.parallel.map((n)=>n.agent).join("+")}]`;return t.agent}function T(t,n){let e=[],s=0;for(let r of t){if(R(r)){for(let l of r.parallel)e.push(k(l.agent,l.task??n??"",e.length===0?"running":"pending",s)),s++;continue}e.push(k(r.agent,r.task??n??"",e.length===0?"running":"pending",s)),s++}return e}function M(t){let n=t.chain??[],e=T(n,t.task);return{content:[{type:"text",text:e.map((s,r)=>`Step ${r+1}: ${s.agent}
|
|
4
|
+
${s.task}`).join(`
|
|
5
|
+
|
|
6
|
+
`)}],details:{mode:"chain",...t.context?{context:t.context}:{},results:e,progress:e.map((s,r)=>({index:r,agent:s.agent,status:r===0?"running":"pending",task:s.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0})),chainAgents:n.map((s)=>I(s)),totalSteps:n.length,currentStepIndex:0}}}function q(t){let n=t.agent??"subagent",e=t.task??"";return{content:[{type:"text",text:e}],details:{mode:"single",...t.context?{context:t.context}:{},results:[k(n,e,"running")],progress:[{agent:n,status:"running",task:e,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}]}}}function U(t,n){let e=(n.tasks?.length??0)>0?A(n):(n.chain?.length??0)>0?M(n):q(n);return o.set(t,{result:e,version:S()}),u.delete(t),{requestId:t,result:e}}function $(t,n){return t.map((e,s)=>{let r=n?.find((l)=>l.index===s)??n?.[s]??e.progress;return r?{...e,progress:r}:e})}function W(t,n){let e=o.get(t);if(!e)return;let s=n.progress;if(!s||!e.result.details)return;let r=s.findIndex((i)=>i.status==="running"),l={...e.result.details,progress:s,results:$(e.result.details.results,s),...e.result.details.mode==="chain"&&r>=0?{currentStepIndex:r}:{}};o.set(t,{result:{...e.result,details:l},version:S()})}function w(t){let n={result:t.result,version:S()};return u.set(t.requestId,n),o.delete(t.requestId),{requestId:t.requestId,result:t.result}}function B(t,n,e){let s=U(t,n).result,r=s.details.results.map((a)=>({...a,exitCode:1,error:e,progress:a.progress?{...a.progress,status:"failed"}:a.progress})),l={content:[{type:"text",text:e}],details:{...s.details,results:r,progress:r.map((a)=>a.progress).filter(Boolean)}},i={result:l,version:S()};return u.set(t,i),o.delete(t),{requestId:t,result:l}}function P(t){if(!t||typeof t!=="object")return!1;let n=t;if(typeof n.requestId!=="string"||!n.requestId)return!1;if(!n.result||!Array.isArray(n.result.content))return!1;return!!n.result.details&&Array.isArray(n.result.details.results)}function b(t){return P(t)?t:void 0}function F(t){return u.get(t.requestId)??o.get(t.requestId)??{result:t.result,version:0}}function J(t){o.clear(),u.clear();for(let n of t){let e=n;if(e?.type!=="custom_message"||e.customType!==f)continue;let s=b(e.details);if(!s)continue;u.set(s.requestId,{result:s.result,version:S()})}}function K(){o.clear(),u.clear()}export{J as restoreSlashFinalSnapshots,b as resolveSlashMessageDetails,F as getSlashRenderableSnapshot,w as finalizeSlashResult,B as failSlashResult,K as clearSlashSnapshots,U as buildSlashInitialResult,W as applySlashUpdate};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{truncateToWidth as f,visibleWidth as a}from"@duckmind/dm-tui";function g(n,e){let r=n.toLowerCase(),t=e.toLowerCase();if(t.includes(r))return 100+r.length/t.length*50;let o=0,i=0,s=0;for(let c=0;c<t.length&&i<r.length;c++)if(t[c]===r[i])o+=10+s,s+=5,i++;else s=0;return i===r.length?o:0}function d(n,e){let r=e.trim();if(!r)return n;return n.map((t)=>({item:t,score:Math.max(g(r,t.name),g(r,t.description)*0.8,g(r,t.model??"")*0.6)})).filter((t)=>t.score>0).sort((t,o)=>o.score-t.score).map((t)=>t.item)}function u(n,e){let r=a(n);return n+" ".repeat(Math.max(0,e-r))}function l(n,e,r){let t=e-2,o=n.replace(/[\r\n]+/g," ").replace(/\t/g," "),i=f(o,t);return r.fg("border","│")+u(i,t)+r.fg("border","│")}function m(n,e,r){let t=e-2,o=Math.max(0,t-a(n)),i=Math.floor(o/2),s=o-i;return r.fg("border","╭"+"─".repeat(i))+r.fg("accent",n)+r.fg("border","─".repeat(s)+"╮")}function h(n){let e=process.env.HOME;if(e&&n.startsWith(e))return`~${n.slice(e.length)}`;return n}function b(n,e){let r="";if(n>0)r+=`↑ ${n} more`;if(e>0)r+=`${r?" ":""}↓ ${e} more`;return r}function x(n,e,r){let t=e-2,o=Math.max(0,t-a(n)),i=Math.floor(o/2),s=o-i;return r.fg("border","╰"+"─".repeat(i))+r.fg("dim",n)+r.fg("border","─".repeat(s)+"╯")}export{l as row,m as renderHeader,x as renderFooter,u as pad,d as fuzzyFilter,b as formatScrollInfo,h as formatPath};
|