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.
Files changed (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  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 -130
  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 -443
  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 -0
  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 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. 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
- "&lt;": "<",
46
- "&gt;": ">",
47
- "&nbsp;": " ",
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={'&amp;':'&','&quot;':'\x22','&#39;':'\x27','&apos;':'\x27','&lt;':'<','&gt;':'>','&nbsp;':'\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();}
@@ -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)]));}}