@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,6 +1,242 @@
1
- import*as g from"node:os";import*as c from"node:path";function d(t){return t.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function p(t){let n=t?.env??process.env,e=t&&Object.hasOwn(t,"getuid")?t.getuid:process.getuid?.bind(process);if(typeof e==="function")return`uid-${e()}`;for(let i of["USERNAME","USER","LOGNAME"]){let a=n[i];if(a)return`user-${d(a)}`}let s=t&&Object.hasOwn(t,"userInfo")?t.userInfo:g.userInfo;try{let i=s?.().username;if(i)return`user-${d(i)}`}catch{}let r=n.USERPROFILE??n.HOME;if(r)return`home-${d(r)}`;let l=t&&Object.hasOwn(t,"homedir")?t.homedir:g.homedir;try{let i=l?.();if(i)return`home-${d(i)}`}catch{}return"shared"}var h=c.join(g.tmpdir(),`dm-subagents-${p()}`),j=c.join(h,"async-subagent-results"),D=c.join(h,"async-subagent-runs"),E=c.join(h,"chain-runs"),O=c.join(h,"artifacts");var f="subagent-slash-result";var o=new Map,u=new Map,C=1,L=[],x={input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0};function S(){return C++}function y(){return{...x}}function k(t,n,e,s){return{agent:t,task:n,exitCode:0,messages:L,usage:y(),progress:{...s!==void 0?{index:s}:{},agent:t,status:e,task:n,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}}}function A(t){let n=t.tasks??[];return{content:[{type:"text",text:n.map((e)=>`${e.agent}: ${e.task}`).join(`
1
+ import { SLASH_RESULT_TYPE } from "../shared/types.js";
2
+ const liveSnapshots = new Map;
3
+ const finalSnapshots = new Map;
4
+ let versionCounter = 1;
5
+ const EMPTY_MESSAGES = [];
6
+ const EMPTY_USAGE = {
7
+ input: 0,
8
+ output: 0,
9
+ cacheRead: 0,
10
+ cacheWrite: 0,
11
+ cost: 0,
12
+ turns: 0
13
+ };
14
+ function nextVersion() {
15
+ return versionCounter++;
16
+ }
17
+ function cloneUsage() {
18
+ return { ...EMPTY_USAGE };
19
+ }
20
+ function createPlaceholderResult(agent, task, status, index) {
21
+ return {
22
+ agent,
23
+ task,
24
+ exitCode: 0,
25
+ messages: EMPTY_MESSAGES,
26
+ usage: cloneUsage(),
27
+ progress: {
28
+ ...index !== undefined ? { index } : {},
29
+ agent,
30
+ status,
31
+ task,
32
+ recentTools: [],
33
+ recentOutput: [],
34
+ toolCount: 0,
35
+ tokens: 0,
36
+ durationMs: 0
37
+ }
38
+ };
39
+ }
40
+ function buildParallelInitialResult(params) {
41
+ const tasks = params.tasks ?? [];
42
+ return {
43
+ content: [{ type: "text", text: tasks.map((task) => `${task.agent}: ${task.task}`).join(`
2
44
 
3
- `)}],details:{mode:"parallel",...t.context?{context:t.context}:{},results:n.map((e,s)=>k(e.agent,e.task,"running",s)),progress:n.map((e,s)=>({index:s,agent:e.agent,status:"running",task:e.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}))}}}function R(t){return"parallel"in t&&Array.isArray(t.parallel)}function I(t){if(R(t))return`[${t.parallel.map((n)=>n.agent).join("+")}]`;return t.agent}function T(t,n){let e=[],s=0;for(let r of t){if(R(r)){for(let l of r.parallel)e.push(k(l.agent,l.task??n??"",e.length===0?"running":"pending",s)),s++;continue}e.push(k(r.agent,r.task??n??"",e.length===0?"running":"pending",s)),s++}return e}function M(t){let n=t.chain??[],e=T(n,t.task);return{content:[{type:"text",text:e.map((s,r)=>`Step ${r+1}: ${s.agent}
4
- ${s.task}`).join(`
45
+ `) }],
46
+ details: {
47
+ mode: "parallel",
48
+ ...params.context ? { context: params.context } : {},
49
+ results: tasks.map((task, index) => createPlaceholderResult(task.agent, task.task, "running", index)),
50
+ progress: tasks.map((task, index) => ({
51
+ index,
52
+ agent: task.agent,
53
+ status: "running",
54
+ task: task.task,
55
+ recentTools: [],
56
+ recentOutput: [],
57
+ toolCount: 0,
58
+ tokens: 0,
59
+ durationMs: 0
60
+ }))
61
+ }
62
+ };
63
+ }
64
+ function isParallelChainStep(step) {
65
+ return "parallel" in step && Array.isArray(step.parallel);
66
+ }
67
+ function chainStepLabel(step) {
68
+ if (isParallelChainStep(step)) {
69
+ return `[${step.parallel.map((entry) => entry.agent).join("+")}]`;
70
+ }
71
+ return step.agent;
72
+ }
73
+ function flattenChainResults(chain, fallbackTask) {
74
+ const results = [];
75
+ let flatIndex = 0;
76
+ for (const step of chain) {
77
+ if (isParallelChainStep(step)) {
78
+ for (const task of step.parallel) {
79
+ results.push(createPlaceholderResult(task.agent, task.task ?? fallbackTask ?? "", results.length === 0 ? "running" : "pending", flatIndex));
80
+ flatIndex++;
81
+ }
82
+ continue;
83
+ }
84
+ results.push(createPlaceholderResult(step.agent, step.task ?? fallbackTask ?? "", results.length === 0 ? "running" : "pending", flatIndex));
85
+ flatIndex++;
86
+ }
87
+ return results;
88
+ }
89
+ function buildChainInitialResult(params) {
90
+ const chain = params.chain ?? [];
91
+ const results = flattenChainResults(chain, params.task);
92
+ return {
93
+ content: [{
94
+ type: "text",
95
+ text: results.map((result, index) => `Step ${index + 1}: ${result.agent}
96
+ ${result.task}`).join(`
5
97
 
6
- `)}],details:{mode:"chain",...t.context?{context:t.context}:{},results:e,progress:e.map((s,r)=>({index:r,agent:s.agent,status:r===0?"running":"pending",task:s.task,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0})),chainAgents:n.map((s)=>I(s)),totalSteps:n.length,currentStepIndex:0}}}function q(t){let n=t.agent??"subagent",e=t.task??"";return{content:[{type:"text",text:e}],details:{mode:"single",...t.context?{context:t.context}:{},results:[k(n,e,"running")],progress:[{agent:n,status:"running",task:e,recentTools:[],recentOutput:[],toolCount:0,tokens:0,durationMs:0}]}}}function U(t,n){let e=(n.tasks?.length??0)>0?A(n):(n.chain?.length??0)>0?M(n):q(n);return o.set(t,{result:e,version:S()}),u.delete(t),{requestId:t,result:e}}function $(t,n){return t.map((e,s)=>{let r=n?.find((l)=>l.index===s)??n?.[s]??e.progress;return r?{...e,progress:r}:e})}function W(t,n){let e=o.get(t);if(!e)return;let s=n.progress;if(!s||!e.result.details)return;let r=s.findIndex((i)=>i.status==="running"),l={...e.result.details,progress:s,results:$(e.result.details.results,s),...e.result.details.mode==="chain"&&r>=0?{currentStepIndex:r}:{}};o.set(t,{result:{...e.result,details:l},version:S()})}function w(t){let n={result:t.result,version:S()};return u.set(t.requestId,n),o.delete(t.requestId),{requestId:t.requestId,result:t.result}}function B(t,n,e){let s=U(t,n).result,r=s.details.results.map((a)=>({...a,exitCode:1,error:e,progress:a.progress?{...a.progress,status:"failed"}:a.progress})),l={content:[{type:"text",text:e}],details:{...s.details,results:r,progress:r.map((a)=>a.progress).filter(Boolean)}},i={result:l,version:S()};return u.set(t,i),o.delete(t),{requestId:t,result:l}}function P(t){if(!t||typeof t!=="object")return!1;let n=t;if(typeof n.requestId!=="string"||!n.requestId)return!1;if(!n.result||!Array.isArray(n.result.content))return!1;return!!n.result.details&&Array.isArray(n.result.details.results)}function b(t){return P(t)?t:void 0}function F(t){return u.get(t.requestId)??o.get(t.requestId)??{result:t.result,version:0}}function J(t){o.clear(),u.clear();for(let n of t){let e=n;if(e?.type!=="custom_message"||e.customType!==f)continue;let s=b(e.details);if(!s)continue;u.set(s.requestId,{result:s.result,version:S()})}}function K(){o.clear(),u.clear()}export{J as restoreSlashFinalSnapshots,b as resolveSlashMessageDetails,F as getSlashRenderableSnapshot,w as finalizeSlashResult,B as failSlashResult,K as clearSlashSnapshots,U as buildSlashInitialResult,W as applySlashUpdate};
98
+ `)
99
+ }],
100
+ details: {
101
+ mode: "chain",
102
+ ...params.context ? { context: params.context } : {},
103
+ results,
104
+ progress: results.map((result, index) => ({
105
+ index,
106
+ agent: result.agent,
107
+ status: index === 0 ? "running" : "pending",
108
+ task: result.task,
109
+ recentTools: [],
110
+ recentOutput: [],
111
+ toolCount: 0,
112
+ tokens: 0,
113
+ durationMs: 0
114
+ })),
115
+ chainAgents: chain.map((step) => chainStepLabel(step)),
116
+ totalSteps: chain.length,
117
+ currentStepIndex: 0
118
+ }
119
+ };
120
+ }
121
+ function buildSingleInitialResult(params) {
122
+ const agent = params.agent ?? "subagent";
123
+ const task = params.task ?? "";
124
+ return {
125
+ content: [{ type: "text", text: task }],
126
+ details: {
127
+ mode: "single",
128
+ ...params.context ? { context: params.context } : {},
129
+ results: [createPlaceholderResult(agent, task, "running")],
130
+ progress: [{
131
+ agent,
132
+ status: "running",
133
+ task,
134
+ recentTools: [],
135
+ recentOutput: [],
136
+ toolCount: 0,
137
+ tokens: 0,
138
+ durationMs: 0
139
+ }]
140
+ }
141
+ };
142
+ }
143
+ export function buildSlashInitialResult(requestId, params) {
144
+ const result = (params.tasks?.length ?? 0) > 0 ? buildParallelInitialResult(params) : (params.chain?.length ?? 0) > 0 ? buildChainInitialResult(params) : buildSingleInitialResult(params);
145
+ liveSnapshots.set(requestId, { result, version: nextVersion() });
146
+ finalSnapshots.delete(requestId);
147
+ return { requestId, result };
148
+ }
149
+ function cloneResultsWithProgress(results, progress) {
150
+ return results.map((result, index) => {
151
+ const nextProgress = progress?.find((entry) => entry.index === index) ?? progress?.[index] ?? result.progress;
152
+ return nextProgress ? { ...result, progress: nextProgress } : result;
153
+ });
154
+ }
155
+ export function applySlashUpdate(requestId, update) {
156
+ const snapshot = liveSnapshots.get(requestId);
157
+ if (!snapshot)
158
+ return;
159
+ const progress = update.progress;
160
+ if (!progress || !snapshot.result.details)
161
+ return;
162
+ const currentStepIndex = progress.findIndex((entry) => entry.status === "running");
163
+ const nextDetails = {
164
+ ...snapshot.result.details,
165
+ progress,
166
+ results: cloneResultsWithProgress(snapshot.result.details.results, progress),
167
+ ...snapshot.result.details.mode === "chain" && currentStepIndex >= 0 ? { currentStepIndex } : {}
168
+ };
169
+ liveSnapshots.set(requestId, {
170
+ result: {
171
+ ...snapshot.result,
172
+ details: nextDetails
173
+ },
174
+ version: nextVersion()
175
+ });
176
+ }
177
+ export function finalizeSlashResult(response) {
178
+ const snapshot = {
179
+ result: response.result,
180
+ version: nextVersion()
181
+ };
182
+ finalSnapshots.set(response.requestId, snapshot);
183
+ liveSnapshots.delete(response.requestId);
184
+ return {
185
+ requestId: response.requestId,
186
+ result: response.result
187
+ };
188
+ }
189
+ export function failSlashResult(requestId, params, message) {
190
+ const initial = buildSlashInitialResult(requestId, params).result;
191
+ const failedResults = initial.details.results.map((result) => ({
192
+ ...result,
193
+ exitCode: 1,
194
+ error: message,
195
+ progress: result.progress ? { ...result.progress, status: "failed" } : result.progress
196
+ }));
197
+ const result = {
198
+ content: [{ type: "text", text: message }],
199
+ details: {
200
+ ...initial.details,
201
+ results: failedResults,
202
+ progress: failedResults.map((entry) => entry.progress).filter(Boolean)
203
+ }
204
+ };
205
+ const snapshot = { result, version: nextVersion() };
206
+ finalSnapshots.set(requestId, snapshot);
207
+ liveSnapshots.delete(requestId);
208
+ return { requestId, result };
209
+ }
210
+ function isSlashMessageDetails(value) {
211
+ if (!value || typeof value !== "object")
212
+ return false;
213
+ const v = value;
214
+ if (typeof v.requestId !== "string" || !v.requestId)
215
+ return false;
216
+ if (!v.result || !Array.isArray(v.result.content))
217
+ return false;
218
+ return !!v.result.details && Array.isArray(v.result.details.results);
219
+ }
220
+ export function resolveSlashMessageDetails(value) {
221
+ return isSlashMessageDetails(value) ? value : undefined;
222
+ }
223
+ export function getSlashRenderableSnapshot(details) {
224
+ return finalSnapshots.get(details.requestId) ?? liveSnapshots.get(details.requestId) ?? { result: details.result, version: 0 };
225
+ }
226
+ export function restoreSlashFinalSnapshots(entries) {
227
+ liveSnapshots.clear();
228
+ finalSnapshots.clear();
229
+ for (const entry of entries) {
230
+ const e = entry;
231
+ if (e?.type !== "custom_message" || e.customType !== SLASH_RESULT_TYPE)
232
+ continue;
233
+ const details = resolveSlashMessageDetails(e.details);
234
+ if (!details)
235
+ continue;
236
+ finalSnapshots.set(details.requestId, { result: details.result, version: nextVersion() });
237
+ }
238
+ }
239
+ export function clearSlashSnapshots() {
240
+ liveSnapshots.clear();
241
+ finalSnapshots.clear();
242
+ }
@@ -1 +1,64 @@
1
- import{truncateToWidth as f,visibleWidth as a}from"@duckmind/dm-tui";function g(n,e){let r=n.toLowerCase(),t=e.toLowerCase();if(t.includes(r))return 100+r.length/t.length*50;let o=0,i=0,s=0;for(let c=0;c<t.length&&i<r.length;c++)if(t[c]===r[i])o+=10+s,s+=5,i++;else s=0;return i===r.length?o:0}function d(n,e){let r=e.trim();if(!r)return n;return n.map((t)=>({item:t,score:Math.max(g(r,t.name),g(r,t.description)*0.8,g(r,t.model??"")*0.6)})).filter((t)=>t.score>0).sort((t,o)=>o.score-t.score).map((t)=>t.item)}function u(n,e){let r=a(n);return n+" ".repeat(Math.max(0,e-r))}function l(n,e,r){let t=e-2,o=n.replace(/[\r\n]+/g," ").replace(/\t/g," "),i=f(o,t);return r.fg("border","│")+u(i,t)+r.fg("border","│")}function m(n,e,r){let t=e-2,o=Math.max(0,t-a(n)),i=Math.floor(o/2),s=o-i;return r.fg("border","╭"+"─".repeat(i))+r.fg("accent",n)+r.fg("border","─".repeat(s)+"╮")}function h(n){let e=process.env.HOME;if(e&&n.startsWith(e))return`~${n.slice(e.length)}`;return n}function b(n,e){let r="";if(n>0)r+=`↑ ${n} more`;if(e>0)r+=`${r?" ":""}↓ ${e} more`;return r}function x(n,e,r){let t=e-2,o=Math.max(0,t-a(n)),i=Math.floor(o/2),s=o-i;return r.fg("border","╰"+"─".repeat(i))+r.fg("dim",n)+r.fg("border","─".repeat(s)+"╯")}export{l as row,m as renderHeader,x as renderFooter,u as pad,d as fuzzyFilter,b as formatScrollInfo,h as formatPath};
1
+ import { truncateToWidth, visibleWidth } from "@duckmind/dm-tui";
2
+ function fuzzyScore(query, text) {
3
+ const lq = query.toLowerCase();
4
+ const lt = text.toLowerCase();
5
+ if (lt.includes(lq))
6
+ return 100 + lq.length / lt.length * 50;
7
+ let score = 0;
8
+ let qi = 0;
9
+ let consecutive = 0;
10
+ for (let i = 0;i < lt.length && qi < lq.length; i++) {
11
+ if (lt[i] === lq[qi]) {
12
+ score += 10 + consecutive;
13
+ consecutive += 5;
14
+ qi++;
15
+ } else {
16
+ consecutive = 0;
17
+ }
18
+ }
19
+ return qi === lq.length ? score : 0;
20
+ }
21
+ export function fuzzyFilter(items, query) {
22
+ const q = query.trim();
23
+ if (!q)
24
+ return items;
25
+ return items.map((item) => ({ item, score: Math.max(fuzzyScore(q, item.name), fuzzyScore(q, item.description) * 0.8, fuzzyScore(q, item.model ?? "") * 0.6) })).filter((x) => x.score > 0).sort((a, b) => b.score - a.score).map((x) => x.item);
26
+ }
27
+ export function pad(s, len) {
28
+ const vis = visibleWidth(s);
29
+ return s + " ".repeat(Math.max(0, len - vis));
30
+ }
31
+ export function row(content, width, theme) {
32
+ const innerW = width - 2;
33
+ const singleLine = content.replace(/[\r\n]+/g, " ").replace(/\t/g, " ");
34
+ const clipped = truncateToWidth(singleLine, innerW);
35
+ return theme.fg("border", "│") + pad(clipped, innerW) + theme.fg("border", "│");
36
+ }
37
+ export function renderHeader(text, width, theme) {
38
+ const innerW = width - 2;
39
+ const padLen = Math.max(0, innerW - visibleWidth(text));
40
+ const padLeft = Math.floor(padLen / 2);
41
+ const padRight = padLen - padLeft;
42
+ return theme.fg("border", "╭" + "─".repeat(padLeft)) + theme.fg("accent", text) + theme.fg("border", "─".repeat(padRight) + "╮");
43
+ }
44
+ export function formatPath(filePath) {
45
+ const home = process.env.HOME;
46
+ if (home && filePath.startsWith(home))
47
+ return `~${filePath.slice(home.length)}`;
48
+ return filePath;
49
+ }
50
+ export function formatScrollInfo(above, below) {
51
+ let info = "";
52
+ if (above > 0)
53
+ info += `↑ ${above} more`;
54
+ if (below > 0)
55
+ info += `${info ? " " : ""}↓ ${below} more`;
56
+ return info;
57
+ }
58
+ export function renderFooter(text, width, theme) {
59
+ const innerW = width - 2;
60
+ const padLen = Math.max(0, innerW - visibleWidth(text));
61
+ const padLeft = Math.floor(padLen / 2);
62
+ const padRight = padLen - padLeft;
63
+ return theme.fg("border", "╰" + "─".repeat(padLeft)) + theme.fg("dim", text) + theme.fg("border", "─".repeat(padRight) + "╯");
64
+ }