@duckmind/dm-windows-x64 0.60.6 → 0.60.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1,11 +1,61 @@
1
- function V(R="",E=240){let _=String(R).replaceAll(/\s+/g," ").trim();if(_.length<=E)return _;let D=_.slice(0,E),G=D.lastIndexOf(" ");return G>0?`${D.slice(0,G)}...`:`${D}...`}import{spawn as a}from"node:child_process";import{basename as p}from"node:path";function P(R=process.env,E=process.execPath){let _=R.GREEDY_SEARCH_NODE||R.NODE_BINARY||R.NODE;if(_?.trim())return _.trim();let D=p(E||"").toLowerCase();if(D==="node"||D==="node.exe")return E;return"node"}import{existsSync as H,mkdirSync as x,readFileSync as M,writeFileSync as y}from"node:fs";import{homedir as z}from"node:os";import{join as B}from"node:path";import{tmpdir as h}from"node:os";function l(R,E=9222){let _=Number.parseInt(String(R??""),10);return Number.isInteger(_)&&_>1024&&_<65535?_:E}var m=h().replaceAll("\\","/"),FE=l(process.env.GREEDY_SEARCH_PORT),$=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${m}/greedysearch-chrome-profile`).replaceAll("\\","/"),CE=`${$}/DevToolsActivePort`,gE=process.env.GREEDY_SEARCH_PID_FILE||`${$}/browser.pid`,AE=process.env.CDP_PAGES_CACHE||`${$}/cdp-pages.json`,OE=process.env.GREEDY_SEARCH_MODE_FILE||`${$}/browser-mode`,HE=process.env.GREEDY_SEARCH_METADATA_FILE||`${$}/browser-metadata.json`,LE=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${$}/browser-launch.lock`,vE=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${$}/browser-last-activity`,VE=(process.env.CDP_SOCKET_DIR||`${$}/cdp-sockets`).replaceAll("\\","/"),ZE=`${$}/visible-recovery.jsonl`,K=B(z(),".dm"),j=B(K,"greedyconfig"),Q=["perplexity","google","chatgpt","gemini"],W="gemini";function u(){try{if(H(j)){let R=M(j,"utf8"),E=JSON.parse(R);if(Array.isArray(E.engines)&&E.engines.length>0&&E.engines.every((_)=>typeof _==="string")){let _=E.engines.filter((G)=>Z[G]),D=E.engines.filter((G)=>!Z[G]);if(D.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${j}: ${D.join(", ")}
2
- [greedysearch] Available engines: ${Object.keys(Z).join(", ")}
3
- `);if(_.length>0)return _;process.stderr.write(`[greedysearch] Warning: no valid engines in ${j}, falling back to defaults: ${Q.join(", ")}
4
- `)}}}catch{}return Q}function n(){try{if(!H(K))x(K,{recursive:!0});if(!H(j))y(j,JSON.stringify({engines:Q,synthesizer:W},null,2)+`
5
- `,"utf8")}catch{}}n();var O=["gemini","chatgpt"];function i(){try{if(H(j)){let R=M(j,"utf8"),E=JSON.parse(R);if(typeof E.synthesizer==="string"){let _=E.synthesizer.toLowerCase();if(O.includes(_))return _;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${E.synthesizer}" in ${j}
6
- [greedysearch] Available synthesizers: ${O.join(", ")}
7
- [greedysearch] Falling back to default: ${W}
8
- `)}}}catch{}return W}var Z={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"},d=u();var KE=i(),QE=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=$;import{existsSync as q}from"node:fs";import{dirname as t,join as L}from"node:path";import{fileURLToPath as s}from"node:url";function T(R){return s(new URL(".",R)).replace(/^\/([A-Z]:)/,"$1")}function c(R,E=q){let _=new Set;for(let D of R.filter(Boolean)){if(_.has(D))continue;if(_.add(D),E(D))return D}return R.filter(Boolean).at(-1)}function b(R,{moduleDir:E,entrypoint:_=process.argv[1],env:D=process.env,exists:G=q}={}){let Y=_?t(_):null,I=D.GREEDY_SEARCH_EXTENSION_DIR?.trim()||null;return c([E?L(E,"..","..","extractors",R):null,E?L(E,"..","extractors",R):null,I?L(I,"extractors",R):null,Y?L(Y,"..","extractors",R):null],G)}function o(R){let E="",_=!1,D=!1;for(let G of String(R)){if(D){E+=G,D=!1;continue}if(G==="\\"){E+=G,D=!0;continue}if(G==='"'){_=!_,E+=G;continue}if(_&&G===`
9
- `)E+="\\n";else if(_&&G==="\r")E+="\\r";else if(_&&G==="\t")E+="\\t";else E+=G}return E}function J(R){if(!R)return null;let E=String(R).trim(),_=E.indexOf("BEGIN_JSON"),D=E.indexOf("END_JSON");if(_!==-1&&D!==-1&&_<D)E=E.slice(_+10,D).trim();else{let N=E.indexOf("{");if(N>0)E=E.slice(N)}let G=[E,E.replace(/^```json\s*/i,"").replace(/^```\s*/i,"").replace(/```$/i,"").trim()],Y=E.indexOf("{"),I=E.lastIndexOf("}");if(Y!==-1&&I!==-1&&Y<I)G.push(E.slice(Y,I+1));for(let N of[...G]){let F=o(N);if(F!==N)G.push(F)}for(let N of G)try{return JSON.parse(N)}catch{}return null}var r=T(import.meta.url),e={gemini:"gemini.mjs",chatgpt:"chatgpt.mjs"};function EE(R="gemini"){let E=String(R||"gemini").toLowerCase();if(E==="gem")return"gemini";if(E==="gpt")return"chatgpt";return E}async function _E(R,E,{tabPrefix:_=null,timeoutMs:D=180000,visible:G=null}={}){let Y=EE(R),I=e[Y];if(!I||!O.includes(Y))throw Error(`Unsupported synthesizer "${R}". Supported: ${O.join(", ")}`);return new Promise((N,F)=>{let w=b(I,{moduleDir:r}),f=_?["--tab",String(_)]:[],g={...process.env,CDP_PROFILE_DIR:$};if(G!==!0)delete g.GREEDY_SEARCH_VISIBLE,delete g.GREEDY_SEARCH_ALWAYS_VISIBLE;else g.GREEDY_SEARCH_VISIBLE="1",g.GREEDY_SEARCH_ALWAYS_VISIBLE="1";let C=a(P(),[w,"--stdin",...f],{stdio:["pipe","pipe","pipe"],env:g});C.stdin.write(E),C.stdin.end();let v="",X="";C.stdout.on("data",(A)=>v+=A),C.stderr.on("data",(A)=>X+=A);let S=setTimeout(()=>{C.kill(),F(Error(`${Y} prompt timed out after ${D/1000}s`))},D);C.on("close",(A)=>{if(clearTimeout(S),A!==0){F(Error(X.trim()||`${Y} extractor failed`));return}try{N(JSON.parse(v.trim()))}catch{F(Error(`bad JSON from ${Y}: ${v.slice(0,100)}`))}})})}async function U(R,E={}){return _E("gemini",R,E)}var RE=30000;function k(R,E,_,D){let G=Number.parseInt(String(R??""),10);if(!Number.isFinite(G))return D;return Math.min(_,Math.max(E,G))}async function uE(R){let E=["You are a research complexity classifier.","Classify the following query by research complexity.","","- simple: A narrow factual question (what is X, define X, how does X work)."," Answerable with 1-3 search queries and a short synthesis. No sub-questions.","- moderate: A focused comparison, recent change, or best-practice lookup."," Needs 2-4 angles but stays within one domain.","- complex: Multi-faceted survey, landscape analysis, or cross-domain investigation."," Benefits from parallel research directions and iterative deepening.","","Respond ONLY with JSON wrapped in BEGIN_JSON / END_JSON markers:","BEGIN_JSON",JSON.stringify({complexity:"simple",reasoning:"narrow factual question",suggestedBreadth:1,suggestedIterations:1,needsAcademicSources:!1},null,2),"END_JSON","","Query: "+R].join(`
10
- `);try{let _=await U(E,{timeoutMs:RE}),D=J(_?.answer||"")||{},G=["simple","moderate","complex"].includes(D.complexity)?D.complexity:"moderate";return{complexity:G,reasoning:V(D.reasoning||"",200),suggestedBreadth:k(D.suggestedBreadth,1,5,G==="simple"?1:3),suggestedIterations:k(D.suggestedIterations,1,3,G==="simple"?1:2),needsAcademicSources:D.needsAcademicSources===!0}}catch(_){return process.stderr.write(`[greedysearch] Complexity classification failed, defaulting to moderate: ${_.message}
11
- `),{complexity:"moderate",reasoning:"classification failed",suggestedBreadth:3,suggestedIterations:2,needsAcademicSources:!1}}}export{uE as classifyResearchComplexity};
1
+ import { trimText } from "./sources.mjs";
2
+ import { runGeminiPrompt } from "./synthesis-runner.mjs";
3
+ import { parseStructuredJson } from "./synthesis.mjs";
4
+ const COMPLEXITY_PROMPT_TIMEOUT_MS = 30000;
5
+ function clampInt(value, min, max, fallback) {
6
+ const n = Number.parseInt(String(value ?? ""), 10);
7
+ if (!Number.isFinite(n))
8
+ return fallback;
9
+ return Math.min(max, Math.max(min, n));
10
+ }
11
+ export async function classifyResearchComplexity(query) {
12
+ const prompt = [
13
+ "You are a research complexity classifier.",
14
+ "Classify the following query by research complexity.",
15
+ "",
16
+ "- simple: A narrow factual question (what is X, define X, how does X work).",
17
+ " Answerable with 1-3 search queries and a short synthesis. No sub-questions.",
18
+ "- moderate: A focused comparison, recent change, or best-practice lookup.",
19
+ " Needs 2-4 angles but stays within one domain.",
20
+ "- complex: Multi-faceted survey, landscape analysis, or cross-domain investigation.",
21
+ " Benefits from parallel research directions and iterative deepening.",
22
+ "",
23
+ "Respond ONLY with JSON wrapped in BEGIN_JSON / END_JSON markers:",
24
+ "BEGIN_JSON",
25
+ JSON.stringify({
26
+ complexity: "simple",
27
+ reasoning: "narrow factual question",
28
+ suggestedBreadth: 1,
29
+ suggestedIterations: 1,
30
+ needsAcademicSources: false
31
+ }, null, 2),
32
+ "END_JSON",
33
+ "",
34
+ "Query: " + query
35
+ ].join(`
36
+ `);
37
+ try {
38
+ const raw = await runGeminiPrompt(prompt, {
39
+ timeoutMs: COMPLEXITY_PROMPT_TIMEOUT_MS
40
+ });
41
+ const parsed = parseStructuredJson(raw?.answer || "") || {};
42
+ const complexity = ["simple", "moderate", "complex"].includes(parsed.complexity) ? parsed.complexity : "moderate";
43
+ return {
44
+ complexity,
45
+ reasoning: trimText(parsed.reasoning || "", 200),
46
+ suggestedBreadth: clampInt(parsed.suggestedBreadth, 1, 5, complexity === "simple" ? 1 : 3),
47
+ suggestedIterations: clampInt(parsed.suggestedIterations, 1, 3, complexity === "simple" ? 1 : 2),
48
+ needsAcademicSources: parsed.needsAcademicSources === true
49
+ };
50
+ } catch (error) {
51
+ process.stderr.write(`[greedysearch] Complexity classification failed, defaulting to moderate: ${error.message}
52
+ `);
53
+ return {
54
+ complexity: "moderate",
55
+ reasoning: "classification failed",
56
+ suggestedBreadth: 3,
57
+ suggestedIterations: 2,
58
+ needsAcademicSources: false
59
+ };
60
+ }
61
+ }