@duckmind/dm-windows-x64 0.60.6 → 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,7 +1,50 @@
1
- var u=1;function a(t,e){if(!e)return t;let r=e.graceTurns===1?"1 additional assistant turn":`${e.graceTurns} additional assistant turns`,n=["## Turn budget",`This child run has a soft budget of ${e.maxTurns} assistant turn${e.maxTurns===1?"":"s"}.`,`After that, ${r} may be allowed only for a final wrap-up.`,"When you approach or reach the soft budget, stop starting new tool work and return the final answer immediately.","This runner uses process-mode execution, so live steering after launch may be unavailable; treat this instruction as the wrap-up request.","If you continue past the soft budget plus grace turns, the supervisor may abort the process and return only partial output."].join(`
2
- `);return t.trim()?`${t.trim()}
1
+ export const DEFAULT_TURN_BUDGET_GRACE_TURNS = 1;
2
+ export function appendTurnBudgetSystemPrompt(systemPrompt, budget) {
3
+ if (!budget)
4
+ return systemPrompt;
5
+ const grace = budget.graceTurns === 1 ? "1 additional assistant turn" : `${budget.graceTurns} additional assistant turns`;
6
+ const block = [
7
+ "## Turn budget",
8
+ `This child run has a soft budget of ${budget.maxTurns} assistant turn${budget.maxTurns === 1 ? "" : "s"}.`,
9
+ `After that, ${grace} may be allowed only for a final wrap-up.`,
10
+ "When you approach or reach the soft budget, stop starting new tool work and return the final answer immediately.",
11
+ "This runner uses process-mode execution, so live steering after launch may be unavailable; treat this instruction as the wrap-up request.",
12
+ "If you continue past the soft budget plus grace turns, the supervisor may abort the process and return only partial output."
13
+ ].join(`
14
+ `);
15
+ return systemPrompt.trim() ? `${systemPrompt.trim()}
3
16
 
4
- ${n}`:n}function s(t,e){return`Turn budget wrap-up was requested after ${e} assistant turn${e===1?"":"s"} (soft limit ${t.maxTurns}, grace ${t.graceTurns}). Process-mode live steering is unavailable, so the child was warned at launch to wrap up by this budget. Output may be partial.`}function o(t,e){return`Subagent exceeded turn budget after ${e} assistant turn${e===1?"":"s"} (soft limit ${t.maxTurns} + grace ${t.graceTurns}).`}function i(t,e){return e.trim()?`${t}
17
+ ${block}` : block;
18
+ }
19
+ export function turnBudgetSoftNote(budget, turnCount) {
20
+ return `Turn budget wrap-up was requested after ${turnCount} assistant turn${turnCount === 1 ? "" : "s"} (soft limit ${budget.maxTurns}, grace ${budget.graceTurns}). Process-mode live steering is unavailable, so the child was warned at launch to wrap up by this budget. Output may be partial.`;
21
+ }
22
+ export function turnBudgetExceededMessage(budget, turnCount) {
23
+ return `Subagent exceeded turn budget after ${turnCount} assistant turn${turnCount === 1 ? "" : "s"} (soft limit ${budget.maxTurns} + grace ${budget.graceTurns}).`;
24
+ }
25
+ export function formatTurnBudgetOutput(message, output) {
26
+ return output.trim() ? `${message}
5
27
 
6
28
  Partial output before turn-budget abort:
7
- ${e}`:t}function d(t){return{...t,outcome:"within-budget",turnCount:0}}function l(t,e,r){return{...t,turnCount:e,outcome:r?"exceeded":"wrap-up-requested",wrapUpRequestedAtTurn:t.maxTurns,...r?{exceededAtTurn:e}:{}}}function c(t,e,r){let n=t.maxTurns+t.graceTurns;if(e<n)return!1;if(e>n)return!0;return!r}export{l as turnBudgetState,s as turnBudgetSoftNote,o as turnBudgetExceededMessage,c as shouldAbortForTurnBudget,d as initialTurnBudgetState,i as formatTurnBudgetOutput,a as appendTurnBudgetSystemPrompt,u as DEFAULT_TURN_BUDGET_GRACE_TURNS};
29
+ ${output}` : message;
30
+ }
31
+ export function initialTurnBudgetState(budget) {
32
+ return { ...budget, outcome: "within-budget", turnCount: 0 };
33
+ }
34
+ export function turnBudgetState(budget, turnCount, exceeded) {
35
+ return {
36
+ ...budget,
37
+ turnCount,
38
+ outcome: exceeded ? "exceeded" : "wrap-up-requested",
39
+ wrapUpRequestedAtTurn: budget.maxTurns,
40
+ ...exceeded ? { exceededAtTurn: turnCount } : {}
41
+ };
42
+ }
43
+ export function shouldAbortForTurnBudget(budget, turnCount, terminalAssistantStop) {
44
+ const hardLimit = budget.maxTurns + budget.graceTurns;
45
+ if (turnCount < hardLimit)
46
+ return false;
47
+ if (turnCount > hardLimit)
48
+ return true;
49
+ return !terminalAssistantStop;
50
+ }
@@ -1 +1,196 @@
1
- import*as z from"node:os";import*as _ from"node:path";function L(W){return W.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function w(W){let $=W?.env??process.env,Y=W&&Object.hasOwn(W,"getuid")?W.getuid:process.getuid?.bind(process);if(typeof Y==="function")return`uid-${Y()}`;for(let q of["USERNAME","USER","LOGNAME"]){let J=$[q];if(J)return`user-${L(J)}`}let Z=W&&Object.hasOwn(W,"userInfo")?W.userInfo:z.userInfo;try{let q=Z?.().username;if(q)return`user-${L(q)}`}catch{}let Q=$.USERPROFILE??$.HOME;if(Q)return`home-${L(Q)}`;let B=W&&Object.hasOwn(W,"homedir")?W.homedir:z.homedir;try{let q=B?.();if(q)return`home-${L(q)}`}catch{}return"shared"}var N=_.join(z.tmpdir(),`dm-subagents-${w()}`),i=_.join(N,"async-subagent-results"),s=_.join(N,"async-subagent-runs"),x=_.join(N,"chain-runs"),e=_.join(N,"artifacts");function M(W){return"parallel"in W&&Array.isArray(W.parallel)}function O(W){return"expand"in W&&"collect"in W&&"parallel"in W&&!Array.isArray(W.parallel)}function y(W){switch(W){case"complete":case"completed":return"completed";case"running":return"running";case"failed":return"failed";case"paused":return"paused";case"detached":return"detached";case"pending":return"pending";default:return}}function D(W){if(!W)return;if(W.detached)return"detached";if(W.interrupted)return"paused";return W.exitCode===0?"completed":"failed"}function T(W,$){return y(W.stepStatuses?.[$]?.status)??D(W.results?.[$])??(W.currentFlatIndex===$?"running":"pending")}function R(W,$,Y){if(!$)return;let Z=W.find((Q)=>Q.title===$);if(!Z)Z={title:$,nodeIds:[]},W.push(Z);Z.nodeIds.push(Y)}function f(W,$){return W.label?.trim()||W.agent||`Step ${$+1}`}function b(W){if(W.some(($)=>$==="running"))return"running";if(W.some(($)=>$==="failed"))return"failed";if(W.some(($)=>$==="paused"))return"paused";if(W.some(($)=>$==="detached"))return"detached";if(W.length>0&&W.every(($)=>$==="completed"))return"completed";if(W.some(($)=>$==="completed"))return"running";return"pending"}function JW(W){let $=[],Y=[],Z=0,Q;for(let B=0;B<W.steps.length;B++){let q=W.steps[B];if(M(q)){let A=`step-${B}`,V=[],j=[];for(let K=0;K<q.parallel.length;K++){let X=q.parallel[K],U=T(W,Z);j.push(U);let G=`step-${B}-agent-${K}`,H={id:G,kind:"agent",agent:X.agent,phase:X.phase,label:X.label?.trim()||X.agent||`Agent ${K+1}`,status:U,flatIndex:Z,stepIndex:B,outputName:X.as,structured:Boolean(X.outputSchema),acceptanceStatus:W.results?.[Z]?.acceptance?.status,error:W.stepStatuses?.[Z]?.error??W.results?.[Z]?.error};if(V.push(H),R(Y,X.phase,G),U==="running"||W.currentFlatIndex===Z)Q=G;Z++}let I=b(j);if(W.currentStepIndex===B&&!Q)Q=A;$.push({id:A,kind:"parallel-group",label:q.parallel.length===1?"Parallel task":`Parallel group (${q.parallel.length})`,status:I,stepIndex:B,children:V});continue}if(O(q)){let A=`step-${B}`,V=W.dynamicChildren?.[B]??[],j=W.dynamicGroupStatuses?.[B],I=[],K=[];for(let U=0;U<V.length;U++){let G=V[U],H=T(W,G.flatIndex);K.push(H);let E=`step-${B}-item-${G.itemKey.replace(/[^a-zA-Z0-9_-]/g,"-")}`,C={id:E,kind:"agent",agent:G.agent,phase:q.parallel.phase??q.phase,label:G.label?.trim()||q.parallel.label?.trim()||`${G.agent} ${G.itemKey}`,status:H,flatIndex:G.flatIndex,stepIndex:B,itemKey:G.itemKey,outputName:G.outputName,structured:G.structured,acceptanceStatus:W.results?.[G.flatIndex]?.acceptance?.status,error:W.stepStatuses?.[G.flatIndex]?.error??W.results?.[G.flatIndex]?.error??G.error};if(I.push(C),R(Y,C.phase,E),H==="running"||W.currentFlatIndex===G.flatIndex)Q=E}let X=j?.status??(I.length>0?b(K):W.currentStepIndex===B?"running":"pending");if(W.currentStepIndex===B&&!Q)Q=A;if($.push({id:A,kind:"dynamic-parallel-group",label:q.label?.trim()||q.parallel.label?.trim()||`Dynamic fanout (${q.collect.as})`,status:X,stepIndex:B,outputName:q.collect.as,structured:Boolean(q.collect.outputSchema),acceptanceStatus:j?.acceptance?.status,error:j?.error,dynamic:{sourceOutput:q.expand.from.output,sourcePath:q.expand.from.path,itemName:q.expand.item??"item",maxItems:q.expand.maxItems,collectAs:q.collect.as},children:I}),V.length>0)Z=Math.max(Z,...V.map((U)=>U.flatIndex+1));continue}let J=q,S=T(W,Z),F=`step-${B}`;if($.push({id:F,kind:"step",agent:J.agent,phase:J.phase,label:f(J,B),status:S,flatIndex:Z,stepIndex:B,outputName:J.as,structured:Boolean(J.outputSchema),acceptanceStatus:W.results?.[Z]?.acceptance?.status,error:W.stepStatuses?.[Z]?.error??W.results?.[Z]?.error}),R(Y,J.phase,F),S==="running"||W.currentFlatIndex===Z||W.currentStepIndex===B)Q=F;Z++}return{runId:W.runId,mode:W.mode??"chain",phases:Y,nodes:$,currentNodeId:Q}}export{JW as buildWorkflowGraphSnapshot};
1
+ import { isDynamicParallelStep, isParallelStep } from "../../shared/settings.js";
2
+ function normalizeStatus(status) {
3
+ switch (status) {
4
+ case "complete":
5
+ case "completed":
6
+ return "completed";
7
+ case "running":
8
+ return "running";
9
+ case "failed":
10
+ return "failed";
11
+ case "paused":
12
+ return "paused";
13
+ case "detached":
14
+ return "detached";
15
+ case "pending":
16
+ return "pending";
17
+ default:
18
+ return;
19
+ }
20
+ }
21
+ function resultStatus(result) {
22
+ if (!result)
23
+ return;
24
+ if (result.detached)
25
+ return "detached";
26
+ if (result.interrupted)
27
+ return "paused";
28
+ return result.exitCode === 0 ? "completed" : "failed";
29
+ }
30
+ function nodeStatus(input, flatIndex) {
31
+ return normalizeStatus(input.stepStatuses?.[flatIndex]?.status) ?? resultStatus(input.results?.[flatIndex]) ?? (input.currentFlatIndex === flatIndex ? "running" : "pending");
32
+ }
33
+ function pushPhase(phases, phase, nodeId) {
34
+ if (!phase)
35
+ return;
36
+ let group = phases.find((candidate) => candidate.title === phase);
37
+ if (!group) {
38
+ group = { title: phase, nodeIds: [] };
39
+ phases.push(group);
40
+ }
41
+ group.nodeIds.push(nodeId);
42
+ }
43
+ function seqLabel(step, stepIndex) {
44
+ return step.label?.trim() || step.agent || `Step ${stepIndex + 1}`;
45
+ }
46
+ function summarizeParallelStatuses(statuses) {
47
+ if (statuses.some((status) => status === "running"))
48
+ return "running";
49
+ if (statuses.some((status) => status === "failed"))
50
+ return "failed";
51
+ if (statuses.some((status) => status === "paused"))
52
+ return "paused";
53
+ if (statuses.some((status) => status === "detached"))
54
+ return "detached";
55
+ if (statuses.length > 0 && statuses.every((status) => status === "completed"))
56
+ return "completed";
57
+ if (statuses.some((status) => status === "completed"))
58
+ return "running";
59
+ return "pending";
60
+ }
61
+ export function buildWorkflowGraphSnapshot(input) {
62
+ const nodes = [];
63
+ const phases = [];
64
+ let flatIndex = 0;
65
+ let currentNodeId;
66
+ for (let stepIndex = 0;stepIndex < input.steps.length; stepIndex++) {
67
+ const step = input.steps[stepIndex];
68
+ if (isParallelStep(step)) {
69
+ const groupId = `step-${stepIndex}`;
70
+ const children = [];
71
+ const childStatuses = [];
72
+ for (let taskIndex = 0;taskIndex < step.parallel.length; taskIndex++) {
73
+ const task = step.parallel[taskIndex];
74
+ const status = nodeStatus(input, flatIndex);
75
+ childStatuses.push(status);
76
+ const childId = `step-${stepIndex}-agent-${taskIndex}`;
77
+ const child = {
78
+ id: childId,
79
+ kind: "agent",
80
+ agent: task.agent,
81
+ phase: task.phase,
82
+ label: task.label?.trim() || task.agent || `Agent ${taskIndex + 1}`,
83
+ status,
84
+ flatIndex,
85
+ stepIndex,
86
+ outputName: task.as,
87
+ structured: Boolean(task.outputSchema),
88
+ acceptanceStatus: input.results?.[flatIndex]?.acceptance?.status,
89
+ error: input.stepStatuses?.[flatIndex]?.error ?? input.results?.[flatIndex]?.error
90
+ };
91
+ children.push(child);
92
+ pushPhase(phases, task.phase, childId);
93
+ if (status === "running" || input.currentFlatIndex === flatIndex)
94
+ currentNodeId = childId;
95
+ flatIndex++;
96
+ }
97
+ const groupStatus = summarizeParallelStatuses(childStatuses);
98
+ if (input.currentStepIndex === stepIndex && !currentNodeId)
99
+ currentNodeId = groupId;
100
+ nodes.push({
101
+ id: groupId,
102
+ kind: "parallel-group",
103
+ label: step.parallel.length === 1 ? "Parallel task" : `Parallel group (${step.parallel.length})`,
104
+ status: groupStatus,
105
+ stepIndex,
106
+ children
107
+ });
108
+ continue;
109
+ }
110
+ if (isDynamicParallelStep(step)) {
111
+ const groupId = `step-${stepIndex}`;
112
+ const materialized = input.dynamicChildren?.[stepIndex] ?? [];
113
+ const groupOverride = input.dynamicGroupStatuses?.[stepIndex];
114
+ const children = [];
115
+ const childStatuses = [];
116
+ for (let taskIndex = 0;taskIndex < materialized.length; taskIndex++) {
117
+ const task = materialized[taskIndex];
118
+ const status = nodeStatus(input, task.flatIndex);
119
+ childStatuses.push(status);
120
+ const childId = `step-${stepIndex}-item-${task.itemKey.replace(/[^a-zA-Z0-9_-]/g, "-")}`;
121
+ const child = {
122
+ id: childId,
123
+ kind: "agent",
124
+ agent: task.agent,
125
+ phase: step.parallel.phase ?? step.phase,
126
+ label: task.label?.trim() || step.parallel.label?.trim() || `${task.agent} ${task.itemKey}`,
127
+ status,
128
+ flatIndex: task.flatIndex,
129
+ stepIndex,
130
+ itemKey: task.itemKey,
131
+ outputName: task.outputName,
132
+ structured: task.structured,
133
+ acceptanceStatus: input.results?.[task.flatIndex]?.acceptance?.status,
134
+ error: input.stepStatuses?.[task.flatIndex]?.error ?? input.results?.[task.flatIndex]?.error ?? task.error
135
+ };
136
+ children.push(child);
137
+ pushPhase(phases, child.phase, childId);
138
+ if (status === "running" || input.currentFlatIndex === task.flatIndex)
139
+ currentNodeId = childId;
140
+ }
141
+ const groupStatus = groupOverride?.status ?? (children.length > 0 ? summarizeParallelStatuses(childStatuses) : input.currentStepIndex === stepIndex ? "running" : "pending");
142
+ if (input.currentStepIndex === stepIndex && !currentNodeId)
143
+ currentNodeId = groupId;
144
+ nodes.push({
145
+ id: groupId,
146
+ kind: "dynamic-parallel-group",
147
+ label: step.label?.trim() || step.parallel.label?.trim() || `Dynamic fanout (${step.collect.as})`,
148
+ status: groupStatus,
149
+ stepIndex,
150
+ outputName: step.collect.as,
151
+ structured: Boolean(step.collect.outputSchema),
152
+ acceptanceStatus: groupOverride?.acceptance?.status,
153
+ error: groupOverride?.error,
154
+ dynamic: {
155
+ sourceOutput: step.expand.from.output,
156
+ sourcePath: step.expand.from.path,
157
+ itemName: step.expand.item ?? "item",
158
+ maxItems: step.expand.maxItems,
159
+ collectAs: step.collect.as
160
+ },
161
+ children
162
+ });
163
+ if (materialized.length > 0)
164
+ flatIndex = Math.max(flatIndex, ...materialized.map((child) => child.flatIndex + 1));
165
+ continue;
166
+ }
167
+ const seq = step;
168
+ const status = nodeStatus(input, flatIndex);
169
+ const id = `step-${stepIndex}`;
170
+ nodes.push({
171
+ id,
172
+ kind: "step",
173
+ agent: seq.agent,
174
+ phase: seq.phase,
175
+ label: seqLabel(seq, stepIndex),
176
+ status,
177
+ flatIndex,
178
+ stepIndex,
179
+ outputName: seq.as,
180
+ structured: Boolean(seq.outputSchema),
181
+ acceptanceStatus: input.results?.[flatIndex]?.acceptance?.status,
182
+ error: input.stepStatuses?.[flatIndex]?.error ?? input.results?.[flatIndex]?.error
183
+ });
184
+ pushPhase(phases, seq.phase, id);
185
+ if (status === "running" || input.currentFlatIndex === flatIndex || input.currentStepIndex === stepIndex)
186
+ currentNodeId = id;
187
+ flatIndex++;
188
+ }
189
+ return {
190
+ runId: input.runId,
191
+ mode: input.mode ?? "chain",
192
+ phases,
193
+ nodes,
194
+ currentNodeId
195
+ };
196
+ }