@duckmind/dm-darwin-x64 0.52.6 → 0.53.4

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 (58) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +14 -10
  3. package/extensions/dm-cua/bin/browser-cua.mjs +6 -6
  4. package/extensions/dm-cua/index.js +5 -5
  5. package/extensions/dm-cua/src/browser-cua-lib.mjs +2 -2
  6. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +8 -1
  7. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +1 -1
  8. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +1 -1
  9. package/extensions/greedysearch-dm/bin/cdp.mjs +29 -20
  10. package/extensions/greedysearch-dm/bin/gschrome.mjs +1 -8
  11. package/extensions/greedysearch-dm/bin/kill-visible.mjs +1 -1
  12. package/extensions/greedysearch-dm/bin/launch-visible.mjs +1 -2
  13. package/extensions/greedysearch-dm/bin/launch.mjs +9 -11
  14. package/extensions/greedysearch-dm/bin/mcp.mjs +375 -0
  15. package/extensions/greedysearch-dm/bin/search.mjs +309 -157
  16. package/extensions/greedysearch-dm/bin/visible.mjs +1 -1
  17. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +205 -68
  18. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +229 -140
  19. package/extensions/greedysearch-dm/extractors/common.mjs +160 -50
  20. package/extensions/greedysearch-dm/extractors/consensus.mjs +226 -93
  21. package/extensions/greedysearch-dm/extractors/consent.mjs +44 -17
  22. package/extensions/greedysearch-dm/extractors/gemini.mjs +277 -138
  23. package/extensions/greedysearch-dm/extractors/google-ai.mjs +172 -64
  24. package/extensions/greedysearch-dm/extractors/logically.mjs +183 -69
  25. package/extensions/greedysearch-dm/extractors/perplexity.mjs +331 -65
  26. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +118 -41
  27. package/extensions/greedysearch-dm/index.js +23 -20
  28. package/extensions/greedysearch-dm/package.json +8 -3
  29. package/extensions/greedysearch-dm/skills/greedy-search/skill.md +8 -8
  30. package/extensions/greedysearch-dm/src/fetcher.mjs +2 -2
  31. package/extensions/greedysearch-dm/src/formatters/results.js +8 -6
  32. package/extensions/greedysearch-dm/src/github.mjs +7 -7
  33. package/extensions/greedysearch-dm/src/reddit.mjs +1 -1
  34. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +10 -8
  35. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +48 -0
  36. package/extensions/greedysearch-dm/src/search/chrome.mjs +130 -54
  37. package/extensions/greedysearch-dm/src/search/constants.mjs +6 -6
  38. package/extensions/greedysearch-dm/src/search/engines.mjs +9 -9
  39. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +160 -83
  40. package/extensions/greedysearch-dm/src/search/minimize.mjs +1 -0
  41. package/extensions/greedysearch-dm/src/search/paths.mjs +1 -1
  42. package/extensions/greedysearch-dm/src/search/pdf.mjs +1 -1
  43. package/extensions/greedysearch-dm/src/search/port-pid.mjs +1 -1
  44. package/extensions/greedysearch-dm/src/search/progress.mjs +2 -0
  45. package/extensions/greedysearch-dm/src/search/recovery.mjs +1 -1
  46. package/extensions/greedysearch-dm/src/search/research.mjs +262 -167
  47. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +11 -0
  48. package/extensions/greedysearch-dm/src/search/simple-research.mjs +827 -0
  49. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +9 -9
  50. package/extensions/greedysearch-dm/src/search/synthesis.mjs +10 -10
  51. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +23 -20
  52. package/extensions/greedysearch-dm/src/tools/shared.js +10 -9
  53. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +1 -1
  54. package/package.json +1 -1
  55. package/extensions/greedysearch-dm/src/search/cdp-endpoint.mjs +0 -3
  56. package/extensions/greedysearch-dm/src/search/launcher-paths.mjs +0 -3
  57. package/extensions/greedysearch-dm/src/search/partial-output.mjs +0 -1
  58. package/extensions/greedysearch-dm/src/utils/browser-executable.mjs +0 -1
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_process";import{dirname as Wg,join as Qg}from"node:path";import{fileURLToPath as Xg}from"node:url";import{basename as lg}from"node:path";function Zg(f=process.env,g=process.execPath){let u=f.GREEDY_SEARCH_NODE||f.NODE_BINARY||f.NODE;if(u?.trim())return u.trim();let n=lg(g||"").toLowerCase();if(n==="node"||n==="node.exe")return g;return"node"}var Jg=Wg(Xg(import.meta.url)),ig=Qg(Jg,"..","bin","cdp.mjs");function X(f,g=30000){return ff(f,null,g)}function ff(f,g=null,u=30000){return new Promise((n,$)=>{let w=og(Zg(),[ig,...f],{stdio:[g==null?"ignore":"pipe","pipe","pipe"]});if(g!=null)w.stdin.write(g),w.stdin.end();let o="",h="";w.stdout.on("data",(Q)=>o+=Q),w.stderr.on("data",(Q)=>h+=Q);let W=setTimeout(()=>{w.kill(),$(Error(`cdp timeout: ${f[0]}`))},u);w.on("close",(Q)=>{if(clearTimeout(W),Q===0)n(o.trim());else $(Error(h.trim()||`cdp exit ${Q}`))})})}async function qf(f){if(f)return f;let g=(await X(["list"])).split(`
3
- `)[0]?.slice(0,8);if(!g)throw Error("No Chrome tabs found. Is Chrome running with --remote-debugging-port=9222?");let u=await X(["evalraw",g,"Target.createTarget",'{"url":"about:blank"}']),{targetId:n}=JSON.parse(u);await X(["list"]);let $=n.slice(0,8);try{await Vf($)}catch(w){process.stderr.write(`[getOrOpenTab] stealth injection failed: ${w.message}
4
- `)}return $}async function Vf(f){await X(["evalraw",f,"Page.addScriptToEvaluateOnNewDocument",JSON.stringify({source:`
2
+ import{randomInt as tt}from"node:crypto";import{spawn as et}from"node:child_process";import{basename as it}from"node:path";import{dirname as ot,join as ut}from"node:path";import{fileURLToPath as lt}from"node:url";function rt(n=process.env,t=process.execPath){let e=n.GREEDY_SEARCH_NODE||n.NODE_BINARY||n.NODE;if(e?.trim())return e.trim();let o=it(t||"").toLowerCase();if(o==="node"||o==="node.exe")return t;return"node"}var ft=ot(lt(import.meta.url)),at=ut(ft,"..","bin","cdp.mjs"),gt=new Set(["list","snap","eval","shot","html","nav","net","click","clickxy","type","loadall","evalraw","browse","stop","--tab"]);function ht(n){if(!Array.isArray(n)||n.length===0)throw Error("cdp: args must be a non-empty array");if(n[0]==="test")return n.map((t,e)=>yn(t,e));if(!gt.has(n[0]))throw Error(`cdp: unknown subcommand '${n[0]}'`);return n.map((t,e)=>yn(t,e))}function yn(n,t){if(typeof n!=="string")throw Error(`cdp: argv[${t}] must be a string (got ${typeof n})`);if(n.includes("\x00"))throw Error(`cdp: argv[${t}] contains a null byte`);return n}function f(n,t=30000){return nn(n,null,t)}function nn(n,t=null,e=30000){let o=ht(n);return new Promise((i,r)=>{let u=et(rt(),[at,...o],{stdio:[t==null?"ignore":"pipe","pipe","pipe"]});if(t!=null)u.stdin.write(t),u.stdin.end();let l="",a="";u.stdout.on("data",(h)=>l+=h),u.stderr.on("data",(h)=>a+=h);let g=setTimeout(()=>{u.kill(),r(Error(`cdp timeout: ${n[0]}`))},e);u.on("close",(h)=>{if(clearTimeout(g),h===0)i(l.trim());else r(Error(a.trim()||`cdp exit ${h}`))})})}function _n(n,t){let e=(u)=>String(u??"").replace(/\s+/g," ").trim(),o=e(n),i=e(t);if(!i)return!1;if(o.length<Math.ceil(i.length*0.8))return!1;let r=Math.min(40,i.length);return o.includes(i.slice(0,r))&&o.includes(i.slice(-r))}async function vn(n){if(n)return n;let t=(await f(["list"])).split(`
3
+ `)[0]?.slice(0,8);if(!t)throw Error("No Chrome tabs found. Is Chrome running with --remote-debugging-port=9222?");let e=await f(["evalraw",t,"Target.createTarget",'{"url":"about:blank"}']),o;try{o=JSON.parse(e)}catch(u){throw Error(`Target.createTarget returned invalid JSON: ${u.message}`)}let{targetId:i}=o;if(!i)throw Error("Target.createTarget did not return a targetId");await f(["list"]);let r=i.slice(0,8);try{await $n(r)}catch(u){process.stderr.write(`[getOrOpenTab] stealth injection failed: ${u.message}
4
+ `)}return r}async function $n(n){await f(["evalraw",n,"Page.addScriptToEvaluateOnNewDocument",JSON.stringify({source:`
5
5
  (function() {
6
6
  // ── Runtime.enable / CDP detection masking ──────────────
7
7
  try { delete window.__REBROWSER_RUNTIME_ENABLE; } catch(_) {}
@@ -12,40 +12,62 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
12
12
  try { delete window._phantom; } catch(_) {}
13
13
  try { delete window.Buffer; } catch(_) {}
14
14
 
15
- // Real Chrome without automation does not expose a useful webdriver value.
16
- // A literal false value is itself a common stealth tell; prefer undefined and
17
- // make the descriptor configurable like native browser properties.
18
- Object.defineProperty(navigator, 'webdriver', { get: () => undefined, configurable: true });
15
+ // Real Chrome without automation should not expose navigator.webdriver at all.
16
+ // A literal false or an own-property getter returning undefined is itself a
17
+ // common stealth tell; remove both instance and prototype properties when the
18
+ // descriptor is configurable (as it is with --disable-blink-features).
19
+ try { delete navigator.webdriver; } catch(_) {}
20
+ try { delete Navigator.prototype.webdriver; } catch(_) {}
19
21
  Object.defineProperty(navigator, 'vendor', { get: () => 'Google Inc.', configurable: true });
20
22
  Object.defineProperty(navigator, 'platform', { get: () => 'Win32', configurable: true });
21
23
  Object.defineProperty(navigator, 'maxTouchPoints', { get: () => 0, configurable: true });
22
24
  Object.defineProperty(navigator, 'pdfViewerEnabled', { get: () => true, configurable: true });
25
+ Object.defineProperty(navigator, 'productSub', { get: () => '20030107', configurable: true });
26
+ Object.defineProperty(navigator, 'product', { get: () => 'Gecko', configurable: true });
27
+ var __greedyMimeTypes = null;
28
+ function __makeMimeTypes() {
29
+ var pdf = { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format', enabledPlugin: null };
30
+ var textPdf = { type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format', enabledPlugin: null };
31
+ try { Object.setPrototypeOf(pdf, MimeType.prototype); } catch(_) {}
32
+ try { Object.setPrototypeOf(textPdf, MimeType.prototype); } catch(_) {}
33
+ var m = [pdf, textPdf];
34
+ try { Object.setPrototypeOf(m, MimeTypeArray.prototype); } catch(_) {}
35
+ m.item = function item(i) { return this[i] || null; };
36
+ m.namedItem = function namedItem(name) { return Array.prototype.find.call(this, function(x) { return x && x.type === name; }) || null; };
37
+ return m;
38
+ }
23
39
  Object.defineProperty(navigator, 'plugins', {
24
40
  get: () => {
25
- var p = [
26
- { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
27
- { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' },
28
- { name: 'Native Client', filename: 'internal-nacl-plugin', description: '' },
29
- ];
30
- p.length = 3;
41
+ __greedyMimeTypes = __greedyMimeTypes || __makeMimeTypes();
42
+ var plugin0 = { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' };
43
+ var plugin1 = { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' };
44
+ var plugin2 = { name: 'Native Client', filename: 'internal-nacl-plugin', description: '' };
45
+ try { Object.setPrototypeOf(plugin0, Plugin.prototype); } catch(_) {}
46
+ try { Object.setPrototypeOf(plugin1, Plugin.prototype); } catch(_) {}
47
+ try { Object.setPrototypeOf(plugin2, Plugin.prototype); } catch(_) {}
48
+ var p = [plugin0, plugin1, plugin2];
49
+ p.item = function item(i) { return this[i] || null; };
50
+ p.namedItem = function namedItem(name) { return Array.prototype.find.call(this, function(x) { return x && x.name === name; }) || null; };
51
+ p.refresh = function refresh() {};
52
+ try { Object.setPrototypeOf(p, PluginArray.prototype); } catch(_) {}
53
+ try {
54
+ __greedyMimeTypes[0].enabledPlugin = p[0];
55
+ __greedyMimeTypes[1].enabledPlugin = p[0];
56
+ } catch(_) {}
31
57
  return p;
32
58
  },
59
+ configurable: true,
33
60
  });
34
61
  Object.defineProperty(navigator, 'mimeTypes', {
35
62
  get: () => {
36
- var m = [
37
- { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format', enabledPlugin: null },
38
- { type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format', enabledPlugin: null },
39
- ];
40
- m.item = function(i) { return m[i] || null; };
41
- m.namedItem = function(name) { return m.find(function(x) { return x.type === name; }) || null; };
42
- return m;
63
+ __greedyMimeTypes = __greedyMimeTypes || __makeMimeTypes();
64
+ return __greedyMimeTypes;
43
65
  },
44
66
  configurable: true,
45
67
  });
46
68
  Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'], configurable: true });
47
69
  try {
48
- Object.defineProperty(navigator, 'connection', { get: () => ({ effectiveType: '4g', rtt: 50, downlink: 10, saveData: false }), configurable: true });
70
+ Object.defineProperty(navigator, 'connection', { get: () => ({ effectiveType: '4g', rtt: 50, downlink: 10, downlinkMax: Infinity, saveData: false }), configurable: true });
49
71
  } catch(_) {}
50
72
  if (!navigator.mediaDevices) {
51
73
  Object.defineProperty(navigator, 'mediaDevices', {
@@ -61,6 +83,18 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
61
83
  configurable: true,
62
84
  });
63
85
  }
86
+ // ── Missing platform APIs (headless often lacks these) ─
87
+ try {
88
+ if (!navigator.share) {
89
+ navigator.share = function() { return Promise.reject(new Error('NotAllowedError')); };
90
+ }
91
+ } catch(_) {}
92
+ try {
93
+ if (!navigator.contentIndex) {
94
+ Object.defineProperty(navigator, 'contentIndex', { get: () => ({ add: function() {}, delete: function() {}, getAll: function() { return Promise.resolve([]); } }), configurable: true });
95
+ }
96
+ } catch(_) {}
97
+
64
98
  if (!window.chrome) {
65
99
  window.chrome = {
66
100
  app: { isInstalled: false, InstallState: {}, RunningState: {} },
@@ -68,8 +102,8 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
68
102
  OnInstalledReason: {}, OnRestartRequiredReason: {}, PlatformArch: {}, PlatformNaclArch: {}, PlatformOs: {}, RequestUpdateCheckStatus: {},
69
103
  connect: () => ({}), sendMessage: () => {}, onMessage: { addListener: () => {} }
70
104
  },
71
- loadTimes: () => ({}),
72
- csi: () => ({}),
105
+ loadTimes: function() { return { requestTime: 0, startLoadTime: Date.now() - 5000, commitLoadTime: Date.now() - 3000, finishDocumentLoadTime: Date.now() - 2000, finishLoadTime: Date.now() - 1000, firstPaintTime: Date.now() - 800, navigationType: 'Other', wasFetchedViaSpdy: true, wasNpnNegotiated: true, npnNegotiatedProtocol: 'h2', wasAlternateProtocolAvailable: false, connectionInfo: 'http/2' }; },
106
+ csi: function() { var t = Date.now(); return { onloadT: t - 2000, startE: t - 5000, pageT: 'back', tran: 2 }; },
73
107
  };
74
108
  }
75
109
  var __greedyNativeFns = [];
@@ -90,6 +124,19 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
90
124
  return getParam.call(this, p);
91
125
  });
92
126
  } catch(_) {}
127
+ // ── WebGL readPixels noise ──────────────────────────
128
+ // CreepJS and other fingerprinters draw content with WebGL and read back the
129
+ // rendered pixels. Adding subtle noise breaks rendering-based fingerprinting.
130
+ try {
131
+ var origReadPixels = WebGLRenderingContext.prototype.readPixels;
132
+ WebGLRenderingContext.prototype.readPixels = __markNative(function readPixels(x, y, width, height, format, type, pixels) {
133
+ var result = origReadPixels.call(this, x, y, width, height, format, type, pixels);
134
+ if (pixels && pixels.length > 0) {
135
+ pixels[0] ^= 1;
136
+ }
137
+ return result;
138
+ });
139
+ } catch(_) {}
93
140
  Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => 8, configurable: true });
94
141
  Object.defineProperty(navigator, 'deviceMemory', { get: () => 8, configurable: true });
95
142
 
@@ -97,7 +144,7 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
97
144
  // Headless rendering engines produce slightly different canvas output
98
145
  // than headed Chrome. Subtle noise breaks hash-based fingerprinting.
99
146
  try {
100
- var __canvasNoise = ((Date.now() % 997) + Math.floor(Math.random() * 997)) & 1;
147
+ var __canvasNoise = ((Date.now() & 0xFF) | 1);
101
148
  var origFill = CanvasRenderingContext2D.prototype.fillText;
102
149
  CanvasRenderingContext2D.prototype.fillText = __markNative(function fillText() {
103
150
  this.globalAlpha = 0.9995;
@@ -116,15 +163,39 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
116
163
  HTMLCanvasElement.prototype.toDataURL = __markNative(function toDataURL() {
117
164
  var ctx = this.getContext('2d');
118
165
  if (ctx) {
119
- // Add 1px noise pixel in corner (invisible but changes hash)
120
- var imgData = ctx.getImageData(0, 0, 1, 1);
121
- if (imgData) imgData.data[0] ^= __canvasNoise;
122
- ctx.putImageData(imgData, 0, 0);
166
+ // Spread noise across canvas to break hash-based fingerprinting.
167
+ // Uses a deterministic pattern so it's consistent per page load
168
+ // but varies between sessions.
169
+ var w = this.width, h = this.height;
170
+ if (w > 0 && h > 0) {
171
+ var imgData = ctx.getImageData(0, 0, Math.min(w, 4), Math.min(h, 4));
172
+ if (imgData && imgData.data) {
173
+ for (var __i = 0; __i < imgData.data.length; __i += 4) {
174
+ imgData.data[__i] ^= (__canvasNoise + __i) & 0xFF;
175
+ }
176
+ ctx.putImageData(imgData, 0, 0);
177
+ }
178
+ }
123
179
  }
124
180
  return origToDataURL.apply(this, arguments);
125
181
  });
126
182
  } catch(_) {}
127
183
 
184
+ // ── AudioContext fingerprint noise ────────────────────
185
+ // Headless Chrome's AudioContext produces slightly different output.
186
+ // Subtle noise breaks audio-based fingerprinting.
187
+ try {
188
+ var __audioSeed = ((Date.now() & 0x1F) | 1);
189
+ var origGetChannelData = AudioBuffer.prototype.getChannelData;
190
+ AudioBuffer.prototype.getChannelData = __markNative(function getChannelData(channel) {
191
+ var data = origGetChannelData.call(this, channel);
192
+ for (var __i = 0; __i < data.length; __i += 64) {
193
+ data[__i] *= 0.99999;
194
+ }
195
+ return data;
196
+ });
197
+ } catch(_) {}
198
+
128
199
  // ── window outer dimensions ──────────────────────────
129
200
  // outerWidth/Height = 0 in headless — a well-known bot signal.
130
201
  // Mirror innerWidth/Height (set by --window-size flag) so the ratio is sane.
@@ -134,9 +205,15 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
134
205
  } catch(_) {}
135
206
 
136
207
  // ── screen properties ─────────────────────────────────
208
+ // Headless Chrome often reports an 800x600 screen even when the viewport is
209
+ // 1920x1080. Keep screen metrics internally consistent with our launch flags.
137
210
  try {
138
- if (!screen.colorDepth) Object.defineProperty(screen, 'colorDepth', { get: () => 24, configurable: true });
139
- if (!screen.pixelDepth) Object.defineProperty(screen, 'pixelDepth', { get: () => 24, configurable: true });
211
+ Object.defineProperty(screen, 'width', { get: () => 1920, configurable: true });
212
+ Object.defineProperty(screen, 'height', { get: () => 1080, configurable: true });
213
+ Object.defineProperty(screen, 'availWidth', { get: () => 1920, configurable: true });
214
+ Object.defineProperty(screen, 'availHeight', { get: () => 1040, configurable: true });
215
+ Object.defineProperty(screen, 'colorDepth', { get: () => 24, configurable: true });
216
+ Object.defineProperty(screen, 'pixelDepth', { get: () => 24, configurable: true });
140
217
  } catch(_) {}
141
218
 
142
219
  // ── navigator.userAgentData (UA Client Hints) ─────────
@@ -209,10 +286,10 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
209
286
  };
210
287
  } catch(_) {}
211
288
  })();
212
- `})])}var gf={postNav:800,postNavSlow:1200,postClick:300,postType:300,inputPoll:400,copyPoll:600,afterVerify:1500};function D(f){let g=f*0.4,u=hg(-Math.floor(g),Math.floor(g)+1);return Math.max(50,Math.round(f+u))}async function G(f,g,u=15000,n=500){let $=String.raw`
289
+ `})])}var tn={postNav:800,postNavSlow:1200,postClick:300,postType:300,inputPoll:400,copyPoll:600,afterVerify:1500};function q(n){let t=n*0.2,e=tt(-Math.floor(t),Math.floor(t)+1);return Math.max(50,Math.round(n+e))}async function B(n,t,e=15000,o=500){let i=String.raw`
213
290
  new Promise((resolve) => {
214
- const _deadline = Date.now() + ${u};
215
- const _baseInterval = ${n};
291
+ const _deadline = Date.now() + ${e};
292
+ const _baseInterval = ${o};
216
293
 
217
294
  function _jitter(ms) {
218
295
  return Math.max(50, ms + (Math.random() * ms * 0.4 - ms * 0.2));
@@ -220,7 +297,7 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
220
297
 
221
298
  function _poll() {
222
299
  try {
223
- if (document.querySelector('${g}')) { resolve(true); return; }
300
+ if (document.querySelector('${t}')) { resolve(true); return; }
224
301
  if (Date.now() < _deadline) { setTimeout(_poll, _jitter(_baseInterval)); }
225
302
  else { resolve(false); }
226
303
  } catch(_) { resolve(false); }
@@ -228,27 +305,26 @@ import{randomInt as hg}from"node:crypto";import{spawn as og}from"node:child_proc
228
305
 
229
306
  _poll();
230
307
  })
231
- `;return await X(["eval",f,$],u+5000)==="true"}async function Hf(f){let g=f.indexOf("--stdin");if(g===-1)return f;let u=await new Promise(($)=>{let w="";process.stdin.setEncoding("utf8"),process.stdin.on("data",(o)=>w+=o),process.stdin.on("end",()=>$(w.trim()))}),n=[...f];return n[g]=u,n}function _f(f){let g=f.includes("--short"),u=f.filter((h)=>h!=="--short"),n=u.indexOf("--tab"),$=n===-1?null:u[n+1];if(n!==-1)u=u.filter((h,W)=>W!==n&&W!==n+1);let w=u.indexOf("--locale"),o=w===-1?null:u[w+1];if(w!==-1)u=u.filter((h,W)=>W!==w&&W!==w+1);return{query:u.join(" "),tabPrefix:$,short:g,locale:o}}function Nf(f,g){if(!f.length||f[0]==="--help")process.stderr.write(g),process.exit(1)}function Kf(f,g,u=300){if(!g||f.length<=u)return f;let n=f.slice(0,u),$=n.lastIndexOf(" ");return $>0?`${n.slice(0,$)}…`:`${n}…`}function Uf(f){process.stdout.write(`${JSON.stringify(f,null,2)}
232
- `)}function i(f,g,u=null){if(!f||typeof f!=="object")return;let n=u?` (+${Date.now()-u}ms)`:"";if(f.lastStage=g,!Array.isArray(f.stages))f.stages=[];f.stages.push({stage:g,at:Date.now()});let $=f.engine||"extractor";console.error(`[${$}] stage: ${g}${n}`)}function uf({engine:f,mode:g="headless",clipboardEmpty:u=null,fallbackUsed:n=null,blockedBy:$=null,verificationResult:w=null,inputReady:o=null,durationMs:h=null,lastStage:W=null,stages:Q=null}={}){return{engine:f,mode:g,clipboardEmpty:u,fallbackUsed:n,blockedBy:$,verificationResult:w,inputReady:o,durationMs:h,lastStage:W,stages:Q}}function rf(f,g=null){if(g){let u=JSON.stringify({_envelope:g,error:f.message});process.stdout.write(`${u}
233
- `)}process.stderr.write(`Error: ${f.message}
234
- `),process.exit(1)}import{spawn as n0,execFileSync as Ff,execSync as $0}from"node:child_process";import{existsSync as s,readFileSync as d,renameSync as w0,unlinkSync as V,writeFileSync as e}from"node:fs";import Zf from"node:http";import{platform as af,tmpdir as h0}from"node:os";import{basename as bg}from"node:path";function xf(f=process.env,g=process.execPath){let u=f.GREEDY_SEARCH_NODE||f.NODE_BINARY||f.NODE;if(u?.trim())return u.trim();let n=bg(g||"").toLowerCase();if(n==="node"||n==="node.exe")return g;return"node"}import{existsSync as Af}from"node:fs";import{platform as Bg}from"node:os";import{join as U}from"node:path";function j(f){let g=Bg()==="win32",u=process.env.SystemRoot||"C:\\Windows",n={win32:{powershell:U(u,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:U(u,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:U(u,"System32","netstat.exe"),taskkill:U(u,"System32","taskkill.exe"),tasklist:U(u,"System32","tasklist.exe"),cmd:U(u,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},$=g?n.win32:n.unix,w=f.toLowerCase();if($[w]&&Af($[w]))return $[w];if(g&&w==="netstat"){let o=U(u,"Sysnative","netstat.exe");if(Af(o))return o}return f}import{existsSync as S,mkdirSync as jg,readFileSync as Mf,writeFileSync as qg}from"node:fs";import{homedir as Vg}from"node:os";import{join as Of}from"node:path";import{tmpdir as F}from"node:os";function Hg(f,g=9222){let u=Number.parseInt(String(f??""),10);return Number.isInteger(u)&&u>1024&&u<65535?u:g}var Z=Hg(process.env.GREEDY_SEARCH_PORT,9222),_=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${F().replaceAll("\\","/")}/greedysearch-chrome-profile`).replaceAll("\\","/"),O=`${_}/DevToolsActivePort`,_g=`${F().replaceAll("\\","/")}/cdp-pages.json`,r=process.env.GREEDY_SEARCH_MODE_FILE||`${F().replaceAll("\\","/")}/greedysearch-chrome-mode`,c0=`${F().replaceAll("\\","/")}/greedysearch-visible-recovery.jsonl`,$f=Of(Vg(),".dm"),q=Of($f,"greedyconfig"),wf=["perplexity","google","chatgpt"],hf="gemini";function Ng(){try{if(S(q)){let f=Mf(q,"utf8"),g=JSON.parse(f);if(Array.isArray(g.engines)&&g.engines.length>0&&g.engines.every((u)=>typeof u==="string")){let u=g.engines.filter(($)=>nf[$]),n=g.engines.filter(($)=>!nf[$]);if(n.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${q}: ${n.join(", ")}
235
- [greedysearch] Available engines: ${Object.keys(nf).join(", ")}
236
- `);if(u.length>0)return u;process.stderr.write(`[greedysearch] Warning: no valid engines in ${q}, falling back to defaults: ${wf.join(", ")}
237
- `)}}}catch{}return wf}function Kg(){try{if(!S($f))jg($f,{recursive:!0});if(!S(q))qg(q,JSON.stringify({engines:wf,synthesizer:hf},null,2)+`
238
- `,"utf8")}catch{}}Kg();var kf=["gemini","chatgpt"];function Ug(){try{if(S(q)){let f=Mf(q,"utf8"),g=JSON.parse(f);if(typeof g.synthesizer==="string"){let u=g.synthesizer.toLowerCase();if(kf.includes(u))return u;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${g.synthesizer}" in ${q}
239
- [greedysearch] Available synthesizers: ${kf.join(", ")}
240
- [greedysearch] Falling back to default: ${hf}
241
- `)}}}catch{}return hf}var nf={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"},L0=Ng();var I0=Ug(),S0=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=_;import{existsSync as a0,mkdirSync as rg,readFileSync as yf,renameSync as xg,unlinkSync as Ag,writeFileSync as Yf}from"node:fs";import kg from"node:http";import{platform as vf}from"node:os";import{dirname as Mg}from"node:path";var Df=[9222,9223],Og=/^(0|false|no|off)$/i;function zg(f){return[...new Set(f.filter(Boolean))]}function zf(f,g="explicit"){let u=new URL(f),n=u.protocol==="wss:"?"wss:":"ws:",$=u.port?Number.parseInt(u.port,10):n==="wss:"?443:80;return{source:g,wsUrl:`${n}//${u.host}${u.pathname}${u.search}`,host:u.hostname,port:$,path:`${u.pathname}${u.search}`,httpUrl:`http://${u.hostname}:${$}`}}function Gf(f=process.env){return![f.GREEDY_SEARCH_REUSE_EXISTING_BROWSER,f.DM_CUA_REUSE_EXISTING_BROWSER].some((g)=>g!==void 0&&Og.test(String(g)))}function of(f){let g=Number.parseInt(String(f??""),10);return Number.isInteger(g)&&g>0&&g<65536?g:null}function yg(f){if(!f)return null;let g=String(f).trim();if(!g)return null;let u=new URL(g.includes("://")?g:`http://${g}`),n=of(u.port)||(u.protocol==="https:"?443:80);return{host:u.hostname,port:n,source:`env:${g}`}}function Yg(f){if(!f)return[];return String(f).split(/[,\s]+/).map(of).filter(Boolean)}function vg({env:f=process.env,platformName:g=vf(),procVersionText:u=null}={}){if(g!=="linux")return!1;if(f.WSL_DISTRO_NAME||f.WSL_INTEROP)return!0;let n=u??(()=>{try{return yf("/proc/version","utf8")}catch{return""}})();return/microsoft|wsl/i.test(n)}function Dg({env:f=process.env,platformName:g=vf(),procVersionText:u=null,resolvConfText:n=null}={}){let $=["localhost","127.0.0.1"];if(vg({env:f,platformName:g,procVersionText:u})){let o=(n??(()=>{try{return yf("/etc/resolv.conf","utf8")}catch{return""}})()).match(/^\s*nameserver\s+([^\s#]+)/m);if(o)$.push(o[1]);$.push("host.docker.internal")}return zg($)}function Gg({env:f=process.env,hosts:g=Dg({env:f}),autoPorts:u=Df,excludePorts:n=[]}={}){let $=[];for(let W of["GREEDY_SEARCH_CDP_WS_URL","DM_CUA_CDP_WS_URL","CDP_WS_URL"])if(f[W])$.push({wsUrl:f[W],source:`env:${W}`});for(let W of["GREEDY_SEARCH_CDP_URL","DM_CUA_CDP_URL","CDP_URL"])try{let Q=yg(f[W]);if(Q)$.push(Q)}catch{}for(let W of["GREEDY_SEARCH_EXISTING_CDP_PORT","DM_CUA_EXISTING_CDP_PORT","GREEDY_SEARCH_CDP_PORT","DM_CUA_CDP_PORT"]){let Q=of(f[W]);if(!Q)continue;for(let l of g)$.push({host:l,port:Q,source:`env:${W}`})}let w=Yg(f.GREEDY_SEARCH_EXISTING_CDP_PORTS);for(let W of w)for(let Q of g)$.push({host:Q,port:W,source:"env:GREEDY_SEARCH_EXISTING_CDP_PORTS"});let o=new Set(n.filter(Boolean));if(Gf(f))for(let W of u){if(o.has(W))continue;for(let Q of g)$.push({host:Q,port:W,source:"auto"})}let h=new Set;return $.filter((W)=>{let Q=W.wsUrl||`${W.host}:${W.port}`;if(h.has(Q))return!1;return h.add(Q),!0})}async function tg(f,{timeoutMs:g=700}={}){if(f.wsUrl)return zf(f.wsUrl,f.source);let u=f.host||"localhost",n=f.port;if(!n)return null;let $=await new Promise((w)=>{let o=kg.get({host:u,port:n,path:"/json/version",timeout:g},(h)=>{let W="";h.setEncoding("utf8"),h.on("data",(Q)=>W+=Q),h.on("end",()=>w(h.statusCode===200?W:null))});o.on("error",()=>w(null)),o.setTimeout(g,()=>{o.destroy(),w(null)})});if(!$)return null;try{let w=JSON.parse($);if(!w.webSocketDebuggerUrl)return null;let o=zf(w.webSocketDebuggerUrl,f.source),h=o.path||new URL(w.webSocketDebuggerUrl).pathname;return{...o,host:u,port:n,httpUrl:`http://${u}:${n}`,wsUrl:`ws://${u}:${n}${h}`,path:h}}catch{return null}}async function Tg(f={}){for(let g of Gg(f)){let u=await tg(g,f);if(u)return u}return null}function Cg(f){if(!f)throw Error("missing CDP endpoint");let g=new URL(f.wsUrl);return`${g.host}
242
- ${g.pathname}${g.search}
243
- `}function Rg(f,g){rg(Mg(f),{recursive:!0});let u=`${f}.tmp-${process.pid}`;Yf(u,Cg(g),"utf8");try{Ag(f)}catch{}xg(u,f)}async function tf({activePortFile:f,modeFile:g,env:u=process.env,excludePorts:n=[],autoPorts:$=Df}={}){if(!Gf(u))return null;let w=await Tg({env:u,excludePorts:n,autoPorts:$});if(!w)return null;if(Rg(f,w),g)Yf(g,"existing","utf8");return w}import{existsSync as mg}from"node:fs";import{dirname as Pg,join as z}from"node:path";function cg(f){let g=new Set;return f.filter((u)=>{if(!u||g.has(u))return!1;return g.add(u),!0})}function Lg({moduleDir:f,entrypoint:g=process.argv[1],env:u=process.env}={}){let n=g?Pg(g):null,$=u.GREEDY_SEARCH_EXTENSION_DIR?.trim()||null;return cg([$?z($,"bin","launch.mjs"):null,f?z(f,"launch.mjs"):null,f?z(f,"..","bin","launch.mjs"):null,f?z(f,"..","..","bin","launch.mjs"):null,n?z(n,"launch.mjs"):null,n?z(n,"..","bin","launch.mjs"):null])}function Tf({moduleDir:f,entrypoint:g=process.argv[1],env:u=process.env,exists:n=mg}={}){let $=Lg({moduleDir:f,entrypoint:g,env:u}),w=$.find((o)=>n(o));if(w)return w;throw Error(`GreedySearch launcher not found. Checked candidates:
244
- ${$.map((o)=>`- ${o}`).join(`
245
- `)}`)}import{execFileSync as Ig}from"node:child_process";import{platform as Sg}from"node:os";function Fg(f,g){return Ig(j(f),g,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function pg(f){let g=String(f||"").match(/\b(\d+)\b/);return g?Number.parseInt(g[1],10):null}function ag(f){return pg(f)}function Eg(f,g){for(let u of String(f||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test(u))continue;if(!u.trim().split(/\s+/).slice(0,6).some((w)=>w.endsWith(`:${g}`)))continue;let $=u.match(/\bpid=(\d+)\b/);if($)return Number.parseInt($[1],10)}return null}function eg(f,g){for(let u of String(f||"").split(/\r?\n/)){let n=u.trim().split(/\s+/);if(n.length<5||n[0].toUpperCase()!=="TCP")continue;if(!n.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!n[1].endsWith(`:${g}`))continue;let w=Number.parseInt(n.at(-1),10);if(Number.isInteger(w)&&w>0)return w}return null}function Wf(f,g,u){try{return f(g,u)}catch{return null}}function p(f,{platformName:g=Sg(),run:u=Fg}={}){if(g==="win32")return eg(Wf(u,"netstat",["-ano","-p","TCP"]),f);let n=Wf(u,"lsof",["-nP",`-iTCP:${f}`,"-sTCP:LISTEN","-t"]),$=ag(n);if($)return $;if(g!=="linux")return null;return Eg(Wf(u,"ss",["-ltnp"]),f)}import{execFileSync as Cf,execSync as Wu}from"node:child_process";import{existsSync as x,mkdirSync as sg,readFileSync as y,unlinkSync as k,writeFileSync as M}from"node:fs";import{platform as dg,tmpdir as cf}from"node:os";var R=cf().replaceAll("\\","/"),a=`${R}/greedysearch-chrome-metadata.json`,A=`${R}/greedysearch-chrome-launch.lock`,f0=15000,t=`${R}/greedysearch-chrome.pid`,T=`${R}/greedysearch-chrome-mode`,Y=`${R}/greedysearch-chrome-last-activity`;function C(f){if(!Number.isInteger(f)||f<=0)return!1;try{return process.kill(f,0),!0}catch{return!1}}function g0(f){if(!C(f))return null;try{if(dg()==="win32")return Cf(j("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${f}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return Cf(j("ps"),["-p",String(f),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Qf(f,g,u=Z){if(!f)return!1;let n=(o)=>String(o||"").replaceAll("\\","/").toLowerCase(),$=n(f),w=n(g);return $.includes(w)&&$.includes(`--remote-debugging-port=${u}`)&&!$.includes("--type=")}function Rf(f,g,u=Z){return Qf(g0(f),g,u)}function u0(f=Z){return p(f)}function m(){try{if(x(a)){let f=y(a,"utf8"),g=JSON.parse(f);if(g&&typeof g.tempDir==="string"&&typeof g.debugPort==="number")return{browserPid:Number.isInteger(g.browserPid)?g.browserPid:void 0,debugPort:g.debugPort,tempDir:g.tempDir,clientPids:Array.isArray(g.clientPids)?g.clientPids.filter((u)=>Number.isInteger(u)&&u>0):[],sessionMode:g.sessionMode==="visible"?"visible":"headless",lastActivity:Number.isFinite(g.lastActivity)?g.lastActivity:0,launchedAt:Number.isFinite(g.launchedAt)?g.launchedAt:0}}}catch{}try{if(!(x(t)||x(T)||x(Y)))return null;let g=x(t)?Number.parseInt(y(t,"utf8").trim(),10)||void 0:void 0,u=x(T)?y(T,"utf8").trim()==="visible"?"visible":"headless":"headless",n=x(Y)?Number.parseInt(y(Y,"utf8").trim(),10)||0:0;return{browserPid:g,debugPort:Z,tempDir:_,clientPids:g?[g]:[],sessionMode:u,lastActivity:n,launchedAt:0}}catch{return null}}function E(f){try{M(a,JSON.stringify({browserPid:f.browserPid,debugPort:f.debugPort,tempDir:f.tempDir,clientPids:[...new Set(f.clientPids.filter((g)=>g>0))],sessionMode:f.sessionMode,lastActivity:f.lastActivity,launchedAt:f.launchedAt},null,2),"utf8")}catch{}try{if(f.browserPid)M(t,String(f.browserPid),"utf8")}catch{}try{M(T,f.sessionMode,"utf8")}catch{}try{M(Y,String(f.lastActivity),"utf8")}catch{}}function mf(){try{k(a)}catch{}try{k(t)}catch{}try{k(T)}catch{}try{k(Y)}catch{}}function Lf(f){if(!f)return f;let g={...f,clientPids:[...new Set([...f.clientPids,process.pid].filter((u)=>C(u)||u===process.pid))]};return E(g),g}function Xf(f){let g=Date.now();try{if(f)E({...f,lastActivity:g});else M(Y,String(g),"utf8")}catch{}}var iu=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5;var Pf=!1;function If(){if(Pf)return;Pf=!0;let f=m();if(!f)return;if(f.browserPid){if(!C(f.browserPid)){mf();return}if(!Rf(f.browserPid,f.tempDir,f.debugPort))mf();else E({...f,clientPids:f.clientPids.filter(($)=>C($))})}let g=u0();if(g&&g!==f.browserPid)if(Rf(g,_,Z))E({browserPid:g,debugPort:Z,tempDir:_,clientPids:[g],sessionMode:f.sessionMode,lastActivity:Date.now(),launchedAt:Date.now()});else return}function Sf(){sg(cf(),{recursive:!0});try{let f=JSON.stringify({pid:process.pid,ts:Date.now()});return M(A,f,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{let g=y(A,"utf8");if(JSON.parse(g).pid===process.pid)k(A)}catch{}}}}catch(f){if(f?.code!=="EEXIST")return{acquired:!1,release:()=>{}}}try{let f=y(A,"utf8"),g=JSON.parse(f),u=Date.now()-(g.ts||0);if(!C(g.pid)||u>f0){try{k(A)}catch{}try{let $=JSON.stringify({pid:process.pid,ts:Date.now()});return M(A,$,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{k(A)}catch{}}}}catch{return{acquired:!1,release:()=>{}}}}}catch{}return{acquired:!1,release:()=>{}}}var o0=import.meta.dirname||new URL(".",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),Ef=h0().replaceAll("\\","/"),P=`${Ef}/greedysearch-chrome.pid`,c=`${Ef}/greedysearch-chrome-last-activity`,W0=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5,Q0=Number.parseInt(process.env.GREEDY_SEARCH_VISIBLE_IDLE_TIMEOUT_MINUTES||"60",10)||60;function X0(f,g=Z){let u=String(f||"").toLowerCase();if(!u.includes(`--remote-debugging-port=${g}`)||u.includes("--type="))return null;return u.includes("--headless")}function ef(){try{let f=Jf(),g=f?sf(f):null,u=X0(g);if(u!==null){try{e(r,u?"headless":"visible","utf8")}catch{}return u}}catch{}try{if(!s(r))return!0;return d(r,"utf8").trim()==="headless"}catch{return!0}}function l0(){try{e(c,String(Date.now()),"utf8")}catch{}try{let f=m();if(f)Xf(f)}catch{}}function sf(f){try{if(af()==="win32")return Ff(j("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${f}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return Ff(j("ps"),["-p",String(f),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Jf(){return p(Z)}function df(){let f=[Jf()];if(s(P))f.push(Number.parseInt(d(P,"utf8").trim(),10)||null);for(let g of f){if(!g)continue;if(Qf(sf(g),_,Z))return g}return null}async function Z0(f=1500){let g=df();if(!g)return!1;try{let n=await new Promise((w,o)=>{let h=Zf.get(`http://localhost:${Z}/json/version`,(W)=>{let Q="";W.on("data",(l)=>Q+=l),W.on("end",()=>{try{w(JSON.parse(Q))}catch{o(Error("bad JSON"))}})});h.on("error",o),h.setTimeout(1000,()=>{h.destroy(),o(Error("timeout"))})}),$=new globalThis.WebSocket(n.webSocketDebuggerUrl);await new Promise((w)=>{$.onopen=()=>{$.send(JSON.stringify({id:1,method:"Browser.close"})),setTimeout(()=>{$.close(),w()},200)},$.onerror=()=>w(),setTimeout(w,1000)})}catch{}let u=Date.now()+f;while(Date.now()<u){let n=Jf();if(!n)return!0;if(n!==g)return!0;await new Promise(($)=>setTimeout($,150))}return J0()}function J0(){try{let f=df();if(!f)return!1;if(af()==="win32")$0(`${j("taskkill")} /F /PID ${f}`,{stdio:"ignore"});else process.kill(f,"SIGKILL");return!0}catch{return!1}}async function fg(){if(!await v(500)){try{V(P)}catch{}try{V(c)}catch{}try{V(r)}catch{}return!1}let g=await Z0(1500);try{V(P)}catch{}try{V(c)}catch{}try{V(r)}catch{}if(g)process.stderr.write(`[greedysearch] Killed Chrome on port ${Z}.
246
- `);return g}var pf=fg;async function i0(){let g=ef()?W0:Q0;if(g<=0)return!1;if(!s(c))return l0(),!1;try{let u=Number.parseInt(d(c,"utf8").trim(),10);if(!u)return!1;if((Date.now()-u)/60000>=g)return fg()}catch{}return!1}function v(f=3000){return new Promise((g)=>{let u=Zf.get(`http://localhost:${Z}/json/version`,(n)=>{n.resume(),g(n.statusCode===200)});u.on("error",()=>g(!1)),u.setTimeout(f,()=>{u.destroy(),g(!1)})})}async function lf(){let f=`${O}.lock`,g=`${O}.tmp`,u=5000,n=1000,$=await new Promise((w)=>{let o=Date.now(),h=()=>{try{let W=JSON.stringify({pid:process.pid,ts:Date.now()});e(f,W,{encoding:"utf8",flag:"wx"}),w(!0)}catch(W){if(W?.code!=="EEXIST"){if(Date.now()-o<1000)setTimeout(h,50);else w(!1);return}try{let Q=d(f,"utf8").trim(),l=Q.startsWith("{")?JSON.parse(Q):{ts:Number(Q)},b=Number(l?.ts)||0;if(b>0&&Date.now()-b>5000)try{V(f)}catch{}if(Date.now()-o<1000)setTimeout(h,50);else w(!1)}catch{if(Date.now()-o<1000)setTimeout(h,50);else w(!1)}}};h()});try{let w=await new Promise((Q,l)=>{let b=Zf.get(`http://localhost:${Z}/json/version`,(N)=>{let K="";N.on("data",(H)=>K+=H),N.on("end",()=>Q(K))});b.on("error",l),b.setTimeout(3000,()=>{b.destroy(),l(Error("timeout"))})}),{webSocketDebuggerUrl:o}=JSON.parse(w),h=new URL(o),W=`${h.pathname}${h.search}`;if($){e(g,`localhost:${Z}
247
- ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}async function gg(){let f=s(P)||!!m(),g=await tf({activePortFile:O,modeFile:r,excludePorts:f?[Z]:[]});if(g){process.stderr.write(`[greedysearch] Reusing existing browser CDP endpoint ${g.httpUrl} (${g.source}).
248
- `);return}If();let u=await i0(),n=u?!1:await v();if(!n&&!u)await new Promise((h)=>setTimeout(h,500)),n=await v();let $=!1;if(n){let h=ef(),W=process.env.GREEDY_SEARCH_VISIBLE==="1";if(!W&&!h)process.stderr.write(`[greedysearch] Visible Chrome detected — switching to headless mode...
249
- `),await pf(),await new Promise((Q)=>setTimeout(Q,1000)),$=!0;else if(W&&h)process.stderr.write(`[greedysearch] Headless Chrome detected switching to visible mode...
250
- `),await pf(),await new Promise((Q)=>setTimeout(Q,1000)),$=!0}if($?!1:await v()){await lf();try{let h=m();if(h)Xf(h),Lf(h)}catch{}return}let o=Sf();if(!o.acquired){let h=Date.now()+15000;while(Date.now()<h)if(await new Promise((W)=>setTimeout(W,250)),await v(1000)){await lf();return}throw Error(`Timed out waiting for another GreedySearch launcher on port ${Z}`)}try{if(await v(1000)){await lf();return}process.stderr.write(`GreedySearch Chrome not running on port ${Z} — auto-launching...
251
- `);let W=[Tf({moduleDir:o0,entrypoint:process.argv[1]})];if(process.env.GREEDY_SEARCH_VISIBLE!=="1")W.push("--headless");await new Promise((Q,l)=>{n0(xf(),W,{stdio:["ignore",process.stderr,process.stderr]}).on("close",(N)=>N===0?Q():l(Error("launch.mjs failed")))})}finally{o.release()}}var b0=`
308
+ `;return await f(["eval",n,i],e+5000)==="true"}async function bn(n){let t=n.indexOf("--stdin");if(t===-1)return n;let e=await new Promise((i)=>{let r="";process.stdin.setEncoding("utf8"),process.stdin.on("data",(u)=>r+=u),process.stdin.on("end",()=>i(r.trim()))}),o=[...n];return o[t]=e,o}function mn(n){let t=n.includes("--short"),e=n.filter((l)=>l!=="--short"),o=e.indexOf("--tab"),i=o===-1?null:e[o+1];if(o!==-1)e=e.filter((l,a)=>a!==o&&a!==o+1);let r=e.indexOf("--locale"),u=r===-1?null:e[r+1];if(r!==-1)e=e.filter((l,a)=>a!==r&&a!==r+1);return{query:e.join(" "),tabPrefix:i,short:t,locale:u}}function Wn(n,t){if(!n.length||n[0]==="--help")process.stderr.write(t),process.exit(1)}function jn(n,t,e=300){if(!t||n.length<=e)return n;let o=n.slice(0,e),i=o.lastIndexOf(" ");return i>0?`${o.slice(0,i)}…`:`${o}…`}function Jn(n){process.stdout.write(`${JSON.stringify(n,null,2)}
309
+ `)}function _(n,t,e=null){if(!n||typeof n!=="object")return;let o=e?` (+${Date.now()-e}ms)`:"";if(n.lastStage=t,!Array.isArray(n.stages))n.stages=[];n.stages.push({stage:t,at:Date.now()});let i=n.engine||"extractor";console.error(`[${i}] stage: ${t}${o}`)}function en({engine:n,mode:t="headless",clipboardEmpty:e=null,fallbackUsed:o=null,blockedBy:i=null,verificationResult:r=null,inputReady:u=null,durationMs:l=null,lastStage:a=null,stages:g=null}={}){return{engine:n,mode:t,clipboardEmpty:e,fallbackUsed:o,blockedBy:i,verificationResult:r,inputReady:u,durationMs:l,lastStage:a,stages:g}}function xn(n,t=null){if(t){let e=JSON.stringify({_envelope:t,error:n.message});process.stdout.write(`${e}
310
+ `)}process.stderr.write(`Error: ${n.message}
311
+ `),process.exit(1)}import{spawn as Ut,execFileSync as gn,execSync as Te}from"node:child_process";import{basename as st}from"node:path";function Nn(n=process.env,t=process.execPath){let e=n.GREEDY_SEARCH_NODE||n.NODE_BINARY||n.NODE;if(e?.trim())return e.trim();let o=st(t||"").toLowerCase();if(o==="node"||o==="node.exe")return t;return"node"}import{existsSync as Cn,readFileSync as hn,renameSync as Mt,unlinkSync as $,writeFileSync as I}from"node:fs";import sn from"node:http";import{platform as Gn}from"node:os";import{join as At}from"node:path";import{existsSync as Zn}from"node:fs";import{platform as ct}from"node:os";import{join as j}from"node:path";function w(n){let t=ct()==="win32",e=process.env.SystemRoot||"C:\\Windows",o={win32:{powershell:j(e,"System32","WindowsPowerShell","v1.0","powershell.exe"),powershell_ise:j(e,"System32","WindowsPowerShell","v1.0","powershell_ise.exe"),netstat:j(e,"System32","netstat.exe"),taskkill:j(e,"System32","taskkill.exe"),tasklist:j(e,"System32","tasklist.exe"),cmd:j(e,"System32","cmd.exe")},unix:{ps:"/usr/bin/ps",lsof:"/usr/bin/lsof",ss:"/usr/sbin/ss",grep:"/usr/bin/grep",kill:"/usr/bin/kill"}},i=t?o.win32:o.unix,r=n.toLowerCase();if(i[r]&&Zn(i[r]))return i[r];if(t&&r==="netstat"){let u=j(e,"Sysnative","netstat.exe");if(Zn(u))return u}return n}import{execFileSync as wt}from"node:child_process";import{platform as pt}from"node:os";function yt(n,t){return wt(w(n),t,{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:5000})}function _t(n){let t=String(n||"").match(/\b(\d+)\b/);return t?Number.parseInt(t[1],10):null}function vt(n){return _t(n)}function $t(n,t){for(let e of String(n||"").split(/\r?\n/)){if(!/\bLISTEN\b/i.test(e))continue;if(!e.trim().split(/\s+/).slice(0,6).some((r)=>r.endsWith(`:${t}`)))continue;let i=e.match(/\bpid=(\d+)\b/);if(i)return Number.parseInt(i[1],10)}return null}function bt(n,t){for(let e of String(n||"").split(/\r?\n/)){let o=e.trim().split(/\s+/);if(o.length<5||o[0].toUpperCase()!=="TCP")continue;if(!o.at(-2)?.toUpperCase().startsWith("LISTEN"))continue;if(!o[1].endsWith(`:${t}`))continue;let i=Number.parseInt(o.at(-1),10);if(Number.isInteger(i)&&i>0)return i}return null}function rn(n,t,e){try{return n(t,e)}catch{return null}}function Xn(n,{platformName:t=pt(),run:e=yt}={}){if(t==="win32")return bt(rn(e,"netstat",["-ano","-p","TCP"]),n);let o=rn(e,"lsof",["-nP",`-iTCP:${n}`,"-sTCP:LISTEN","-t"]),i=vt(o);if(i)return i;if(t!=="linux")return null;return $t(rn(e,"ss",["-ltnp"]),n)}import{existsSync as T,mkdirSync as mt,readFileSync as Bn,writeFileSync as Wt}from"node:fs";import{homedir as jt}from"node:os";import{join as Qn}from"node:path";import{tmpdir as Jt}from"node:os";function xt(n,t=9222){let e=Number.parseInt(String(n??""),10);return Number.isInteger(e)&&e>1024&&e<65535?e:t}var Nt=Jt().replaceAll("\\","/"),s=xt(process.env.GREEDY_SEARCH_PORT),c=(process.env.GREEDY_SEARCH_PROFILE_DIR||process.env.CDP_PROFILE_DIR||`${Nt}/greedysearch-chrome-profile`).replaceAll("\\","/"),Q=`${c}/DevToolsActivePort`,P=process.env.GREEDY_SEARCH_PID_FILE||`${c}/browser.pid`,Zt=process.env.CDP_PAGES_CACHE||`${c}/cdp-pages.json`,W=process.env.GREEDY_SEARCH_MODE_FILE||`${c}/browser-mode`,kn=process.env.GREEDY_SEARCH_METADATA_FILE||`${c}/browser-metadata.json`,Vn=process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE||`${c}/browser-launch.lock`,K=process.env.GREEDY_SEARCH_ACTIVITY_FILE||`${c}/browser-last-activity`,Ze=(process.env.CDP_SOCKET_DIR||`${c}/cdp-sockets`).replaceAll("\\","/"),Xe=`${c}/visible-recovery.jsonl`,un=Qn(jt(),".dm"),v=Qn(un,"greedyconfig"),ln=["perplexity","google","chatgpt","gemini"],fn="gemini";function Xt(){try{if(T(v)){let n=Bn(v,"utf8"),t=JSON.parse(n);if(Array.isArray(t.engines)&&t.engines.length>0&&t.engines.every((e)=>typeof e==="string")){let e=t.engines.filter((i)=>on[i]),o=t.engines.filter((i)=>!on[i]);if(o.length>0)process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${v}: ${o.join(", ")}
312
+ [greedysearch] Available engines: ${Object.keys(on).join(", ")}
313
+ `);if(e.length>0)return e;process.stderr.write(`[greedysearch] Warning: no valid engines in ${v}, falling back to defaults: ${ln.join(", ")}
314
+ `)}}}catch{}return ln}function qt(){try{if(!T(un))mt(un,{recursive:!0});if(!T(v))Wt(v,JSON.stringify({engines:ln,synthesizer:fn},null,2)+`
315
+ `,"utf8")}catch{}}qt();var qn=["gemini","chatgpt"];function Bt(){try{if(T(v)){let n=Bn(v,"utf8"),t=JSON.parse(n);if(typeof t.synthesizer==="string"){let e=t.synthesizer.toLowerCase();if(qn.includes(e))return e;process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${t.synthesizer}" in ${v}
316
+ [greedysearch] Available synthesizers: ${qn.join(", ")}
317
+ [greedysearch] Falling back to default: ${fn}
318
+ `)}}}catch{}return fn}var on={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"},qe=Xt();var Be=Bt(),Qe=Math.max(1,Number.parseInt(process.env.GREEDY_FETCH_CONCURRENCY||"5",10)||5);process.env.CDP_PROFILE_DIR=c;import{execFileSync as Hn,execSync as zn}from"node:child_process";import{existsSync as Y,mkdirSync as Qt,readFileSync as X,unlinkSync as x,writeFileSync as N}from"node:fs";import{platform as On}from"node:os";var C=kn,J=Vn,kt=15000,G=P,S=W,k=K;function V(n){if(!Number.isInteger(n)||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}function Vt(n){if(!V(n))return null;try{if(On()==="win32")return Hn(w("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${n}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return Hn(w("ps"),["-p",String(n),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Ht(n,t,e=s){if(!n)return!1;let o=(u)=>String(u||"").replaceAll("\\","/").toLowerCase(),i=o(n),r=o(t);return i.includes(r)&&i.includes(`--remote-debugging-port=${e}`)&&!i.includes("--type=")}function Un(n,t,e=s){return Ht(Vt(n),t,e)}function zt(n=s){try{if(On()==="win32"){let e=zn(`${w("netstat")} -ano -p TCP 2>nul`,{encoding:"utf8"}),o=new RegExp(String.raw`TCP\s+\S+:${n}\s+\S+:0\s+LISTENING\s+(\d+)`,"i"),i=e.match(o);return i?Number.parseInt(i[1],10):null}let t=zn(`${w("lsof")} -i :${n} -t 2>/dev/null || ${w("ss")} -tlnp 2>/dev/null | ${w("grep")} :${n} | ${w("grep")} -oP 'pid=\\K\\d+'`,{encoding:"utf8"}).trim();return t?Number.parseInt(t.split(`
319
+ `)[0],10):null}catch{return null}}function H(){try{if(Y(C)){let n=X(C,"utf8"),t=JSON.parse(n);if(t&&typeof t.tempDir==="string"&&typeof t.debugPort==="number")return{browserPid:Number.isInteger(t.browserPid)?t.browserPid:void 0,debugPort:t.debugPort,tempDir:t.tempDir,clientPids:Array.isArray(t.clientPids)?t.clientPids.filter((e)=>Number.isInteger(e)&&e>0):[],sessionMode:t.sessionMode==="visible"?"visible":"headless",lastActivity:Number.isFinite(t.lastActivity)?t.lastActivity:0,launchedAt:Number.isFinite(t.launchedAt)?t.launchedAt:0}}}catch{}try{let n=Y(G)?Number.parseInt(X(G,"utf8").trim(),10)||void 0:void 0,t=Y(S)?X(S,"utf8").trim()==="visible"?"visible":"headless":"headless",e=Y(k)?Number.parseInt(X(k,"utf8").trim(),10)||0:0;return{browserPid:n,debugPort:s,tempDir:c,clientPids:n?[n]:[],sessionMode:t,lastActivity:e,launchedAt:0}}catch{return null}}function L(n){try{N(C,JSON.stringify({browserPid:n.browserPid,debugPort:n.debugPort,tempDir:n.tempDir,clientPids:[...new Set(n.clientPids.filter((t)=>t>0))],sessionMode:n.sessionMode,lastActivity:n.lastActivity,launchedAt:n.launchedAt},null,2),"utf8")}catch{}try{if(n.browserPid)N(G,String(n.browserPid),"utf8")}catch{}try{N(S,n.sessionMode,"utf8")}catch{}try{N(k,String(n.lastActivity),"utf8")}catch{}}function Mn(){try{x(C)}catch{}try{x(G)}catch{}try{x(S)}catch{}try{x(k)}catch{}}function an(n){if(!n)return n;let t={...n,clientPids:[...new Set([...n.clientPids,process.pid].filter((e)=>V(e)||e===process.pid))]};return L(t),t}function F(n){let t=Date.now();try{if(n)L({...n,lastActivity:t});else N(k,String(t),"utf8")}catch{}}var Ae=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5;var An=!1;function Dn(){if(process.env.GREEDY_SEARCH_RESEARCH_CHILD)return;if(An)return;An=!0;let n=H();if(!n)return;if(n.browserPid){if(!V(n.browserPid)){Mn();return}if(!Un(n.browserPid,n.tempDir,n.debugPort))Mn();else L({...n,clientPids:n.clientPids.filter((i)=>V(i))})}let t=zt();if(t&&t!==n.browserPid)if(Un(t,c,s))L({browserPid:t,debugPort:s,tempDir:c,clientPids:[t],sessionMode:n.sessionMode,lastActivity:Date.now(),launchedAt:Date.now()});else process.stderr.write(`[greedysearch] Refusing to kill unverified listener ${t} on port ${s}.
320
+ `)}function Tn(){Qt(c,{recursive:!0});try{let n=JSON.stringify({pid:process.pid,ts:Date.now()});return N(J,n,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{let t=X(J,"utf8");if(JSON.parse(t).pid===process.pid)x(J)}catch{}}}}catch(n){if(n?.code!=="EEXIST")return{acquired:!1,release:()=>{}}}try{let n=X(J,"utf8"),t=JSON.parse(n),e=Date.now()-(t.ts||0);if(!V(t.pid)||e>kt){try{x(J)}catch{}try{let i=JSON.stringify({pid:process.pid,ts:Date.now()});return N(J,i,{encoding:"utf8",flag:"wx"}),{acquired:!0,release:()=>{try{x(J)}catch{}}}}catch{return{acquired:!1,release:()=>{}}}}}catch{}return{acquired:!1,release:()=>{}}}var Ot=import.meta.dirname||new URL(".",import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"),Pn=P,z=K,Dt=Number.parseInt(process.env.GREEDY_SEARCH_IDLE_TIMEOUT_MINUTES||"5",10)||5,Tt=Number.parseInt(process.env.GREEDY_SEARCH_VISIBLE_IDLE_TIMEOUT_MINUTES||"60",10)||60;function Pt(n,t=s){let e=String(n||"").toLowerCase();if(!e.includes(`--remote-debugging-port=${t}`)||e.includes("--type="))return null;return e.includes("--headless")}function Sn(){try{let n=E(),t=n?Ln(n):null,e=Pt(t);if(e!==null){try{I(W,e?"headless":"visible","utf8")}catch{}return e}}catch{}try{if(!Cn(W))return!0;return hn(W,"utf8").trim()==="headless"}catch{return!0}}function Kt(){try{I(z,String(Date.now()),"utf8")}catch{}try{let n=H();if(n)F(n)}catch{}}function Ln(n){try{if(Gn()==="win32")return gn(w("powershell"),["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId = ${n}").CommandLine`],{encoding:"utf8",windowsHide:!0,timeout:5000}).trim()||null;return gn(w("ps"),["-p",String(n),"-o","command="],{encoding:"utf8",timeout:5000}).trim()||null}catch{return null}}function Yt(n){let t=String(n||"").replaceAll("\\","/"),e=c.replaceAll("\\","/");return t.includes(`--remote-debugging-port=${s}`)&&t.includes(`--user-data-dir=${e}`)&&!t.includes("--type=")}function E(){return Xn(s)}function d(){let n=E();return n&&Yt(Ln(n))?n:null}async function Ct(n=1500){let t=d();if(!t)return process.stderr.write(`[greedysearch] Refusing to close an unverified listener.
321
+ `),!1;try{let o=await new Promise((r,u)=>{let l=sn.get(`http://localhost:${s}/json/version`,(a)=>{let g="";a.on("data",(h)=>g+=h),a.on("end",()=>{try{r(JSON.parse(g))}catch{u(Error("bad JSON"))}})});l.on("error",u),l.setTimeout(1000,()=>{l.destroy(),u(Error("timeout"))})}),i=new globalThis.WebSocket(o.webSocketDebuggerUrl);await new Promise((r)=>{i.onopen=()=>{if(d()!==t){i.close(),r();return}i.send(JSON.stringify({id:1,method:"Browser.close"})),setTimeout(()=>{i.close(),r()},200)},i.onerror=()=>r(),setTimeout(r,1000)})}catch{}let e=Date.now()+n;while(Date.now()<e){let o=E();if(!o)return!0;if(o!==t)return!1;await new Promise((i)=>setTimeout(i,150))}return Gt(t)}function Gt(n=null){try{let t=d();if(!t||n&&t!==n)return!1;if(Gn()==="win32")gn(w("taskkill"),["/F","/PID",String(t)],{stdio:"ignore",windowsHide:!0});else process.kill(t,"SIGKILL");return!0}catch{return!1}}async function Fn(){if(!d()){if(E())process.stderr.write(`[greedysearch] Refusing to kill an unverified listener.
322
+ `);return!1}if(!await b(500)){try{$(Pn)}catch{}try{$(z)}catch{}try{$(W)}catch{}return!1}let t=await Ct(1500);try{$(Pn)}catch{}try{$(z)}catch{}try{$(W)}catch{}if(t)process.stderr.write(`[greedysearch] Killed Chrome on port ${s}.
323
+ `);return t}var Kn=Fn;async function St(){let t=Sn()?Dt:Tt;if(t<=0)return!1;if(!Cn(z))return Kt(),!1;try{let e=Number.parseInt(hn(z,"utf8").trim(),10);if(!e)return!1;if((Date.now()-e)/60000>=t)return Fn()}catch{}return!1}function b(n=3000){return new Promise((t)=>{let e=sn.get(`http://localhost:${s}/json/version`,(o)=>{o.resume(),t(o.statusCode===200)});e.on("error",()=>t(!1)),e.setTimeout(n,()=>{e.destroy(),t(!1)})})}async function Yn(n=3000,t=200){let e=Date.now()+n;while(Date.now()<e){if(!await b(300))return!0;await new Promise((o)=>setTimeout(o,t))}return!await b(300)}async function R(){let n=`${Q}.lock`,t=`${Q}.tmp`,e=5000,o=1000,i=await new Promise((r)=>{let u=Date.now(),l=()=>{try{let a=JSON.stringify({pid:process.pid,ts:Date.now()});I(n,a,{encoding:"utf8",flag:"wx"}),r(!0)}catch(a){if(a?.code!=="EEXIST"){if(Date.now()-u<1000)setTimeout(l,50);else r(!1);return}try{let g=hn(n,"utf8").trim(),h=g.startsWith("{")?JSON.parse(g):{ts:Number(g)},m=Number(h?.ts)||0;if(m>0&&Date.now()-m>5000)try{$(n)}catch{}if(Date.now()-u<1000)setTimeout(l,50);else r(!1)}catch{if(Date.now()-u<1000)setTimeout(l,50);else r(!1)}}};l()});try{let r=await new Promise((a,g)=>{let h=sn.get(`http://localhost:${s}/json/version`,(m)=>{let U="";m.on("data",(M)=>U+=M),m.on("end",()=>a(U))});h.on("error",g),h.setTimeout(3000,()=>{h.destroy(),g(Error("timeout"))})}),{webSocketDebuggerUrl:u}=JSON.parse(r),l=new URL(u).pathname;if(i){I(t,`${s}
324
+ ${l}`,"utf8");try{$(Q)}catch{}Mt(t,Q)}}catch{}finally{if(i)try{$(n)}catch{}}}async function Rn(){if(process.env.GREEDY_SEARCH_RESEARCH_CHILD&&await b()){await R();try{let r=H();if(r)F(r),an(r)}catch{}return}Dn();let n=await St(),t=n?!1:await b();if(!t&&!n)await new Promise((r)=>setTimeout(r,500)),t=await b();let e=!1;if(t){let r=Sn(),u=process.env.GREEDY_SEARCH_VISIBLE==="1";if(!u&&!r)process.stderr.write(`[greedysearch] Visible Chrome detected switching to headless mode...
325
+ `),await Kn(),await Yn(),e=!0;else if(u&&r)process.stderr.write(`[greedysearch] Headless Chrome detected — switching to visible mode...
326
+ `),await Kn(),await Yn(),e=!0}if(e?!1:await b()){await R();try{let r=H();if(r)F(r),an(r)}catch{}return}let i=Tn();if(!i.acquired){let r=Date.now()+12000,u=!1;while(Date.now()<r){if(u=await b(500),u)break;await new Promise((l)=>setTimeout(l,250))}if(u){await R();return}}try{if(await b(1000)){await R();return}process.stderr.write(`GreedySearch Chrome not running on port ${s} — auto-launching...
327
+ `);let u=[At(Ot,"..","..","bin","launch.mjs")];if(process.env.GREEDY_SEARCH_VISIBLE!=="1")u.push("--headless");await new Promise((l,a)=>{Ut(Nn(),u,{stdio:["ignore",process.stderr,process.stderr]}).on("close",(h)=>h===0?l():a(Error("launch.mjs failed")))})}finally{i.release()}}var Lt=`
252
328
  (function() {
253
329
  // Google consent page (consent.google.com)
254
330
  var g = document.querySelector('#L2AGLb, button[jsname="b3VHJd"], .tHlp8d');
@@ -265,10 +341,10 @@ ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}asy
265
341
 
266
342
  return null;
267
343
  })()
268
- `;async function bf(f,g){let u=await g(["eval",f,b0]).catch(()=>null);if(u&&u!=="null")await new Promise((n)=>setTimeout(n,1500))}var B={input:'textarea[name="newMessage"]',submitButton:'button[aria-label="Submit search"]',answerContainer:'div[class*="prose"]',paperCard:'a[data-testid="search-result"]',exportButton:'button[aria-label="Export"]'};async function B0(f){return await X(["eval",f,`(() => {
344
+ `;async function cn(n,t){let e=await t(["eval",n,Lt]).catch(()=>null);if(e&&e!=="null")await new Promise((o)=>setTimeout(o,1500))}var y={input:'textarea[name="newMessage"]',submitButton:'button[aria-label="Submit search"]',answerContainer:'div[class*="prose"]',paperCard:'a[data-testid="search-result"]',exportButton:'button[aria-label="Export"]'};async function Ft(n){return await f(["eval",n,`(() => {
269
345
  const url = document.location.href || '';
270
346
  return url.indexOf('/sign-up/') !== -1 || url.indexOf('redirect_url=') !== -1;
271
- })()`]).catch(()=>"false")==="true"}async function ug(f){try{return JSON.parse(await X(["eval",f,`(() => {
347
+ })()`]).catch(()=>"false")==="true"}async function In(n){try{return JSON.parse(await f(["eval",n,`(() => {
272
348
  const url = document.location.href || '';
273
349
  const title = document.title || '';
274
350
  const text = document.body?.innerText || '';
@@ -279,7 +355,14 @@ ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}asy
279
355
  text.includes('refresh_request_origin_azp_mismatch') ||
280
356
  (text.includes('HTTP ERROR 405') && text.includes('This page isn'));
281
357
  return JSON.stringify({ stale, url, title, text: text.slice(0, 500) });
282
- })()`],5000))}catch{return{stale:!1,url:"",title:"",text:""}}}async function j0(f){for(let g of["https://consensus.app","https://clerk.consensus.app"])await X(["evalraw",f,"Storage.clearDataForOrigin",JSON.stringify({origin:g,storageTypes:"all"})]).catch((u)=>{console.error(`[consensus] Warning: failed to clear stale auth storage for ${g}: ${u.message}`)})}async function ng(f,g,u){let n=await ug(f);if(!n.stale)return!1;if(i(g,"auth-storage-reset",u),console.error(`[consensus] Detected stale Clerk/Consensus auth state (${n.title||n.url}) — clearing per-origin storage and retrying navigation`),g.fallbackUsed="clear-stale-consensus-auth",await j0(f),await X(["nav",f,"https://consensus.app/"],20000),await new Promise((w)=>setTimeout(w,900)),(await ug(f)).stale)throw g.blockedBy="signin",g.verificationResult="needs-human",Error("Consensus auth session is stale — visible Chrome is open. Please sign in again, then rerun the search.");return!0}async function q0(f,g){if(await X(["click",f,B.input]),await new Promise((n)=>setTimeout(n,D(200))),await ff(["type",f,"--stdin"],g),await new Promise((n)=>setTimeout(n,D(300))),await X(["eval",f,`(document.querySelector('${B.input}')?.value || '').length >= ${Math.floor(g.length*0.8)}`])!=="true")throw Error("Consensus input did not accept text — input verification failed")}async function V0(f){let u=await X(["eval",f,`(() => {
358
+ })()`],5000))}catch{return{stale:!1,url:"",title:"",text:""}}}async function Rt(n){for(let t of["https://consensus.app","https://clerk.consensus.app"])await f(["evalraw",n,"Storage.clearDataForOrigin",JSON.stringify({origin:t,storageTypes:"all"})]).catch((e)=>{console.error(`[consensus] Warning: failed to clear stale auth storage for ${t}: ${e.message}`)})}async function dn(n,t,e){let o=await In(n);if(!o.stale)return!1;if(_(t,"auth-storage-reset",e),console.error(`[consensus] Detected stale Clerk/Consensus auth state (${o.title||o.url}) — clearing per-origin storage and retrying navigation`),t.fallbackUsed="clear-stale-consensus-auth",await Rt(n),await f(["nav",n,"https://consensus.app/"],20000),await new Promise((r)=>setTimeout(r,900)),(await In(n)).stale)throw t.blockedBy="signin",t.verificationResult="needs-human",Error("Consensus auth session is stale — visible Chrome is open. Please sign in again, then rerun the search.");return!0}async function It(n,t){await f(["click",n,y.input]),await new Promise((u)=>setTimeout(u,q(200)));let e=async()=>{await nn(["type",n,"--stdin"],t),await new Promise((u)=>setTimeout(u,q(300)))},o=async()=>{let u=await f(["eval",n,`JSON.stringify(document.querySelector('${y.input}')?.value || '')`]);try{return JSON.parse(u)}catch{return u}},i=async()=>_n(await o(),t),r=async()=>{await f(["eval",n,`(() => {
359
+ const el = document.querySelector('${y.input}');
360
+ if (!el) return false;
361
+ el.focus();
362
+ el.select();
363
+ document.execCommand('delete');
364
+ return true;
365
+ })()`])};if(await e(),await i())return;if(await r(),await e(),!await i())throw Error("Consensus input did not accept text — input verification failed")}async function dt(n){let e=await f(["eval",n,`(() => {
283
366
  if (window.__pdiInstalled) return 'already';
284
367
  window.__pdiInstalled = true;
285
368
  const _origOpen = XMLHttpRequest.prototype.open;
@@ -294,14 +377,22 @@ ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}asy
294
377
  if (this.status === 200) {
295
378
  try {
296
379
  const parsed = JSON.parse(this.responseText);
297
- // Stack responses: the last one wins (the .CSV
298
- // request fires after Load More has settled).
299
- window.__papersDetailsResps = window.__papersDetailsResps || [];
300
- window.__papersDetailsResps.push({
380
+ // Keep only {largest, latest} instead of every
381
+ // partial Load-More response, to bound page
382
+ // memory. "latest" lets the caller detect the
383
+ // .CSV response fired after clickExportCsv;
384
+ // "largest" is the timeout fallback.
385
+ const entry = {
301
386
  at: Date.now(),
302
387
  count: Object.keys(parsed?.paperDetailsListByPaperId || {}).length,
303
388
  data: parsed,
304
- });
389
+ };
390
+ const store = window.__papersDetailsResps ||
391
+ (window.__papersDetailsResps = { largest: null, latest: null });
392
+ store.latest = entry;
393
+ if (!store.largest || entry.count > store.largest.count) {
394
+ store.largest = entry;
395
+ }
305
396
  } catch (e) {
306
397
  window.__papersDetailsErrors = window.__papersDetailsErrors || [];
307
398
  window.__papersDetailsErrors.push(String(e.message || e));
@@ -312,50 +403,92 @@ ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}asy
312
403
  return _origSend.apply(this, arguments);
313
404
  };
314
405
  return 'installed';
315
- })()`]);return u==="installed"||u==="already"}async function H0(f,g=1e4){let u=`new Promise((resolve) => {
316
- const _deadline = Date.now() + ${g};
406
+ })()`]);return e==="installed"||e==="already"}async function Et(n,t=1e4,e=0){let o=`new Promise((resolve) => {
407
+ const _deadline = Date.now() + ${t};
408
+ const _after = ${e};
317
409
  function _check() {
318
- const resps = window.__papersDetailsResps || [];
319
- if (resps.length > 0) {
320
- const last = resps[resps.length - 1];
321
- resolve(JSON.stringify({ ok: true, count: last.count, data: last.data }));
410
+ const store = window.__papersDetailsResps;
411
+ const latest = store && store.latest;
412
+ if (latest && latest.at > _after) {
413
+ resolve(JSON.stringify({ ok: true, count: latest.count, data: latest.data }));
322
414
  return;
323
415
  }
324
416
  if (Date.now() < _deadline) {
325
417
  setTimeout(_check, 200);
326
418
  } else {
327
- resolve(JSON.stringify({ ok: false, reason: 'timeout' }));
419
+ const largest = store && store.largest;
420
+ if (largest) {
421
+ resolve(JSON.stringify({ ok: true, count: largest.count, data: largest.data, stale: true }));
422
+ } else {
423
+ resolve(JSON.stringify({ ok: false, reason: 'timeout' }));
424
+ }
328
425
  }
329
426
  }
330
427
  _check();
331
- })`,n=await X(["eval",f,u],g+5000);return JSON.parse(n)}async function _0(f,g=8){if(!await G(f,B.paperCard,20000,500).catch(()=>!1))return console.error("[consensus] Warning: no paper cards appeared within 20s — Load More will be skipped"),0;await new Promise(($)=>setTimeout($,800));let n=0;for(let $=0;$<g;$++){if(await X(["eval",f,`(() => {
332
- const btns = Array.from(document.querySelectorAll('button'));
333
- return btns.some(b => {
334
- const t = (b.innerText || '').trim();
335
- return /load more/i.test(t) || /more results/i.test(t) || /show more/i.test(t);
336
- });
337
- })()`])!=="true")break;await X(["eval",f,`(() => {
338
- const btns = Array.from(document.querySelectorAll('button'));
339
- const btn = btns.find(b => {
340
- const t = (b.innerText || '').trim();
341
- return /load more/i.test(t) || /more results/i.test(t) || /show more/i.test(t);
342
- });
343
- btn?.click();
344
- return 'clicked';
345
- })()`]),n++,await new Promise((o)=>setTimeout(o,1500))}return n}async function N0(f){return await X(["eval",f,`(() => {
346
- const btn = document.querySelector('${B.exportButton}');
428
+ })`,i=await f(["eval",n,o],t+5000);try{return JSON.parse(i)}catch{return{ok:!1,reason:"invalid-json"}}}async function ne(n,t=8){if(!await B(n,y.paperCard,20000,500).catch(()=>!1))return console.error("[consensus] Warning: no paper cards appeared within 20s — Load More will be skipped"),0;let o=String.raw`
429
+ new Promise((resolve) => {
430
+ const _paperSel = '${y.paperCard}';
431
+ const _maxClicks = ${t};
432
+ function _findLoadMore() {
433
+ const btns = Array.from(document.querySelectorAll('button'));
434
+ return btns.find(b => {
435
+ const t = (b.innerText || '').trim();
436
+ return /load more/i.test(t) || /more results/i.test(t) || /show more/i.test(t);
437
+ }) || null;
438
+ }
439
+ function _cardCount() { return document.querySelectorAll(_paperSel).length; }
440
+ let _clicks = 0;
441
+ function _waitButton(deadline, cb) {
442
+ const btn = _findLoadMore();
443
+ if (btn) { cb(btn); return; }
444
+ if (Date.now() < deadline) { setTimeout(() => _waitButton(deadline, cb), 200); }
445
+ else { cb(null); }
446
+ }
447
+ function _loop() {
448
+ if (_clicks >= _maxClicks) { resolve(JSON.stringify({ clicks: _clicks, cards: _cardCount() })); return; }
449
+ const mountDeadline = Date.now() + (_clicks === 0 ? 3000 : 500);
450
+ _waitButton(mountDeadline, (btn) => {
451
+ if (!btn || btn.disabled) { resolve(JSON.stringify({ clicks: _clicks, cards: _cardCount() })); return; }
452
+ const before = _cardCount();
453
+ btn.click();
454
+ _clicks++;
455
+ const clickDeadline = Date.now() + 4000;
456
+ (function _pollCards() {
457
+ if (_cardCount() > before || Date.now() >= clickDeadline) { _loop(); return; }
458
+ setTimeout(_pollCards, 200);
459
+ })();
460
+ });
461
+ }
462
+ _loop();
463
+ })
464
+ `,i=await f(["eval",n,o],t*5000+5000).catch(()=>null);if(!i)return 0;try{let{clicks:r,cards:u}=JSON.parse(i);return console.error(`[consensus] expandReferences: ${r} click(s), ${u} card(s)`),r}catch{return 0}}async function te(n,t=1200){let e=String.raw`
465
+ new Promise((resolve) => {
466
+ const _sel = '${y.paperCard}';
467
+ const _deadline = Date.now() + ${t};
468
+ let _last = document.querySelectorAll(_sel).length;
469
+ function _poll() {
470
+ const cur = document.querySelectorAll(_sel).length;
471
+ if (cur === _last) { resolve(cur); return; }
472
+ _last = cur;
473
+ if (Date.now() < _deadline) { setTimeout(_poll, 300); }
474
+ else { resolve(_last); }
475
+ }
476
+ setTimeout(_poll, 300);
477
+ })
478
+ `;await f(["eval",n,e],t+3000).catch(()=>null)}async function ee(n){return await f(["eval",n,`(() => {
479
+ const btn = document.querySelector('${y.exportButton}');
347
480
  if (!btn) return 'no-export';
348
481
  btn.scrollIntoView({ block: 'center' });
349
482
  btn.click();
350
483
  return 'opened';
351
- })()`]),await new Promise((u)=>setTimeout(u,600)),await X(["eval",f,`(() => {
484
+ })()`]),await new Promise((e)=>setTimeout(e,600)),await f(["eval",n,`(() => {
352
485
  const btn = Array.from(document.querySelectorAll('button'))
353
486
  .find(b => /\\.CSV/.test((b.innerText || '').trim()));
354
487
  if (!btn) return 'no-csv';
355
488
  btn.click();
356
489
  return 'clicked';
357
- })()`])}function K0(f){let g=f?.paperDetailsListByPaperId||{},u=Object.keys(g),n=[];for(let $=0;$<u.length;$++){let w=g[u[$]]||{},o=w.url_slug||"",h=w.paper_id||w.hash_paper_id||u[$],W;if(o)W=`https://consensus.app/papers/${o}/${h}/`;else if(w.provider_url)W=w.provider_url;else if(w.doi)W=`https://doi.org/${w.doi}`;else W=`https://consensus.app/paper/${h}`;let Q=[],l=w.badges||{};if(l.study_type==="rct")Q.push("RCT");else if(l.study_type==="meta_analysis")Q.push("META-ANALYSIS");else if(l.study_type==="systematic_review")Q.push("SYSTEMATIC REVIEW");else if(l.study_type)Q.push(l.study_type.toUpperCase());if(l.rigorous_journal)Q.push("RIGOROUS JOURNAL");if(l.very_rigorous_journal)Q.push("VERY RIGOROUS JOURNAL");if(l.highly_cited_paper)Q.push("HIGHLY CITED");if(l.large_human_trial)Q.push("LARGE HUMAN TRIAL");if(w.is_retracted)Q.push("RETRACTED");if(w.open_access_pdf_url)Q.push("OPEN ACCESS");n.push({title:w.title||"",url:W,rank:$+1,authors:Array.isArray(w.authors)?w.authors:[],year:w.year||null,journal:w.journal||w.publisher_name||null,doi:w.doi||null,citation_count:w.citation_count||0,snippet:w.abstract_takeaway||"",tags:Q})}return n}async function $g(f){let g=`(() => {
358
- const cards = Array.from(document.querySelectorAll('${B.paperCard}'));
490
+ })()`])}function ie(n){let t=n?.paperDetailsListByPaperId||{},e=Object.keys(t),o=[];for(let i=0;i<e.length;i++){let r=t[e[i]]||{},u=r.url_slug||"",l=r.paper_id||r.hash_paper_id||e[i],a;if(u)a=`https://consensus.app/papers/${u}/${l}/`;else if(r.provider_url)a=r.provider_url;else if(r.doi)a=`https://doi.org/${r.doi}`;else a=`https://consensus.app/paper/${l}`;let g=[],h=r.badges||{};if(h.study_type==="rct")g.push("RCT");else if(h.study_type==="meta_analysis")g.push("META-ANALYSIS");else if(h.study_type==="systematic_review")g.push("SYSTEMATIC REVIEW");else if(h.study_type)g.push(h.study_type.toUpperCase());if(h.rigorous_journal)g.push("RIGOROUS JOURNAL");if(h.very_rigorous_journal)g.push("VERY RIGOROUS JOURNAL");if(h.highly_cited_paper)g.push("HIGHLY CITED");if(h.large_human_trial)g.push("LARGE HUMAN TRIAL");if(r.is_retracted)g.push("RETRACTED");if(r.open_access_pdf_url)g.push("OPEN ACCESS");o.push({title:r.title||"",url:a,rank:i+1,authors:Array.isArray(r.authors)?r.authors:[],year:r.year||null,journal:r.journal||r.publisher_name||null,doi:r.doi||null,citation_count:r.citation_count||0,snippet:r.abstract_takeaway||"",tags:g})}return o}async function En(n){let t=`(() => {
491
+ const cards = Array.from(document.querySelectorAll('${y.paperCard}'));
359
492
  const sources = [];
360
493
  const seen = new Set();
361
494
  for (const card of cards) {
@@ -377,8 +510,8 @@ ${W}`,"utf8");try{V(O)}catch{}w0(g,O)}}catch{}finally{if($)try{V(f)}catch{}}}asy
377
510
  sources.push({ title, url, rank, snippet, tags });
378
511
  }
379
512
  return JSON.stringify(sources);
380
- })()`,u=await X(["eval",f,g],1e4);return JSON.parse(u)}async function U0(f){let g=`(() => {
381
- const prose = document.querySelector('${B.answerContainer}');
513
+ })()`,e=await f(["eval",n,t],1e4);try{return JSON.parse(e)}catch{return[]}}async function re(n){let t=`(() => {
514
+ const prose = document.querySelector('${y.answerContainer}');
382
515
  return prose?.innerText?.trim() || '';
383
- })()`;return await X(["eval",f,g],1e4)||""}var r0=`Usage: node extractors/consensus.mjs "<query>" [--tab <prefix>]
384
- `;async function x0(){let f=await Hf(process.argv.slice(2));Nf(f,r0);let{query:g,tabPrefix:u,short:n}=_f(f),$=Date.now(),o={engine:"consensus",mode:process.env.GREEDY_SEARCH_VISIBLE==="1"?"visible":"headless",clipboardEmpty:null,fallbackUsed:null,blockedBy:null,verificationResult:null,inputReady:null};try{if(process.env.GREEDY_SEARCH_VISIBLE!=="1"&&process.env.GREEDY_SEARCH_ALWAYS_VISIBLE!=="1")process.env.GREEDY_SEARCH_HEADLESS="1";if(await gg(),!u)await X(["list"]);let h=await qf(u),W=await X(["eval",h,"document.location.href"]).catch(()=>""),Q=!1;try{let J=new URL(W).hostname.toLowerCase();Q=J==="consensus.app"||J.endsWith(".consensus.app")}catch{}if(!Q)i(o,"nav",$),await X(["nav",h,"https://consensus.app/"],20000),await new Promise((J)=>setTimeout(J,600));await ng(h,o,$),await bf(h,X),i(o,"input-wait",$);let l=await G(h,B.input,15000,400);if(o.inputReady=l,!l)if(await ng(h,o,$)){let L=await G(h,B.input,15000,400);if(o.inputReady=L,L)await bf(h,X);else throw Error("Consensus input not found after stale auth recovery — page may not have loaded or is in unexpected state")}else throw Error("Consensus input not found — page may not have loaded or is in unexpected state");if(await new Promise((J)=>setTimeout(J,D(gf.postClick))),i(o,"type-and-submit",$),await q0(h,g),await new Promise((J)=>setTimeout(J,D(gf.postType))),await X(["eval",h,`document.querySelector('${B.submitButton}')?.click()`]),await new Promise((J)=>setTimeout(J,2000)),await B0(h))throw o.blockedBy="signin",Error("Consensus requires sign-in — please sign in or create a free account in the visible browser window. Once signed in, cookies persist for future runs.");i(o,"answer-wait",$),await G(h,B.answerContainer,30000,500),await V0(h),i(o,"expand-refs",$);let b=await _0(h,8);if(b===0)console.error("[consensus] Note: 'Load more results' button not present (initial page has all references)");else console.error(`[consensus] Clicked 'Load more results' ${b} time(s) to expand references`);await new Promise((J)=>setTimeout(J,1500)),i(o,"csv-click",$);let N=await N0(h);if(N!=="clicked")console.error(`[consensus] Export → .CSV click did not register (${N}) — falling back to DOM`);i(o,"wait-csv-resp",$);let K=await H0(h,12000),H=[],Bf="dom";if(K.ok)H=K0(K.data),Bf="api-intercept",console.error(`[consensus] Captured /api/papers/details/ response with ${K.count} paper(s)`);else console.error(`[consensus] /api/papers/details/ response not captured (${K.reason}) — falling back to DOM cards`);i(o,"extract",$);let jf=await U0(h);if(!jf)throw Error("No answer extracted — Consensus may not have responded");if(H.length===0)H=await $g(h);else{let J=await $g(h),L=new Set(H.map((I)=>I.url));for(let I of J)if(!L.has(I.url))H.push(I)}let wg=await X(["eval",h,"document.location.href"]).catch(()=>"");o.durationMs=Date.now()-$,o.sourcePath=Bf,i(o,"done",$),Uf({query:g,url:wg,answer:Kf(jf,n),sources:H,_envelope:uf(o)})}catch(h){o.durationMs=Date.now()-$,rf(h,uf(o))}}x0();
516
+ })()`;return await f(["eval",n,t],1e4)||""}var oe=`Usage: node extractors/consensus.mjs "<query>" [--tab <prefix>]
517
+ `;async function ue(){let n=await bn(process.argv.slice(2));Wn(n,oe);let{query:t,tabPrefix:e,short:o}=mn(n),i=Date.now(),u={engine:"consensus",mode:process.env.GREEDY_SEARCH_VISIBLE==="1"?"visible":"headless",clipboardEmpty:null,fallbackUsed:null,blockedBy:null,verificationResult:null,inputReady:null};try{if(process.env.GREEDY_SEARCH_VISIBLE!=="1"&&process.env.GREEDY_SEARCH_ALWAYS_VISIBLE!=="1")process.env.GREEDY_SEARCH_HEADLESS="1";if(await Rn(),!e)await f(["list"]);let l=await vn(e),a=await f(["eval",l,"document.location.href"]).catch(()=>""),g=!1;try{let p=new URL(a).hostname.toLowerCase();g=p==="consensus.app"||p.endsWith(".consensus.app")}catch{}if(!g)_(u,"nav",i),await f(["nav",l,"https://consensus.app/"],20000),await new Promise((p)=>setTimeout(p,600));await dn(l,u,i),await cn(l,f),_(u,"input-wait",i);let h=await B(l,y.input,15000,400);if(u.inputReady=h,!h)if(await dn(l,u,i)){let O=await B(l,y.input,15000,400);if(u.inputReady=O,O)await cn(l,f);else throw Error("Consensus input not found after stale auth recovery — page may not have loaded or is in unexpected state")}else throw Error("Consensus input not found — page may not have loaded or is in unexpected state");if(await new Promise((p)=>setTimeout(p,q(tn.postClick))),_(u,"type-and-submit",i),await It(l,t),await new Promise((p)=>setTimeout(p,q(tn.postType))),await f(["eval",l,`document.querySelector('${y.submitButton}')?.click()`]),await new Promise((p)=>setTimeout(p,2000)),await Ft(l))throw u.blockedBy="signin",Error("Consensus requires sign-in — please sign in or create a free account in the visible browser window. Once signed in, cookies persist for future runs.");_(u,"answer-wait",i),await B(l,y.answerContainer,30000,500),await dt(l),_(u,"expand-refs",i);let m=await ne(l,8);if(m===0)console.error("[consensus] Note: 'Load more results' button not present (initial page has all references)");else console.error(`[consensus] Clicked 'Load more results' ${m} time(s) to expand references`);await te(l,1200),_(u,"csv-click",i);let U=Number(await f(["eval",l,"Date.now()"]).catch(()=>"0")||0),M=await ee(l);if(M!=="clicked")console.error(`[consensus] Export → .CSV click did not register (${M}) — falling back to DOM`);_(u,"wait-csv-resp",i);let A=await Et(l,12000,U),Z=[],wn="dom";if(A.ok)Z=ie(A.data),wn="api-intercept",console.error(`[consensus] Captured /api/papers/details/ response with ${A.count} paper(s)`);else console.error(`[consensus] /api/papers/details/ response not captured (${A.reason}) — falling back to DOM cards`);_(u,"extract",i);let pn=await re(l);if(!pn)throw Error("No answer extracted — Consensus may not have responded");if(Z.length===0)Z=await En(l);else{let p=await En(l),O=new Set(Z.map((D)=>D.url));for(let D of p)if(!O.has(D.url))Z.push(D)}let nt=await f(["eval",l,"document.location.href"]).catch(()=>"");u.durationMs=Date.now()-i,u.sourcePath=wn,_(u,"done",i),Jn({query:t,url:nt,answer:jn(pn,o),sources:Z,_envelope:en(u)})}catch(l){u.durationMs=Date.now()-i,xn(l,en(u))}}ue();