@fusengine/browser-mcp 0.1.11 → 0.1.13
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 +58 -8
- package/dist/actions/act-by-ref.d.ts +2 -2
- package/dist/actions/act-by-ref.d.ts.map +1 -1
- package/dist/actions/act-by-ref.js +4 -1
- package/dist/actions/act-by-ref.js.map +1 -1
- package/dist/actions/autocomplete.d.ts +11 -0
- package/dist/actions/autocomplete.d.ts.map +1 -0
- package/dist/actions/autocomplete.js +25 -0
- package/dist/actions/autocomplete.js.map +1 -0
- package/dist/actions/perform.d.ts.map +1 -1
- package/dist/actions/perform.js +3 -0
- package/dist/actions/perform.js.map +1 -1
- package/dist/agent/config.d.ts.map +1 -1
- package/dist/agent/config.js +9 -1
- package/dist/agent/config.js.map +1 -1
- package/dist/agent/probe-run.d.ts.map +1 -1
- package/dist/agent/probe-run.js +3 -0
- package/dist/agent/probe-run.js.map +1 -1
- package/dist/engine/launch.d.ts.map +1 -1
- package/dist/engine/launch.js +2 -1
- package/dist/engine/launch.js.map +1 -1
- package/dist/engine/webrtc.d.ts +9 -0
- package/dist/engine/webrtc.d.ts.map +1 -0
- package/dist/engine/webrtc.js +12 -0
- package/dist/engine/webrtc.js.map +1 -0
- package/dist/interfaces/types.d.ts +1 -0
- package/dist/interfaces/types.d.ts.map +1 -1
- package/dist/proxy/country-map.d.ts +1 -1
- package/dist/proxy/country-map.d.ts.map +1 -1
- package/dist/proxy/load.d.ts +3 -0
- package/dist/proxy/load.d.ts.map +1 -0
- package/dist/proxy/load.js +17 -0
- package/dist/proxy/load.js.map +1 -0
- package/dist/proxy/pool.d.ts +23 -0
- package/dist/proxy/pool.d.ts.map +1 -0
- package/dist/proxy/pool.js +63 -0
- package/dist/proxy/pool.js.map +1 -0
- package/dist/server/map-options.d.ts.map +1 -1
- package/dist/server/map-options.js +1 -0
- package/dist/server/map-options.js.map +1 -1
- package/dist/server/schemas.d.ts +3 -0
- package/dist/server/schemas.d.ts.map +1 -1
- package/dist/server/schemas.js +1 -0
- package/dist/server/schemas.js.map +1 -1
- package/dist/server/tools/snapshot.d.ts.map +1 -1
- package/dist/server/tools/snapshot.js +8 -3
- package/dist/server/tools/snapshot.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,10 +14,45 @@ TypeScript port of the original Python `fusengine-browser-agent`, redesigned aro
|
|
|
14
14
|
official MCP SDK with a persistent session model, image-content screenshots, and a
|
|
15
15
|
swappable engine layer (Playwright / Patchright / CDP attach).
|
|
16
16
|
|
|
17
|
+
## Quick start (Claude Code / any MCP client)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 1. register the published server (user scope = all projects)
|
|
21
|
+
claude mcp add fuse-browser --scope user -- npx -y @fusengine/browser-mcp
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```jsonc
|
|
25
|
+
// or add it manually to your MCP config:
|
|
26
|
+
{ "mcpServers": {
|
|
27
|
+
"fuse-browser": { "command": "npx", "args": ["-y", "@fusengine/browser-mcp"] }
|
|
28
|
+
}}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Then just ask your agent in natural language — it drives the browser via the tools:
|
|
32
|
+
|
|
33
|
+
> "Find a hotel in Annemasse this Friday under CHF 100."
|
|
34
|
+
> "What's my Google rank for 'agence web vevey' (CH)?"
|
|
35
|
+
> "Screenshot localhost:3000 in mobile and desktop."
|
|
36
|
+
|
|
37
|
+
## How it works
|
|
38
|
+
|
|
39
|
+
An LLM agent runs a **perceive → decide → act** loop through the MCP tools:
|
|
40
|
+
|
|
41
|
+
1. `browser_open` → a real (stealth) browser session
|
|
42
|
+
2. `browser_navigate` → load the page (JS/SPA rendered, animations settled)
|
|
43
|
+
3. `browser_snapshot` → indexed interactive elements with `ref` + form state
|
|
44
|
+
(value, placeholder, options, checked, disabled, combobox `aria-*`, occlusion)
|
|
45
|
+
4. `browser_act` → click / fill / select / **pick** (autocomplete) a `ref`; returns a page diff
|
|
46
|
+
5. `browser_wait_for` → wait on a real condition, then loop back to snapshot
|
|
47
|
+
6. `browser_extract` / `browser_screenshot` → structured data or vision
|
|
48
|
+
|
|
49
|
+
Guardrails block pay/book/checkout unless the agent passes `humanApproved`.
|
|
50
|
+
|
|
17
51
|
## Requirements
|
|
18
52
|
|
|
19
53
|
- Node.js >= 20 (runtime). Bun is the dev toolchain.
|
|
20
|
-
-
|
|
54
|
+
- Chromium is **installed automatically** on `npm install` (soft postinstall).
|
|
55
|
+
To install it manually or in CI:
|
|
21
56
|
|
|
22
57
|
```bash
|
|
23
58
|
npx patchright install chromium # stealth engine (default)
|
|
@@ -37,23 +72,25 @@ to it automatically. Verified end-to-end against **Dia** (Chromium 148).
|
|
|
37
72
|
|
|
38
73
|
## CLI
|
|
39
74
|
|
|
75
|
+
Install the binaries once: `npm i -g @fusengine/browser-mcp` (provides `fuse-browser` + `browser-mcp`). Then:
|
|
76
|
+
|
|
40
77
|
```bash
|
|
41
78
|
# One-shot probe of a real page
|
|
42
|
-
|
|
79
|
+
fuse-browser probe https://example.com --extract-prices --observe-visual
|
|
43
80
|
|
|
44
81
|
# Hotels with country identity, proxy routing, replay
|
|
45
|
-
|
|
82
|
+
fuse-browser probe 'https://www.booking.com/searchresults.html?ss=Tokyo' \
|
|
46
83
|
--country JP --proxy-map proxies.json --replay --auto-consent --extract-prices
|
|
47
84
|
|
|
48
85
|
# Use the installed Chrome
|
|
49
|
-
|
|
86
|
+
fuse-browser probe https://example.com --channel chrome
|
|
50
87
|
|
|
51
88
|
# SEO rank tracking across many keywords (one session)
|
|
52
|
-
|
|
89
|
+
fuse-browser serp-batch "agence web vevey" "création site web lausanne" \
|
|
53
90
|
--rank-domain fusengine.ch --serp-pages 2 --hl fr --gl ch
|
|
54
91
|
|
|
55
92
|
# Responsive screenshots (saved PNGs) — works on localhost too
|
|
56
|
-
|
|
93
|
+
fuse-browser shots http://localhost:8000 --viewports mobile,desktop,1280x720
|
|
57
94
|
```
|
|
58
95
|
|
|
59
96
|
Sensitive actions (`pay`, `book`, `checkout`, `confirm`, …) are **blocked** unless
|
|
@@ -114,12 +151,13 @@ Key agentic patterns:
|
|
|
114
151
|
- **`browser_run`** — execute an ordered plan (navigate/act/wait/extract) in one call,
|
|
115
152
|
stopping at the first failure. Guardrails apply to the whole plan.
|
|
116
153
|
|
|
117
|
-
A `runs` resource exposes the JSON reports and screenshots written under
|
|
154
|
+
A `runs` resource exposes the JSON reports and screenshots written under the output dir
|
|
155
|
+
(see *Output & data location*).
|
|
118
156
|
|
|
119
157
|
## Library
|
|
120
158
|
|
|
121
159
|
```ts
|
|
122
|
-
import { BrowserAgent } from "
|
|
160
|
+
import { BrowserAgent } from "@fusengine/browser-mcp";
|
|
123
161
|
|
|
124
162
|
const agent = new BrowserAgent({ countryCode: "CH", engine: "patchright" });
|
|
125
163
|
const report = await agent.probe("https://example.com", { extractPrices: true });
|
|
@@ -175,6 +213,18 @@ Override per run with `outputDir` (library / MCP arg) or `--output-dir` (CLI). C
|
|
|
175
213
|
`serp.rank` (organic/ads positions + best) — a built-in rank tracker.
|
|
176
214
|
CLI: `--extract-serp --serp-pages 2 --rank-domain example.com`.
|
|
177
215
|
|
|
216
|
+
## Proxies & anti-bot (scale)
|
|
217
|
+
|
|
218
|
+
Provide a proxy **pool** and the server rotates across it, retiring a proxy on block:
|
|
219
|
+
|
|
220
|
+
- `FUSE_PROXIES` env (comma/newline list) or `proxiesPath` (JSON array file) — used when no
|
|
221
|
+
explicit `proxyUrl` / country-map proxy applies. Round-robin; a proxy that triggers a
|
|
222
|
+
captcha/Cloudflare challenge is put on a 5-min cooldown and skipped (**auto-retire**).
|
|
223
|
+
- **WebRTC leak guard**: when a proxy is set (Chromium), launch args force WebRTC through the
|
|
224
|
+
proxy so the real IP can't leak via ICE/STUN.
|
|
225
|
+
- Residential/mobile proxies are what actually beat industrial anti-bot at volume (paid). The
|
|
226
|
+
proxy list is a secret — keep it out of the repo (`proxies.json` is git-ignored).
|
|
227
|
+
|
|
178
228
|
## Disclaimer
|
|
179
229
|
|
|
180
230
|
Provided **as-is** under MIT, with no warranty. `fuse-browser` is a neutral, dual-use
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import type { Page } from "playwright";
|
|
8
8
|
import type { ActionResult } from "../interfaces/types.js";
|
|
9
9
|
/** Action kinds that can target a snapshot ref. */
|
|
10
|
-
export type RefActionKind = "click" | "fill" | "select";
|
|
10
|
+
export type RefActionKind = "click" | "fill" | "select" | "pick";
|
|
11
11
|
/** Run `kind` on the element carrying `data-fuse-ref="ref"`. */
|
|
12
|
-
export declare function actByRef(page: Page, ref: number, kind: RefActionKind, value?: string): Promise<ActionResult>;
|
|
12
|
+
export declare function actByRef(page: Page, ref: number, kind: RefActionKind, value?: string, option?: string): Promise<ActionResult>;
|
|
13
13
|
//# sourceMappingURL=act-by-ref.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act-by-ref.d.ts","sourceRoot":"","sources":["../../src/actions/act-by-ref.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"act-by-ref.d.ts","sourceRoot":"","sources":["../../src/actions/act-by-ref.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjE,gEAAgE;AAChE,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,EACnB,KAAK,SAAK,EACV,MAAM,SAAK,GACV,OAAO,CAAC,YAAY,CAAC,CAmBvB"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { REF_ATTRIBUTE } from "../extraction/snapshot.js";
|
|
2
|
+
import { pickAutocomplete } from "./autocomplete.js";
|
|
2
3
|
/** Run `kind` on the element carrying `data-fuse-ref="ref"`. */
|
|
3
|
-
export async function actByRef(page, ref, kind, value = "") {
|
|
4
|
+
export async function actByRef(page, ref, kind, value = "", option = "") {
|
|
4
5
|
const selector = `[${REF_ATTRIBUTE}="${ref}"]`;
|
|
5
6
|
const locator = page.locator(selector).first();
|
|
6
7
|
try {
|
|
7
8
|
if ((await locator.count()) === 0) {
|
|
8
9
|
return { type: kind, ok: false, ref, error: "ref_not_found" };
|
|
9
10
|
}
|
|
11
|
+
if (kind === "pick")
|
|
12
|
+
return { ...(await pickAutocomplete(page, locator, value, option)), ref };
|
|
10
13
|
if (kind === "click") {
|
|
11
14
|
await locator.click({ timeout: 5_000 });
|
|
12
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act-by-ref.js","sourceRoot":"","sources":["../../src/actions/act-by-ref.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"act-by-ref.js","sourceRoot":"","sources":["../../src/actions/act-by-ref.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKrD,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,GAAW,EACX,IAAmB,EACnB,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE;IAEX,MAAM,QAAQ,GAAG,IAAI,aAAa,KAAK,GAAG,IAAI,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/F,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autocomplete / combobox "pick": type a value, wait for the suggestion
|
|
3
|
+
* dropdown, then click the matching option. Handles airport/city pickers where
|
|
4
|
+
* filling alone never commits the selection (the form stays empty/disabled).
|
|
5
|
+
* @module actions/autocomplete
|
|
6
|
+
*/
|
|
7
|
+
import type { Locator, Page } from "playwright";
|
|
8
|
+
import type { ActionResult } from "../interfaces/types.js";
|
|
9
|
+
/** Type `value` into `locator`, wait for a suggestion, click the best match. */
|
|
10
|
+
export declare function pickAutocomplete(page: Page, locator: Locator, value: string, option?: string): Promise<ActionResult>;
|
|
11
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/actions/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,gFAAgF;AAChF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,SAAK,GACV,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Type `value` into `locator`, wait for a suggestion, click the best match. */
|
|
2
|
+
export async function pickAutocomplete(page, locator, value, option = "") {
|
|
3
|
+
const wanted = option || value;
|
|
4
|
+
try {
|
|
5
|
+
await locator.click({ timeout: 5_000 });
|
|
6
|
+
await locator.fill("", { timeout: 5_000 });
|
|
7
|
+
await locator.pressSequentially(value, { delay: 30, timeout: 5_000 });
|
|
8
|
+
const named = page.getByRole("option", { name: wanted }).first();
|
|
9
|
+
let choice = named;
|
|
10
|
+
try {
|
|
11
|
+
await named.waitFor({ state: "visible", timeout: 6_000 });
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
choice = page.getByRole("option").first();
|
|
15
|
+
await choice.waitFor({ state: "visible", timeout: 4_000 });
|
|
16
|
+
}
|
|
17
|
+
const label = (await choice.textContent())?.trim().slice(0, 80) ?? "";
|
|
18
|
+
await choice.click({ timeout: 5_000 });
|
|
19
|
+
return { type: "pick", ok: true, strategy: "autocomplete", value, option: label };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return { type: "pick", ok: false, value, error: String(err).split("\n")[0] ?? "error" };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/actions/autocomplete.ts"],"names":[],"mappings":"AASA,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAU,EACV,OAAgB,EAChB,KAAa,EACb,MAAM,GAAG,EAAE;IAEX,MAAM,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjE,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC1F,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perform.d.ts","sourceRoot":"","sources":["../../src/actions/perform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"perform.d.ts","sourceRoot":"","sources":["../../src/actions/perform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,6CAA6C;AAC7C,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,EACnB,SAAS,UAAQ,GAChB,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIhF"}
|
package/dist/actions/perform.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pickAutocomplete } from "./autocomplete.js";
|
|
1
2
|
import { login } from "./login.js";
|
|
2
3
|
import { navigateHistory, pressKey, scroll, selectOption } from "./navigation.js";
|
|
3
4
|
import { smartClick } from "./smart-click.js";
|
|
@@ -19,6 +20,8 @@ export async function performAction(page, action, humanMode = false) {
|
|
|
19
20
|
return pressKey(page, String(action.key ?? ""));
|
|
20
21
|
case "select":
|
|
21
22
|
return selectOption(page, target, String(action.value ?? ""));
|
|
23
|
+
case "pick":
|
|
24
|
+
return pickAutocomplete(page, page.locator(target).first(), String(action.value ?? ""), String(action.option ?? ""));
|
|
22
25
|
case "back":
|
|
23
26
|
case "forward":
|
|
24
27
|
return navigateHistory(page, action.type);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perform.js","sourceRoot":"","sources":["../../src/actions/perform.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,MAAmB,EACnB,SAAS,GAAG,KAAK;IAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACzD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxD,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACnF,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,IAAI,EAAE,MAAqB,EAAE,SAAS,CAAC,CAAC;QACvD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACxC,CAAC;QACD;YACE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3B,IAAI,UAAU,IAAI,IAAI;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"perform.js","sourceRoot":"","sources":["../../src/actions/perform.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,MAAmB,EACnB,SAAS,GAAG,KAAK;IAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACzD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxD,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACnF,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,IAAI,EAAE,MAAqB,EAAE,SAAS,CAAC,CAAC;QACvD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QACvH,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACxC,CAAC;QACD;YACE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3B,IAAI,UAAU,IAAI,IAAI;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAuB,KAAK,WAAW,EAAgB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAuB,KAAK,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAG9F,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,GAAE,YAAiB,GAAG,cAAc,CA2CrE"}
|
package/dist/agent/config.js
CHANGED
|
@@ -7,13 +7,21 @@ import { resolveIdentity } from "../identity/resolve.js";
|
|
|
7
7
|
import { ensureDir } from "../lib/fs.js";
|
|
8
8
|
import { resolveDefaultOutputDir } from "../lib/output-dir.js";
|
|
9
9
|
import { loadProxyCountryMap, resolveProxy } from "../proxy/country-map.js";
|
|
10
|
+
import { acquirePoolProxy } from "../proxy/pool.js";
|
|
10
11
|
/** Build the resolved configuration, creating required directories. */
|
|
11
12
|
export function resolveConfig(opts = {}) {
|
|
12
13
|
const outputDir = opts.outputDir ?? resolveDefaultOutputDir();
|
|
13
14
|
ensureDir(outputDir);
|
|
14
15
|
const identity = resolveIdentity(opts);
|
|
15
16
|
const map = loadProxyCountryMap(opts.proxyCountryMap, opts.proxyMapPath);
|
|
16
|
-
|
|
17
|
+
let { proxyUrl, proxySource } = resolveProxy(opts.proxyUrl, identity.countryCode, map);
|
|
18
|
+
if (!proxyUrl) {
|
|
19
|
+
const pooled = acquirePoolProxy(opts.proxiesPath);
|
|
20
|
+
if (pooled) {
|
|
21
|
+
proxyUrl = pooled;
|
|
22
|
+
proxySource = "pool";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
17
25
|
const userDataDir = opts.userDataDir ?? null;
|
|
18
26
|
if (userDataDir)
|
|
19
27
|
ensureDir(userDataDir);
|
package/dist/agent/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAyB,MAAM,wBAAwB,CAAC;AAIhF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAyB,MAAM,wBAAwB,CAAC;AAIhF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAyBpD,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,OAAqB,EAAE;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,uBAAuB,EAAE,CAAC;IAC9D,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,GAAG,MAAM,CAAC;YAClB,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC7C,IAAI,WAAW;QAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC3E,SAAS,CAAC,aAAa,CAAC,CAAC;IACzB,OAAO;QACL,SAAS;QACT,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,YAAY;QACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;QAC3C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,QAAQ;QACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW;QACX,QAAQ;QACR,WAAW;QACX,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,KAAK;QAC1C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;QACtD,aAAa;QACb,KAAK,EAAE;YACL,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,MAAM;YAClC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC;SACxC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe-run.d.ts","sourceRoot":"","sources":["../../src/agent/probe-run.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"probe-run.d.ts","sourceRoot":"","sources":["../../src/agent/probe-run.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,mEAAmE;AACnE,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAgEtB"}
|
package/dist/agent/probe-run.js
CHANGED
|
@@ -14,6 +14,7 @@ import { visualObservation } from "../extraction/visual.js";
|
|
|
14
14
|
import { ensureDir, sha1 } from "../lib/fs.js";
|
|
15
15
|
import { gotoWithRetry } from "../net/navigate.js";
|
|
16
16
|
import { throttleHost } from "../net/throttle.js";
|
|
17
|
+
import { reportProxyBlocked } from "../proxy/pool.js";
|
|
17
18
|
import { domSignature } from "../state/dom-signature.js";
|
|
18
19
|
import { runActions } from "./actions-loop.js";
|
|
19
20
|
import { detectAndSolve } from "./detect.js";
|
|
@@ -55,6 +56,8 @@ export async function runProbe(config, url, options = {}) {
|
|
|
55
56
|
const after = await domSignature(page);
|
|
56
57
|
const text = await mainText(page);
|
|
57
58
|
const { challenges, captcha } = await detectAndSolve(page, text, options, config);
|
|
59
|
+
if (config.proxySource === "pool" && config.proxyUrl && "cloudflare" in challenges && (challenges.cloudflare || challenges.captcha))
|
|
60
|
+
reportProxyBlocked(config.proxyUrl);
|
|
58
61
|
const title = await page.title();
|
|
59
62
|
await page.screenshot({ path: screenshotPath, fullPage: true });
|
|
60
63
|
const visual = options.observeVisual ? await visualObservation(page, screenshotPath) : {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe-run.js","sourceRoot":"","sources":["../../src/agent/probe-run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"probe-run.js","sourceRoot":"","sources":["../../src/agent/probe-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/engine/launch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/engine/launch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAgC7D,oFAAoF;AACpF,wBAAsB,aAAa,CACjC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
|
package/dist/engine/launch.js
CHANGED
|
@@ -8,12 +8,13 @@ import { existsSync } from "node:fs";
|
|
|
8
8
|
import { logger } from "../lib/logger.js";
|
|
9
9
|
import { buildContextOptions } from "./context.js";
|
|
10
10
|
import { isChromiumEngine } from "./loader.js";
|
|
11
|
+
import { WEBRTC_LEAK_ARGS } from "./webrtc.js";
|
|
11
12
|
const CHROMIUM_ARGS = ["--no-sandbox", "--disable-blink-features=AutomationControlled"];
|
|
12
13
|
/** Build LaunchOptions, applying Chromium-only fields only for Chromium engines. */
|
|
13
14
|
function buildLaunchOptions(config) {
|
|
14
15
|
const opts = { headless: config.headless };
|
|
15
16
|
if (isChromiumEngine(config.engine)) {
|
|
16
|
-
opts.args = CHROMIUM_ARGS;
|
|
17
|
+
opts.args = config.proxyUrl ? [...CHROMIUM_ARGS, ...WEBRTC_LEAK_ARGS] : [...CHROMIUM_ARGS];
|
|
17
18
|
if (config.channel)
|
|
18
19
|
opts.channel = config.channel;
|
|
19
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/engine/launch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,+CAA+C,CAAC,CAAC;AAExF,oFAAoF;AACpF,SAAS,kBAAkB,CAAC,MAAsB;IAChD,MAAM,IAAI,GAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1D,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/engine/launch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,+CAA+C,CAAC,CAAC;AAExF,oFAAoF;AACpF,SAAS,kBAAkB,CAAC,MAAsB;IAChD,MAAM,IAAI,GAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1D,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IACvE,IAAI,MAAM,CAAC,QAAQ;QAAE,IAAI,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,YAAY,GAAG,iEAAiE,CAAC;AAEvF,2FAA2F;AAC3F,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,OAAO,GAAG,MAAM,CAAE,GAAa,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,KAAK,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,GAAY,CAAC;AACrB,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAwB,EACxB,MAAsB;IAEtB,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAErF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,WAAW;aAC9B,uBAAuB,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,cAAc,EAAE,CAAC;aACpF,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjF,IAAI,MAAM,CAAC,gBAAgB,IAAI,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnE,cAAc,CAAC,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACxD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chromium launch args that stop a WebRTC ICE/STUN real-IP leak when a proxy is
|
|
3
|
+
* set — WebRTC is routed through the proxy and non-proxied UDP is blocked, so a
|
|
4
|
+
* page cannot reveal the machine's real IP behind the proxy. Chromium-only.
|
|
5
|
+
* @module engine/webrtc
|
|
6
|
+
*/
|
|
7
|
+
/** Launch args preventing WebRTC from bypassing the proxy. */
|
|
8
|
+
export declare const WEBRTC_LEAK_ARGS: string[];
|
|
9
|
+
//# sourceMappingURL=webrtc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../../src/engine/webrtc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,UAG5B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chromium launch args that stop a WebRTC ICE/STUN real-IP leak when a proxy is
|
|
3
|
+
* set — WebRTC is routed through the proxy and non-proxied UDP is blocked, so a
|
|
4
|
+
* page cannot reveal the machine's real IP behind the proxy. Chromium-only.
|
|
5
|
+
* @module engine/webrtc
|
|
6
|
+
*/
|
|
7
|
+
/** Launch args preventing WebRTC from bypassing the proxy. */
|
|
8
|
+
export const WEBRTC_LEAK_ARGS = [
|
|
9
|
+
"--webrtc-ip-handling-policy=disable_non_proxied_udp",
|
|
10
|
+
"--force-webrtc-ip-handling-policy",
|
|
11
|
+
];
|
|
12
|
+
//# sourceMappingURL=webrtc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../../src/engine/webrtc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,qDAAqD;IACrD,mCAAmC;CACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IACE,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function loadProxyCountryMap(inline?: Record<string, string>, mapPath?: string): Record<string, string>;
|
|
6
6
|
/** Source de sélection du proxy effectif. */
|
|
7
|
-
export type ProxySource = "explicit" | "country_map" | null;
|
|
7
|
+
export type ProxySource = "explicit" | "country_map" | "pool" | null;
|
|
8
8
|
/** Sélectionne le proxy effectif : explicite > table pays. */
|
|
9
9
|
export declare function resolveProxy(explicit: string | undefined, countryCode: string, map: Record<string, string>): {
|
|
10
10
|
proxyUrl: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"country-map.d.ts","sourceRoot":"","sources":["../../src/proxy/country-map.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"country-map.d.ts","sourceRoot":"","sources":["../../src/proxy/country-map.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;AAErE,8DAA8D;AAC9D,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAKvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/proxy/load.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load a proxy list from the `FUSE_PROXIES` env var (comma/newline separated)
|
|
3
|
+
* and/or a JSON file (array of URLs). Dedupes and drops blanks. The proxy list
|
|
4
|
+
* is a secret you provide — keep it out of the repo.
|
|
5
|
+
* @module proxy/load
|
|
6
|
+
*/
|
|
7
|
+
import { readJsonSafe } from "../lib/fs.js";
|
|
8
|
+
/** Merge proxies from `env.FUSE_PROXIES` and an optional JSON file (array). */
|
|
9
|
+
export function loadProxyList(env = process.env, path) {
|
|
10
|
+
const fromEnv = (env.FUSE_PROXIES ?? "")
|
|
11
|
+
.split(/[\n,]/)
|
|
12
|
+
.map((s) => s.trim())
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
const fromFile = path ? readJsonSafe(path, []).map(String).filter(Boolean) : [];
|
|
15
|
+
return [...new Set([...fromEnv, ...fromFile])];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/proxy/load.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,IAAa;IAC/E,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;SACrC,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAW,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Round-robin proxy pool with per-entry cooldown on block. */
|
|
2
|
+
export declare class ProxyPool {
|
|
3
|
+
private readonly cooldownMs;
|
|
4
|
+
private readonly now;
|
|
5
|
+
private readonly entries;
|
|
6
|
+
private cursor;
|
|
7
|
+
constructor(urls: string[], cooldownMs?: number, now?: () => number);
|
|
8
|
+
/** Next available proxy (round-robin), or null when all are cooling/empty. */
|
|
9
|
+
acquire(): string | null;
|
|
10
|
+
/** Put a proxy on cooldown after a block (403/429/captcha). */
|
|
11
|
+
reportBlocked(url: string): void;
|
|
12
|
+
/** Count of currently-available (not cooling) proxies. */
|
|
13
|
+
get available(): number;
|
|
14
|
+
/** Total pool size. */
|
|
15
|
+
get size(): number;
|
|
16
|
+
}
|
|
17
|
+
/** Lazily-built process-wide pool from `FUSE_PROXIES` env + optional JSON file. */
|
|
18
|
+
export declare function defaultProxyPool(proxiesPath?: string): ProxyPool;
|
|
19
|
+
/** Acquire from the default pool; null if none configured or all cooling. */
|
|
20
|
+
export declare function acquirePoolProxy(proxiesPath?: string): string | null;
|
|
21
|
+
/** Report a block to the default pool (puts that proxy on cooldown). */
|
|
22
|
+
export declare function reportProxyBlocked(url: string): void;
|
|
23
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/proxy/pool.ts"],"names":[],"mappings":"AAaA,+DAA+D;AAC/D,qBAAa,SAAS;IAMlB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,MAAM,CAAK;gBAGjB,IAAI,EAAE,MAAM,EAAE,EACG,UAAU,SAAa,EACvB,GAAG,GAAE,MAAM,MAAiB;IAK/C,8EAA8E;IAC9E,OAAO,IAAI,MAAM,GAAG,IAAI;IAaxB,+DAA+D;IAC/D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKhC,0DAA0D;IAC1D,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,uBAAuB;IACvB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAID,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAGhE;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rotating in-memory proxy pool: round-robin `acquire` skipping cooled-down
|
|
3
|
+
* entries; `reportBlocked` puts an entry on cooldown (it re-enters rotation
|
|
4
|
+
* automatically once the cooldown elapses — entries are never removed).
|
|
5
|
+
* @module proxy/pool
|
|
6
|
+
*/
|
|
7
|
+
import { loadProxyList } from "./load.js";
|
|
8
|
+
/** Round-robin proxy pool with per-entry cooldown on block. */
|
|
9
|
+
export class ProxyPool {
|
|
10
|
+
cooldownMs;
|
|
11
|
+
now;
|
|
12
|
+
entries;
|
|
13
|
+
cursor = 0;
|
|
14
|
+
constructor(urls, cooldownMs = 5 * 60_000, now = Date.now) {
|
|
15
|
+
this.cooldownMs = cooldownMs;
|
|
16
|
+
this.now = now;
|
|
17
|
+
this.entries = urls.map((url) => ({ url, cooldownUntil: 0 }));
|
|
18
|
+
}
|
|
19
|
+
/** Next available proxy (round-robin), or null when all are cooling/empty. */
|
|
20
|
+
acquire() {
|
|
21
|
+
const t = this.now();
|
|
22
|
+
const n = this.entries.length;
|
|
23
|
+
for (let i = 0; i < n; i += 1) {
|
|
24
|
+
const e = this.entries[(this.cursor + i) % n];
|
|
25
|
+
if (e && t >= e.cooldownUntil) {
|
|
26
|
+
this.cursor = (this.cursor + i + 1) % n;
|
|
27
|
+
return e.url;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/** Put a proxy on cooldown after a block (403/429/captcha). */
|
|
33
|
+
reportBlocked(url) {
|
|
34
|
+
const e = this.entries.find((x) => x.url === url);
|
|
35
|
+
if (e)
|
|
36
|
+
e.cooldownUntil = this.now() + this.cooldownMs;
|
|
37
|
+
}
|
|
38
|
+
/** Count of currently-available (not cooling) proxies. */
|
|
39
|
+
get available() {
|
|
40
|
+
const t = this.now();
|
|
41
|
+
return this.entries.filter((e) => t >= e.cooldownUntil).length;
|
|
42
|
+
}
|
|
43
|
+
/** Total pool size. */
|
|
44
|
+
get size() {
|
|
45
|
+
return this.entries.length;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let singleton = null;
|
|
49
|
+
/** Lazily-built process-wide pool from `FUSE_PROXIES` env + optional JSON file. */
|
|
50
|
+
export function defaultProxyPool(proxiesPath) {
|
|
51
|
+
if (!singleton)
|
|
52
|
+
singleton = new ProxyPool(loadProxyList(process.env, proxiesPath));
|
|
53
|
+
return singleton;
|
|
54
|
+
}
|
|
55
|
+
/** Acquire from the default pool; null if none configured or all cooling. */
|
|
56
|
+
export function acquirePoolProxy(proxiesPath) {
|
|
57
|
+
return defaultProxyPool(proxiesPath).acquire();
|
|
58
|
+
}
|
|
59
|
+
/** Report a block to the default pool (puts that proxy on cooldown). */
|
|
60
|
+
export function reportProxyBlocked(url) {
|
|
61
|
+
defaultProxyPool().reportBlocked(url);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/proxy/pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C,+DAA+D;AAC/D,MAAM,OAAO,SAAS;IAMD;IACA;IANF,OAAO,CAAe;IAC/B,MAAM,GAAG,CAAC,CAAC;IAEnB,YACE,IAAc,EACG,aAAa,CAAC,GAAG,MAAM,EACvB,MAAoB,IAAI,CAAC,GAAG;QAD5B,eAAU,GAAV,UAAU,CAAa;QACvB,QAAG,GAAH,GAAG,CAAyB;QAE7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,8EAA8E;IAC9E,OAAO;QACL,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO,CAAC,CAAC,GAAG,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,aAAa,CAAC,GAAW;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC;YAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IACxD,CAAC;IAED,0DAA0D;IAC1D,IAAI,SAAS;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;IACjE,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF;AAED,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;AACjD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,gBAAgB,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-options.d.ts","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMxF,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"map-options.d.ts","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMxF,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAyBvE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAcvE"}
|
|
@@ -17,6 +17,7 @@ export function toAgentOptions(a) {
|
|
|
17
17
|
userDataDir: a.userDataDir ?? ENV.userDataDir,
|
|
18
18
|
proxyUrl: a.proxyUrl,
|
|
19
19
|
proxyMapPath: a.proxyMapPath,
|
|
20
|
+
proxiesPath: a.proxiesPath,
|
|
20
21
|
storageStatePath: a.storageStatePath ?? ENV.storageStatePath,
|
|
21
22
|
realisticProfile: a.realisticProfile,
|
|
22
23
|
replayEnabled: a.replayEnabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-options.js","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,qFAAqF;AACrF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAE/B,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,MAAM,EAAG,CAAC,CAAC,MAAiC,IAAI,GAAG,CAAC,MAAM;QAC1D,OAAO,EAAG,CAAC,CAAC,OAAsC,IAAI,GAAG,CAAC,OAAO;QACjE,cAAc,EAAG,CAAC,CAAC,cAAqC,IAAI,GAAG,CAAC,cAAc;QAC9E,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAAgC,IAAI,GAAG,CAAC,QAAQ;QAC7D,SAAS,EAAE,CAAC,CAAC,SAAgC;QAC7C,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,UAAU,EAAE,CAAC,CAAC,UAAgC;QAC9C,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAA+B,IAAI,GAAG,CAAC,QAAQ;QAC5D,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAE,CAAC,CAAC,QAA8B;QAC1C,YAAY,EAAE,CAAC,CAAC,YAAkC;QAClD,gBAAgB,EAAG,CAAC,CAAC,gBAAuC,IAAI,GAAG,CAAC,gBAAgB;QACpF,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,SAAS,EAAE,CAAC,CAAC,SAA+B;QAC5C,aAAa,EAAE,CAAC,CAAC,aAAmC;QACpD,SAAS,EAAG,CAAC,CAAC,SAAgC,IAAI,GAAG,CAAC,SAAS;QAC/D,KAAK,EAAE,CAAC,CAAC,KAA8B;QACvC,OAAO,EAAE,CAAC,CAAC,OAAkC;KAC9C,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAsC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,YAAY,EAAE,CAAC,CAAC,YAAmC;QACnD,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,SAAS,EAAE,CAAC,CAAC,SAA+B;QAC5C,UAAU,EAAE,CAAC,CAAC,UAAgC;KAC/C,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"map-options.js","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,qFAAqF;AACrF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAE/B,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,MAAM,EAAG,CAAC,CAAC,MAAiC,IAAI,GAAG,CAAC,MAAM;QAC1D,OAAO,EAAG,CAAC,CAAC,OAAsC,IAAI,GAAG,CAAC,OAAO;QACjE,cAAc,EAAG,CAAC,CAAC,cAAqC,IAAI,GAAG,CAAC,cAAc;QAC9E,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAAgC,IAAI,GAAG,CAAC,QAAQ;QAC7D,SAAS,EAAE,CAAC,CAAC,SAAgC;QAC7C,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,UAAU,EAAE,CAAC,CAAC,UAAgC;QAC9C,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAA+B,IAAI,GAAG,CAAC,QAAQ;QAC5D,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAE,CAAC,CAAC,QAA8B;QAC1C,YAAY,EAAE,CAAC,CAAC,YAAkC;QAClD,WAAW,EAAE,CAAC,CAAC,WAAiC;QAChD,gBAAgB,EAAG,CAAC,CAAC,gBAAuC,IAAI,GAAG,CAAC,gBAAgB;QACpF,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,SAAS,EAAE,CAAC,CAAC,SAA+B;QAC5C,aAAa,EAAE,CAAC,CAAC,aAAmC;QACpD,SAAS,EAAG,CAAC,CAAC,SAAgC,IAAI,GAAG,CAAC,SAAS;QAC/D,KAAK,EAAE,CAAC,CAAC,KAA8B;QACvC,OAAO,EAAE,CAAC,CAAC,OAAkC;KAC9C,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAsC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,YAAY,EAAE,CAAC,CAAC,YAAmC;QACnD,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,SAAS,EAAE,CAAC,CAAC,SAA+B;QAC5C,UAAU,EAAE,CAAC,CAAC,UAAgC;KAC/C,CAAC;AACJ,CAAC"}
|
package/dist/server/schemas.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export declare const agentOptionShape: {
|
|
|
32
32
|
userDataDir: z.ZodOptional<z.ZodString>;
|
|
33
33
|
proxyUrl: z.ZodOptional<z.ZodString>;
|
|
34
34
|
proxyMapPath: z.ZodOptional<z.ZodString>;
|
|
35
|
+
proxiesPath: z.ZodOptional<z.ZodString>;
|
|
35
36
|
storageStatePath: z.ZodOptional<z.ZodString>;
|
|
36
37
|
realisticProfile: z.ZodOptional<z.ZodBoolean>;
|
|
37
38
|
replayEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -102,6 +103,7 @@ export declare const probeShape: {
|
|
|
102
103
|
userDataDir: z.ZodOptional<z.ZodString>;
|
|
103
104
|
proxyUrl: z.ZodOptional<z.ZodString>;
|
|
104
105
|
proxyMapPath: z.ZodOptional<z.ZodString>;
|
|
106
|
+
proxiesPath: z.ZodOptional<z.ZodString>;
|
|
105
107
|
storageStatePath: z.ZodOptional<z.ZodString>;
|
|
106
108
|
realisticProfile: z.ZodOptional<z.ZodBoolean>;
|
|
107
109
|
replayEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -169,6 +171,7 @@ export declare const probeHtmlShape: {
|
|
|
169
171
|
userDataDir: z.ZodOptional<z.ZodString>;
|
|
170
172
|
proxyUrl: z.ZodOptional<z.ZodString>;
|
|
171
173
|
proxyMapPath: z.ZodOptional<z.ZodString>;
|
|
174
|
+
proxiesPath: z.ZodOptional<z.ZodString>;
|
|
172
175
|
storageStatePath: z.ZodOptional<z.ZodString>;
|
|
173
176
|
realisticProfile: z.ZodOptional<z.ZodBoolean>;
|
|
174
177
|
replayEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,iDAAiD;AACjD,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,iDAAiD;AACjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC5B,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,YAAY;;kCAAuD,CAAC;AAgBjF,mCAAmC;AACnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA0D,CAAC;AAElF,wCAAwC;AACxC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA2D,CAAC"}
|
package/dist/server/schemas.js
CHANGED
|
@@ -29,6 +29,7 @@ export const agentOptionShape = {
|
|
|
29
29
|
userDataDir: z.string().optional(),
|
|
30
30
|
proxyUrl: z.string().optional(),
|
|
31
31
|
proxyMapPath: z.string().optional(),
|
|
32
|
+
proxiesPath: z.string().optional(),
|
|
32
33
|
storageStatePath: z.string().optional(),
|
|
33
34
|
realisticProfile: z.boolean().optional(),
|
|
34
35
|
replayEnabled: z.boolean().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmB/D,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CA8CvF"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { actByRef } from "../../actions/act-by-ref.js";
|
|
3
|
+
import { pickAutocomplete } from "../../actions/autocomplete.js";
|
|
3
4
|
import { smartClick } from "../../actions/smart-click.js";
|
|
4
5
|
import { smartFill } from "../../actions/smart-fill.js";
|
|
5
6
|
import { captureSnapshot } from "../../extraction/snapshot.js";
|
|
6
7
|
import { diffSnapshots } from "../../extraction/snapshot-diff.js";
|
|
7
8
|
import { errorResult, jsonResult } from "../result.js";
|
|
8
9
|
import { withSession } from "./with-session.js";
|
|
9
|
-
const KIND = z.enum(["click", "fill", "select"]);
|
|
10
|
+
const KIND = z.enum(["click", "fill", "select", "pick"]);
|
|
10
11
|
/** Run the chosen action (by ref or text fallback). */
|
|
11
12
|
async function runAct(page, a, human) {
|
|
12
13
|
const kind = a.kind;
|
|
13
14
|
const value = a.value ? String(a.value) : "";
|
|
15
|
+
const option = a.option ? String(a.option) : "";
|
|
14
16
|
if (typeof a.ref === "number")
|
|
15
|
-
return actByRef(page, a.ref, kind, value);
|
|
17
|
+
return actByRef(page, a.ref, kind, value, option);
|
|
16
18
|
if (typeof a.target !== "string")
|
|
17
19
|
return null;
|
|
20
|
+
if (kind === "pick")
|
|
21
|
+
return pickAutocomplete(page, page.locator(a.target).first(), value, option);
|
|
18
22
|
return kind === "fill"
|
|
19
23
|
? smartFill(page, a.target, value, "", human)
|
|
20
24
|
: smartClick(page, a.target, "", human);
|
|
@@ -34,13 +38,14 @@ export function registerSnapshotTools(server, sessions) {
|
|
|
34
38
|
});
|
|
35
39
|
server.registerTool("browser_act", {
|
|
36
40
|
title: "Act on element",
|
|
37
|
-
description: "Execute click/fill/select on an element by `ref` (from browser_snapshot) or by `target` text. Returns a diff of what changed
|
|
41
|
+
description: "Execute click/fill/select/pick on an element by `ref` (from browser_snapshot) or by `target` text. `pick` = type `value` into a combobox then click the matching suggestion (`option` text, defaults to `value`) — for airport/city autocompletes. Returns a diff of what changed.",
|
|
38
42
|
inputSchema: {
|
|
39
43
|
sessionId: z.string(),
|
|
40
44
|
kind: KIND,
|
|
41
45
|
ref: z.number().int().optional(),
|
|
42
46
|
target: z.string().optional(),
|
|
43
47
|
value: z.string().optional(),
|
|
48
|
+
option: z.string().optional(),
|
|
44
49
|
},
|
|
45
50
|
}, async (args) => {
|
|
46
51
|
const a = args;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAsB,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusengine/browser-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "MCP server + CLI giving AI agents a real, stealth browser (Patchright/Playwright) — per-country identity, self-healing actions, snapshots, multi-step plans, structured extraction, CDP attach.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Fusengine",
|