@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,9 +1,340 @@
1
- import{execFileSync as o,execSync as f0}from"node:child_process";import{existsSync as x,mkdirSync as z0,readFileSync as g,unlinkSync as f,writeFileSync as z}from"node:fs";import{platform as s}from"node:os";import{existsSync as h,mkdirSync as r,readFileSync as l,writeFileSync as E}from"node:fs";import{homedir as d}from"node:os";import{join as n}from"node:path";import{tmpdir as t}from"node:os";function e($,Q=9222){let W=Number.parseInt(String($??""),10);return Number.isInteger(W)&&W>1024&&W<65535?W:Q}var a=t().replaceAll("\\","/"),X=e(process.env.GREEDY_SEARCH_PORT),J=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${a}/greedysearch-chrome-profile`).replaceAll("\\","/"),M0=`${J}/DevToolsActivePort`,P=process.env.GREEDY_SEARCH_PID_FILE||`${J}/browser.pid`,N0=process.env.CDP_PAGES_CACHE||`${J}/cdp-pages.json`,c=process.env.GREEDY_SEARCH_MODE_FILE||`${J}/browser-mode`,D=process.env.GREEDY_SEARCH_METADATA_FILE||`${J}/browser-metadata.json`,F=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${J}/browser-launch.lock`,R=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${J}/browser-last-activity`,w0=(process.env.CDP_SOCKET_DIR||`${J}/cdp-sockets`).replaceAll("\\","/"),T0=`${J}/visible-recovery.jsonl`,C=n(d(),".dm"),b=n(C,"greedyconfig"),Y=["perplexity","google","chatgpt","gemini"],O="gemini";function $0(){try{if(h(b)){let $=l(b,"utf8"),Q=JSON.parse($);if(Array.isArray(Q.engines)&&Q.engines.length>0&&Q.engines.every((W)=>typeof W==="string")){let W=Q.engines.filter((u)=>A[u]),q=Q.engines.filter((u)=>!A[u]);if(q.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${b}: ${q.join(", ")}
2
- [greedysearch] Available engines: ${Object.keys(A).join(", ")}
3
- `);if(W.length>0)return W;process.stderr.write(`[greedysearch] Warning: no valid engines in ${b}, falling back to defaults: ${Y.join(", ")}
4
- `)}}}catch{}return Y}function Q0(){try{if(!h(C))r(C,{recursive:!0});if(!h(b))E(b,JSON.stringify({engines:Y,synthesizer:O},null,2)+`
5
- `,"utf8")}catch{}}Q0();var G=["gemini","chatgpt"];function W0(){try{if(h(b)){let $=l(b,"utf8"),Q=JSON.parse($);if(typeof Q.synthesizer==="string"){let W=Q.synthesizer.toLowerCase();if(G.includes(W))return W;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${Q.synthesizer}" in ${b}
6
- [greedysearch] Available synthesizers: ${G.join(", ")}
7
- [greedysearch] Falling back to default: ${O}
8
- `)}}}catch{}return O}var A={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"},A0=$0();var C0=W0(),Y0=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=J;import{existsSync as L}from"node:fs";import{platform as q0}from"node:os";import{join as V}from"node:path";function j($){let Q=q0()==="win32",W=process.env.SystemRoot||"C:\\Windows",q={win32:{powershell:V(W,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:V(W,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:V(W,"System32","netstat.exe"),taskkill:V(W,"System32","taskkill.exe"),tasklist:V(W,"System32","tasklist.exe"),cmd:V(W,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},u=Q?q.win32:q.unix,Z=$.toLowerCase();if(u[Z]&&L(u[Z]))return u[Z];if(Q&&Z==="netstat"){let U=V(W,"Sysnative","netstat.exe");if(L(U))return U}return $}import{execFileSync as u0}from"node:child_process";import{platform as J0}from"node:os";function X0($,Q){return u0(j($),Q,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function b0($){let Q=String($||"").match(/\b(\d+)\b/);return Q?Number.parseInt(Q[1],10):null}function Z0($){return b0($)}function V0($,Q){for(let W of String($||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test(W))continue;if(!W.trim().split(/\s+/).slice(0,6).some((Z)=>Z.endsWith(`:${Q}`)))continue;let u=W.match(/\bpid=(\d+)\b/);if(u)return Number.parseInt(u[1],10)}return null}function B0($,Q){for(let W of String($||"").split(/\r?\n/)){let q=W.trim().split(/\s+/);if(q.length<5||q[0].toUpperCase()!=="TCP")continue;if(!q.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!q[1].endsWith(`:${Q}`))continue;let u=Number.parseInt(q.at(-1),10);if(Number.isInteger(u)&&u>0)return u}return null}function y($,Q,W){try{return $(Q,W)}catch{return null}}function p($,{platformName:Q=J0(),run:W=X0}={}){if(Q==="win32")return B0(y(W,"netstat",["-ano","-p","TCP"]),$);let q=y(W,"lsof",["-nP",`-iTCP:${$}`,"-sTCP:LISTEN","-t"]),u=Z0(q);if(u)return u;if(Q!=="linux")return null;return V0(y(W,"ss",["-ltnp"]),$)}var M=D,B=F,K0=15000,N=P,w=c,k=R;function K($){if(!Number.isInteger($)||$<=0)return!1;try{return process.kill($,0),!0}catch{return!1}}function j0($){if(!K($))return null;try{if(s()==="win32")return o(j("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${$}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return o(j("ps"),["-p",String($),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function g0($,Q,W=X){if(!$)return!1;let q=(U)=>String(U||"").replaceAll("\\","/").toLowerCase(),u=q($),Z=q(Q);return u.includes(Z)&&u.includes(`--remote-debugging-port=${W}`)&&!u.includes("--type=")}function H($,Q,W=X){return g0(j0($),Q,W)}function S($=X){return p($)}function H0($,Q=null,W=null){if(Q&&!H($,Q,W))return!1;try{if(s()==="win32")f0(`${j("taskkill")} /F /T /PID ${$}`,{stdio:"ignore"});else{try{process.kill(-$,"SIGKILL")}catch{}try{process.kill($,"SIGKILL")}catch{}}return!0}catch{return!1}}function _(){try{if(x(M)){let $=g(M,"utf8"),Q=JSON.parse($);if(Q&&typeof Q.tempDir==="string"&&typeof Q.debugPort==="number")return{browserPid:Number.isInteger(Q.browserPid)?Q.browserPid:void 0,debugPort:Q.debugPort,tempDir:Q.tempDir,clientPids:Array.isArray(Q.clientPids)?Q.clientPids.filter((W)=>Number.isInteger(W)&&W>0):[],sessionMode:Q.sessionMode==="visible"?"visible":"headless",lastActivity:Number.isFinite(Q.lastActivity)?Q.lastActivity:0,launchedAt:Number.isFinite(Q.launchedAt)?Q.launchedAt:0}}}catch{}try{let $=x(N)?Number.parseInt(g(N,"utf8").trim(),10)||void 0:void 0,Q=x(w)?g(w,"utf8").trim()==="visible"?"visible":"headless":"headless",W=x(k)?Number.parseInt(g(k,"utf8").trim(),10)||0:0;return{browserPid:$,debugPort:X,tempDir:J,clientPids:$?[$]:[],sessionMode:Q,lastActivity:W,launchedAt:0}}catch{return null}}function v($){try{z(M,JSON.stringify({browserPid:$.browserPid,debugPort:$.debugPort,tempDir:$.tempDir,clientPids:[...new Set($.clientPids.filter((Q)=>Q>0))],sessionMode:$.sessionMode,lastActivity:$.lastActivity,launchedAt:$.launchedAt},null,2),"utf8")}catch{}try{if($.browserPid)z(N,String($.browserPid),"utf8")}catch{}try{z(w,$.sessionMode,"utf8")}catch{}try{z(k,String($.lastActivity),"utf8")}catch{}}function T(){try{f(M)}catch{}try{f(N)}catch{}try{f(w)}catch{}try{f(k)}catch{}}function m0($){if(!$)return $;let Q={...$,clientPids:[...new Set([...$.clientPids,process.pid].filter((W)=>K(W)||W===process.pid))]};return v(Q),Q}function s0($){if(!$)return $;let Q={...$,clientPids:$.clientPids.filter((W)=>W!==process.pid).filter((W)=>K(W))};return v(Q),Q}function _0($){let Q=Date.now();try{if($)v({...$,lastActivity:Q});else z(k,String(Q),"utf8")}catch{}}var I=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5;function i0($){if(I<=0)return!1;if(!$||!$.lastActivity)return!1;return(Date.now()-$.lastActivity)/60000>=I}var m=!1;function k0(){if(process.env.GREEDY_SEARCH_RESEARCH_CHILD)return;if(m)return;m=!0;let $=_();if(!$)return;if($.browserPid){if(!K($.browserPid)){T();return}if(!H($.browserPid,$.tempDir,$.debugPort))T();else v({...$,clientPids:$.clientPids.filter((u)=>K(u))})}let Q=S();if(Q&&Q!==$.browserPid)if(H(Q,J,X))v({browserPid:Q,debugPort:X,tempDir:J,clientPids:[Q],sessionMode:$.sessionMode,lastActivity:Date.now(),launchedAt:Date.now()});else process.stderr.write(`[greedysearch] Refusing to kill unverified listener ${Q} on port ${X}.
9
- `)}function r0(){z0(J,{recursive:!0});try{let $=JSON.stringify({pid:process.pid,ts:Date.now()});return z(B,$,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{let Q=g(B,"utf8");if(JSON.parse(Q).pid===process.pid)f(B)}catch{}}}}catch($){if($?.code!=="EEXIST")return{acquired:!1,release:()=>{}}}try{let $=g(B,"utf8"),Q=JSON.parse($),W=Date.now()-(Q.ts||0);if(!K(Q.pid)||W>K0){try{f(B)}catch{}try{let u=JSON.stringify({pid:process.pid,ts:Date.now()});return z(B,u,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{f(B)}catch{}}}}catch{return{acquired:!1,release:()=>{}}}}}catch{}return{acquired:!1,release:()=>{}}}function i(){let $=_();if(!$||!$.browserPid){let q=S();if(q&&H(q,J,X))return{running:!0,pid:q,metadata:$};return{running:!1,pid:null,metadata:null}}if(!K($.browserPid))return{running:!1,pid:null,metadata:$};if(!H($.browserPid,$.tempDir,$.debugPort)){let q=S();if(q&&H(q,J,X))return{running:!0,pid:q,metadata:$};return{running:!1,pid:null,metadata:$}}return{running:!0,pid:$.browserPid,metadata:$}}function E0(){let{running:$,pid:Q,metadata:W}=i();if(!$||!Q)return T(),!1;let q=H0(Q,W?.tempDir||J,W?.debugPort||X);return T(),q}async function d0(){return k0(),i()}export{v as writeMetadata,H as verifyBrowserProcess,s0 as unregisterClient,_0 as touchActivity,m0 as registerClient,_ as readMetadata,E0 as killChrome,i0 as isIdleExpired,d0 as ensureCleanSession,g0 as commandLineMatchesGreedyChrome,T as clearMetadata,k0 as cleanupStaleSessions,i as checkRunning,r0 as acquireLaunchLock,M as METADATA_FILE};
1
+ import { execFileSync, execSync } from "node:child_process";
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ unlinkSync,
7
+ writeFileSync
8
+ } from "node:fs";
9
+ import { platform } from "node:os";
10
+ import {
11
+ CHROME_MODE_FILE,
12
+ GREEDY_ACTIVITY_FILE,
13
+ GREEDY_LAUNCH_LOCK_FILE,
14
+ GREEDY_METADATA_FILE,
15
+ GREEDY_PID_FILE,
16
+ GREEDY_PORT,
17
+ GREEDY_PROFILE_DIR
18
+ } from "./constants.mjs";
19
+ import { resolveSystemCmd } from "../utils/system-cmds.mjs";
20
+ import { findListeningProcessPid } from "./port-pid.mjs";
21
+ export const METADATA_FILE = GREEDY_METADATA_FILE;
22
+ const LAUNCH_LOCK_FILE = GREEDY_LAUNCH_LOCK_FILE;
23
+ const LOCK_STALE_MS = 15000;
24
+ const LEGACY_PID_FILE = GREEDY_PID_FILE;
25
+ const LEGACY_MODE_FILE = CHROME_MODE_FILE;
26
+ const LEGACY_ACTIVITY_FILE = GREEDY_ACTIVITY_FILE;
27
+ function processExists(pid) {
28
+ if (!Number.isInteger(pid) || pid <= 0)
29
+ return false;
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ } catch {
34
+ return false;
35
+ }
36
+ }
37
+ function getProcessCommandLine(pid) {
38
+ if (!processExists(pid))
39
+ return null;
40
+ try {
41
+ if (platform() === "win32") {
42
+ const output = execFileSync(resolveSystemCmd("powershell"), [
43
+ "-NoProfile",
44
+ "-NonInteractive",
45
+ "-Command",
46
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`
47
+ ], { encoding: "utf8", windowsHide: true, timeout: 5000 });
48
+ return output.trim() || null;
49
+ }
50
+ const output = execFileSync(resolveSystemCmd("ps"), ["-p", String(pid), "-o", "command="], {
51
+ encoding: "utf8",
52
+ timeout: 5000
53
+ });
54
+ return output.trim() || null;
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ export function commandLineMatchesGreedyChrome(cmdLine, tempDir, debugPort = GREEDY_PORT) {
60
+ if (!cmdLine)
61
+ return false;
62
+ const normalize = (value) => String(value || "").replaceAll("\\", "/").toLowerCase();
63
+ const normalizedCmdLine = normalize(cmdLine);
64
+ const normalizedTempDir = normalize(tempDir);
65
+ return normalizedCmdLine.includes(normalizedTempDir) && normalizedCmdLine.includes(`--remote-debugging-port=${debugPort}`) && !normalizedCmdLine.includes("--type=");
66
+ }
67
+ export function verifyBrowserProcess(pid, tempDir, debugPort = GREEDY_PORT) {
68
+ return commandLineMatchesGreedyChrome(getProcessCommandLine(pid), tempDir, debugPort);
69
+ }
70
+ function getPortPid(port = GREEDY_PORT) {
71
+ return findListeningProcessPid(port);
72
+ }
73
+ function forceKillProcess(pid, expectedProfile = null, expectedPort = null) {
74
+ if (expectedProfile && !verifyBrowserProcess(pid, expectedProfile, expectedPort))
75
+ return false;
76
+ try {
77
+ if (platform() === "win32") {
78
+ execSync(`${resolveSystemCmd("taskkill")} /F /T /PID ${pid}`, {
79
+ stdio: "ignore"
80
+ });
81
+ } else {
82
+ try {
83
+ process.kill(-pid, "SIGKILL");
84
+ } catch {}
85
+ try {
86
+ process.kill(pid, "SIGKILL");
87
+ } catch {}
88
+ }
89
+ return true;
90
+ } catch {
91
+ return false;
92
+ }
93
+ }
94
+ export function readMetadata() {
95
+ try {
96
+ if (existsSync(METADATA_FILE)) {
97
+ const raw = readFileSync(METADATA_FILE, "utf8");
98
+ const parsed = JSON.parse(raw);
99
+ if (parsed && typeof parsed.tempDir === "string" && typeof parsed.debugPort === "number") {
100
+ return {
101
+ browserPid: Number.isInteger(parsed.browserPid) ? parsed.browserPid : undefined,
102
+ debugPort: parsed.debugPort,
103
+ tempDir: parsed.tempDir,
104
+ clientPids: Array.isArray(parsed.clientPids) ? parsed.clientPids.filter((p) => Number.isInteger(p) && p > 0) : [],
105
+ sessionMode: parsed.sessionMode === "visible" ? "visible" : "headless",
106
+ lastActivity: Number.isFinite(parsed.lastActivity) ? parsed.lastActivity : 0,
107
+ launchedAt: Number.isFinite(parsed.launchedAt) ? parsed.launchedAt : 0
108
+ };
109
+ }
110
+ }
111
+ } catch {}
112
+ try {
113
+ const browserPid = existsSync(LEGACY_PID_FILE) ? Number.parseInt(readFileSync(LEGACY_PID_FILE, "utf8").trim(), 10) || undefined : undefined;
114
+ const sessionMode = existsSync(LEGACY_MODE_FILE) ? readFileSync(LEGACY_MODE_FILE, "utf8").trim() === "visible" ? "visible" : "headless" : "headless";
115
+ const lastActivity = existsSync(LEGACY_ACTIVITY_FILE) ? Number.parseInt(readFileSync(LEGACY_ACTIVITY_FILE, "utf8").trim(), 10) || 0 : 0;
116
+ return {
117
+ browserPid,
118
+ debugPort: GREEDY_PORT,
119
+ tempDir: GREEDY_PROFILE_DIR,
120
+ clientPids: browserPid ? [browserPid] : [],
121
+ sessionMode,
122
+ lastActivity,
123
+ launchedAt: 0
124
+ };
125
+ } catch {
126
+ return null;
127
+ }
128
+ }
129
+ export function writeMetadata(metadata) {
130
+ try {
131
+ writeFileSync(METADATA_FILE, JSON.stringify({
132
+ browserPid: metadata.browserPid,
133
+ debugPort: metadata.debugPort,
134
+ tempDir: metadata.tempDir,
135
+ clientPids: [...new Set(metadata.clientPids.filter((p) => p > 0))],
136
+ sessionMode: metadata.sessionMode,
137
+ lastActivity: metadata.lastActivity,
138
+ launchedAt: metadata.launchedAt
139
+ }, null, 2), "utf8");
140
+ } catch {}
141
+ try {
142
+ if (metadata.browserPid)
143
+ writeFileSync(LEGACY_PID_FILE, String(metadata.browserPid), "utf8");
144
+ } catch {}
145
+ try {
146
+ writeFileSync(LEGACY_MODE_FILE, metadata.sessionMode, "utf8");
147
+ } catch {}
148
+ try {
149
+ writeFileSync(LEGACY_ACTIVITY_FILE, String(metadata.lastActivity), "utf8");
150
+ } catch {}
151
+ }
152
+ export function clearMetadata() {
153
+ try {
154
+ unlinkSync(METADATA_FILE);
155
+ } catch {}
156
+ try {
157
+ unlinkSync(LEGACY_PID_FILE);
158
+ } catch {}
159
+ try {
160
+ unlinkSync(LEGACY_MODE_FILE);
161
+ } catch {}
162
+ try {
163
+ unlinkSync(LEGACY_ACTIVITY_FILE);
164
+ } catch {}
165
+ }
166
+ export function registerClient(metadata) {
167
+ if (!metadata)
168
+ return metadata;
169
+ const updated = {
170
+ ...metadata,
171
+ clientPids: [
172
+ ...new Set([...metadata.clientPids, process.pid].filter((p) => processExists(p) || p === process.pid))
173
+ ]
174
+ };
175
+ writeMetadata(updated);
176
+ return updated;
177
+ }
178
+ export function unregisterClient(metadata) {
179
+ if (!metadata)
180
+ return metadata;
181
+ const updated = {
182
+ ...metadata,
183
+ clientPids: metadata.clientPids.filter((p) => p !== process.pid).filter((p) => processExists(p))
184
+ };
185
+ writeMetadata(updated);
186
+ return updated;
187
+ }
188
+ export function touchActivity(metadata) {
189
+ const ts = Date.now();
190
+ try {
191
+ if (metadata) {
192
+ writeMetadata({ ...metadata, lastActivity: ts });
193
+ } else {
194
+ writeFileSync(LEGACY_ACTIVITY_FILE, String(ts), "utf8");
195
+ }
196
+ } catch {}
197
+ }
198
+ const IDLE_TIMEOUT_MINUTES = Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES || "5", 10) || 5;
199
+ export function isIdleExpired(metadata) {
200
+ if (IDLE_TIMEOUT_MINUTES <= 0)
201
+ return false;
202
+ if (!metadata || !metadata.lastActivity)
203
+ return false;
204
+ const idleMs = Date.now() - metadata.lastActivity;
205
+ return idleMs / 60000 >= IDLE_TIMEOUT_MINUTES;
206
+ }
207
+ let _staleCleanupPerformed = false;
208
+ export function cleanupStaleSessions() {
209
+ if (process.env.GREEDY_SEARCH_RESEARCH_CHILD)
210
+ return;
211
+ if (_staleCleanupPerformed)
212
+ return;
213
+ _staleCleanupPerformed = true;
214
+ const metadata = readMetadata();
215
+ if (!metadata)
216
+ return;
217
+ if (metadata.browserPid) {
218
+ const alive = processExists(metadata.browserPid);
219
+ if (!alive) {
220
+ clearMetadata();
221
+ return;
222
+ }
223
+ const verified = verifyBrowserProcess(metadata.browserPid, metadata.tempDir, metadata.debugPort);
224
+ if (!verified) {
225
+ clearMetadata();
226
+ } else {
227
+ writeMetadata({
228
+ ...metadata,
229
+ clientPids: metadata.clientPids.filter((p) => processExists(p))
230
+ });
231
+ }
232
+ }
233
+ const portPid = getPortPid();
234
+ if (portPid && portPid !== metadata.browserPid) {
235
+ const verified = verifyBrowserProcess(portPid, GREEDY_PROFILE_DIR, GREEDY_PORT);
236
+ if (verified) {
237
+ writeMetadata({
238
+ browserPid: portPid,
239
+ debugPort: GREEDY_PORT,
240
+ tempDir: GREEDY_PROFILE_DIR,
241
+ clientPids: [portPid],
242
+ sessionMode: metadata.sessionMode,
243
+ lastActivity: Date.now(),
244
+ launchedAt: Date.now()
245
+ });
246
+ } else {
247
+ process.stderr.write(`[greedysearch] Refusing to kill unverified listener ${portPid} on port ${GREEDY_PORT}.
248
+ `);
249
+ }
250
+ }
251
+ }
252
+ export function acquireLaunchLock() {
253
+ mkdirSync(GREEDY_PROFILE_DIR, { recursive: true });
254
+ try {
255
+ const payload = JSON.stringify({ pid: process.pid, ts: Date.now() });
256
+ writeFileSync(LAUNCH_LOCK_FILE, payload, { encoding: "utf8", flag: "wx" });
257
+ return {
258
+ acquired: true,
259
+ release: () => {
260
+ try {
261
+ const raw = readFileSync(LAUNCH_LOCK_FILE, "utf8");
262
+ const parsed = JSON.parse(raw);
263
+ if (parsed.pid === process.pid) {
264
+ unlinkSync(LAUNCH_LOCK_FILE);
265
+ }
266
+ } catch {}
267
+ }
268
+ };
269
+ } catch (e) {
270
+ if (e?.code !== "EEXIST") {
271
+ return { acquired: false, release: () => {} };
272
+ }
273
+ }
274
+ try {
275
+ const raw = readFileSync(LAUNCH_LOCK_FILE, "utf8");
276
+ const parsed = JSON.parse(raw);
277
+ const lockAge = Date.now() - (parsed.ts || 0);
278
+ const lockPidAlive = processExists(parsed.pid);
279
+ if (!lockPidAlive || lockAge > LOCK_STALE_MS) {
280
+ try {
281
+ unlinkSync(LAUNCH_LOCK_FILE);
282
+ } catch {}
283
+ try {
284
+ const payload = JSON.stringify({ pid: process.pid, ts: Date.now() });
285
+ writeFileSync(LAUNCH_LOCK_FILE, payload, {
286
+ encoding: "utf8",
287
+ flag: "wx"
288
+ });
289
+ return {
290
+ acquired: true,
291
+ release: () => {
292
+ try {
293
+ unlinkSync(LAUNCH_LOCK_FILE);
294
+ } catch {}
295
+ }
296
+ };
297
+ } catch {
298
+ return { acquired: false, release: () => {} };
299
+ }
300
+ }
301
+ } catch {}
302
+ return { acquired: false, release: () => {} };
303
+ }
304
+ export function checkRunning() {
305
+ const metadata = readMetadata();
306
+ if (!metadata || !metadata.browserPid) {
307
+ const portPid = getPortPid();
308
+ if (portPid && verifyBrowserProcess(portPid, GREEDY_PROFILE_DIR, GREEDY_PORT)) {
309
+ return { running: true, pid: portPid, metadata };
310
+ }
311
+ return { running: false, pid: null, metadata: null };
312
+ }
313
+ const alive = processExists(metadata.browserPid);
314
+ if (!alive) {
315
+ return { running: false, pid: null, metadata };
316
+ }
317
+ const verified = verifyBrowserProcess(metadata.browserPid, metadata.tempDir, metadata.debugPort);
318
+ if (!verified) {
319
+ const portPid = getPortPid();
320
+ if (portPid && verifyBrowserProcess(portPid, GREEDY_PROFILE_DIR, GREEDY_PORT)) {
321
+ return { running: true, pid: portPid, metadata };
322
+ }
323
+ return { running: false, pid: null, metadata };
324
+ }
325
+ return { running: true, pid: metadata.browserPid, metadata };
326
+ }
327
+ export function killChrome() {
328
+ const { running, pid, metadata } = checkRunning();
329
+ if (!running || !pid) {
330
+ clearMetadata();
331
+ return false;
332
+ }
333
+ const killed = forceKillProcess(pid, metadata?.tempDir || GREEDY_PROFILE_DIR, metadata?.debugPort || GREEDY_PORT);
334
+ clearMetadata();
335
+ return killed;
336
+ }
337
+ export async function ensureCleanSession() {
338
+ cleanupStaleSessions();
339
+ return checkRunning();
340
+ }
@@ -1,4 +1,14 @@
1
- import{spawn as m}from"node:child_process";import{basename as h}from"node:path";import{dirname as _,join as w}from"node:path";import{fileURLToPath as b}from"node:url";function y(e=process.env,r=process.execPath){let t=e.GREEDY_SEARCH_NODE||e.NODE_BINARY||e.NODE;if(t?.trim())return t.trim();let o=h(r||"").toLowerCase();if(o==="node"||o==="node.exe")return r;return"node"}var v=_(b(import.meta.url)),x=w(v,"..","bin","cdp.mjs"),P=new Set(["list","snap","eval","shot","html","nav","net","click","clickxy","type","loadall","evalraw","browse","stop","--tab"]);function D(e){if(!Array.isArray(e)||e.length===0)throw Error("cdp: args must be a non-empty array");if(e[0]==="test")return e.map((r,t)=>p(r,t));if(!P.has(e[0]))throw Error(`cdp: unknown subcommand '${e[0]}'`);return e.map((r,t)=>p(r,t))}function p(e,r){if(typeof e!=="string")throw Error(`cdp: argv[${r}] must be a string (got ${typeof e})`);if(e.includes("\x00"))throw Error(`cdp: argv[${r}] contains a null byte`);return e}function u(e,r=30000){return O(e,null,r)}function O(e,r=null,t=30000){let o=D(e);return new Promise((d,l)=>{let n=m(y(),[x,...o],{stdio:[r==null?"ignore":"pipe","pipe","pipe"]});if(r!=null)n.stdin.write(r),n.stdin.end();let s="",c="";n.stdout.on("data",(a)=>s+=a),n.stderr.on("data",(a)=>c+=a);let i=setTimeout(()=>{n.kill(),l(Error(`cdp timeout: ${e[0]}`))},t);n.on("close",(a)=>{if(clearTimeout(i),a===0)d(s.trim());else l(Error(c.trim()||`cdp exit ${a}`))})})}var k=Number.parseInt(process.env.GREEDY_SEARCH_CHALLENGE_WAIT_MS||"300000",10),T=3000,f={chatgpt:{name:"chatgpt",isCleared:async(e)=>{let r=await u(["eval",e,`(() => {
1
+ import { cdp } from "../../extractors/common.mjs";
2
+ const DEFAULT_TIMEOUT_MS = Number.parseInt(process.env.GREEDY_SEARCH_CHALLENGE_WAIT_MS || "300000", 10);
3
+ const POLL_INTERVAL_MS = 3000;
4
+ const ENGINE_SIGNALS = {
5
+ chatgpt: {
6
+ name: "chatgpt",
7
+ isCleared: async (tab) => {
8
+ const probe = await cdp([
9
+ "eval",
10
+ tab,
11
+ `(() => {
2
12
  const title = document.title;
3
13
  const onChatGPT = location.hostname === "chatgpt.com";
4
14
  const hasProseMirror = !!document.querySelector("div.ProseMirror");
@@ -15,7 +25,33 @@ import{spawn as m}from"node:child_process";import{basename as h}from"node:path";
15
25
  bodyLen: bodyText.length,
16
26
  onChatGPT,
17
27
  });
18
- })()`]).catch(()=>null);if(!r)return!1;let t;try{t=JSON.parse(r)}catch{return!1}if(!t.onChatGPT)return!1;if(t.title&&/περιμένετε|please wait|just a moment|verifying|checking/i.test(t.title))return!1;if(t.hasTurnstileInput)return!1;return t.hasProseMirror||t.bodyLen>50}},bing:{name:"bing",isCleared:async(e)=>{let r=await u(["eval",e,`(() => {
28
+ })()`
29
+ ]).catch(() => null);
30
+ if (!probe)
31
+ return false;
32
+ let info;
33
+ try {
34
+ info = JSON.parse(probe);
35
+ } catch {
36
+ return false;
37
+ }
38
+ if (!info.onChatGPT)
39
+ return false;
40
+ if (info.title && /περιμένετε|please wait|just a moment|verifying|checking/i.test(info.title)) {
41
+ return false;
42
+ }
43
+ if (info.hasTurnstileInput)
44
+ return false;
45
+ return info.hasProseMirror || info.bodyLen > 50;
46
+ }
47
+ },
48
+ bing: {
49
+ name: "bing",
50
+ isCleared: async (tab) => {
51
+ const probe = await cdp([
52
+ "eval",
53
+ tab,
54
+ `(() => {
19
55
  const url = location.href;
20
56
  const title = document.title;
21
57
  const onCopilot = /copilot\\.microsoft\\.com/.test(location.hostname);
@@ -38,11 +74,83 @@ import{spawn as m}from"node:child_process";import{basename as h}from"node:path";
38
74
  hasTurnstileInput,
39
75
  bodyLen: bodyText.length,
40
76
  });
41
- })()`]).catch(()=>null);if(!r)return!1;let t;try{t=JSON.parse(r)}catch{return!1}if(!t.onCopilot)return!1;if(t.onChallenge)return!1;if(t.hasTurnstileInput)return!1;return t.hasTextarea||t.bodyLen>50}}};async function C(e){let r=await u(["eval",e,`(() => {
77
+ })()`
78
+ ]).catch(() => null);
79
+ if (!probe)
80
+ return false;
81
+ let info;
82
+ try {
83
+ info = JSON.parse(probe);
84
+ } catch {
85
+ return false;
86
+ }
87
+ if (!info.onCopilot)
88
+ return false;
89
+ if (info.onChallenge)
90
+ return false;
91
+ if (info.hasTurnstileInput)
92
+ return false;
93
+ return info.hasTextarea || info.bodyLen > 50;
94
+ }
95
+ }
96
+ };
97
+ async function pollForCfClearanceCookie(tab) {
98
+ const probe = await cdp([
99
+ "eval",
100
+ tab,
101
+ `(() => {
42
102
  const cookies = document.cookie || "";
43
103
  return JSON.stringify({
44
104
  hasCfClearance: /(?:^|;\\s*)cf_clearance=/.test(cookies),
45
105
  hasCfBm: /(?:^|;\\s*)__cf_bm=/.test(cookies),
46
106
  cookiesLength: cookies.length,
47
107
  });
48
- })()`]).catch(()=>null);if(!r)return!1;try{let t=JSON.parse(r);return t.hasCfClearance||t.hasCfBm}catch{return!1}}async function M({tab:e,engine:r,timeoutMs:t=k,intervalMs:o=T,signal:d,log:l=()=>{}}){let n=f[r],s=Date.now(),c=null;while(Date.now()-s<t){if(d?.aborted)return{cleared:!1,reason:"aborted"};let i=Math.floor((Date.now()-s)/1000),a=!1;if(n)a=await n.isCleared(e).catch(()=>!1);else a=await C(e).catch(()=>!1);if(a)return l(`[greedysearch] ✅ ${r} challenge cleared after ${i}s — auto-resuming extraction.`),{cleared:!0,signal:n?"dom-marker":"cookie"};if(i>0&&i%30===0&&c!==i)c=i,l(`[greedysearch] ⏳ Waiting for ${r} challenge to clear (${i}s/${Math.floor(t/1000)}s)...`);await new Promise((g)=>setTimeout(g,o))}return{cleared:!1,reason:`Challenge not cleared within ${Math.floor(t/1000)}s`}}var N=Object.keys(f);export{M as waitForChallengeCleared,N as CHALLENGE_ENGINES};
108
+ })()`
109
+ ]).catch(() => null);
110
+ if (!probe)
111
+ return false;
112
+ try {
113
+ const info = JSON.parse(probe);
114
+ return info.hasCfClearance || info.hasCfBm;
115
+ } catch {
116
+ return false;
117
+ }
118
+ }
119
+ export async function waitForChallengeCleared({
120
+ tab,
121
+ engine,
122
+ timeoutMs = DEFAULT_TIMEOUT_MS,
123
+ intervalMs = POLL_INTERVAL_MS,
124
+ signal: externalSignal,
125
+ log = () => {}
126
+ }) {
127
+ const def = ENGINE_SIGNALS[engine];
128
+ const start = Date.now();
129
+ let lastState = null;
130
+ while (Date.now() - start < timeoutMs) {
131
+ if (externalSignal?.aborted) {
132
+ return { cleared: false, reason: "aborted" };
133
+ }
134
+ const elapsed = Math.floor((Date.now() - start) / 1000);
135
+ let cleared = false;
136
+ if (def) {
137
+ cleared = await def.isCleared(tab).catch(() => false);
138
+ } else {
139
+ cleared = await pollForCfClearanceCookie(tab).catch(() => false);
140
+ }
141
+ if (cleared) {
142
+ log(`[greedysearch] ✅ ${engine} challenge cleared after ${elapsed}s — auto-resuming extraction.`);
143
+ return { cleared: true, signal: def ? "dom-marker" : "cookie" };
144
+ }
145
+ if (elapsed > 0 && elapsed % 30 === 0 && lastState !== elapsed) {
146
+ lastState = elapsed;
147
+ log(`[greedysearch] ⏳ Waiting for ${engine} challenge to clear (${elapsed}s/${Math.floor(timeoutMs / 1000)}s)...`);
148
+ }
149
+ await new Promise((r) => setTimeout(r, intervalMs));
150
+ }
151
+ return {
152
+ cleared: false,
153
+ reason: `Challenge not cleared within ${Math.floor(timeoutMs / 1000)}s`
154
+ };
155
+ }
156
+ export const CHALLENGE_ENGINES = Object.keys(ENGINE_SIGNALS);