@duckmind/dm-darwin-arm64 0.52.3 → 0.53.1
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 +15 -8
- package/extensions/dm-cua/bin/browser-cua.mjs +6 -6
- package/extensions/dm-cua/index.js +5 -5
- package/extensions/dm-cua/src/browser-cua-lib.mjs +2 -2
- package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +8 -1
- package/extensions/greedysearch-dm/bin/cdp-headless.mjs +1 -1
- package/extensions/greedysearch-dm/bin/cdp-visible.mjs +1 -1
- package/extensions/greedysearch-dm/bin/cdp.mjs +29 -20
- package/extensions/greedysearch-dm/bin/gschrome.mjs +1 -10
- package/extensions/greedysearch-dm/bin/kill-visible.mjs +1 -1
- package/extensions/greedysearch-dm/bin/launch-visible.mjs +1 -4
- package/extensions/greedysearch-dm/bin/launch.mjs +9 -5
- package/extensions/greedysearch-dm/bin/mcp.mjs +375 -0
- package/extensions/greedysearch-dm/bin/search.mjs +310 -156
- package/extensions/greedysearch-dm/bin/visible.mjs +1 -1
- package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +205 -68
- package/extensions/greedysearch-dm/extractors/chatgpt.mjs +229 -140
- package/extensions/greedysearch-dm/extractors/common.mjs +160 -50
- package/extensions/greedysearch-dm/extractors/consensus.mjs +225 -92
- package/extensions/greedysearch-dm/extractors/consent.mjs +44 -17
- package/extensions/greedysearch-dm/extractors/gemini.mjs +275 -136
- package/extensions/greedysearch-dm/extractors/google-ai.mjs +172 -64
- package/extensions/greedysearch-dm/extractors/logically.mjs +183 -69
- package/extensions/greedysearch-dm/extractors/perplexity.mjs +331 -65
- package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +118 -41
- package/extensions/greedysearch-dm/index.js +20 -17
- package/extensions/greedysearch-dm/package.json +8 -3
- package/extensions/greedysearch-dm/skills/greedy-search/skill.md +8 -8
- package/extensions/greedysearch-dm/src/fetcher.mjs +2 -2
- package/extensions/greedysearch-dm/src/formatters/results.js +8 -6
- package/extensions/greedysearch-dm/src/github.mjs +7 -7
- package/extensions/greedysearch-dm/src/reddit.mjs +1 -1
- package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +10 -9
- package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +48 -0
- package/extensions/greedysearch-dm/src/search/chrome.mjs +129 -53
- 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 +154 -77
- package/extensions/greedysearch-dm/src/search/minimize.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/paths.mjs +1 -1
- package/extensions/greedysearch-dm/src/search/pdf.mjs +1 -1
- package/extensions/greedysearch-dm/src/search/port-pid.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/progress.mjs +2 -0
- package/extensions/greedysearch-dm/src/search/recovery.mjs +1 -1
- package/extensions/greedysearch-dm/src/search/research.mjs +262 -167
- package/extensions/greedysearch-dm/src/search/scale-aware.mjs +11 -0
- package/extensions/greedysearch-dm/src/search/simple-research.mjs +827 -0
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +11 -11
- package/extensions/greedysearch-dm/src/search/synthesis.mjs +11 -11
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +23 -20
- package/extensions/greedysearch-dm/src/tools/shared.js +10 -9
- package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +1 -1
- package/package.json +1 -1
- package/extensions/greedysearch-dm/src/search/cdp-endpoint.mjs +0 -3
- package/extensions/greedysearch-dm/src/utils/browser-executable.mjs +0 -1
|
@@ -1,11 +1,2 @@
|
|
|
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>
|
|
5
|
-
|
|
6
|
-
Commands:
|
|
7
|
-
launch-headless Start headless Chrome on port 9222
|
|
8
|
-
launch-visible Start visible Chrome on port 9222
|
|
9
|
-
kill Kill Chrome on port 9222 (headless or visible)
|
|
10
|
-
status Show running status
|
|
11
|
-
`),process.exit(1)}
|
|
2
|
+
import{spawn as a}from"node:child_process";import{fileURLToPath as e}from"node:url";import{basename as c}from"node:path";function u(s=process.env,i=process.execPath){let o=s.GREEDY_SEARCH_NODE||s.NODE_BINARY||s.NODE;if(o?.trim())return o.trim();let r=c(i||"").toLowerCase();if(r==="node"||r==="node.exe")return i;return"node"}var m=process.argv[2]||"status",n=e(new URL("./launch.mjs",import.meta.url)),p={"launch-headless":{args:[],visible:!1},"launch-visible":{args:[],visible:!0},kill:{args:["--kill"],visible:null},status:{args:["--status"],visible:null}},l=p[m];if(!l)console.error("Usage: gschrome.mjs launch-headless|launch-visible|kill|status"),process.exit(2);var t={...process.env};if(l.visible===!0)t.GREEDY_SEARCH_VISIBLE="1";if(l.visible===!1)delete t.GREEDY_SEARCH_VISIBLE;var E=a(u(),[n,...l.args],{stdio:"inherit",env:t});E.on("exit",(s,i)=>{if(i)process.kill(process.pid,i);process.exit(s??1)});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as
|
|
2
|
+
import{spawn as J}from"node:child_process";import{basename as H}from"node:path";function F(k=process.env,q=process.execPath){let z=k.GREEDY_SEARCH_NODE||k.NODE_BINARY||k.NODE;if(z?.trim())return z.trim();let E=H(q||"").toLowerCase();if(E==="node"||E==="node.exe")return q;return"node"}var K=new URL("./launch-visible.mjs",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),L=J(F(),[K,"--kill"],{stdio:"inherit"});L.on("close",(k)=>process.exit(k??0));
|
|
@@ -1,5 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
${A.pathname}${A.search}
|
|
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 m}from"node:child_process";import{fileURLToPath as E}from"node:url";import{basename as t}from"node:path";function s(o=process.env,i=process.execPath){let p=o.GREEDY_SEARCH_NODE||o.NODE_BINARY||o.NODE;if(p?.trim())return p.trim();let r=t(i||"").toLowerCase();if(r==="node"||r==="node.exe")return i;return"node"}var R=E(new URL("./launch.mjs",import.meta.url)),L=m(s(),[R,...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,GREEDY_SEARCH_VISIBLE:"1"}});L.on("exit",(o,i)=>{if(i)process.kill(process.pid,i);process.exit(o??1)});
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{execSync as
|
|
3
|
-
${
|
|
4
|
-
`
|
|
5
|
-
`)
|
|
6
|
-
|
|
2
|
+
import{execFileSync as T,execSync as zt,spawn as gt}from"node:child_process";import{existsSync as o,mkdirSync as xt,readdirSync as jt,readFileSync as _,unlinkSync as U,writeFileSync as A}from"node:fs";import{platform as c,tmpdir as Wu}from"node:os";import{join as kt}from"node:path";import E from"node:http";function x(t,u=1000){return new Promise((f)=>{let $=E.get(t,(b)=>{let J="";b.on("data",(q)=>J+=q),b.on("end",()=>f({ok:b.statusCode===200,body:J}))});$.on("error",()=>f({ok:!1})),$.setTimeout(u,()=>{$.destroy(),f({ok:!1})})})}async function p(t){try{let u=await x(`http://localhost:${t}/json/version`);if(!u.ok)return;let f=JSON.parse(u.body),$=await x(`http://localhost:${t}/json/list`);if(!$.ok)return;let J=JSON.parse($.body).find((h)=>h.type==="page")?.id;if(!J)return;let q=f.webSocketDebuggerUrl;if(typeof q!=="string")return;let g=new URL(q);if(g.hostname!=="localhost"&&g.hostname!=="127.0.0.1")return;if(!/^ws:\/\/localhost:\d+/.test(`ws://${g.host}`))return;let n=new WebSocket(`ws://localhost:${t}${g.pathname}`);await new Promise((h)=>{let a=!1,I=setTimeout(()=>V(),5000),V=()=>{if(a)return;a=!0,clearTimeout(I);try{n.close()}catch{}h()};n.onopen=()=>{try{n.send(JSON.stringify({id:1,method:"Browser.getWindowForTarget",params:{targetId:J}}))}catch{V()}},n.onmessage=(i)=>{try{let w=JSON.parse(i.data);if(w.id===1&&w.result?.windowId)n.send(JSON.stringify({id:2,method:"Browser.setWindowBounds",params:{windowId:w.result.windowId,bounds:{windowState:"minimized"}}}));else if(w.id===2)V();else if(w.id===1)V()}catch{V()}},n.onerror=V})}catch{}}import{existsSync as j,mkdirSync as tt,readFileSync as y,writeFileSync as ut}from"node:fs";import{homedir as ft}from"node:os";import{join as m}from"node:path";import{tmpdir as $t}from"node:os";function bt(t,u=9222){let f=Number.parseInt(String(t??""),10);return Number.isInteger(f)&&f>1024&&f<65535?f:u}var Jt=$t().replaceAll("\\","/"),G=bt(process.env.GREEDY_SEARCH_PORT),W=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${Jt}/greedysearch-chrome-profile`).replaceAll("\\","/"),S=`${W}/DevToolsActivePort`,L=process.env.GREEDY_SEARCH_PID_FILE||`${W}/browser.pid`,mt=process.env.CDP_PAGES_CACHE||`${W}/cdp-pages.json`,O=process.env.GREEDY_SEARCH_MODE_FILE||`${W}/browser-mode`,Gt=process.env.GREEDY_SEARCH_METADATA_FILE||`${W}/browser-metadata.json`,St=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${W}/browser-launch.lock`,Lt=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${W}/browser-last-activity`,Ot=(process.env.CDP_SOCKET_DIR||`${W}/cdp-sockets`).replaceAll("\\","/"),Dt=`${W}/visible-recovery.jsonl`,r=m(ft(),".dm"),K=m(r,"greedyconfig"),Y=["perplexity","google","chatgpt","gemini"],N="gemini";function Wt(){try{if(j(K)){let t=y(K,"utf8"),u=JSON.parse(t);if(Array.isArray(u.engines)&&u.engines.length>0&&u.engines.every((f)=>typeof f==="string")){let f=u.engines.filter((b)=>M[b]),$=u.engines.filter((b)=>!M[b]);if($.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${K}: ${$.join(", ")}
|
|
3
|
+
[greedysearch] Available engines: ${Object.keys(M).join(", ")}
|
|
4
|
+
`);if(f.length>0)return f;process.stderr.write(`[greedysearch] Warning: no valid engines in ${K}, falling back to defaults: ${Y.join(", ")}
|
|
5
|
+
`)}}}catch{}return Y}function qt(){try{if(!j(r))tt(r,{recursive:!0});if(!j(K))ut(K,JSON.stringify({engines:Y,synthesizer:N},null,2)+`
|
|
6
|
+
`,"utf8")}catch{}}qt();var l=["gemini","chatgpt"];function Qt(){try{if(j(K)){let t=y(K,"utf8"),u=JSON.parse(t);if(typeof u.synthesizer==="string"){let f=u.synthesizer.toLowerCase();if(l.includes(f))return f;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${u.synthesizer}" in ${K}
|
|
7
|
+
[greedysearch] Available synthesizers: ${l.join(", ")}
|
|
8
|
+
[greedysearch] Falling back to default: ${N}
|
|
9
|
+
`)}}}catch{}return N}var M={perplexity:"perplexity.mjs",p:"perplexity.mjs",bing:"bing-copilot.mjs",b:"bing-copilot.mjs",google:"google-ai.mjs",g:"google-ai.mjs",gemini:"gemini.mjs",gem:"gemini.mjs",chatgpt:"chatgpt.mjs",gpt:"chatgpt.mjs","semantic-scholar":"semantic-scholar.mjs",semanticscholar:"semantic-scholar.mjs",s2:"semantic-scholar.mjs",logically:"logically.mjs",log:"logically.mjs"},et=Wt();var Pt=Qt(),Ft=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=W;import{execFileSync as Bt}from"node:child_process";import{platform as Xt}from"node:os";import{existsSync as D}from"node:fs";import{platform as Kt}from"node:os";import{join as B}from"node:path";function Z(t){let u=Kt()==="win32",f=process.env.SystemRoot||"C:\\Windows",$={win32:{powershell:B(f,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:B(f,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:B(f,"System32","netstat.exe"),taskkill:B(f,"System32","taskkill.exe"),tasklist:B(f,"System32","tasklist.exe"),cmd:B(f,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},b=u?$.win32:$.unix,J=t.toLowerCase();if(b[J]&&D(b[J]))return b[J];if(u&&J==="netstat"){let q=B(f,"Sysnative","netstat.exe");if(D(q))return q}return t}function nt(t,u){return Bt(Z(t),u,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function Vt(t){let u=String(t||"").match(/\b(\d+)\b/);return u?Number.parseInt(u[1],10):null}function Zt(t){return Vt(t)}function Ut(t,u){for(let f of String(t||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test(f))continue;if(!f.trim().split(/\s+/).slice(0,6).some((J)=>J.endsWith(`:${u}`)))continue;let b=f.match(/\bpid=(\d+)\b/);if(b)return Number.parseInt(b[1],10)}return null}function wt(t,u){for(let f of String(t||"").split(/\r?\n/)){let $=f.trim().split(/\s+/);if($.length<5||$[0].toUpperCase()!=="TCP")continue;if(!$.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!$[1].endsWith(`:${u}`))continue;let b=Number.parseInt($.at(-1),10);if(Number.isInteger(b)&&b>0)return b}return null}function C(t,u,f){try{return t(u,f)}catch{return null}}function e(t,{platformName:u=Xt(),run:f=nt}={}){if(u==="win32")return wt(C(f,"netstat",["-ano","-p","TCP"]),t);let $=C(f,"lsof",["-nP",`-iTCP:${t}`,"-sTCP:LISTEN","-t"]),b=Zt($);if(b)return b;if(u!=="linux")return null;return Ut(C(f,"ss",["-ltnp"]),t)}var Q=G,s=W,d=S,X=L,z=O;function vt(){let t=c();return(t==="win32"?["C:/Program Files/Google/Chrome/Application/chrome.exe","C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"]:t==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium"]:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium-browser","/usr/bin/chromium","/snap/bin/chromium"]).find(o)||null}var k=()=>process.env.GREEDY_SEARCH_VISIBLE!=="1",At=[`--remote-debugging-port=${Q}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled",`--user-data-dir=${s}`,"--profile-directory=Default","--window-size=1920,1080","--lang=en-US","--force-color-profile=srgb","--disable-background-timer-throttling","--disable-renderer-backgrounding","--disable-backgrounding-occluded-windows"];function Ht(t){try{let u=kt(t,".."),$=jt(u).find((b)=>/^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(b));if($)return $.split(".")[0]}catch{}try{let f=zt(`"${t}" --version`,{encoding:"utf8",timeout:5000}).trim().match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);if(f)return f[1]}catch{}return null}function ht(t){let u=[...At];if(k()){u.push("--headless=new");let f=Ht(t)||"136";u.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${f}.0.0.0 Safari/537.36`)}return u.push("about:blank"),u}var Mt=()=>process.env.GREEDY_SEARCH_VISIBLE==="1";function rt(){try{if(!o(z))return!0;return _(z,"utf8").trim()==="headless"}catch{return!0}}function Yt(t){try{if(c()==="win32")return T(Z("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${t}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return T(Z("ps"),["-p",String(t),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Nt(t,u=s,f=Q){let $=String(t||"").replaceAll("\\","/"),b=String(u||"").replaceAll("\\","/");return $.includes(`--remote-debugging-port=${f}`)&&$.includes(`--user-data-dir=${b}`)&&!$.includes("--type=")}function H(t){if(!Number.isInteger(t)||t<=0)return!1;try{process.kill(t,0)}catch{return!1}return Nt(Yt(t))}function v(){if(!o(X))return!1;let t=Number.parseInt(_(X,"utf8").trim(),10);return H(t)?t:!1}function R(t){return e(t)}function Ct(){let t=R(Q);return H(t)?t:null}function P(t){if(!H(t))return!1;try{if(c()==="win32")T(Z("taskkill"),["/F","/T","/PID",String(t)],{stdio:"ignore",windowsHide:!0});else process.kill(t,"SIGTERM");return!0}catch{return!1}}function Tt(){let t=R(Q);if(!t)return!0;let u=v();if(u&&t===u)return!0;if(H(t))return A(X,String(t),"utf8"),!0;return console.error(`Browser/CDP port ${Q} is owned by unverified pid ${t}; refusing to kill it. Set GREEDY_SEARCH_PORT to a free port.`),!1}async function F(t=15000){let u=Date.now()+t;while(Date.now()<u){let{ok:f,body:$}=await x(`http://localhost:${Q}/json/version`,1500);if(f)try{let{webSocketDebuggerUrl:b}=JSON.parse($),J=new URL(b).pathname;return A(d,`${Q}
|
|
10
|
+
${J}`,"utf8"),!0}catch{}await new Promise((b)=>setTimeout(b,400))}return!1}async function ot(){let t=process.argv[2];if(!Tt()){process.exitCode=1;return}if(t==="--kill"){let J=v()||Ct();if(J){let q=P(J);console.log(q?`Stopped Chrome (pid ${J}).`:`Failed to stop pid ${J}.`)}else console.log("GreedySearch Chrome is not running.");try{U(X)}catch{}try{U(d)}catch{}try{U(z)}catch{}return}if(t==="--status"){let J=v();if(J)console.log(`Running — pid ${J}, port ${Q}`);else console.log("Not running.");return}let u=v();if(u)if(process.env.GREEDY_SEARCH_VISIBLE==="1"&&!process.argv.includes("--headless")&&rt()){console.log(`Headless Chrome running (pid ${u}) but visible requested — killing...`),P(u);try{U(X)}catch{}try{U(z)}catch{}}else{if(await F(5000)){console.log(`GreedySearch Chrome already running (pid ${u}).`);return}console.log(`Stale PID ${u} — launching fresh.`);try{U(X)}catch{}}let f=process.env.CHROME_PATH||vt();if(!f)console.error("Chrome not found. Set CHROME_PATH env var."),process.exit(1);if(xt(s,{recursive:!0}),console.log(`Launching GreedySearch Chrome on port ${Q}...`),k())console.log("Headless mode — no window will be shown");else if(!Mt())console.log("Window will be minimized");let $=gt(f,ht(f),{detached:!0,stdio:"ignore"});if($.unref(),A(X,String($.pid)),A(z,k()?"headless":"visible","utf8"),!await F())console.error("Chrome did not become ready within 15s."),process.exit(1);if(k())console.log("Ready (headless).");else await p(Q),console.log("Ready.")}ot();export{Nt as commandLineMatchesGreedyBrowser};
|