alvin-bot 5.6.2 → 5.8.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/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -130
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -443
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -0
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1831
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,127 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* WebFetch — Tier 0 of the browser fallback chain.
|
|
3
|
-
*
|
|
4
|
-
* For URLs that don't need JavaScript, cookies, or a real browser —
|
|
5
|
-
* RSS feeds, JSON APIs, static HTML, OG-tag sniffs — a plain `fetch()`
|
|
6
|
-
* is 100× faster than spinning up Playwright and never shows up in
|
|
7
|
-
* bot-detection traffic. When this tier fails (4xx, 5xx, JS-heavy
|
|
8
|
-
* page, certificate error), callers should catch `WebfetchFailed`
|
|
9
|
-
* and cascade to the next tier (hub-stealth → cdp → gateway).
|
|
10
|
-
*
|
|
11
|
-
* See browser-manager.ts for the full cascade; this module is the
|
|
12
|
-
* leaf-level primitive with no dependencies on that file so both can
|
|
13
|
-
* be unit-tested in isolation.
|
|
14
|
-
*
|
|
15
|
-
* SSRF hardening (M1): assertSsrfSafe() is called before every fetch hop to
|
|
16
|
-
* reject loopback / link-local / RFC-1918 / metadata / non-http(s)
|
|
17
|
-
* destinations. Redirects are followed manually (redirect:"manual") so every
|
|
18
|
-
* hop's Location header is re-validated before following — a public host that
|
|
19
|
-
* returns 302 → 169.254.169.254 is therefore blocked. Redirects are capped at
|
|
20
|
-
* 10 hops; an operator who needs redirect-to-internal can set
|
|
21
|
-
* ALLOW_PRIVATE_FETCH=1.
|
|
22
|
-
*/
|
|
23
|
-
import { assertSsrfSafe, SsrfBlockedError } from "./ssrf-guard.js";
|
|
24
|
-
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
25
|
-
const MAX_REDIRECTS = 10;
|
|
26
|
-
const DEFAULT_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/605.1.15 " +
|
|
27
|
-
"(KHTML, like Gecko) Version/17.0 Safari/605.1.15 AlvinBot/webfetch";
|
|
28
|
-
export class WebfetchFailed extends Error {
|
|
29
|
-
status;
|
|
30
|
-
url;
|
|
31
|
-
cause;
|
|
32
|
-
constructor(url, message, opts = {}) {
|
|
33
|
-
super(`webfetch(${url}): ${message}`);
|
|
34
|
-
this.name = "WebfetchFailed";
|
|
35
|
-
this.url = url;
|
|
36
|
-
this.status = opts.status;
|
|
37
|
-
this.cause = opts.cause;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const ENTITY_MAP = {
|
|
41
|
-
"&": "&",
|
|
42
|
-
""": '"',
|
|
43
|
-
"'": "'",
|
|
44
|
-
"'": "'",
|
|
45
|
-
"<": "<",
|
|
46
|
-
">": ">",
|
|
47
|
-
" ": " ",
|
|
48
|
-
};
|
|
49
|
-
function decodeEntities(s) {
|
|
50
|
-
return s.replace(/&(amp|quot|#39|apos|lt|gt|nbsp);/gi, (m) => ENTITY_MAP[m.toLowerCase()] ?? m);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Return the contents of the first `<title>` tag, normalised:
|
|
54
|
-
* whitespace collapsed, common HTML entities decoded. If there's no
|
|
55
|
-
* `<title>` at all, returns the empty string — callers decide what to
|
|
56
|
-
* do with that (the URL is a reasonable default display value).
|
|
57
|
-
*/
|
|
58
|
-
export function parseTitle(html) {
|
|
59
|
-
const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
|
|
60
|
-
if (!match)
|
|
61
|
-
return "";
|
|
62
|
-
const inner = match[1].replace(/\s+/g, " ").trim();
|
|
63
|
-
return decodeEntities(inner);
|
|
64
|
-
}
|
|
65
|
-
export async function webfetchNavigate(url, options = {}) {
|
|
66
|
-
// M1: SSRF guard — reject private/internal destinations before fetching.
|
|
67
|
-
// SsrfBlockedError is intentionally not wrapped in WebfetchFailed so
|
|
68
|
-
// callers can distinguish "blocked by policy" from "server error".
|
|
69
|
-
// We validate EVERY redirect hop manually (redirect:"manual") so a
|
|
70
|
-
// public host cannot 302 us into an internal address.
|
|
71
|
-
await assertSsrfSafe(url);
|
|
72
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
73
|
-
const controller = new AbortController();
|
|
74
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
75
|
-
try {
|
|
76
|
-
let currentUrl = url;
|
|
77
|
-
let response;
|
|
78
|
-
for (let hop = 0;; hop++) {
|
|
79
|
-
try {
|
|
80
|
-
response = await fetch(currentUrl, {
|
|
81
|
-
method: "GET",
|
|
82
|
-
headers: {
|
|
83
|
-
"User-Agent": options.userAgent ?? DEFAULT_USER_AGENT,
|
|
84
|
-
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
85
|
-
},
|
|
86
|
-
redirect: "manual",
|
|
87
|
-
signal: controller.signal,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
throw new WebfetchFailed(url, err.message, { cause: err });
|
|
92
|
-
}
|
|
93
|
-
// Not a redirect — we have the final response
|
|
94
|
-
if (response.status < 300 || response.status >= 400)
|
|
95
|
-
break;
|
|
96
|
-
const loc = response.headers.get("location");
|
|
97
|
-
if (!loc)
|
|
98
|
-
break; // no Location header — treat as final response
|
|
99
|
-
if (hop >= MAX_REDIRECTS) {
|
|
100
|
-
throw new SsrfBlockedError(url, `too many redirects (> ${MAX_REDIRECTS})`);
|
|
101
|
-
}
|
|
102
|
-
const next = new URL(loc, currentUrl).href;
|
|
103
|
-
// Re-validate each redirect target before following — closes the
|
|
104
|
-
// post-redirect SSRF bypass where fetch would silently follow a
|
|
105
|
-
// 302 pointing at 169.254.169.254 / loopback / RFC-1918.
|
|
106
|
-
await assertSsrfSafe(next);
|
|
107
|
-
currentUrl = next;
|
|
108
|
-
}
|
|
109
|
-
if (!response.ok) {
|
|
110
|
-
throw new WebfetchFailed(url, `HTTP ${response.status}`, { status: response.status });
|
|
111
|
-
}
|
|
112
|
-
const contentType = response.headers.get("content-type") || "";
|
|
113
|
-
const isHtml = /text\/html|application\/xhtml\+xml/i.test(contentType);
|
|
114
|
-
if (options.forceHtml && !isHtml) {
|
|
115
|
-
throw new WebfetchFailed(url, `expected HTML, got ${contentType || "unknown"}`, { status: response.status });
|
|
116
|
-
}
|
|
117
|
-
const body = await response.text();
|
|
118
|
-
const title = parseTitle(body);
|
|
119
|
-
return {
|
|
120
|
-
title: title || url,
|
|
121
|
-
url,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
finally {
|
|
125
|
-
clearTimeout(timer);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
1
|
+
const _0x2e3b5a=_0xeed8,_0x232545=_0xeed8;(function(_0x3997f8,_0x47c879){const _0x576277=_0xeed8,_0x3c3f1d=_0xeed8,_0x356e70=_0x3997f8();while(!![]){try{const _0x27f889=-parseInt(_0x576277(0x15f))/(0x3*-0x976+-0x170d+0x3370)+-parseInt(_0x576277(0x184))/(-0x34*0x22+-0x124*0x12+0x3*0x926)*(-parseInt(_0x576277(0x17f))/(-0x17f*0xb+-0x1*-0x1f+-0x1b*-0x9b))+-parseInt(_0x3c3f1d(0x176))/(0x15e8+-0x1*-0x34f+0x1*-0x1933)*(parseInt(_0x576277(0x156))/(-0x251*-0x3+0x22a7+-0x5*0x851))+parseInt(_0x3c3f1d(0x182))/(0x2b*-0x3e+-0x1*-0x615+0xdf*0x5)+-parseInt(_0x576277(0x167))/(0x11b6+-0x1f*0x53+-0x1*0x7a2)*(-parseInt(_0x576277(0x158))/(-0x1e5+0x13*-0x1bb+0xc6*0x2d))+-parseInt(_0x3c3f1d(0x17e))/(0x1*-0x5df+-0x119*-0x3+-0x29d*-0x1)+-parseInt(_0x576277(0x16d))/(-0x3d2+-0x7*0xce+0x1e*0x51)*(-parseInt(_0x576277(0x153))/(-0x3f9*-0x9+0x10e2+-0x4c8*0xb));if(_0x27f889===_0x47c879)break;else _0x356e70['push'](_0x356e70['shift']());}catch(_0x1907a7){_0x356e70['push'](_0x356e70['shift']());}}}(_0x38a3,-0x6fac3+-0x70723+0x1abdc0));const _0x138ea6=(function(){let _0x498eb8=!![];return function(_0x30c60f,_0x5b5c16){const _0x1b8d41=_0x498eb8?function(){const _0xeaeb7e=_0xeed8;if(_0x5b5c16){const _0x4bcfe0=_0x5b5c16[_0xeaeb7e(0x16b)](_0x30c60f,arguments);return _0x5b5c16=null,_0x4bcfe0;}}:function(){};return _0x498eb8=![],_0x1b8d41;};}()),_0x17438c=_0x138ea6(this,function(){const _0x3b686c=_0xeed8,_0x36a1e7=_0xeed8;return _0x17438c[_0x3b686c(0x15c)]()[_0x3b686c(0x185)](_0x3b686c(0x16a)+'+$')[_0x3b686c(0x15c)]()[_0x3b686c(0x180)+'r'](_0x17438c)[_0x3b686c(0x185)](_0x3b686c(0x16a)+'+$');});function _0xeed8(_0x2fda93,_0x36a230){_0x2fda93=_0x2fda93-(-0xef*0x25+-0x45b+-0x11e*-0x24);const _0x3ddcf8=_0x38a3();let _0x170ac8=_0x3ddcf8[_0x2fda93];if(_0xeed8['cHXRLe']===undefined){var _0x240e1c=function(_0x389313){const _0x2b8ac7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x100342='',_0x2741f2='',_0x16a1bb=_0x100342+_0x240e1c;for(let _0x3ac8fb=0x1d16+-0x35e+-0x19b8,_0x1530ff,_0x3a685a,_0x113463=-0x1707+0x1efb+-0x1*0x7f4;_0x3a685a=_0x389313['charAt'](_0x113463++);~_0x3a685a&&(_0x1530ff=_0x3ac8fb%(0x259b+-0x16af+-0x9f*0x18)?_0x1530ff*(-0x1d2f+-0x1a7d*-0x1+0x1a*0x1d)+_0x3a685a:_0x3a685a,_0x3ac8fb++%(-0x18a8+-0x4*-0x6aa+-0x4*0x7f))?_0x100342+=_0x16a1bb['charCodeAt'](_0x113463+(-0x14b3+0x3d9+-0x5c*-0x2f))-(-0x324+0x927*-0x2+0x157c)!==0x91*-0x31+0x459*0x3+0xeb6?String['fromCharCode'](0x170b+0x27*-0x57+-0x8cb&_0x1530ff>>(-(-0x15ca+-0x1*-0x601+-0x137*-0xd)*_0x3ac8fb&-0x1b62+0x231*-0x3+0x21fb)):_0x3ac8fb:0x5cf*0x3+-0x1182+-0x7*-0x3){_0x3a685a=_0x2b8ac7['indexOf'](_0x3a685a);}for(let _0x550d46=0x55f*0x3+-0x75f+-0x8be,_0x3c7b14=_0x100342['length'];_0x550d46<_0x3c7b14;_0x550d46++){_0x2741f2+='%'+('00'+_0x100342['charCodeAt'](_0x550d46)['toString'](-0x301*-0xb+-0xc14+-0x14e7*0x1))['slice'](-(-0x111+0x1cb8+-0x937*0x3));}return decodeURIComponent(_0x2741f2);};_0xeed8['uqFuDh']=_0x240e1c,_0xeed8['wKojsW']={},_0xeed8['cHXRLe']=!![];}const _0xd0b8f9=_0x3ddcf8[-0x1*0x10f4+0x1*0x1f06+-0xe12*0x1],_0x138e83=_0x2fda93+_0xd0b8f9,_0x5ce09f=_0xeed8['wKojsW'][_0x138e83];if(!_0x5ce09f){const _0x1b9a62=function(_0x2fd6b0){this['pCuevR']=_0x2fd6b0,this['POHvVR']=[-0x2d*-0xa+0xa5*0x30+-0x20b1,0x14f+-0x246b*-0x1+0x16*-0x1b7,0x23ec+0x1212+-0x35fe],this['hhTUdN']=function(){return'newState';},this['xGDHwf']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['tKrBob']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1b9a62['prototype']['fqSZMm']=function(){const _0x5f5086=new RegExp(this['xGDHwf']+this['tKrBob']),_0x1281a2=_0x5f5086['test'](this['hhTUdN']['toString']())?--this['POHvVR'][-0x1*0x1a53+-0x5*-0x348+-0x27b*-0x4]:--this['POHvVR'][-0x252b*-0x1+0x23cc+0x1*-0x48f7];return this['KcXfHH'](_0x1281a2);},_0x1b9a62['prototype']['KcXfHH']=function(_0x541dd5){if(!Boolean(~_0x541dd5))return _0x541dd5;return this['QISSNj'](this['pCuevR']);},_0x1b9a62['prototype']['QISSNj']=function(_0x189656){for(let _0x455721=-0x5b*-0x65+-0xba*-0x6+0x3a9*-0xb,_0x202c3d=this['POHvVR']['length'];_0x455721<_0x202c3d;_0x455721++){this['POHvVR']['push'](Math['round'](Math['random']())),_0x202c3d=this['POHvVR']['length'];}return _0x189656(this['POHvVR'][0x2*0xff4+-0x9d*0x1+-0x1*0x1f4b]);},new _0x1b9a62(_0xeed8)['fqSZMm'](),_0x170ac8=_0xeed8['uqFuDh'](_0x170ac8),_0xeed8['wKojsW'][_0x138e83]=_0x170ac8;}else _0x170ac8=_0x5ce09f;return _0x170ac8;}_0x17438c();import{assertSsrfSafe,SsrfBlockedError}from'./ssrf-guard.js';const DEFAULT_TIMEOUT_MS=0x5cf0+-0x1*0x4b59+-0xdab*-0x3,MAX_REDIRECTS=-0x6f1*0x4+-0x14da+-0x4*-0xc2a,DEFAULT_USER_AGENT=_0x2e3b5a(0x17b)+'0\x20(Macinto'+_0x232545(0x171)+_0x2e3b5a(0x18c)+_0x2e3b5a(0x170)+_0x232545(0x172)+_0x232545(0x188)+(_0x2e3b5a(0x174)+_0x232545(0x17d)+_0x232545(0x157)+_0x232545(0x16c)+_0x2e3b5a(0x15e)+_0x232545(0x178)+_0x2e3b5a(0x177));export class WebfetchFailed extends Error{[_0x232545(0x166)];[_0x2e3b5a(0x161)];[_0x232545(0x15d)];constructor(_0x1f8358,_0x2f3684,_0x4d83e7={}){const _0x1a3c1f=_0x2e3b5a,_0x5431e5=_0x2e3b5a;super(_0x1a3c1f(0x179)+_0x1f8358+_0x1a3c1f(0x18b)+_0x2f3684),this[_0x1a3c1f(0x15b)]=_0x1a3c1f(0x18a)+_0x1a3c1f(0x155),this[_0x5431e5(0x161)]=_0x1f8358,this['status']=_0x4d83e7[_0x5431e5(0x166)],this[_0x1a3c1f(0x15d)]=_0x4d83e7[_0x5431e5(0x15d)];}}const ENTITY_MAP={'&':'&','"':'\x22',''':'\x27',''':'\x27','<':'<','>':'>',' ':'\x20'};function decodeEntities(_0x453e9e){const _0x54ee38=_0x232545;return _0x453e9e['replace'](/&(amp|quot|#39|apos|lt|gt|nbsp);/gi,_0x28caf3=>ENTITY_MAP[_0x28caf3[_0x54ee38(0x163)+'e']()]??_0x28caf3);}export function parseTitle(_0x151795){const _0x1fcd9b=_0x232545,_0x37049d=_0x151795['match'](/<title[^>]*>([\s\S]*?)<\/title>/i);if(!_0x37049d)return'';const _0xd7044c=_0x37049d[0x1b*0x3a+-0x2002+-0x1*-0x19e5][_0x1fcd9b(0x16f)](/\s+/g,'\x20')['trim']();return decodeEntities(_0xd7044c);}export async function webfetchNavigate(_0x4bb757,_0x2e8a98={}){const _0x254213=_0x2e3b5a,_0x15a7b2=_0x232545;await assertSsrfSafe(_0x4bb757);const _0x5035d6=_0x2e8a98['timeoutMs']??DEFAULT_TIMEOUT_MS,_0xf636f8=new AbortController(),_0xe443a1=setTimeout(()=>_0xf636f8[_0x254213(0x162)](),_0x5035d6);try{let _0x27aa95=_0x4bb757,_0x153c47;for(let _0x1a5186=-0x1d*-0x93+-0xc07+-0x8*0x94;;_0x1a5186++){try{_0x153c47=await fetch(_0x27aa95,{'method':_0x15a7b2(0x165),'headers':{'User-Agent':_0x2e8a98[_0x15a7b2(0x189)]??DEFAULT_USER_AGENT,'Accept':'text/html,'+_0x15a7b2(0x169)+_0x15a7b2(0x187)+_0x15a7b2(0x164)+_0x254213(0x181)+_0x254213(0x183)+'0.8'},'redirect':'manual','signal':_0xf636f8['signal']});}catch(_0x1e333a){throw new WebfetchFailed(_0x4bb757,_0x1e333a[_0x15a7b2(0x18d)],{'cause':_0x1e333a});}if(_0x153c47['status']<-0x1215+0x1de7+-0xaa6||_0x153c47[_0x15a7b2(0x166)]>=-0x1*0x11a7+0x7a0+0x1*0xb97)break;const _0x3e8724=_0x153c47[_0x254213(0x160)][_0x15a7b2(0x154)]('location');if(!_0x3e8724)break;if(_0x1a5186>=MAX_REDIRECTS)throw new SsrfBlockedError(_0x4bb757,_0x15a7b2(0x17c)+_0x15a7b2(0x168)+'>\x20'+MAX_REDIRECTS+')');const _0x4fb02e=new URL(_0x3e8724,_0x27aa95)[_0x15a7b2(0x17a)];await assertSsrfSafe(_0x4fb02e),_0x27aa95=_0x4fb02e;}if(!_0x153c47['ok'])throw new WebfetchFailed(_0x4bb757,_0x15a7b2(0x175)+_0x153c47[_0x15a7b2(0x166)],{'status':_0x153c47[_0x254213(0x166)]});const _0x48b0ee=_0x153c47[_0x15a7b2(0x160)][_0x254213(0x154)](_0x254213(0x15a)+'pe')||'',_0x58d097=/text\/html|application\/xhtml\+xml/i[_0x254213(0x186)](_0x48b0ee);if(_0x2e8a98[_0x254213(0x159)]&&!_0x58d097)throw new WebfetchFailed(_0x4bb757,_0x254213(0x16e)+_0x15a7b2(0x173)+(_0x48b0ee||'unknown'),{'status':_0x153c47[_0x15a7b2(0x166)]});const _0x8b469b=await _0x153c47[_0x254213(0x152)](),_0x44f508=parseTitle(_0x8b469b);return{'title':_0x44f508||_0x4bb757,'url':_0x4bb757};}finally{clearTimeout(_0xe443a1);}}function _0x38a3(){const _0x2834de=['mc45lcOVkJTXpq','ndj6uefxyKi','C2vHCMnO','DgvZDa','BI94AhrTBcT4Bq','lJeUmtuG','DxnLCKfNzw50','v2vIzMv0y2Hgyq','ktOG','twfJie9tifGGmq','BwvZC2fNzq','Dgv4Da','mtf1quriBxq','z2v0','AwXLza','mJCYme1ytxj1AG','vMvYC2LVBI8XnW','ohfqrfHdqq','zM9Yy2viDg1S','y29UDgvUDc10Eq','BMfTzq','Dg9tDhjPBMC','y2f1C2u','nJa1lJeUmtuGqq','mtaZntmXnw5lzw9vra','AgvHzgvYCW','DxjS','ywjVCNq','Dg9mB3DLCKnHCW','BcXHChbSAwnHDa','r0vu','C3rHDhvZ','mta4nte1ndDmz1LyqMi','zwrPCMvJDhmGka','yxbWBgLJyxrPBW','kcGOlISPkYKRkq','yxbWBhK','lJaGu2fMyxjPlW','odeZmZq3mhPdrLbPqq','zxHWzwn0zwqGsa','CMvWBgfJzq','nf8WksbbChbSzq','C2G7ieLUDgvSia','v2vIs2L0lZyWnq','ve1mlcbNB3qG','keTive1mlcbSAq','sfruuca','mJmXnKfzCerOuG','yMzLDgnO','BhzPBKjVDc93zq','D2vIzMv0y2GO','AhjLzG','tw96AwXSys81lG','Dg9Vig1HBNKGCG','A2uGr2vJA28Pia','mtq0mJi0nJrUsgDguLy','otGZnJfvs2Lnuhi','y29UC3rYDwn0BW','Aw9Ul3HTBdTXpq','ndqXmti4ngLlwNzpEa'];_0x38a3=function(){return _0x2834de;};return _0x38a3();}
|
package/dist/services/browser.js
CHANGED
|
@@ -1,121 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser Service — Web browsing via Playwright.
|
|
3
|
-
*
|
|
4
|
-
* Capabilities:
|
|
5
|
-
* - Screenshot a URL
|
|
6
|
-
* - Extract text content from a URL
|
|
7
|
-
* - Fill forms (basic)
|
|
8
|
-
* - PDF generation
|
|
9
|
-
*
|
|
10
|
-
* Playwright is an optional dependency — browser features are only available if installed.
|
|
11
|
-
*/
|
|
12
|
-
import { execSync } from "child_process";
|
|
13
|
-
import fs from "fs";
|
|
14
|
-
import path from "path";
|
|
15
|
-
import os from "os";
|
|
16
|
-
const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot", "browser");
|
|
17
|
-
if (!fs.existsSync(TEMP_DIR))
|
|
18
|
-
fs.mkdirSync(TEMP_DIR, { recursive: true });
|
|
19
|
-
/** Check if Playwright is available */
|
|
20
|
-
export function hasPlaywright() {
|
|
21
|
-
try {
|
|
22
|
-
execSync("npx playwright --version", { stdio: "pipe", timeout: 10000 });
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Take a screenshot of a URL.
|
|
31
|
-
* Returns path to the screenshot image.
|
|
32
|
-
*/
|
|
33
|
-
export async function screenshotUrl(url, options = {}) {
|
|
34
|
-
const { fullPage = false, width = 1280, height = 720 } = options;
|
|
35
|
-
const outputPath = path.join(TEMP_DIR, `screenshot_${Date.now()}.png`);
|
|
36
|
-
// Use a standalone Node script to avoid importing playwright at module level
|
|
37
|
-
const script = `
|
|
38
|
-
const { chromium } = require('playwright');
|
|
39
|
-
(async () => {
|
|
40
|
-
const browser = await chromium.launch({ headless: true });
|
|
41
|
-
const page = await browser.newPage({ viewport: { width: ${width}, height: ${height} } });
|
|
42
|
-
await page.goto(${JSON.stringify(url)}, { waitUntil: 'networkidle', timeout: 30000 });
|
|
43
|
-
await page.screenshot({ path: ${JSON.stringify(outputPath)}, fullPage: ${fullPage} });
|
|
44
|
-
await browser.close();
|
|
45
|
-
})().catch(err => { console.error(err.message); process.exit(1); });
|
|
46
|
-
`;
|
|
47
|
-
try {
|
|
48
|
-
execSync(`node -e '${script.replace(/'/g, "\\'")}'`, {
|
|
49
|
-
stdio: "pipe",
|
|
50
|
-
timeout: 45000,
|
|
51
|
-
env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: "0" },
|
|
52
|
-
});
|
|
53
|
-
if (!fs.existsSync(outputPath))
|
|
54
|
-
throw new Error("Screenshot not created");
|
|
55
|
-
return outputPath;
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
const error = err;
|
|
59
|
-
throw new Error(`Screenshot failed: ${error.stderr?.toString()?.trim() || error.message}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Extract text content from a URL.
|
|
64
|
-
* Returns the visible text content.
|
|
65
|
-
*/
|
|
66
|
-
export async function extractText(url) {
|
|
67
|
-
const script = `
|
|
68
|
-
const { chromium } = require('playwright');
|
|
69
|
-
(async () => {
|
|
70
|
-
const browser = await chromium.launch({ headless: true });
|
|
71
|
-
const page = await browser.newPage();
|
|
72
|
-
await page.goto(${JSON.stringify(url)}, { waitUntil: 'networkidle', timeout: 30000 });
|
|
73
|
-
const text = await page.evaluate(() => document.body.innerText);
|
|
74
|
-
console.log(text);
|
|
75
|
-
await browser.close();
|
|
76
|
-
})().catch(err => { console.error(err.message); process.exit(1); });
|
|
77
|
-
`;
|
|
78
|
-
try {
|
|
79
|
-
const result = execSync(`node -e '${script.replace(/'/g, "\\'")}'`, {
|
|
80
|
-
stdio: "pipe",
|
|
81
|
-
timeout: 45000,
|
|
82
|
-
env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: "0" },
|
|
83
|
-
});
|
|
84
|
-
return result.toString().trim();
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
const error = err;
|
|
88
|
-
throw new Error(`Text extraction failed: ${error.stderr?.toString()?.trim() || error.message}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Generate PDF from a URL.
|
|
93
|
-
* Returns path to the PDF file.
|
|
94
|
-
*/
|
|
95
|
-
export async function generatePdf(url) {
|
|
96
|
-
const outputPath = path.join(TEMP_DIR, `page_${Date.now()}.pdf`);
|
|
97
|
-
const script = `
|
|
98
|
-
const { chromium } = require('playwright');
|
|
99
|
-
(async () => {
|
|
100
|
-
const browser = await chromium.launch({ headless: true });
|
|
101
|
-
const page = await browser.newPage();
|
|
102
|
-
await page.goto(${JSON.stringify(url)}, { waitUntil: 'networkidle', timeout: 30000 });
|
|
103
|
-
await page.pdf({ path: ${JSON.stringify(outputPath)}, format: 'A4', printBackground: true });
|
|
104
|
-
await browser.close();
|
|
105
|
-
})().catch(err => { console.error(err.message); process.exit(1); });
|
|
106
|
-
`;
|
|
107
|
-
try {
|
|
108
|
-
execSync(`node -e '${script.replace(/'/g, "\\'")}'`, {
|
|
109
|
-
stdio: "pipe",
|
|
110
|
-
timeout: 45000,
|
|
111
|
-
env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: "0" },
|
|
112
|
-
});
|
|
113
|
-
if (!fs.existsSync(outputPath))
|
|
114
|
-
throw new Error("PDF not created");
|
|
115
|
-
return outputPath;
|
|
116
|
-
}
|
|
117
|
-
catch (err) {
|
|
118
|
-
const error = err;
|
|
119
|
-
throw new Error(`PDF generation failed: ${error.stderr?.toString()?.trim() || error.message}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
1
|
+
const _0x374288=_0x2a4f,_0x1bc31d=_0x2a4f;(function(_0x23a828,_0x35a77f){const _0x5202e8=_0x2a4f,_0x11d759=_0x2a4f,_0x13f7ab=_0x23a828();while(!![]){try{const _0x108079=parseInt(_0x5202e8(0x159))/(-0x3b*0xa3+0x4*-0x92f+0x4a4e)*(parseInt(_0x11d759(0x12d))/(0x562*-0x6+0x15b9+0xa95))+-parseInt(_0x5202e8(0x14d))/(-0x95+0x1904+0xc36*-0x2)+parseInt(_0x5202e8(0x120))/(0x1920+-0x1e77+-0x55b*-0x1)*(parseInt(_0x11d759(0x13f))/(0x2*0x530+-0x16bc+-0x1*-0xc61))+-parseInt(_0x5202e8(0x107))/(0xbab*0x1+-0x4d2+-0x6d3*0x1)*(-parseInt(_0x11d759(0x140))/(-0x1e2*0x13+-0xcc7+0x3094))+-parseInt(_0x5202e8(0x102))/(0x203e*-0x1+0x65*-0x54+0x416a)+parseInt(_0x5202e8(0x129))/(-0x22a9+-0x9c5+-0x1*-0x2c77)*(parseInt(_0x5202e8(0x162))/(-0xf68+-0x14*-0xa0+0x2f2))+-parseInt(_0x11d759(0x12f))/(-0x1*0x11b5+0x18b2+-0x6f2);if(_0x108079===_0x35a77f)break;else _0x13f7ab['push'](_0x13f7ab['shift']());}catch(_0xa6033a){_0x13f7ab['push'](_0x13f7ab['shift']());}}}(_0xc7db,0x88bb7+-0x20e9e*0x6+0xadb7b));const _0x2619b4=(function(){let _0x18879b=!![];return function(_0x5cbd62,_0x4d86d7){const _0x21f38e=_0x18879b?function(){const _0x1e014f=_0x2a4f;if(_0x4d86d7){const _0x246f4e=_0x4d86d7[_0x1e014f(0x11d)](_0x5cbd62,arguments);return _0x4d86d7=null,_0x246f4e;}}:function(){};return _0x18879b=![],_0x21f38e;};}()),_0x2eb381=_0x2619b4(this,function(){const _0x53be21=_0x2a4f,_0x2bd68b=_0x2a4f;return _0x2eb381[_0x53be21(0x138)]()['search'](_0x53be21(0x101)+'+$')[_0x2bd68b(0x138)]()[_0x53be21(0x10a)+'r'](_0x2eb381)[_0x2bd68b(0x143)](_0x2bd68b(0x101)+'+$');});_0x2eb381();import{execSync}from'child_process';import _0x3698aa from'fs';function _0x2a4f(_0x4e5a15,_0xa81d79){_0x4e5a15=_0x4e5a15-(-0x1*-0x35+-0x2333+0x23fd);const _0x2a0cc0=_0xc7db();let _0x127797=_0x2a0cc0[_0x4e5a15];if(_0x2a4f['MXzORZ']===undefined){var _0x4d38d1=function(_0x4aaace){const _0x3463f9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5a899a='',_0x407c63='',_0x2237c7=_0x5a899a+_0x4d38d1;for(let _0x3dee00=0x2f*-0x18+0x14e6+-0x107e,_0x29cd85,_0x5838f3,_0x5bb34a=0x1ab9+-0xdaa*-0x2+-0x360d;_0x5838f3=_0x4aaace['charAt'](_0x5bb34a++);~_0x5838f3&&(_0x29cd85=_0x3dee00%(-0xc51+0x53+0x3a*0x35)?_0x29cd85*(0xa*0x6d+-0xdd2+0x9d0)+_0x5838f3:_0x5838f3,_0x3dee00++%(-0x2253+0x1872+0x9e5))?_0x5a899a+=_0x2237c7['charCodeAt'](_0x5bb34a+(-0x2672+-0x1*0x2034+0x1*0x46b0))-(0x2180+0x797+0x1*-0x290d)!==-0x132f+-0xb*0x28c+0x2b*0x119?String['fromCharCode'](0x377*-0x1+0x633+0x5*-0x59&_0x29cd85>>(-(0x142f+0x2*-0x51b+-0x9f7)*_0x3dee00&0x1*-0x102a+-0x5a3+-0x1*-0x15d3)):_0x3dee00:-0x657*0x1+-0x14e8+0x307*0x9){_0x5838f3=_0x3463f9['indexOf'](_0x5838f3);}for(let _0x13e53a=0x1f15*0x1+0x1cc1+0x8a*-0x6f,_0x41fa37=_0x5a899a['length'];_0x13e53a<_0x41fa37;_0x13e53a++){_0x407c63+='%'+('00'+_0x5a899a['charCodeAt'](_0x13e53a)['toString'](-0x1*-0xdc+0x1*0x68e+0x2*-0x3ad))['slice'](-(0x2059+0x206f*0x1+-0x1*0x40c6));}return decodeURIComponent(_0x407c63);};_0x2a4f['kCYdIx']=_0x4d38d1,_0x2a4f['sVKhAZ']={},_0x2a4f['MXzORZ']=!![];}const _0x71663e=_0x2a0cc0[0x1812+0x24c+-0x1a5e],_0x3c595e=_0x4e5a15+_0x71663e,_0x13f10e=_0x2a4f['sVKhAZ'][_0x3c595e];if(!_0x13f10e){const _0xa297db=function(_0x4063c1){this['UvQjSD']=_0x4063c1,this['mYaJcf']=[-0x6*0x53+-0x5bb+0x1*0x7ae,0x2517+0x25c0+-0x17*0x341,-0x25c+0x2445+-0x21e9],this['hYEiMl']=function(){return'newState';},this['KEOyGx']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['AlgzkV']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xa297db['prototype']['GfccNE']=function(){const _0x2017f4=new RegExp(this['KEOyGx']+this['AlgzkV']),_0x5a3d9a=_0x2017f4['test'](this['hYEiMl']['toString']())?--this['mYaJcf'][-0x1623+-0xb*0x2a4+0x3330]:--this['mYaJcf'][0xbde+-0x3b*0xa3+0x2b*0x99];return this['abBhTx'](_0x5a3d9a);},_0xa297db['prototype']['abBhTx']=function(_0xee18dc){if(!Boolean(~_0xee18dc))return _0xee18dc;return this['RKHrvy'](this['UvQjSD']);},_0xa297db['prototype']['RKHrvy']=function(_0x811b36){for(let _0x1cf6b4=0x153d*-0x1+-0x1*0x204c+0x3589,_0x855fbb=this['mYaJcf']['length'];_0x1cf6b4<_0x855fbb;_0x1cf6b4++){this['mYaJcf']['push'](Math['round'](Math['random']())),_0x855fbb=this['mYaJcf']['length'];}return _0x811b36(this['mYaJcf'][-0x95+0x1904+0x825*-0x3]);},new _0xa297db(_0x2a4f)['GfccNE'](),_0x127797=_0x2a4f['kCYdIx'](_0x127797),_0x2a4f['sVKhAZ'][_0x3c595e]=_0x127797;}else _0x127797=_0x13f10e;return _0x127797;}import _0x4575e0 from'path';function _0xc7db(){const _0x1b268b=['zw52','icaGignVBNn0ia','mJj4DM1zywG','BwvZC2fNzq','ntq2nde4ngDIv3vWsa','CNiUBwvZC2fNzq','u2nYzwvUC2HVDa','kcK7cIaGicb9kq','igzHAwXLzdOG','BMvYvgv4DcK7cG','B2XLlMXVzYH0zq','ktSkicaGicaGyW','zdOGDhj1zsb9kq','Dg9tDhjPBMC','ihSGy2HYB21PDq','ktSGChjVy2vZCW','ihbHz2uUC2nYzq','zhrOoIa','CMLNAhqNktSkia','lcbMB3jTyxq6ia','mZaWnxPurLfnvG','ntaZmZyZuujUywD5','Dg1WzgLY','icaGicbJB25ZDa','C2vHCMnO','lcbMDwXSugfNzq','ywL0ihbHz2uUzq','ywL0igjYB3DZzq','CgfNzv8','yxrOoIa','oWOGicaGicbHDW','icaGicbHD2fPDa','DhjPBq','lMv4AxqOmsK7ia','nZu3mZGWqLvvveLx','DgLTzw91DdOGmW','BguUzxjYB3iOzq','ig5VDcbJCMvHDa','yNjVD3nLCIa9ia','zdOG','B3jRAwrSzsCSia','BM9KzsaTzsaN','zxnZlMv4AxqOmq','lNbKzG','icaGyxDHAxqGCa','ihbHz2uUCgrMka','mZKZmdLWD0zdA1a','C2nYzwvUC2HVDa','y3rPB24GzMfPBa','zwq6ia','yxDHAxqGy2HYBW','CMvWBgfJzq','yNjVD3nLCG','AM9PBG','C3m6ihrYDwuGFq','mtq2odm3mhLzBhPNBa','kcKGpt4GEWOGia','BNnVBguUzxjYBW','kcKUy2f0y2GOzq','CgLWzq','ih0GFsK7cIaGia','CI5JBg9ZzsGPoW','C3rKzxjY','B3DZzxiUBMv3ua','BM93','AwDODcaTlxzLCG','kcGOlISPkYKRkq','nJu2ndaWD0DVEfDe','Cg9YDdOGEYb3Aq','ywDLkcK7cIaGia','B25ZDcbWywDLia','DMfSDwf0zsGOkq','mZbwCK9wqxy','y2f0y2GOzxjYia','zwf0zwq','y29UC3rYDwn0BW','EhqPoWOGicaGia','BwTKAxjtEw5J','ywDLktSGChjVyW','AxjLkcDWBgf5DW','CNiGpt4GEYbJBW','cIaGicb9ksGPlG','ihrLEhqGpsbHDW','lcbOzwLNAhq6ia','AcH7igHLywrSzq','ywDLkhSGDMLLDW','ktSGFsK7cIaG','zxHPC3rZu3LUyW','psbHD2fPDcbICG','lNbUzW','BNb4ihbSyxL3CG','mdaWmcb9ktSkia','icaGkgfZEw5Jia','ywDLlMDVDg8O','yxbWBhK','uergig5VDcbJCG','id0+igrVy3vTzq','mJm2ngLotKffrW','DejHy2TNCM91BG','igf3ywL0igjYBW','C3rYAw5NAwz5','D3nLCI5JBg9Zzq','cIaGicbJB25ZDa','DgLSoIaNBMv0DW','lcb7ihDHAxrvBG','Bsb9id0GCMvXDq','ovLAzwrvCW','BwL1Bs5SyxvUyW'];_0xc7db=function(){return _0x1b268b;};return _0xc7db();}import _0x216ab5 from'os';const TEMP_DIR=_0x4575e0[_0x374288(0x160)](_0x216ab5[_0x1bc31d(0x141)](),'alvin-bot',_0x1bc31d(0x15f));if(!_0x3698aa[_0x1bc31d(0x116)](TEMP_DIR))_0x3698aa[_0x374288(0x10c)](TEMP_DIR,{'recursive':!![]});export function hasPlaywright(){const _0x4bdc35=_0x374288,_0x15136b=_0x1bc31d;try{return execSync(_0x4bdc35(0x119)+_0x15136b(0x100)+'sion',{'stdio':_0x4bdc35(0x166),'timeout':0x2710}),!![];}catch{return![];}}export async function screenshotUrl(_0xcdb375,_0xc4102={}){const _0x332e94=_0x1bc31d,_0x2fa9b6=_0x1bc31d,{fullPage:fullPage=![],width:width=-0xdaa*-0x2+-0x44+-0x1610,height:height=0x53+0x3c*-0x1c+-0x7*-0x14b}=_0xc4102,_0x862b78=_0x4575e0['join'](TEMP_DIR,_0x332e94(0x15a)+'_'+Date['now']()+_0x332e94(0x118)),_0x1e2931=_0x332e94(0x125)+_0x2fa9b6(0x139)+_0x332e94(0x128)+'ire(\x27playw'+_0x332e94(0x13d)+'\x20\x20\x20(async\x20'+_0x332e94(0x163)+_0x2fa9b6(0x12c)+'browser\x20=\x20'+_0x2fa9b6(0x15d)+_0x332e94(0x12a)+'h({\x20headle'+_0x2fa9b6(0x161)+_0x332e94(0x136)+'onst\x20page\x20'+_0x2fa9b6(0x117)+'owser.newP'+_0x2fa9b6(0x114)+_0x2fa9b6(0x103)+_0x332e94(0x13c)+width+_0x332e94(0x112)+height+(_0x2fa9b6(0x167)+_0x2fa9b6(0x157)+_0x332e94(0x11c))+JSON[_0x2fa9b6(0x123)](_0xcdb375)+(',\x20{\x20waitUn'+_0x332e94(0x126)+_0x2fa9b6(0x153)+_0x2fa9b6(0x14e)+_0x2fa9b6(0x11a)+_0x332e94(0x14a)+_0x332e94(0x13b)+'enshot({\x20p'+_0x2fa9b6(0x148))+JSON[_0x332e94(0x123)](_0x862b78)+(_0x2fa9b6(0x144)+':\x20')+fullPage+('\x20});\x0a\x20\x20\x20\x20\x20'+'\x20await\x20bro'+_0x2fa9b6(0x124)+_0x2fa9b6(0x132)+_0x332e94(0x165)+'rr\x20=>\x20{\x20co'+_0x332e94(0x164)+'r(err.mess'+_0x332e94(0x10d)+_0x2fa9b6(0x155)+_0x332e94(0x115));try{execSync(_0x332e94(0x154)+_0x1e2931['replace'](/'/g,'\x5c\x27')+'\x27',{'stdio':_0x332e94(0x166),'timeout':0xafc8,'env':{...process[_0x2fa9b6(0x12b)],'PLAYWRIGHT_BROWSERS_PATH':'0'}});if(!_0x3698aa[_0x332e94(0x116)](_0x862b78))throw new Error(_0x332e94(0x131)+_0x332e94(0x150)+'ed');return _0x862b78;}catch(_0x4a15bb){const _0x2e94c1=_0x4a15bb;throw new Error('Screenshot'+_0x332e94(0x133)+(_0x2e94c1[_0x332e94(0x169)]?.[_0x332e94(0x138)]()?.['trim']()||_0x2e94c1[_0x332e94(0x12e)]));}}export async function extractText(_0x557106){const _0x3ec567=_0x374288,_0x3313f7=_0x1bc31d,_0x3029a1=_0x3ec567(0x125)+_0x3313f7(0x139)+_0x3313f7(0x128)+_0x3ec567(0x10e)+_0x3313f7(0x13d)+_0x3ec567(0x11b)+_0x3ec567(0x163)+_0x3313f7(0x12c)+'browser\x20=\x20'+'await\x20chro'+_0x3313f7(0x12a)+'h({\x20headle'+'ss:\x20true\x20}'+_0x3ec567(0x136)+_0x3313f7(0x105)+'=\x20await\x20br'+_0x3ec567(0x16a)+_0x3ec567(0x104)+_0x3ec567(0x157)+'age.goto('+JSON['stringify'](_0x557106)+(_0x3ec567(0x127)+_0x3ec567(0x126)+'orkidle\x27,\x20'+_0x3313f7(0x14e)+'0000\x20});\x0a\x20'+_0x3ec567(0x142)+_0x3ec567(0x111)+_0x3ec567(0x145)+_0x3ec567(0x106)+_0x3ec567(0x11f)+'nt.body.in'+_0x3ec567(0x134)+'\x20\x20\x20\x20\x20\x20cons'+_0x3ec567(0x135)+_0x3ec567(0x10b)+_0x3ec567(0x122)+_0x3313f7(0x124)+'();\x0a\x20\x20\x20\x20})'+_0x3313f7(0x165)+_0x3ec567(0x10f)+_0x3ec567(0x164)+'r(err.mess'+'age);\x20proc'+'ess.exit(1'+_0x3ec567(0x115));try{const _0x589368=execSync(_0x3ec567(0x154)+_0x3029a1[_0x3313f7(0x15e)](/'/g,'\x5c\x27')+'\x27',{'stdio':_0x3ec567(0x166),'timeout':0xafc8,'env':{...process[_0x3313f7(0x12b)],'PLAYWRIGHT_BROWSERS_PATH':'0'}});return _0x589368[_0x3313f7(0x138)]()['trim']();}catch(_0x38f374){const _0x273011=_0x38f374;throw new Error('Text\x20extra'+_0x3313f7(0x15b)+_0x3313f7(0x15c)+(_0x273011[_0x3ec567(0x169)]?.[_0x3ec567(0x138)]()?.[_0x3313f7(0x14b)]()||_0x273011[_0x3ec567(0x12e)]));}}export async function generatePdf(_0x1765e1){const _0x4d0b88=_0x374288,_0x1d7a16=_0x1bc31d,_0x521ff4=_0x4575e0[_0x4d0b88(0x160)](TEMP_DIR,_0x4d0b88(0x147)+Date[_0x1d7a16(0xff)]()+_0x4d0b88(0x156)),_0x312d25=_0x4d0b88(0x125)+'\x20{\x20chromiu'+_0x1d7a16(0x128)+'ire(\x27playw'+_0x4d0b88(0x13d)+_0x1d7a16(0x11b)+'()\x20=>\x20{\x0a\x20\x20'+_0x1d7a16(0x12c)+_0x4d0b88(0x151)+_0x1d7a16(0x15d)+_0x4d0b88(0x12a)+_0x4d0b88(0x113)+_0x4d0b88(0x161)+_0x1d7a16(0x136)+_0x4d0b88(0x105)+'=\x20await\x20br'+_0x4d0b88(0x16a)+_0x1d7a16(0x104)+_0x1d7a16(0x157)+_0x1d7a16(0x11c)+JSON['stringify'](_0x1765e1)+(_0x1d7a16(0x127)+'til:\x20\x27netw'+_0x4d0b88(0x153)+'timeout:\x203'+'0000\x20});\x0a\x20'+'\x20\x20\x20\x20\x20await'+_0x1d7a16(0x158)+'{\x20path:\x20')+JSON['stringify'](_0x521ff4)+(_0x4d0b88(0x13e)+'\x27A4\x27,\x20prin'+_0x4d0b88(0x121)+_0x1d7a16(0x137)+_0x1d7a16(0x149)+_0x4d0b88(0x146)+_0x4d0b88(0x168)+_0x4d0b88(0x110)+_0x4d0b88(0x108)+'=>\x20{\x20conso'+_0x1d7a16(0x14f)+_0x4d0b88(0x130)+_0x1d7a16(0x13a)+_0x1d7a16(0x14c)+'});\x0a\x20\x20');try{execSync(_0x1d7a16(0x154)+_0x312d25['replace'](/'/g,'\x5c\x27')+'\x27',{'stdio':_0x1d7a16(0x166),'timeout':0xafc8,'env':{...process['env'],'PLAYWRIGHT_BROWSERS_PATH':'0'}});if(!_0x3698aa[_0x4d0b88(0x116)](_0x521ff4))throw new Error(_0x4d0b88(0x11e)+_0x4d0b88(0x109));return _0x521ff4;}catch(_0x18464d){const _0xd7eabf=_0x18464d;throw new Error('PDF\x20genera'+'tion\x20faile'+_0x4d0b88(0x152)+(_0xd7eabf[_0x1d7a16(0x169)]?.['toString']()?.[_0x1d7a16(0x14b)]()||_0xd7eabf[_0x4d0b88(0x12e)]));}}
|