@duckmind/dm-windows-x64 0.60.4 → 0.60.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
- import{randomInt as Y}from"node:crypto";import{existsSync as j,readFileSync as P}from"node:fs";import I from"node:http";var C=`
1
+ import { randomInt } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import http from "node:http";
4
+ const CONSENT_JS = `
2
5
  (function() {
3
6
  // Google consent page (consent.google.com)
4
7
  var g = document.querySelector('#L2AGLb, button[jsname="b3VHJd"], .tHlp8d');
@@ -15,7 +18,8 @@ import{randomInt as Y}from"node:crypto";import{existsSync as j,readFileSync as P
15
18
 
16
19
  return null;
17
20
  })()
18
- `,v=`
21
+ `;
22
+ const VERIFY_DETECT_JS = `
19
23
  (function() {
20
24
  var url = document.location.href;
21
25
 
@@ -110,7 +114,8 @@ import{randomInt as Y}from"node:crypto";import{existsSync as j,readFileSync as P
110
114
 
111
115
  return null;
112
116
  })()
113
- `,k=`
117
+ `;
118
+ const VERIFY_RETRY_JS = `
114
119
  (function() {
115
120
  var url = document.location.href;
116
121
  var isVerifyPage = url.includes('/sorry/') ||
@@ -144,17 +149,301 @@ import{randomInt as Y}from"node:crypto";import{existsSync as j,readFileSync as P
144
149
 
145
150
  return 'still-verifying';
146
151
  })()
147
- `;async function y(A,G){let B=await G(["eval",A,C]).catch(()=>null);if(B&&B!=="null")await new Promise((z)=>setTimeout(z,1500))}function Z(A,G){return Y(A*1000,G*1000)/1000}async function F(A,G){if(!globalThis.WebSocket)return;let B=process.env.CDP_PROFILE_DIR;if(!B)return;let z=`${B.replaceAll("\\","/")}/DevToolsActivePort`;if(!j(z))return;let K=P(z,"utf8").trim().split(`
148
- `)[0],U=await new Promise((q,O)=>{let $=I.get(`http://localhost:${K}/json/version`,(W)=>{let L="";W.on("data",(H)=>L+=H),W.on("end",()=>{try{q(JSON.parse(L))}catch{O(Error("bad JSON"))}})});$.on("error",O),$.setTimeout(1000,()=>{$.destroy(),O(Error("timeout"))})}),Q=new globalThis.WebSocket(U.webSocketDebuggerUrl),N=0;await new Promise((q)=>{Q.onopen=async()=>{let O=(L,H)=>new Promise((V)=>{let T=++N,D=(J)=>{if(JSON.parse(J.data).id===T)Q.removeEventListener("message",D),V()};Q.addEventListener("message",D),Q.send(JSON.stringify({id:T,method:L,params:H}))}),$=A+Z(-2,2),W=G+Z(-2,2);await O("Input.dispatchMouseEvent",{type:"mouseMoved",x:$,y:W,button:"none"}),await new Promise((L)=>setTimeout(L,Z(80,160))),await O("Input.dispatchMouseEvent",{type:"mousePressed",x:$,y:W,button:"left",clickCount:1}),await new Promise((L)=>setTimeout(L,Z(30,80))),await O("Input.dispatchMouseEvent",{type:"mouseReleased",x:$+Z(-1,1),y:W+Z(-1,1),button:"left",clickCount:1}),setTimeout(()=>{Q.close(),q()},200)},Q.onerror=()=>q(),setTimeout(q,3000)})}async function S(A,G,B,z){let K=Number.parseFloat(B),U=Number.parseFloat(z);if(Number.isNaN(K)||Number.isNaN(U))throw Error(`humanClickXY: invalid coordinates (${B}, ${z})`);let Q={button:"left",clickCount:1,modifiers:0},N=K+Z(-3,3),q=U+Z(-3,3);await G(["evalraw",A,"Input.dispatchMouseEvent",JSON.stringify({...Q,type:"mouseMoved",x:N,y:q})]),await new Promise((H)=>setTimeout(H,Z(80,180)));let O=K+Z(-2,2),$=U+Z(-2,2);await G(["evalraw",A,"Input.dispatchMouseEvent",JSON.stringify({...Q,type:"mousePressed",x:O,y:$})]),await new Promise((H)=>setTimeout(H,Z(30,90)));let W=O+Z(-1,1),L=$+Z(-1,1);return await G(["evalraw",A,"Input.dispatchMouseEvent",JSON.stringify({...Q,type:"mouseReleased",x:W,y:L})]),await F(K,U).catch(()=>{}),await new Promise((H)=>setTimeout(H,Z(100,300))),`human-clicked at (${K.toFixed(0)}, ${U.toFixed(0)})`}async function w(A,G,B){let z=await G(["eval",A,`(function() {
149
- var el = document.querySelector('${B.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}');
152
+ `;
153
+ export async function dismissConsent(tab, cdp) {
154
+ const result = await cdp(["eval", tab, CONSENT_JS]).catch(() => null);
155
+ if (result && result !== "null") {
156
+ await new Promise((r) => setTimeout(r, 1500));
157
+ }
158
+ }
159
+ function rng(min, max) {
160
+ return randomInt(min * 1000, max * 1000) / 1000;
161
+ }
162
+ async function browserLevelClick(x, y) {
163
+ if (!globalThis.WebSocket)
164
+ return;
165
+ const profileDir = process.env.CDP_PROFILE_DIR;
166
+ if (!profileDir)
167
+ return;
168
+ const portFile = `${profileDir.replaceAll("\\", "/")}/DevToolsActivePort`;
169
+ if (!existsSync(portFile))
170
+ return;
171
+ const port = readFileSync(portFile, "utf8").trim().split(`
172
+ `)[0];
173
+ const version = await new Promise((resolve, reject) => {
174
+ const req = http.get(`http://localhost:${port}/json/version`, (res) => {
175
+ let body = "";
176
+ res.on("data", (d) => body += d);
177
+ res.on("end", () => {
178
+ try {
179
+ resolve(JSON.parse(body));
180
+ } catch {
181
+ reject(new Error("bad JSON"));
182
+ }
183
+ });
184
+ });
185
+ req.on("error", reject);
186
+ req.setTimeout(1000, () => {
187
+ req.destroy();
188
+ reject(new Error("timeout"));
189
+ });
190
+ });
191
+ const ws = new globalThis.WebSocket(version.webSocketDebuggerUrl);
192
+ let msgId = 0;
193
+ await new Promise((resolve) => {
194
+ ws.onopen = async () => {
195
+ const send = (method, params) => new Promise((r) => {
196
+ const id = ++msgId;
197
+ const handler = (evt) => {
198
+ if (JSON.parse(evt.data).id === id) {
199
+ ws.removeEventListener("message", handler);
200
+ r();
201
+ }
202
+ };
203
+ ws.addEventListener("message", handler);
204
+ ws.send(JSON.stringify({ id, method, params }));
205
+ });
206
+ const cx = x + rng(-2, 2);
207
+ const cy = y + rng(-2, 2);
208
+ await send("Input.dispatchMouseEvent", {
209
+ type: "mouseMoved",
210
+ x: cx,
211
+ y: cy,
212
+ button: "none"
213
+ });
214
+ await new Promise((r) => setTimeout(r, rng(80, 160)));
215
+ await send("Input.dispatchMouseEvent", {
216
+ type: "mousePressed",
217
+ x: cx,
218
+ y: cy,
219
+ button: "left",
220
+ clickCount: 1
221
+ });
222
+ await new Promise((r) => setTimeout(r, rng(30, 80)));
223
+ await send("Input.dispatchMouseEvent", {
224
+ type: "mouseReleased",
225
+ x: cx + rng(-1, 1),
226
+ y: cy + rng(-1, 1),
227
+ button: "left",
228
+ clickCount: 1
229
+ });
230
+ setTimeout(() => {
231
+ ws.close();
232
+ resolve();
233
+ }, 200);
234
+ };
235
+ ws.onerror = () => resolve();
236
+ setTimeout(resolve, 3000);
237
+ });
238
+ }
239
+ export async function humanClickXY(tab, cdpFn, x, y) {
240
+ const cx = Number.parseFloat(x);
241
+ const cy = Number.parseFloat(y);
242
+ if (Number.isNaN(cx) || Number.isNaN(cy)) {
243
+ throw new Error(`humanClickXY: invalid coordinates (${x}, ${y})`);
244
+ }
245
+ const base = { button: "left", clickCount: 1, modifiers: 0 };
246
+ const jx = cx + rng(-3, 3);
247
+ const jy = cy + rng(-3, 3);
248
+ await cdpFn([
249
+ "evalraw",
250
+ tab,
251
+ "Input.dispatchMouseEvent",
252
+ JSON.stringify({ ...base, type: "mouseMoved", x: jx, y: jy })
253
+ ]);
254
+ await new Promise((r) => setTimeout(r, rng(80, 180)));
255
+ const px = cx + rng(-2, 2);
256
+ const py = cy + rng(-2, 2);
257
+ await cdpFn([
258
+ "evalraw",
259
+ tab,
260
+ "Input.dispatchMouseEvent",
261
+ JSON.stringify({ ...base, type: "mousePressed", x: px, y: py })
262
+ ]);
263
+ await new Promise((r) => setTimeout(r, rng(30, 90)));
264
+ const rx = px + rng(-1, 1);
265
+ const ry = py + rng(-1, 1);
266
+ await cdpFn([
267
+ "evalraw",
268
+ tab,
269
+ "Input.dispatchMouseEvent",
270
+ JSON.stringify({ ...base, type: "mouseReleased", x: rx, y: ry })
271
+ ]);
272
+ await browserLevelClick(cx, cy).catch(() => {});
273
+ await new Promise((r) => setTimeout(r, rng(100, 300)));
274
+ return `human-clicked at (${cx.toFixed(0)}, ${cy.toFixed(0)})`;
275
+ }
276
+ export async function humanClickElement(tab, cdpFn, selector) {
277
+ const rect = await cdpFn([
278
+ "eval",
279
+ tab,
280
+ `(function() {
281
+ var el = document.querySelector('${selector.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}');
150
282
  if (!el) return 'null';
151
283
  var r = el.getBoundingClientRect();
152
284
  return JSON.stringify({x: r.left + r.width / 2, y: r.top + r.height / 2, w: r.width, h: r.height});
153
- })()`]).catch(()=>"null");if(!z||z==="null")return null;let K=JSON.parse(z);if(K.w===0||K.h===0||K.x===0&&K.y===0)return null;let{x:U,y:Q}=K;return S(A,G,U,Q)}function M(A,G,B){if(!B||B==="null"||B==="cleared"||B==="still-verifying"||B==="cf-closed-shadow-dom")return Promise.resolve("no-challenge");try{let z=JSON.parse(B);if(z.t==="sel"&&z.s)return process.stderr.write(`[greedysearch] Human-clicking "${z.txt}" via CDP...
154
- `),w(A,G,z.s).then((K)=>K!==null?"clicked":"cant-click");if(z.t==="xy"){if(!z.x&&!z.y)return Promise.resolve("cant-click");return process.stderr.write(`[greedysearch] Human-clicking at (${z.x.toFixed(0)}, ${z.y.toFixed(0)})...
155
- `),S(A,G,z.x,z.y).then(()=>"clicked")}}catch{}return Promise.resolve("no-challenge")}async function g(A,G){let B=await G(["eval",A,v]).catch(()=>null);if(B==="cf-closed-shadow-dom"){let z=await m(A,G).catch(()=>null);if(z)return z;return B}if(B&&B!=="null")return B;return null}async function m(A,G){if(typeof G!=="function")return null;await G(["evalraw",A,"DOM.enable","{}"]).catch(()=>{});let B=await G(["evalraw",A,"DOM.getDocument",JSON.stringify({depth:-1,pierce:!0})]).catch(()=>null);if(!B)return null;let z;try{z=JSON.parse(B)}catch{return null}if(z.error||!z.root)return null;let K=z.root;return await E(K,A,G)}async function E(A,G,B){if(!A)return null;let z=[];if(A.shadowRoots&&A.shadowRoots.length>0)for(let K of A.shadowRoots)z.push(K);if(A.children)for(let K of A.children)z.push(K);for(let K of z){if(K.nodeName==="IFRAME"){let Q=K.attributes||[],N=Q.indexOf("src"),q=N>=0?Q[N+1]:"";if(q&&/challenges\.cloudflare\.com|turnstile/i.test(q)&&K.backendNodeId){let O=await B(["evalraw",G,"DOM.getBoxModel",JSON.stringify({backendNodeId:K.backendNodeId})]).catch(()=>null);if(!O)continue;let $;try{$=JSON.parse(O)}catch{continue}let W=$?.model?.content||$?.result?.model?.content;if(!W||W.length<8)continue;let L=W[0],H=W[1],V=W[4],T=W[5],D=V-L,J=T-H;if(D<50||J<20)continue;let X=L+D*0.25,_=H+J*0.5;return process.stderr.write(`[greedysearch] Found CF iframe via CDP pierce at (${L.toFixed(0)}, ${H.toFixed(0)}) ${D.toFixed(0)}x${J.toFixed(0)}, clicking checkbox at (${X.toFixed(0)}, ${_.toFixed(0)})
156
- `),JSON.stringify({t:"xy",x:X,y:_})}}let U=await E(K,G,B);if(U)return U}return null}async function u(A,G,B=30000){let z=await g(A,G);if(!z)return"clear";if(z==="sorry-page"){process.stderr.write(`[greedysearch] Google CAPTCHA detected — please solve it in the browser window (waiting up to ${Math.floor(B/1000)}s)...
157
- `);let U=Date.now()+B;while(Date.now()<U)if(await new Promise((N)=>setTimeout(N,2000)),!(await G(["eval",A,"document.location.href"]).catch(()=>"")).includes("/sorry/"))return"cleared-by-user";return"needs-human"}let K=await M(A,G,z);if(K==="clicked"){await new Promise((Q)=>setTimeout(Q,2000));let U=Date.now()+B;while(Date.now()<U){let Q=await G(["eval",A,k]).catch(()=>null);if(Q==="cleared"||!Q||Q==="null")return process.stderr.write(`[greedysearch] Verification cleared.
158
- `),"clicked";if(Q!=="still-verifying")await M(A,G,Q),await new Promise((N)=>setTimeout(N,2000));else await new Promise((N)=>setTimeout(N,1500))}return process.stderr.write(`[greedysearch] Verification may require manual intervention.
159
- `),"needs-human"}if(K==="cant-click")return process.stderr.write(`[greedysearch] Verification challenge detected but cannot be auto-clicked — please solve it manually in the visible browser window.
160
- `),"needs-human";return"clear"}export{S as humanClickXY,w as humanClickElement,u as handleVerification,y as dismissConsent,g as detectVerificationChallenge};
285
+ })()`
286
+ ]).catch(() => "null");
287
+ if (!rect || rect === "null") {
288
+ return null;
289
+ }
290
+ const parsed = JSON.parse(rect);
291
+ if (parsed.w === 0 || parsed.h === 0 || parsed.x === 0 && parsed.y === 0) {
292
+ return null;
293
+ }
294
+ const { x, y } = parsed;
295
+ return humanClickXY(tab, cdpFn, x, y);
296
+ }
297
+ function tryHumanClick(tab, cdp, detectResult) {
298
+ if (!detectResult || detectResult === "null" || detectResult === "cleared" || detectResult === "still-verifying" || detectResult === "cf-closed-shadow-dom")
299
+ return Promise.resolve("no-challenge");
300
+ try {
301
+ const info = JSON.parse(detectResult);
302
+ if (info.t === "sel" && info.s) {
303
+ process.stderr.write(`[greedysearch] Human-clicking "${info.txt}" via CDP...
304
+ `);
305
+ return humanClickElement(tab, cdp, info.s).then((r) => r !== null ? "clicked" : "cant-click");
306
+ }
307
+ if (info.t === "xy") {
308
+ if (!info.x && !info.y)
309
+ return Promise.resolve("cant-click");
310
+ process.stderr.write(`[greedysearch] Human-clicking at (${info.x.toFixed(0)}, ${info.y.toFixed(0)})...
311
+ `);
312
+ return humanClickXY(tab, cdp, info.x, info.y).then(() => "clicked");
313
+ }
314
+ } catch {}
315
+ return Promise.resolve("no-challenge");
316
+ }
317
+ export async function detectVerificationChallenge(tab, cdp) {
318
+ const result = await cdp(["eval", tab, VERIFY_DETECT_JS]).catch(() => null);
319
+ if (result === "cf-closed-shadow-dom") {
320
+ const cfIframe = await findCloudflareIframeViaPierce(tab, cdp).catch(() => null);
321
+ if (cfIframe)
322
+ return cfIframe;
323
+ return result;
324
+ }
325
+ if (result && result !== "null")
326
+ return result;
327
+ return null;
328
+ }
329
+ async function findCloudflareIframeViaPierce(tab, cdp) {
330
+ if (typeof cdp !== "function")
331
+ return null;
332
+ await cdp(["evalraw", tab, "DOM.enable", "{}"]).catch(() => {});
333
+ const doc = await cdp(["evalraw", tab, "DOM.getDocument", JSON.stringify({ depth: -1, pierce: true })]).catch(() => null);
334
+ if (!doc)
335
+ return null;
336
+ let docParsed;
337
+ try {
338
+ docParsed = JSON.parse(doc);
339
+ } catch {
340
+ return null;
341
+ }
342
+ if (docParsed.error || !docParsed.root)
343
+ return null;
344
+ const root = docParsed.root;
345
+ const found = await walkForCfIframe(root, tab, cdp);
346
+ return found;
347
+ }
348
+ async function walkForCfIframe(node, tab, cdp) {
349
+ if (!node)
350
+ return null;
351
+ const children = [];
352
+ if (node.shadowRoots && node.shadowRoots.length > 0) {
353
+ for (const s of node.shadowRoots) {
354
+ children.push(s);
355
+ }
356
+ }
357
+ if (node.children) {
358
+ for (const c of node.children)
359
+ children.push(c);
360
+ }
361
+ for (const child of children) {
362
+ if (child.nodeName === "IFRAME") {
363
+ const attrs = child.attributes || [];
364
+ const srcIdx = attrs.indexOf("src");
365
+ const src = srcIdx >= 0 ? attrs[srcIdx + 1] : "";
366
+ if (src && /challenges\.cloudflare\.com|turnstile/i.test(src) && child.backendNodeId) {
367
+ const boxRes = await cdp([
368
+ "evalraw",
369
+ tab,
370
+ "DOM.getBoxModel",
371
+ JSON.stringify({ backendNodeId: child.backendNodeId })
372
+ ]).catch(() => null);
373
+ if (!boxRes)
374
+ continue;
375
+ let boxParsed;
376
+ try {
377
+ boxParsed = JSON.parse(boxRes);
378
+ } catch {
379
+ continue;
380
+ }
381
+ const content = boxParsed?.model?.content || boxParsed?.result?.model?.content;
382
+ if (!content || content.length < 8)
383
+ continue;
384
+ const x1 = content[0];
385
+ const y1 = content[1];
386
+ const x3 = content[4];
387
+ const y3 = content[5];
388
+ const width = x3 - x1;
389
+ const height = y3 - y1;
390
+ if (width < 50 || height < 20)
391
+ continue;
392
+ const checkboxX = x1 + width * 0.25;
393
+ const checkboxY = y1 + height * 0.5;
394
+ process.stderr.write(`[greedysearch] Found CF iframe via CDP pierce at (${x1.toFixed(0)}, ${y1.toFixed(0)}) ${width.toFixed(0)}x${height.toFixed(0)}, clicking checkbox at (${checkboxX.toFixed(0)}, ${checkboxY.toFixed(0)})
395
+ `);
396
+ return JSON.stringify({ t: "xy", x: checkboxX, y: checkboxY });
397
+ }
398
+ }
399
+ const deeper = await walkForCfIframe(child, tab, cdp);
400
+ if (deeper)
401
+ return deeper;
402
+ }
403
+ return null;
404
+ }
405
+ export async function handleVerification(tab, cdp, waitMs = 30000) {
406
+ const result = await detectVerificationChallenge(tab, cdp);
407
+ if (!result)
408
+ return "clear";
409
+ if (result === "sorry-page") {
410
+ process.stderr.write(`[greedysearch] Google CAPTCHA detected — please solve it in the browser window (waiting up to ${Math.floor(waitMs / 1000)}s)...
411
+ `);
412
+ const deadline = Date.now() + waitMs;
413
+ while (Date.now() < deadline) {
414
+ await new Promise((r) => setTimeout(r, 2000));
415
+ const url = await cdp(["eval", tab, "document.location.href"]).catch(() => "");
416
+ if (!url.includes("/sorry/"))
417
+ return "cleared-by-user";
418
+ }
419
+ return "needs-human";
420
+ }
421
+ const clickResult = await tryHumanClick(tab, cdp, result);
422
+ if (clickResult === "clicked") {
423
+ await new Promise((r) => setTimeout(r, 2000));
424
+ const deadline = Date.now() + waitMs;
425
+ while (Date.now() < deadline) {
426
+ const retryResult = await cdp(["eval", tab, VERIFY_RETRY_JS]).catch(() => null);
427
+ if (retryResult === "cleared" || !retryResult || retryResult === "null") {
428
+ process.stderr.write(`[greedysearch] Verification cleared.
429
+ `);
430
+ return "clicked";
431
+ }
432
+ if (retryResult !== "still-verifying") {
433
+ await tryHumanClick(tab, cdp, retryResult);
434
+ await new Promise((r) => setTimeout(r, 2000));
435
+ } else {
436
+ await new Promise((r) => setTimeout(r, 1500));
437
+ }
438
+ }
439
+ process.stderr.write(`[greedysearch] Verification may require manual intervention.
440
+ `);
441
+ return "needs-human";
442
+ }
443
+ if (clickResult === "cant-click") {
444
+ process.stderr.write(`[greedysearch] Verification challenge detected but cannot be auto-clicked — please solve it manually in the visible browser window.
445
+ `);
446
+ return "needs-human";
447
+ }
448
+ return "clear";
449
+ }