@duckmind/dm-darwin-x64 0.52.3 → 0.52.6
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.
- package/dm +0 -0
- package/extensions/.dm-extensions.json +6 -3
- package/extensions/greedysearch-dm/bin/gschrome.mjs +5 -7
- package/extensions/greedysearch-dm/bin/launch-visible.mjs +2 -4
- package/extensions/greedysearch-dm/bin/launch.mjs +11 -5
- package/extensions/greedysearch-dm/bin/search.mjs +122 -120
- package/extensions/greedysearch-dm/extractors/consensus.mjs +43 -43
- package/extensions/greedysearch-dm/extractors/gemini.mjs +44 -44
- package/extensions/greedysearch-dm/extractors/logically.mjs +41 -41
- package/extensions/greedysearch-dm/index.js +18 -18
- package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +8 -9
- package/extensions/greedysearch-dm/src/search/chrome.mjs +25 -25
- package/extensions/greedysearch-dm/src/search/constants.mjs +8 -8
- package/extensions/greedysearch-dm/src/search/engines.mjs +9 -9
- package/extensions/greedysearch-dm/src/search/fetch-source.mjs +49 -49
- package/extensions/greedysearch-dm/src/search/launcher-paths.mjs +3 -0
- package/extensions/greedysearch-dm/src/search/partial-output.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/port-pid.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/recovery.mjs +1 -1
- package/extensions/greedysearch-dm/src/search/research.mjs +101 -101
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +11 -11
- package/extensions/greedysearch-dm/src/search/synthesis.mjs +10 -10
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +18 -18
- package/extensions/greedysearch-dm/src/tools/shared.js +9 -9
- package/package.json +1 -1
package/dm
CHANGED
|
Binary file
|
|
@@ -383,9 +383,12 @@
|
|
|
383
383
|
"src/search/engines.mjs",
|
|
384
384
|
"src/search/fetch-source.mjs",
|
|
385
385
|
"src/search/file-sources.mjs",
|
|
386
|
+
"src/search/launcher-paths.mjs",
|
|
386
387
|
"src/search/output.mjs",
|
|
388
|
+
"src/search/partial-output.mjs",
|
|
387
389
|
"src/search/paths.mjs",
|
|
388
390
|
"src/search/pdf.mjs",
|
|
391
|
+
"src/search/port-pid.mjs",
|
|
389
392
|
"src/search/query.mjs",
|
|
390
393
|
"src/search/recovery.mjs",
|
|
391
394
|
"src/search/research.mjs",
|
|
@@ -401,9 +404,9 @@
|
|
|
401
404
|
"src/utils/node-runtime.mjs",
|
|
402
405
|
"src/utils/system-cmds.mjs"
|
|
403
406
|
],
|
|
404
|
-
"file_count":
|
|
405
|
-
"before_bytes":
|
|
406
|
-
"after_bytes":
|
|
407
|
+
"file_count": 56,
|
|
408
|
+
"before_bytes": 505996,
|
|
409
|
+
"after_bytes": 814429,
|
|
407
410
|
"externals": [
|
|
408
411
|
"@duckmind/dm-agent-core",
|
|
409
412
|
"@duckmind/dm-ai",
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
`)[0]):null}catch{return null}}function f(){let o=m(e);if(!o)return!1;try{if(_()==="win32")c(`taskkill /F /PID ${o}`,{stdio:"ignore"});else process.kill(o,"SIGKILL");return!0}catch{return!1}}function H(){for(let o of[h,l])try{Y(o)}catch{}}async function U(){let{ok:o,body:r}=await probe();if(!o){console.log("Not running.");return}let C=u(l)?k(l,"utf8").trim():"unknown",a=u(h)?k(h,"utf8").trim():"none",n=m(e)||"unknown",{Browser:s}=JSON.parse(r);console.log(`Running: ${s}`),console.log(` Mode: ${C}`),console.log(` Port: ${e}`),console.log(` PID file: ${a}`),console.log(` PID actual:${n}`)}async function K(){let{ok:o}=await probe();if(!o){console.log("Not running — nothing to kill."),H();return}console.log("Killing browser on port 9222..."),f(),H(),await new Promise((C)=>setTimeout(C,1500));let{ok:r}=await probe();console.log(r?"FAILED — still running.":"Killed.")}async function R(o){let{ok:r}=await probe();if(r){let A=u(l)?k(l,"utf8").trim():"unknown";if(A===o){console.log(`Already running in ${o} mode.`);return}console.log(`${A} browser running — killing to switch to ${o}...`),f(),H(),await new Promise((i)=>setTimeout(i,1500))}if(!(process.env.CHROME_PATH||findChrome()))console.error("Chrome not found."),process.exit(1);let a=o==="headless",n=[`--remote-debugging-port=${e}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled","--window-size=1920,1080",`--user-data-dir=${p}`,"--profile-directory=Default"];if(a){if(n.push("--headless=new","--disable-gpu","--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"),_()==="win32")n.push("--disable-software-rasterizer")}n.push("about:blank"),x(p,{recursive:!0}),console.log(`Launching ${o} ${browser.label} on port ${e}...`);let s=g(browser.path,n,{detached:!0,stdio:"ignore"});s.unref(),B(h,String(s.pid)),B(l,o);for(let A=0;A<30;A++){await new Promise((t)=>setTimeout(t,500));let{ok:i}=await probe();if(i){try{let{body:t}=await probe(),{webSocketDebuggerUrl:W}=JSON.parse(t),G=new URL(W).pathname;B(`${p}/DevToolsActivePort`,`${e}
|
|
4
|
-
${G}`)}catch{}console.log("Ready.");return}}console.error("Timeout — Chrome did not become ready."),process.exit(1)}var T=process.argv[2];switch(T){case"launch-headless":await R("headless");break;case"launch-visible":await R("visible");break;case"kill":await K();break;case"status":await U();break;default:console.log(`Usage: node bin/gschrome.mjs <command>
|
|
2
|
+
import{spawn as T}from"node:child_process";import{basename as Q}from"node:path";function H(q=process.env,z=process.execPath){let E=q.GREEDY_SEARCH_NODE||q.NODE_BINARY||q.NODE;if(E?.trim())return E.trim();let F=Q(z||"").toLowerCase();if(F==="node"||F==="node.exe")return z;return"node"}var V=new URL("./launch.mjs",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),K=process.argv[2],O={"launch-headless":["--headless"],"launch-visible":[],kill:["--kill"],status:["--status"]}[K];if(!O)process.stderr.write(`Usage: node bin/gschrome.mjs <command>
|
|
5
3
|
|
|
6
4
|
Commands:
|
|
7
|
-
launch-headless Start headless
|
|
8
|
-
launch-visible Start visible
|
|
9
|
-
kill
|
|
5
|
+
launch-headless Start a headless browser on GREEDY_SEARCH_PORT
|
|
6
|
+
launch-visible Start a visible browser on GREEDY_SEARCH_PORT
|
|
7
|
+
kill Stop the owned GreedySearch browser
|
|
10
8
|
status Show running status
|
|
11
|
-
`),process.exit(1)
|
|
9
|
+
`),process.exit(2);var W=T(H(),[V,...O],{stdio:"inherit",env:K==="launch-visible"?{...process.env,GREEDY_SEARCH_VISIBLE:"1"}:process.env});W.on("close",(q)=>process.exit(q??0));
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
|
|
4
|
-
`}function KC(C,A){o(s(C),{recursive:!0});let _=`${C}.tmp-${process.pid}`;U(_,HC(A),"utf8");try{n(C)}catch{}r(_,C)}async function P({activePortFile:C,modeFile:A,env:_=process.env,excludePorts:R=[],autoPorts:B=x}={}){if(!y(_))return null;let O=await OC({env:_,excludePorts:R,autoPorts:B});if(!O)return null;if(KC(C,O),A)U(A,"existing","utf8");return O}function WC(C){return String(C||"").trim()==="existing"}function X(C,A){if(!A||!h(A))return!1;if(!WC(J(A,"utf8")))return!1;return!!C&&h(C)}var E=9222,f=I(g(),"greedysearch-chrome-profile"),G=I(f,"DevToolsActivePort"),z=I(g(),"greedysearch-chrome.pid"),b=I(g(),"greedysearch-chrome-mode");function j(){if(!EC(z))return!1;let C=Number.parseInt(u(z,"utf8").trim(),10);if(!C)return!1;try{return process.kill(C,0),C}catch{return!1}}function k(C){try{if(p()==="win32"){let _=c("netstat -ano -p TCP 2>nul",{encoding:"utf8"}),R=new RegExp(String.raw`TCP\s+[^\s]*:${C}\s+[^\s]*:0\s+LISTENING\s+(\d+)`,"i"),B=_.match(R);return B?Number.parseInt(B[1],10):null}}catch{return null}}function Z(C){try{if(p()==="win32")c(`taskkill /F /PID ${C} /T`,{stdio:"ignore"});else process.kill(C,"SIGKILL");return!0}catch{return!1}}function T(C,A=1000){return new Promise((_)=>{let R=MC.get(C,(B)=>{let O="";B.on("data",(W)=>O+=W),B.on("end",()=>_({ok:B.statusCode===200,body:O}))});R.on("error",()=>_({ok:!1})),R.setTimeout(A,()=>{R.destroy(),_({ok:!1})})})}async function bC(C){try{let A=await T(`http://localhost:${C}/json/version`).then((H)=>JSON.parse(H.body)),R=(await T(`http://localhost:${C}/json/list`).then((H)=>JSON.parse(H.body))).find((H)=>H.type==="page")?.id;if(!R)return;let B=A.webSocketDebuggerUrl;if(typeof B!=="string")return;let O=new URL(B);if(O.hostname!=="localhost"&&O.hostname!=="127.0.0.1")return;if(!/^ws:\/\/localhost:\d+/.test(`ws://${O.host}`))return;let W=O.pathname,K=new WebSocket(`ws://localhost:${C}${W}`);await new Promise((H)=>{K.onopen=()=>K.send(JSON.stringify({id:1,method:"Browser.getWindowForTarget",params:{targetId:R}})),K.onmessage=(Y)=>{let M=JSON.parse(Y.data);if(M.id===1&&M.result?.windowId)K.send(JSON.stringify({id:2,method:"Browser.setWindowBounds",params:{windowId:M.result.windowId,bounds:{windowState:"minimized"}}}));else if(M.id===2)K.close(),H()},K.onerror=()=>{K.close(),H()},setTimeout(()=>{try{K.close()}catch{}H()},5000)})}catch{}}async function DC(C=15000){let A=Date.now()+C;while(Date.now()<A){let{ok:_,body:R}=await T(`http://localhost:${E}/json/version`,1500);if(_)try{let{webSocketDebuggerUrl:B}=JSON.parse(R),O=new URL(B).pathname;return $(G,`${E}
|
|
5
|
-
${O}`,"utf8"),!0}catch{}await new Promise((B)=>setTimeout(B,400))}return!1}function F(){let C=j();if(C)Z(C);let A=k(E);if(A&&A!==C)Z(A);try{D(z)}catch{}try{D(G)}catch{}try{D(b)}catch{}return new Promise((_)=>{let R=Date.now(),B=()=>{let O=k(E);if(!O)return _(!0);if(Date.now()-R>5000)return _(!1);Z(O),setTimeout(B,500)};B()})}async function LC(){let C=process.argv[2];if(C==="--kill"){if(X(G,b)){try{D(G)}catch{}try{D(b)}catch{}console.log("Detached from existing browser CDP endpoint; no browser process was killed.");return}await F(),console.log("Browser stopped.");return}if(C==="--status"){if(X(G,b)){try{let H=w(u(G,"utf8"));console.log(`Reusing existing browser — ${H}`)}catch{console.log("Reusing existing browser.")}return}let K=j()||k(E);if(K)console.log(`Running — pid ${K}, port ${E}`);else console.log("Not running.");return}let A=await P({activePortFile:G,modeFile:b,excludePorts:j()?[E]:[],autoPorts:j()?[9223]:[E,9223]});if(A){console.log(`Reusing existing browser CDP endpoint ${A.httpUrl} (${A.source}).`);return}console.log("Stopping any existing browser on port 9222..."),await F();let _=S();if(!_.path)console.error("CloakBrowser/Chrome not found. Set GREEDY_SEARCH_BROWSER_PATH, DM_CUA_BROWSER_PATH, DM_CUA_CLOAK_PATH, CLOAKBROWSER_BINARY_PATH, or CHROME_PATH."),process.exit(1);GC(f,{recursive:!0});let R=[`--remote-debugging-port=${E}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps",`--user-data-dir=${f}`,"--profile-directory=Default","--new-window","about:blank"];console.log("Launching visible Chrome...");let B=YC(_.path,R,{detached:!0,stdio:"ignore"});B.unref();let O=B.pid;if($(z,String(O)),$(b,"visible","utf8"),console.log(`Chrome PID: ${O}`),!await DC())console.error("Chrome did not become ready within 15s."),process.exit(1);await bC(E),console.log("Visible Chrome ready on port 9222."),console.log("Keep this terminal open to keep Chrome alive.")}LC();
|
|
2
|
+
import{spawn as Q}from"node:child_process";import{basename as O}from"node:path";function H(q=process.env,A=process.execPath){let E=q.GREEDY_SEARCH_NODE||q.NODE_BINARY||q.NODE;if(E?.trim())return E.trim();let F=O(A||"").toLowerCase();if(F==="node"||F==="node.exe")return A;return"node"}var T=new URL("./launch.mjs",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),z=process.argv[2]||"",K=[T];if(z==="--kill"||z==="--status")K.push(z);else if(z)process.stderr.write(`Usage: node bin/launch-visible.mjs [--kill|--status]
|
|
3
|
+
`),process.exit(2);var V=Q(H(),K,{stdio:"inherit",env:{...process.env,GREEDY_SEARCH_VISIBLE:"1"}});V.on("close",(q)=>process.exit(q??0));
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{execSync as
|
|
3
|
-
${
|
|
4
|
-
`}function
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import{execSync as KJ,spawn as iJ}from"node:child_process";import{existsSync as E,mkdirSync as aJ,readdirSync as tJ,readFileSync as m,unlinkSync as U,writeFileSync as w}from"node:fs";import qJ from"node:http";import{platform as c,tmpdir as VJ}from"node:os";import{join as f}from"node:path";import{existsSync as l,mkdirSync as UJ,readFileSync as L,renameSync as MJ,unlinkSync as bJ,writeFileSync as s}from"node:fs";import YJ from"node:http";import{platform as o}from"node:os";import{dirname as OJ}from"node:path";var d=[9222,9223],NJ=/^(0|false|no|off)$/i;function kJ(J){return[...new Set(J.filter(Boolean))]}function r(J,X="localhost"){let $=String(J||"").trim().split(/\r?\n/).map((W)=>W.trim()).filter(Boolean);if($.length===0)throw Error("empty DevToolsActivePort");let[Q,Z=""]=$;if(/^wss?:\/\//i.test(Q))return Q;if(Q.includes(":"))return`ws://${Q}${Z}`;return`ws://${X}:${Q}${Z}`}function n(J,X="explicit"){let $=new URL(J),Q=$.protocol==="wss:"?"wss:":"ws:",Z=$.port?Number.parseInt($.port,10):Q==="wss:"?443:80;return{source:X,wsUrl:`${Q}//${$.host}${$.pathname}${$.search}`,host:$.hostname,port:Z,path:`${$.pathname}${$.search}`,httpUrl:`http://${$.hostname}:${Z}`}}function i(J=process.env){return![J.GREEDY_SEARCH_REUSE_EXISTING_BROWSER,J.DM_CUA_REUSE_EXISTING_BROWSER].some((X)=>X!==void 0&&NJ.test(String(X)))}function S(J){let X=Number.parseInt(String(J??""),10);return Number.isInteger(X)&&X>0&&X<65536?X:null}function GJ(J){if(!J)return null;let X=String(J).trim();if(!X)return null;let $=new URL(X.includes("://")?X:`http://${X}`),Q=S($.port)||($.protocol==="https:"?443:80);return{host:$.hostname,port:Q,source:`env:${X}`}}function AJ(J){if(!J)return[];return String(J).split(/[,\s]+/).map(S).filter(Boolean)}function xJ({env:J=process.env,platformName:X=o(),procVersionText:$=null}={}){if(X!=="linux")return!1;if(J.WSL_DISTRO_NAME||J.WSL_INTEROP)return!0;let Q=$??(()=>{try{return L("/proc/version","utf8")}catch{return""}})();return/microsoft|wsl/i.test(Q)}function DJ({env:J=process.env,platformName:X=o(),procVersionText:$=null,resolvConfText:Q=null}={}){let Z=["localhost","127.0.0.1"];if(xJ({env:J,platformName:X,procVersionText:$})){let q=(Q??(()=>{try{return L("/etc/resolv.conf","utf8")}catch{return""}})()).match(/^\s*nameserver\s+([^\s#]+)/m);if(q)Z.push(q[1]);Z.push("host.docker.internal")}return kJ(Z)}function RJ({env:J=process.env,hosts:X=DJ({env:J}),autoPorts:$=d,excludePorts:Q=[]}={}){let Z=[];for(let z of["GREEDY_SEARCH_CDP_WS_URL","DM_CUA_CDP_WS_URL","CDP_WS_URL"])if(J[z])Z.push({wsUrl:J[z],source:`env:${z}`});for(let z of["GREEDY_SEARCH_CDP_URL","DM_CUA_CDP_URL","CDP_URL"])try{let V=GJ(J[z]);if(V)Z.push(V)}catch{}for(let z of["GREEDY_SEARCH_EXISTING_CDP_PORT","DM_CUA_EXISTING_CDP_PORT","GREEDY_SEARCH_CDP_PORT","DM_CUA_CDP_PORT"]){let V=S(J[z]);if(!V)continue;for(let O of X)Z.push({host:O,port:V,source:`env:${z}`})}let W=AJ(J.GREEDY_SEARCH_EXISTING_CDP_PORTS);for(let z of W)for(let V of X)Z.push({host:V,port:z,source:"env:GREEDY_SEARCH_EXISTING_CDP_PORTS"});let q=new Set(Q.filter(Boolean));if(i(J))for(let z of $){if(q.has(z))continue;for(let V of X)Z.push({host:V,port:z,source:"auto"})}let K=new Set;return Z.filter((z)=>{let V=z.wsUrl||`${z.host}:${z.port}`;if(K.has(V))return!1;return K.add(V),!0})}async function TJ(J,{timeoutMs:X=700}={}){if(J.wsUrl)return n(J.wsUrl,J.source);let $=J.host||"localhost",Q=J.port;if(!Q)return null;let Z=await new Promise((W)=>{let q=YJ.get({host:$,port:Q,path:"/json/version",timeout:X},(K)=>{let z="";K.setEncoding("utf8"),K.on("data",(V)=>z+=V),K.on("end",()=>W(K.statusCode===200?z:null))});q.on("error",()=>W(null)),q.setTimeout(X,()=>{q.destroy(),W(null)})});if(!Z)return null;try{let W=JSON.parse(Z);if(!W.webSocketDebuggerUrl)return null;let q=n(W.webSocketDebuggerUrl,J.source),K=q.path||new URL(W.webSocketDebuggerUrl).pathname;return{...q,host:$,port:Q,httpUrl:`http://${$}:${Q}`,wsUrl:`ws://${$}:${Q}${K}`,path:K}}catch{return null}}async function gJ(J={}){for(let X of RJ(J)){let $=await TJ(X,J);if($)return $}return null}function CJ(J){if(!J)throw Error("missing CDP endpoint");let X=new URL(J.wsUrl);return`${X.host}
|
|
3
|
+
${X.pathname}${X.search}
|
|
4
|
+
`}function wJ(J,X){UJ(OJ(J),{recursive:!0});let $=`${J}.tmp-${process.pid}`;s($,CJ(X),"utf8");try{bJ(J)}catch{}MJ($,J)}async function a({activePortFile:J,modeFile:X,env:$=process.env,excludePorts:Q=[],autoPorts:Z=d}={}){if(!i($))return null;let W=await gJ({env:$,excludePorts:Q,autoPorts:Z});if(!W)return null;if(wJ(J,W),X)s(X,"existing","utf8");return W}function fJ(J){return String(J||"").trim()==="existing"}function y(J,X){if(!X||!l(X))return!1;if(!fJ(L(X,"utf8")))return!1;return!!J&&l(J)}import{existsSync as T,mkdirSync as hJ,readFileSync as e,writeFileSync as LJ}from"node:fs";import{homedir as SJ}from"node:os";import{join as JJ}from"node:path";import{tmpdir as g}from"node:os";function yJ(J,X=9222){let $=Number.parseInt(String(J??""),10);return Number.isInteger($)&&$>1024&&$<65535?$:X}var k=yJ(process.env.GREEDY_SEARCH_PORT,9222),G=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${g().replaceAll("\\","/")}/greedysearch-chrome-profile`).replaceAll("\\","/"),NX=`${G}/DevToolsActivePort`,kX=`${g().replaceAll("\\","/")}/cdp-pages.json`,GX=process.env.GREEDY_SEARCH_MODE_FILE||`${g().replaceAll("\\","/")}/greedysearch-chrome-mode`,AX=`${g().replaceAll("\\","/")}/greedysearch-visible-recovery.jsonl`,I=JJ(SJ(),".dm"),j=JJ(I,"greedyconfig"),_=["perplexity","google","chatgpt"],F="gemini";function vJ(){try{if(T(j)){let J=e(j,"utf8"),X=JSON.parse(J);if(Array.isArray(X.engines)&&X.engines.length>0&&X.engines.every(($)=>typeof $==="string")){let $=X.engines.filter((Z)=>v[Z]),Q=X.engines.filter((Z)=>!v[Z]);if(Q.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${j}: ${Q.join(", ")}
|
|
5
|
+
[greedysearch] Available engines: ${Object.keys(v).join(", ")}
|
|
6
|
+
`);if($.length>0)return $;process.stderr.write(`[greedysearch] Warning: no valid engines in ${j}, falling back to defaults: ${_.join(", ")}
|
|
7
|
+
`)}}}catch{}return _}function IJ(){try{if(!T(I))hJ(I,{recursive:!0});if(!T(j))LJ(j,JSON.stringify({engines:_,synthesizer:F},null,2)+`
|
|
8
|
+
`,"utf8")}catch{}}IJ();var t=["gemini","chatgpt"];function _J(){try{if(T(j)){let J=e(j,"utf8"),X=JSON.parse(J);if(typeof X.synthesizer==="string"){let $=X.synthesizer.toLowerCase();if(t.includes($))return $;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${X.synthesizer}" in ${j}
|
|
9
|
+
[greedysearch] Available synthesizers: ${t.join(", ")}
|
|
10
|
+
[greedysearch] Falling back to default: ${F}
|
|
11
|
+
`)}}}catch{}return F}var v={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"},xX=vJ();var DX=_J(),RX=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=G;import{execFileSync as $J,execSync as IX}from"node:child_process";import{platform as nJ,tmpdir as sJ}from"node:os";import{execFileSync as PJ}from"node:child_process";import{platform as uJ}from"node:os";import{existsSync as XJ}from"node:fs";import{platform as FJ}from"node:os";import{join as M}from"node:path";function A(J){let X=FJ()==="win32",$=process.env.SystemRoot||"C:\\Windows",Q={win32:{powershell:M($,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:M($,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:M($,"System32","netstat.exe"),taskkill:M($,"System32","taskkill.exe"),tasklist:M($,"System32","tasklist.exe"),cmd:M($,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},Z=X?Q.win32:Q.unix,W=J.toLowerCase();if(Z[W]&&XJ(Z[W]))return Z[W];if(X&&W==="netstat"){let q=M($,"Sysnative","netstat.exe");if(XJ(q))return q}return J}function EJ(J,X){return PJ(A(J),X,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function mJ(J){let X=String(J||"").match(/\b(\d+)\b/);return X?Number.parseInt(X[1],10):null}function cJ(J){return mJ(J)}function pJ(J,X){for(let $ of String(J||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test($))continue;if(!$.trim().split(/\s+/).slice(0,6).some((W)=>W.endsWith(`:${X}`)))continue;let Z=$.match(/\bpid=(\d+)\b/);if(Z)return Number.parseInt(Z[1],10)}return null}function lJ(J,X){for(let $ of String(J||"").split(/\r?\n/)){let Q=$.trim().split(/\s+/);if(Q.length<5||Q[0].toUpperCase()!=="TCP")continue;if(!Q.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!Q[1].endsWith(`:${X}`))continue;let W=Number.parseInt(Q.at(-1),10);if(Number.isInteger(W)&&W>0)return W}return null}function P(J,X,$){try{return J(X,$)}catch{return null}}function u(J,{platformName:X=uJ(),run:$=EJ}={}){if(X==="win32")return lJ(P($,"netstat",["-ano","-p","TCP"]),J);let Q=P($,"lsof",["-nP",`-iTCP:${J}`,"-sTCP:LISTEN","-t"]),Z=cJ(Q);if(Z)return Z;if(X!=="linux")return null;return pJ(P($,"ss",["-ltnp"]),J)}var x=sJ().replaceAll("\\","/"),EX=`${x}/greedysearch-chrome-metadata.json`,mX=`${x}/greedysearch-chrome-launch.lock`;var cX=`${x}/greedysearch-chrome.pid`,pX=`${x}/greedysearch-chrome-mode`,lX=`${x}/greedysearch-chrome-last-activity`;function oJ(J){if(!Number.isInteger(J)||J<=0)return!1;try{return process.kill(J,0),!0}catch{return!1}}function dJ(J){if(!oJ(J))return null;try{if(nJ()==="win32")return $J(A("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${J}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return $J(A("ps"),["-p",String(J),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function rJ(J,X,$=k){if(!J)return!1;let Q=(q)=>String(q||"").replaceAll("\\","/").toLowerCase(),Z=Q(J),W=Q(X);return Z.includes(W)&&Z.includes(`--remote-debugging-port=${$}`)&&!Z.includes("--type=")}function C(J,X,$=k){return rJ(dJ(J),X,$)}var nX=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5;var B=k,N=G,b=f(N,"DevToolsActivePort"),Y=process.env.GREEDY_SEARCH_PID_FILE||f(VJ(),"greedysearch-chrome.pid"),H=process.env.GREEDY_SEARCH_MODE_FILE||f(VJ(),"greedysearch-chrome-mode");function BJ(J){return J.find((X)=>X&&E(X))||null}function QJ(){let J=c();return BJ(J==="win32"?["C:/Program Files/CloakBrowser/CloakBrowser.exe","C:/Program Files (x86)/CloakBrowser/CloakBrowser.exe"]:J==="darwin"?["/Applications/CloakBrowser.app/Contents/MacOS/CloakBrowser","/Applications/Cloak Browser.app/Contents/MacOS/CloakBrowser"]:["/usr/bin/cloakbrowser","/usr/local/bin/cloakbrowser","/opt/CloakBrowser/CloakBrowser"])}function ZJ(){let J=c();return BJ(J==="win32"?["C:/Program Files/Google/Chrome/Application/chrome.exe","C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"]:J==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium"]:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium-browser","/usr/bin/chromium","/snap/bin/chromium"])}function eJ(){let J=(process.env.GREEDY_SEARCH_BROWSER||process.env.DM_CUA_BROWSER||"auto").toLowerCase(),X=process.env.GREEDY_SEARCH_BROWSER_PATH||process.env.DM_CUA_BROWSER_PATH||process.env.DM_CUA_CLOAK_PATH||process.env.CLOAKBROWSER_BINARY_PATH||process.env.CHROME_PATH;if(X){let Q=X===process.env.DM_CUA_CLOAK_PATH||X===process.env.CLOAKBROWSER_BINARY_PATH,Z=X===process.env.CHROME_PATH;return{path:X,label:J==="chrome"||Z?"Chrome":J==="cloak"||Q?"CloakBrowser":"browser"}}if(J==="cloak")return{path:QJ(),label:"CloakBrowser"};if(J==="chrome")return{path:ZJ(),label:"Chrome"};let $=QJ();return{path:$||ZJ(),label:$?"CloakBrowser":"Chrome"}}var R=()=>process.env.GREEDY_SEARCH_VISIBLE!=="1",JX=[`--remote-debugging-port=${B}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled",`--user-data-dir=${N}`,"--profile-directory=Default","--window-size=1920,1080","--lang=en-US","--force-color-profile=srgb","--disable-background-timer-throttling","--disable-renderer-backgrounding","--disable-backgrounding-occluded-windows"];function XX(J){try{let X=f(J,".."),Q=tJ(X).find((Z)=>/^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(Z));if(Q)return Q.split(".")[0]}catch{}try{let $=KJ(`"${J}" --version`,{encoding:"utf8",timeout:5000}).trim().match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);if($)return $[1]}catch{}return null}function $X(J){let X=[...JX];if(R()){X.push("--headless=new");let $=XX(J)||"136";X.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${$}.0.0.0 Safari/537.36`)}return X.push("about:blank"),X}var QX=()=>process.env.GREEDY_SEARCH_VISIBLE==="1";function ZX(){try{if(!E(H))return!0;return m(H,"utf8").trim()==="headless"}catch{return!0}}async function WX(){if(R())return;try{let J=await new Promise((q,K)=>{qJ.get(`http://localhost:${B}/json/version`,(z)=>{let V="";z.on("data",(O)=>V+=O),z.on("end",()=>q(JSON.parse(V)))}).on("error",K)}),X=new URL(J.webSocketDebuggerUrl).pathname,$=globalThis.WebSocket;if(!$)return;let Q=new $(`ws://localhost:${B}${X}`),Z=0,W=new Map;Q.onopen=()=>{let q=++Z;W.set(q,{resolve:(K)=>{let V=(K.targetInfos||[]).find((h)=>h.type==="page");if(!V){Q.close();return}let O=++Z;W.set(O,{resolve:(h)=>{let HJ=h.windowId,p=++Z;W.set(p,{resolve:()=>{},reject:()=>{}}),Q.send(JSON.stringify({id:p,method:"Browser.setWindowBounds",params:{windowId:HJ,bounds:{windowState:"minimized"}}})),setTimeout(()=>Q.close(),500)},reject:()=>Q.close()}),Q.send(JSON.stringify({id:O,method:"Browser.getWindowForTarget",params:{targetId:V.targetId}}))},reject:()=>Q.close()}),Q.send(JSON.stringify({id:q,method:"Target.getTargets",params:{}}))},Q.onmessage=(q)=>{let K=JSON.parse(q.data);if(K.id&&W.has(K.id)){let{resolve:z,reject:V}=W.get(K.id);if(W.delete(K.id),K.error)V?.(K.error);else z?.(K.result)}},setTimeout(()=>Q.close(),5000)}catch{}}function D(){if(!E(Y))return!1;let J=Number.parseInt(m(Y,"utf8").trim(),10);if(!J)return!1;try{return process.kill(J,0),C(J,N,B)?J:!1}catch{return!1}}function jJ(J){return u(J)}function WJ(J){try{if(c()==="win32")KJ(`taskkill /F /T /PID ${J}`,{stdio:"ignore"});else process.kill(J,"SIGTERM");return!0}catch{return!1}}function zX(){let J=jJ(B);if(!J)return!0;let X=D();if(X&&J===X)return!0;if(C(J,N,B))return w(Y,String(J),"utf8"),!0;return console.error(`Browser/CDP port ${B} is owned by unverified pid ${J}; refusing to kill it. Set GREEDY_SEARCH_PORT to a free port.`),!1}function KX(J,X=1000){return new Promise(($)=>{let Q=qJ.get(J,(Z)=>{let W="";Z.on("data",(q)=>W+=q),Z.on("end",()=>$({ok:Z.statusCode===200,body:W}))});Q.on("error",()=>$({ok:!1})),Q.setTimeout(X,()=>{Q.destroy(),$({ok:!1})})})}async function zJ(J=15000){let X=Date.now()+J;while(Date.now()<X){let{ok:$,body:Q}=await KX(`http://localhost:${B}/json/version`,1500);if($)try{let{webSocketDebuggerUrl:Z}=JSON.parse(Q),W=new URL(Z).pathname;return w(b,`${B}
|
|
12
|
+
${W}`,"utf8"),!0}catch{}await new Promise((Z)=>setTimeout(Z,400))}return!1}async function qX(){let J=process.argv[2];if(J==="--kill"){if(y(b,H)){try{U(b)}catch{}try{U(H)}catch{}console.log("Detached from existing browser CDP endpoint; no browser process was killed.");return}let K=jJ(B),z=D()||(K&&C(K,N,B)?K:null);if(z){let V=WJ(z);console.log(V?`Stopped browser (pid ${z}).`:`Failed to stop pid ${z}.`)}else console.log("GreedySearch browser is not running.");try{U(Y)}catch{}try{U(b)}catch{}try{U(H)}catch{}return}if(J==="--status"){if(y(b,H)){try{let z=r(m(b,"utf8"));console.log(`Reusing existing browser — ${z}`)}catch{console.log("Reusing existing browser.")}return}let K=D();if(K)console.log(`Running — pid ${K}, port ${B}`);else console.log("Not running.");return}if(!zX())process.exit(1);let X=D(),$=await a({activePortFile:b,modeFile:H,excludePorts:X?[B]:[],autoPorts:X?[9223]:[B,9223]});if($){console.log(`Reusing existing browser CDP endpoint ${$.httpUrl} (${$.source}).`);return}let Q=D();if(Q)if(process.env.GREEDY_SEARCH_VISIBLE==="1"&&!process.argv.includes("--headless")&&ZX()){console.log(`Headless browser running (pid ${Q}) but visible requested — killing...`),WJ(Q);try{U(Y)}catch{}try{U(H)}catch{}}else{if(await zJ(5000)){console.log(`GreedySearch browser already running (pid ${Q}).`);return}console.log(`Stale PID ${Q} — launching fresh.`);try{U(Y)}catch{}}let Z=eJ();if(!Z.path)console.error("CloakBrowser/Chrome not found. Set GREEDY_SEARCH_BROWSER_PATH, DM_CUA_BROWSER_PATH, DM_CUA_CLOAK_PATH, CLOAKBROWSER_BINARY_PATH, or CHROME_PATH."),process.exit(1);if(aJ(N,{recursive:!0}),console.log(`Launching GreedySearch ${Z.label} on port ${B}...`),R())console.log("Headless mode — no window will be shown");else if(!QX())console.log("Window will be minimized");let W=iJ(Z.path,$X(Z.path),{detached:!0,stdio:"ignore"});if(W.unref(),w(Y,String(W.pid)),w(H,R()?"headless":"visible","utf8"),!await zJ())console.error(`${Z.label} did not become ready within 15s.`),process.exit(1);if(R())console.log("Ready (headless).");else await WX(),console.log("Ready.")}qX();
|