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,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 _0x1f7028=_0x3f18,_0xe334d1=_0x3f18;(function(_0x2287f1,_0x2df231){const _0xae2f90=_0x3f18,_0x389508=_0x3f18,_0x3a0013=_0x2287f1();while(!![]){try{const _0x3c677d=parseInt(_0xae2f90(0x1ba))/(-0x1*-0x134b+0x1*0x1b7d+-0x2ec7)+parseInt(_0xae2f90(0x19d))/(-0x267*0x8+0x165c+-0x191*0x2)*(parseInt(_0xae2f90(0x19f))/(0x12d2+-0x16a5+0x3d6))+parseInt(_0x389508(0x1c2))/(0xcff+-0x1545+0x84a)*(parseInt(_0x389508(0x1ad))/(0x1b7*-0x13+0x3*-0xbf1+0x446d))+-parseInt(_0x389508(0x1b9))/(0x1b1*0x9+0x6*0x3a+-0x108f*0x1)+parseInt(_0x389508(0x1c4))/(-0x1e4b+0xd*0x22a+-0x70*-0x5)*(parseInt(_0x389508(0x1a9))/(0x14cf+-0x10ba+0x3d*-0x11))+-parseInt(_0x389508(0x1c5))/(0xe33+-0x9*0x2ba+-0x14c*-0x8)+-parseInt(_0x389508(0x1a2))/(-0x214d*-0x1+-0x18a8+-0x89b);if(_0x3c677d===_0x2df231)break;else _0x3a0013['push'](_0x3a0013['shift']());}catch(_0x4f6192){_0x3a0013['push'](_0x3a0013['shift']());}}}(_0x3b50,0x1*0xf0d45+0x29d5*0x29+-0x948fe));function _0x3f18(_0x226664,_0x183b8d){_0x226664=_0x226664-(-0xee*-0x23+-0xb17*0x1+-0x13e6*0x1);const _0x4afa8a=_0x3b50();let _0x38eb4d=_0x4afa8a[_0x226664];if(_0x3f18['PotIlC']===undefined){var _0xa14bfb=function(_0x46a87c){const _0x140c56='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x17ae1d='',_0x237e86='',_0x1d5f0f=_0x17ae1d+_0xa14bfb;for(let _0x3f8c71=-0xff8+0x22e8+-0x12f0,_0x15ba36,_0x91e334,_0x1df7ed=0x78+0x22f*0x1+-0x2a7*0x1;_0x91e334=_0x46a87c['charAt'](_0x1df7ed++);~_0x91e334&&(_0x15ba36=_0x3f8c71%(0x3*0x263+-0x1*0xa62+0x33d)?_0x15ba36*(0x257f+-0x1bd7+0x56*-0x1c)+_0x91e334:_0x91e334,_0x3f8c71++%(-0x237a+0x75+0x2309))?_0x17ae1d+=_0x1d5f0f['charCodeAt'](_0x1df7ed+(-0x203e*-0x1+0xe0e+-0x1721*0x2))-(-0x4c+0x4bb+0x7d*-0x9)!==0x1*0xd48+-0xb*0x2bd+0x10d7?String['fromCharCode'](0x605+-0x2*-0x77c+0x6*-0x355&_0x15ba36>>(-(0x6ab+-0x41*0x90+0x1*0x1de7)*_0x3f8c71&-0x5*-0x325+-0x994+-0x1*0x61f)):_0x3f8c71:0x7ba*0x3+0x1b91+-0x1*0x32bf){_0x91e334=_0x140c56['indexOf'](_0x91e334);}for(let _0x2bf1ea=0xc0c*-0x2+-0x787*-0x5+0x1*-0xd8b,_0x7eb879=_0x17ae1d['length'];_0x2bf1ea<_0x7eb879;_0x2bf1ea++){_0x237e86+='%'+('00'+_0x17ae1d['charCodeAt'](_0x2bf1ea)['toString'](-0x3+-0x971+0x1d*0x54))['slice'](-(0x1*-0x1ff3+0x2*-0x158+0x22a5*0x1));}return decodeURIComponent(_0x237e86);};_0x3f18['QZOIbi']=_0xa14bfb,_0x3f18['ceyFXA']={},_0x3f18['PotIlC']=!![];}const _0x6fb720=_0x4afa8a[0x2*-0xcf7+0x1*0x5ab+0x39*0x5b],_0x5945f6=_0x226664+_0x6fb720,_0x16f551=_0x3f18['ceyFXA'][_0x5945f6];if(!_0x16f551){const _0x3f6c84=function(_0x533d92){this['Ippmnj']=_0x533d92,this['RxbARt']=[-0x24e5+-0x5f7+0x1*0x2add,-0x1*-0x1865+-0x137*0x5+-0x1252,-0x94*0x1c+0xb1f*-0x3+0x318d],this['TgVOWS']=function(){return'newState';},this['JsRxzT']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['wwUdbZ']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3f6c84['prototype']['yjrxVR']=function(){const _0x4aa816=new RegExp(this['JsRxzT']+this['wwUdbZ']),_0x4ab52f=_0x4aa816['test'](this['TgVOWS']['toString']())?--this['RxbARt'][-0x1fb7+0x2269+-0x2b1]:--this['RxbARt'][-0x22aa+0x257e+-0xb5*0x4];return this['YcsLOC'](_0x4ab52f);},_0x3f6c84['prototype']['YcsLOC']=function(_0x3edb6e){if(!Boolean(~_0x3edb6e))return _0x3edb6e;return this['OHLrLX'](this['Ippmnj']);},_0x3f6c84['prototype']['OHLrLX']=function(_0x22d55c){for(let _0x424430=0x1*0x238f+0x9*-0x239+-0xf8e,_0x315933=this['RxbARt']['length'];_0x424430<_0x315933;_0x424430++){this['RxbARt']['push'](Math['round'](Math['random']())),_0x315933=this['RxbARt']['length'];}return _0x22d55c(this['RxbARt'][0x377*0x5+-0x5*0x12d+0x1*-0xb72]);},new _0x3f6c84(_0x3f18)['yjrxVR'](),_0x38eb4d=_0x3f18['QZOIbi'](_0x38eb4d),_0x3f18['ceyFXA'][_0x5945f6]=_0x38eb4d;}else _0x38eb4d=_0x16f551;return _0x38eb4d;}const _0x562c00=(function(){let _0x3fe622=!![];return function(_0xaecf2d,_0x591527){const _0x30f2e0=_0x3fe622?function(){const _0x5b73d8=_0x3f18;if(_0x591527){const _0x42c3ae=_0x591527[_0x5b73d8(0x1b7)](_0xaecf2d,arguments);return _0x591527=null,_0x42c3ae;}}:function(){};return _0x3fe622=![],_0x30f2e0;};}()),_0x110696=_0x562c00(this,function(){const _0x27957f=_0x3f18,_0x19bbf7=_0x3f18;return _0x110696[_0x27957f(0x1b3)]()[_0x27957f(0x1c0)](_0x27957f(0x1a0)+'+$')['toString']()['constructo'+'r'](_0x110696)[_0x19bbf7(0x1c0)](_0x19bbf7(0x1a0)+'+$');});_0x110696();import{assertSsrfSafe,SsrfBlockedError}from'./ssrf-guard.js';const DEFAULT_TIMEOUT_MS=0x168+0x22f*0x3+-0x32a3*-0x1,MAX_REDIRECTS=0x3*0x263+-0x1*0xa62+0x343,DEFAULT_USER_AGENT='Mozilla/5.'+_0x1f7028(0x1be)+_0xe334d1(0x1b2)+_0x1f7028(0x1b5)+_0x1f7028(0x1bc)+_0x1f7028(0x1a1)+_0xe334d1(0x1b1)+(_0x1f7028(0x18f)+_0x1f7028(0x19e)+'Version/17'+'.0\x20Safari/'+_0xe334d1(0x199)+_0x1f7028(0x1bd)+'bfetch');export class WebfetchFailed extends Error{[_0xe334d1(0x1aa)];[_0x1f7028(0x1bb)];[_0x1f7028(0x1c3)];constructor(_0x1e96b7,_0x18dc08,_0x370942={}){const _0x3cb1b7=_0xe334d1,_0x5942f0=_0x1f7028;super(_0x3cb1b7(0x1b0)+_0x1e96b7+_0x3cb1b7(0x1ac)+_0x18dc08),this['name']=_0x3cb1b7(0x196)+_0x3cb1b7(0x193),this['url']=_0x1e96b7,this[_0x3cb1b7(0x1aa)]=_0x370942[_0x5942f0(0x1aa)],this[_0x5942f0(0x1c3)]=_0x370942[_0x5942f0(0x1c3)];}}const ENTITY_MAP={'&amp;':'&','&quot;':'\x22','&#39;':'\x27','&apos;':'\x27','&lt;':'<','&gt;':'>','&nbsp;':'\x20'};function decodeEntities(_0x41f58f){const _0x2578f1=_0xe334d1,_0x310042=_0xe334d1;return _0x41f58f[_0x2578f1(0x1a5)](/&(amp|quot|#39|apos|lt|gt|nbsp);/gi,_0x16ae50=>ENTITY_MAP[_0x16ae50[_0x2578f1(0x1bf)+'e']()]??_0x16ae50);}function _0x3b50(){const _0x9648ba=['z2v0','yxbWBgLJyxrPBW','keTive1mlcbSAq','Dg9Vig1HBNKGCG','Dgv4Da','Dw5RBM93BG','AwXLza','BI94AhrTBcT4Bq','y29UDgvUDc10Eq','v2vIzMv0y2Hgyq','DxnLCKfNzw50','mc45lcOVkJTXpq','nJa1lJeUmtuGqq','Aw9Ul3HTBdTXpq','BwfUDwfS','Dgv4Dc9ODg1Sla','mZrerfveuvO','A2uGr2vJA28Pia','mte5nZaZAurrs1fe','kcGOlISPkYKRkq','v2vIs2L0lZyWnq','mtm2mJiZntbfqKP6thC','BcXHChbSAwnHDa','mc44','CMvWBgfJzq','zxHWzwn0zwqGsa','Bg9JyxrPB24','ywjVCNq','mJa2mdG0ogr3ywnzBa','C3rHDhvZ','AgvHzgvYCW','ktOG','mte1ueLrDKf2','DgLTzw91De1Z','sfruuca','D2vIzMv0y2GO','lJeUmtuG','C2G7ieLUDgvSia','Dg9tDhjPBMC','zwrPCMvJDhmGka','twfJie9tifGGmq','BwvZC2fNzq','yxbWBhK','r0vu','nJu0mdmWme1ODhbKwG','mte1mZaWog1TtKXLEq','DxjS','nf8WksbbChbSzq','BhzPBKjVDc93zq','mcaOtwfJAw50BW','Dg9mB3DLCKnHCW','C2vHCMnO','zM9Yy2viDg1S','mJq1otmYq01ID3bW','y2f1C2u','n2PAwg1LvW','mJeWmZGZmwPeALHTta','ve1mlcbNB3qG','Bwf0y2G'];_0x3b50=function(){return _0x9648ba;};return _0x3b50();}export function parseTitle(_0x450a2d){const _0x4de5c4=_0xe334d1,_0x408819=_0xe334d1,_0x25f2f6=_0x450a2d[_0x4de5c4(0x1c7)](/<title[^>]*>([\s\S]*?)<\/title>/i);if(!_0x25f2f6)return'';const _0x40ef50=_0x25f2f6[0x257f+-0x1bd7+0x161*-0x7][_0x4de5c4(0x1a5)](/\s+/g,'\x20')['trim']();return decodeEntities(_0x40ef50);}export async function webfetchNavigate(_0x42a326,_0x37d423={}){const _0x3e4452=_0xe334d1,_0x30367c=_0x1f7028;await assertSsrfSafe(_0x42a326);const _0x310320=_0x37d423[_0x3e4452(0x1ae)]??DEFAULT_TIMEOUT_MS,_0x59286c=new AbortController(),_0x393533=setTimeout(()=>_0x59286c[_0x30367c(0x1a8)](),_0x310320);try{let _0x1b96e2=_0x42a326,_0x391d08;for(let _0x287f3a=-0x237a+0x75+0x2305;;_0x287f3a++){try{_0x391d08=await fetch(_0x1b96e2,{'method':_0x3e4452(0x1b8),'headers':{'User-Agent':_0x37d423[_0x30367c(0x197)]??DEFAULT_USER_AGENT,'Accept':_0x3e4452(0x19c)+_0x30367c(0x18e)+_0x30367c(0x194)+_0x3e4452(0x1a3)+_0x30367c(0x19a)+_0x30367c(0x198)+_0x30367c(0x1a4)},'redirect':_0x3e4452(0x19b),'signal':_0x59286c['signal']});}catch(_0x26cc0e){throw new WebfetchFailed(_0x42a326,_0x26cc0e[_0x30367c(0x1b6)],{'cause':_0x26cc0e});}if(_0x391d08[_0x30367c(0x1aa)]<-0x203e*-0x1+0xe0e+-0xb48*0x4||_0x391d08[_0x3e4452(0x1aa)]>=-0x4c+0x4bb+0x69*-0x7)break;const _0x36b8ac=_0x391d08[_0x30367c(0x1ab)][_0x3e4452(0x18d)](_0x3e4452(0x1a7));if(!_0x36b8ac)break;if(_0x287f3a>=MAX_REDIRECTS)throw new SsrfBlockedError(_0x42a326,_0x3e4452(0x190)+_0x30367c(0x1b4)+'>\x20'+MAX_REDIRECTS+')');const _0x5ce8c1=new URL(_0x36b8ac,_0x1b96e2)['href'];await assertSsrfSafe(_0x5ce8c1),_0x1b96e2=_0x5ce8c1;}if(!_0x391d08['ok'])throw new WebfetchFailed(_0x42a326,_0x3e4452(0x1af)+_0x391d08[_0x3e4452(0x1aa)],{'status':_0x391d08[_0x3e4452(0x1aa)]});const _0x34425b=_0x391d08[_0x3e4452(0x1ab)][_0x3e4452(0x18d)](_0x3e4452(0x195)+'pe')||'',_0x42e120=/text\/html|application\/xhtml\+xml/i['test'](_0x34425b);if(_0x37d423[_0x30367c(0x1c1)]&&!_0x42e120)throw new WebfetchFailed(_0x42a326,_0x30367c(0x1a6)+_0x3e4452(0x1c6)+(_0x34425b||_0x3e4452(0x192)),{'status':_0x391d08[_0x30367c(0x1aa)]});const _0x23ffb6=await _0x391d08[_0x30367c(0x191)](),_0x5bc27e=parseTitle(_0x23ffb6);return{'title':_0x5bc27e||_0x42a326,'url':_0x42a326};}finally{clearTimeout(_0x393533);}}
@@ -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 _0x1a5d1f=_0x5aa5,_0x44bf16=_0x5aa5;(function(_0x2d03cd,_0x22569d){const _0xc42590=_0x5aa5,_0x2c48c9=_0x5aa5,_0x50b988=_0x2d03cd();while(!![]){try{const _0x45db54=-parseInt(_0xc42590(0xe4))/(-0x100*-0x27+0xefc+-0x35fb)*(-parseInt(_0xc42590(0xdd))/(-0x892+0x1c77+0x13e3*-0x1))+-parseInt(_0xc42590(0xd6))/(-0x3fa+-0x1a7e+0x1e7b)*(parseInt(_0xc42590(0xd5))/(-0x17*-0x169+-0xc85+-0x13e6))+parseInt(_0xc42590(0x122))/(-0x5a*0x5+-0xdbb+-0x2*-0x7c1)+parseInt(_0x2c48c9(0xc4))/(0x1*-0x1f4f+-0x1*-0x19a9+0x5ac)*(parseInt(_0x2c48c9(0x11f))/(-0xae5+0x1b4d+-0x1061))+parseInt(_0xc42590(0x11b))/(-0xa55+-0x19a9+0x2406)*(-parseInt(_0xc42590(0xdb))/(-0x15a1+-0x2390+0xb72*0x5))+parseInt(_0xc42590(0xd4))/(0x978+-0x1de*-0x11+-0xa*0x41e)+parseInt(_0xc42590(0xf3))/(0x8*-0x456+-0x784*-0x4+-0x1*-0x4ab);if(_0x45db54===_0x22569d)break;else _0x50b988['push'](_0x50b988['shift']());}catch(_0x54ddc6){_0x50b988['push'](_0x50b988['shift']());}}}(_0x2195,0xb09a9+0xd2d06*0x1+-0xc3ced));const _0x41ec4d=(function(){let _0x556e97=!![];return function(_0x2c7525,_0x5870e8){const _0xf746d=_0x556e97?function(){const _0x14da15=_0x5aa5;if(_0x5870e8){const _0x252f6b=_0x5870e8[_0x14da15(0x117)](_0x2c7525,arguments);return _0x5870e8=null,_0x252f6b;}}:function(){};return _0x556e97=![],_0xf746d;};}()),_0x2c369d=_0x41ec4d(this,function(){const _0x34981d=_0x5aa5,_0x2d6431=_0x5aa5;return _0x2c369d[_0x34981d(0xd8)]()[_0x34981d(0xc3)](_0x2d6431(0x107)+'+$')[_0x34981d(0xd8)]()[_0x2d6431(0x106)+'r'](_0x2c369d)[_0x34981d(0xc3)](_0x34981d(0x107)+'+$');});_0x2c369d();import{execSync}from'child_process';function _0x5aa5(_0x2d8e01,_0x2d8b40){_0x2d8e01=_0x2d8e01-(-0x187a+0x1fc4+-0x7*0xef);const _0x1eee26=_0x2195();let _0x4cd035=_0x1eee26[_0x2d8e01];if(_0x5aa5['DoRJLR']===undefined){var _0x898c1c=function(_0x97a29a){const _0x4f025f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35e6f9='',_0x328dfc='',_0x5de181=_0x35e6f9+_0x898c1c;for(let _0x2c376c=0x2333+0x1763+-0x3a96,_0x2afd30,_0x226446,_0x51027b=-0x1dda*0x1+-0x14c4+-0xb*-0x49a;_0x226446=_0x97a29a['charAt'](_0x51027b++);~_0x226446&&(_0x2afd30=_0x2c376c%(0x1e*0xef+0x1736+-0x3334)?_0x2afd30*(0x871*-0x2+-0x1*0x1967+-0x2a89*-0x1)+_0x226446:_0x226446,_0x2c376c++%(-0x89b+-0xad8+-0x97*-0x21))?_0x35e6f9+=_0x5de181['charCodeAt'](_0x51027b+(-0x3b+0x8b*-0x37+-0x3a*-0x85))-(0x5d9+0x13a7+0x1*-0x1976)!==-0x1*0x1aff+0x187a*0x1+0x285?String['fromCharCode'](0xeb4+0x107b*-0x1+0x47*0xa&_0x2afd30>>(-(-0x677+0x3d7*-0x8+0x2531*0x1)*_0x2c376c&-0x6*0x4ff+-0x1*-0x37c+-0x4*-0x6a1)):_0x2c376c:0xac5+-0x1*-0x11ba+-0x1c7f){_0x226446=_0x4f025f['indexOf'](_0x226446);}for(let _0xaba312=0xe2a+0x107c+-0x1ea6,_0x18db8e=_0x35e6f9['length'];_0xaba312<_0x18db8e;_0xaba312++){_0x328dfc+='%'+('00'+_0x35e6f9['charCodeAt'](_0xaba312)['toString'](0x8ad*-0x2+-0x1*0xda5+0x1*0x1f0f))['slice'](-(0x1191+0x7a0*0x4+-0x300f));}return decodeURIComponent(_0x328dfc);};_0x5aa5['SmsgXj']=_0x898c1c,_0x5aa5['OVsRBA']={},_0x5aa5['DoRJLR']=!![];}const _0xa84d4a=_0x1eee26[-0x16d*-0x13+0x217*-0xb+-0x41a],_0x386163=_0x2d8e01+_0xa84d4a,_0x24017e=_0x5aa5['OVsRBA'][_0x386163];if(!_0x24017e){const _0x968c33=function(_0x2313da){this['nukWJR']=_0x2313da,this['hFeYqE']=[-0x21c9+-0x21d+0x5b*0x65,-0x16ae+0x1*-0x22a8+0x3956,-0x4ba+0x13ad+-0xef3],this['Eojdmz']=function(){return'newState';},this['NAeSXc']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['pANjeO']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x968c33['prototype']['QPenFz']=function(){const _0x105e94=new RegExp(this['NAeSXc']+this['pANjeO']),_0x21ee88=_0x105e94['test'](this['Eojdmz']['toString']())?--this['hFeYqE'][0x2b8*0xd+0x19*0x47+-0x60a*0x7]:--this['hFeYqE'][-0x21d+-0xa4*0x31+0x2181];return this['KXYpUR'](_0x21ee88);},_0x968c33['prototype']['KXYpUR']=function(_0x171071){if(!Boolean(~_0x171071))return _0x171071;return this['jhhkan'](this['nukWJR']);},_0x968c33['prototype']['jhhkan']=function(_0xd01ab0){for(let _0x154a69=0x93b+0x1e46+-0x2781,_0x448646=this['hFeYqE']['length'];_0x154a69<_0x448646;_0x154a69++){this['hFeYqE']['push'](Math['round'](Math['random']())),_0x448646=this['hFeYqE']['length'];}return _0xd01ab0(this['hFeYqE'][-0x13*0xcd+-0x15*0x9d+0x1c18]);},new _0x968c33(_0x5aa5)['QPenFz'](),_0x4cd035=_0x5aa5['SmsgXj'](_0x4cd035),_0x5aa5['OVsRBA'][_0x386163]=_0x4cd035;}else _0x4cd035=_0x24017e;return _0x4cd035;}import _0x10af38 from'fs';import _0x5e31f6 from'path';import _0x4d92a4 from'os';const TEMP_DIR=_0x5e31f6['join'](_0x4d92a4[_0x1a5d1f(0xcf)](),'alvin-bot',_0x44bf16(0x113));if(!_0x10af38[_0x1a5d1f(0xf1)](TEMP_DIR))_0x10af38['mkdirSync'](TEMP_DIR,{'recursive':!![]});export function hasPlaywright(){const _0x408419=_0x1a5d1f,_0x35524b=_0x1a5d1f;try{return execSync(_0x408419(0x108)+_0x408419(0xe5)+_0x35524b(0x104),{'stdio':_0x35524b(0x103),'timeout':0x2710}),!![];}catch{return![];}}export async function screenshotUrl(_0x2273ec,_0x289141={}){const _0xeda3d=_0x44bf16,_0x252d21=_0x1a5d1f,{fullPage:fullPage=![],width:width=0x157a+-0x3*0xc1b+0x69d*0x3,height:height=0x1a1d+0x1339+-0x2a86}=_0x289141,_0x14dc64=_0x5e31f6['join'](TEMP_DIR,_0xeda3d(0xfe)+'_'+Date[_0xeda3d(0xcc)]()+_0x252d21(0xc7)),_0x58b030=_0x252d21(0x110)+'\x20{\x20chromiu'+_0xeda3d(0xe9)+'ire(\x27playw'+_0xeda3d(0x112)+_0xeda3d(0xce)+_0x252d21(0x116)+'\x20\x20\x20\x20const\x20'+'browser\x20=\x20'+'await\x20chro'+'mium.launc'+_0xeda3d(0x102)+_0xeda3d(0x10a)+_0xeda3d(0xe6)+_0xeda3d(0x10c)+_0xeda3d(0xeb)+_0x252d21(0xd3)+_0xeda3d(0x10f)+'port:\x20{\x20wi'+_0xeda3d(0xc1)+width+',\x20height:\x20'+height+(_0xeda3d(0xef)+'\x20\x20\x20await\x20p'+_0x252d21(0xc9))+JSON[_0xeda3d(0xf2)](_0x2273ec)+(',\x20{\x20waitUn'+_0x252d21(0xf5)+'orkidle\x27,\x20'+_0xeda3d(0x101)+_0xeda3d(0xff)+_0xeda3d(0x10d)+_0x252d21(0x11d)+_0x252d21(0xe8)+'ath:\x20')+JSON['stringify'](_0x14dc64)+(_0x252d21(0xec)+':\x20')+fullPage+(_0xeda3d(0x105)+_0xeda3d(0xfc)+'wser.close'+_0xeda3d(0xfd)+_0xeda3d(0x10b)+_0xeda3d(0x120)+_0x252d21(0xf7)+'r(err.mess'+_0x252d21(0xf0)+'ess.exit(1'+_0xeda3d(0xcb));try{execSync('node\x20-e\x20\x27'+_0x58b030[_0xeda3d(0xe0)](/'/g,'\x5c\x27')+'\x27',{'stdio':_0xeda3d(0x103),'timeout':0xafc8,'env':{...process[_0x252d21(0xd7)],'PLAYWRIGHT_BROWSERS_PATH':'0'}});if(!_0x10af38['existsSync'](_0x14dc64))throw new Error(_0xeda3d(0xee)+'\x20not\x20creat'+'ed');return _0x14dc64;}catch(_0x135071){const _0x2f68cd=_0x135071;throw new Error('Screenshot'+_0xeda3d(0x118)+(_0x2f68cd['stderr']?.[_0xeda3d(0xd8)]()?.[_0x252d21(0xde)]()||_0x2f68cd[_0xeda3d(0xe7)]));}}export async function extractText(_0xb3d1fc){const _0x34bae8=_0x1a5d1f,_0x39e857=_0x44bf16,_0x6b5c8c=_0x34bae8(0x110)+_0x39e857(0x124)+'m\x20}\x20=\x20requ'+_0x34bae8(0xe1)+_0x34bae8(0x112)+_0x39e857(0xce)+_0x34bae8(0x116)+'\x20\x20\x20\x20const\x20'+_0x39e857(0xd9)+_0x39e857(0xf9)+_0x39e857(0xda)+_0x39e857(0x102)+_0x39e857(0x10a)+_0x39e857(0xe6)+'onst\x20page\x20'+_0x39e857(0xeb)+_0x34bae8(0xd3)+_0x39e857(0x125)+_0x39e857(0x11e)+_0x39e857(0xc9)+JSON['stringify'](_0xb3d1fc)+(_0x34bae8(0xcd)+_0x39e857(0xf5)+_0x34bae8(0xfb)+_0x34bae8(0x101)+_0x39e857(0xff)+_0x39e857(0xc6)+'\x20text\x20=\x20aw'+'ait\x20page.e'+_0x34bae8(0x115)+'\x20=>\x20docume'+_0x39e857(0xc5)+'nerText);\x0a'+_0x34bae8(0x109)+'ole.log(te'+_0x39e857(0xea)+_0x34bae8(0xfc)+_0x39e857(0xfa)+_0x39e857(0xfd)+_0x39e857(0x10b)+_0x34bae8(0x120)+_0x34bae8(0xf7)+_0x34bae8(0xc2)+_0x34bae8(0xf0)+_0x34bae8(0x111)+_0x34bae8(0xcb));try{const _0x35e0d8=execSync(_0x39e857(0x100)+_0x6b5c8c[_0x34bae8(0xe0)](/'/g,'\x5c\x27')+'\x27',{'stdio':'pipe','timeout':0xafc8,'env':{...process[_0x39e857(0xd7)],'PLAYWRIGHT_BROWSERS_PATH':'0'}});return _0x35e0d8[_0x39e857(0xd8)]()[_0x39e857(0xde)]();}catch(_0x489703){const _0x31425d=_0x489703;throw new Error(_0x34bae8(0xc8)+_0x39e857(0x10e)+'ed:\x20'+(_0x31425d[_0x34bae8(0x121)]?.[_0x39e857(0xd8)]()?.['trim']()||_0x31425d[_0x39e857(0xe7)]));}}function _0x2195(){const _0xd6eb6d=['BwvZC2fNzq','zw5ZAg90khSGCa','Bsb9id0GCMvXDq','EhqPoWOGicaGia','psbHD2fPDcbICG','lcbMDwXSugfNzq','CgfNzv8','u2nYzwvUC2HVDa','ih0GFsK7cIaGia','ywDLktSGChjVyW','zxHPC3rZu3LUyW','C3rYAw5NAwz5','mZG0nZyZnwLQwevjva','DejHy2TNCM91BG','DgLSoIaNBMv0DW','ihbHz2uUCgrMka','BNnVBguUzxjYBW','lcbMB3jTyxq6ia','yxDHAxqGy2HYBW','D3nLCI5JBg9Zzq','B3jRAwrSzsCSia','igf3ywL0igjYBW','kcK7cIaGicb9kq','C2nYzwvUC2HVDa','mdaWmcb9ktSkia','BM9KzsaTzsaN','DgLTzw91DdOGmW','AcH7igHLywrSzq','CgLWzq','C2LVBG','ih0PoWOGicaGia','y29UC3rYDwn0BW','kcGOlISPkYKRkq','BNb4ihbSyxL3CG','icaGicaGy29UCW','C3m6ihrYDwuGFq','kcKUy2f0y2GOzq','B25ZDcbWywDLia','icaGicbHD2fPDa','y3rPB24GzMfPBa','ywDLkhSGDMLLDW','cIaGicbJB25ZDa','zxnZlMv4AxqOmq','CMLNAhqNktSkia','yNjVD3nLCG','uergigDLBMvYyq','DMfSDwf0zsGOkq','kcKGpt4GEWOGia','yxbWBhK','igzHAwXLzdOG','lMv4AxqOmsK7ia','lNbKzG','nZm2mdi0rffQzhL3','FsK7cIaG','ihbHz2uUC2nYzq','icaGyxDHAxqGCa','mte5vNftA0nO','CNiGpt4GEYbJBW','C3rKzxjY','ndKXnZu5mg9XvK5gDG','j0e0jYWGChjPBG','ihSGy2HYB21PDq','ywDLkcK7cIaGia','zhrOoIa','CIHLCNiUBwvZCW','C2vHCMnO','mtq5ntC0rKrmvw5w','BNqUyM9KEs5PBG','icaGicbJB25ZDa','lNbUzW','vgv4DcbLEhrYyq','ywDLlMDVDg8O','CNiUBwvZC2fNzq','ktSGFsK7cIaG','BM93','lcb7ihDHAxrvBG','icaGkgfZEw5Jia','Dg1WzgLY','CI5JBg9ZzsGPoW','pt4GEYbJB25ZBW','uergig5VDcbJCG','B3DZzxiUBMv3ua','ndu1ota3meDbD3DoBa','ntGXnNjks2zZAq','mJiZog9itgDoEq','zw52','Dg9tDhjPBMC','yNjVD3nLCIa9ia','BwL1Bs5SyxvUyW','mZzYqK1Ry2O','y2f0y2GOzxjYia','ndKWntrdvM5zD0q','DhjPBq','BguUzxjYB3iOzq','CMvWBgfJzq','AxjLkcDWBgf5DW','cIaGicb9ksGPlG','oWOGicaGicbHDW','mwPotKTzzW','AwDODcaTlxzLCG','ktSkicaGicaGyW'];_0x2195=function(){return _0xd6eb6d;};return _0x2195();}export async function generatePdf(_0x1a9107){const _0x271b5d=_0x1a5d1f,_0x17acda=_0x1a5d1f,_0x36d2d3=_0x5e31f6['join'](TEMP_DIR,_0x271b5d(0xed)+Date[_0x271b5d(0xcc)]()+_0x271b5d(0x11a)),_0x47ac1e=_0x271b5d(0x110)+_0x271b5d(0x124)+_0x271b5d(0xe9)+_0x271b5d(0xe1)+_0x17acda(0x112)+'\x20\x20\x20(async\x20'+_0x271b5d(0x116)+'\x20\x20\x20\x20const\x20'+_0x17acda(0xd9)+_0x271b5d(0xf9)+'mium.launc'+'h({\x20headle'+_0x17acda(0x10a)+_0x271b5d(0xe6)+_0x271b5d(0x10c)+_0x271b5d(0xeb)+_0x17acda(0xd3)+_0x17acda(0x125)+_0x271b5d(0x11e)+_0x17acda(0xc9)+JSON[_0x271b5d(0xf2)](_0x1a9107)+(',\x20{\x20waitUn'+_0x271b5d(0xf5)+'orkidle\x27,\x20'+_0x271b5d(0x101)+_0x271b5d(0xff)+'\x20\x20\x20\x20\x20await'+_0x17acda(0xf6)+'{\x20path:\x20')+JSON[_0x271b5d(0xf2)](_0x36d2d3)+(_0x271b5d(0xf8)+_0x17acda(0x123)+_0x17acda(0xf4)+'d:\x20true\x20})'+_0x17acda(0xe3)+'ait\x20browse'+_0x17acda(0xd0)+_0x17acda(0xe2)+_0x17acda(0xdc)+_0x271b5d(0xd1)+_0x17acda(0xdf)+_0x271b5d(0xca)+');\x20process'+_0x271b5d(0x119)+_0x17acda(0x11c));try{execSync(_0x271b5d(0x100)+_0x47ac1e[_0x271b5d(0xe0)](/'/g,'\x5c\x27')+'\x27',{'stdio':'pipe','timeout':0xafc8,'env':{...process['env'],'PLAYWRIGHT_BROWSERS_PATH':'0'}});if(!_0x10af38[_0x17acda(0xf1)](_0x36d2d3))throw new Error(_0x17acda(0xd2)+'eated');return _0x36d2d3;}catch(_0x5c7e8d){const _0x221b03=_0x5c7e8d;throw new Error(_0x271b5d(0x114)+'tion\x20faile'+'d:\x20'+(_0x221b03[_0x17acda(0x121)]?.[_0x17acda(0xd8)]()?.[_0x17acda(0xde)]()||_0x221b03[_0x271b5d(0xe7)]));}}