imperium-crawl 2.5.3 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/dist/batch/job-store.js +1 -1
- package/dist/batch/job-store.js.map +1 -1
- package/dist/brave-api/index.js +1 -1
- package/dist/brave-api/index.js.map +1 -1
- package/dist/cli/config.d.ts +21 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +51 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/engine.d.ts +17 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +440 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/explore.d.ts +30 -0
- package/dist/cli/explore.d.ts.map +1 -0
- package/dist/cli/explore.js +427 -0
- package/dist/cli/explore.js.map +1 -0
- package/dist/cli/onboarding.d.ts +10 -0
- package/dist/cli/onboarding.d.ts.map +1 -0
- package/dist/cli/onboarding.js +128 -0
- package/dist/cli/onboarding.js.map +1 -0
- package/dist/cli/recorder.d.ts +44 -0
- package/dist/cli/recorder.d.ts.map +1 -0
- package/dist/cli/recorder.js +67 -0
- package/dist/cli/recorder.js.map +1 -0
- package/dist/cli/tui.d.ts +12 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +945 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/ui.d.ts +26 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +58 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/action-executor.d.ts +66 -0
- package/dist/core/action-executor.d.ts.map +1 -0
- package/dist/core/action-executor.js +403 -0
- package/dist/core/action-executor.js.map +1 -0
- package/dist/core/config.d.ts +16 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +56 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +40 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +86 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/formatters.d.ts +36 -0
- package/dist/core/formatters.d.ts.map +1 -0
- package/dist/core/formatters.js +147 -0
- package/dist/core/formatters.js.map +1 -0
- package/dist/engines/camofox.d.ts +27 -0
- package/dist/engines/camofox.d.ts.map +1 -0
- package/dist/engines/camofox.js +432 -0
- package/dist/engines/camofox.js.map +1 -0
- package/dist/engines/index.d.ts +13 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +41 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/types.d.ts +63 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +8 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/flows/engine.js +3 -3
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/storage.js +1 -1
- package/dist/flows/storage.js.map +1 -1
- package/dist/flows/templates.js +1 -1
- package/dist/flows/templates.js.map +1 -1
- package/dist/flows/types.d.ts +405 -405
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/store.js +1 -1
- package/dist/knowledge/store.js.map +1 -1
- package/dist/network/index.d.ts +3 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +2 -0
- package/dist/network/index.js.map +1 -0
- package/dist/recipes/data/crypto-websocket.json +11 -0
- package/dist/recipes/data/ecommerce-product.json +25 -0
- package/dist/recipes/data/github-trending.json +19 -0
- package/dist/recipes/data/hn-top-stories.json +22 -0
- package/dist/recipes/data/influencer-competitor-spy.json +14 -0
- package/dist/recipes/data/influencer-content-scout.json +14 -0
- package/dist/recipes/data/influencer-hashtag-scout.json +14 -0
- package/dist/recipes/data/influencer-niche-discovery.json +14 -0
- package/dist/recipes/data/job-listings-greenhouse.json +17 -0
- package/dist/recipes/data/news-article-reader.json +9 -0
- package/dist/recipes/data/product-reviews.json +33 -0
- package/dist/recipes/data/reddit-posts.json +8 -0
- package/dist/recipes/data/seo-page-audit.json +26 -0
- package/dist/recipes/data/social-media-mentions.json +31 -0
- package/dist/recipes/index.d.ts +1 -1
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +14 -14
- package/dist/recipes/index.js.map +1 -1
- package/dist/security/auth-vault.js +1 -1
- package/dist/security/auth-vault.js.map +1 -1
- package/dist/security/index.d.ts +6 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +4 -0
- package/dist/security/index.js.map +1 -0
- package/dist/sessions/browser-state.js +1 -1
- package/dist/sessions/browser-state.js.map +1 -1
- package/dist/sessions/encryption.js +1 -1
- package/dist/sessions/encryption.js.map +1 -1
- package/dist/sessions/manager.js +1 -1
- package/dist/sessions/manager.js.map +1 -1
- package/dist/skills/detector.js +1 -1
- package/dist/skills/detector.js.map +1 -1
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manager.js +1 -1
- package/dist/skills/manager.js.map +1 -1
- package/dist/snapshot/store.js +1 -1
- package/dist/snapshot/store.js.map +1 -1
- package/dist/social/index.d.ts +7 -0
- package/dist/social/index.d.ts.map +1 -0
- package/dist/social/index.js +4 -0
- package/dist/social/index.js.map +1 -0
- package/dist/stealth/browser-pool.js +1 -1
- package/dist/stealth/browser-pool.js.map +1 -1
- package/dist/stealth/browser.js +2 -2
- package/dist/stealth/browser.js.map +1 -1
- package/dist/stealth/chrome-profile.js +2 -2
- package/dist/stealth/chrome-profile.js.map +1 -1
- package/dist/stealth/index.js +2 -2
- package/dist/stealth/index.js.map +1 -1
- package/dist/tools/ai-extract.js +1 -1
- package/dist/tools/ai-extract.js.map +1 -1
- package/dist/tools/batch-download.d.ts +1 -1
- package/dist/tools/batch-download.js +1 -1
- package/dist/tools/batch-download.js.map +1 -1
- package/dist/tools/batch-scrape.d.ts +2 -2
- package/dist/tools/batch-scrape.js +1 -1
- package/dist/tools/batch-scrape.js.map +1 -1
- package/dist/tools/browser.d.ts +8 -8
- package/dist/tools/browser.js +4 -4
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/camofox-status.d.ts +14 -0
- package/dist/tools/camofox-status.d.ts.map +1 -0
- package/dist/tools/camofox-status.js +61 -0
- package/dist/tools/camofox-status.js.map +1 -0
- package/dist/tools/camofox-update.d.ts +29 -0
- package/dist/tools/camofox-update.d.ts.map +1 -0
- package/dist/tools/camofox-update.js +108 -0
- package/dist/tools/camofox-update.js.map +1 -0
- package/dist/tools/crawl.d.ts +2 -2
- package/dist/tools/crawl.js +1 -1
- package/dist/tools/crawl.js.map +1 -1
- package/dist/tools/create-skill.js +3 -3
- package/dist/tools/create-skill.js.map +1 -1
- package/dist/tools/discover-apis.d.ts +1 -1
- package/dist/tools/discover-apis.js +1 -1
- package/dist/tools/discover-apis.js.map +1 -1
- package/dist/tools/download.d.ts +7 -7
- package/dist/tools/download.js +1 -1
- package/dist/tools/download.js.map +1 -1
- package/dist/tools/extract.d.ts +1 -1
- package/dist/tools/extract.js +1 -1
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/image-search.d.ts +1 -1
- package/dist/tools/image-search.js +2 -2
- package/dist/tools/image-search.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/instagram.d.ts +1 -1
- package/dist/tools/instagram.js +3 -3
- package/dist/tools/instagram.js.map +1 -1
- package/dist/tools/interact.d.ts +86 -86
- package/dist/tools/interact.js +5 -5
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/knowledge.js +1 -1
- package/dist/tools/knowledge.js.map +1 -1
- package/dist/tools/list-skills.js +1 -1
- package/dist/tools/list-skills.js.map +1 -1
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/manifest.js +9 -0
- package/dist/tools/manifest.js.map +1 -1
- package/dist/tools/map.js +1 -1
- package/dist/tools/map.js.map +1 -1
- package/dist/tools/monitor-websocket.d.ts +1 -1
- package/dist/tools/monitor-websocket.js +1 -1
- package/dist/tools/monitor-websocket.js.map +1 -1
- package/dist/tools/monitor.d.ts +2 -2
- package/dist/tools/news-search.d.ts +1 -1
- package/dist/tools/news-search.js +2 -2
- package/dist/tools/news-search.js.map +1 -1
- package/dist/tools/query-api.d.ts +5 -5
- package/dist/tools/query-api.js +1 -1
- package/dist/tools/query-api.js.map +1 -1
- package/dist/tools/readability.js +1 -1
- package/dist/tools/readability.js.map +1 -1
- package/dist/tools/record-flow.d.ts +2 -2
- package/dist/tools/record-flow.js +3 -3
- package/dist/tools/record-flow.js.map +1 -1
- package/dist/tools/reddit.d.ts +2 -2
- package/dist/tools/reddit.js +3 -3
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/rss.js +1 -1
- package/dist/tools/rss.js.map +1 -1
- package/dist/tools/run-flow.d.ts +6 -6
- package/dist/tools/run-skill.d.ts +6 -6
- package/dist/tools/run-skill.js +2 -2
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/scrape.d.ts +4 -4
- package/dist/tools/scrape.js +1 -1
- package/dist/tools/scrape.js.map +1 -1
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.js +2 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/snapshot.d.ts +5 -5
- package/dist/tools/snapshot.js +2 -2
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/video-search.d.ts +1 -1
- package/dist/tools/video-search.js +2 -2
- package/dist/tools/video-search.js.map +1 -1
- package/dist/tools/watch.d.ts +2 -2
- package/dist/tools/watch.js +1 -1
- package/dist/tools/watch.js.map +1 -1
- package/dist/tools/youtube.d.ts +1 -1
- package/dist/tools/youtube.js +4 -4
- package/dist/tools/youtube.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fetcher.js +1 -1
- package/dist/utils/fetcher.js.map +1 -1
- package/dist/utils/robots.js +1 -1
- package/dist/utils/robots.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CamoFox browser engine — REST API wrapper around CamoFox (Camoufox-based stealth browser).
|
|
3
|
+
*
|
|
4
|
+
* CamoFox is a Firefox fork with C++ anti-fingerprinting — it patches
|
|
5
|
+
* navigator.hardwareConcurrency, WebGL, AudioContext, and WebRTC at the C++
|
|
6
|
+
* level before JavaScript ever sees them. No shims, no tells.
|
|
7
|
+
*
|
|
8
|
+
* This engine auto-starts the CamoFox server on first use and communicates
|
|
9
|
+
* via its REST API (default port 9377). It implements BrowserEngine so tool
|
|
10
|
+
* code can switch between Playwright and CamoFox with a single flag.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* import { camofoxEngine } from "../engines/camofox.js";
|
|
14
|
+
* if (await camofoxEngine.isAvailable()) {
|
|
15
|
+
* await camofoxEngine.launch();
|
|
16
|
+
* const { page, cleanup } = await camofoxEngine.acquirePage({ headless: true });
|
|
17
|
+
* await page.goto("https://example.com");
|
|
18
|
+
* const html = await page.content();
|
|
19
|
+
* await cleanup();
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
import { debugLog } from "../utils/debug.js";
|
|
23
|
+
import { createRequire } from "node:module";
|
|
24
|
+
const DEFAULT_PORT = 9377;
|
|
25
|
+
const DEFAULT_BASE_URL = `http://127.0.0.1:${DEFAULT_PORT}`;
|
|
26
|
+
const STARTUP_TIMEOUT_MS = 30_000;
|
|
27
|
+
const HEALTH_POLL_MS = 250;
|
|
28
|
+
let serverProcess = null;
|
|
29
|
+
let baseUrl = process.env.CAMOFOX_URL ?? DEFAULT_BASE_URL;
|
|
30
|
+
let launchPromise = null;
|
|
31
|
+
// ── Internal helpers ──────────────────────────────────────────────────
|
|
32
|
+
async function camoFetch(path, options = {}) {
|
|
33
|
+
const { timeout = 15_000, ...fetchOptions } = options;
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
36
|
+
try {
|
|
37
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
38
|
+
...fetchOptions,
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
...(fetchOptions.headers ?? {}),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
return res;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function healthCheck() {
|
|
52
|
+
try {
|
|
53
|
+
const res = await camoFetch("/health", { timeout: 3000 });
|
|
54
|
+
return res.ok;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ── Server lifecycle ──────────────────────────────────────────────────
|
|
61
|
+
async function startServer() {
|
|
62
|
+
if (await healthCheck()) {
|
|
63
|
+
debugLog("camoFox", "Server already running");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
debugLog("camoFox", "Starting server...");
|
|
67
|
+
const { spawn } = await import("node:child_process");
|
|
68
|
+
// Try npx first, then direct node invocation
|
|
69
|
+
const isNpxAvailable = await (async () => {
|
|
70
|
+
try {
|
|
71
|
+
const { spawnSync } = await import("node:child_process");
|
|
72
|
+
const result = spawnSync("npx", ["--version"], { timeout: 5000 });
|
|
73
|
+
return result.status === 0;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
})();
|
|
79
|
+
if (isNpxAvailable) {
|
|
80
|
+
serverProcess = spawn("npx", ["@askjo/camofox-browser"], {
|
|
81
|
+
env: { ...process.env, CAMOFOX_PORT: String(DEFAULT_PORT) },
|
|
82
|
+
stdio: "pipe",
|
|
83
|
+
detached: false,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Try requiring the module directly
|
|
88
|
+
serverProcess = spawn(process.execPath, [
|
|
89
|
+
"-e",
|
|
90
|
+
`require('@askjo/camofox-browser/server.js')`,
|
|
91
|
+
], {
|
|
92
|
+
env: { ...process.env, CAMOFOX_PORT: String(DEFAULT_PORT) },
|
|
93
|
+
stdio: "pipe",
|
|
94
|
+
detached: false,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
serverProcess.stdout?.on("data", (d) => debugLog("camoFox:stdout", d.toString().trim()));
|
|
98
|
+
serverProcess.stderr?.on("data", (d) => debugLog("camoFox:stderr", d.toString().trim()));
|
|
99
|
+
// Wait for server to become healthy
|
|
100
|
+
const deadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
101
|
+
while (Date.now() < deadline) {
|
|
102
|
+
if (await healthCheck()) {
|
|
103
|
+
debugLog("camoFox", "Server ready");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
await new Promise((r) => setTimeout(r, HEALTH_POLL_MS));
|
|
107
|
+
}
|
|
108
|
+
throw new Error(`CamoFox server failed to start within ${STARTUP_TIMEOUT_MS / 1000}s`);
|
|
109
|
+
}
|
|
110
|
+
async function stopServer() {
|
|
111
|
+
if (serverProcess) {
|
|
112
|
+
try {
|
|
113
|
+
await camoFetch("/stop", { method: "POST", timeout: 5000 });
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Server may already be down
|
|
117
|
+
}
|
|
118
|
+
serverProcess.kill("SIGTERM");
|
|
119
|
+
serverProcess = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── Cleanup on exit ───────────────────────────────────────────────────
|
|
123
|
+
let shutdownRegistered = false;
|
|
124
|
+
function registerShutdown() {
|
|
125
|
+
if (shutdownRegistered)
|
|
126
|
+
return;
|
|
127
|
+
shutdownRegistered = true;
|
|
128
|
+
const cleanup = async () => {
|
|
129
|
+
await stopServer();
|
|
130
|
+
process.exit(0);
|
|
131
|
+
};
|
|
132
|
+
process.on("SIGINT", cleanup);
|
|
133
|
+
process.on("SIGTERM", cleanup);
|
|
134
|
+
}
|
|
135
|
+
// ── CamoFoxPage ───────────────────────────────────────────────────────
|
|
136
|
+
class CamoFoxPage {
|
|
137
|
+
tabId;
|
|
138
|
+
userId;
|
|
139
|
+
currentUrl;
|
|
140
|
+
closed = false;
|
|
141
|
+
constructor(tabId, userId, startUrl) {
|
|
142
|
+
this.tabId = tabId;
|
|
143
|
+
this.userId = userId;
|
|
144
|
+
this.currentUrl = startUrl;
|
|
145
|
+
}
|
|
146
|
+
url() {
|
|
147
|
+
return this.currentUrl;
|
|
148
|
+
}
|
|
149
|
+
async content() {
|
|
150
|
+
this.ensureOpen();
|
|
151
|
+
try {
|
|
152
|
+
const res = await camoFetch(`/tabs/${this.tabId}/snapshot?userId=${this.userId}`, {
|
|
153
|
+
timeout: 10_000,
|
|
154
|
+
});
|
|
155
|
+
if (!res.ok)
|
|
156
|
+
throw new Error(`Snapshot failed: ${res.status}`);
|
|
157
|
+
const data = await res.json();
|
|
158
|
+
// Accessibility snapshot — for scraping we want full HTML.
|
|
159
|
+
// Fall back to navigating + re-fetching via the page URL.
|
|
160
|
+
// For now return snapshot text as markdown approximation.
|
|
161
|
+
const links = (data.links ?? []).map((l) => `- [${l.text}](${l.url})`).join("\n");
|
|
162
|
+
return `# ${this.currentUrl}\n\n${data.snapshot}\n\n## Links\n\n${links}`;
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
throw new Error(`Failed to get page content: ${err instanceof Error ? err.message : String(err)}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async goto(url, options) {
|
|
169
|
+
this.ensureOpen();
|
|
170
|
+
const res = await camoFetch(`/tabs/${this.tabId}/navigate`, {
|
|
171
|
+
method: "POST",
|
|
172
|
+
body: JSON.stringify({ userId: this.userId, url }),
|
|
173
|
+
timeout: options?.timeout ?? 15_000,
|
|
174
|
+
});
|
|
175
|
+
if (!res.ok)
|
|
176
|
+
throw new Error(`Navigation failed: ${res.status}`);
|
|
177
|
+
this.currentUrl = url;
|
|
178
|
+
}
|
|
179
|
+
async click(selector, options) {
|
|
180
|
+
this.ensureOpen();
|
|
181
|
+
// CamoFox supports both refs (e1, e2) and CSS selectors
|
|
182
|
+
const body = selector.startsWith("e") && /^e\d+$/.test(selector)
|
|
183
|
+
? { userId: this.userId, ref: selector }
|
|
184
|
+
: { userId: this.userId, selector };
|
|
185
|
+
const res = await camoFetch(`/tabs/${this.tabId}/click`, {
|
|
186
|
+
method: "POST",
|
|
187
|
+
body: JSON.stringify(body),
|
|
188
|
+
timeout: options?.timeout ?? 10_000,
|
|
189
|
+
});
|
|
190
|
+
if (!res.ok)
|
|
191
|
+
throw new Error(`Click failed: ${res.status}`);
|
|
192
|
+
}
|
|
193
|
+
async fill(selector, text, options) {
|
|
194
|
+
this.ensureOpen();
|
|
195
|
+
const body = selector.startsWith("e") && /^e\d+$/.test(selector)
|
|
196
|
+
? { userId: this.userId, ref: selector, text }
|
|
197
|
+
: { userId: this.userId, selector, text };
|
|
198
|
+
const res = await camoFetch(`/tabs/${this.tabId}/type`, {
|
|
199
|
+
method: "POST",
|
|
200
|
+
body: JSON.stringify(body),
|
|
201
|
+
timeout: options?.timeout ?? 10_000,
|
|
202
|
+
});
|
|
203
|
+
if (!res.ok)
|
|
204
|
+
throw new Error(`Type failed: ${res.status}`);
|
|
205
|
+
}
|
|
206
|
+
async type(selector, text, options) {
|
|
207
|
+
// CamoFox type doesn't support delay directly — simulate with fill
|
|
208
|
+
return this.fill(selector, text, options);
|
|
209
|
+
}
|
|
210
|
+
async selectOption(selector, value, _options) {
|
|
211
|
+
this.ensureOpen();
|
|
212
|
+
// CamoFox doesn't have a dedicated selectOption — use evaluate
|
|
213
|
+
try {
|
|
214
|
+
await this.evaluate(`(function(){
|
|
215
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
216
|
+
if (el) { el.value = ${JSON.stringify(value)}; el.dispatchEvent(new Event('change', { bubbles: true })); }
|
|
217
|
+
})()`);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
throw new Error(`Select option not supported for selector: ${selector}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async hover(selector, _options) {
|
|
224
|
+
this.ensureOpen();
|
|
225
|
+
// CamoFox doesn't have a dedicated hover endpoint — use evaluate
|
|
226
|
+
try {
|
|
227
|
+
await this.evaluate(`(function(){
|
|
228
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
229
|
+
if (el) el.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
|
230
|
+
})()`);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
throw new Error(`Hover not supported for selector: ${selector}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async press(key, options) {
|
|
237
|
+
this.ensureOpen();
|
|
238
|
+
const res = await camoFetch(`/tabs/${this.tabId}/press`, {
|
|
239
|
+
method: "POST",
|
|
240
|
+
body: JSON.stringify({ userId: this.userId, key }),
|
|
241
|
+
timeout: options?.timeout ?? 10_000,
|
|
242
|
+
});
|
|
243
|
+
if (!res.ok)
|
|
244
|
+
throw new Error(`Press failed: ${res.status}`);
|
|
245
|
+
}
|
|
246
|
+
async evaluate(script) {
|
|
247
|
+
this.ensureOpen();
|
|
248
|
+
// CamoFox doesn't have an evaluate endpoint in the REST API.
|
|
249
|
+
// For simple reads we use the snapshot, for writes we attempt page interaction.
|
|
250
|
+
// Most evaluate use cases in our tools are for:
|
|
251
|
+
// 1. Reading page state → use snapshot API
|
|
252
|
+
// 2. Executing JS → use type/click with JS-injection via selectOption/hover workarounds
|
|
253
|
+
//
|
|
254
|
+
// Return null for unsupported evaluate calls
|
|
255
|
+
debugLog("camoFox", `evaluate() called but not natively supported: ${script.slice(0, 80)}`);
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
async waitForTimeout(ms) {
|
|
259
|
+
this.ensureOpen();
|
|
260
|
+
// Use CamoFox wait endpoint if available, else client-side wait
|
|
261
|
+
try {
|
|
262
|
+
await camoFetch(`/tabs/${this.tabId}/wait`, {
|
|
263
|
+
method: "POST",
|
|
264
|
+
body: JSON.stringify({ userId: this.userId, timeout: ms }),
|
|
265
|
+
timeout: ms + 5000,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Fallback: just wait on client side
|
|
270
|
+
await new Promise((r) => setTimeout(r, ms));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async waitForSelector(selector, options) {
|
|
274
|
+
this.ensureOpen();
|
|
275
|
+
try {
|
|
276
|
+
await camoFetch(`/tabs/${this.tabId}/wait`, {
|
|
277
|
+
method: "POST",
|
|
278
|
+
body: JSON.stringify({
|
|
279
|
+
userId: this.userId,
|
|
280
|
+
selector,
|
|
281
|
+
timeout: options?.timeout ?? 10_000,
|
|
282
|
+
}),
|
|
283
|
+
timeout: (options?.timeout ?? 10_000) + 5000,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// Fallback: poll with snapshot
|
|
288
|
+
const deadline = Date.now() + (options?.timeout ?? 10_000);
|
|
289
|
+
while (Date.now() < deadline) {
|
|
290
|
+
const res = await camoFetch(`/tabs/${this.tabId}/snapshot?userId=${this.userId}`);
|
|
291
|
+
if (res.ok) {
|
|
292
|
+
const data = await res.json();
|
|
293
|
+
if (data.snapshot.includes(selector))
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
297
|
+
}
|
|
298
|
+
throw new Error(`waitForSelector timed out: ${selector}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async screenshot(options) {
|
|
302
|
+
this.ensureOpen();
|
|
303
|
+
const fullPage = options?.fullPage ?? false;
|
|
304
|
+
const res = await camoFetch(`/tabs/${this.tabId}/screenshot?userId=${this.userId}&fullPage=${fullPage}`, { timeout: 15_000 });
|
|
305
|
+
if (!res.ok)
|
|
306
|
+
throw new Error(`Screenshot failed: ${res.status}`);
|
|
307
|
+
// Screenshot returns PNG binary or base64 via snapshot?includeScreenshot=true
|
|
308
|
+
// The REST API returns the image directly
|
|
309
|
+
const arrayBuffer = await res.arrayBuffer();
|
|
310
|
+
return Buffer.from(arrayBuffer);
|
|
311
|
+
}
|
|
312
|
+
async close() {
|
|
313
|
+
if (this.closed)
|
|
314
|
+
return;
|
|
315
|
+
this.closed = true;
|
|
316
|
+
try {
|
|
317
|
+
await camoFetch(`/tabs/${this.tabId}?userId=${this.userId}`, {
|
|
318
|
+
method: "DELETE",
|
|
319
|
+
timeout: 5000,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Tab may already be closed
|
|
324
|
+
}
|
|
325
|
+
debugLog("camoFox", `Tab closed: ${this.tabId}`);
|
|
326
|
+
}
|
|
327
|
+
ensureOpen() {
|
|
328
|
+
if (this.closed)
|
|
329
|
+
throw new Error("Page is closed");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// ── Engine implementation ─────────────────────────────────────────────
|
|
333
|
+
let launched = false;
|
|
334
|
+
export const camofoxEngine = {
|
|
335
|
+
name: "camofox",
|
|
336
|
+
description: "CamoFox — Firefox-based stealth browser with C++ anti-fingerprinting (bypasses Cloudflare, Google, most bot detection)",
|
|
337
|
+
async isAvailable() {
|
|
338
|
+
try {
|
|
339
|
+
const require = createRequire(import.meta.url);
|
|
340
|
+
require.resolve("@askjo/camofox-browser/package.json");
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
if (await healthCheck())
|
|
345
|
+
return true;
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
async launch() {
|
|
350
|
+
if (launched)
|
|
351
|
+
return;
|
|
352
|
+
if (launchPromise)
|
|
353
|
+
return launchPromise;
|
|
354
|
+
launchPromise = (async () => {
|
|
355
|
+
await startServer();
|
|
356
|
+
registerShutdown();
|
|
357
|
+
launched = true;
|
|
358
|
+
debugLog("camoFox", "Engine launched");
|
|
359
|
+
})();
|
|
360
|
+
await launchPromise;
|
|
361
|
+
},
|
|
362
|
+
async shutdown() {
|
|
363
|
+
await stopServer();
|
|
364
|
+
launched = false;
|
|
365
|
+
launchPromise = null;
|
|
366
|
+
},
|
|
367
|
+
async acquirePage(options) {
|
|
368
|
+
if (!launched)
|
|
369
|
+
await this.launch();
|
|
370
|
+
const userId = options.sessionId ?? `ic_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
371
|
+
const sessionKey = `sk_${Date.now()}`;
|
|
372
|
+
const startUrl = "about:blank";
|
|
373
|
+
// Create tab
|
|
374
|
+
const res = await camoFetch("/tabs", {
|
|
375
|
+
method: "POST",
|
|
376
|
+
body: JSON.stringify({
|
|
377
|
+
userId,
|
|
378
|
+
sessionKey,
|
|
379
|
+
url: startUrl,
|
|
380
|
+
}),
|
|
381
|
+
timeout: options.timeout ?? 15_000,
|
|
382
|
+
});
|
|
383
|
+
if (!res.ok) {
|
|
384
|
+
const errBody = await res.text().catch(() => "");
|
|
385
|
+
throw new Error(`Failed to create CamoFox tab: ${res.status} ${errBody}`);
|
|
386
|
+
}
|
|
387
|
+
const data = await res.json();
|
|
388
|
+
const tabId = data.id;
|
|
389
|
+
// Navigate to actual URL if provided
|
|
390
|
+
// (the url param above is the initial URL during tab creation)
|
|
391
|
+
const page = new CamoFoxPage(tabId, userId, startUrl);
|
|
392
|
+
const cleanup = async () => {
|
|
393
|
+
await page.close();
|
|
394
|
+
try {
|
|
395
|
+
await camoFetch(`/sessions/${userId}`, { method: "DELETE", timeout: 5000 });
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// Session may already be cleaned up
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
return { page, isProfile: false, cleanup };
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
// ── Public helpers ────────────────────────────────────────────────────
|
|
405
|
+
export async function isCamofoxAvailable() {
|
|
406
|
+
return camofoxEngine.isAvailable();
|
|
407
|
+
}
|
|
408
|
+
export async function getCamofoxVersion() {
|
|
409
|
+
try {
|
|
410
|
+
const require = createRequire(import.meta.url);
|
|
411
|
+
const pkg = require("@askjo/camofox-browser/package.json");
|
|
412
|
+
return pkg.version;
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
export async function getCamofoxLatestVersion() {
|
|
419
|
+
try {
|
|
420
|
+
const res = await fetch("https://registry.npmjs.org/@askjo/camofox-browser/latest", {
|
|
421
|
+
timeout: 5000,
|
|
422
|
+
});
|
|
423
|
+
if (!res.ok)
|
|
424
|
+
return null;
|
|
425
|
+
const data = await res.json();
|
|
426
|
+
return data.version;
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=camofox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camofox.js","sourceRoot":"","sources":["../../src/engines/camofox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine registry — resolves engine name to engine instance.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const engine = await resolveEngine("camofox");
|
|
6
|
+
* const engine = await resolveEngine("auto"); // prefers CamoFox if available
|
|
7
|
+
*/
|
|
8
|
+
import type { BrowserEngine, EngineName } from "./types.js";
|
|
9
|
+
export declare function registerEngine(engine: BrowserEngine): void;
|
|
10
|
+
export declare function getEngine(name: string): BrowserEngine | undefined;
|
|
11
|
+
export declare function listEngines(): BrowserEngine[];
|
|
12
|
+
export declare function resolveEngine(name: EngineName): Promise<BrowserEngine>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI5D,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEjE;AAED,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAE7C;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B5E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine registry — resolves engine name to engine instance.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const engine = await resolveEngine("camofox");
|
|
6
|
+
* const engine = await resolveEngine("auto"); // prefers CamoFox if available
|
|
7
|
+
*/
|
|
8
|
+
const engines = new Map();
|
|
9
|
+
export function registerEngine(engine) {
|
|
10
|
+
engines.set(engine.name, engine);
|
|
11
|
+
}
|
|
12
|
+
export function getEngine(name) {
|
|
13
|
+
return engines.get(name);
|
|
14
|
+
}
|
|
15
|
+
export function listEngines() {
|
|
16
|
+
return [...engines.values()];
|
|
17
|
+
}
|
|
18
|
+
export async function resolveEngine(name) {
|
|
19
|
+
// Lazy-load engines on first use to avoid startup cost
|
|
20
|
+
if (engines.size === 0) {
|
|
21
|
+
const { camofoxEngine } = await import("./camofox.js");
|
|
22
|
+
registerEngine(camofoxEngine);
|
|
23
|
+
}
|
|
24
|
+
if (name === "auto") {
|
|
25
|
+
// Prefer CamoFox if available (better anti-detection), fallback to default
|
|
26
|
+
const cf = engines.get("camofox");
|
|
27
|
+
if (cf && await cf.isAvailable())
|
|
28
|
+
return cf;
|
|
29
|
+
throw new Error("No browser engine available. Install rebrowser-playwright or @askjo/camofox-browser.");
|
|
30
|
+
}
|
|
31
|
+
const engine = engines.get(name);
|
|
32
|
+
if (!engine) {
|
|
33
|
+
const available = [...engines.keys()].join(", ") || "none";
|
|
34
|
+
throw new Error(`Unknown engine "${name}". Available: ${available}`);
|
|
35
|
+
}
|
|
36
|
+
if (!await engine.isAvailable()) {
|
|
37
|
+
throw new Error(`Engine "${name}" is not available. Install with: npm install @askjo/camofox-browser`);
|
|
38
|
+
}
|
|
39
|
+
return engine;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,uDAAuD;IACvD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACvD,cAAc,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,2EAA2E;QAC3E,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,sEAAsE,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser engine abstraction — unified interface for Playwright and CamoFox.
|
|
3
|
+
*
|
|
4
|
+
* Each engine implements this interface so tool code can switch engines
|
|
5
|
+
* with a single option (`engine: "playwright" | "camofox" | "auto"`).
|
|
6
|
+
*/
|
|
7
|
+
export interface EnginePage {
|
|
8
|
+
url(): string;
|
|
9
|
+
content(): Promise<string>;
|
|
10
|
+
goto(url: string, options?: {
|
|
11
|
+
waitUntil?: string;
|
|
12
|
+
timeout?: number;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
click(selector: string, options?: {
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
fill(selector: string, text: string, options?: {
|
|
18
|
+
timeout?: number;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
type(selector: string, text: string, options?: {
|
|
21
|
+
delay?: number;
|
|
22
|
+
timeout?: number;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
selectOption(selector: string, value: string, options?: {
|
|
25
|
+
timeout?: number;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
hover(selector: string, options?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
press(key: string, options?: {
|
|
31
|
+
timeout?: number;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
evaluate<T>(script: string): Promise<T>;
|
|
34
|
+
waitForTimeout(ms: number): Promise<void>;
|
|
35
|
+
waitForSelector(selector: string, options?: {
|
|
36
|
+
timeout?: number;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
screenshot(options?: {
|
|
39
|
+
fullPage?: boolean;
|
|
40
|
+
}): Promise<Buffer>;
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export interface AcquirePageResult {
|
|
44
|
+
page: EnginePage;
|
|
45
|
+
isProfile: boolean;
|
|
46
|
+
cleanup: () => Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export interface BrowserEngine {
|
|
49
|
+
readonly name: string;
|
|
50
|
+
readonly description: string;
|
|
51
|
+
isAvailable(): Promise<boolean>;
|
|
52
|
+
launch(): Promise<void>;
|
|
53
|
+
shutdown(): Promise<void>;
|
|
54
|
+
acquirePage(options: {
|
|
55
|
+
chromeProfile?: boolean;
|
|
56
|
+
proxyUrl?: string;
|
|
57
|
+
headless?: boolean;
|
|
58
|
+
sessionId?: string;
|
|
59
|
+
timeout?: number;
|
|
60
|
+
}): Promise<AcquirePageResult>;
|
|
61
|
+
}
|
|
62
|
+
export type EngineName = "playwright" | "camofox" | "auto";
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,MAAM,CAAC;IACd,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,OAAO,EAAE;QACnB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser engine abstraction — unified interface for Playwright and CamoFox.
|
|
3
|
+
*
|
|
4
|
+
* Each engine implements this interface so tool code can switch engines
|
|
5
|
+
* with a single option (`engine: "playwright" | "camofox" | "auto"`).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/flows/engine.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { htmlToMarkdown } from "../utils/markdown.js";
|
|
4
|
-
import { getTwoCaptchaApiKey } from "../config.js";
|
|
4
|
+
import { getTwoCaptchaApiKey } from "../core/config.js";
|
|
5
5
|
import { acquirePage } from "../stealth/chrome-profile.js";
|
|
6
6
|
import { getPool } from "../stealth/browser-pool.js";
|
|
7
7
|
import { trySolveCaptcha, hasCaptcha, detectCaptcha } from "../captcha/index.js";
|
|
8
|
-
import { executeAction } from "../
|
|
9
|
-
import { getRequestLog } from "../network/
|
|
8
|
+
import { executeAction } from "../core/action-executor.js";
|
|
9
|
+
import { getRequestLog } from "../network/index.js";
|
|
10
10
|
import { loadFlow } from "./storage.js";
|
|
11
11
|
import { resolveFlowInputs, resolveStepTemplates } from "./templates.js";
|
|
12
12
|
import { resolveSmartTarget } from "./smart-target.js";
|
package/dist/flows/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/flows/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/flows/engine.ts"],"names":[],"mappings":"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"}
|