@duckmind/dm-windows-x64 0.60.6 → 0.60.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,10 +1,226 @@
1
- import{spawn as d}from"node:child_process";import{basename as x}from"node:path";function Z(E=process.env,_=process.execPath){let R=E.GREEDY_SEARCH_NODE||E.NODE_BINARY||E.NODE;if(R?.trim())return R.trim();let D=x(_||"").toLowerCase();if(D==="node"||D==="node.exe")return _;return"node"}import{existsSync as e}from"node:fs";import{join as EE}from"node:path";import{existsSync as g,mkdirSync as B,readFileSync as Q,writeFileSync as a}from"node:fs";import{homedir as h}from"node:os";import{join as q}from"node:path";import{tmpdir as P}from"node:os";function u(E,_=9222){let R=Number.parseInt(String(E??""),10);return Number.isInteger(R)&&R>1024&&R<65535?R:_}var M=P().replaceAll("\\","/"),AE=u(process.env.GREEDY_SEARCH_PORT),m=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${M}/greedysearch-chrome-profile`).replaceAll("\\","/"),mE=`${m}/DevToolsActivePort`,lE=process.env.GREEDY_SEARCH_PID_FILE||`${m}/browser.pid`,SE=process.env.CDP_PAGES_CACHE||`${m}/cdp-pages.json`,OE=process.env.GREEDY_SEARCH_MODE_FILE||`${m}/browser-mode`,YE=process.env.GREEDY_SEARCH_METADATA_FILE||`${m}/browser-metadata.json`,LE=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${m}/browser-launch.lock`,NE=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${m}/browser-last-activity`,GE=(process.env.CDP_SOCKET_DIR||`${m}/cdp-sockets`).replaceAll("\\","/"),$E=`${m}/visible-recovery.jsonl`,k=q(h(),".dm"),O=q(k,"greedyconfig"),z=["perplexity","google","chatgpt","gemini"],f="gemini";function o(){try{if(g(O)){let E=Q(O,"utf8"),_=JSON.parse(E);if(Array.isArray(_.engines)&&_.engines.length>0&&_.engines.every((R)=>typeof R==="string")){let R=_.engines.filter((l)=>b[l]),D=_.engines.filter((l)=>!b[l]);if(D.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${O}: ${D.join(", ")}
2
- [greedysearch] Available engines: ${Object.keys(b).join(", ")}
3
- `);if(R.length>0)return R;process.stderr.write(`[greedysearch] Warning: no valid engines in ${O}, falling back to defaults: ${z.join(", ")}
4
- `)}}}catch{}return z}function t(){try{if(!g(k))B(k,{recursive:!0});if(!g(O))a(O,JSON.stringify({engines:z,synthesizer:f},null,2)+`
5
- `,"utf8")}catch{}}t();var W=["gemini","chatgpt"];function s(){try{if(g(O)){let E=Q(O,"utf8"),_=JSON.parse(E);if(typeof _.synthesizer==="string"){let R=_.synthesizer.toLowerCase();if(W.includes(R))return R;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${_.synthesizer}" in ${O}
6
- [greedysearch] Available synthesizers: ${W.join(", ")}
7
- [greedysearch] Falling back to default: ${f}
8
- `)}}}catch{}return f}var b={perplexity:"perplexity.mjs",p:"perplexity.mjs",bing:"bing-copilot.mjs",b:"bing-copilot.mjs",google:"google-ai.mjs",g:"google-ai.mjs",gemini:"gemini.mjs",gem:"gemini.mjs",chatgpt:"chatgpt.mjs",gpt:"chatgpt.mjs","semantic-scholar":"semantic-scholar.mjs",semanticscholar:"semantic-scholar.mjs",s2:"semantic-scholar.mjs",logically:"logically.mjs",log:"logically.mjs"},n=o();var HE=s(),FE=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=m;function kE(E){return E.replace(/^"|"$/g,"")}function zE(E){return e(EE(E,"bin","cdp.mjs"))}function fE(){return{content:[{type:"text",text:"cdp.mjs missing — try reinstalling: pi install git:github.com/apmantza/greedysearch-dm"}],details:{}}}function wE(E,_){let R=_ instanceof Error?_.message:String(_);return{content:[{type:"text",text:`${E}: ${R}`}],details:{}}}function VE(E,_,R,D,l,c,G={}){return new Promise(($,L)=>{let{headless:i=!0}=G,y=[...R];if(i!==!1&&process.env.GREEDY_SEARCH_VISIBLE!=="1")y.push("--headless");if(i===!1)y.push("--always-visible");let C={...process.env};if(i===!1)C.GREEDY_SEARCH_VISIBLE="1",C.GREEDY_SEARCH_ALWAYS_VISIBLE="1";let I=d(Z(),[D,E,"--inline","--stdin",...y],{stdio:["pipe","pipe","pipe"],env:C});I.stdin.write(_),I.stdin.end();let A="",S="",F=51200,Y=!1,X=900000,w=parseInt(process.env.GREEDY_SEARCH_TIMEOUT_MS||"",10),V=Number.isNaN(w)?X:w,T=setTimeout(()=>{if(Y)return;if(Y=!0,l?.removeEventListener("abort",v),process.platform==="win32")I.kill();else I.kill("SIGTERM");L(Error(`greedy-search child timed out after ${V}ms (watchdog)`))},V);T.unref();let v=()=>{if(Y)return;Y=!0,clearTimeout(T),I.kill("SIGTERM"),L(Error("Aborted"))};l?.addEventListener("abort",v,{once:!0}),I.stderr.on("data",(N)=>{if(S+=N,S.length>F)S=S.slice(-F);let r=/^PROGRESS:(perplexity|google|chatgpt|bing|gemini|semantic-scholar|semanticscholar|s2|logically):(done|error|needs-human)$/;for(let H of N.toString().split(`
9
- `)){let p=H.match(r);if(p&&c)c({type:"engine",engine:p[1],status:p[2]});let K=H.match(/^PROGRESS:synthesis:(done|error|skipped)$/);if(K&&c)c({type:"engine",engine:"synthesis",status:K[1]});let J=H.match(/^PROGRESS:research:(.+)$/);if(J&&c)c({type:"text",text:J[1]});let U=H.match(/^\[greedysearch\] (\[.+?\] .+)$/);if(U&&c)c({type:"text",text:U[1]});let j=H.match(/^\[(perplexity|google|chatgpt|bing|gemini|semantic-scholar|logically)\] stage: (.+) \(\+\d+ms\)$/);if(j&&c)c({type:"text",text:`${j[1]}: ${j[2]}`})}}),I.stdout.on("data",(N)=>A+=N),I.on("close",(N)=>{if(Y)return;if(Y=!0,clearTimeout(T),l?.removeEventListener("abort",v),N!==0)L(Error(S.trim()||`search.mjs exited with code ${N}`));else{if(c&&E!=="all")c({type:"engine",engine:E,status:"done"});try{$(JSON.parse(A.trim()))}catch{L(Error(`Invalid JSON from search.mjs: ${A.slice(0,200)}`))}}})})}function _E(E,_){if(_<=0)return"";let R=16,D=Math.round(E/_*R);return"["+"█".repeat(Math.min(D,R))+"░".repeat(Math.max(0,R-D))+"]"}function RE(E){if(E<1000)return"—";let _=Math.round(E/1000);if(_<60)return`${_}s`;return`${Math.floor(_/60)}m ${_%60}s`}function KE(E,_,R,D,l){let c=Date.now(),G=new Map,$="";function L(){let i=[];i.push(`**${R}...** ${l||""}`.trim());let y=G.size;if(E.length>1&&y>0&&!$){let I=Date.now()-c,A=Math.min(1,y/E.length),S=A>0.01?Math.round(I/A-I):null,F=_E(y,E.length),Y=S!=null&&S>0?RE(S):"—";i.push(`${F} ${y}/${E.length} engines (ETA ${Y})`)}if($)i.push($);let C=[];for(let I of E){let A=G.get(I);if(A==="done")C.push(`✅ ${I} done`);else if(A==="error")C.push(`❌ ${I} failed`);else if(A==="needs-human")C.push(`\uD83D\uDD13 ${I} needs manual verification`);else C.push(`⏳ ${I}`)}if(D&&y>=E.length){let I=G.get("synthesis");if(I==="done")C.push("✅ synthesized");else if(I==="error")C.push("❌ synthesis failed");else if(I==="needs-human")C.push("⏭️ synthesis skipped");else C.push("\uD83D\uDD04 synthesizing")}if(C.length>0){let I=C.join(" · ");i.push(I.length>90?I.slice(0,88)+"…":I)}_?.({content:[{type:"text",text:i.join(`
10
- `)}],details:{_progress:!0}})}return(i)=>{if(i.type==="text"){if(i.text.startsWith("["))$=i.text;L();return}let{engine:y,status:C}=i;G.set(y,C),L()}}export{kE as stripQuotes,VE as runSearch,KE as makeProgressTracker,wE as errorResult,fE as cdpMissingResult,zE as cdpAvailable,n as ALL_ENGINES};
1
+ import { spawn } from "node:child_process";
2
+ import { nodeRuntimeCommand } from "../utils/node-runtime.mjs";
3
+ import { existsSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { ALL_ENGINES } from "../search/constants.mjs";
6
+
7
+ export { ALL_ENGINES };
8
+ export function stripQuotes(val) {
9
+ return val.replace(/^"|"$/g, "");
10
+ }
11
+ export function cdpAvailable(baseDir) {
12
+ return existsSync(join(baseDir, "bin", "cdp.mjs"));
13
+ }
14
+ export function cdpMissingResult() {
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: "cdp.mjs missing — try reinstalling: pi install git:github.com/apmantza/greedysearch-dm"
20
+ }
21
+ ],
22
+ details: {}
23
+ };
24
+ }
25
+ export function errorResult(prefix, e) {
26
+ const msg = e instanceof Error ? e.message : String(e);
27
+ return {
28
+ content: [{ type: "text", text: `${prefix}: ${msg}` }],
29
+ details: {}
30
+ };
31
+ }
32
+ export function runSearch(engine, query, flags, searchBin, signal, onProgress, options = {}) {
33
+ return new Promise((resolve, reject) => {
34
+ const { headless = true } = options;
35
+ const allFlags = [...flags];
36
+ if (headless !== false && process.env.GREEDY_SEARCH_VISIBLE !== "1")
37
+ allFlags.push("--headless");
38
+ if (headless === false)
39
+ allFlags.push("--always-visible");
40
+ const procEnv = { ...process.env };
41
+ if (headless === false) {
42
+ procEnv.GREEDY_SEARCH_VISIBLE = "1";
43
+ procEnv.GREEDY_SEARCH_ALWAYS_VISIBLE = "1";
44
+ }
45
+ const proc = spawn(nodeRuntimeCommand(), [searchBin, engine, "--inline", "--stdin", ...allFlags], { stdio: ["pipe", "pipe", "pipe"], env: procEnv });
46
+ proc.stdin.write(query);
47
+ proc.stdin.end();
48
+ let out = "";
49
+ let err = "";
50
+ const MAX_ERR = 50 * 1024;
51
+ let finished = false;
52
+ const DEFAULT_TIMEOUT_MS = 15 * 60 * 1000;
53
+ const parsedTimeout = parseInt(process.env.GREEDY_SEARCH_TIMEOUT_MS || "", 10);
54
+ const timeoutMs = Number.isNaN(parsedTimeout) ? DEFAULT_TIMEOUT_MS : parsedTimeout;
55
+ const timer = setTimeout(() => {
56
+ if (finished)
57
+ return;
58
+ finished = true;
59
+ signal?.removeEventListener("abort", onAbort);
60
+ if (process.platform === "win32")
61
+ proc.kill();
62
+ else
63
+ proc.kill("SIGTERM");
64
+ reject(new Error(`greedy-search child timed out after ${timeoutMs}ms (watchdog)`));
65
+ }, timeoutMs);
66
+ timer.unref();
67
+ const onAbort = () => {
68
+ if (finished)
69
+ return;
70
+ finished = true;
71
+ clearTimeout(timer);
72
+ proc.kill("SIGTERM");
73
+ reject(new Error("Aborted"));
74
+ };
75
+ signal?.addEventListener("abort", onAbort, { once: true });
76
+ proc.stderr.on("data", (d) => {
77
+ err += d;
78
+ if (err.length > MAX_ERR)
79
+ err = err.slice(-MAX_ERR);
80
+ const ENGINE_PROGRESS_RE = /^PROGRESS:(perplexity|google|chatgpt|bing|gemini|semantic-scholar|semanticscholar|s2|logically):(done|error|needs-human)$/;
81
+ for (const line of d.toString().split(`
82
+ `)) {
83
+ const engineMatch = line.match(ENGINE_PROGRESS_RE);
84
+ if (engineMatch && onProgress) {
85
+ onProgress({
86
+ type: "engine",
87
+ engine: engineMatch[1],
88
+ status: engineMatch[2]
89
+ });
90
+ }
91
+ const synthMatch = line.match(/^PROGRESS:synthesis:(done|error|skipped)$/);
92
+ if (synthMatch && onProgress) {
93
+ onProgress({
94
+ type: "engine",
95
+ engine: "synthesis",
96
+ status: synthMatch[1]
97
+ });
98
+ }
99
+ const researchMatch = line.match(/^PROGRESS:research:(.+)$/);
100
+ if (researchMatch && onProgress) {
101
+ onProgress({
102
+ type: "text",
103
+ text: researchMatch[1]
104
+ });
105
+ }
106
+ const barMatch = line.match(/^\[greedysearch\] (\[.+?\] .+)$/);
107
+ if (barMatch && onProgress) {
108
+ onProgress({
109
+ type: "text",
110
+ text: barMatch[1]
111
+ });
112
+ }
113
+ const stageMatch = line.match(/^\[(perplexity|google|chatgpt|bing|gemini|semantic-scholar|logically)\] stage: (.+) \(\+\d+ms\)$/);
114
+ if (stageMatch && onProgress) {
115
+ onProgress({
116
+ type: "text",
117
+ text: `${stageMatch[1]}: ${stageMatch[2]}`
118
+ });
119
+ }
120
+ }
121
+ });
122
+ proc.stdout.on("data", (d) => out += d);
123
+ proc.on("close", (code) => {
124
+ if (finished)
125
+ return;
126
+ finished = true;
127
+ clearTimeout(timer);
128
+ signal?.removeEventListener("abort", onAbort);
129
+ if (code !== 0) {
130
+ reject(new Error(err.trim() || `search.mjs exited with code ${code}`));
131
+ } else {
132
+ if (onProgress && engine !== "all") {
133
+ onProgress({
134
+ type: "engine",
135
+ engine,
136
+ status: "done"
137
+ });
138
+ }
139
+ try {
140
+ resolve(JSON.parse(out.trim()));
141
+ } catch {
142
+ reject(new Error(`Invalid JSON from search.mjs: ${out.slice(0, 200)}`));
143
+ }
144
+ }
145
+ });
146
+ });
147
+ }
148
+ function renderBar(done, total) {
149
+ if (total <= 0)
150
+ return "";
151
+ const width = 16;
152
+ const filled = Math.round(done / total * width);
153
+ return "[" + "█".repeat(Math.min(filled, width)) + "░".repeat(Math.max(0, width - filled)) + "]";
154
+ }
155
+ function fmtDuration(ms) {
156
+ if (ms < 1000)
157
+ return "—";
158
+ const s = Math.round(ms / 1000);
159
+ if (s < 60)
160
+ return `${s}s`;
161
+ return `${Math.floor(s / 60)}m ${s % 60}s`;
162
+ }
163
+ export function makeProgressTracker(engines, onUpdate, suffix, showSynthesis, query) {
164
+ const startedAt = Date.now();
165
+ const completed = new Map;
166
+ let latestBarText = "";
167
+ function render() {
168
+ const lines = [];
169
+ lines.push(`**${suffix}...** ${query || ""}`.trim());
170
+ const done = completed.size;
171
+ if (engines.length > 1 && done > 0 && !latestBarText) {
172
+ const elapsed = Date.now() - startedAt;
173
+ const frac = Math.min(1, done / engines.length);
174
+ const etaMs = frac > 0.01 ? Math.round(elapsed / frac - elapsed) : null;
175
+ const bar = renderBar(done, engines.length);
176
+ const eta = etaMs != null && etaMs > 0 ? fmtDuration(etaMs) : "—";
177
+ lines.push(`${bar} ${done}/${engines.length} engines (ETA ${eta})`);
178
+ }
179
+ if (latestBarText)
180
+ lines.push(latestBarText);
181
+ const parts = [];
182
+ for (const e of engines) {
183
+ const s = completed.get(e);
184
+ if (s === "done")
185
+ parts.push(`✅ ${e} done`);
186
+ else if (s === "error")
187
+ parts.push(`❌ ${e} failed`);
188
+ else if (s === "needs-human")
189
+ parts.push(`\uD83D\uDD13 ${e} needs manual verification`);
190
+ else
191
+ parts.push(`⏳ ${e}`);
192
+ }
193
+ if (showSynthesis && done >= engines.length) {
194
+ const synStatus = completed.get("synthesis");
195
+ if (synStatus === "done")
196
+ parts.push("✅ synthesized");
197
+ else if (synStatus === "error")
198
+ parts.push("❌ synthesis failed");
199
+ else if (synStatus === "needs-human")
200
+ parts.push("⏭️ synthesis skipped");
201
+ else
202
+ parts.push("\uD83D\uDD04 synthesizing");
203
+ }
204
+ if (parts.length > 0) {
205
+ const statusLine = parts.join(" · ");
206
+ lines.push(statusLine.length > 90 ? statusLine.slice(0, 88) + "…" : statusLine);
207
+ }
208
+ onUpdate?.({
209
+ content: [{ type: "text", text: lines.join(`
210
+ `) }],
211
+ details: { _progress: true }
212
+ });
213
+ }
214
+ return (update) => {
215
+ if (update.type === "text") {
216
+ if (update.text.startsWith("[")) {
217
+ latestBarText = update.text;
218
+ }
219
+ render();
220
+ return;
221
+ }
222
+ const { engine, status } = update;
223
+ completed.set(engine, status);
224
+ render();
225
+ };
226
+ }
@@ -1,7 +1,38 @@
1
- function J(j,B=8000){if(!j||j.length<=B)return j;let q=`
1
+ export function trimContentHeadTail(content, maxChars = 8000) {
2
+ if (!content || content.length <= maxChars) {
3
+ return content;
4
+ }
5
+ const marker = `
2
6
 
3
7
  [...content trimmed...]
4
8
 
5
- `,D=B-q.length,F=Math.floor(D*0.75),G=D-F,y=F;while(y>F-100&&j[y]!==`
6
- `)y--;if(y<=F-100)y=F;let A=j.length-G;while(A<j.length-G+100&&j[A]!==`
7
- `)A++;if(A>=j.length-G+100)A=j.length-G;let H=j.slice(0,y).trimEnd(),I=j.slice(A).trimStart();return`${H}${q}${I}`}function K(j,B=8000){if(!j||j.length<=B)return j;let q=j.slice(0,B),D=q.lastIndexOf(" ");return D>0?`${q.slice(0,D)}...`:`${q}...`}export{K as truncateContent,J as trimContentHeadTail};
9
+ `;
10
+ const budget = maxChars - marker.length;
11
+ const headSize = Math.floor(budget * 0.75);
12
+ const tailSize = budget - headSize;
13
+ let headEnd = headSize;
14
+ while (headEnd > headSize - 100 && content[headEnd] !== `
15
+ `) {
16
+ headEnd--;
17
+ }
18
+ if (headEnd <= headSize - 100)
19
+ headEnd = headSize;
20
+ let tailStart = content.length - tailSize;
21
+ while (tailStart < content.length - tailSize + 100 && content[tailStart] !== `
22
+ `) {
23
+ tailStart++;
24
+ }
25
+ if (tailStart >= content.length - tailSize + 100)
26
+ tailStart = content.length - tailSize;
27
+ const head = content.slice(0, headEnd).trimEnd();
28
+ const tail = content.slice(tailStart).trimStart();
29
+ return `${head}${marker}${tail}`;
30
+ }
31
+ export function truncateContent(content, maxChars = 8000) {
32
+ if (!content || content.length <= maxChars) {
33
+ return content;
34
+ }
35
+ const truncated = content.slice(0, maxChars);
36
+ const lastSpace = truncated.lastIndexOf(" ");
37
+ return lastSpace > 0 ? `${truncated.slice(0, lastSpace)}...` : `${truncated}...`;
38
+ }
@@ -1 +1,22 @@
1
- function f(b){return{bing:"Bing Copilot",google:"Google AI",gemini:"Gemini",copilot:"Copilot",perplexity:"Perplexity"}[b]??b.charAt(0).toUpperCase()+b.slice(1)}function j(b){if(!b)return"";if(b==="official-docs")return"official docs";return b.replace(/-/g," ")}function k(b){if(!b)return"Mixed";return b.charAt(0).toUpperCase()+b.slice(1)}export{j as humanizeSourceType,f as formatEngineName,k as formatAgreementLevel};
1
+ export function formatEngineName(engine) {
2
+ const displayNames = {
3
+ bing: "Bing Copilot",
4
+ google: "Google AI",
5
+ gemini: "Gemini",
6
+ copilot: "Copilot",
7
+ perplexity: "Perplexity"
8
+ };
9
+ return displayNames[engine] ?? engine.charAt(0).toUpperCase() + engine.slice(1);
10
+ }
11
+ export function humanizeSourceType(sourceType) {
12
+ if (!sourceType)
13
+ return "";
14
+ if (sourceType === "official-docs")
15
+ return "official docs";
16
+ return sourceType.replace(/-/g, " ");
17
+ }
18
+ export function formatAgreementLevel(level) {
19
+ if (!level)
20
+ return "Mixed";
21
+ return level.charAt(0).toUpperCase() + level.slice(1);
22
+ }
@@ -1 +1,10 @@
1
- import{basename as B}from"node:path";function E(k=process.env,q=process.execPath){let w=k.GREEDY_SEARCH_NODE||k.NODE_BINARY||k.NODE;if(w?.trim())return w.trim();let z=B(q||"").toLowerCase();if(z==="node"||z==="node.exe")return q;return"node"}export{E as nodeRuntimeCommand};
1
+ import { basename } from "node:path";
2
+ export function nodeRuntimeCommand(env = process.env, execPath = process.execPath) {
3
+ const configured = env.GREEDY_SEARCH_NODE || env.NODE_BINARY || env.NODE;
4
+ if (configured?.trim())
5
+ return configured.trim();
6
+ const name = basename(execPath || "").toLowerCase();
7
+ if (name === "node" || name === "node.exe")
8
+ return execPath;
9
+ return "node";
10
+ }
@@ -1 +1,61 @@
1
- import{execSync as K}from"node:child_process";import{existsSync as G}from"node:fs";import{platform as I}from"node:os";import{join as q}from"node:path";function V(z){let D=I()==="win32",g=process.env.SystemRoot||"C:\\Windows",F={win32:{powershell:q(g,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:q(g,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:q(g,"System32","netstat.exe"),taskkill:q(g,"System32","taskkill.exe"),tasklist:q(g,"System32","tasklist.exe"),cmd:q(g,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},B=D?F.win32:F.unix,C=z.toLowerCase();if(B[C]&&G(B[C]))return B[C];if(D&&C==="netstat"){let J=q(g,"Sysnative","netstat.exe");if(G(J))return J}return z}function X(){let z=process.env.PATH||"";if(!z)return!0;let D=z.split(I()==="win32"?";":":");for(let g of D){if(!g)continue;try{if(!G(g))continue;if(I()!=="win32"){let B=K(`stat -c '%a' "${g}" 2>/dev/null || echo 755`,{encoding:"utf8",timeout:1000}).trim();if(Number.parseInt(B,8)&2)return!1}}catch{}}return!0}export{V as resolveSystemCmd,X as isPathSafe};
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { platform } from "node:os";
4
+ import { join } from "node:path";
5
+ export function resolveSystemCmd(cmd) {
6
+ const isWin = platform() === "win32";
7
+ const systemRoot = process.env.SystemRoot || "C:\\Windows";
8
+ const knownPaths = {
9
+ win32: {
10
+ powershell: join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe"),
11
+ powershell_ise: join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell_ise.exe"),
12
+ netstat: join(systemRoot, "System32", "netstat.exe"),
13
+ taskkill: join(systemRoot, "System32", "taskkill.exe"),
14
+ tasklist: join(systemRoot, "System32", "tasklist.exe"),
15
+ cmd: join(systemRoot, "System32", "cmd.exe")
16
+ },
17
+ unix: {
18
+ ps: "/usr/bin/ps",
19
+ lsof: "/usr/bin/lsof",
20
+ ss: "/usr/sbin/ss",
21
+ grep: "/usr/bin/grep",
22
+ kill: "/usr/bin/kill"
23
+ }
24
+ };
25
+ const paths = isWin ? knownPaths.win32 : knownPaths.unix;
26
+ const lower = cmd.toLowerCase();
27
+ if (paths[lower] && existsSync(paths[lower])) {
28
+ return paths[lower];
29
+ }
30
+ if (isWin && lower === "netstat") {
31
+ const altPath = join(systemRoot, "Sysnative", "netstat.exe");
32
+ if (existsSync(altPath))
33
+ return altPath;
34
+ }
35
+ return cmd;
36
+ }
37
+ export function isPathSafe() {
38
+ const pathEnv = process.env.PATH || "";
39
+ if (!pathEnv)
40
+ return true;
41
+ const dirs = pathEnv.split(platform() === "win32" ? ";" : ":");
42
+ for (const dir of dirs) {
43
+ if (!dir)
44
+ continue;
45
+ try {
46
+ const stat = existsSync(dir);
47
+ if (!stat)
48
+ continue;
49
+ if (platform() !== "win32") {
50
+ const mode = execSync(`stat -c '%a' "${dir}" 2>/dev/null || echo 755`, {
51
+ encoding: "utf8",
52
+ timeout: 1000
53
+ }).trim();
54
+ const perms = Number.parseInt(mode, 8);
55
+ if (perms & 2)
56
+ return false;
57
+ }
58
+ } catch {}
59
+ }
60
+ return true;
61
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckmind/dm-windows-x64",
3
- "version": "0.60.6",
3
+ "version": "0.60.9",
4
4
  "description": "DuckMind (dm) binary payload for windows x64",
5
5
  "license": "MIT",
6
6
  "os": [