@duckmind/dm-windows-x64 0.60.4 → 0.60.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.
Files changed (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1 +1,104 @@
1
- function P(J){let Q=[];for(let Z=J.length-1;Z>=0;Z--){let $=J[Z];if($.role!=="assistant")continue;if("errorMessage"in $&&typeof $.errorMessage==="string"&&$.errorMessage.length>0||"stopReason"in $&&$.stopReason==="error")continue;for(let q=$.content.length-1;q>=0;q--){let U=$.content[q];if(U.type!=="text"||U.text.trim().length===0)continue;if(Q.push(U.text),/```acceptance-report\s*\n[\s\S]*?```/i.test(U.text))return U.text;for(let B of U.text.matchAll(/```(?:json|jsonc|json5)\s*\n([\s\S]*?)```/gi)){let j=B[1]??"";if(/"criteriaSatisfied"/.test(j)&&/"(?:changedFiles|testsAddedOrUpdated|commandsRun|validationOutput|residualRisks|noStagedFiles|diffSummary|reviewFindings|manualNotes)"/.test(j))return U.text}if(/ACCEPTANCE_REPORT\s*:/i.test(U.text))return U.text}}return Q[0]??""}function O(J){return J.finalOutput??P(J.messages??[])}import*as V from"node:os";import*as K from"node:path";function _(J){return J.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function v(J){let Q=J?.env??process.env,Z=J&&Object.hasOwn(J,"getuid")?J.getuid:process.getuid?.bind(process);if(typeof Z==="function")return`uid-${Z()}`;for(let U of["USERNAME","USER","LOGNAME"]){let B=Q[U];if(B)return`user-${_(B)}`}let $=J&&Object.hasOwn(J,"userInfo")?J.userInfo:V.userInfo;try{let U=$?.().username;if(U)return`user-${_(U)}`}catch{}let W=Q.USERPROFILE??Q.HOME;if(W)return`home-${_(W)}`;let q=J&&Object.hasOwn(J,"homedir")?J.homedir:V.homedir;try{let U=q?.();if(U)return`home-${_(U)}`}catch{}return"shared"}var M=K.join(V.tmpdir(),`dm-subagents-${v()}`),jJ=K.join(M,"async-subagent-results"),GJ=K.join(M,"async-subagent-runs"),f=K.join(M,"chain-runs"),VJ=K.join(M,"artifacts");function L(J){return"parallel"in J&&Array.isArray(J.parallel)}function H(J){return"expand"in J&&"collect"in J&&"parallel"in J&&!Array.isArray(J.parallel)}import{Compile as RJ}from"typebox/compile";class X extends Error{}var k=/^[A-Za-z_][A-Za-z0-9_]*$/,h=/^[A-Za-z_][A-Za-z0-9_]*$/,A=/\{([A-Za-z_][A-Za-z0-9_]*)(?:\.([^{}]+))?\}/g,c=new Set(["task","previous","chain_dir","outputs"]),S=new Set(["expand","parallel","collect","concurrency","failFast","phase","label","acceptance"]),g=new Set([...S,"effectiveAcceptance","sessionFiles","thinkingOverrides"]),m=new Set(["from","item","key","maxItems","onEmpty"]),u=new Set(["output","path"]),I=new Set(["agent","task","phase","label","outputSchema","cwd","output","outputMode","reads","progress","skill","model","toolBudget","acceptance"]),d=new Set([...I,"outputName","structured","inheritProjectContext","inheritSkills","skills","outputPath","maxSubagentDepth","structuredOutput","structuredOutputSchema","tools","extensions","subagentOnlyExtensions","mcpDirectTools","completionGuard","systemPrompt","systemPromptMode","thinking","modelCandidates","sessionFile","effectiveAcceptance","parentSessionId"]),p=new Set(["as","outputSchema"]);function N(J){return k.test(J)}function F(J,Q){if(J==="")return;if(!J.startsWith("/"))throw new X(`${Q} must be a JSON Pointer starting with '/'.`);for(let Z of J.slice(1).split("/"))if(/~(?![01])/.test(Z))throw new X(`${Q} contains invalid JSON Pointer escape.`)}function z(J,Q,Z){if(!J||typeof J!=="object"||Array.isArray(J))throw new X(`${Z} must be an object.`);for(let $ of Object.keys(J))if(!Q.has($))throw new X(`${Z} does not support field '${$}'.`)}function o(J,Q,Z){for(let $ of J.matchAll(/\{([^{}]*)\}/g)){let W=$[0],q=$[1];if(q===Q||q.startsWith(`${Q}.`)){if(!A.test(W)||q===`${Q}.`||q.includes(".."))throw new X(`Invalid item reference '${W}' in ${Z}.`);A.lastIndex=0;continue}A.lastIndex=0;let U=q.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];if(U===Q)throw new X(`Invalid item reference '${W}' in ${Z}.`);if(U&&c.has(U))continue;if(U)throw new X(`Unsupported template reference '${W}' in ${Z}.`)}if(A.lastIndex=0,J.includes(`{${Q}.}`)||new RegExp(`\\{${Q}(?:\\.|$)[^}]*$`).test(J))throw new X(`Invalid item reference in ${Z}.`)}function w(J){return!!J&&typeof J==="object"&&!Array.isArray(J)&&(Object.prototype.hasOwnProperty.call(J,"expand")||Object.prototype.hasOwnProperty.call(J,"collect"))}function b(J,Q,Z={}){let $=`Dynamic chain step ${Q+1}`;if(z(J,Z.allowRunnerFields?g:S,$),!J.expand||!J.expand.from)throw new X(`${$} requires expand.from.`);if(z(J.expand,m,`${$} expand`),z(J.expand.from,u,`${$} expand.from`),!N(J.expand.from.output))throw new X(`${$} has invalid expand.from.output '${J.expand.from.output}'.`);if(F(J.expand.from.path,`${$} expand.from.path`),J.expand.key!==void 0)F(J.expand.key,`${$} expand.key`);let W=J.expand.item??"item";if(!h.test(W))throw new X(`${$} has invalid expand.item '${W}'.`);if(J.expand.maxItems===void 0&&Z.maxItems===void 0)throw new X(`${$} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);if(J.expand.maxItems!==void 0&&(!Number.isInteger(J.expand.maxItems)||J.expand.maxItems<0))throw new X(`${$} expand.maxItems must be an integer >= 0.`);if(Z.maxItems!==void 0&&(!Number.isInteger(Z.maxItems)||Z.maxItems<0))throw new X("config.chain.dynamicFanout.maxItems must be an integer >= 0.");if(!J.parallel||Array.isArray(J.parallel))throw new X(`${$} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);if(z(J.parallel,Z.allowRunnerFields?d:I,`${$} parallel`),"expand"in J.parallel)throw new X(`${$} does not support nested dynamic fanout.`);if(!J.parallel.agent)throw new X(`${$} parallel.agent is required.`);if(!J.collect?.as||!N(J.collect.as))throw new X(`${$} requires collect.as with a safe output name.`);z(J.collect,p,`${$} collect`);for(let[q,U]of[["parallel.task",J.parallel.task],["parallel.label",J.parallel.label]])if(U)o(U,W,`${$} ${q}`)}var x=/\{outputs\.([^}]*)\}/g,R=/^[A-Za-z_][A-Za-z0-9_]*$/;class G extends Error{}function D(J){if(L(J))return J.parallel.map((Z)=>Z.as).filter((Z)=>Boolean(Z));if(H(J))return[J.collect.as];let Q=J.as;return Q?[Q]:[]}function n(J){if(L(J))return J.parallel.map((Q)=>Q.task??"{previous}");if(H(J))return[J.parallel.task??"{previous}",J.parallel.label??""].filter(Boolean);return[J.task??"{previous}"]}function bJ(J,Q={}){l(J,Q)}function l(J,Q={},Z={}){let $=[...Z.priorOutputNames??[]],W=new Set($),q=new Set($);for(let U=0;U<J.length;U++){let B=(Z.startStepIndex??0)+U+1,j=J[U];if(w(j)){if(!H(j))throw new G(`Dynamic chain step ${B} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);try{b(j,B-1,Q)}catch(Y){if(Y instanceof X)throw new G(Y.message);throw Y}if(!W.has(j.expand.from.output))throw new G(`Dynamic chain step ${B} references unknown output '${j.expand.from.output}'. Named outputs are only available after producing step/group completes.`)}for(let Y of D(j)){if(!R.test(Y))throw new G(`Invalid chain output name '${Y}' at step ${B}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);if(q.has(Y))throw new G(`Duplicate chain output name '${Y}'. Each as name must be unique.`);q.add(Y)}for(let Y of n(j))for(let T of Y.matchAll(x)){let C=T[0],E=T[1];if(!R.test(E))throw new G(`Invalid chain output reference '${C}' at step ${B}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);if(!W.has(E))throw new G(`Unknown chain output reference '${C}' at step ${B}. Named outputs are only available after producing step/group completes.`)}for(let Y of D(j))W.add(Y)}}function DJ(J,Q){return J.replace(x,(Z,$)=>{if(!R.test($))throw new G(`Invalid chain output reference '${Z}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);let W=Q[$];if(!W)throw new G(`Unknown chain output reference '${Z}'.`);return W.text})}function y(J){return JSON.stringify(J)}function xJ(J,Q){return{text:J.structuredOutput!==void 0?y(J.structuredOutput):O(J),...J.structuredOutput!==void 0?{structured:J.structuredOutput}:{},agent:J.agent,stepIndex:Q}}function yJ(J,Q){return{text:J.structuredOutput!==void 0?y(J.structuredOutput):J.output,...J.structuredOutput!==void 0?{structured:J.structuredOutput}:{},agent:J.agent,stepIndex:Q}}export{l as validateChainOutputBindingsWithContext,bJ as validateChainOutputBindings,DJ as resolveOutputReferences,xJ as outputEntryFromResult,yJ as outputEntryFromAsyncResult,G as ChainOutputValidationError};
1
+ import { isDynamicParallelStep, isParallelStep } from "../../shared/settings.js";
2
+ import { getSingleResultOutput } from "../../shared/utils.js";
3
+ import { DynamicFanoutError, hasDynamicFanoutFields, validateDynamicStepShape } from "./dynamic-fanout.js";
4
+ const OUTPUT_REF_PATTERN = /\{outputs\.([^}]*)\}/g;
5
+ const SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
6
+
7
+ export class ChainOutputValidationError extends Error {
8
+ }
9
+ function outputNamesForStep(step) {
10
+ if (isParallelStep(step))
11
+ return step.parallel.map((task) => task.as).filter((name) => Boolean(name));
12
+ if (isDynamicParallelStep(step))
13
+ return [step.collect.as];
14
+ const name = step.as;
15
+ return name ? [name] : [];
16
+ }
17
+ function taskTemplatesForStep(step) {
18
+ if (isParallelStep(step))
19
+ return step.parallel.map((task) => task.task ?? "{previous}");
20
+ if (isDynamicParallelStep(step))
21
+ return [step.parallel.task ?? "{previous}", step.parallel.label ?? ""].filter(Boolean);
22
+ return [step.task ?? "{previous}"];
23
+ }
24
+ export function validateChainOutputBindings(steps, dynamicFanoutConfig = {}) {
25
+ validateChainOutputBindingsWithContext(steps, dynamicFanoutConfig);
26
+ }
27
+ export function validateChainOutputBindingsWithContext(steps, dynamicFanoutConfig = {}, context = {}) {
28
+ const priorOutputNames = [...context.priorOutputNames ?? []];
29
+ const available = new Set(priorOutputNames);
30
+ const seen = new Set(priorOutputNames);
31
+ for (let stepIndex = 0;stepIndex < steps.length; stepIndex++) {
32
+ const displayStepIndex = (context.startStepIndex ?? 0) + stepIndex + 1;
33
+ const step = steps[stepIndex];
34
+ if (hasDynamicFanoutFields(step)) {
35
+ if (!isDynamicParallelStep(step)) {
36
+ throw new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);
37
+ }
38
+ try {
39
+ validateDynamicStepShape(step, displayStepIndex - 1, dynamicFanoutConfig);
40
+ } catch (error) {
41
+ if (error instanceof DynamicFanoutError)
42
+ throw new ChainOutputValidationError(error.message);
43
+ throw error;
44
+ }
45
+ if (!available.has(step.expand.from.output)) {
46
+ throw new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} references unknown output '${step.expand.from.output}'. Named outputs are only available after producing step/group completes.`);
47
+ }
48
+ }
49
+ for (const name of outputNamesForStep(step)) {
50
+ if (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {
51
+ throw new ChainOutputValidationError(`Invalid chain output name '${name}' at step ${displayStepIndex}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);
52
+ }
53
+ if (seen.has(name)) {
54
+ throw new ChainOutputValidationError(`Duplicate chain output name '${name}'. Each as name must be unique.`);
55
+ }
56
+ seen.add(name);
57
+ }
58
+ for (const template of taskTemplatesForStep(step)) {
59
+ for (const match of template.matchAll(OUTPUT_REF_PATTERN)) {
60
+ const rawReference = match[0];
61
+ const name = match[1];
62
+ if (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {
63
+ throw new ChainOutputValidationError(`Invalid chain output reference '${rawReference}' at step ${displayStepIndex}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);
64
+ }
65
+ if (!available.has(name)) {
66
+ throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}' at step ${displayStepIndex}. Named outputs are only available after producing step/group completes.`);
67
+ }
68
+ }
69
+ }
70
+ for (const name of outputNamesForStep(step)) {
71
+ available.add(name);
72
+ }
73
+ }
74
+ }
75
+ export function resolveOutputReferences(template, outputs) {
76
+ return template.replace(OUTPUT_REF_PATTERN, (rawReference, name) => {
77
+ if (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {
78
+ throw new ChainOutputValidationError(`Invalid chain output reference '${rawReference}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);
79
+ }
80
+ const entry = outputs[name];
81
+ if (!entry)
82
+ throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}'.`);
83
+ return entry.text;
84
+ });
85
+ }
86
+ function compactStructuredText(value) {
87
+ return JSON.stringify(value);
88
+ }
89
+ export function outputEntryFromResult(result, stepIndex) {
90
+ return {
91
+ text: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : getSingleResultOutput(result),
92
+ ...result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {},
93
+ agent: result.agent,
94
+ stepIndex
95
+ };
96
+ }
97
+ export function outputEntryFromAsyncResult(result, stepIndex) {
98
+ return {
99
+ text: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : result.output,
100
+ ...result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {},
101
+ agent: result.agent,
102
+ stepIndex
103
+ };
104
+ }
@@ -1,3 +1,116 @@
1
- var a=[/(^|[;&|()\s])rm\s+/,/(^|[;&|()\s])mv\s+/,/(^|[;&|()\s])cp\s+/,/(^|[;&|()\s])mkdir\s+/,/(^|[;&|()\s])touch\s+/,/(^|[;&|()\s])git\s+apply\b/,/(^|[;&|()\s])patch\s+/,/(^|[;&|()\s])sed\s+[^\n;&|]*\s-i\b/,/(^|[;&|()\s])perl\s+[^\n;&|]*\s-pi\b/,/(^|[;&|()]|\n)\s*tee\s+[^|&;]+/,/\b(writeFile|writeFileSync|appendFile|appendFileSync)\b/,/\bwrite_text\s*\(/,/\bopen\s*\([^)]*,\s*["'][wa]/];function c(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let s=e[r];if(s==="'"&&!n){t=!t;continue}if(s==='"'&&!t){n=!n;continue}if(t||n)continue;if(s!==">")continue;if(e[r-1]==="-")continue;let i=e[r+1]===">",u=r+(i?2:1);while(u<e.length&&/\s/.test(e[u]))u++;if(u>=e.length)continue;let o=e[u];if(o==="&"||o==="|"||o===";")continue;if(o==="("||o===")")continue;return!0}return!1}function l(e){return c(e)||a.some((t)=>t.test(e))}var f=[/\breview only\b/i,/\bsuggest fixes only\b/i,/\bonly return findings\b/i,/\breturn findings only\b/i],d=[/\bmust\s+(?:edit|modify|change|fix|patch|apply)\b/i,/\brequired\s+to\s+(?:edit|modify|change|fix|patch|apply)\b/i,/\bregardless\s+of\s+findings\b/i,/\balways\s+(?:edit|modify|change|fix|patch|apply)\b/i,/\bapply\s+(?:the\s+)?fix(?:es)?\s+directly\b/i,/\bmake\s+(?:the\s+)?code\s+changes\b/i],g=[/\bdo not edit\b/i,/\bdon't edit\b/i,/\bdo not modify\b/i,/\bdo not change files\b/i],h=[/\bdo not edit files?\s+outside\b/i,/\bdo not edit\s+outside\b/i,/\bdo not edit\s+unrelated files?\b/i,/\bdo not change\s+unrelated files?\b/i,/\bdo not modify\s+unrelated files?\b/i],F=[/\binvestigate\b/i,/\bscout\b/i,/\bresearch(?:er)?\b/i],b=[/\b(?:implement|fix|edit|modify|patch|refactor|delete)\b/i,/\b(?:update|add|remove|replace|create)\b(?!\s+(?:(?:a|an|the)\s+)?(?:report|summary|findings?)(?:\b|$))/i,/\bapply\s+(?:the\s+)?(?:changes?|fix(?:es)?|patch)\b/i,/\bmake\s+(?:the\s+)?changes\b/i,/\bdo those fixes\b/i],M=[/\b(?:implement|fix|edit|modify|patch|refactor)\b/i,/\bapply\s+(?:the\s+)?(?:changes?|fix(?:es)?|patch)\b/i,/\bmake\s+(?:the\s+)?changes\b/i,/\bdo those fixes\b/i,/\b(?:update|add|remove|replace|delete|create)\s+(?:the\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\.json|config|manifest|extension|prompt|command)\b/i],A=new Set(["read","grep","find","ls","web_search","fetch_content","get_search_content","intercom","contact_supervisor"]);function m(e){return e.split(`
2
- `).filter((t)=>!/^\s*\[(?:Write to|Read from):/i.test(t)).filter((t)=>!/^\s*(?:Create and maintain progress at:|Update progress at:|\*\*Output:\*\*|Write your findings to(?: exactly this path)?:|This path is authoritative for this run\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(t)).join(`
3
- `)}function v(e){let t=e;for(let n of h)t=t.replace(n," ");return t}function R(e,t){return e!==void 0&&e.length>0&&(t?.length??0)===0&&e.every((n)=>A.has(n))}function P(e,t){let n=m(t),r=v(n);if(f.some((i)=>i.test(r)))return!1;if(g.some((i)=>i.test(r)))return!1;if(F.some((i)=>i.test(e)))return!1;if(/\breviewer\b/i.test(e))return d.some((i)=>i.test(n));if(e==="worker"&&b.some((i)=>i.test(n)))return!0;return M.some((i)=>i.test(n))}function S(e){for(let t of e){if(t.role!=="assistant")continue;for(let n of t.content){if(n.type!=="toolCall")continue;if(n.name==="edit"||n.name==="write")return!0;if(n.name!=="bash")continue;let r=typeof n.arguments==="object"&&n.arguments!==null&&!Array.isArray(n.arguments)?n.arguments:{};if(typeof r.command==="string"&&l(r.command))return!0}}return!1}function _(e){let t=R(e.tools,e.mcpDirectTools)?!1:P(e.agent,e.task),n=S(e.messages);return{expectedMutation:t,attemptedMutation:n,triggered:t&&!n}}export{S as hasMutationToolCall,P as expectsImplementationMutation,_ as evaluateCompletionMutationGuard};
1
+ import { isMutatingBashCommand } from "./long-running-guard.js";
2
+ const REVIEW_ONLY_PATTERNS = [
3
+ /\breview only\b/i,
4
+ /\bsuggest fixes only\b/i,
5
+ /\bonly return findings\b/i,
6
+ /\breturn findings only\b/i
7
+ ];
8
+ const REVIEWER_REQUIRED_EDIT_PATTERNS = [
9
+ /\bmust\s+(?:edit|modify|change|fix|patch|apply)\b/i,
10
+ /\brequired\s+to\s+(?:edit|modify|change|fix|patch|apply)\b/i,
11
+ /\bregardless\s+of\s+findings\b/i,
12
+ /\balways\s+(?:edit|modify|change|fix|patch|apply)\b/i,
13
+ /\bapply\s+(?:the\s+)?fix(?:es)?\s+directly\b/i,
14
+ /\bmake\s+(?:the\s+)?code\s+changes\b/i
15
+ ];
16
+ const EXPLICIT_NO_EDIT_PATTERNS = [
17
+ /\bdo not edit\b/i,
18
+ /\bdon't edit\b/i,
19
+ /\bdo not modify\b/i,
20
+ /\bdo not change files\b/i
21
+ ];
22
+ const SCOPED_NO_EDIT_CONSTRAINT_PATTERNS = [
23
+ /\bdo not edit files?\s+outside\b/i,
24
+ /\bdo not edit\s+outside\b/i,
25
+ /\bdo not edit\s+unrelated files?\b/i,
26
+ /\bdo not change\s+unrelated files?\b/i,
27
+ /\bdo not modify\s+unrelated files?\b/i
28
+ ];
29
+ const RESEARCH_AGENT_PATTERNS = [
30
+ /\binvestigate\b/i,
31
+ /\bscout\b/i,
32
+ /\bresearch(?:er)?\b/i
33
+ ];
34
+ const WORKER_IMPLEMENTATION_PATTERNS = [
35
+ /\b(?:implement|fix|edit|modify|patch|refactor|delete)\b/i,
36
+ /\b(?:update|add|remove|replace|create)\b(?!\s+(?:(?:a|an|the)\s+)?(?:report|summary|findings?)(?:\b|$))/i,
37
+ /\bapply\s+(?:the\s+)?(?:changes?|fix(?:es)?|patch)\b/i,
38
+ /\bmake\s+(?:the\s+)?changes\b/i,
39
+ /\bdo those fixes\b/i
40
+ ];
41
+ const GENERAL_IMPLEMENTATION_PATTERNS = [
42
+ /\b(?:implement|fix|edit|modify|patch|refactor)\b/i,
43
+ /\bapply\s+(?:the\s+)?(?:changes?|fix(?:es)?|patch)\b/i,
44
+ /\bmake\s+(?:the\s+)?changes\b/i,
45
+ /\bdo those fixes\b/i,
46
+ /\b(?:update|add|remove|replace|delete|create)\s+(?:the\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\.json|config|manifest|extension|prompt|command)\b/i
47
+ ];
48
+ const READ_ONLY_BUILTIN_TOOLS = new Set([
49
+ "read",
50
+ "grep",
51
+ "find",
52
+ "ls",
53
+ "web_search",
54
+ "fetch_content",
55
+ "get_search_content",
56
+ "intercom",
57
+ "contact_supervisor"
58
+ ]);
59
+ function stripFrameworkInstructions(task) {
60
+ return task.split(`
61
+ `).filter((line) => !/^\s*\[(?:Write to|Read from):/i.test(line)).filter((line) => !/^\s*(?:Create and maintain progress at:|Update progress at:|\*\*Output:\*\*|Write your findings to(?: exactly this path)?:|This path is authoritative for this run\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(line)).join(`
62
+ `);
63
+ }
64
+ function stripScopedNoEditConstraints(task) {
65
+ let stripped = task;
66
+ for (const pattern of SCOPED_NO_EDIT_CONSTRAINT_PATTERNS) {
67
+ stripped = stripped.replace(pattern, " ");
68
+ }
69
+ return stripped;
70
+ }
71
+ function declaresOnlyReadOnlyTools(tools, mcpDirectTools) {
72
+ return tools !== undefined && tools.length > 0 && (mcpDirectTools?.length ?? 0) === 0 && tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));
73
+ }
74
+ export function expectsImplementationMutation(agent, task) {
75
+ const taskText = stripFrameworkInstructions(task);
76
+ const taskTextWithoutScopedConstraints = stripScopedNoEditConstraints(taskText);
77
+ if (REVIEW_ONLY_PATTERNS.some((pattern) => pattern.test(taskTextWithoutScopedConstraints)))
78
+ return false;
79
+ if (EXPLICIT_NO_EDIT_PATTERNS.some((pattern) => pattern.test(taskTextWithoutScopedConstraints)))
80
+ return false;
81
+ if (RESEARCH_AGENT_PATTERNS.some((pattern) => pattern.test(agent)))
82
+ return false;
83
+ if (/\breviewer\b/i.test(agent))
84
+ return REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));
85
+ const workerIntent = agent === "worker" && WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));
86
+ if (workerIntent)
87
+ return true;
88
+ return GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));
89
+ }
90
+ export function hasMutationToolCall(messages) {
91
+ for (const message of messages) {
92
+ if (message.role !== "assistant")
93
+ continue;
94
+ for (const part of message.content) {
95
+ if (part.type !== "toolCall")
96
+ continue;
97
+ if (part.name === "edit" || part.name === "write")
98
+ return true;
99
+ if (part.name !== "bash")
100
+ continue;
101
+ const args = typeof part.arguments === "object" && part.arguments !== null && !Array.isArray(part.arguments) ? part.arguments : {};
102
+ if (typeof args.command === "string" && isMutatingBashCommand(args.command))
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ }
108
+ export function evaluateCompletionMutationGuard(input) {
109
+ const expectedMutation = declaresOnlyReadOnlyTools(input.tools, input.mcpDirectTools) ? false : expectsImplementationMutation(input.agent, input.task);
110
+ const attemptedMutation = hasMutationToolCall(input.messages);
111
+ return {
112
+ expectedMutation,
113
+ attemptedMutation,
114
+ triggered: expectedMutation && !attemptedMutation
115
+ };
116
+ }
@@ -1 +1,208 @@
1
- import*as A from"node:fs";import*as P from"node:os";import*as X from"node:path";import{fileURLToPath as Ef}from"node:url";import*as k from"node:path";var Kf=128,Gf=4;function Vf(f){return typeof f==="string"&&f.length>0&&f.length<=Kf&&!k.isAbsolute(f)&&!f.includes("/")&&!f.includes("\\")&&!f.includes("..")}function h(f){return typeof f==="number"&&Number.isFinite(f)?f:void 0}function g(f,j){return typeof f==="string"&&f.length>0?f.slice(0,j):void 0}function u(f){if(!Array.isArray(f))return[];return f.map((j)=>{if(!j||typeof j!=="object")return;let $=j;if(!Vf($.runId))return;return{runId:$.runId,...h($.stepIndex)!==void 0?{stepIndex:h($.stepIndex)}:{},...g($.agent,128)?{agent:g($.agent,128)}:{}}}).filter((j)=>Boolean(j)).slice(0,Gf)}function w(f){if(!f)return[];try{return u(JSON.parse(f))}catch{return[]}}function r(f){let j=u(f);return j.length?JSON.stringify(j):""}import{createHash as bf}from"node:crypto";import*as S from"node:fs";import*as K from"node:os";import*as Q from"node:path";import*as q from"node:fs";import*as C from"node:os";import*as M from"node:path";import*as c from"node:os";import*as R from"node:path";function N(f){return f.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function yf(f){let j=f?.env??process.env,$=f&&Object.hasOwn(f,"getuid")?f.getuid:process.getuid?.bind(process);if(typeof $==="function")return`uid-${$()}`;for(let Z of["USERNAME","USER","LOGNAME"]){let G=j[Z];if(G)return`user-${N(G)}`}let T=f&&Object.hasOwn(f,"userInfo")?f.userInfo:c.userInfo;try{let Z=T?.().username;if(Z)return`user-${N(Z)}`}catch{}let J=j.USERPROFILE??j.HOME;if(J)return`home-${N(J)}`;let O=f&&Object.hasOwn(f,"homedir")?f.homedir:c.homedir;try{let Z=O?.();if(Z)return`home-${N(Z)}`}catch{}return"shared"}var L=R.join(c.tmpdir(),`dm-subagents-${yf()}`),qj=R.join(L,"async-subagent-results"),Uj=R.join(L,"async-subagent-runs"),Hf=R.join(L,"chain-runs"),Mj=R.join(L,"artifacts");var cf=".dm",Rf="@duckmind/dm-coding-agent",Lf="DM_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";function p(f){return typeof f==="string"&&f.trim()?f:void 0}function d(f){if(!f)return;try{let j=JSON.parse(q.readFileSync(M.join(f,"package.json"),"utf-8"));if(j.name!==Rf)return;return p(j.piConfig?.configDir)}catch{return}}function Sf(f=process.argv[1],j=process.env[Lf]){let $=d(j);if($)return $;if(!f)return;try{let T=M.dirname(q.realpathSync(f));while(T!==M.dirname(T)){let J=d(T);if(J)return J;T=M.dirname(T)}}catch{}return}function Cf(f,j,$){return(f&&typeof f==="object"?p(f.CONFIG_DIR_NAME):void 0)??Sf(j,$)??cf}function t(){return Cf()}function I(f){return M.join(f,t())}function z(){let f=process.env.DM_CODING_AGENT_DIR;if(f==="~")return C.homedir();if(f?.startsWith("~/"))return M.join(C.homedir(),f.slice(2));return f||M.join(C.homedir(),t(),"agent")}var Ff=1,zf=604800000,s=new Set(["read","bash","edit","write","grep","find","ls","mcp"]),e=Q.join(K.homedir(),".config","mcp","mcp.json"),a={cursor:[Q.join(K.homedir(),".cursor","mcp.json")],"claude-code":[Q.join(K.homedir(),".claude","mcp.json"),Q.join(K.homedir(),".claude.json"),Q.join(K.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[Q.join(K.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[Q.join(K.homedir(),".codex","config.json")],windsurf:[Q.join(K.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};function ff(f,j=process.cwd()){if(!f?.length)return[];try{let $=wf(j),T=Nf();if(!T)return[];return mf($,T,uf($.settings?.toolPrefix),f)}catch{return[]}}function Nf(){let f=Q.join(z(),"mcp-cache.json"),j;try{j=JSON.parse(S.readFileSync(f,"utf-8"))}catch{return null}if(!j||typeof j!=="object")return null;let $=j;if($.version!==Ff||!$.servers||typeof $.servers!=="object"||Array.isArray($.servers))return null;return $}function wf(f){let j={mcpServers:{}};for(let $ of If(f)){let T=nf($);if(!T)continue;j=Df(j,of(T,f))}return j}function If(f){let j=Q.join(z(),"mcp.json"),$=Q.resolve(f,".mcp.json"),T=Q.resolve(I(f),"mcp.json"),J=[];if(e!==j)J.push(e);if(J.push(j),$!==j)J.push($);if(T!==j&&T!==$)J.push(T);return J}function nf(f){let j;try{j=JSON.parse(S.readFileSync(f,"utf-8"))}catch{return null}return xf(j)}function xf(f){if(!f||typeof f!=="object"||Array.isArray(f))return{mcpServers:{}};let j=f,$=j.mcpServers??j["mcp-servers"]??{};return{mcpServers:$&&typeof $==="object"&&!Array.isArray($)?$:{},imports:Array.isArray(j.imports)?j.imports.filter((T)=>rf(T)):void 0,settings:j.settings&&typeof j.settings==="object"&&!Array.isArray(j.settings)?j.settings:void 0}}function Df(f,j){let $=[...f.imports??[],...j.imports??[]];return{mcpServers:{...f.mcpServers,...j.mcpServers},imports:$.length?[...new Set($)]:void 0,settings:j.settings?{...f.settings,...j.settings}:f.settings}}function of(f,j){if(!f.imports?.length)return f;let $={};for(let T of f.imports){let J=vf(T,j);if(!J)continue;let O;try{O=JSON.parse(S.readFileSync(J,"utf-8"))}catch{continue}for(let[Z,G]of Object.entries(Pf(O,T)))if(!$[Z])$[Z]=G}return{imports:f.imports,settings:f.settings,mcpServers:{...$,...f.mcpServers}}}function vf(f,j){for(let $ of a[f]){let T=$.startsWith(".")?Q.resolve(j,$):$;if(S.existsSync(T))return T}return null}function Pf(f,j){if(!f||typeof f!=="object"||Array.isArray(f))return{};let $=f,T=j==="cursor"||j==="windsurf"||j==="vscode"?$.mcpServers??$["mcp-servers"]:$.mcpServers;return T&&typeof T==="object"&&!Array.isArray(T)?T:{}}function mf(f,j,$,T){let J=[],O=new Set,{servers:Z,tools:G}=hf(T);for(let[Y,B]of Object.entries(f.mcpServers)){let y=j.servers[Y];if(!gf(y,B))continue;let V=Z.has(Y)?!0:G.get(Y);if(!V)continue;for(let _ of Array.isArray(y.tools)?y.tools:[]){if(typeof _?.name!=="string"||!_.name)continue;if(V!==!0&&!V.has(_.name))continue;if(i(_.name,Y,$,B.excludeTools))continue;let U=F(_.name,Y,$);if(s.has(U)||O.has(U))continue;O.add(U),J.push(U)}if(B.exposeResources===!1)continue;for(let _ of Array.isArray(y.resources)?y.resources:[]){if(typeof _?.name!=="string"||!_.name||typeof _.uri!=="string"||!_.uri)continue;let U=`get_${pf(_.name)}`;if(V!==!0&&!V.has(U))continue;if(i(U,Y,$,B.excludeTools))continue;let H=F(U,Y,$);if(s.has(H)||O.has(H))continue;O.add(H),J.push(H)}}return J}function hf(f){let j=new Set,$=new Map;for(let T of f)if(T=T.replace(/\/+$/,""),T.includes("/")){let[J,O]=T.split("/",2);if(J&&O){if(!$.has(J))$.set(J,new Set);$.get(J).add(O)}else if(J)j.add(J)}else if(T)j.add(T);return{servers:j,tools:$}}function gf(f,j){if(!f||f.configHash!==kf(j))return!1;if(!f.cachedAt||typeof f.cachedAt!=="number")return!1;return Date.now()-f.cachedAt<=zf}function kf(f){let j={command:f.command,args:f.args,env:l(f.env),cwd:tf(f.cwd),url:f.url,headers:l(f.headers),auth:f.auth,bearerToken:sf(f),bearerTokenEnv:f.bearerTokenEnv,exposeResources:f.exposeResources,excludeTools:f.excludeTools};return bf("sha256").update(n(j)).digest("hex")}function uf(f){return f==="none"||f==="short"||f==="server"?f:"server"}function rf(f){return typeof f==="string"&&Object.hasOwn(a,f)}function df(f,j){if(j==="none")return"";if(j==="short")return f.replace(/-?mcp$/i,"").replace(/-/g,"_")||"mcp";return f.replace(/-/g,"_")}function F(f,j,$){let T=df(j,$);return T?`${T}_${f}`:f}function i(f,j,$,T){if(!Array.isArray(T)||T.length===0)return!1;let J=new Set([b(f),b(F(f,j,$)),b(F(f,j,"server")),b(F(f,j,"short"))]);return T.some((O)=>typeof O==="string"&&J.has(b(O)))}function b(f){return f.replace(/-/g,"_")}function pf(f){let j=f.replace(/[^a-zA-Z0-9]/g,"_").replace(/_+/g,"_").replace(/^_+/,"").replace(/_+$/,"").toLowerCase();if(!j||/^\d/.test(j))j=`resource${j?`_${j}`:""}`;return j}function l(f){if(!f||typeof f!=="object"||Array.isArray(f))return;let j={};for(let[$,T]of Object.entries(f))if(typeof T==="string")j[$]=x(T);return j}function x(f){return f.replace(/\$\{(\w+)\}/g,(j,$)=>process.env[$]??"").replace(/\$env:(\w+)/g,(j,$)=>process.env[$]??"")}function tf(f){if(typeof f!=="string")return;let j=x(f);if(j==="~")return K.homedir();if(j.startsWith("~/")||j.startsWith("~\\"))return Q.join(K.homedir(),j.slice(2));return j}function sf(f){if(typeof f.bearerToken==="string")return x(f.bearerToken);return typeof f.bearerTokenEnv==="string"?process.env[f.bearerTokenEnv]:void 0}function n(f){if(f===null||f===void 0||typeof f!=="object"){let $=JSON.stringify(f);return $===void 0?"undefined":$}if(Array.isArray(f))return`[${f.map(($)=>n($)).join(",")}]`;let j=f;return`{${Object.keys(j).sort().map(($)=>`${JSON.stringify($)}:${n(j[$])}`).join(",")}}`}import{Compile as kj}from"typebox/compile";var jf="DM_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA",$f="DM_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";var Tf="DM_SUBAGENT_TOOL_BUDGET";function Jf(f){return f?JSON.stringify(f):void 0}var ef=["off","minimal","low","medium","high","xhigh"],lf=8000;function qf(f,j){let $=Ef(f),T=X.extname($),J=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(T)?T:".ts";return X.join(X.dirname($),`${j}${J}`)}function Uf(f){return X.basename(Ef(f)).startsWith("dm-args.")}function af(f=import.meta.url){let j=Uf(f)?"subagent-prompt-runtime":X.join("..","runs","shared","subagent-prompt-runtime");return qf(f,j)}function fj(f=import.meta.url){let j=Uf(f)?X.join("..","..","extension","fanout-child"):"fanout-child";return qf(f,j)}var Bf=af(),jj=fj(),$j="DM_SUBAGENT_CHILD",Tj="DM_SUBAGENT_ORCHESTRATOR_TARGET",Jj="DM_SUBAGENT_ORCHESTRATOR_SESSION_ID",Bj="DM_SUBAGENT_SUPERVISOR_CHANNEL_DIR",Of="DM_SUBAGENT_RUN_ID",Oj="DM_SUBAGENT_CHILD_AGENT",Wj="DM_SUBAGENT_CHILD_INDEX",Xj="DM_SUBAGENT_FANOUT_CHILD",D="DM_SUBAGENT_PARENT_EVENT_SINK",Wf="DM_SUBAGENT_PARENT_CONTROL_INBOX",o="DM_SUBAGENT_PARENT_ROOT_RUN_ID",Xf="DM_SUBAGENT_PARENT_RUN_ID",Zf="DM_SUBAGENT_PARENT_CHILD_INDEX",_f="DM_SUBAGENT_PARENT_DEPTH",Qf="DM_SUBAGENT_PARENT_PATH",v="DM_SUBAGENT_PARENT_CAPABILITY_TOKEN",Yf="DM_SUBAGENT_PARENT_SESSION",Zj="DM_SUBAGENT_STEER_INBOX";function Af(f){return f.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function _j(f,j,$){return X.join(L,"supervisor-channels",`${Af(f)}-${Af(j)}-${$}`)}function Qj(f,j,$=!1){if(!f||!j)return f;let T=f.lastIndexOf(":");if(T!==-1&&ef.includes(f.substring(T+1)))return $?`${f.slice(0,T)}:${j}`:f;return`${f}:${j}`}function lj(f){let j=[...f.baseArgs];if(f.sessionFile)A.mkdirSync(X.dirname(f.sessionFile),{recursive:!0}),j.push("--session",f.sessionFile);else{if(!f.sessionEnabled)j.push("--no-session");if(f.sessionDir)A.mkdirSync(f.sessionDir,{recursive:!0}),j.push("--session-dir",f.sessionDir)}let $=Qj(f.model,f.thinking);if($)j.push("--model",$);let T=f.tools?.filter((W)=>!(W.includes("/")||W.endsWith(".ts")||W.endsWith(".js")))??[],J=f.requireReadTool&&f.tools?.length&&!T.includes("read")?["read",...T]:T,O=J.includes("subagent"),Z=[];if(f.tools?.length){let W=[...J];for(let E of f.tools)if(!J.includes(E)&&(E.includes("/")||E.endsWith(".ts")||E.endsWith(".js")))Z.push(E);if(W.length>0){if(f.mcpDirectTools?.length)W.push(...ff(f.mcpDirectTools,f.cwd));j.push("--tools",W.join(","))}}let G=O?[Bf,jj]:[Bf];if(f.extensions!==void 0){j.push("--no-extensions");for(let W of[...new Set([...G,...Z,...f.extensions,...f.subagentOnlyExtensions??[]])])j.push("--extension",W)}else for(let W of[...new Set([...G,...Z,...f.subagentOnlyExtensions??[]])])j.push("--extension",W);if(!f.inheritSkills)j.push("--no-skills");let Y;if(f.systemPrompt!==void 0&&f.systemPrompt!==null){Y=A.mkdtempSync(X.join(P.tmpdir(),"dm-subagent-"));let W=(f.promptFileStem??"prompt").replace(/[^\w.-]/g,"_"),E=X.join(Y,`${W}.md`);A.writeFileSync(E,f.systemPrompt,{mode:384}),j.push(f.systemPromptMode==="replace"?"--system-prompt":"--append-system-prompt",E)}if(f.task.length>lf){if(!Y)Y=A.mkdtempSync(X.join(P.tmpdir(),"dm-subagent-"));let W=X.join(Y,"task.md");A.writeFileSync(W,`Task: ${f.task}`,{mode:384}),j.push(`@${W}`)}else j.push(`Task: ${f.task}`);let B={};B[$j]="1",B[Xj]=O?"1":"0";let y=Boolean(process.env[D]&&process.env[o]&&process.env[v]),V=f.parentRunId??f.runId??(y?process.env[Of]:void 0)??process.env[Xf]??"",_=f.parentChildIndex!==void 0?String(f.parentChildIndex):f.childIndex!==void 0?String(f.childIndex):process.env[Zf]??"",U=Number(process.env[_f]),H=f.parentDepth??(y&&Number.isFinite(U)?U+1:1),Mf=f.parentPath??[...w(process.env[Qf]),...V?[{runId:V,..._&&/^\d+$/.test(_)?{stepIndex:Number(_)}:{},...f.childAgentName?{agent:f.childAgentName}:{}}]:[]];if(B[D]=O?f.parentEventSink??process.env[D]??"":"",B[Wf]=O?f.parentControlInbox??process.env[Wf]??"":"",B[o]=O?f.parentRootRunId??process.env[o]??f.runId??"":"",B[Xf]=O?V:"",B[Zf]=O?_:"",B[_f]=O?String(H):"",B[Qf]=O?r(Mf):"",B[v]=O?f.parentCapabilityToken??process.env[v]??"":"",B.DM_SUBAGENT_INHERIT_PROJECT_CONTEXT=f.inheritProjectContext?"1":"0",B.DM_SUBAGENT_INHERIT_SKILLS=f.inheritSkills?"1":"0",f.intercomSessionName)B.DM_SUBAGENT_INTERCOM_SESSION_NAME=f.intercomSessionName;if(f.orchestratorIntercomTarget)B[Tj]=f.orchestratorIntercomTarget;if(f.parentSessionId)B[Jj]=f.parentSessionId;if(f.orchestratorIntercomTarget&&f.parentSessionId&&f.runId&&f.childAgentName){let W=f.childIndex??0,E=_j(f.runId,f.childAgentName,W);A.mkdirSync(X.join(E,"requests"),{recursive:!0}),A.mkdirSync(X.join(E,"replies"),{recursive:!0}),B[Bj]=E}if(f.runId)B[Of]=f.runId;if(f.childAgentName)B[Oj]=f.childAgentName;if(f.childIndex!==void 0)B[Wj]=String(f.childIndex);if(f.mcpDirectTools?.length)B.MCP_DIRECT_TOOLS=f.mcpDirectTools.join(",");else B.MCP_DIRECT_TOOLS="__none__";if(f.structuredOutput)B[$f]=f.structuredOutput.outputPath,B[jf]=f.structuredOutput.schemaPath;if(f.steerInboxDir)B[Zj]=f.steerInboxDir;let m=Jf(f.toolBudget);if(m)B[Tf]=m;return B[Yf]=f.parentSessionId??process.env[Yf]??"",{args:j,env:B,tempDir:Y}}var aj=w;function f$(f){if(!f)return;try{A.rmSync(f,{recursive:!0,force:!0})}catch{}}export{qf as resolveRuntimeExtensionPath,af as resolvePromptRuntimePath,fj as resolveFanoutChildPath,aj as parseParentPathEnv,f$ as cleanupTempDir,lj as buildPiArgs,Qj as applyThinkingSuffix,Bj as SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV,Zj as SUBAGENT_STEER_INBOX_ENV,Of as SUBAGENT_RUN_ID_ENV,Yf as SUBAGENT_PARENT_SESSION_ENV,Xf as SUBAGENT_PARENT_RUN_ID_ENV,o as SUBAGENT_PARENT_ROOT_RUN_ID_ENV,Qf as SUBAGENT_PARENT_PATH_ENV,D as SUBAGENT_PARENT_EVENT_SINK_ENV,_f as SUBAGENT_PARENT_DEPTH_ENV,Wf as SUBAGENT_PARENT_CONTROL_INBOX_ENV,Zf as SUBAGENT_PARENT_CHILD_INDEX_ENV,v as SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV,Tj as SUBAGENT_ORCHESTRATOR_TARGET_ENV,Jj as SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV,Xj as SUBAGENT_FANOUT_CHILD_ENV,Wj as SUBAGENT_CHILD_INDEX_ENV,$j as SUBAGENT_CHILD_ENV,Oj as SUBAGENT_CHILD_AGENT_ENV};
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { encodeNestedPathEnv, parseNestedPathEnv } from "./nested-path.js";
6
+ import { resolveMcpDirectToolNames } from "./mcp-direct-tool-allowlist.js";
7
+ import { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from "./structured-output.js";
8
+ import { TEMP_ROOT_DIR } from "../../shared/types.js";
9
+ import { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from "./tool-budget.js";
10
+ const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
11
+ const TASK_ARG_LIMIT = 8000;
12
+ export function resolveRuntimeExtensionPath(moduleUrl, relativeStem) {
13
+ const modulePath = fileURLToPath(moduleUrl);
14
+ const moduleSuffix = path.extname(modulePath);
15
+ const runtimeSuffix = [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"].includes(moduleSuffix) ? moduleSuffix : ".ts";
16
+ return path.join(path.dirname(modulePath), `${relativeStem}${runtimeSuffix}`);
17
+ }
18
+ function isStandaloneDmArgsModule(moduleUrl) {
19
+ return path.basename(fileURLToPath(moduleUrl)).startsWith("dm-args.");
20
+ }
21
+ export function resolvePromptRuntimePath(moduleUrl = import.meta.url) {
22
+ const promptStem = isStandaloneDmArgsModule(moduleUrl) ? "subagent-prompt-runtime" : path.join("..", "runs", "shared", "subagent-prompt-runtime");
23
+ return resolveRuntimeExtensionPath(moduleUrl, promptStem);
24
+ }
25
+ export function resolveFanoutChildPath(moduleUrl = import.meta.url) {
26
+ const fanoutStem = isStandaloneDmArgsModule(moduleUrl) ? path.join("..", "..", "extension", "fanout-child") : "fanout-child";
27
+ return resolveRuntimeExtensionPath(moduleUrl, fanoutStem);
28
+ }
29
+ const PROMPT_RUNTIME_EXTENSION_PATH = resolvePromptRuntimePath();
30
+ const FANOUT_CHILD_EXTENSION_PATH = resolveFanoutChildPath();
31
+ export const SUBAGENT_CHILD_ENV = "DM_SUBAGENT_CHILD";
32
+ export const SUBAGENT_ORCHESTRATOR_TARGET_ENV = "DM_SUBAGENT_ORCHESTRATOR_TARGET";
33
+ export const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = "DM_SUBAGENT_ORCHESTRATOR_SESSION_ID";
34
+ export const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = "DM_SUBAGENT_SUPERVISOR_CHANNEL_DIR";
35
+ export const SUBAGENT_RUN_ID_ENV = "DM_SUBAGENT_RUN_ID";
36
+ export const SUBAGENT_CHILD_AGENT_ENV = "DM_SUBAGENT_CHILD_AGENT";
37
+ export const SUBAGENT_CHILD_INDEX_ENV = "DM_SUBAGENT_CHILD_INDEX";
38
+ export const SUBAGENT_FANOUT_CHILD_ENV = "DM_SUBAGENT_FANOUT_CHILD";
39
+ export const SUBAGENT_PARENT_EVENT_SINK_ENV = "DM_SUBAGENT_PARENT_EVENT_SINK";
40
+ export const SUBAGENT_PARENT_CONTROL_INBOX_ENV = "DM_SUBAGENT_PARENT_CONTROL_INBOX";
41
+ export const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = "DM_SUBAGENT_PARENT_ROOT_RUN_ID";
42
+ export const SUBAGENT_PARENT_RUN_ID_ENV = "DM_SUBAGENT_PARENT_RUN_ID";
43
+ export const SUBAGENT_PARENT_CHILD_INDEX_ENV = "DM_SUBAGENT_PARENT_CHILD_INDEX";
44
+ export const SUBAGENT_PARENT_DEPTH_ENV = "DM_SUBAGENT_PARENT_DEPTH";
45
+ export const SUBAGENT_PARENT_PATH_ENV = "DM_SUBAGENT_PARENT_PATH";
46
+ export const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "DM_SUBAGENT_PARENT_CAPABILITY_TOKEN";
47
+ export const SUBAGENT_PARENT_SESSION_ENV = "DM_SUBAGENT_PARENT_SESSION";
48
+ export const SUBAGENT_STEER_INBOX_ENV = "DM_SUBAGENT_STEER_INBOX";
49
+ function sanitizeSupervisorChannelSegment(value) {
50
+ return value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "unknown";
51
+ }
52
+ function supervisorChannelDir(runId, agent, childIndex) {
53
+ return path.join(TEMP_ROOT_DIR, "supervisor-channels", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);
54
+ }
55
+ export function applyThinkingSuffix(model, thinking, replaceExisting = false) {
56
+ if (!model || !thinking)
57
+ return model;
58
+ const colonIdx = model.lastIndexOf(":");
59
+ if (colonIdx !== -1 && THINKING_LEVELS.includes(model.substring(colonIdx + 1))) {
60
+ return replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;
61
+ }
62
+ return `${model}:${thinking}`;
63
+ }
64
+ export function buildPiArgs(input) {
65
+ const args = [...input.baseArgs];
66
+ if (input.sessionFile) {
67
+ fs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });
68
+ args.push("--session", input.sessionFile);
69
+ } else {
70
+ if (!input.sessionEnabled) {
71
+ args.push("--no-session");
72
+ }
73
+ if (input.sessionDir) {
74
+ fs.mkdirSync(input.sessionDir, { recursive: true });
75
+ args.push("--session-dir", input.sessionDir);
76
+ }
77
+ }
78
+ const modelArg = applyThinkingSuffix(input.model, input.thinking);
79
+ if (modelArg) {
80
+ args.push("--model", modelArg);
81
+ }
82
+ const declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) ?? [];
83
+ const declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes("read") ? ["read", ...declaredBuiltinToolsBase] : declaredBuiltinToolsBase;
84
+ const fanoutAuthorized = declaredBuiltinTools.includes("subagent");
85
+ const toolExtensionPaths = [];
86
+ if (input.tools?.length) {
87
+ const builtinTools = [...declaredBuiltinTools];
88
+ for (const tool of input.tools) {
89
+ if (!declaredBuiltinTools.includes(tool) && (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js"))) {
90
+ toolExtensionPaths.push(tool);
91
+ }
92
+ }
93
+ if (builtinTools.length > 0) {
94
+ if (input.mcpDirectTools?.length) {
95
+ builtinTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));
96
+ }
97
+ args.push("--tools", builtinTools.join(","));
98
+ }
99
+ }
100
+ const runtimeExtensions = fanoutAuthorized ? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH] : [PROMPT_RUNTIME_EXTENSION_PATH];
101
+ if (input.extensions !== undefined) {
102
+ args.push("--no-extensions");
103
+ for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...input.subagentOnlyExtensions ?? []])]) {
104
+ args.push("--extension", extPath);
105
+ }
106
+ } else {
107
+ for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.subagentOnlyExtensions ?? []])]) {
108
+ args.push("--extension", extPath);
109
+ }
110
+ }
111
+ if (!input.inheritSkills) {
112
+ args.push("--no-skills");
113
+ }
114
+ let tempDir;
115
+ if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
116
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
117
+ const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
118
+ const promptPath = path.join(tempDir, `${stem}.md`);
119
+ fs.writeFileSync(promptPath, input.systemPrompt, { mode: 384 });
120
+ args.push(input.systemPromptMode === "replace" ? "--system-prompt" : "--append-system-prompt", promptPath);
121
+ }
122
+ if (input.task.length > TASK_ARG_LIMIT) {
123
+ if (!tempDir) {
124
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-"));
125
+ }
126
+ const taskFilePath = path.join(tempDir, "task.md");
127
+ fs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 384 });
128
+ args.push(`@${taskFilePath}`);
129
+ } else {
130
+ args.push(`Task: ${input.task}`);
131
+ }
132
+ const env = {};
133
+ env[SUBAGENT_CHILD_ENV] = "1";
134
+ env[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? "1" : "0";
135
+ const inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);
136
+ const parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? "";
137
+ const parentChildIndex = input.parentChildIndex !== undefined ? String(input.parentChildIndex) : input.childIndex !== undefined ? String(input.childIndex) : process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? "";
138
+ const inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);
139
+ const parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);
140
+ const parentPath = input.parentPath ?? [
141
+ ...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),
142
+ ...parentRunId ? [{
143
+ runId: parentRunId,
144
+ ...parentChildIndex && /^\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {},
145
+ ...input.childAgentName ? { agent: input.childAgentName } : {}
146
+ }] : []
147
+ ];
148
+ env[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized ? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? "" : "";
149
+ env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized ? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? "" : "";
150
+ env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized ? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? "" : "";
151
+ env[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : "";
152
+ env[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : "";
153
+ env[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : "";
154
+ env[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : "";
155
+ env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized ? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? "" : "";
156
+ env.DM_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? "1" : "0";
157
+ env.DM_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
158
+ if (input.intercomSessionName) {
159
+ env.DM_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
160
+ }
161
+ if (input.orchestratorIntercomTarget) {
162
+ env[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;
163
+ }
164
+ if (input.parentSessionId) {
165
+ env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;
166
+ }
167
+ if (input.orchestratorIntercomTarget && input.parentSessionId && input.runId && input.childAgentName) {
168
+ const childIndex = input.childIndex ?? 0;
169
+ const channelDir = supervisorChannelDir(input.runId, input.childAgentName, childIndex);
170
+ fs.mkdirSync(path.join(channelDir, "requests"), { recursive: true });
171
+ fs.mkdirSync(path.join(channelDir, "replies"), { recursive: true });
172
+ env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;
173
+ }
174
+ if (input.runId) {
175
+ env[SUBAGENT_RUN_ID_ENV] = input.runId;
176
+ }
177
+ if (input.childAgentName) {
178
+ env[SUBAGENT_CHILD_AGENT_ENV] = input.childAgentName;
179
+ }
180
+ if (input.childIndex !== undefined) {
181
+ env[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);
182
+ }
183
+ if (input.mcpDirectTools?.length) {
184
+ env.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(",");
185
+ } else {
186
+ env.MCP_DIRECT_TOOLS = "__none__";
187
+ }
188
+ if (input.structuredOutput) {
189
+ env[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;
190
+ env[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;
191
+ }
192
+ if (input.steerInboxDir) {
193
+ env[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;
194
+ }
195
+ const encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);
196
+ if (encodedToolBudget)
197
+ env[TOOL_BUDGET_ENV] = encodedToolBudget;
198
+ env[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? "";
199
+ return { args, env, tempDir };
200
+ }
201
+ export const parseParentPathEnv = parseNestedPathEnv;
202
+ export function cleanupTempDir(tempDir) {
203
+ if (!tempDir)
204
+ return;
205
+ try {
206
+ fs.rmSync(tempDir, { recursive: true, force: true });
207
+ } catch {}
208
+ }
@@ -1 +1,90 @@
1
- import*as X from"node:fs";import*as Q from"node:path";import{fileURLToPath as O}from"node:url";var V="@duckmind/dm-coding-agent",B="DM_SUBAGENT_PI_BINARY";function Y(j){let q=Q.dirname(j);while(q!==Q.dirname(q)){let H=Q.join(q,"package.json");if(X.existsSync(H)){if(JSON.parse(X.readFileSync(H,"utf-8")).name===V)return q}q=Q.dirname(q)}return}function D(){return Y(O(import.meta.resolve(V)))}function J(){try{let j=process.argv[1];return j?Y(X.realpathSync(j)):void 0}catch{return}}function K(j,q){if(!q(j))return!1;return/\.(?:mjs|cjs|js)$/i.test(j)}function m(j){return Q.isAbsolute(j)?j:Q.resolve(j)}function u(j={}){let q=j.existsSync??X.existsSync,H=j.readFileSync??((z,Z)=>X.readFileSync(z,Z)),$=j.argv1??process.argv[1];if($){let z=m($);if(K(z,q))return z}try{let Z=(j.resolvePackageJson??(()=>{let U=j.piPackageRoot??J();if(U)return Q.join(U,"package.json");let W=j.resolvePackageEntry?Y(j.resolvePackageEntry()):D();if(!W)throw Error(`Could not resolve ${V} package root`);return Q.join(W,"package.json")}))(),M=JSON.parse(H(Z,"utf-8")).bin,w=typeof M==="string"?M:M?.pi??Object.values(M??{})[0];if(!w)return;let L=Q.resolve(Q.dirname(Z),w);if(K(L,q))return L}catch{return}return}function v(j,q={}){let $=(q.env??process.env)[B]?.trim();if($)return{command:$,args:j};if((q.platform??process.platform)==="win32"){let Z=u(q);if(Z)return{command:q.execPath??process.execPath,args:[Z,...j]}}return{command:"dm",args:j}}export{u as resolveWindowsPiCliScript,J as resolvePiPackageRoot,D as resolveInstalledPiPackageRoot,v as getPiSpawnCommand,Y as findPiPackageRootFromEntry,V as PI_CODING_AGENT_PACKAGE,B as DM_SUBAGENT_PI_BINARY_ENV};
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export const PI_CODING_AGENT_PACKAGE = "@duckmind/dm-coding-agent";
5
+ export const DM_SUBAGENT_PI_BINARY_ENV = "DM_SUBAGENT_PI_BINARY";
6
+ export function findPiPackageRootFromEntry(entryPoint) {
7
+ let dir = path.dirname(entryPoint);
8
+ while (dir !== path.dirname(dir)) {
9
+ const packageJsonPath = path.join(dir, "package.json");
10
+ if (fs.existsSync(packageJsonPath)) {
11
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
12
+ if (pkg.name === PI_CODING_AGENT_PACKAGE)
13
+ return dir;
14
+ }
15
+ dir = path.dirname(dir);
16
+ }
17
+ return;
18
+ }
19
+ export function resolveInstalledPiPackageRoot() {
20
+ return findPiPackageRootFromEntry(fileURLToPath(import.meta.resolve(PI_CODING_AGENT_PACKAGE)));
21
+ }
22
+ export function resolvePiPackageRoot() {
23
+ try {
24
+ const entry = process.argv[1];
25
+ return entry ? findPiPackageRootFromEntry(fs.realpathSync(entry)) : undefined;
26
+ } catch {
27
+ return;
28
+ }
29
+ }
30
+ function isRunnableNodeScript(filePath, existsSync) {
31
+ if (!existsSync(filePath))
32
+ return false;
33
+ return /\.(?:mjs|cjs|js)$/i.test(filePath);
34
+ }
35
+ function normalizePath(filePath) {
36
+ return path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
37
+ }
38
+ export function resolveWindowsPiCliScript(deps = {}) {
39
+ const existsSync = deps.existsSync ?? fs.existsSync;
40
+ const readFileSync = deps.readFileSync ?? ((filePath, encoding) => fs.readFileSync(filePath, encoding));
41
+ const argv1 = deps.argv1 ?? process.argv[1];
42
+ if (argv1) {
43
+ const argvPath = normalizePath(argv1);
44
+ if (isRunnableNodeScript(argvPath, existsSync)) {
45
+ return argvPath;
46
+ }
47
+ }
48
+ try {
49
+ const resolvePackageJson = deps.resolvePackageJson ?? (() => {
50
+ const root = deps.piPackageRoot ?? resolvePiPackageRoot();
51
+ if (root)
52
+ return path.join(root, "package.json");
53
+ const packageRoot = deps.resolvePackageEntry ? findPiPackageRootFromEntry(deps.resolvePackageEntry()) : resolveInstalledPiPackageRoot();
54
+ if (!packageRoot)
55
+ throw new Error(`Could not resolve ${PI_CODING_AGENT_PACKAGE} package root`);
56
+ return path.join(packageRoot, "package.json");
57
+ });
58
+ const packageJsonPath = resolvePackageJson();
59
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
60
+ const binField = packageJson.bin;
61
+ const binPath = typeof binField === "string" ? binField : binField?.pi ?? Object.values(binField ?? {})[0];
62
+ if (!binPath)
63
+ return;
64
+ const candidate = path.resolve(path.dirname(packageJsonPath), binPath);
65
+ if (isRunnableNodeScript(candidate, existsSync)) {
66
+ return candidate;
67
+ }
68
+ } catch {
69
+ return;
70
+ }
71
+ return;
72
+ }
73
+ export function getPiSpawnCommand(args, deps = {}) {
74
+ const env = deps.env ?? process.env;
75
+ const piBinary = env[DM_SUBAGENT_PI_BINARY_ENV]?.trim();
76
+ if (piBinary) {
77
+ return { command: piBinary, args };
78
+ }
79
+ const platform = deps.platform ?? process.platform;
80
+ if (platform === "win32") {
81
+ const piCliPath = resolveWindowsPiCliScript(deps);
82
+ if (piCliPath) {
83
+ return {
84
+ command: deps.execPath ?? process.execPath,
85
+ args: [piCliPath, ...args]
86
+ };
87
+ }
88
+ }
89
+ return { command: "dm", args };
90
+ }