@duckmind/dm-darwin-x64 0.43.8 → 0.49.0

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 (62) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +147 -218
  3. package/extensions/dm-9router-ext/package.json +0 -6
  4. package/extensions/dm-9router-ext/src/index.js +1 -1
  5. package/extensions/dm-ask-user/package.json +0 -4
  6. package/extensions/dm-caveman/LICENSE +21 -0
  7. package/extensions/dm-caveman/extensions/caveman.js +29 -0
  8. package/extensions/dm-caveman/package.json +20 -0
  9. package/extensions/dm-cli-anything/index.js +5 -5
  10. package/extensions/dm-cli-anything/package.json +0 -7
  11. package/extensions/dm-cli-anything/skills/cli-anything/SKILL.md +1 -3
  12. package/extensions/dm-context/package.json +0 -1
  13. package/extensions/dm-cua/package.json +0 -7
  14. package/extensions/dm-fff/package.json +0 -6
  15. package/extensions/dm-goal/package.json +0 -8
  16. package/extensions/dm-grill-me/index.js +2 -2
  17. package/extensions/dm-grill-me/package.json +0 -7
  18. package/extensions/dm-image2/package.json +0 -8
  19. package/extensions/dm-subagents/package.json +0 -11
  20. package/extensions/dm-tasks/package.json +0 -7
  21. package/extensions/dm-usage/package.json +0 -7
  22. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +1 -8
  23. package/extensions/greedysearch-dm/bin/gschrome.mjs +3 -3
  24. package/extensions/greedysearch-dm/bin/launch-visible.mjs +3 -3
  25. package/extensions/greedysearch-dm/bin/launch.mjs +4 -4
  26. package/extensions/greedysearch-dm/bin/search.mjs +106 -106
  27. package/extensions/greedysearch-dm/extractors/consensus.mjs +35 -35
  28. package/extensions/greedysearch-dm/extractors/gemini.mjs +38 -38
  29. package/extensions/greedysearch-dm/extractors/logically.mjs +35 -35
  30. package/extensions/greedysearch-dm/package.json +0 -10
  31. package/extensions/greedysearch-dm/src/search/chrome.mjs +23 -23
  32. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +35 -35
  33. package/extensions/greedysearch-dm/src/search/research.mjs +77 -77
  34. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +10 -10
  35. package/package.json +1 -1
  36. package/extensions/dm-9router-ext/README.md +0 -142
  37. package/extensions/dm-9router-ext/tsconfig.json +0 -17
  38. package/extensions/dm-ask-user/README.md +0 -226
  39. package/extensions/dm-cli-anything/README.md +0 -33
  40. package/extensions/dm-cli-anything/vendor/UPSTREAM.md +0 -14
  41. package/extensions/dm-context/AGENTS.md +0 -41
  42. package/extensions/dm-context/README.md +0 -18
  43. package/extensions/dm-context/tsconfig.json +0 -16
  44. package/extensions/dm-cua/README.md +0 -24
  45. package/extensions/dm-fff/README.md +0 -36
  46. package/extensions/dm-fff/tsconfig.json +0 -13
  47. package/extensions/dm-goal/CHANGELOG.md +0 -12
  48. package/extensions/dm-goal/README.md +0 -29
  49. package/extensions/dm-goal/tsconfig.json +0 -15
  50. package/extensions/dm-grill-me/DESIGN.md +0 -301
  51. package/extensions/dm-grill-me/README.md +0 -82
  52. package/extensions/dm-grill-me/tsconfig.json +0 -17
  53. package/extensions/dm-image2/README.md +0 -33
  54. package/extensions/dm-subagents/CHANGELOG.md +0 -1211
  55. package/extensions/dm-subagents/README.md +0 -29
  56. package/extensions/dm-subagents/biome.json +0 -26
  57. package/extensions/dm-subagents/tsconfig.json +0 -18
  58. package/extensions/dm-tasks/README.md +0 -30
  59. package/extensions/dm-tasks/biome.json +0 -26
  60. package/extensions/dm-tasks/tsconfig.json +0 -14
  61. package/extensions/dm-usage/README.md +0 -29
  62. package/extensions/greedysearch-dm/README.md +0 -222
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import{execSync as R,spawn as Lz}from"node:child_process";import{existsSync as b,mkdirSync as l,readdirSync as Nz,readFileSync as S,unlinkSync as A,writeFileSync as T}from"node:fs";import d from"node:http";import{platform as I,tmpdir as f}from"node:os";import{join as D}from"node:path";import{existsSync as g,mkdirSync as r,readFileSync as q,renameSync as i,unlinkSync as o,writeFileSync as k}from"node:fs";import t from"node:http";import{platform as F}from"node:os";import{dirname as e}from"node:path";var w=[9222,9223],zz=/^(0|false|no|off)$/i;function Jz(z){return[...new Set(z.filter(Boolean))]}function h(z,J="localhost"){let K=String(z||"").trim().split(/\r?\n/).map((Y)=>Y.trim()).filter(Boolean);if(K.length===0)throw Error("empty DevToolsActivePort");let[Q,X=""]=K;if(/^wss?:\/\//i.test(Q))return Q;if(Q.includes(":"))return`ws://${Q}${X}`;return`ws://${J}:${Q}${X}`}function y(z,J="explicit"){let K=new URL(z),Q=K.protocol==="wss:"?"wss:":"ws:",X=K.port?Number.parseInt(K.port,10):Q==="wss:"?443:80;return{source:J,wsUrl:`${Q}//${K.host}${K.pathname}${K.search}`,host:K.hostname,port:X,path:`${K.pathname}${K.search}`,httpUrl:`http://${K.hostname}:${X}`}}function P(z=process.env){return![z.GREEDY_SEARCH_REUSE_EXISTING_BROWSER,z.DM_CUA_REUSE_EXISTING_BROWSER].some((J)=>J!==void 0&&zz.test(String(J)))}function U(z){let J=Number.parseInt(String(z??""),10);return Number.isInteger(J)&&J>0&&J<65536?J:null}function Kz(z){if(!z)return null;let J=String(z).trim();if(!J)return null;let K=new URL(J.includes("://")?J:`http://${J}`),Q=U(K.port)||(K.protocol==="https:"?443:80);return{host:K.hostname,port:Q,source:`env:${J}`}}function Qz(z){if(!z)return[];return String(z).split(/[,\s]+/).map(U).filter(Boolean)}function Xz({env:z=process.env,platformName:J=F(),procVersionText:K=null}={}){if(J!=="linux")return!1;if(z.WSL_DISTRO_NAME||z.WSL_INTEROP)return!0;let Q=K??(()=>{try{return q("/proc/version","utf8")}catch{return""}})();return/microsoft|wsl/i.test(Q)}function Yz({env:z=process.env,platformName:J=F(),procVersionText:K=null,resolvConfText:Q=null}={}){let X=["localhost","127.0.0.1"];if(Xz({env:z,platformName:J,procVersionText:K})){let G=(Q??(()=>{try{return q("/etc/resolv.conf","utf8")}catch{return""}})()).match(/^\s*nameserver\s+([^\s#]+)/m);if(G)X.push(G[1]);X.push("host.docker.internal")}return Jz(X)}function Zz({env:z=process.env,hosts:J=Yz({env:z}),autoPorts:K=w,excludePorts:Q=[]}={}){let X=[];for(let $ of["GREEDY_SEARCH_CDP_WS_URL","DM_CUA_CDP_WS_URL","CDP_WS_URL"])if(z[$])X.push({wsUrl:z[$],source:`env:${$}`});for(let $ of["GREEDY_SEARCH_CDP_URL","DM_CUA_CDP_URL","CDP_URL"])try{let O=Kz(z[$]);if(O)X.push(O)}catch{}for(let $ of["GREEDY_SEARCH_EXISTING_CDP_PORT","DM_CUA_EXISTING_CDP_PORT","GREEDY_SEARCH_CDP_PORT","DM_CUA_CDP_PORT"]){let O=U(z[$]);if(!O)continue;for(let W of J)X.push({host:W,port:O,source:`env:${$}`})}let Y=Qz(z.GREEDY_SEARCH_EXISTING_CDP_PORTS);for(let $ of Y)for(let O of J)X.push({host:O,port:$,source:"env:GREEDY_SEARCH_EXISTING_CDP_PORTS"});let G=new Set(Q.filter(Boolean));if(P(z))for(let $ of K){if(G.has($))continue;for(let O of J)X.push({host:O,port:$,source:"auto"})}let Z=new Set;return X.filter(($)=>{let O=$.wsUrl||`${$.host}:${$.port}`;if(Z.has(O))return!1;return Z.add(O),!0})}async function $z(z,{timeoutMs:J=700}={}){if(z.wsUrl)return y(z.wsUrl,z.source);let K=z.host||"localhost",Q=z.port;if(!Q)return null;let X=await new Promise((Y)=>{let G=t.get({host:K,port:Q,path:"/json/version",timeout:J},(Z)=>{let $="";Z.setEncoding("utf8"),Z.on("data",(O)=>$+=O),Z.on("end",()=>Y(Z.statusCode===200?$:null))});G.on("error",()=>Y(null)),G.setTimeout(J,()=>{G.destroy(),Y(null)})});if(!X)return null;try{let Y=JSON.parse(X);if(!Y.webSocketDebuggerUrl)return null;let G=y(Y.webSocketDebuggerUrl,z.source),Z=G.path||new URL(Y.webSocketDebuggerUrl).pathname;return{...G,host:K,port:Q,httpUrl:`http://${K}:${Q}`,wsUrl:`ws://${K}:${Q}${Z}`,path:Z}}catch{return null}}async function Gz(z={}){for(let J of Zz(z)){let K=await $z(J,z);if(K)return K}return null}function Oz(z){if(!z)throw Error("missing CDP endpoint");let J=new URL(z.wsUrl);return`${J.host}
2
+ import{execSync as R,spawn as jz}from"node:child_process";import{existsSync as E,mkdirSync as Az,readdirSync as Lz,readFileSync as b,unlinkSync as A,writeFileSync as C}from"node:fs";import c from"node:http";import{platform as I,tmpdir as S}from"node:os";import{join as D}from"node:path";import{existsSync as g,mkdirSync as s,readFileSync as H,renameSync as n,unlinkSync as r,writeFileSync as k}from"node:fs";import i from"node:http";import{platform as F}from"node:os";import{dirname as o}from"node:path";var w=[9222,9223],t=/^(0|false|no|off)$/i;function e(z){return[...new Set(z.filter(Boolean))]}function h(z,J="localhost"){let K=String(z||"").trim().split(/\r?\n/).map((Y)=>Y.trim()).filter(Boolean);if(K.length===0)throw Error("empty DevToolsActivePort");let[Q,X=""]=K;if(/^wss?:\/\//i.test(Q))return Q;if(Q.includes(":"))return`ws://${Q}${X}`;return`ws://${J}:${Q}${X}`}function y(z,J="explicit"){let K=new URL(z),Q=K.protocol==="wss:"?"wss:":"ws:",X=K.port?Number.parseInt(K.port,10):Q==="wss:"?443:80;return{source:J,wsUrl:`${Q}//${K.host}${K.pathname}${K.search}`,host:K.hostname,port:X,path:`${K.pathname}${K.search}`,httpUrl:`http://${K.hostname}:${X}`}}function P(z=process.env){return![z.GREEDY_SEARCH_REUSE_EXISTING_BROWSER,z.DM_CUA_REUSE_EXISTING_BROWSER].some((J)=>J!==void 0&&t.test(String(J)))}function M(z){let J=Number.parseInt(String(z??""),10);return Number.isInteger(J)&&J>0&&J<65536?J:null}function zz(z){if(!z)return null;let J=String(z).trim();if(!J)return null;let K=new URL(J.includes("://")?J:`http://${J}`),Q=M(K.port)||(K.protocol==="https:"?443:80);return{host:K.hostname,port:Q,source:`env:${J}`}}function Jz(z){if(!z)return[];return String(z).split(/[,\s]+/).map(M).filter(Boolean)}function Kz({env:z=process.env,platformName:J=F(),procVersionText:K=null}={}){if(J!=="linux")return!1;if(z.WSL_DISTRO_NAME||z.WSL_INTEROP)return!0;let Q=K??(()=>{try{return H("/proc/version","utf8")}catch{return""}})();return/microsoft|wsl/i.test(Q)}function Qz({env:z=process.env,platformName:J=F(),procVersionText:K=null,resolvConfText:Q=null}={}){let X=["localhost","127.0.0.1"];if(Kz({env:z,platformName:J,procVersionText:K})){let O=(Q??(()=>{try{return H("/etc/resolv.conf","utf8")}catch{return""}})()).match(/^\s*nameserver\s+([^\s#]+)/m);if(O)X.push(O[1]);X.push("host.docker.internal")}return e(X)}function Xz({env:z=process.env,hosts:J=Qz({env:z}),autoPorts:K=w,excludePorts:Q=[]}={}){let X=[];for(let $ of["GREEDY_SEARCH_CDP_WS_URL","DM_CUA_CDP_WS_URL","CDP_WS_URL"])if(z[$])X.push({wsUrl:z[$],source:`env:${$}`});for(let $ of["GREEDY_SEARCH_CDP_URL","DM_CUA_CDP_URL","CDP_URL"])try{let G=zz(z[$]);if(G)X.push(G)}catch{}for(let $ of["GREEDY_SEARCH_EXISTING_CDP_PORT","DM_CUA_EXISTING_CDP_PORT","GREEDY_SEARCH_CDP_PORT","DM_CUA_CDP_PORT"]){let G=M(z[$]);if(!G)continue;for(let W of J)X.push({host:W,port:G,source:`env:${$}`})}let Y=Jz(z.GREEDY_SEARCH_EXISTING_CDP_PORTS);for(let $ of Y)for(let G of J)X.push({host:G,port:$,source:"env:GREEDY_SEARCH_EXISTING_CDP_PORTS"});let O=new Set(Q.filter(Boolean));if(P(z))for(let $ of K){if(O.has($))continue;for(let G of J)X.push({host:G,port:$,source:"auto"})}let Z=new Set;return X.filter(($)=>{let G=$.wsUrl||`${$.host}:${$.port}`;if(Z.has(G))return!1;return Z.add(G),!0})}async function Yz(z,{timeoutMs:J=700}={}){if(z.wsUrl)return y(z.wsUrl,z.source);let K=z.host||"localhost",Q=z.port;if(!Q)return null;let X=await new Promise((Y)=>{let O=i.get({host:K,port:Q,path:"/json/version",timeout:J},(Z)=>{let $="";Z.setEncoding("utf8"),Z.on("data",(G)=>$+=G),Z.on("end",()=>Y(Z.statusCode===200?$:null))});O.on("error",()=>Y(null)),O.setTimeout(J,()=>{O.destroy(),Y(null)})});if(!X)return null;try{let Y=JSON.parse(X);if(!Y.webSocketDebuggerUrl)return null;let O=y(Y.webSocketDebuggerUrl,z.source),Z=O.path||new URL(Y.webSocketDebuggerUrl).pathname;return{...O,host:K,port:Q,httpUrl:`http://${K}:${Q}`,wsUrl:`ws://${K}:${Q}${Z}`,path:Z}}catch{return null}}async function Zz(z={}){for(let J of Xz(z)){let K=await Yz(J,z);if(K)return K}return null}function $z(z){if(!z)throw Error("missing CDP endpoint");let J=new URL(z.wsUrl);return`${J.host}
3
3
  ${J.pathname}${J.search}
4
- `}function jz(z,J){r(e(z),{recursive:!0});let K=`${z}.tmp-${process.pid}`;k(K,Oz(J),"utf8");try{o(z)}catch{}i(K,z)}async function m({activePortFile:z,modeFile:J,env:K=process.env,excludePorts:Q=[],autoPorts:X=w}={}){if(!P(K))return null;let Y=await Gz({env:K,excludePorts:Q,autoPorts:X});if(!Y)return null;if(jz(z,Y),J)k(J,"existing","utf8");return Y}function Az(z){return String(z||"").trim()==="existing"}function C(z,J){if(!J||!g(J))return!1;if(!Az(q(J,"utf8")))return!1;return!!z&&g(z)}function Vz(z,J){let K=Number.parseInt(String(z??""),10);return Number.isInteger(K)&&K>1024&&K<65535?K:J}var j=Vz(process.env.GREEDY_SEARCH_PORT,9222),H=process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||D(f(),"greedysearch-chrome-profile"),N=D(H,"DevToolsActivePort"),V=process.env.GREEDY_SEARCH_PID_FILE||D(f(),"greedysearch-chrome.pid"),L=process.env.GREEDY_SEARCH_MODE_FILE||D(f(),"greedysearch-chrome-mode"),Wz=/^(1|true|yes|on)$/i.test(process.env.GREEDY_SEARCH_ALLOW_PORT_CLEANUP??"1");function a(z){return z.find((J)=>J&&b(J))||null}function v(){let z=I();return a(z==="win32"?["C:/Program Files/CloakBrowser/CloakBrowser.exe","C:/Program Files (x86)/CloakBrowser/CloakBrowser.exe"]:z==="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 u(){let z=I();return a(z==="win32"?["C:/Program Files/Google/Chrome/Application/chrome.exe","C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"]:z==="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 _z(){let z=(process.env.GREEDY_SEARCH_BROWSER||process.env.DM_CUA_BROWSER||"auto").toLowerCase(),J=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(J){let Q=J===process.env.DM_CUA_CLOAK_PATH||J===process.env.CLOAKBROWSER_BINARY_PATH,X=J===process.env.CHROME_PATH;return{path:J,label:z==="chrome"||X?"Chrome":z==="cloak"||Q?"CloakBrowser":"browser"}}if(z==="cloak")return{path:v(),label:"CloakBrowser"};if(z==="chrome")return{path:u(),label:"Chrome"};let K=v();return{path:K||u(),label:K?"CloakBrowser":"Chrome"}}var B=()=>process.env.GREEDY_SEARCH_VISIBLE!=="1",Bz=[`--remote-debugging-port=${j}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled",`--user-data-dir=${H}`,"--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 Dz(z){try{let J=D(z,".."),Q=Nz(J).find((X)=>/^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(X));if(Q)return Q.split(".")[0]}catch{}try{let K=R(`"${z}" --version`,{encoding:"utf8",timeout:5000}).trim().match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);if(K)return K[1]}catch{}return null}function Rz(z){let J=[...Bz];if(B()){J.push("--headless=new");let K=Dz(z)||"136";J.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${K}.0.0.0 Safari/537.36`)}return J.push("about:blank"),J}var Iz=()=>process.env.GREEDY_SEARCH_VISIBLE==="1";function Hz(){try{if(!b(L))return!0;return S(L,"utf8").trim()==="headless"}catch{return!0}}async function Mz(){if(B())return;try{let z=await new Promise((G,Z)=>{d.get(`http://localhost:${j}/json/version`,($)=>{let O="";$.on("data",(W)=>O+=W),$.on("end",()=>G(JSON.parse(O)))}).on("error",Z)}),J=new URL(z.webSocketDebuggerUrl).pathname,K=globalThis.WebSocket;if(!K)return;let Q=new K(`ws://localhost:${j}${J}`),X=0,Y=new Map;Q.onopen=()=>{let G=++X;Y.set(G,{resolve:(Z)=>{let O=(Z.targetInfos||[]).find((M)=>M.type==="page");if(!O){Q.close();return}let W=++X;Y.set(W,{resolve:(M)=>{let s=M.windowId,x=++X;Y.set(x,{resolve:()=>{},reject:()=>{}}),Q.send(JSON.stringify({id:x,method:"Browser.setWindowBounds",params:{windowId:s,bounds:{windowState:"minimized"}}})),setTimeout(()=>Q.close(),500)},reject:()=>Q.close()}),Q.send(JSON.stringify({id:W,method:"Browser.getWindowForTarget",params:{targetId:O.targetId}}))},reject:()=>Q.close()}),Q.send(JSON.stringify({id:G,method:"Target.getTargets",params:{}}))},Q.onmessage=(G)=>{let Z=JSON.parse(G.data);if(Z.id&&Y.has(Z.id)){let{resolve:$,reject:O}=Y.get(Z.id);if(Y.delete(Z.id),Z.error)O?.(Z.error);else $?.(Z.result)}},setTimeout(()=>Q.close(),5000)}catch{}}function _(){if(!b(V))return!1;let z=Number.parseInt(S(V,"utf8").trim(),10);if(!z)return!1;try{return process.kill(z,0),z}catch{return!1}}function n(z){try{if(I()==="win32"){let Q=R("netstat -ano -p TCP 2>nul",{encoding:"utf8"}),X=new RegExp(String.raw`TCP\s+[^\s]*:${z}\s+[^\s]*:0\s+LISTENING\s+(\d+)`,"i"),Y=Q.match(X);return Y?Number.parseInt(Y[1],10):null}let K=R(String.raw`lsof -i :${z} -t 2>/dev/null || ss -tlnp 2>/dev/null | grep :${z} | grep -oP 'pid=\K\d+'`,{encoding:"utf8"}).trim();return K?Number.parseInt(K.split(`
5
- `)[0],10):null}catch{return null}}function E(z){try{if(I()==="win32")R(`taskkill /F /T /PID ${z}`,{stdio:"ignore"});else process.kill(z,"SIGTERM");return!0}catch{return!1}}function p(){let z=n(j);if(!z)return;let J=_();if(J&&z===J)return;if(!Wz)console.error(`Browser/CDP port ${j} is already owned by untracked pid ${z}; refusing to kill it. Set GREEDY_SEARCH_PORT or DM_CUA_PORT to a free port.`),process.exit(1);console.log(`Ghost browser on port ${j} (pid ${z}) — cleaning up...`),E(z);try{A(V)}catch{}try{A(N)}catch{}try{A(L)}catch{}}function qz(z,J=1000){return new Promise((K)=>{let Q=d.get(z,(X)=>{let Y="";X.on("data",(G)=>Y+=G),X.on("end",()=>K({ok:X.statusCode===200,body:Y}))});Q.on("error",()=>K({ok:!1})),Q.setTimeout(J,()=>{Q.destroy(),K({ok:!1})})})}async function c(z=15000){let J=Date.now()+z;while(Date.now()<J){let{ok:K,body:Q}=await qz(`http://localhost:${j}/json/version`,1500);if(K)try{let{webSocketDebuggerUrl:X}=JSON.parse(Q),Y=new URL(X),G=`${Y.pathname}${Y.search}`;return l(H,{recursive:!0}),T(N,`localhost:${j}
6
- ${G}`,"utf8"),!0}catch{}await new Promise((X)=>setTimeout(X,400))}return!1}async function Uz(){let z=process.argv[2];if(z==="--kill"){if(C(N,L)){try{A(N)}catch{}try{A(L)}catch{}console.log("Detached from existing browser CDP endpoint; no browser process was killed.");return}p();let Z=_()||n(j);if(Z){let $=E(Z);console.log($?`Stopped browser (pid ${Z}).`:`Failed to stop pid ${Z}.`)}else console.log("GreedySearch browser is not running.");try{A(V)}catch{}try{A(N)}catch{}try{A(L)}catch{}return}if(z==="--status"){if(C(N,L)){try{let $=h(S(N,"utf8"));console.log(`Reusing existing browser — ${$}`)}catch{console.log("Reusing existing browser.")}return}let Z=_();if(Z)console.log(`Running — pid ${Z}, port ${j}`);else console.log("Not running.");return}let J=_(),K=await m({activePortFile:N,modeFile:L,excludePorts:J?[j]:[],autoPorts:J?[9223]:[j,9223]});if(K){console.log(`Reusing existing browser CDP endpoint ${K.httpUrl} (${K.source}).`);return}p();let Q=_();if(Q)if(process.env.GREEDY_SEARCH_VISIBLE==="1"&&!process.argv.includes("--headless")&&Hz()){console.log(`Headless browser running (pid ${Q}) but visible requested — killing...`),E(Q);try{A(V)}catch{}try{A(L)}catch{}}else{if(await c(5000)){console.log(`GreedySearch browser already running (pid ${Q}).`);return}console.log(`Stale PID ${Q} — launching fresh.`);try{A(V)}catch{}}let X=_z();if(!X.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(l(H,{recursive:!0}),console.log(`Launching GreedySearch ${X.label} on port ${j}...`),B())console.log("Headless mode — no window will be shown");else if(!Iz())console.log("Window will be minimized");let Y=Lz(X.path,Rz(X.path),{detached:!0,stdio:"ignore"});if(Y.unref(),T(V,String(Y.pid)),T(L,B()?"headless":"visible","utf8"),!await c())console.error(`${X.label} did not become ready within 15s.`),process.exit(1);if(B())console.log("Ready (headless).");else await Mz(),console.log("Ready.")}Uz();
4
+ `}function Gz(z,J){s(o(z),{recursive:!0});let K=`${z}.tmp-${process.pid}`;k(K,$z(J),"utf8");try{r(z)}catch{}n(K,z)}async function m({activePortFile:z,modeFile:J,env:K=process.env,excludePorts:Q=[],autoPorts:X=w}={}){if(!P(K))return null;let Y=await Zz({env:K,excludePorts:Q,autoPorts:X});if(!Y)return null;if(Gz(z,Y),J)k(J,"existing","utf8");return Y}function Oz(z){return String(z||"").trim()==="existing"}function q(z,J){if(!J||!g(J))return!1;if(!Oz(H(J,"utf8")))return!1;return!!z&&g(z)}function Nz(z,J){let K=Number.parseInt(String(z??""),10);return Number.isInteger(K)&&K>1024&&K<65535?K:J}var j=Nz(process.env.GREEDY_SEARCH_PORT,9222),f=process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||D(S(),"greedysearch-chrome-profile"),N=D(f,"DevToolsActivePort"),V=process.env.GREEDY_SEARCH_PID_FILE||D(S(),"greedysearch-chrome.pid"),L=process.env.GREEDY_SEARCH_MODE_FILE||D(S(),"greedysearch-chrome-mode"),Vz=/^(1|true|yes|on)$/i.test(process.env.GREEDY_SEARCH_ALLOW_PORT_CLEANUP??"1");function l(z){return z.find((J)=>J&&E(J))||null}function v(){let z=I();return l(z==="win32"?["C:/Program Files/CloakBrowser/CloakBrowser.exe","C:/Program Files (x86)/CloakBrowser/CloakBrowser.exe"]:z==="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 u(){let z=I();return l(z==="win32"?["C:/Program Files/Google/Chrome/Application/chrome.exe","C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"]:z==="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 Wz(){let z=(process.env.GREEDY_SEARCH_BROWSER||process.env.DM_CUA_BROWSER||"auto").toLowerCase(),J=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(J){let Q=J===process.env.DM_CUA_CLOAK_PATH||J===process.env.CLOAKBROWSER_BINARY_PATH,X=J===process.env.CHROME_PATH;return{path:J,label:z==="chrome"||X?"Chrome":z==="cloak"||Q?"CloakBrowser":"browser"}}if(z==="cloak")return{path:v(),label:"CloakBrowser"};if(z==="chrome")return{path:u(),label:"Chrome"};let K=v();return{path:K||u(),label:K?"CloakBrowser":"Chrome"}}var B=()=>process.env.GREEDY_SEARCH_VISIBLE!=="1",_z=[`--remote-debugging-port=${j}`,"--disable-features=DevToolsPrivacyUI","--no-first-run","--no-default-browser-check","--disable-default-apps","--disable-blink-features=AutomationControlled",`--user-data-dir=${f}`,"--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 Bz(z){try{let J=D(z,".."),Q=Lz(J).find((X)=>/^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}$/.test(X));if(Q)return Q.split(".")[0]}catch{}try{let K=R(`"${z}" --version`,{encoding:"utf8",timeout:5000}).trim().match(/(\d{1,10})\.\d{1,10}\.\d{1,10}/);if(K)return K[1]}catch{}return null}function Dz(z){let J=[..._z];if(B()){J.push("--headless=new");let K=Bz(z)||"136";J.push(`--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${K}.0.0.0 Safari/537.36`)}return J.push("about:blank"),J}var Rz=()=>process.env.GREEDY_SEARCH_VISIBLE==="1";function Iz(){try{if(!E(L))return!0;return b(L,"utf8").trim()==="headless"}catch{return!0}}async function Uz(){if(B())return;try{let z=await new Promise((O,Z)=>{c.get(`http://localhost:${j}/json/version`,($)=>{let G="";$.on("data",(W)=>G+=W),$.on("end",()=>O(JSON.parse(G)))}).on("error",Z)}),J=new URL(z.webSocketDebuggerUrl).pathname,K=globalThis.WebSocket;if(!K)return;let Q=new K(`ws://localhost:${j}${J}`),X=0,Y=new Map;Q.onopen=()=>{let O=++X;Y.set(O,{resolve:(Z)=>{let G=(Z.targetInfos||[]).find((U)=>U.type==="page");if(!G){Q.close();return}let W=++X;Y.set(W,{resolve:(U)=>{let a=U.windowId,x=++X;Y.set(x,{resolve:()=>{},reject:()=>{}}),Q.send(JSON.stringify({id:x,method:"Browser.setWindowBounds",params:{windowId:a,bounds:{windowState:"minimized"}}})),setTimeout(()=>Q.close(),500)},reject:()=>Q.close()}),Q.send(JSON.stringify({id:W,method:"Browser.getWindowForTarget",params:{targetId:G.targetId}}))},reject:()=>Q.close()}),Q.send(JSON.stringify({id:O,method:"Target.getTargets",params:{}}))},Q.onmessage=(O)=>{let Z=JSON.parse(O.data);if(Z.id&&Y.has(Z.id)){let{resolve:$,reject:G}=Y.get(Z.id);if(Y.delete(Z.id),Z.error)G?.(Z.error);else $?.(Z.result)}},setTimeout(()=>Q.close(),5000)}catch{}}function _(){if(!E(V))return!1;let z=Number.parseInt(b(V,"utf8").trim(),10);if(!z)return!1;try{return process.kill(z,0),z}catch{return!1}}function d(z){try{if(I()==="win32"){let Q=R("netstat -ano -p TCP 2>nul",{encoding:"utf8"}),X=new RegExp(String.raw`TCP\s+[^\s]*:${z}\s+[^\s]*:0\s+LISTENING\s+(\d+)`,"i"),Y=Q.match(X);return Y?Number.parseInt(Y[1],10):null}let K=R(String.raw`lsof -i :${z} -t 2>/dev/null || ss -tlnp 2>/dev/null | grep :${z} | grep -oP 'pid=\K\d+'`,{encoding:"utf8"}).trim();return K?Number.parseInt(K.split(`
5
+ `)[0],10):null}catch{return null}}function T(z){try{if(I()==="win32")R(`taskkill /F /T /PID ${z}`,{stdio:"ignore"});else process.kill(z,"SIGTERM");return!0}catch{return!1}}function Hz(){let z=d(j);if(!z)return;let J=_();if(J&&z===J)return;if(!Vz)console.error(`Browser/CDP port ${j} is already owned by untracked pid ${z}; refusing to kill it. Set GREEDY_SEARCH_PORT or DM_CUA_PORT to a free port.`),process.exit(1);console.log(`Ghost browser on port ${j} (pid ${z}) — cleaning up...`),T(z);try{A(V)}catch{}try{A(N)}catch{}try{A(L)}catch{}}function Mz(z,J=1000){return new Promise((K)=>{let Q=c.get(z,(X)=>{let Y="";X.on("data",(O)=>Y+=O),X.on("end",()=>K({ok:X.statusCode===200,body:Y}))});Q.on("error",()=>K({ok:!1})),Q.setTimeout(J,()=>{Q.destroy(),K({ok:!1})})})}async function p(z=15000){let J=Date.now()+z;while(Date.now()<J){let{ok:K,body:Q}=await Mz(`http://localhost:${j}/json/version`,1500);if(K)try{let{webSocketDebuggerUrl:X}=JSON.parse(Q),Y=new URL(X).pathname;return C(N,`${j}
6
+ ${Y}`,"utf8"),!0}catch{}await new Promise((X)=>setTimeout(X,400))}return!1}async function qz(){let z=process.argv[2];if(Hz(),z==="--kill"){if(q(N,L)){try{A(N)}catch{}try{A(L)}catch{}console.log("Detached from existing browser CDP endpoint; no browser process was killed.");return}let Z=_()||d(j);if(Z){let $=T(Z);console.log($?`Stopped browser (pid ${Z}).`:`Failed to stop pid ${Z}.`)}else console.log("GreedySearch browser is not running.");try{A(V)}catch{}try{A(N)}catch{}try{A(L)}catch{}return}if(z==="--status"){if(q(N,L)){try{let $=h(b(N,"utf8"));console.log(`Reusing existing browser — ${$}`)}catch{console.log("Reusing existing browser.")}return}let Z=_();if(Z)console.log(`Running — pid ${Z}, port ${j}`);else console.log("Not running.");return}let J=_(),K=await m({activePortFile:N,modeFile:L,excludePorts:J?[j]:[],autoPorts:J?[9223]:[j,9223]});if(K){console.log(`Reusing existing browser CDP endpoint ${K.httpUrl} (${K.source}).`);return}let Q=_();if(Q)if(process.env.GREEDY_SEARCH_VISIBLE==="1"&&!process.argv.includes("--headless")&&Iz()){console.log(`Headless browser running (pid ${Q}) but visible requested — killing...`),T(Q);try{A(V)}catch{}try{A(L)}catch{}}else{if(await p(5000)){console.log(`GreedySearch browser already running (pid ${Q}).`);return}console.log(`Stale PID ${Q} — launching fresh.`);try{A(V)}catch{}}let X=Wz();if(!X.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(Az(f,{recursive:!0}),console.log(`Launching GreedySearch ${X.label} on port ${j}...`),B())console.log("Headless mode — no window will be shown");else if(!Rz())console.log("Window will be minimized");let Y=jz(X.path,Dz(X.path),{detached:!0,stdio:"ignore"});if(Y.unref(),C(V,String(Y.pid)),C(L,B()?"headless":"visible","utf8"),!await p())console.error(`${X.label} did not become ready within 15s.`),process.exit(1);if(B())console.log("Ready (headless).");else await Uz(),console.log("Ready.")}qz();