@fusengine/browser-mcp 0.1.12 → 0.1.14
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 +66 -9
- 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/bin/cli.js +6 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/fetch-cli.d.ts +5 -0
- package/dist/bin/fetch-cli.d.ts.map +1 -0
- package/dist/bin/fetch-cli.js +19 -0
- package/dist/bin/fetch-cli.js.map +1 -0
- 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/net/fetch-fast.d.ts +12 -0
- package/dist/net/fetch-fast.d.ts.map +1 -0
- package/dist/net/fetch-fast.js +27 -0
- package/dist/net/fetch-fast.js.map +1 -0
- 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/server.d.ts.map +1 -1
- package/dist/server/server.js +2 -0
- package/dist/server/server.js.map +1 -1
- package/dist/server/tools/fetch.d.ts +9 -0
- package/dist/server/tools/fetch.d.ts.map +1 -0
- package/dist/server/tools/fetch.js +28 -0
- package/dist/server/tools/fetch.js.map +1 -0
- package/package.json +3 -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
|
|
@@ -91,11 +128,12 @@ Supported: `FUSE_ENGINE`, `FUSE_CHANNEL`, `FUSE_CDP_ENDPOINT`, `FUSE_EXECUTABLE_
|
|
|
91
128
|
`FUSE_HEADLESS`, `FUSE_COUNTRY`, `FUSE_CURRENCY`, `FUSE_USER_DATA_DIR`,
|
|
92
129
|
`FUSE_STORAGE_STATE`, `FUSE_OUTPUT_DIR`.
|
|
93
130
|
|
|
94
|
-
### Tools (
|
|
131
|
+
### Tools (25)
|
|
95
132
|
|
|
96
133
|
| Group | Tools |
|
|
97
134
|
| --- | --- |
|
|
98
135
|
| **One-shot** | `browser_probe`, `browser_probe_html` |
|
|
136
|
+
| **Fast-path** | `browser_fetch` — HTTP fetch with browser TLS/HTTP2 impersonation, **no browser launch** (~10× faster) for server-rendered HTML |
|
|
99
137
|
| **Session** | `browser_open`, `browser_connect`, `browser_status`, `browser_close` |
|
|
100
138
|
| **Navigate** | `browser_navigate`, `browser_back`, `browser_forward`, `browser_wait`, `browser_wait_for` |
|
|
101
139
|
| **Act** | `browser_click`, `browser_fill`, `browser_login`, `browser_scroll`, `browser_press`, `browser_select` |
|
|
@@ -114,12 +152,19 @@ Key agentic patterns:
|
|
|
114
152
|
- **`browser_run`** — execute an ordered plan (navigate/act/wait/extract) in one call,
|
|
115
153
|
stopping at the first failure. Guardrails apply to the whole plan.
|
|
116
154
|
|
|
117
|
-
|
|
155
|
+
- **`browser_fetch`** — when a page is server-rendered (price lists, indexes, docs),
|
|
156
|
+
skip the browser entirely: `impit` impersonates a real Chrome TLS/JA3 + HTTP2
|
|
157
|
+
fingerprint, `linkedom` extracts the text, and the same price extractor runs on it.
|
|
158
|
+
~10× faster and far lighter. Passes static HTML and low/medium Cloudflare; for JS
|
|
159
|
+
challenges, Turnstile, DataDome or SPA content, fall back to `browser_probe`.
|
|
160
|
+
|
|
161
|
+
A `runs` resource exposes the JSON reports and screenshots written under the output dir
|
|
162
|
+
(see *Output & data location*).
|
|
118
163
|
|
|
119
164
|
## Library
|
|
120
165
|
|
|
121
166
|
```ts
|
|
122
|
-
import { BrowserAgent } from "
|
|
167
|
+
import { BrowserAgent } from "@fusengine/browser-mcp";
|
|
123
168
|
|
|
124
169
|
const agent = new BrowserAgent({ countryCode: "CH", engine: "patchright" });
|
|
125
170
|
const report = await agent.probe("https://example.com", { extractPrices: true });
|
|
@@ -175,6 +220,18 @@ Override per run with `outputDir` (library / MCP arg) or `--output-dir` (CLI). C
|
|
|
175
220
|
`serp.rank` (organic/ads positions + best) — a built-in rank tracker.
|
|
176
221
|
CLI: `--extract-serp --serp-pages 2 --rank-domain example.com`.
|
|
177
222
|
|
|
223
|
+
## Proxies & anti-bot (scale)
|
|
224
|
+
|
|
225
|
+
Provide a proxy **pool** and the server rotates across it, retiring a proxy on block:
|
|
226
|
+
|
|
227
|
+
- `FUSE_PROXIES` env (comma/newline list) or `proxiesPath` (JSON array file) — used when no
|
|
228
|
+
explicit `proxyUrl` / country-map proxy applies. Round-robin; a proxy that triggers a
|
|
229
|
+
captcha/Cloudflare challenge is put on a 5-min cooldown and skipped (**auto-retire**).
|
|
230
|
+
- **WebRTC leak guard**: when a proxy is set (Chromium), launch args force WebRTC through the
|
|
231
|
+
proxy so the real IP can't leak via ICE/STUN.
|
|
232
|
+
- Residential/mobile proxies are what actually beat industrial anti-bot at volume (paid). The
|
|
233
|
+
proxy list is a secret — keep it out of the repo (`proxies.json` is git-ignored).
|
|
234
|
+
|
|
178
235
|
## Disclaimer
|
|
179
236
|
|
|
180
237
|
Provided **as-is** under MIT, with no warranty. `fuse-browser` is a neutral, dual-use
|
|
@@ -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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"}
|
package/dist/bin/cli.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* fuse-browser CLI entry point. Subcommands: `probe`, `serp-batch`.
|
|
3
|
+
* fuse-browser CLI entry point. Subcommands: `probe`, `fetch`, `serp-batch`, `shots`.
|
|
4
4
|
* @module bin/cli
|
|
5
5
|
*/
|
|
6
6
|
import { parseArgs } from "node:util";
|
|
7
|
+
import { runFetchCli } from "./fetch-cli.js";
|
|
7
8
|
import { runProbeCli } from "./probe-cli.js";
|
|
8
9
|
import { runSerpBatch } from "./serp-batch-cli.js";
|
|
9
10
|
import { runShots } from "./shots-cli.js";
|
|
@@ -48,11 +49,14 @@ if (command === "serp-batch") {
|
|
|
48
49
|
else if (command === "shots" && rest[0]) {
|
|
49
50
|
await runShots(rest[0], opts);
|
|
50
51
|
}
|
|
52
|
+
else if (command === "fetch" && rest[0]) {
|
|
53
|
+
await runFetchCli(rest[0], opts);
|
|
54
|
+
}
|
|
51
55
|
else if (command === "probe" && rest[0]) {
|
|
52
56
|
await runProbeCli(rest[0], opts);
|
|
53
57
|
}
|
|
54
58
|
else {
|
|
55
|
-
process.stderr.write("usage: fuse-browser probe <url> [...] | serp-batch <query...> --rank-domain <d> | shots <url> --viewports mobile,desktop\n");
|
|
59
|
+
process.stderr.write("usage: fuse-browser probe <url> [...] | fetch <url> [--extract-prices --proxy <url>] | serp-batch <query...> --rank-domain <d> | shots <url> --viewports mobile,desktop\n");
|
|
56
60
|
process.exit(1);
|
|
57
61
|
}
|
|
58
62
|
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,IAAI;IACtB,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3B,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACnC,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,mBAAmB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACxC,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACnC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACjC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACtB,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACtB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnC,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACrC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;AACvC,MAAM,IAAI,GAAG,MAAiC,CAAC;AAE/C,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;IAC7B,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;KAAM,IAAI,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;KAAM,IAAI,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cli.d.ts","sourceRoot":"","sources":["../../src/bin/fetch-cli.ts"],"names":[],"mappings":"AAOA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAGtC,gDAAgD;AAChD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fetch` subcommand handler: HTTP fast-path (TLS impersonation), prints JSON.
|
|
3
|
+
* @module bin/fetch-cli
|
|
4
|
+
*/
|
|
5
|
+
import { extractPrices } from "../extraction/prices.js";
|
|
6
|
+
import { fetchFast } from "../net/fetch-fast.js";
|
|
7
|
+
const str = (v) => (typeof v === "string" ? v : undefined);
|
|
8
|
+
/** Run the `fetch` subcommand against `url`. */
|
|
9
|
+
export async function runFetchCli(url, values) {
|
|
10
|
+
const r = await fetchFast(url, str(values.proxy));
|
|
11
|
+
const out = {
|
|
12
|
+
status: r.status,
|
|
13
|
+
url: r.url,
|
|
14
|
+
text: r.text.slice(0, 20_000),
|
|
15
|
+
prices: values["extract-prices"] ? extractPrices(r.text) : undefined,
|
|
16
|
+
};
|
|
17
|
+
process.stdout.write(`${JSON.stringify(out, null, 2)}\n`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=fetch-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-cli.js","sourceRoot":"","sources":["../../src/bin/fetch-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,GAAG,GAAG,CAAC,CAAU,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAExF,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,MAAc;IAC3D,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACrE,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -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":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Extract readable body text from an HTML string (no browser, no layout). */
|
|
2
|
+
export declare function htmlToText(html: string): string;
|
|
3
|
+
/** Result of a fast HTTP fetch. */
|
|
4
|
+
export interface FastResponse {
|
|
5
|
+
status: number;
|
|
6
|
+
url: string;
|
|
7
|
+
html: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}
|
|
10
|
+
/** Fetch `url` with Chrome impersonation; returns status, raw html and body text. */
|
|
11
|
+
export declare function fetchFast(url: string, proxyUrl?: string): Promise<FastResponse>;
|
|
12
|
+
//# sourceMappingURL=fetch-fast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-fast.d.ts","sourceRoot":"","sources":["../../src/net/fetch-fast.ts"],"names":[],"mappings":"AAgBA,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qFAAqF;AACrF,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAIrF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP fast-path: fetch a URL with browser TLS/HTTP2 impersonation (impit) and
|
|
3
|
+
* parse it server-side with linkedom — no browser launch. For server-rendered
|
|
4
|
+
* HTML (price/index/SERP pages); JS/SPA pages still need `browser_probe`.
|
|
5
|
+
* @module net/fetch-fast
|
|
6
|
+
*/
|
|
7
|
+
import { Impit } from "impit";
|
|
8
|
+
import { parseHTML } from "linkedom";
|
|
9
|
+
let shared = null;
|
|
10
|
+
function client(proxyUrl) {
|
|
11
|
+
if (proxyUrl)
|
|
12
|
+
return new Impit({ browser: "chrome", proxyUrl });
|
|
13
|
+
shared ??= new Impit({ browser: "chrome" });
|
|
14
|
+
return shared;
|
|
15
|
+
}
|
|
16
|
+
/** Extract readable body text from an HTML string (no browser, no layout). */
|
|
17
|
+
export function htmlToText(html) {
|
|
18
|
+
const { document } = parseHTML(html);
|
|
19
|
+
return (document.body?.textContent ?? document.documentElement?.textContent ?? "").trim();
|
|
20
|
+
}
|
|
21
|
+
/** Fetch `url` with Chrome impersonation; returns status, raw html and body text. */
|
|
22
|
+
export async function fetchFast(url, proxyUrl) {
|
|
23
|
+
const res = await client(proxyUrl).fetch(url);
|
|
24
|
+
const html = await res.text();
|
|
25
|
+
return { status: res.status, url: res.url ?? url, html, text: htmlToText(html) };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=fetch-fast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-fast.js","sourceRoot":"","sources":["../../src/net/fetch-fast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,IAAI,MAAM,GAAiB,IAAI,CAAC;AAChC,SAAS,MAAM,CAAC,QAAiB;IAC/B,IAAI,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,QAAQ,CAAC,eAAe,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5F,CAAC;AAUD,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,QAAiB;IAC5D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAG,GAAwB,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACzG,CAAC"}
|
|
@@ -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":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAgBvD,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,IAAI,WAAW,CAkB1C"}
|
package/dist/server/server.js
CHANGED
|
@@ -11,6 +11,7 @@ import { registerConnectTool } from "./tools/connect.js";
|
|
|
11
11
|
import { registerExtractTool } from "./tools/extract.js";
|
|
12
12
|
import { registerExtractSchemaTool } from "./tools/extract-schema.js";
|
|
13
13
|
import { registerNavigateTool } from "./tools/navigate.js";
|
|
14
|
+
import { registerFetchTool } from "./tools/fetch.js";
|
|
14
15
|
import { registerProbeTools } from "./tools/probe.js";
|
|
15
16
|
import { registerSerpBatchTool } from "./tools/serp-batch.js";
|
|
16
17
|
import { registerRunTool } from "./tools/run.js";
|
|
@@ -23,6 +24,7 @@ export function createServer() {
|
|
|
23
24
|
const server = new McpServer({ name: "fuse-browser", version: VERSION });
|
|
24
25
|
const sessions = new SessionManager();
|
|
25
26
|
registerProbeTools(server);
|
|
27
|
+
registerFetchTool(server);
|
|
26
28
|
registerSerpBatchTool(server);
|
|
27
29
|
registerSessionTools(server, sessions);
|
|
28
30
|
registerConnectTool(server, sessions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQnD,6EAA6E;AAC7E,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQnD,6EAA6E;AAC7E,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `browser_fetch` tool: HTTP fast-path (browser TLS impersonation, no browser
|
|
3
|
+
* launch) for server-rendered HTML. Returns status, body text, optional prices.
|
|
4
|
+
* @module server/tools/fetch
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
+
/** Register `browser_fetch`. */
|
|
8
|
+
export declare function registerFetchTool(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/server/tools/fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,gCAAgC;AAChC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0BzD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { extractPrices } from "../../extraction/prices.js";
|
|
3
|
+
import { fetchFast } from "../../net/fetch-fast.js";
|
|
4
|
+
import { jsonResult } from "../result.js";
|
|
5
|
+
/** Register `browser_fetch`. */
|
|
6
|
+
export function registerFetchTool(server) {
|
|
7
|
+
server.registerTool("browser_fetch", {
|
|
8
|
+
title: "HTTP fast fetch",
|
|
9
|
+
description: "Fetch a URL with browser TLS/HTTP2 impersonation — NO browser launch, ~10x faster. For server-rendered HTML (price/index pages). Returns status, body text, optional prices. Not for JS/SPA pages — use browser_probe there.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
url: z.string(),
|
|
12
|
+
extractPrices: z.boolean().optional(),
|
|
13
|
+
proxyUrl: z.string().optional(),
|
|
14
|
+
maxChars: z.number().int().optional(),
|
|
15
|
+
},
|
|
16
|
+
}, async (args) => {
|
|
17
|
+
const a = args;
|
|
18
|
+
const r = await fetchFast(String(a.url), typeof a.proxyUrl === "string" ? a.proxyUrl : undefined);
|
|
19
|
+
const max = typeof a.maxChars === "number" ? a.maxChars : 20_000;
|
|
20
|
+
return jsonResult({
|
|
21
|
+
status: r.status,
|
|
22
|
+
url: r.url,
|
|
23
|
+
text: r.text.slice(0, max),
|
|
24
|
+
prices: a.extractPrices ? extractPrices(r.text) : undefined,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/server/tools/fetch.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,gCAAgC;AAChC,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,8NAA8N;QAChO,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SACtC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClG,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,OAAO,UAAU,CAAC;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC1B,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusengine/browser-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
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",
|
|
@@ -65,6 +65,8 @@
|
|
|
65
65
|
],
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
68
|
+
"impit": "^0.14.1",
|
|
69
|
+
"linkedom": "^0.18.12",
|
|
68
70
|
"patchright": "^1.60.1",
|
|
69
71
|
"playwright": "^1.60.0",
|
|
70
72
|
"zod": "^4.4.3"
|