alvin-bot 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -31
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -174
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -583
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -86
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1902
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,562 +1 @@
1
- /**
2
- * Multi-Strategy Browser Manager — with automatic fallback chain.
3
- *
4
- * Strategy priority:
5
- * 1. Gateway (browse-server.cjs HTTP server) — if script exists and is running
6
- * 2. CDP (Chrome DevTools Protocol) — via hub browser.sh cdp, persistent cookies
7
- * 3. Hub Stealth (Playwright + stealth plugin) — via hub browser.sh stealth
8
- * 4. Raw CLI (bare Playwright) — last resort, easily blocked
9
- *
10
- * If a strategy is unavailable, we automatically cascade to the next one
11
- * and log a warning so failures are visible, not silent.
12
- */
13
- import { execSync, execFileSync, spawn } from "child_process";
14
- import http from "http";
15
- import fs from "fs";
16
- import { config } from "../config.js";
17
- import { BROWSE_SERVER_SCRIPT, HUB_BROWSER_SH } from "../paths.js";
18
- import { screenshotUrl, extractText, generatePdf } from "./browser.js";
19
- import { webfetchNavigate, WebfetchFailed } from "./browser-webfetch.js";
20
- import * as cdpBootstrap from "./cdp-bootstrap.js";
21
- const CDP_PORT = 9222;
22
- const EXEC_TIMEOUT = 60_000; // 60s for page loads via shell
23
- // ── Logging ──────────────────────────────────────────────────────────
24
- function log(msg) {
25
- console.log(`[browser-manager] ${msg}`);
26
- }
27
- // ── Availability Checks ──────────────────────────────────────────────
28
- function isGatewayScriptPresent() {
29
- return fs.existsSync(BROWSE_SERVER_SCRIPT);
30
- }
31
- async function isGatewayRunning() {
32
- try {
33
- const health = await gatewayRequest("/health");
34
- return !!health?.ok;
35
- }
36
- catch {
37
- return false;
38
- }
39
- }
40
- function isHubBrowserAvailable() {
41
- return fs.existsSync(HUB_BROWSER_SH);
42
- }
43
- async function isCDPAvailable() {
44
- return new Promise((resolve) => {
45
- const req = http.get(`http://127.0.0.1:${CDP_PORT}/json/version`, (res) => {
46
- let data = "";
47
- res.on("data", (chunk) => (data += chunk));
48
- res.on("end", () => resolve(res.statusCode === 200));
49
- });
50
- req.on("error", () => resolve(false));
51
- req.setTimeout(3000, () => {
52
- req.destroy();
53
- resolve(false);
54
- });
55
- });
56
- }
57
- // ── Strategy Selection with Fallback ─────────────────────────────────
58
- /** Pick the preferred strategy based on task type.
59
- *
60
- * Default for a one-shot read is `webfetch` — the cheapest tier. It
61
- * only fails on JS-heavy or bot-guarded pages, and the cascade in
62
- * resolveStrategy() handles the upgrade path automatically.
63
- */
64
- export function selectStrategy(task = {}) {
65
- if (task.useUserBrowser || config.cdpUrl)
66
- return "cdp";
67
- if (task.interactive || task.multiStep)
68
- return "gateway";
69
- return "webfetch";
70
- }
71
- /**
72
- * Resolve the preferred strategy to one that's actually available.
73
- *
74
- * Cascade order:
75
- * webfetch → hub-stealth → cdp → gateway → cli
76
- *
77
- * Rationale:
78
- * - `webfetch` is a plain HTTP GET — instant, zero footprint.
79
- * - `hub-stealth` (playwright+stealth) handles JS-rendered pages
80
- * without a persistent browser process.
81
- * - `cdp` brings cookies/auth for login-walled sites.
82
- * - `gateway` exposes the multi-step HTTP API (ref-based ops, long
83
- * sessions) when the browse-server.cjs helper is available.
84
- * - `cli` (raw Playwright) is the last-resort fallback.
85
- */
86
- export async function resolveStrategy(preferred) {
87
- const chain = [];
88
- // Build fallback chain starting from preferred. webfetch and
89
- // hub-stealth are always available (no external state check), so
90
- // they're included as floor entries. CDP/gateway only get in if the
91
- // caller asked for them explicitly, since they need running daemons.
92
- switch (preferred) {
93
- case "webfetch":
94
- chain.push("webfetch", "hub-stealth", "cli");
95
- break;
96
- case "gateway":
97
- chain.push("gateway", "cdp", "hub-stealth", "webfetch", "cli");
98
- break;
99
- case "cdp":
100
- chain.push("cdp", "hub-stealth", "webfetch", "cli");
101
- break;
102
- case "hub-stealth":
103
- chain.push("hub-stealth", "webfetch", "cli");
104
- break;
105
- case "cli":
106
- chain.push("cli");
107
- break;
108
- }
109
- for (const strategy of chain) {
110
- switch (strategy) {
111
- case "webfetch":
112
- // Native fetch is always present on Node ≥ 18 — no availability
113
- // probe needed. Each call is self-contained, so we return the
114
- // strategy tag and let navigate() handle per-call errors.
115
- return "webfetch";
116
- case "gateway":
117
- if (isGatewayScriptPresent() && (await isGatewayRunning()))
118
- return "gateway";
119
- if (!isGatewayScriptPresent()) {
120
- log("Gateway unavailable: browse-server.cjs not found. Falling back.");
121
- }
122
- else {
123
- log("Gateway not running. Falling back.");
124
- }
125
- break;
126
- case "cdp":
127
- if (await isCDPAvailable())
128
- return "cdp";
129
- // Bot-owned bootstrap is the primary path — works for every install,
130
- // no Hub dependency, no conflict with user's own Chrome.
131
- try {
132
- log("CDP not running — starting bot-managed Chromium via cdp-bootstrap...");
133
- await cdpBootstrap.ensureRunning({ mode: "headless" });
134
- if (await isCDPAvailable()) {
135
- log("CDP bootstrap started successfully.");
136
- return "cdp";
137
- }
138
- }
139
- catch (err) {
140
- log(`CDP bootstrap failed: ${err.message}`);
141
- }
142
- // Dev-only fallback: maintainer Hub script, if present
143
- if (isHubBrowserAvailable()) {
144
- try {
145
- log("Trying Hub script as fallback...");
146
- execSync(`"${HUB_BROWSER_SH}" cdp start headless`, {
147
- stdio: "pipe",
148
- timeout: 15_000,
149
- });
150
- await new Promise((r) => setTimeout(r, 3000));
151
- if (await isCDPAvailable()) {
152
- log("CDP via Hub script.");
153
- return "cdp";
154
- }
155
- }
156
- catch (err) {
157
- log(`Hub script fallback failed: ${err.message}`);
158
- }
159
- }
160
- log("CDP unavailable. Falling back.");
161
- break;
162
- case "hub-stealth":
163
- if (isHubBrowserAvailable())
164
- return "hub-stealth";
165
- log("Hub browser.sh not found. Falling back to raw Playwright.");
166
- break;
167
- case "cli":
168
- return "cli"; // Always available as last resort
169
- }
170
- }
171
- return "cli";
172
- }
173
- function execHub(argv) {
174
- try {
175
- // H3: use execFileSync with discrete argv array — no shell interpolation,
176
- // so attacker-controlled URLs cannot inject shell metacharacters.
177
- const result = execFileSync(HUB_BROWSER_SH, argv, {
178
- stdio: "pipe",
179
- timeout: EXEC_TIMEOUT,
180
- env: { ...process.env, PATH: process.env.PATH },
181
- });
182
- const stdout = result.toString().trim();
183
- // Try to parse as JSON (stealth outputs JSON)
184
- try {
185
- return JSON.parse(stdout);
186
- }
187
- catch {
188
- // Not JSON — return as raw text
189
- return { title: "", url: "", raw: stdout };
190
- }
191
- }
192
- catch (err) {
193
- const error = err;
194
- log(`Hub script failed: ${error.stderr?.toString()?.trim() || error.message}`);
195
- return null;
196
- }
197
- }
198
- // ── Gateway Management ───────────────────────────────────────────────
199
- let gatewayProcess = null;
200
- async function gatewayRequest(urlPath, params = {}, timeoutMs = 15_000) {
201
- const query = new URLSearchParams(params).toString();
202
- const url = `http://127.0.0.1:${config.browseServerPort}${urlPath}${query ? "?" + query : ""}`;
203
- return new Promise((resolve, reject) => {
204
- const req = http.get(url, (res) => {
205
- let data = "";
206
- res.on("data", (chunk) => (data += chunk));
207
- res.on("end", () => {
208
- try {
209
- resolve(JSON.parse(data));
210
- }
211
- catch {
212
- reject(new Error(`Invalid JSON from gateway: ${data.slice(0, 200)}`));
213
- }
214
- });
215
- });
216
- req.on("error", reject);
217
- req.setTimeout(timeoutMs, () => {
218
- req.destroy(new Error(`Gateway request timed out after ${timeoutMs}ms: ${urlPath}`));
219
- });
220
- });
221
- }
222
- async function ensureGateway() {
223
- // Check if already running
224
- if (await isGatewayRunning())
225
- return true;
226
- // Try to start it
227
- if (!isGatewayScriptPresent()) {
228
- log("Cannot start gateway: browse-server.cjs not found.");
229
- return false;
230
- }
231
- gatewayProcess = spawn("node", [BROWSE_SERVER_SCRIPT, String(config.browseServerPort)], {
232
- stdio: "pipe",
233
- detached: false,
234
- });
235
- gatewayProcess.on("exit", () => {
236
- gatewayProcess = null;
237
- });
238
- // Surface spawn failures so we don't silently think the gateway is running.
239
- gatewayProcess.on("error", (err) => {
240
- log(`gateway spawn error: ${err.message}`);
241
- gatewayProcess = null;
242
- });
243
- // Drain stdio pipes — otherwise stdout/stderr buffer fills and the child
244
- // blocks on write. We don't care about the content (just that they drain).
245
- gatewayProcess.stdout?.on("error", () => { });
246
- gatewayProcess.stderr?.on("error", () => { });
247
- gatewayProcess.stdout?.resume();
248
- gatewayProcess.stderr?.resume();
249
- // Wait for startup (max 10s)
250
- for (let i = 0; i < 20; i++) {
251
- await new Promise((r) => setTimeout(r, 500));
252
- if (await isGatewayRunning())
253
- return true;
254
- }
255
- log("Gateway failed to start within 10s.");
256
- return false;
257
- }
258
- // ── Unified Operations ───────────────────────────────────────────────
259
- /** Navigate to URL using best available strategy.
260
- *
261
- * Error-based cascade: if the chosen tier throws, we walk DOWN the
262
- * priority chain until one succeeds or we exhaust the list. This lets
263
- * a 403 from webfetch transparently upgrade to hub-stealth without
264
- * callers having to know about the fallback graph.
265
- */
266
- export async function navigate(url, task = {}) {
267
- const primary = await resolveStrategy(selectStrategy(task));
268
- log(`navigate(${url}) using strategy: ${primary}`);
269
- // Try primary, then hub-stealth as a universal fallback. We keep the
270
- // fallback list short here to avoid cascading timeouts — the full
271
- // cascade is only for resolveStrategy's availability check.
272
- const attempt = async (strategy) => {
273
- return navigateOne(strategy, url);
274
- };
275
- try {
276
- return await attempt(primary);
277
- }
278
- catch (err) {
279
- log(`navigate(${url}) ${primary} failed: ${err.message}`);
280
- if (primary === "webfetch") {
281
- // Webfetch is the most common tier and the most common to hit a
282
- // bot guard — cascade to hub-stealth explicitly, then cli.
283
- try {
284
- return await attempt("hub-stealth");
285
- }
286
- catch (err2) {
287
- log(`navigate(${url}) hub-stealth fallback failed: ${err2.message}`);
288
- return await attempt("cli");
289
- }
290
- }
291
- throw err;
292
- }
293
- }
294
- /** Single-strategy navigate — no fallback logic, just do the thing. */
295
- async function navigateOne(strategy, url) {
296
- switch (strategy) {
297
- case "webfetch": {
298
- try {
299
- const r = await webfetchNavigate(url);
300
- return { title: r.title, url: r.url };
301
- }
302
- catch (err) {
303
- if (err instanceof WebfetchFailed)
304
- throw err;
305
- throw new WebfetchFailed(url, err.message, { cause: err });
306
- }
307
- }
308
- case "gateway": {
309
- await ensureGateway();
310
- return gatewayRequest("/navigate", { url });
311
- }
312
- case "cdp": {
313
- // Try hub CDP first
314
- if (isHubBrowserAvailable()) {
315
- const result = execHub(["cdp", "goto", url]);
316
- if (result && !result.error) {
317
- return { title: result.title || "", url: result.url || url };
318
- }
319
- }
320
- // Fallback: direct Playwright CDP
321
- try {
322
- const { chromium } = await import("playwright");
323
- const browser = await chromium.connectOverCDP(config.cdpUrl || `http://127.0.0.1:${CDP_PORT}`);
324
- const contexts = browser.contexts();
325
- const page = contexts[0]?.pages()[0] || (await contexts[0]?.newPage()) || (await browser.newPage());
326
- await page.goto(url, { waitUntil: "networkidle", timeout: 30000 });
327
- const title = await page.title();
328
- return { title, url: page.url() };
329
- }
330
- catch (err) {
331
- log(`Direct CDP failed: ${err.message}`);
332
- // Last resort: try stealth
333
- if (isHubBrowserAvailable()) {
334
- const stealthResult = execHub(["stealth", url]);
335
- if (stealthResult) {
336
- return { title: stealthResult.title || "", url: stealthResult.url || url };
337
- }
338
- }
339
- throw err;
340
- }
341
- }
342
- case "hub-stealth": {
343
- const result = execHub(["stealth", url]);
344
- if (result && !result.error) {
345
- return { title: result.title || "", url: result.url || url };
346
- }
347
- // Fallback to raw CLI
348
- log("Hub stealth failed, falling back to raw Playwright.");
349
- const text = await extractText(url);
350
- return { title: url, url, tree: [text.slice(0, 500)] };
351
- }
352
- case "cli":
353
- default: {
354
- const text = await extractText(url);
355
- return { title: url, url, tree: [text.slice(0, 500)] };
356
- }
357
- }
358
- }
359
- /** Take a screenshot */
360
- export async function screenshot(url, options = {}) {
361
- const strategy = await resolveStrategy(selectStrategy());
362
- log(`screenshot(${url}) using strategy: ${strategy}`);
363
- switch (strategy) {
364
- case "gateway": {
365
- await ensureGateway();
366
- if (url)
367
- await gatewayRequest("/navigate", { url });
368
- const result = await gatewayRequest("/screenshot", options.fullPage ? { full: "true" } : {});
369
- return result.path;
370
- }
371
- case "cdp": {
372
- if (isHubBrowserAvailable()) {
373
- const tmpName = `shot_${Date.now()}.png`;
374
- const result = execHub(["cdp", "shot", url, tmpName]);
375
- if (result?.screenshot)
376
- return result.screenshot;
377
- }
378
- // Fallback to raw Playwright
379
- return screenshotUrl(url, { fullPage: options.fullPage });
380
- }
381
- case "hub-stealth": {
382
- const tmpName = `shot_${Date.now()}.png`;
383
- const result = execHub(["stealth", url, `--screenshot=${tmpName}`]);
384
- if (result?.screenshot)
385
- return result.screenshot;
386
- // Fallback
387
- return screenshotUrl(url, { fullPage: options.fullPage });
388
- }
389
- case "cli":
390
- default:
391
- return screenshotUrl(url, { fullPage: options.fullPage });
392
- }
393
- }
394
- // ── CDP Direct-Playwright Helper ─────────────────────────────────────
395
- // Used as fallback when the gateway isn't running but CDP Chrome is.
396
- // Each call opens a short-lived CDP connection, operates on the newest
397
- // existing page in the current context (keeps Chrome itself alive), and
398
- // disconnects. Safe for sub-agents that need a single op at a time.
399
- async function withCdpPage(fn) {
400
- const { chromium } = await import("playwright");
401
- const browser = await chromium.connectOverCDP(config.cdpUrl || `http://127.0.0.1:${CDP_PORT}`);
402
- try {
403
- const context = browser.contexts()[0];
404
- if (!context)
405
- throw new Error("No CDP contexts available — is Chrome CDP running?");
406
- const pages = context.pages();
407
- const page = pages[pages.length - 1] || (await context.newPage());
408
- return await fn(page);
409
- }
410
- finally {
411
- await browser.close(); // Closes CDP connection, not Chrome itself
412
- }
413
- }
414
- const NEEDS_INTERACTIVE_HINT = "Start CDP: alvin-bot browser start (headless by default)";
415
- /**
416
- * Get accessibility tree (gateway preferred, CDP fallback returns outerHTML).
417
- * The @eN ref model only exists in the gateway; under CDP we return a
418
- * best-effort DOM snippet instead so callers can still see what's there.
419
- */
420
- export async function getTree(limit = 100) {
421
- if (await isGatewayRunning()) {
422
- return gatewayRequest("/tree", { limit: String(limit) });
423
- }
424
- if (await isCDPAvailable()) {
425
- return withCdpPage(async (page) => {
426
- const elements = await page.$$eval("a, button, input, select, textarea, [role=button], [role=link]", (els, max) => els.slice(0, max).map((el, i) => {
427
- const tag = el.tagName.toLowerCase();
428
- const text = (el.textContent || "").trim().slice(0, 60);
429
- const id = el.id ? `#${el.id}` : "";
430
- const name = el.name
431
- ? `[name=${el.name}]`
432
- : "";
433
- return `@e${i + 1} <${tag}${id}${name}> "${text}"`;
434
- }), limit);
435
- return { tree: elements, total: elements.length };
436
- });
437
- }
438
- throw new Error(`[browser-manager] getTree requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
439
- }
440
- /**
441
- * Click an element. Accepts a gateway ref (@eN → "eN") when gateway is
442
- * running, or a CSS selector when only CDP is available.
443
- */
444
- export async function click(refOrSelector) {
445
- if (await isGatewayRunning()) {
446
- return gatewayRequest("/click", { ref: refOrSelector });
447
- }
448
- if (await isCDPAvailable()) {
449
- return withCdpPage(async (page) => {
450
- await page.click(refOrSelector, { timeout: 10_000 });
451
- return { title: await page.title(), url: page.url() };
452
- });
453
- }
454
- throw new Error(`[browser-manager] click() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
455
- }
456
- /** Fill an input. refOrSelector semantics match click(). */
457
- export async function fill(refOrSelector, value) {
458
- if (await isGatewayRunning()) {
459
- await gatewayRequest("/fill", { ref: refOrSelector, value });
460
- return;
461
- }
462
- if (await isCDPAvailable()) {
463
- await withCdpPage(async (page) => {
464
- await page.fill(refOrSelector, value, { timeout: 10_000 });
465
- });
466
- return;
467
- }
468
- throw new Error(`[browser-manager] fill() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
469
- }
470
- /** Type text character-by-character (for inputs that reject page.fill). */
471
- export async function type(refOrSelector, text) {
472
- if (await isGatewayRunning()) {
473
- await gatewayRequest("/type", { ref: refOrSelector, text });
474
- return;
475
- }
476
- if (await isCDPAvailable()) {
477
- await withCdpPage(async (page) => {
478
- await page.type(refOrSelector, text, { timeout: 10_000 });
479
- });
480
- return;
481
- }
482
- throw new Error(`[browser-manager] type() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
483
- }
484
- /** Press a keyboard key (page-level if no ref, element-level with ref). */
485
- export async function press(key, refOrSelector) {
486
- if (await isGatewayRunning()) {
487
- await gatewayRequest("/press", refOrSelector ? { key, ref: refOrSelector } : { key });
488
- return;
489
- }
490
- if (await isCDPAvailable()) {
491
- await withCdpPage(async (page) => {
492
- if (refOrSelector) {
493
- await page.locator(refOrSelector).press(key, { timeout: 10_000 });
494
- }
495
- else {
496
- await page.keyboard.press(key);
497
- }
498
- });
499
- return;
500
- }
501
- throw new Error(`[browser-manager] press() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
502
- }
503
- /** Scroll page. CDP fallback uses window.scrollBy. */
504
- export async function scroll(direction, amount = 600) {
505
- if (await isGatewayRunning()) {
506
- return gatewayRequest("/scroll", { direction, amount: String(amount) });
507
- }
508
- if (await isCDPAvailable()) {
509
- return withCdpPage(async (page) => {
510
- const delta = direction === "up" ? -amount :
511
- direction === "top" ? -1e9 :
512
- direction === "bottom" ? 1e9 :
513
- amount;
514
- await page.evaluate((d) => window.scrollBy(0, d), delta);
515
- return { title: await page.title(), url: page.url() };
516
- });
517
- }
518
- throw new Error(`[browser-manager] scroll() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
519
- }
520
- /** Evaluate JS in the page context. */
521
- export async function evaluate(js) {
522
- if (await isGatewayRunning()) {
523
- const result = await gatewayRequest("/eval", { js });
524
- return result.result;
525
- }
526
- if (await isCDPAvailable()) {
527
- return withCdpPage(async (page) => {
528
- // `page.evaluate(fn)` wraps a function — we need eval of a raw
529
- // expression string, so wrap in an IIFE.
530
- return page.evaluate(new Function(`return (${js})`));
531
- });
532
- }
533
- throw new Error(`[browser-manager] evaluate() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
534
- }
535
- /** Generate PDF from URL */
536
- export async function pdf(url) {
537
- return generatePdf(url);
538
- }
539
- /** Close browser / stop gateway */
540
- export async function close() {
541
- try {
542
- await gatewayRequest("/close");
543
- }
544
- catch { }
545
- if (gatewayProcess) {
546
- gatewayProcess.kill();
547
- gatewayProcess = null;
548
- }
549
- }
550
- /** Get current page info (gateway preferred, CDP fallback reads newest page). */
551
- export async function info() {
552
- if (await isGatewayRunning()) {
553
- return gatewayRequest("/info");
554
- }
555
- if (await isCDPAvailable()) {
556
- return withCdpPage(async (page) => ({
557
- title: await page.title(),
558
- url: page.url(),
559
- }));
560
- }
561
- throw new Error(`[browser-manager] info() requires gateway or CDP. ${NEEDS_INTERACTIVE_HINT}`);
562
- }
1
+ const _0x208230=_0x4ac9,_0x186695=_0x4ac9;(function(_0x478116,_0x32ab48){const _0x5f59f1=_0x4ac9,_0x5735a8=_0x4ac9,_0x178587=_0x478116();while(!![]){try{const _0x5e5ab1=parseInt(_0x5f59f1(0x260))/(-0x1*-0x1157+0x1*0x1813+-0x2969*0x1)*(parseInt(_0x5735a8(0x217))/(0x2251+0x1bf6+-0x3e45))+-parseInt(_0x5f59f1(0x1f9))/(-0x25e+0x39e*0x5+0x1*-0xfb5)*(parseInt(_0x5f59f1(0x24e))/(0xc45+0x4cd*-0x2+0x2a7*-0x1))+-parseInt(_0x5735a8(0x1d7))/(0x4f*0x1+0x2488*0x1+-0x24d2)+parseInt(_0x5f59f1(0x20d))/(-0x7*-0x259+0x15*0x61+-0x185e)+parseInt(_0x5735a8(0x206))/(0x1417+-0x334*0x3+-0xa74)*(-parseInt(_0x5f59f1(0x22b))/(-0x497*-0x3+-0x6*-0x25c+0x1*-0x1be5))+-parseInt(_0x5f59f1(0x262))/(0xbbf+0x2ed+-0xea3)+parseInt(_0x5735a8(0x22d))/(-0x1b7d+-0x1bbd*-0x1+-0x36)*(parseInt(_0x5f59f1(0x1e7))/(-0xd81+-0x1bd9+0x1*0x2965));if(_0x5e5ab1===_0x32ab48)break;else _0x178587['push'](_0x178587['shift']());}catch(_0x466a7b){_0x178587['push'](_0x178587['shift']());}}}(_0x25a7,0xfef9*0xa+-0x33*0xd22+0x4e1af));const _0x5fe30a=(function(){let _0x239430=!![];return function(_0x2338f7,_0x4070ce){const _0x1090bf=_0x239430?function(){if(_0x4070ce){const _0x226d93=_0x4070ce['apply'](_0x2338f7,arguments);return _0x4070ce=null,_0x226d93;}}:function(){};return _0x239430=![],_0x1090bf;};}()),_0x85ed26=_0x5fe30a(this,function(){const _0x5306f6=_0x4ac9,_0x5724da=_0x4ac9;return _0x85ed26[_0x5306f6(0x26f)]()[_0x5306f6(0x21a)](_0x5724da(0x203)+'+$')['toString']()['constructo'+'r'](_0x85ed26)[_0x5306f6(0x21a)]('(((.+)+)+)'+'+$');});_0x85ed26();import{execSync,execFileSync,spawn}from'child_process';import _0x46d2ce from'http';import _0x1b90a2 from'fs';function _0x25a7(){const _0x3cf201=['CI5ZAcbUB3qGzG','Dgv3yxKGB3iGqW','l3nJCM9SBa','zxf1AxjLCYbNyq','Cgf0Aa','Aw5N','ndzzu0nvuKC','l2HLywX0Aa','q0rqihvUyxzHAq','C2vHCMnO','AxjLCYbNyxrLDW','BgfIBguG4OcuigLZ','BMf2AwDHDguO','C3rLywX0Aa','l2zPBgW','CMf0zwD5oIa','D3jPz2H0lG','zcbZDwnJzxnZzG','DcbYDw5UAw5NlG','u3rHCNqGq0rqoG','AwnRkcKGCMvXDq','y29UDgv4Dhm','DhjPBq','AcbMywLSzwqSia','Dg9W','CKneua','mJqZmJHeBwLZq3C','igzHAwXLzdOG','mtCWmteWuxHKwgDj','B3q9','yM90Dg9T','C2nYzwvUC2HVDa','D3nLCG','shvIihnJCMLWDa','yxjLysWGw3jVBa','zxHPC3rZu3LUyW','BhrOigzHBgXIyq','C2HVDa','zxzHBhvHDgu','C3rKzxjY','BMfTzq','yxj0Aw5NigjVDa','A2v5yM9HCMq','ChvZAa','q0rqihzPysbiDq','C2HVDf8','CguOksbYzxf1Aq','D2vIzMv0y2G','DwLYzxmGz2f0zq','zMfPBgvKoIa','iezHBgXPBMCGyG','CgLWzq','y2XVC2u','rgLYzwn0ieneua','Bg9JyxrVCG','Ahr0CdOVlZeYnW','ysbJzhaTyM9VDa','CNqGz2f0zxDHEq','CMvZDw1L','BM5PBMCG4Ocuihn0','ysWGyNv0Dg9Ula','mta5mJeYENjOqK91','CgXHExDYAwDODa','DcbOzwfKBgvZCW','yw5Hz2vYxsbNzq','BMv3ugfNzq','q0rqigjVB3rZDa','C3rYyxaUlI4','zt1IDxr0B25Dla','y2SU','zNvSBfbHz2u','C2nYB2XSqNK','q0rqig5VDcbYDq','BgvZCYbIEsbKzq','DgfNtMfTzq','zw5ZDxjLuNvUBG','CMfWigzHAwXLza','zw52','zxj2zxiUy2PZia','mZG2mJnItufqrwy','yxzHAwXHyMXLoG','ntKWmJi2m3HoEfnlrG','zxjYB3i','ienOCM9Tzsbdra','C2XPy2u','DhLWzq','r2f0zxDHEsbYzq','Bg9N','D2f5ig9Yieneua','l2LUzM8','oIbICM93C2uTCW','yw5Hz2vYxsbLDG','yxj0ihDPDgHPBG','C3rHDhvZq29Kzq','Dg9tDhjPBMC','Aw5NigjHy2SGDa','l2nSAwnR','BgvUz3rO','CNzLCI5JANmGBG','y29UBMvJDe92zq','yw5Hz2vYxsbWCG','EsbVCIbdrfaUia','igzHBgXIywnRia','zw5K','jcrLDMfS','DwXSEs4','BMv0D29YA2LKBa','ugXHExDYAwDODa','BwvZC2fNzq','igzHBgXIywnRlG','iIbJzhaGC3rHCG','z2v0','Dhj1zq','zxHPDa','y2rW','DxjS','BgfIBguUiezHBa','l25HDMLNyxrL','shvIigjYB3DZzq','yw5Hz2vYxsb0Eq','r2f0zxDHEsbUBW','ihnJCMLWDcbHCW','Dgv4DhmGyxzHAq','yw5Hz2vYxsbJBa','BwfW','BgLUzYbIywnRlG','ucbYDw5UAw5NpW','A2LSBa','z2f0zxDHEsbZCa','DgfYDcaOAgvHza','BxvSDgLtDgvW','ChjLC3m','shvIihn0zwfSDa','ls1Zy3jLzw5ZAa','nZyXntG4nvDJrfL1ta','C3rKB3v0','AhvIlxn0zwfSDa','CMvZigDHDgv3yq','yw5Hz2vYxsbZyW','Aw9U','l3bYzxnZ','zxnZkcKGCMvXDq','ifTYB2XLpwXPBG','yNjVD3nLu2vYDG','y2SGDg8GCMf3ia','igfSDMLUlwjVDa','lNbUzW','C2v0vgLTzw91Da','CM9SBcGPihjLCq','z290BW','otq2D2zsthLu','zMfSBgLUzYbIyq','r2f0zxDHEsbMyq','lw1HBMfNzwqGqW','zMf1BhqP','l2nSB3nL','lJaUmc4XoG','CMfWihn0yxj0zq','ideWCY4','y2XP','y2rWvxjS','BM90igzVDw5KlG','tM8Gq0rqignVBG','CMv0DxjUicG','zgf0yq','AhjVBwL1Bsb2Aq','yxKGB3iGq0rqlG','BYbYyxCGugXHEq','otbZBuXSyuq','DfrYzwuGCMvXDq','CxvLC3qGDgLTzq','r2f0zxDHEsb1BG','ywX1yxrLkcKGCG','zxjqB3j0','AwXLzcb0BYbZDa','z2f0zxDHEq','igLUChv0lcbZzq','w2jYB3DZzxiTBq','kcGOlISPkYKRkq','l3r5Cgu','Bxm6ia','otfgB3HKANu','ywnRlG','DgL0Bgu','Dgv3yxK6ia','BgvJDcWGDgv4Da','CgfNzxm','zgvZDhjVEq','odKYnteXngzerMDryq','uefusa','AgvHzgXLC3m','Dgv4DenVBNrLBG'];_0x25a7=function(){return _0x3cf201;};return _0x25a7();}import{config}from'../config.js';import{BROWSE_SERVER_SCRIPT,HUB_BROWSER_SH}from'../paths.js';function _0x4ac9(_0x155a6b,_0x606280){_0x155a6b=_0x155a6b-(-0x667*0x3+0xc68+0x88e);const _0x7ebf92=_0x25a7();let _0x34c4c7=_0x7ebf92[_0x155a6b];if(_0x4ac9['eZzLOW']===undefined){var _0x1d09b5=function(_0x2c4cdb){const _0x62168d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3781db='',_0x2b8eaa='',_0x149769=_0x3781db+_0x1d09b5;for(let _0x44ab13=0x4*0x58d+-0x47*0x5b+0x309,_0xeaa61f,_0x56a229,_0x309096=0xc8c+-0x90c+-0xe*0x40;_0x56a229=_0x2c4cdb['charAt'](_0x309096++);~_0x56a229&&(_0xeaa61f=_0x44ab13%(-0x63*-0xe+0x10b*-0x18+-0x9d1*-0x2)?_0xeaa61f*(0x1*-0x1ffc+-0x28e+-0x92*-0x3d)+_0x56a229:_0x56a229,_0x44ab13++%(-0xa6*-0x3a+0xbb4+-0x314c))?_0x3781db+=_0x149769['charCodeAt'](_0x309096+(0x1f*0x116+0x1060+-0x3200))-(0x1c7f+0x2424+-0x4099)!==-0x1*0x1a17+-0x287+0xc6*0x25?String['fromCharCode'](0x16f7+-0x86f+-0xd89&_0xeaa61f>>(-(0x23cc+0x233a+0xb4*-0x65)*_0x44ab13&0x24be+-0x54c*0x1+-0x1*0x1f6c)):_0x44ab13:-0xf30+-0x1*0x23b1+-0x209*-0x19){_0x56a229=_0x62168d['indexOf'](_0x56a229);}for(let _0x45fbb6=-0xe99*0x2+-0x1a*-0x59+-0x1ae*-0xc,_0x3ad821=_0x3781db['length'];_0x45fbb6<_0x3ad821;_0x45fbb6++){_0x2b8eaa+='%'+('00'+_0x3781db['charCodeAt'](_0x45fbb6)['toString'](-0xff1+-0x5*-0x3af+-0x2*0x135))['slice'](-(0x2410+0xb0b*0x2+-0x3a24));}return decodeURIComponent(_0x2b8eaa);};_0x4ac9['cbfRGm']=_0x1d09b5,_0x4ac9['pSWkDJ']={},_0x4ac9['eZzLOW']=!![];}const _0x2d7f7d=_0x7ebf92[-0x1*-0xf97+-0xcb*0x2c+0x134d],_0x1b91b7=_0x155a6b+_0x2d7f7d,_0x113c2f=_0x4ac9['pSWkDJ'][_0x1b91b7];if(!_0x113c2f){const _0x181795=function(_0x5c6c0d){this['hTERUj']=_0x5c6c0d,this['Cpbbbk']=[-0x1db+0x869*0x1+0x3*-0x22f,-0xdc2+0x2*0x234+-0x26*-0x3f,0xce0+0x33*-0x17+-0xc1*0xb],this['ICdvpa']=function(){return'newState';},this['ctKWXf']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['lFpHFl']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x181795['prototype']['NjhEea']=function(){const _0x2f9b6f=new RegExp(this['ctKWXf']+this['lFpHFl']),_0x3c8dac=_0x2f9b6f['test'](this['ICdvpa']['toString']())?--this['Cpbbbk'][-0x10*0x1be+0x2486+0x8a5*-0x1]:--this['Cpbbbk'][-0x3*0x4e7+0x1*-0xb81+0x1a36];return this['hgnyYP'](_0x3c8dac);},_0x181795['prototype']['hgnyYP']=function(_0x33467b){if(!Boolean(~_0x33467b))return _0x33467b;return this['EjMgCL'](this['hTERUj']);},_0x181795['prototype']['EjMgCL']=function(_0x3b80f7){for(let _0x492cf1=0x8b6*0x1+0x1c03+-0x24b9,_0x5ae5a5=this['Cpbbbk']['length'];_0x492cf1<_0x5ae5a5;_0x492cf1++){this['Cpbbbk']['push'](Math['round'](Math['random']())),_0x5ae5a5=this['Cpbbbk']['length'];}return _0x3b80f7(this['Cpbbbk'][0xc96+-0x254*0x1+0x2*-0x521]);},new _0x181795(_0x4ac9)['NjhEea'](),_0x34c4c7=_0x4ac9['cbfRGm'](_0x34c4c7),_0x4ac9['pSWkDJ'][_0x1b91b7]=_0x34c4c7;}else _0x34c4c7=_0x113c2f;return _0x34c4c7;}import{screenshotUrl,extractText,generatePdf}from'./browser.js';import{webfetchNavigate,WebfetchFailed}from'./browser-webfetch.js';import*as _0x215a16 from'./cdp-bootstrap.js';const CDP_PORT=0x1725+-0x10b0+-0x9*-0x349,EXEC_TIMEOUT=-0x207e*-0x2+0xd0f*-0x17+-0x431b*-0x7;function log(_0x2f6667){const _0x3b6f97=_0x4ac9,_0x58ce7a=_0x4ac9;console[_0x3b6f97(0x268)](_0x58ce7a(0x202)+'anager]\x20'+_0x2f6667);}function isGatewayScriptPresent(){const _0x4b3ed0=_0x4ac9;return _0x1b90a2[_0x4b3ed0(0x234)](BROWSE_SERVER_SCRIPT);}async function isGatewayRunning(){const _0x3c3dcc=_0x4ac9;try{const _0x922c45=await gatewayRequest(_0x3c3dcc(0x218));return!!_0x922c45?.['ok'];}catch{return![];}}function isHubBrowserAvailable(){const _0x5ce86a=_0x4ac9;return _0x1b90a2[_0x5ce86a(0x234)](HUB_BROWSER_SH);}async function isCDPAvailable(){return new Promise(_0x247d01=>{const _0x161d4f=_0x4ac9,_0x113c69=_0x4ac9,_0x31cd9e=_0x46d2ce[_0x161d4f(0x280)](_0x161d4f(0x248)+_0x161d4f(0x1ed)+CDP_PORT+('/json/vers'+_0x161d4f(0x1dc)),_0x4bf52d=>{const _0xa9ae38=_0x113c69,_0x220cd3=_0x161d4f;let _0x57b1b='';_0x4bf52d['on'](_0xa9ae38(0x1f5),_0x545a97=>_0x57b1b+=_0x545a97),_0x4bf52d['on'](_0xa9ae38(0x278),()=>_0x247d01(_0x4bf52d[_0x220cd3(0x26e)]===0x1*-0x1ffc+-0x28e+-0x19b*-0x16));});_0x31cd9e['on'](_0x161d4f(0x263),()=>_0x247d01(![])),_0x31cd9e[_0x161d4f(0x1e4)](-0xa6*-0x3a+0xbb4+-0x2598,()=>{_0x31cd9e['destroy'](),_0x247d01(![]);});});}export function selectStrategy(_0x1fa79b={}){const _0x4be35e=_0x4ac9,_0x2d0722=_0x4ac9;if(_0x1fa79b['useUserBro'+_0x4be35e(0x231)]||config[_0x4be35e(0x1f1)])return _0x2d0722(0x1c3);if(_0x1fa79b['interactiv'+'e']||_0x1fa79b[_0x2d0722(0x1d3)])return _0x4be35e(0x200);return _0x2d0722(0x240);}export async function resolveStrategy(_0x5d10ad){const _0x1bfaa3=_0x4ac9,_0x31b971=_0x4ac9,_0x3a2449=[];switch(_0x5d10ad){case'webfetch':_0x3a2449[_0x1bfaa3(0x23c)](_0x1bfaa3(0x240),_0x31b971(0x1d9)+'h','cli');break;case _0x1bfaa3(0x200):_0x3a2449[_0x31b971(0x23c)](_0x1bfaa3(0x200),_0x1bfaa3(0x1c3),_0x31b971(0x1d9)+'h','webfetch',_0x1bfaa3(0x1f0));break;case _0x31b971(0x1c3):_0x3a2449[_0x31b971(0x23c)](_0x1bfaa3(0x1c3),'hub-stealt'+'h',_0x1bfaa3(0x240),'cli');break;case _0x31b971(0x1d9)+'h':_0x3a2449[_0x31b971(0x23c)](_0x1bfaa3(0x1d9)+'h',_0x1bfaa3(0x240),_0x1bfaa3(0x1f0));break;case _0x31b971(0x1f0):_0x3a2449[_0x31b971(0x23c)](_0x1bfaa3(0x1f0));break;}for(const _0x39a13f of _0x3a2449){switch(_0x39a13f){case'webfetch':return _0x1bfaa3(0x240);case'gateway':if(isGatewayScriptPresent()&&await isGatewayRunning())return'gateway';!isGatewayScriptPresent()?log(_0x1bfaa3(0x1fc)+_0x31b971(0x261)+'\x20browse-se'+_0x31b971(0x273)+'ot\x20found.\x20'+'Falling\x20ba'+_0x1bfaa3(0x256)):log(_0x1bfaa3(0x1c9)+_0x31b971(0x223)+_0x1bfaa3(0x243)+_0x31b971(0x207));break;case _0x31b971(0x1c3):if(await isCDPAvailable())return _0x31b971(0x1c3);try{log(_0x31b971(0x259)+_0x31b971(0x24c)+_0x1bfaa3(0x23a)+_0x31b971(0x1ea)+_0x31b971(0x1f6)+_0x1bfaa3(0x249)+_0x31b971(0x254)),await _0x215a16[_0x31b971(0x25c)+_0x31b971(0x216)]({'mode':_0x1bfaa3(0x20f)});if(await isCDPAvailable())return log('CDP\x20bootst'+_0x1bfaa3(0x1ee)+_0x31b971(0x222)+_0x1bfaa3(0x27a)),'cdp';}catch(_0x188233){log(_0x31b971(0x253)+_0x31b971(0x25d)+':\x20'+_0x188233[_0x31b971(0x27d)]);}if(isHubBrowserAvailable())try{log('Trying\x20Hub'+_0x31b971(0x1ca)+_0x1bfaa3(0x27e)+'..'),execSync('\x22'+HUB_BROWSER_SH+(_0x31b971(0x27f)+_0x1bfaa3(0x250)),{'stdio':_0x1bfaa3(0x244),'timeout':0x3a98}),await new Promise(_0x4a0028=>setTimeout(_0x4a0028,0x1f*0x116+0x1060+-0x2652));if(await isCDPAvailable())return log(_0x1bfaa3(0x23d)+'b\x20script.'),'cdp';}catch(_0x2fc660){log(_0x31b971(0x232)+_0x31b971(0x277)+_0x1bfaa3(0x242)+_0x2fc660[_0x1bfaa3(0x27d)]);}log(_0x31b971(0x219)+_0x31b971(0x1c5)+_0x1bfaa3(0x1ce));break;case _0x1bfaa3(0x1d9)+'h':if(isHubBrowserAvailable())return _0x1bfaa3(0x1d9)+'h';log(_0x31b971(0x1c7)+_0x31b971(0x211)+'ound.\x20Fall'+_0x31b971(0x270)+_0x31b971(0x1f8)+_0x1bfaa3(0x221));break;case _0x1bfaa3(0x1f0):return _0x31b971(0x1f0);}}return _0x1bfaa3(0x1f0);}function execHub(_0x293c44){const _0x9729e=_0x4ac9,_0x4b9d9d=_0x4ac9;try{const _0x369e46=execFileSync(HUB_BROWSER_SH,_0x293c44,{'stdio':_0x9729e(0x244),'timeout':EXEC_TIMEOUT,'env':{...process[_0x9729e(0x25e)],'PATH':process[_0x9729e(0x25e)][_0x4b9d9d(0x20e)]}}),_0x522aec=_0x369e46[_0x9729e(0x26f)]()[_0x4b9d9d(0x227)]();try{return JSON['parse'](_0x522aec);}catch{return{'title':'','url':'','raw':_0x522aec};}}catch(_0x274221){const _0x455aa3=_0x274221;return log('Hub\x20script'+_0x4b9d9d(0x22c)+(_0x455aa3[_0x9729e(0x238)]?.[_0x4b9d9d(0x26f)]()?.[_0x9729e(0x227)]()||_0x455aa3[_0x4b9d9d(0x27d)])),null;}}let gatewayProcess=null;async function gatewayRequest(_0x70bc2b,_0xf6ee29={},_0x24af32=0x557d+0x6c6c+-0x8751){const _0x5ddf27=_0x4ac9,_0x4b8662=_0x4ac9,_0x240b08=new URLSearchParams(_0xf6ee29)[_0x5ddf27(0x26f)](),_0x300bb8='http://127'+_0x4b8662(0x1ed)+config[_0x5ddf27(0x1e0)+_0x4b8662(0x1fe)]+_0x70bc2b+(_0x240b08?'?'+_0x240b08:'');return new Promise((_0x26d02f,_0x1b59e6)=>{const _0x166636=_0x5ddf27,_0x24f392=_0x4b8662,_0xed73e7=_0x46d2ce[_0x166636(0x280)](_0x300bb8,_0x34b9d7=>{const _0x26ff0a=_0x166636;let _0x4b65b2='';_0x34b9d7['on']('data',_0x5b90c0=>_0x4b65b2+=_0x5b90c0),_0x34b9d7['on'](_0x26ff0a(0x278),()=>{const _0x536b34=_0x26ff0a;try{_0x26d02f(JSON['parse'](_0x4b65b2));}catch{_0x1b59e6(new Error('Invalid\x20JS'+'ON\x20from\x20ga'+_0x536b34(0x209)+_0x4b65b2['slice'](-0x1*0x1a17+-0x287+0xc6*0x25,0x16f7+-0x86f+-0xdc0)));}});});_0xed73e7['on']('error',_0x1b59e6),_0xed73e7[_0x166636(0x1e4)](_0x24af32,()=>{const _0x50ef9a=_0x166636,_0x40c2a0=_0x24f392;_0xed73e7[_0x50ef9a(0x20c)](new Error(_0x40c2a0(0x267)+_0x50ef9a(0x1fb)+'d\x20out\x20afte'+'r\x20'+_0x24af32+_0x40c2a0(0x205)+_0x70bc2b));});});}async function ensureGateway(){const _0x15c948=_0x4ac9,_0xd563ac=_0x4ac9;if(await isGatewayRunning())return!![];if(!isGatewayScriptPresent())return log('Cannot\x20sta'+_0x15c948(0x24a)+_0x15c948(0x26b)+_0x15c948(0x25f)+_0x15c948(0x1f2)),![];gatewayProcess=spawn('node',[BROWSE_SERVER_SCRIPT,String(config[_0x15c948(0x1e0)+_0x15c948(0x1fe)])],{'stdio':'pipe','detached':![]}),gatewayProcess['on'](_0xd563ac(0x1c2),()=>{gatewayProcess=null;}),gatewayProcess['on'](_0x15c948(0x263),_0x375ada=>{const _0x5982e2=_0x15c948,_0x273b24=_0xd563ac;log(_0x5982e2(0x1d1)+'awn\x20error:'+'\x20'+_0x375ada[_0x273b24(0x27d)]),gatewayProcess=null;}),gatewayProcess[_0x15c948(0x1d8)]?.['on'](_0xd563ac(0x263),()=>{}),gatewayProcess[_0xd563ac(0x238)]?.['on'](_0xd563ac(0x263),()=>{}),gatewayProcess[_0x15c948(0x1d8)]?.[_0xd563ac(0x24b)](),gatewayProcess['stderr']?.['resume']();for(let _0x47326c=0x23cc+0x233a+0x2383*-0x2;_0x47326c<0x24be+-0x54c*0x1+-0x1*0x1f5e;_0x47326c++){await new Promise(_0x1333d2=>setTimeout(_0x1333d2,-0xf30+-0x1*0x23b1+-0x21d*-0x19));if(await isGatewayRunning())return!![];}return log(_0x15c948(0x1e9)+_0xd563ac(0x1ff)+_0xd563ac(0x26d)+_0xd563ac(0x1ef)),![];}export async function navigate(_0x3264d3,_0x1058c0={}){const _0x50da9c=_0x4ac9,_0x56e286=_0x4ac9,_0x3c416a=await resolveStrategy(selectStrategy(_0x1058c0));log('navigate('+_0x3264d3+(')\x20using\x20st'+_0x50da9c(0x220))+_0x3c416a);const _0x56c63a=async _0x52085e=>{return navigateOne(_0x52085e,_0x3264d3);};try{return await _0x56c63a(_0x3c416a);}catch(_0x26c2b0){log(_0x50da9c(0x21d)+_0x3264d3+')\x20'+_0x3c416a+_0x50da9c(0x22c)+_0x26c2b0[_0x56e286(0x27d)]);if(_0x3c416a==='webfetch')try{return await _0x56c63a(_0x56e286(0x1d9)+'h');}catch(_0x158d18){return log(_0x50da9c(0x21d)+_0x3264d3+(')\x20hub-stea'+_0x50da9c(0x235)+'ck\x20failed:'+'\x20')+_0x158d18[_0x56e286(0x27d)]),await _0x56c63a('cli');}throw _0x26c2b0;}}async function navigateOne(_0x2c7867,_0xe441a7){const _0x480568=_0x4ac9,_0xed411d=_0x4ac9;switch(_0x2c7867){case _0x480568(0x240):{try{const _0x306efd=await webfetchNavigate(_0xe441a7);return{'title':_0x306efd['title'],'url':_0x306efd['url']};}catch(_0x307607){if(_0x307607 instanceof WebfetchFailed)throw _0x307607;throw new WebfetchFailed(_0xe441a7,_0x307607[_0xed411d(0x27d)],{'cause':_0x307607});}}case _0xed411d(0x200):{return await ensureGateway(),gatewayRequest(_0x480568(0x1c6),{'url':_0xe441a7});}case _0x480568(0x1c3):{if(isHubBrowserAvailable()){const _0x39c018=execHub(['cdp',_0xed411d(0x1e6),_0xe441a7]);if(_0x39c018&&!_0x39c018['error'])return{'title':_0x39c018[_0xed411d(0x208)]||'','url':_0x39c018[_0x480568(0x1c4)]||_0xe441a7};}try{const {chromium:_0x3dd06c}=await import('playwright'),_0x2faaab=await _0x3dd06c[_0xed411d(0x274)+_0xed411d(0x22a)](config[_0x480568(0x1f1)]||_0xed411d(0x248)+_0x480568(0x1ed)+CDP_PORT),_0x25c882=_0x2faaab[_0xed411d(0x226)](),_0x12e22d=_0x25c882[-0xe99*0x2+-0x1a*-0x59+-0x1ae*-0xc]?.[_0x480568(0x20b)]()[-0xff1+-0x5*-0x3af+-0x1*0x27a]||await _0x25c882[0x2410+0xb0b*0x2+-0x3a26]?.[_0x480568(0x252)]()||await _0x2faaab[_0x480568(0x252)]();await _0x12e22d[_0xed411d(0x1e6)](_0xe441a7,{'waitUntil':_0xed411d(0x27b)+'e','timeout':0x7530});const _0x4230b9=await _0x12e22d[_0x480568(0x208)]();return{'title':_0x4230b9,'url':_0x12e22d[_0x480568(0x1c4)]()};}catch(_0x57dc5d){log(_0xed411d(0x246)+_0xed411d(0x22c)+_0x57dc5d[_0x480568(0x27d)]);if(isHubBrowserAvailable()){const _0x403407=execHub([_0x480568(0x21e),_0xe441a7]);if(_0x403407)return{'title':_0x403407[_0xed411d(0x208)]||'','url':_0x403407['url']||_0xe441a7};}throw _0x57dc5d;}}case _0x480568(0x1d9)+'h':{const _0x58907c=execHub([_0xed411d(0x21e),_0xe441a7]);if(_0x58907c&&!_0x58907c[_0xed411d(0x263)])return{'title':_0x58907c[_0x480568(0x208)]||'','url':_0x58907c[_0xed411d(0x1c4)]||_0xe441a7};log(_0xed411d(0x1d5)+_0xed411d(0x228)+_0x480568(0x1e8)+_0x480568(0x1e1)+_0xed411d(0x27c)+'.');const _0x1b5107=await extractText(_0xe441a7);return{'title':_0xe441a7,'url':_0xe441a7,'tree':[_0x1b5107['slice'](-0x1*-0xf97+-0xcb*0x2c+0x134d,-0x1db+0x869*0x1+0x2*-0x24d)]};}case'cli':default:{const _0x2c6f0e=await extractText(_0xe441a7);return{'title':_0xe441a7,'url':_0xe441a7,'tree':[_0x2c6f0e[_0x480568(0x265)](-0xdc2+0x2*0x234+-0x26*-0x3f,0xce0+0x33*-0x17+-0x21d*0x3)]};}}}export async function screenshot(_0xb78f0a,_0x410888={}){const _0x4b709c=_0x4ac9,_0x4d984a=_0x4ac9,_0x198cee=await resolveStrategy(selectStrategy());log(_0x4b709c(0x230)+'('+_0xb78f0a+(')\x20using\x20st'+_0x4b709c(0x220))+_0x198cee);switch(_0x198cee){case _0x4d984a(0x200):{await ensureGateway();if(_0xb78f0a)await gatewayRequest(_0x4b709c(0x1c6),{'url':_0xb78f0a});const _0x338acd=await gatewayRequest('/screensho'+'t',_0x410888[_0x4d984a(0x257)]?{'full':_0x4d984a(0x1c1)}:{});return _0x338acd[_0x4b709c(0x215)];}case _0x4b709c(0x1c3):{if(isHubBrowserAvailable()){const _0x4b6ecf=_0x4b709c(0x23e)+Date['now']()+_0x4b709c(0x1e3),_0x3c27a3=execHub([_0x4b709c(0x1c3),_0x4d984a(0x236),_0xb78f0a,_0x4b6ecf]);if(_0x3c27a3?.[_0x4d984a(0x230)])return _0x3c27a3['screenshot'];}return screenshotUrl(_0xb78f0a,{'fullPage':_0x410888[_0x4d984a(0x257)]});}case _0x4d984a(0x1d9)+'h':{const _0x6024d6=_0x4d984a(0x23e)+Date['now']()+_0x4d984a(0x1e3),_0x55be2b=execHub(['stealth',_0xb78f0a,_0x4b709c(0x1d6)+_0x4b709c(0x22e)+_0x6024d6]);if(_0x55be2b?.['screenshot'])return _0x55be2b[_0x4d984a(0x230)];return screenshotUrl(_0xb78f0a,{'fullPage':_0x410888[_0x4b709c(0x257)]});}case _0x4b709c(0x1f0):default:return screenshotUrl(_0xb78f0a,{'fullPage':_0x410888[_0x4d984a(0x257)]});}}async function withCdpPage(_0x53d826){const _0x103c1a=_0x4ac9,_0x1cd2d2=_0x4ac9,{chromium:_0x493830}=await import(_0x103c1a(0x24f)),_0x3533fc=await _0x493830[_0x1cd2d2(0x274)+_0x1cd2d2(0x22a)](config[_0x103c1a(0x1f1)]||'http://127'+_0x1cd2d2(0x1ed)+CDP_PORT);try{const _0x443982=_0x3533fc['contexts']()[-0x10*0x1be+0x2486+0x453*-0x2];if(!_0x443982)throw new Error(_0x103c1a(0x1f3)+_0x1cd2d2(0x1cb)+_0x1cd2d2(0x21c)+_0x1cd2d2(0x264)+_0x1cd2d2(0x1cf));const _0x27d5f7=_0x443982['pages'](),_0x16f7bd=_0x27d5f7[_0x27d5f7['length']-(-0x3*0x4e7+0x1*-0xb81+0x1a37)]||await _0x443982[_0x103c1a(0x252)]();return await _0x53d826(_0x16f7bd);}finally{await _0x3533fc[_0x1cd2d2(0x245)]();}}const NEEDS_INTERACTIVE_HINT=_0x208230(0x224)+_0x186695(0x1e2)+'\x20browser\x20s'+_0x186695(0x1d2)+_0x208230(0x25a)+_0x208230(0x1eb);export async function getTree(_0x2221ab=0x8b6*0x1+0x1c03+-0x2455){const _0x3383a8=_0x186695,_0x53c825=_0x208230;if(await isGatewayRunning())return gatewayRequest('/tree',{'limit':String(_0x2221ab)});if(await isCDPAvailable())return withCdpPage(async _0x3fec33=>{const _0x4f5a7d=_0x4ac9,_0x543c55=_0x4ac9,_0x52415a=await _0x3fec33[_0x4f5a7d(0x279)](_0x4f5a7d(0x24d)+_0x4f5a7d(0x201)+_0x543c55(0x20a)+_0x4f5a7d(0x233)+_0x543c55(0x255)+_0x543c55(0x1df)+'k]',(_0x4057d2,_0x2a939a)=>_0x4057d2['slice'](0xc96+-0x254*0x1+0x2*-0x521,_0x2a939a)[_0x543c55(0x1cd)]((_0x5ab158,_0x4d362a)=>{const _0x5a79b2=_0x543c55,_0x247095=_0x4f5a7d,_0x23f4cf=_0x5ab158[_0x5a79b2(0x25b)]['toLowerCas'+'e'](),_0x163e7d=(_0x5ab158[_0x247095(0x210)+'t']||'')['trim']()['slice'](-0x1594+-0x9*0x3cb+0x37b7,-0x107c+-0x18f3+-0x1*-0x29ab),_0x5e24f0=_0x5ab158['id']?'#'+_0x5ab158['id']:'',_0x1d9346=_0x5ab158[_0x247095(0x239)]?'[name='+_0x5ab158[_0x247095(0x239)]+']':'';return'@e'+(_0x4d362a+(-0x2605+0x1*0x1130+0x6*0x379))+'\x20<'+_0x23f4cf+_0x5e24f0+_0x1d9346+'>\x20\x22'+_0x163e7d+'\x22';}),_0x2221ab);return{'tree':_0x52415a,'total':_0x52415a[_0x543c55(0x272)]};});throw new Error(_0x3383a8(0x202)+_0x3383a8(0x251)+_0x53c825(0x1fa)+_0x3383a8(0x21b)+'ay\x20or\x20CDP.'+'\x20'+NEEDS_INTERACTIVE_HINT);}export async function click(_0x233900){const _0x3c5e29=_0x208230,_0xa855f3=_0x208230;if(await isGatewayRunning())return gatewayRequest(_0x3c5e29(0x271),{'ref':_0x233900});if(await isCDPAvailable())return withCdpPage(async _0x387038=>{const _0x40e287=_0x3c5e29;return await _0x387038['click'](_0x233900,{'timeout':0x2710}),{'title':await _0x387038['title'](),'url':_0x387038[_0x40e287(0x1c4)]()};});throw new Error(_0xa855f3(0x202)+_0xa855f3(0x1cc)+_0x3c5e29(0x225)+'ires\x20gatew'+_0xa855f3(0x1f7)+'\x20'+NEEDS_INTERACTIVE_HINT);}export async function fill(_0x2b805c,_0x494e12){const _0x2b315e=_0x208230,_0x16e68e=_0x208230;if(await isGatewayRunning()){await gatewayRequest(_0x2b315e(0x21f),{'ref':_0x2b805c,'value':_0x494e12});return;}if(await isCDPAvailable()){await withCdpPage(async _0x5e8cb8=>{await _0x5e8cb8['fill'](_0x2b805c,_0x494e12,{'timeout':0x2710});});return;}throw new Error(_0x16e68e(0x202)+'anager]\x20fi'+'ll()\x20requi'+'res\x20gatewa'+_0x2b315e(0x276)+NEEDS_INTERACTIVE_HINT);}export async function type(_0x385b4e,_0x10c92f){const _0x489641=_0x186695,_0x390ccc=_0x208230;if(await isGatewayRunning()){await gatewayRequest(_0x489641(0x204),{'ref':_0x385b4e,'text':_0x10c92f});return;}if(await isCDPAvailable()){await withCdpPage(async _0x33aa1b=>{const _0x2cce61=_0x489641;await _0x33aa1b[_0x2cce61(0x266)](_0x385b4e,_0x10c92f,{'timeout':0x2710});});return;}throw new Error(_0x489641(0x202)+_0x489641(0x1c8)+_0x390ccc(0x23f)+'res\x20gatewa'+_0x390ccc(0x276)+NEEDS_INTERACTIVE_HINT);}export async function press(_0x4590d9,_0x9da777){const _0xaf586d=_0x208230,_0x5f5137=_0x186695;if(await isGatewayRunning()){await gatewayRequest(_0xaf586d(0x1dd),_0x9da777?{'key':_0x4590d9,'ref':_0x9da777}:{'key':_0x4590d9});return;}if(await isCDPAvailable()){await withCdpPage(async _0x29baca=>{const _0x2d8ca4=_0xaf586d,_0x1a6492=_0xaf586d;_0x9da777?await _0x29baca[_0x2d8ca4(0x247)](_0x9da777)[_0x1a6492(0x1d4)](_0x4590d9,{'timeout':0x2710}):await _0x29baca[_0x2d8ca4(0x23b)][_0x1a6492(0x1d4)](_0x4590d9);});return;}throw new Error(_0x5f5137(0x202)+_0xaf586d(0x275)+_0x5f5137(0x1de)+'ires\x20gatew'+_0xaf586d(0x1f7)+'\x20'+NEEDS_INTERACTIVE_HINT);}export async function scroll(_0x59e471,_0x2690ef=-0x1355+0x1*0x24a7+0x47*-0x36){const _0x10d14d=_0x208230,_0x49dca6=_0x208230;if(await isGatewayRunning())return gatewayRequest(_0x10d14d(0x213),{'direction':_0x59e471,'amount':String(_0x2690ef)});if(await isCDPAvailable())return withCdpPage(async _0x2c29b8=>{const _0x750d63=_0x10d14d,_0x1a2825=_0x10d14d,_0x39b3a6=_0x59e471==='up'?-_0x2690ef:_0x59e471===_0x750d63(0x229)?-(-0xadf05*-0x9f0+-0x7085a05b+-0x1*-0x401828ab):_0x59e471===_0x1a2825(0x22f)?-0x3c8ad*0x1c22+0x1d7dcd44+-0x1*-0x88908fb6:_0x2690ef;return await _0x2c29b8[_0x1a2825(0x237)](_0x28ef00=>window[_0x750d63(0x258)](-0x2*0xb9c+0x224f+-0xb17,_0x28ef00),_0x39b3a6),{'title':await _0x2c29b8[_0x750d63(0x208)](),'url':_0x2c29b8[_0x750d63(0x1c4)]()};});throw new Error(_0x10d14d(0x202)+_0x49dca6(0x1db)+_0x10d14d(0x1e5)+_0x49dca6(0x241)+_0x49dca6(0x269)+'.\x20'+NEEDS_INTERACTIVE_HINT);}export async function evaluate(_0x2965bd){const _0x2a7617=_0x186695,_0x1004f1=_0x186695;if(await isGatewayRunning()){const _0x36c9c7=await gatewayRequest('/eval',{'js':_0x2965bd});return _0x36c9c7['result'];}if(await isCDPAvailable())return withCdpPage(async _0x2929c4=>{const _0x533138=_0x4ac9,_0x1193cc=_0x4ac9;return _0x2929c4[_0x533138(0x237)](new Function(_0x533138(0x1f4)+_0x2965bd+')'));});throw new Error(_0x2a7617(0x202)+_0x1004f1(0x26c)+_0x2a7617(0x1fd)+_0x1004f1(0x214)+_0x2a7617(0x212)+'DP.\x20'+NEEDS_INTERACTIVE_HINT);}export async function pdf(_0x5e29c3){return generatePdf(_0x5e29c3);}export async function close(){const _0x16a8bb=_0x186695,_0x57a116=_0x208230;try{await gatewayRequest(_0x16a8bb(0x1ec));}catch{}gatewayProcess&&(gatewayProcess[_0x16a8bb(0x1d0)](),gatewayProcess=null);}export async function info(){const _0xd6f99a=_0x208230,_0x27ba5a=_0x186695;if(await isGatewayRunning())return gatewayRequest(_0xd6f99a(0x26a));if(await isCDPAvailable())return withCdpPage(async _0x3a2f40=>({'title':await _0x3a2f40[_0xd6f99a(0x208)](),'url':_0x3a2f40['url']()}));throw new Error('[browser-m'+'anager]\x20in'+'fo()\x20requi'+_0xd6f99a(0x1da)+'y\x20or\x20CDP.\x20'+NEEDS_INTERACTIVE_HINT);}