@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,8 +1,109 @@
1
- import{existsSync as V,mkdirSync as u,readFileSync as w,writeFileSync as x}from"node:fs";import{homedir as H}from"node:os";import{join as z}from"node:path";import{tmpdir as Z}from"node:os";function h(Q,B=9222){let q=Number.parseInt(String(Q??""),10);return Number.isInteger(q)&&q>1024&&q<65535?q:B}var m=Z().replaceAll("\\","/"),T=h(process.env.GREEDY_SEARCH_PORT),J=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${m}/greedysearch-chrome-profile`).replaceAll("\\","/"),Y=`${J}/DevToolsActivePort`,P=process.env.GREEDY_SEARCH_PID_FILE||`${J}/browser.pid`,t=process.env.CDP_PAGES_CACHE||`${J}/cdp-pages.json`,d=process.env.GREEDY_SEARCH_MODE_FILE||`${J}/browser-mode`,s=process.env.GREEDY_SEARCH_METADATA_FILE||`${J}/browser-metadata.json`,c=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${J}/browser-launch.lock`,l=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${J}/browser-last-activity`,a=(process.env.CDP_SOCKET_DIR||`${J}/cdp-sockets`).replaceAll("\\","/"),O=`${J}/visible-recovery.jsonl`,$=z(H(),".dm"),K=z($,"greedyconfig"),M=["perplexity","google","chatgpt","gemini"],b="gemini";function v(){try{if(V(K)){let Q=w(K,"utf8"),B=JSON.parse(Q);if(Array.isArray(B.engines)&&B.engines.length>0&&B.engines.every((q)=>typeof q==="string")){let q=B.engines.filter((W)=>X[W]),j=B.engines.filter((W)=>!X[W]);if(j.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${K}: ${j.join(", ")}
2
- [greedysearch] Available engines: ${Object.keys(X).join(", ")}
3
- `);if(q.length>0)return q;process.stderr.write(`[greedysearch] Warning: no valid engines in ${K}, falling back to defaults: ${M.join(", ")}
4
- `)}}}catch{}return M}function A(){try{if(!V($))u($,{recursive:!0});if(!V(K))x(K,JSON.stringify({engines:M,synthesizer:b},null,2)+`
5
- `,"utf8")}catch{}}A();var k=["gemini","chatgpt"];function g(){try{if(V(K)){let Q=w(K,"utf8"),B=JSON.parse(Q);if(typeof B.synthesizer==="string"){let q=B.synthesizer.toLowerCase();if(k.includes(q))return q;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${B.synthesizer}" in ${K}
6
- [greedysearch] Available synthesizers: ${k.join(", ")}
7
- [greedysearch] Falling back to default: ${b}
8
- `)}}}catch{}return b}var L={perplexity:"perplexity.ai",bing:"copilot.microsoft.com",google:"google.com",gemini:"gemini.google.com",chatgpt:"chatgpt.com","semantic-scholar":"semanticscholar.org",semanticscholar:"semanticscholar.org",s2:"semanticscholar.org",logically:"logically.app"},X={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"},p=v(),r=p,n=g(),N=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=J;export{h as parseGreedySearchPort,O as VISIBLE_RECOVERY_LOG,n as SYNTHESIZER,k as SUPPORTED_SYNTHESIZERS,N as SOURCE_FETCH_CONCURRENCY,r as RESEARCH_ENGINES,t as PAGES_CACHE,J as GREEDY_PROFILE_DIR,T as GREEDY_PORT,P as GREEDY_PID_FILE,s as GREEDY_METADATA_FILE,c as GREEDY_LAUNCH_LOCK_FILE,a as GREEDY_CDP_SOCKET_DIR,l as GREEDY_ACTIVITY_FILE,L as ENGINE_DOMAINS,X as ENGINES,b as DEFAULT_SYNTHESIZER,M as DEFAULT_ENGINES,d as CHROME_MODE_FILE,p as ALL_ENGINES,Y as ACTIVE_PORT_FILE};
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ export function parseGreedySearchPort(value, fallback = 9222) {
6
+ const port = Number.parseInt(String(value ?? ""), 10);
7
+ return Number.isInteger(port) && port > 1024 && port < 65535 ? port : fallback;
8
+ }
9
+ const GREEDY_TMP = tmpdir().replaceAll("\\", "/");
10
+ export const GREEDY_PORT = parseGreedySearchPort(process.env.GREEDY_SEARCH_PORT);
11
+ export const GREEDY_PROFILE_DIR = (process.env.GREEDY_SEARCH_PROFILE_DIR || process.env.CDP_PROFILE_DIR || `${GREEDY_TMP}/greedysearch-chrome-profile`).replaceAll("\\", "/");
12
+ export const ACTIVE_PORT_FILE = `${GREEDY_PROFILE_DIR}/DevToolsActivePort`;
13
+ export const GREEDY_PID_FILE = process.env.GREEDY_SEARCH_PID_FILE || `${GREEDY_PROFILE_DIR}/browser.pid`;
14
+ export const PAGES_CACHE = process.env.CDP_PAGES_CACHE || `${GREEDY_PROFILE_DIR}/cdp-pages.json`;
15
+ export const CHROME_MODE_FILE = process.env.GREEDY_SEARCH_MODE_FILE || `${GREEDY_PROFILE_DIR}/browser-mode`;
16
+ export const GREEDY_METADATA_FILE = process.env.GREEDY_SEARCH_METADATA_FILE || `${GREEDY_PROFILE_DIR}/browser-metadata.json`;
17
+ export const GREEDY_LAUNCH_LOCK_FILE = process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE || `${GREEDY_PROFILE_DIR}/browser-launch.lock`;
18
+ export const GREEDY_ACTIVITY_FILE = process.env.GREEDY_SEARCH_ACTIVITY_FILE || `${GREEDY_PROFILE_DIR}/browser-last-activity`;
19
+ export const GREEDY_CDP_SOCKET_DIR = (process.env.CDP_SOCKET_DIR || `${GREEDY_PROFILE_DIR}/cdp-sockets`).replaceAll("\\", "/");
20
+ export const VISIBLE_RECOVERY_LOG = `${GREEDY_PROFILE_DIR}/visible-recovery.jsonl`;
21
+ const CONFIG_DIR = join(homedir(), ".dm");
22
+ const CONFIG_FILE = join(CONFIG_DIR, "greedyconfig");
23
+ export const DEFAULT_ENGINES = ["perplexity", "google", "chatgpt", "gemini"];
24
+ export const DEFAULT_SYNTHESIZER = "gemini";
25
+ function loadUserEngines() {
26
+ try {
27
+ if (existsSync(CONFIG_FILE)) {
28
+ const raw = readFileSync(CONFIG_FILE, "utf8");
29
+ const config = JSON.parse(raw);
30
+ if (Array.isArray(config.engines) && config.engines.length > 0 && config.engines.every((e) => typeof e === "string")) {
31
+ const valid = config.engines.filter((e) => ENGINES[e]);
32
+ const invalid = config.engines.filter((e) => !ENGINES[e]);
33
+ if (invalid.length > 0) {
34
+ process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${CONFIG_FILE}: ${invalid.join(", ")}
35
+ ` + `[greedysearch] Available engines: ${Object.keys(ENGINES).join(", ")}
36
+ `);
37
+ }
38
+ if (valid.length > 0)
39
+ return valid;
40
+ process.stderr.write(`[greedysearch] Warning: no valid engines in ${CONFIG_FILE}, falling back to defaults: ${DEFAULT_ENGINES.join(", ")}
41
+ `);
42
+ }
43
+ }
44
+ } catch {}
45
+ return DEFAULT_ENGINES;
46
+ }
47
+ function ensureDefaultConfig() {
48
+ try {
49
+ if (!existsSync(CONFIG_DIR))
50
+ mkdirSync(CONFIG_DIR, { recursive: true });
51
+ if (!existsSync(CONFIG_FILE)) {
52
+ writeFileSync(CONFIG_FILE, JSON.stringify({ engines: DEFAULT_ENGINES, synthesizer: DEFAULT_SYNTHESIZER }, null, 2) + `
53
+ `, "utf8");
54
+ }
55
+ } catch {}
56
+ }
57
+ ensureDefaultConfig();
58
+ export const SUPPORTED_SYNTHESIZERS = ["gemini", "chatgpt"];
59
+ function loadUserSynthesizer() {
60
+ try {
61
+ if (existsSync(CONFIG_FILE)) {
62
+ const raw = readFileSync(CONFIG_FILE, "utf8");
63
+ const config = JSON.parse(raw);
64
+ if (typeof config.synthesizer === "string") {
65
+ const normalized = config.synthesizer.toLowerCase();
66
+ if (SUPPORTED_SYNTHESIZERS.includes(normalized))
67
+ return normalized;
68
+ process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${config.synthesizer}" in ${CONFIG_FILE}
69
+ ` + `[greedysearch] Available synthesizers: ${SUPPORTED_SYNTHESIZERS.join(", ")}
70
+ ` + `[greedysearch] Falling back to default: ${DEFAULT_SYNTHESIZER}
71
+ `);
72
+ }
73
+ }
74
+ } catch {}
75
+ return DEFAULT_SYNTHESIZER;
76
+ }
77
+ export const ENGINE_DOMAINS = {
78
+ perplexity: "perplexity.ai",
79
+ bing: "copilot.microsoft.com",
80
+ google: "google.com",
81
+ gemini: "gemini.google.com",
82
+ chatgpt: "chatgpt.com",
83
+ "semantic-scholar": "semanticscholar.org",
84
+ semanticscholar: "semanticscholar.org",
85
+ s2: "semanticscholar.org",
86
+ logically: "logically.app"
87
+ };
88
+ export const ENGINES = {
89
+ perplexity: "perplexity.mjs",
90
+ p: "perplexity.mjs",
91
+ bing: "bing-copilot.mjs",
92
+ b: "bing-copilot.mjs",
93
+ google: "google-ai.mjs",
94
+ g: "google-ai.mjs",
95
+ gemini: "gemini.mjs",
96
+ gem: "gemini.mjs",
97
+ chatgpt: "chatgpt.mjs",
98
+ gpt: "chatgpt.mjs",
99
+ "semantic-scholar": "semantic-scholar.mjs",
100
+ semanticscholar: "semantic-scholar.mjs",
101
+ s2: "semantic-scholar.mjs",
102
+ logically: "logically.mjs",
103
+ log: "logically.mjs"
104
+ };
105
+ export const ALL_ENGINES = loadUserEngines();
106
+ export const RESEARCH_ENGINES = ALL_ENGINES;
107
+ export const SYNTHESIZER = loadUserSynthesizer();
108
+ export const SOURCE_FETCH_CONCURRENCY = Math.max(1, Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY || "5", 10) || 5);
109
+ process.env.CDP_PROFILE_DIR = GREEDY_PROFILE_DIR;
@@ -1 +1,10 @@
1
- var b={CDP_TIMEOUT:30000,CDP_TIMEOUT_SHORT:15000,NAV_TIMEOUT:35000,STREAM_TIMEOUT:30000,COPY_TIMEOUT:60000,CODING_TASK_TIMEOUT:180000,MAX_SOURCE_FETCH:10,DESCRIPTION_MAX_LENGTH:300};export{b as DEFAULTS};
1
+ export const DEFAULTS = {
2
+ CDP_TIMEOUT: 30000,
3
+ CDP_TIMEOUT_SHORT: 15000,
4
+ NAV_TIMEOUT: 35000,
5
+ STREAM_TIMEOUT: 30000,
6
+ COPY_TIMEOUT: 60000,
7
+ CODING_TASK_TIMEOUT: 180000,
8
+ MAX_SOURCE_FETCH: 10,
9
+ DESCRIPTION_MAX_LENGTH: 300
10
+ };
@@ -1,9 +1,79 @@
1
- import{spawn as J}from"node:child_process";import{basename as v}from"node:path";function u(n=process.env,e=process.execPath){let s=n.GREEDY_SEARCH_NODE||n.NODE_BINARY||n.NODE;if(s?.trim())return s.trim();let i=v(e||"").toLowerCase();if(i==="node"||i==="node.exe")return e;return"node"}import{existsSync as S,mkdirSync as j,readFileSync as N,writeFileSync as w}from"node:fs";import{homedir as P}from"node:os";import{join as T}from"node:path";import{tmpdir as b}from"node:os";function x(n,e=9222){let s=Number.parseInt(String(n??""),10);return Number.isInteger(s)&&s>1024&&s<65535?s:e}var U=b().replaceAll("\\","/"),sn=x(process.env.GREEDY_SEARCH_PORT),r=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${U}/greedysearch-chrome-profile`).replaceAll("\\","/"),en=`${r}/DevToolsActivePort`,rn=process.env.GREEDY_SEARCH_PID_FILE||`${r}/browser.pid`,an=process.env.CDP_PAGES_CACHE||`${r}/cdp-pages.json`,En=process.env.GREEDY_SEARCH_MODE_FILE||`${r}/browser-mode`,ln=process.env.GREEDY_SEARCH_METADATA_FILE||`${r}/browser-metadata.json`,on=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${r}/browser-launch.lock`,tn=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${r}/browser-last-activity`,gn=(process.env.CDP_SOCKET_DIR||`${r}/cdp-sockets`).replaceAll("\\","/"),cn=`${r}/visible-recovery.jsonl`,A=T(P(),".dm"),l=T(A,"greedyconfig"),D=["perplexity","google","chatgpt","gemini"],p="gemini";function k(){try{if(S(l)){let n=N(l,"utf8"),e=JSON.parse(n);if(Array.isArray(e.engines)&&e.engines.length>0&&e.engines.every((s)=>typeof s==="string")){let s=e.engines.filter((a)=>y[a]),i=e.engines.filter((a)=>!y[a]);if(i.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${l}: ${i.join(", ")}
2
- [greedysearch] Available engines: ${Object.keys(y).join(", ")}
3
- `);if(s.length>0)return s;process.stderr.write(`[greedysearch] Warning: no valid engines in ${l}, falling back to defaults: ${D.join(", ")}
4
- `)}}}catch{}return D}function z(){try{if(!S(A))j(A,{recursive:!0});if(!S(l))w(l,JSON.stringify({engines:D,synthesizer:p},null,2)+`
5
- `,"utf8")}catch{}}z();var L=["gemini","chatgpt"];function V(){try{if(S(l)){let n=N(l,"utf8"),e=JSON.parse(n);if(typeof e.synthesizer==="string"){let s=e.synthesizer.toLowerCase();if(L.includes(s))return s;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${e.synthesizer}" in ${l}
6
- [greedysearch] Available synthesizers: ${L.join(", ")}
7
- [greedysearch] Falling back to default: ${p}
8
- `)}}}catch{}return p}var y={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=k();var Rn=V(),mn=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=r;import{existsSync as Y}from"node:fs";import{dirname as B,join as h}from"node:path";import{fileURLToPath as K}from"node:url";function G(n){return K(new URL(".",n)).replace(/^\/([A-Z]:)/,"$1")}function Z(n,e=Y){let s=new Set;for(let i of n.filter(Boolean)){if(s.has(i))continue;if(s.add(i),e(i))return i}return n.filter(Boolean).at(-1)}function F(n,{moduleDir:e,entrypoint:s=process.argv[1],env:i=process.env,exists:a=Y}={}){let R=s?B(s):null,m=i.GREEDY_SEARCH_EXTENSION_DIR?.trim()||null;return Z([e?h(e,"..","..","extractors",n):null,e?h(e,"..","extractors",n):null,m?h(m,"extractors",n):null,R?h(R,"..","extractors",n):null],a)}var W=G(import.meta.url);function un(n,e,s=null,i=!1,a=null,R=null){if(a===null)a=n.includes("logically")?120000:n.includes("chatgpt")?80000:n.includes("gemini")?70000:60000;let m=[...s?["--tab",s]:[],...i?["--short"]:[],...R?["--locale",R]:[]];return new Promise((H,C)=>{let $=F(n,{moduleDir:W}),c=J(u(),[$,"--stdin",...m],{stdio:["pipe","pipe","pipe"],env:{...process.env,CDP_PROFILE_DIR:r}});c.stdin.write(e),c.stdin.end();let _="",f="";c.stdout.on("data",(E)=>_+=E),c.stderr.on("data",(E)=>{if(f+=E,process.env.GREEDY_SEARCH_CHILD_STDERR!=="0")process.stderr.write(E)});let O=setTimeout(()=>{c.kill();let E=(g,I=20)=>String(g??"").split(/\r?\n/).filter(Boolean).slice(-I).join(`
9
- `),o=null;try{let g=JSON.parse(_.trim());if(g._envelope)o=g._envelope}catch{}let t=Error(`${n} timed out after ${a/1000}s`+(o?.lastStage?` (last stage: ${o.lastStage})`:""));t.engineScript=n,t.lastStage=o?.lastStage||null,t.partialErr=E(f),t.partialOut=E(_),C(t)},a);c.on("close",(E)=>{if(clearTimeout(O),E===0)try{H(JSON.parse(_.trim()))}catch{C(Error(`bad JSON from ${n}: ${_.slice(0,100)}`))}else{let o=null;try{let I=JSON.parse(_.trim());if(I._envelope)o=I._envelope}catch{}let t=f.trim()||`extractor exit ${E}`,g=Error(t);if(o)g.envelope=o;C(g)}})})}export{un as runExtractor,y as ENGINES};
1
+ import { spawn } from "node:child_process";
2
+ import { nodeRuntimeCommand } from "../utils/node-runtime.mjs";
3
+ import { ENGINES, GREEDY_PROFILE_DIR } from "./constants.mjs";
4
+ import {
5
+ moduleDirectory,
6
+ resolveGreedySearchExtractorScript
7
+ } from "./paths.mjs";
8
+
9
+ export { ENGINES };
10
+ const __dir = moduleDirectory(import.meta.url);
11
+ export function runExtractor(script, query, tabPrefix = null, short = false, timeoutMs = null, locale = null) {
12
+ if (timeoutMs === null) {
13
+ timeoutMs = script.includes("logically") ? 120000 : script.includes("chatgpt") ? 80000 : script.includes("gemini") ? 70000 : 60000;
14
+ }
15
+ const extraArgs = [
16
+ ...tabPrefix ? ["--tab", tabPrefix] : [],
17
+ ...short ? ["--short"] : [],
18
+ ...locale ? ["--locale", locale] : []
19
+ ];
20
+ return new Promise((resolve, reject) => {
21
+ const extractorScript = resolveGreedySearchExtractorScript(script, {
22
+ moduleDir: __dir
23
+ });
24
+ const proc = spawn(nodeRuntimeCommand(), [extractorScript, "--stdin", ...extraArgs], {
25
+ stdio: ["pipe", "pipe", "pipe"],
26
+ env: { ...process.env, CDP_PROFILE_DIR: GREEDY_PROFILE_DIR }
27
+ });
28
+ proc.stdin.write(query);
29
+ proc.stdin.end();
30
+ let out = "";
31
+ let err = "";
32
+ proc.stdout.on("data", (d) => out += d);
33
+ proc.stderr.on("data", (d) => {
34
+ err += d;
35
+ if (process.env.GREEDY_SEARCH_CHILD_STDERR !== "0") {
36
+ process.stderr.write(d);
37
+ }
38
+ });
39
+ const t = setTimeout(() => {
40
+ proc.kill();
41
+ const tailLines = (s, n = 20) => String(s ?? "").split(/\r?\n/).filter(Boolean).slice(-n).join(`
42
+ `);
43
+ let envelope = null;
44
+ try {
45
+ const parsed = JSON.parse(out.trim());
46
+ if (parsed._envelope)
47
+ envelope = parsed._envelope;
48
+ } catch {}
49
+ const errObj = new Error(`${script} timed out after ${timeoutMs / 1000}s` + (envelope?.lastStage ? ` (last stage: ${envelope.lastStage})` : ""));
50
+ errObj.engineScript = script;
51
+ errObj.lastStage = envelope?.lastStage || null;
52
+ errObj.partialErr = tailLines(err);
53
+ errObj.partialOut = tailLines(out);
54
+ reject(errObj);
55
+ }, timeoutMs);
56
+ proc.on("close", (code) => {
57
+ clearTimeout(t);
58
+ if (code === 0) {
59
+ try {
60
+ resolve(JSON.parse(out.trim()));
61
+ } catch {
62
+ reject(new Error(`bad JSON from ${script}: ${out.slice(0, 100)}`));
63
+ }
64
+ } else {
65
+ let envelope = null;
66
+ try {
67
+ const parsed = JSON.parse(out.trim());
68
+ if (parsed._envelope)
69
+ envelope = parsed._envelope;
70
+ } catch {}
71
+ const msg = err.trim() || `extractor exit ${code}`;
72
+ const errObj = new Error(msg);
73
+ if (envelope)
74
+ errObj.envelope = envelope;
75
+ reject(errObj);
76
+ }
77
+ });
78
+ });
79
+ }