@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,2 +1,30 @@
1
- #!/usr/bin/env node
2
- import{spawn as a}from"node:child_process";import{fileURLToPath as e}from"node:url";import{basename as c}from"node:path";function u(s=process.env,i=process.execPath){let o=s.GREEDY_SEARCH_NODE||s.NODE_BINARY||s.NODE;if(o?.trim())return o.trim();let r=c(i||"").toLowerCase();if(r==="node"||r==="node.exe")return i;return"node"}var m=process.argv[2]||"status",n=e(new URL("./launch.mjs",import.meta.url)),p={"launch-headless":{args:[],visible:!1},"launch-visible":{args:[],visible:!0},kill:{args:["--kill"],visible:null},status:{args:["--status"],visible:null}},l=p[m];if(!l)console.error("Usage: gschrome.mjs launch-headless|launch-visible|kill|status"),process.exit(2);var t={...process.env};if(l.visible===!0)t.GREEDY_SEARCH_VISIBLE="1";if(l.visible===!1)delete t.GREEDY_SEARCH_VISIBLE;var E=a(u(),[n,...l.args],{stdio:"inherit",env:t});E.on("exit",(s,i)=>{if(i)process.kill(process.pid,i);process.exit(s??1)});
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { nodeRuntimeCommand } from "../src/utils/node-runtime.mjs";
4
+ const command = process.argv[2] || "status";
5
+ const launch = fileURLToPath(new URL("./launch.mjs", import.meta.url));
6
+ const map = {
7
+ "launch-headless": { args: [], visible: false },
8
+ "launch-visible": { args: [], visible: true },
9
+ kill: { args: ["--kill"], visible: null },
10
+ status: { args: ["--status"], visible: null }
11
+ };
12
+ const selected = map[command];
13
+ if (!selected) {
14
+ console.error("Usage: gschrome.mjs launch-headless|launch-visible|kill|status");
15
+ process.exit(2);
16
+ }
17
+ const env = { ...process.env };
18
+ if (selected.visible === true)
19
+ env.GREEDY_SEARCH_VISIBLE = "1";
20
+ if (selected.visible === false)
21
+ delete env.GREEDY_SEARCH_VISIBLE;
22
+ const proc = spawn(nodeRuntimeCommand(), [launch, ...selected.args], {
23
+ stdio: "inherit",
24
+ env
25
+ });
26
+ proc.on("exit", (code, signal) => {
27
+ if (signal)
28
+ process.kill(process.pid, signal);
29
+ process.exit(code ?? 1);
30
+ });
@@ -1,2 +1,7 @@
1
- #!/usr/bin/env node
2
- import{spawn as J}from"node:child_process";import{basename as H}from"node:path";function F(k=process.env,q=process.execPath){let z=k.GREEDY_SEARCH_NODE||k.NODE_BINARY||k.NODE;if(z?.trim())return z.trim();let E=H(q||"").toLowerCase();if(E==="node"||E==="node.exe")return q;return"node"}var K=new URL("./launch-visible.mjs",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),L=J(F(),[K,"--kill"],{stdio:"inherit"});L.on("close",(k)=>process.exit(k??0));
1
+ import { spawn } from "node:child_process";
2
+ import { nodeRuntimeCommand } from "../src/utils/node-runtime.mjs";
3
+ const launchVisibleBin = new URL("./launch-visible.mjs", import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1");
4
+ const proc = spawn(nodeRuntimeCommand(), [launchVisibleBin, "--kill"], {
5
+ stdio: "inherit"
6
+ });
7
+ proc.on("close", (code) => process.exit(code ?? 0));
@@ -1,2 +1,13 @@
1
- #!/usr/bin/env node
2
- import{spawn as m}from"node:child_process";import{fileURLToPath as E}from"node:url";import{basename as t}from"node:path";function s(o=process.env,i=process.execPath){let p=o.GREEDY_SEARCH_NODE||o.NODE_BINARY||o.NODE;if(p?.trim())return p.trim();let r=t(i||"").toLowerCase();if(r==="node"||r==="node.exe")return i;return"node"}var R=E(new URL("./launch.mjs",import.meta.url)),L=m(s(),[R,...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,GREEDY_SEARCH_VISIBLE:"1"}});L.on("exit",(o,i)=>{if(i)process.kill(process.pid,i);process.exit(o??1)});
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { nodeRuntimeCommand } from "../src/utils/node-runtime.mjs";
4
+ const launch = fileURLToPath(new URL("./launch.mjs", import.meta.url));
5
+ const proc = spawn(nodeRuntimeCommand(), [launch, ...process.argv.slice(2)], {
6
+ stdio: "inherit",
7
+ env: { ...process.env, GREEDY_SEARCH_VISIBLE: "1" }
8
+ });
9
+ proc.on("exit", (code, signal) => {
10
+ if (signal)
11
+ process.kill(process.pid, signal);
12
+ process.exit(code ?? 1);
13
+ });
@@ -1,10 +1,282 @@
1
- #!/usr/bin/env node
2
- import{execFileSync as T,execSync as zt,spawn as gt}from"node:child_process";import{existsSync as o,mkdirSync as xt,readdirSync as jt,readFileSync as _,unlinkSync as U,writeFileSync as A}from"node:fs";import{platform as c,tmpdir as Wu}from"node:os";import{join as kt}from"node:path";import E from"node:http";function x(t,u=1000){return new Promise((f)=>{let $=E.get(t,(b)=>{let J="";b.on("data",(q)=>J+=q),b.on("end",()=>f({ok:b.statusCode===200,body:J}))});$.on("error",()=>f({ok:!1})),$.setTimeout(u,()=>{$.destroy(),f({ok:!1})})})}async function p(t){try{let u=await x(`http://localhost:${t}/json/version`);if(!u.ok)return;let f=JSON.parse(u.body),$=await x(`http://localhost:${t}/json/list`);if(!$.ok)return;let J=JSON.parse($.body).find((h)=>h.type==="page")?.id;if(!J)return;let q=f.webSocketDebuggerUrl;if(typeof q!=="string")return;let g=new URL(q);if(g.hostname!=="localhost"&&g.hostname!=="127.0.0.1")return;if(!/^ws:\/\/localhost:\d+/.test(`ws://${g.host}`))return;let n=new WebSocket(`ws://localhost:${t}${g.pathname}`);await new Promise((h)=>{let a=!1,I=setTimeout(()=>V(),5000),V=()=>{if(a)return;a=!0,clearTimeout(I);try{n.close()}catch{}h()};n.onopen=()=>{try{n.send(JSON.stringify({id:1,method:"Browser.getWindowForTarget",params:{targetId:J}}))}catch{V()}},n.onmessage=(i)=>{try{let w=JSON.parse(i.data);if(w.id===1&&w.result?.windowId)n.send(JSON.stringify({id:2,method:"Browser.setWindowBounds",params:{windowId:w.result.windowId,bounds:{windowState:"minimized"}}}));else if(w.id===2)V();else if(w.id===1)V()}catch{V()}},n.onerror=V})}catch{}}import{existsSync as j,mkdirSync as tt,readFileSync as y,writeFileSync as ut}from"node:fs";import{homedir as ft}from"node:os";import{join as m}from"node:path";import{tmpdir as $t}from"node:os";function bt(t,u=9222){let f=Number.parseInt(String(t??""),10);return Number.isInteger(f)&&f>1024&&f<65535?f:u}var Jt=$t().replaceAll("\\","/"),G=bt(process.env.GREEDY_SEARCH_PORT),W=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${Jt}/greedysearch-chrome-profile`).replaceAll("\\","/"),S=`${W}/DevToolsActivePort`,L=process.env.GREEDY_SEARCH_PID_FILE||`${W}/browser.pid`,mt=process.env.CDP_PAGES_CACHE||`${W}/cdp-pages.json`,O=process.env.GREEDY_SEARCH_MODE_FILE||`${W}/browser-mode`,Gt=process.env.GREEDY_SEARCH_METADATA_FILE||`${W}/browser-metadata.json`,St=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${W}/browser-launch.lock`,Lt=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${W}/browser-last-activity`,Ot=(process.env.CDP_SOCKET_DIR||`${W}/cdp-sockets`).replaceAll("\\","/"),Dt=`${W}/visible-recovery.jsonl`,r=m(ft(),".dm"),K=m(r,"greedyconfig"),Y=["perplexity","google","chatgpt","gemini"],N="gemini";function Wt(){try{if(j(K)){let t=y(K,"utf8"),u=JSON.parse(t);if(Array.isArray(u.engines)&&u.engines.length>0&&u.engines.every((f)=>typeof f==="string")){let f=u.engines.filter((b)=>M[b]),$=u.engines.filter((b)=>!M[b]);if($.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${K}: ${$.join(", ")}
3
- [greedysearch] Available engines: ${Object.keys(M).join(", ")}
4
- `);if(f.length>0)return f;process.stderr.write(`[greedysearch] Warning: no valid engines in ${K}, falling back to defaults: ${Y.join(", ")}
5
- `)}}}catch{}return Y}function qt(){try{if(!j(r))tt(r,{recursive:!0});if(!j(K))ut(K,JSON.stringify({engines:Y,synthesizer:N},null,2)+`
6
- `,"utf8")}catch{}}qt();var l=["gemini","chatgpt"];function Qt(){try{if(j(K)){let t=y(K,"utf8"),u=JSON.parse(t);if(typeof u.synthesizer==="string"){let f=u.synthesizer.toLowerCase();if(l.includes(f))return f;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${u.synthesizer}" in ${K}
7
- [greedysearch] Available synthesizers: ${l.join(", ")}
8
- [greedysearch] Falling back to default: ${N}
9
- `)}}}catch{}return N}var M={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"},et=Wt();var Pt=Qt(),Ft=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=W;import{execFileSync as Bt}from"node:child_process";import{platform as Xt}from"node:os";import{existsSync as D}from"node:fs";import{platform as Kt}from"node:os";import{join as B}from"node:path";function Z(t){let u=Kt()==="win32",f=process.env.SystemRoot||"C:\\Windows",$={win32:{powershell:B(f,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:B(f,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:B(f,"System32","netstat.exe"),taskkill:B(f,"System32","taskkill.exe"),tasklist:B(f,"System32","tasklist.exe"),cmd:B(f,"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=u?$.win32:$.unix,J=t.toLowerCase();if(b[J]&&D(b[J]))return b[J];if(u&&J==="netstat"){let q=B(f,"Sysnative","netstat.exe");if(D(q))return q}return t}function nt(t,u){return Bt(Z(t),u,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function Vt(t){let u=String(t||"").match(/\b(\d+)\b/);return u?Number.parseInt(u[1],10):null}function Zt(t){return Vt(t)}function Ut(t,u){for(let f of String(t||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test(f))continue;if(!f.trim().split(/\s+/).slice(0,6).some((J)=>J.endsWith(`:${u}`)))continue;let b=f.match(/\bpid=(\d+)\b/);if(b)return Number.parseInt(b[1],10)}return null}function wt(t,u){for(let f of String(t||"").split(/\r?\n/)){let $=f.trim().split(/\s+/);if($.length<5||$[0].toUpperCase()!=="TCP")continue;if(!$.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!$[1].endsWith(`:${u}`))continue;let b=Number.parseInt($.at(-1),10);if(Number.isInteger(b)&&b>0)return b}return null}function C(t,u,f){try{return t(u,f)}catch{return null}}function e(t,{platformName:u=Xt(),run:f=nt}={}){if(u==="win32")return wt(C(f,"netstat",["-ano","-p","TCP"]),t);let $=C(f,"lsof",["-nP",`-iTCP:${t}`,"-sTCP:LISTEN","-t"]),b=Zt($);if(b)return b;if(u!=="linux")return null;return Ut(C(f,"ss",["-ltnp"]),t)}var Q=G,s=W,d=S,X=L,z=O;function vt(){let t=c();return(t==="win32"?["C:/Program Files/Google/Chrome/Application/chrome.exe","C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"]:t==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium"]:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium-browser","/usr/bin/chromium","/snap/bin/chromium"]).find(o)||null}var k=()=>process.env.GREEDY_SEARCH_VISIBLE!=="1",At=[`--remote-debugging-port=${Q}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled",`--user-data-dir=${s}`,"--profile-directory=Default","--window-size=1920,1080","--lang=en-US","--force-color-profile=srgb","--disable-background-timer-throttling","--disable-renderer-backgrounding","--disable-backgrounding-occluded-windows"];function Ht(t){try{let u=kt(t,".."),$=jt(u).find((b)=>/^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(b));if($)return $.split(".")[0]}catch{}try{let f=zt(`"${t}" --version`,{encoding:"utf8",timeout:5000}).trim().match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);if(f)return f[1]}catch{}return null}function ht(t){let u=[...At];if(k()){u.push("--headless=new");let f=Ht(t)||"136";u.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${f}.0.0.0 Safari/537.36`)}return u.push("about:blank"),u}var Mt=()=>process.env.GREEDY_SEARCH_VISIBLE==="1";function rt(){try{if(!o(z))return!0;return _(z,"utf8").trim()==="headless"}catch{return!0}}function Yt(t){try{if(c()==="win32")return T(Z("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${t}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return T(Z("ps"),["-p",String(t),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Nt(t,u=s,f=Q){let $=String(t||"").replaceAll("\\","/"),b=String(u||"").replaceAll("\\","/");return $.includes(`--remote-debugging-port=${f}`)&&$.includes(`--user-data-dir=${b}`)&&!$.includes("--type=")}function H(t){if(!Number.isInteger(t)||t<=0)return!1;try{process.kill(t,0)}catch{return!1}return Nt(Yt(t))}function v(){if(!o(X))return!1;let t=Number.parseInt(_(X,"utf8").trim(),10);return H(t)?t:!1}function R(t){return e(t)}function Ct(){let t=R(Q);return H(t)?t:null}function P(t){if(!H(t))return!1;try{if(c()==="win32")T(Z("taskkill"),["/F","/T","/PID",String(t)],{stdio:"ignore",windowsHide:!0});else process.kill(t,"SIGTERM");return!0}catch{return!1}}function Tt(){let t=R(Q);if(!t)return!0;let u=v();if(u&&t===u)return!0;if(H(t))return A(X,String(t),"utf8"),!0;return console.error(`Browser/CDP port ${Q} is owned by unverified pid ${t}; refusing to kill it. Set GREEDY_SEARCH_PORT to a free port.`),!1}async function F(t=15000){let u=Date.now()+t;while(Date.now()<u){let{ok:f,body:$}=await x(`http://localhost:${Q}/json/version`,1500);if(f)try{let{webSocketDebuggerUrl:b}=JSON.parse($),J=new URL(b).pathname;return A(d,`${Q}
10
- ${J}`,"utf8"),!0}catch{}await new Promise((b)=>setTimeout(b,400))}return!1}async function ot(){let t=process.argv[2];if(!Tt()){process.exitCode=1;return}if(t==="--kill"){let J=v()||Ct();if(J){let q=P(J);console.log(q?`Stopped Chrome (pid ${J}).`:`Failed to stop pid ${J}.`)}else console.log("GreedySearch Chrome is not running.");try{U(X)}catch{}try{U(d)}catch{}try{U(z)}catch{}return}if(t==="--status"){let J=v();if(J)console.log(`Running — pid ${J}, port ${Q}`);else console.log("Not running.");return}let u=v();if(u)if(process.env.GREEDY_SEARCH_VISIBLE==="1"&&!process.argv.includes("--headless")&&rt()){console.log(`Headless Chrome running (pid ${u}) but visible requested — killing...`),P(u);try{U(X)}catch{}try{U(z)}catch{}}else{if(await F(5000)){console.log(`GreedySearch Chrome already running (pid ${u}).`);return}console.log(`Stale PID ${u} — launching fresh.`);try{U(X)}catch{}}let f=process.env.CHROME_PATH||vt();if(!f)console.error("Chrome not found. Set CHROME_PATH env var."),process.exit(1);if(xt(s,{recursive:!0}),console.log(`Launching GreedySearch Chrome on port ${Q}...`),k())console.log("Headless mode — no window will be shown");else if(!Mt())console.log("Window will be minimized");let $=gt(f,ht(f),{detached:!0,stdio:"ignore"});if($.unref(),A(X,String($.pid)),A(z,k()?"headless":"visible","utf8"),!await F())console.error("Chrome did not become ready within 15s."),process.exit(1);if(k())console.log("Ready (headless).");else await p(Q),console.log("Ready.")}ot();export{Nt as commandLineMatchesGreedyBrowser};
1
+ import { execFileSync, execSync, spawn } from "node:child_process";
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ readdirSync,
6
+ readFileSync,
7
+ unlinkSync,
8
+ writeFileSync
9
+ } from "node:fs";
10
+ import { platform, tmpdir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { httpGet, minimizeViaCDP } from "../src/search/minimize.mjs";
13
+ import {
14
+ ACTIVE_PORT_FILE,
15
+ CHROME_MODE_FILE,
16
+ GREEDY_PID_FILE,
17
+ GREEDY_PORT,
18
+ GREEDY_PROFILE_DIR
19
+ } from "../src/search/constants.mjs";
20
+ import { findListeningProcessPid } from "../src/search/port-pid.mjs";
21
+ import { resolveSystemCmd } from "../src/utils/system-cmds.mjs";
22
+ const PORT = GREEDY_PORT;
23
+ const PROFILE_DIR = GREEDY_PROFILE_DIR;
24
+ const ACTIVE_PORT = ACTIVE_PORT_FILE;
25
+ const PID_FILE = GREEDY_PID_FILE;
26
+ const MODE_FILE = CHROME_MODE_FILE;
27
+ function findChrome() {
28
+ const os = platform();
29
+ const candidates = os === "win32" ? [
30
+ "C:/Program Files/Google/Chrome/Application/chrome.exe",
31
+ "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
32
+ ] : os === "darwin" ? [
33
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
34
+ "/Applications/Chromium.app/Contents/MacOS/Chromium"
35
+ ] : [
36
+ "/usr/bin/google-chrome",
37
+ "/usr/bin/google-chrome-stable",
38
+ "/usr/bin/chromium-browser",
39
+ "/usr/bin/chromium",
40
+ "/snap/bin/chromium"
41
+ ];
42
+ return candidates.find(existsSync) || null;
43
+ }
44
+ const isHeadless = () => process.env.GREEDY_SEARCH_VISIBLE !== "1";
45
+ const BASE_CHROME_FLAGS = [
46
+ `--remote-debugging-port=${PORT}`,
47
+ "--disable-features=DevToolsPrivacyUI",
48
+ "--no-first-run",
49
+ "--no-default-browser-check",
50
+ "--disable-default-apps",
51
+ "--disable-blink-features=AutomationControlled",
52
+ `--user-data-dir=${PROFILE_DIR}`,
53
+ "--profile-directory=Default",
54
+ "--window-size=1920,1080",
55
+ "--lang=en-US",
56
+ "--force-color-profile=srgb",
57
+ "--disable-background-timer-throttling",
58
+ "--disable-renderer-backgrounding",
59
+ "--disable-backgrounding-occluded-windows"
60
+ ];
61
+ function getChromeVersion(chromePath) {
62
+ try {
63
+ const appDir = join(chromePath, "..");
64
+ const entries = readdirSync(appDir);
65
+ const ver = entries.find((e) => /^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(e));
66
+ if (ver)
67
+ return ver.split(".")[0];
68
+ } catch {}
69
+ try {
70
+ const out = execSync(`"${chromePath}" --version`, {
71
+ encoding: "utf8",
72
+ timeout: 5000
73
+ }).trim();
74
+ const m = out.match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);
75
+ if (m)
76
+ return m[1];
77
+ } catch {}
78
+ return null;
79
+ }
80
+ function buildChromeFlags(chromePath) {
81
+ const flags = [...BASE_CHROME_FLAGS];
82
+ if (isHeadless()) {
83
+ flags.push("--headless=new");
84
+ const major = getChromeVersion(chromePath) || "136";
85
+ flags.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${major}.0.0.0 Safari/537.36`);
86
+ }
87
+ flags.push("about:blank");
88
+ return flags;
89
+ }
90
+ const isVisible = () => process.env.GREEDY_SEARCH_VISIBLE === "1";
91
+ function isModeFileHeadless() {
92
+ try {
93
+ if (!existsSync(MODE_FILE))
94
+ return true;
95
+ return readFileSync(MODE_FILE, "utf8").trim() === "headless";
96
+ } catch {
97
+ return true;
98
+ }
99
+ }
100
+ function getProcessCommandLine(pid) {
101
+ try {
102
+ if (platform() === "win32") {
103
+ const output = execFileSync(resolveSystemCmd("powershell"), [
104
+ "-NoProfile",
105
+ "-NonInteractive",
106
+ "-Command",
107
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`
108
+ ], { encoding: "utf8", windowsHide: true, timeout: 5000 });
109
+ return output.trim() || null;
110
+ }
111
+ const output = execFileSync(resolveSystemCmd("ps"), ["-p", String(pid), "-o", "command="], { encoding: "utf8", timeout: 5000 });
112
+ return output.trim() || null;
113
+ } catch {
114
+ return null;
115
+ }
116
+ }
117
+ export function commandLineMatchesGreedyBrowser(commandLine, profileDir = PROFILE_DIR, port = PORT) {
118
+ const normalized = String(commandLine || "").replaceAll("\\", "/");
119
+ const normalizedProfile = String(profileDir || "").replaceAll("\\", "/");
120
+ return normalized.includes(`--remote-debugging-port=${port}`) && normalized.includes(`--user-data-dir=${normalizedProfile}`) && !normalized.includes("--type=");
121
+ }
122
+ function isOwnedBrowserPid(pid) {
123
+ if (!Number.isInteger(pid) || pid <= 0)
124
+ return false;
125
+ try {
126
+ process.kill(pid, 0);
127
+ } catch {
128
+ return false;
129
+ }
130
+ return commandLineMatchesGreedyBrowser(getProcessCommandLine(pid));
131
+ }
132
+ function isRunning() {
133
+ if (!existsSync(PID_FILE))
134
+ return false;
135
+ const pid = Number.parseInt(readFileSync(PID_FILE, "utf8").trim(), 10);
136
+ return isOwnedBrowserPid(pid) ? pid : false;
137
+ }
138
+ function getPortPid(port) {
139
+ return findListeningProcessPid(port);
140
+ }
141
+ function getOwnedPortPid() {
142
+ const pid = getPortPid(PORT);
143
+ return isOwnedBrowserPid(pid) ? pid : null;
144
+ }
145
+ function killProcess(pid) {
146
+ if (!isOwnedBrowserPid(pid))
147
+ return false;
148
+ try {
149
+ if (platform() === "win32") {
150
+ execFileSync(resolveSystemCmd("taskkill"), ["/F", "/T", "/PID", String(pid)], {
151
+ stdio: "ignore",
152
+ windowsHide: true
153
+ });
154
+ } else {
155
+ process.kill(pid, "SIGTERM");
156
+ }
157
+ return true;
158
+ } catch {
159
+ return false;
160
+ }
161
+ }
162
+ function cleanupGhostChrome() {
163
+ const portPid = getPortPid(PORT);
164
+ if (!portPid)
165
+ return true;
166
+ const trackedPid = isRunning();
167
+ if (trackedPid && portPid === trackedPid)
168
+ return true;
169
+ if (isOwnedBrowserPid(portPid)) {
170
+ writeFileSync(PID_FILE, String(portPid), "utf8");
171
+ return true;
172
+ }
173
+ console.error(`Browser/CDP port ${PORT} is owned by unverified pid ${portPid}; ` + "refusing to kill it. Set GREEDY_SEARCH_PORT to a free port.");
174
+ return false;
175
+ }
176
+ async function writePortFile(timeoutMs = 15000) {
177
+ const deadline = Date.now() + timeoutMs;
178
+ while (Date.now() < deadline) {
179
+ const { ok, body } = await httpGet(`http://localhost:${PORT}/json/version`, 1500);
180
+ if (ok) {
181
+ try {
182
+ const { webSocketDebuggerUrl } = JSON.parse(body);
183
+ const wsPath = new URL(webSocketDebuggerUrl).pathname;
184
+ writeFileSync(ACTIVE_PORT, `${PORT}
185
+ ${wsPath}`, "utf8");
186
+ return true;
187
+ } catch {}
188
+ }
189
+ await new Promise((r) => setTimeout(r, 400));
190
+ }
191
+ return false;
192
+ }
193
+ async function main() {
194
+ const arg = process.argv[2];
195
+ if (!cleanupGhostChrome()) {
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ if (arg === "--kill") {
200
+ const pid = isRunning() || getOwnedPortPid();
201
+ if (pid) {
202
+ const ok = killProcess(pid);
203
+ console.log(ok ? `Stopped Chrome (pid ${pid}).` : `Failed to stop pid ${pid}.`);
204
+ } else {
205
+ console.log("GreedySearch Chrome is not running.");
206
+ }
207
+ try {
208
+ unlinkSync(PID_FILE);
209
+ } catch {}
210
+ try {
211
+ unlinkSync(ACTIVE_PORT);
212
+ } catch {}
213
+ try {
214
+ unlinkSync(MODE_FILE);
215
+ } catch {}
216
+ return;
217
+ }
218
+ if (arg === "--status") {
219
+ const pid = isRunning();
220
+ if (pid) {
221
+ console.log(`Running — pid ${pid}, port ${PORT}`);
222
+ } else {
223
+ console.log("Not running.");
224
+ }
225
+ return;
226
+ }
227
+ const existing = isRunning();
228
+ if (existing) {
229
+ const isWantingVisible = process.env.GREEDY_SEARCH_VISIBLE === "1" && !process.argv.includes("--headless");
230
+ if (isWantingVisible && isModeFileHeadless()) {
231
+ console.log(`Headless Chrome running (pid ${existing}) but visible requested — killing...`);
232
+ killProcess(existing);
233
+ try {
234
+ unlinkSync(PID_FILE);
235
+ } catch {}
236
+ try {
237
+ unlinkSync(MODE_FILE);
238
+ } catch {}
239
+ } else {
240
+ const ready = await writePortFile(5000);
241
+ if (ready) {
242
+ console.log(`GreedySearch Chrome already running (pid ${existing}).`);
243
+ return;
244
+ }
245
+ console.log(`Stale PID ${existing} — launching fresh.`);
246
+ try {
247
+ unlinkSync(PID_FILE);
248
+ } catch {}
249
+ }
250
+ }
251
+ const CHROME_EXE = process.env.CHROME_PATH || findChrome();
252
+ if (!CHROME_EXE) {
253
+ console.error("Chrome not found. Set CHROME_PATH env var.");
254
+ process.exit(1);
255
+ }
256
+ mkdirSync(PROFILE_DIR, { recursive: true });
257
+ console.log(`Launching GreedySearch Chrome on port ${PORT}...`);
258
+ if (isHeadless()) {
259
+ console.log("Headless mode — no window will be shown");
260
+ } else if (!isVisible()) {
261
+ console.log("Window will be minimized");
262
+ }
263
+ const proc = spawn(CHROME_EXE, buildChromeFlags(CHROME_EXE), {
264
+ detached: true,
265
+ stdio: "ignore"
266
+ });
267
+ proc.unref();
268
+ writeFileSync(PID_FILE, String(proc.pid));
269
+ writeFileSync(MODE_FILE, isHeadless() ? "headless" : "visible", "utf8");
270
+ const portFileReady = await writePortFile();
271
+ if (!portFileReady) {
272
+ console.error("Chrome did not become ready within 15s.");
273
+ process.exit(1);
274
+ }
275
+ if (isHeadless()) {
276
+ console.log("Ready (headless).");
277
+ } else {
278
+ await minimizeViaCDP(PORT);
279
+ console.log("Ready.");
280
+ }
281
+ }
282
+ main();