browser-autopilot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -0
- package/dist/agent/history.d.ts +41 -0
- package/dist/agent/history.js +98 -0
- package/dist/agent/history.js.map +1 -0
- package/dist/agent/loop.d.ts +34 -0
- package/dist/agent/loop.js +278 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/run.d.ts +4 -0
- package/dist/agent/run.js +67 -0
- package/dist/agent/run.js.map +1 -0
- package/dist/agent/state.d.ts +37 -0
- package/dist/agent/state.js +82 -0
- package/dist/agent/state.js.map +1 -0
- package/dist/agent/tools.d.ts +414 -0
- package/dist/agent/tools.js +399 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/browser/cdp.d.ts +91 -0
- package/dist/browser/cdp.js +470 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/dom.d.ts +30 -0
- package/dist/browser/dom.js +79 -0
- package/dist/browser/dom.js.map +1 -0
- package/dist/browser/snapshot.d.ts +19 -0
- package/dist/browser/snapshot.js +70 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/captcha/solver.d.ts +20 -0
- package/dist/captcha/solver.js +101 -0
- package/dist/captcha/solver.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator.d.ts +33 -0
- package/dist/orchestrator.js +197 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/viewer/server.d.ts +14 -0
- package/dist/viewer/server.js +93 -0
- package/dist/viewer/server.js.map +1 -0
- package/dist/x11/agent.d.ts +34 -0
- package/dist/x11/agent.js +103 -0
- package/dist/x11/agent.js.map +1 -0
- package/dist/x11/chrome.d.ts +9 -0
- package/dist/x11/chrome.js +107 -0
- package/dist/x11/chrome.js.map +1 -0
- package/dist/x11/input.d.ts +13 -0
- package/dist/x11/input.js +75 -0
- package/dist/x11/input.js.map +1 -0
- package/dist/x11/login.d.ts +6 -0
- package/dist/x11/login.js +76 -0
- package/dist/x11/login.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete browser automation tools.
|
|
3
|
+
* Each tool maps to a CDP operation. Index-based element targeting.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { tool } from "ai";
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
import { config } from "../config.js";
|
|
9
|
+
import { readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
10
|
+
import { dirname, join } from "path";
|
|
11
|
+
export function createBrowserTools(browser, dataDir = "/data") {
|
|
12
|
+
return {
|
|
13
|
+
// ── Navigation ───────────────────────────────────────────────────
|
|
14
|
+
navigate: tool({
|
|
15
|
+
description: "Navigate to a URL",
|
|
16
|
+
parameters: z.object({ url: z.string() }),
|
|
17
|
+
execute: async ({ url }) => {
|
|
18
|
+
await browser.navigate(url);
|
|
19
|
+
return `Navigated to ${url}`;
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
go_back: tool({
|
|
23
|
+
description: "Go back in browser history",
|
|
24
|
+
parameters: z.object({}),
|
|
25
|
+
execute: async () => { await browser.goBack(); return "Went back"; },
|
|
26
|
+
}),
|
|
27
|
+
reload: tool({
|
|
28
|
+
description: "Reload the current page",
|
|
29
|
+
parameters: z.object({}),
|
|
30
|
+
execute: async () => { await browser.reload(); return "Reloaded"; },
|
|
31
|
+
}),
|
|
32
|
+
search: tool({
|
|
33
|
+
description: "Search the web using DuckDuckGo",
|
|
34
|
+
parameters: z.object({ query: z.string() }),
|
|
35
|
+
execute: async ({ query }) => {
|
|
36
|
+
const url = `https://duckduckgo.com/?q=${encodeURIComponent(query)}`;
|
|
37
|
+
await browser.navigate(url);
|
|
38
|
+
return `Searched: ${query}`;
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
// ── Element interaction (by index) ───────────────────────────────
|
|
42
|
+
click: tool({
|
|
43
|
+
description: "Click an element by its index number [N] from the DOM tree",
|
|
44
|
+
parameters: z.object({ index: z.number() }),
|
|
45
|
+
execute: async ({ index }) => {
|
|
46
|
+
await browser.clickByIndex(index);
|
|
47
|
+
return `Clicked element [${index}]`;
|
|
48
|
+
},
|
|
49
|
+
}),
|
|
50
|
+
click_at: tool({
|
|
51
|
+
description: "Click at screen coordinates (x, y)",
|
|
52
|
+
parameters: z.object({ x: z.number(), y: z.number() }),
|
|
53
|
+
execute: async ({ x, y }) => {
|
|
54
|
+
await browser.clickAtCoords(x, y);
|
|
55
|
+
return `Clicked at (${x}, ${y})`;
|
|
56
|
+
},
|
|
57
|
+
}),
|
|
58
|
+
input: tool({
|
|
59
|
+
description: "Type text into an element by its index number [N]. Set clear=true to clear existing text first.",
|
|
60
|
+
parameters: z.object({
|
|
61
|
+
index: z.number(),
|
|
62
|
+
text: z.string(),
|
|
63
|
+
clear: z.boolean().default(true),
|
|
64
|
+
}),
|
|
65
|
+
execute: async ({ index, text, clear }) => {
|
|
66
|
+
await browser.inputByIndex(index, text, clear);
|
|
67
|
+
return `Typed "${text.slice(0, 30)}${text.length > 30 ? "..." : ""}" into [${index}]`;
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
send_keys: tool({
|
|
71
|
+
description: "Press keyboard keys (Enter, Tab, Escape, ArrowDown, Space, etc.)",
|
|
72
|
+
parameters: z.object({ keys: z.string().describe("Space-separated key names") }),
|
|
73
|
+
execute: async ({ keys }) => {
|
|
74
|
+
for (const key of keys.split(/\s+/)) {
|
|
75
|
+
await browser.pressKey(key);
|
|
76
|
+
}
|
|
77
|
+
return `Pressed: ${keys}`;
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
80
|
+
scroll: tool({
|
|
81
|
+
description: "Scroll the page up or down",
|
|
82
|
+
parameters: z.object({
|
|
83
|
+
direction: z.enum(["up", "down"]),
|
|
84
|
+
pixels: z.number().default(500),
|
|
85
|
+
}),
|
|
86
|
+
execute: async ({ direction, pixels }) => {
|
|
87
|
+
await browser.scroll(direction, pixels);
|
|
88
|
+
return `Scrolled ${direction} ${pixels}px`;
|
|
89
|
+
},
|
|
90
|
+
}),
|
|
91
|
+
find_text: tool({
|
|
92
|
+
description: "Scroll to specific text on the page",
|
|
93
|
+
parameters: z.object({ text: z.string() }),
|
|
94
|
+
execute: async ({ text }) => {
|
|
95
|
+
const found = await browser.scrollToText(text);
|
|
96
|
+
return found ? `Found and scrolled to "${text}"` : `Text "${text}" not found on page`;
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
scroll_to_element: tool({
|
|
100
|
+
description: "Scroll an element [N] into view",
|
|
101
|
+
parameters: z.object({ index: z.number() }),
|
|
102
|
+
execute: async ({ index }) => {
|
|
103
|
+
const ok = await browser.scrollToElement(index);
|
|
104
|
+
return ok ? `Scrolled element [${index}] into view` : `Element [${index}] not found`;
|
|
105
|
+
},
|
|
106
|
+
}),
|
|
107
|
+
// ── Content extraction ────────────────────────────────────────────
|
|
108
|
+
screenshot: tool({
|
|
109
|
+
description: "Take a screenshot for visual confirmation",
|
|
110
|
+
parameters: z.object({}),
|
|
111
|
+
execute: async () => {
|
|
112
|
+
const img = await browser.screenshot();
|
|
113
|
+
return { type: "screenshot", image_base64: img };
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
116
|
+
extract: tool({
|
|
117
|
+
description: `Save the page's visible text to ${dataDir}/page.txt and return a preview. ` +
|
|
118
|
+
"Use 'shell' to grep/search the saved file for specific information.",
|
|
119
|
+
parameters: z.object({ query: z.string().describe("What you're looking for (for your own reference)") }),
|
|
120
|
+
execute: async ({ query }) => {
|
|
121
|
+
const text = await browser.getPageText();
|
|
122
|
+
const outPath = join(dataDir, "page.txt");
|
|
123
|
+
mkdirSync(dataDir, { recursive: true });
|
|
124
|
+
writeFileSync(outPath, text);
|
|
125
|
+
return `Saved ${text.length} chars to ${outPath}. Preview:\n${text.slice(0, 500)}\n\nUse shell to search: grep -in "${query}" ${outPath}`;
|
|
126
|
+
},
|
|
127
|
+
}),
|
|
128
|
+
search_page: tool({
|
|
129
|
+
description: "Search for text on the current page (grep-like)",
|
|
130
|
+
parameters: z.object({ query: z.string() }),
|
|
131
|
+
execute: async ({ query }) => {
|
|
132
|
+
const matches = await browser.searchPage(query);
|
|
133
|
+
return matches.length > 0
|
|
134
|
+
? `Found ${matches.length} matches:\n${matches.join("\n")}`
|
|
135
|
+
: `No matches for "${query}"`;
|
|
136
|
+
},
|
|
137
|
+
}),
|
|
138
|
+
// ── Tab management ────────────────────────────────────────────────
|
|
139
|
+
switch_tab: tool({
|
|
140
|
+
description: "Switch to a different browser tab by its ID",
|
|
141
|
+
parameters: z.object({ tab_id: z.string() }),
|
|
142
|
+
execute: async ({ tab_id }) => {
|
|
143
|
+
await browser.switchTab(tab_id);
|
|
144
|
+
return `Switched to tab ${tab_id}`;
|
|
145
|
+
},
|
|
146
|
+
}),
|
|
147
|
+
close_tab: tool({
|
|
148
|
+
description: "Close a browser tab by its ID",
|
|
149
|
+
parameters: z.object({ tab_id: z.string() }),
|
|
150
|
+
execute: async ({ tab_id }) => {
|
|
151
|
+
await browser.closeTab(tab_id);
|
|
152
|
+
return `Closed tab ${tab_id}`;
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
new_tab: tool({
|
|
156
|
+
description: "Open a new browser tab",
|
|
157
|
+
parameters: z.object({ url: z.string().default("about:blank") }),
|
|
158
|
+
execute: async ({ url }) => {
|
|
159
|
+
const id = await browser.newTab(url);
|
|
160
|
+
return `Opened new tab ${id} at ${url}`;
|
|
161
|
+
},
|
|
162
|
+
}),
|
|
163
|
+
// ── Dropdowns ────────────────────────────────────────────────────
|
|
164
|
+
dropdown_options: tool({
|
|
165
|
+
description: "Get all options from a dropdown/select element",
|
|
166
|
+
parameters: z.object({ selector: z.string() }),
|
|
167
|
+
execute: async ({ selector }) => {
|
|
168
|
+
const opts = await browser.getDropdownOptions(selector);
|
|
169
|
+
return opts.map((o) => `${o.value}: ${o.text}`).join("\n");
|
|
170
|
+
},
|
|
171
|
+
}),
|
|
172
|
+
select_dropdown: tool({
|
|
173
|
+
description: "Select a dropdown option by value",
|
|
174
|
+
parameters: z.object({ selector: z.string(), value: z.string() }),
|
|
175
|
+
execute: async ({ selector, value }) => {
|
|
176
|
+
await browser.selectDropdown(selector, value);
|
|
177
|
+
return `Selected "${value}"`;
|
|
178
|
+
},
|
|
179
|
+
}),
|
|
180
|
+
// ── File operations ──────────────────────────────────────────────
|
|
181
|
+
upload_file: tool({
|
|
182
|
+
description: "Upload a file to a file input element",
|
|
183
|
+
parameters: z.object({ selector: z.string(), file_path: z.string() }),
|
|
184
|
+
execute: async ({ selector, file_path }) => {
|
|
185
|
+
await browser.uploadFile(selector, [file_path]);
|
|
186
|
+
return `Uploaded ${file_path}`;
|
|
187
|
+
},
|
|
188
|
+
}),
|
|
189
|
+
write_file: tool({
|
|
190
|
+
description: "Write content to a file",
|
|
191
|
+
parameters: z.object({ path: z.string(), content: z.string() }),
|
|
192
|
+
execute: async ({ path: filePath, content }) => {
|
|
193
|
+
const fullPath = join(dataDir, filePath);
|
|
194
|
+
mkdirSync(dirname(fullPath), { recursive: true });
|
|
195
|
+
writeFileSync(fullPath, content);
|
|
196
|
+
return `Written to ${fullPath}`;
|
|
197
|
+
},
|
|
198
|
+
}),
|
|
199
|
+
read_file: tool({
|
|
200
|
+
description: "Read content from a file",
|
|
201
|
+
parameters: z.object({ path: z.string() }),
|
|
202
|
+
execute: async ({ path: filePath }) => {
|
|
203
|
+
const fullPath = join(dataDir, filePath);
|
|
204
|
+
return readFileSync(fullPath, "utf-8");
|
|
205
|
+
},
|
|
206
|
+
}),
|
|
207
|
+
// ── Typing (cursor-based) ────────────────────────────────────────
|
|
208
|
+
type_text: tool({
|
|
209
|
+
description: "Type text at the current cursor/focus position. Works with any focused element " +
|
|
210
|
+
"including contenteditable rich text editors (ProseMirror, Tiptap, etc.). " +
|
|
211
|
+
"Click on the target area first, then call this to type. " +
|
|
212
|
+
"Use '\\n' for newlines/Enter.",
|
|
213
|
+
parameters: z.object({ text: z.string() }),
|
|
214
|
+
execute: async ({ text }) => {
|
|
215
|
+
for (const char of text) {
|
|
216
|
+
if (char === "\n") {
|
|
217
|
+
await browser.pressKey("Enter");
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
await browser.type(char);
|
|
221
|
+
}
|
|
222
|
+
await browser.waitMs(20);
|
|
223
|
+
}
|
|
224
|
+
return `Typed ${text.length} characters at cursor`;
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
// ── Page introspection (file-based) ─────────────────────────────
|
|
228
|
+
save_page_snapshot: tool({
|
|
229
|
+
description: `Save the full page HTML and text to files on disk for inspection. ` +
|
|
230
|
+
`Saves HTML to ${dataDir}/page.html and text to ${dataDir}/page.txt. ` +
|
|
231
|
+
`Returns file paths and sizes — use 'shell' to grep/search these files. ` +
|
|
232
|
+
`Example: save_page_snapshot, then shell with 'grep -n contenteditable ${dataDir}/page.html'`,
|
|
233
|
+
parameters: z.object({}),
|
|
234
|
+
execute: async () => {
|
|
235
|
+
mkdirSync(dataDir, { recursive: true });
|
|
236
|
+
const html = await browser.evaluate("document.documentElement.outerHTML");
|
|
237
|
+
const text = await browser.getPageText();
|
|
238
|
+
const htmlPath = join(dataDir, "page.html");
|
|
239
|
+
const textPath = join(dataDir, "page.txt");
|
|
240
|
+
writeFileSync(htmlPath, html);
|
|
241
|
+
writeFileSync(textPath, text);
|
|
242
|
+
return `Saved page snapshot:\n HTML: ${htmlPath} (${html.length} chars)\n Text: ${textPath} (${text.length} chars)\nUse 'shell' to search, e.g.: grep -n 'contenteditable\\|editor\\|ProseMirror' ${htmlPath}`;
|
|
243
|
+
},
|
|
244
|
+
}),
|
|
245
|
+
save_element_html: tool({
|
|
246
|
+
description: `Save a specific element's HTML to a file on disk. ` +
|
|
247
|
+
"Use an element index [N] or CSS selector. " +
|
|
248
|
+
`The HTML is saved to ${dataDir}/<filename> — use 'shell' to inspect it.`,
|
|
249
|
+
parameters: z.object({
|
|
250
|
+
index: z.number().optional().describe("Element index from the DOM tree"),
|
|
251
|
+
selector: z.string().optional().describe("CSS selector (if no index)"),
|
|
252
|
+
filename: z.string().optional().describe("Output filename (default: element.html)"),
|
|
253
|
+
}),
|
|
254
|
+
execute: async ({ index, selector, filename }) => {
|
|
255
|
+
try {
|
|
256
|
+
let html;
|
|
257
|
+
if (index != null) {
|
|
258
|
+
html = await browser.getElementHtml(index);
|
|
259
|
+
}
|
|
260
|
+
else if (selector) {
|
|
261
|
+
html = await browser.evaluate(`document.querySelector(${JSON.stringify(selector)})?.outerHTML ?? "Not found"`);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
return "Provide either index or selector";
|
|
265
|
+
}
|
|
266
|
+
const outPath = join(dataDir, filename ?? "element.html");
|
|
267
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
268
|
+
writeFileSync(outPath, html);
|
|
269
|
+
return `Saved to ${outPath} (${html.length} chars). Use 'shell' to inspect.`;
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
return `Error: ${e.message}`;
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
}),
|
|
276
|
+
shell: tool({
|
|
277
|
+
description: "Run a shell command and return the output. " +
|
|
278
|
+
"Use this to search saved page files with grep, sed, head, tail, wc, etc. " +
|
|
279
|
+
"Examples:\n" +
|
|
280
|
+
` grep -n 'contenteditable' ${dataDir}/page.html\n` +
|
|
281
|
+
` sed -n '100,120p' ${dataDir}/page.html\n` +
|
|
282
|
+
` grep -c 'ProseMirror' ${dataDir}/page.html\n` +
|
|
283
|
+
` ls -la ${dataDir}/\n` +
|
|
284
|
+
` wc -l ${dataDir}/page.html`,
|
|
285
|
+
parameters: z.object({
|
|
286
|
+
command: z.string().describe("The bash command to run"),
|
|
287
|
+
}),
|
|
288
|
+
execute: async ({ command }) => {
|
|
289
|
+
try {
|
|
290
|
+
const output = execSync(command, {
|
|
291
|
+
encoding: "utf-8",
|
|
292
|
+
timeout: 10_000,
|
|
293
|
+
maxBuffer: 1024 * 1024,
|
|
294
|
+
});
|
|
295
|
+
return output || "(no output)";
|
|
296
|
+
}
|
|
297
|
+
catch (e) {
|
|
298
|
+
return e.stdout || e.stderr || `Command failed: ${e.message}`;
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
}),
|
|
302
|
+
// ── JavaScript ───────────────────────────────────────────────────
|
|
303
|
+
evaluate: tool({
|
|
304
|
+
description: "Execute JavaScript code on the page and return the result. " +
|
|
305
|
+
"Supports both expressions and multi-statement code (var/let/const/return are auto-wrapped). " +
|
|
306
|
+
"Use this for complex DOM interactions the other tools can't handle.",
|
|
307
|
+
parameters: z.object({ code: z.string() }),
|
|
308
|
+
execute: async ({ code }) => {
|
|
309
|
+
const result = await browser.evaluate(code);
|
|
310
|
+
return JSON.stringify(result);
|
|
311
|
+
},
|
|
312
|
+
}),
|
|
313
|
+
// ── Dialog handling ───────────────────────────────────────────────
|
|
314
|
+
handle_dialog: tool({
|
|
315
|
+
description: "Accept or dismiss a browser dialog (alert/confirm/prompt)",
|
|
316
|
+
parameters: z.object({
|
|
317
|
+
accept: z.boolean(),
|
|
318
|
+
text: z.string().optional(),
|
|
319
|
+
}),
|
|
320
|
+
execute: async ({ accept, text }) => {
|
|
321
|
+
await browser.handleDialog(accept, text);
|
|
322
|
+
return `Dialog ${accept ? "accepted" : "dismissed"}`;
|
|
323
|
+
},
|
|
324
|
+
}),
|
|
325
|
+
// ── Wait ─────────────────────────────────────────────────────────
|
|
326
|
+
wait: tool({
|
|
327
|
+
description: "Wait for a specified number of seconds",
|
|
328
|
+
parameters: z.object({ seconds: z.number().min(1).max(10) }),
|
|
329
|
+
execute: async ({ seconds }) => {
|
|
330
|
+
await browser.waitMs(seconds * 1000);
|
|
331
|
+
return `Waited ${seconds}s`;
|
|
332
|
+
},
|
|
333
|
+
}),
|
|
334
|
+
// ── Captcha solving ──────────────────────────────────────────────
|
|
335
|
+
solve_captcha: tool({
|
|
336
|
+
description: "Solve a CAPTCHA (reCAPTCHA v2/v3, hCaptcha, Turnstile). Find the sitekey in the captcha element's data-sitekey attribute.",
|
|
337
|
+
parameters: z.object({
|
|
338
|
+
site_url: z.string(),
|
|
339
|
+
site_key: z.string(),
|
|
340
|
+
captcha_type: z.enum(["recaptcha_v2", "recaptcha_v3", "hcaptcha", "turnstile"]).default("recaptcha_v2"),
|
|
341
|
+
}),
|
|
342
|
+
execute: async ({ site_url, site_key, captcha_type }) => {
|
|
343
|
+
const { solve } = await import("../captcha/solver.js");
|
|
344
|
+
const result = await solve({ type: captcha_type, siteUrl: site_url, siteKey: site_key });
|
|
345
|
+
return `Captcha solved via ${result.provider}. Token: ${result.token}`;
|
|
346
|
+
},
|
|
347
|
+
}),
|
|
348
|
+
inject_captcha_token: tool({
|
|
349
|
+
description: "Inject a captcha token into the page. Sets g-recaptcha-response, h-captcha-response, and cf-turnstile-response fields.",
|
|
350
|
+
parameters: z.object({ token: z.string() }),
|
|
351
|
+
execute: async ({ token }) => {
|
|
352
|
+
const safe = token.replace(/'/g, "\\'").replace(/\n/g, "\\n");
|
|
353
|
+
await browser.evaluate(`
|
|
354
|
+
(function(){var t='${safe}';
|
|
355
|
+
document.querySelectorAll('[name="g-recaptcha-response"]').forEach(el=>{el.innerHTML=t;el.value=t;});
|
|
356
|
+
document.querySelectorAll('[name="h-captcha-response"]').forEach(el=>{el.innerHTML=t;el.value=t;});
|
|
357
|
+
document.querySelectorAll('[name="cf-turnstile-response"]').forEach(el=>{el.innerHTML=t;el.value=t;});
|
|
358
|
+
return 'injected';})()
|
|
359
|
+
`);
|
|
360
|
+
return "Captcha token injected. Submit the form now.";
|
|
361
|
+
},
|
|
362
|
+
}),
|
|
363
|
+
solve_datadome: tool({
|
|
364
|
+
description: "Solve a DataDome CAPTCHA. Find the captcha_url from the iframe src (geo.captcha-delivery.com).",
|
|
365
|
+
parameters: z.object({
|
|
366
|
+
site_url: z.string(),
|
|
367
|
+
captcha_url: z.string(),
|
|
368
|
+
user_agent: z.string().optional(),
|
|
369
|
+
}),
|
|
370
|
+
execute: async ({ site_url, captcha_url, user_agent }) => {
|
|
371
|
+
if (captcha_url.includes("t=bv"))
|
|
372
|
+
return "DataDome URL has t=bv — IP is banned. Rotate proxy.";
|
|
373
|
+
const { solve } = await import("../captcha/solver.js");
|
|
374
|
+
const result = await solve({
|
|
375
|
+
type: "datadome",
|
|
376
|
+
siteUrl: site_url,
|
|
377
|
+
captchaUrl: captcha_url,
|
|
378
|
+
userAgent: user_agent ?? "Mozilla/5.0 (X11; Linux x86_64) Chrome/131.0.0.0",
|
|
379
|
+
proxy: config.captcha.proxy,
|
|
380
|
+
});
|
|
381
|
+
const cookie = result.cookie ?? "";
|
|
382
|
+
const val = cookie.includes("datadome=") ? cookie.split("datadome=")[1].split(";")[0] : cookie;
|
|
383
|
+
return `DataDome solved. Run this JS then reload:\ndocument.cookie='datadome=${val};path=/;secure;SameSite=Lax';location.reload();`;
|
|
384
|
+
},
|
|
385
|
+
}),
|
|
386
|
+
// ── Task completion ──────────────────────────────────────────────
|
|
387
|
+
done: tool({
|
|
388
|
+
description: "Mark the task as complete with a final result",
|
|
389
|
+
parameters: z.object({
|
|
390
|
+
text: z.string().describe("Final result / summary"),
|
|
391
|
+
success: z.boolean().default(true),
|
|
392
|
+
}),
|
|
393
|
+
execute: async ({ text, success }) => {
|
|
394
|
+
return { done: true, text, success };
|
|
395
|
+
},
|
|
396
|
+
}),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/agent/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP browser client with reliable element interaction.
|
|
3
|
+
*
|
|
4
|
+
* Click chain: scrollIntoViewIfNeeded → getBoxModel → viewport clamp →
|
|
5
|
+
* mouseMoved → mousePressed → mouseReleased.
|
|
6
|
+
* If coords fail or element is occluded → resolveNode → callFunctionOn(.click()).
|
|
7
|
+
*
|
|
8
|
+
* Input chain: scrollIntoViewIfNeeded → resolveNode → focus → select-all+delete →
|
|
9
|
+
* dispatchKeyEvent(keyDown/char/keyUp) per character (React/Vue compatible).
|
|
10
|
+
*
|
|
11
|
+
* All element targeting uses backendNodeId from the AX tree — no CSS selectors.
|
|
12
|
+
*/
|
|
13
|
+
import type { Client } from "chrome-remote-interface";
|
|
14
|
+
import { type IndexedElement } from "./dom.js";
|
|
15
|
+
export interface TabInfo {
|
|
16
|
+
id: string;
|
|
17
|
+
url: string;
|
|
18
|
+
title: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class CDPBrowser {
|
|
21
|
+
private client;
|
|
22
|
+
private domIndexer;
|
|
23
|
+
private _tabs;
|
|
24
|
+
private _activeTabId;
|
|
25
|
+
private _dialogQueue;
|
|
26
|
+
private _downloadedFiles;
|
|
27
|
+
connect(cdpUrl?: string): Promise<void>;
|
|
28
|
+
disconnect(): Promise<void>;
|
|
29
|
+
get cdp(): Client;
|
|
30
|
+
navigate(url: string): Promise<void>;
|
|
31
|
+
goBack(): Promise<void>;
|
|
32
|
+
goForward(): Promise<void>;
|
|
33
|
+
reload(): Promise<void>;
|
|
34
|
+
currentUrl(): Promise<string>;
|
|
35
|
+
pageTitle(): Promise<string>;
|
|
36
|
+
screenshot(opts?: {
|
|
37
|
+
quality?: number;
|
|
38
|
+
}): Promise<string>;
|
|
39
|
+
getViewportSize(): Promise<{
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
}>;
|
|
43
|
+
getIndexedDOM(): Promise<{
|
|
44
|
+
text: string;
|
|
45
|
+
elements: Map<number, IndexedElement>;
|
|
46
|
+
}>;
|
|
47
|
+
getPageText(): Promise<string>;
|
|
48
|
+
private resolveNode;
|
|
49
|
+
private scrollIntoView;
|
|
50
|
+
private getElementCenter;
|
|
51
|
+
private jsClick;
|
|
52
|
+
clickByIndex(index: number): Promise<void>;
|
|
53
|
+
inputByIndex(index: number, text: string, clear?: boolean): Promise<void>;
|
|
54
|
+
clickAtCoords(x: number, y: number): Promise<void>;
|
|
55
|
+
type(text: string): Promise<void>;
|
|
56
|
+
pressKey(key: string): Promise<void>;
|
|
57
|
+
scroll(direction: "up" | "down", pixels?: number): Promise<void>;
|
|
58
|
+
scrollToElement(index: number): Promise<boolean>;
|
|
59
|
+
scrollToText(text: string): Promise<boolean>;
|
|
60
|
+
private isOccluded;
|
|
61
|
+
refreshTabs(): Promise<TabInfo[]>;
|
|
62
|
+
get tabs(): TabInfo[];
|
|
63
|
+
switchTab(tabId: string): Promise<void>;
|
|
64
|
+
closeTab(tabId: string): Promise<void>;
|
|
65
|
+
newTab(url?: string): Promise<string>;
|
|
66
|
+
get pendingDialogs(): {
|
|
67
|
+
type: string;
|
|
68
|
+
message: string;
|
|
69
|
+
}[];
|
|
70
|
+
handleDialog(accept: boolean, promptText?: string): Promise<void>;
|
|
71
|
+
evaluate<T = unknown>(expression: string): Promise<T>;
|
|
72
|
+
getElementHtml(index: number, inner?: boolean): Promise<string>;
|
|
73
|
+
getCookies(): Promise<Array<{
|
|
74
|
+
name: string;
|
|
75
|
+
value: string;
|
|
76
|
+
domain: string;
|
|
77
|
+
}>>;
|
|
78
|
+
setCookie(name: string, value: string, domain: string): Promise<void>;
|
|
79
|
+
clearCookies(): Promise<void>;
|
|
80
|
+
uploadFile(selector: string, filePaths: string[]): Promise<void>;
|
|
81
|
+
getDropdownOptions(selector: string): Promise<Array<{
|
|
82
|
+
value: string;
|
|
83
|
+
text: string;
|
|
84
|
+
}>>;
|
|
85
|
+
selectDropdown(selector: string, value: string): Promise<void>;
|
|
86
|
+
searchPage(query: string): Promise<string[]>;
|
|
87
|
+
waitMs(ms: number): Promise<void>;
|
|
88
|
+
waitForLoad(timeoutMs?: number): Promise<void>;
|
|
89
|
+
waitForUrl(substring: string, timeoutMs?: number): Promise<void>;
|
|
90
|
+
get downloadedFiles(): string[];
|
|
91
|
+
}
|