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,52 +1 @@
1
- /**
2
- * Pure helpers for the /cron run progress ticker.
3
- *
4
- * Separated from commands.ts so the formatting and safety rules can be
5
- * unit-tested without standing up the entire grammy Context. The command
6
- * handler wires these into a setInterval that edits a single Telegram
7
- * message once per tick, giving the user visible proof-of-life during
8
- * long-running (10+ min) cron jobs.
9
- *
10
- * See test/cron-progress-ticker.test.ts for the contract.
11
- */
12
- /** Human-readable elapsed time — adapts unit to magnitude. */
13
- export function formatElapsed(seconds) {
14
- if (seconds < 60)
15
- return `${seconds}s`;
16
- const minutes = Math.floor(seconds / 60);
17
- const remSec = seconds % 60;
18
- if (minutes < 60)
19
- return `${minutes}m ${remSec}s`;
20
- const hours = Math.floor(minutes / 60);
21
- const remMin = minutes % 60;
22
- return `${hours}h ${remMin}m`;
23
- }
24
- /**
25
- * Escape Markdown-breaking characters in untrusted display strings so
26
- * an edit-message call can safely use `parse_mode: Markdown` without
27
- * triggering "can't parse entities" — the exact bug that killed every
28
- * daily-job-alert banner for days.
29
- *
30
- * We use Telegram Markdown (v1) escape rules: only `*`, `_`, `[`, `` ` ``.
31
- * The rest flow through unchanged.
32
- */
33
- export function escapeMarkdown(text) {
34
- return text.replace(/([*_[\]`])/g, "\\$1");
35
- }
36
- /** Intermediate ticker text: "🔄 Running *name* · 2m 5s elapsed…" */
37
- export function buildTickerText(jobName, elapsedSeconds) {
38
- const safe = escapeMarkdown(jobName);
39
- return `🔄 Running *${safe}* · ${formatElapsed(elapsedSeconds)} elapsed…`;
40
- }
41
- /** Final ticker state: "✅ Done — *name* · 13m 17s" (or ❌ / ⏳). */
42
- export function buildDoneText(jobName, elapsedSeconds, outcome) {
43
- const safe = escapeMarkdown(jobName);
44
- if (outcome.skipped) {
45
- return `⏳ *${safe}* is already running — not starting a duplicate`;
46
- }
47
- if (!outcome.ok) {
48
- const errLine = outcome.error ? `\n\n${outcome.error.slice(0, 500)}` : "";
49
- return `❌ *${safe}* — ${formatElapsed(elapsedSeconds)}${errLine}`;
50
- }
51
- return `✅ Done — *${safe}* · ${formatElapsed(elapsedSeconds)}`;
52
- }
1
+ function _0x29c1(){const _0x5ed453=['y29UC3rYDwn0BW','C2XPy2u','zxjYB3i','igvSyxbZzwtIGky','yxbWBhK','kcGOlISPkYKRkq','4O+ZicO','C2vHCMnO','mJqYvxnstfHr','mty5ntiWnufOzKXtvW','kIbPCYbHBhjLyq','CMvWBgfJzq','4P2micO','kIdcTYa','xcqX','mZi1nda4nujzv2DxqW','ntC0nZq4mfjpzujSuq','C2TPChbLza','Dg9tDhjPBMC','iokaLcbUB3qGC3rH','mtyXnZLdDKPABfa','mtjZwffNtg0','CNrPBMCGysbKDq','mJqZntCYr2X3u1HX','nda4ndiXnMnpzLrIvG','mtGWmxDhuMDnEa','ngH0BeLHtW','kIdIGjqG','4PYfierVBMuG4OcuicO'];_0x29c1=function(){return _0x5ed453;};return _0x29c1();}function _0xb451(_0x887b0e,_0x32ffb0){_0x887b0e=_0x887b0e-(0x287*0x2+-0x1*-0x21d9+-0x25aa);const _0x14e161=_0x29c1();let _0x4d0b64=_0x14e161[_0x887b0e];if(_0xb451['nGrCZH']===undefined){var _0x3ede77=function(_0x79f9d6){const _0x43515f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x32250c='',_0xa6ab86='',_0x51ab63=_0x32250c+_0x3ede77;for(let _0x313f9f=-0x1*-0x825+-0x2dc+-0x549,_0x359696,_0x496ccf,_0x23a1e8=0x1*-0xbcb+-0x76b+0x1336;_0x496ccf=_0x79f9d6['charAt'](_0x23a1e8++);~_0x496ccf&&(_0x359696=_0x313f9f%(0x1252+-0x25a1+0x1353)?_0x359696*(0x16fa+0x5ba+-0x1c74)+_0x496ccf:_0x496ccf,_0x313f9f++%(0x70e+0x1c*-0x1a+0x166*-0x3))?_0x32250c+=_0x51ab63['charCodeAt'](_0x23a1e8+(0xd0d+-0x377*-0x1+-0x107a))-(0x43*-0x89+-0x18fb*0x1+0x3ce0)!==0x40a*-0x7+0x2627*0x1+-0x9e1?String['fromCharCode'](0x1c26*-0x1+0x1c*0x22+0x196d&_0x359696>>(-(0x1*0x253f+-0x953+-0x1bea)*_0x313f9f&-0x36d+-0x69d*0x2+0x10ad)):_0x313f9f:-0x1a78+-0x1d4d+0x3*0x1297){_0x496ccf=_0x43515f['indexOf'](_0x496ccf);}for(let _0x507cea=0x15c8+-0x11ee+-0x1*0x3da,_0x307c73=_0x32250c['length'];_0x507cea<_0x307c73;_0x507cea++){_0xa6ab86+='%'+('00'+_0x32250c['charCodeAt'](_0x507cea)['toString'](0x3a1*0x8+0x1490+-0x4*0xc62))['slice'](-(0x14bc+-0x90c+-0xbae));}return decodeURIComponent(_0xa6ab86);};_0xb451['oyMDEr']=_0x3ede77,_0xb451['biwfYb']={},_0xb451['nGrCZH']=!![];}const _0x5bb965=_0x14e161[-0x2fc*0x2+-0x1*-0x995+-0x5*0xb9],_0x5c820f=_0x887b0e+_0x5bb965,_0x34aec4=_0xb451['biwfYb'][_0x5c820f];if(!_0x34aec4){const _0x5d7367=function(_0xd4aa8c){this['bLVVaB']=_0xd4aa8c,this['ZQfMHA']=[0x1a7d*0x1+-0x5*-0x393+0x2c5b*-0x1,-0x1579+0x16f5+-0x17c,0x1*0xcd9+-0x262f+0x1956],this['GJYtIq']=function(){return'newState';},this['BgEVtU']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['tbsYbx']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5d7367['prototype']['QFGoje']=function(){const _0x3223a3=new RegExp(this['BgEVtU']+this['tbsYbx']),_0x4daed2=_0x3223a3['test'](this['GJYtIq']['toString']())?--this['ZQfMHA'][-0x8*-0x21e+0x8f*0x31+-0x2c4e]:--this['ZQfMHA'][-0x47*-0x3f+-0x13ab+0x232*0x1];return this['ioNRzi'](_0x4daed2);},_0x5d7367['prototype']['ioNRzi']=function(_0x36e02d){if(!Boolean(~_0x36e02d))return _0x36e02d;return this['jXtBac'](this['bLVVaB']);},_0x5d7367['prototype']['jXtBac']=function(_0x21431d){for(let _0x51fd0c=-0x3b0*0x4+-0x22fe*0x1+0x1*0x31be,_0xa8a076=this['ZQfMHA']['length'];_0x51fd0c<_0xa8a076;_0x51fd0c++){this['ZQfMHA']['push'](Math['round'](Math['random']())),_0xa8a076=this['ZQfMHA']['length'];}return _0x21431d(this['ZQfMHA'][0x24ca+0x7*0x4d0+0xba*-0x61]);},new _0x5d7367(_0xb451)['QFGoje'](),_0x4d0b64=_0xb451['oyMDEr'](_0x4d0b64),_0xb451['biwfYb'][_0x5c820f]=_0x4d0b64;}else _0x4d0b64=_0x34aec4;return _0x4d0b64;}(function(_0x40930e,_0x2cf2ab){const _0x333565=_0xb451,_0x4f9633=_0xb451,_0x2bb145=_0x40930e();while(!![]){try{const _0x35df63=parseInt(_0x333565(0x149))/(0x2*0x638+0x2414+0x1*-0x3083)*(-parseInt(_0x4f9633(0x155))/(0x1*-0x1e8a+-0x1*-0x1bd7+0x1*0x2b5))+-parseInt(_0x333565(0x144))/(0x12bf*0x2+-0xf*0x1e1+-0xee*0xa)+-parseInt(_0x333565(0x14a))/(-0x16f5+-0x2*-0x2cc+0x1161*0x1)*(-parseInt(_0x333565(0x156))/(0x15*-0x113+0x1*0x23c9+-0xd35))+-parseInt(_0x333565(0x145))/(-0x1290+0x25a1+0x3*-0x659)*(parseInt(_0x4f9633(0x147))/(0x1*-0x17+-0x1*-0x998+-0x97a))+parseInt(_0x4f9633(0x148))/(-0x3df*-0x1+-0xd*0x2b7+0x1f74)+parseInt(_0x4f9633(0x13f))/(-0x2*-0x67b+-0x1*-0x210b+-0x8*0x5bf)+-parseInt(_0x4f9633(0x140))/(0x3*0x224+0x36*0x89+-0x4*0x8d2);if(_0x35df63===_0x2cf2ab)break;else _0x2bb145['push'](_0x2bb145['shift']());}catch(_0x4d45c6){_0x2bb145['push'](_0x2bb145['shift']());}}}(_0x29c1,0x3*0x2ed9b+0x25*-0x14d5+-0x8851));const _0x5c32ef=(function(){let _0x5d2592=!![];return function(_0x244f45,_0x32c091){const _0x3b1191=_0x5d2592?function(){const _0x13f341=_0xb451;if(_0x32c091){const _0x26fd30=_0x32c091[_0x13f341(0x151)](_0x244f45,arguments);return _0x32c091=null,_0x26fd30;}}:function(){};return _0x5d2592=![],_0x3b1191;};}()),_0x501655=_0x5c32ef(this,function(){const _0xd5ac5c=_0xb451,_0x53bfb5=_0xb451;return _0x501655[_0xd5ac5c(0x142)]()[_0xd5ac5c(0x154)](_0xd5ac5c(0x152)+'+$')['toString']()[_0xd5ac5c(0x14d)+'r'](_0x501655)[_0x53bfb5(0x154)](_0xd5ac5c(0x152)+'+$');});_0x501655();export function formatElapsed(_0x281de7){if(_0x281de7<0x1*-0xbcb+-0x76b+0x1372)return _0x281de7+'s';const _0x2b81e0=Math['floor'](_0x281de7/(0x1252+-0x25a1+0x138b)),_0x1f8b5e=_0x281de7%(0x16fa+0x5ba+-0x1c78);if(_0x2b81e0<0x70e+0x1c*-0x1a+0x1fd*-0x2)return _0x2b81e0+'m\x20'+_0x1f8b5e+'s';const _0x23a318=Math['floor'](_0x2b81e0/(0xd0d+-0x377*-0x1+-0x1048)),_0x40153a=_0x2b81e0%(0x43*-0x89+-0x18fb*0x1+0x3d12);return _0x23a318+'h\x20'+_0x40153a+'m';}export function escapeMarkdown(_0x174f13){const _0x8d20ac=_0xb451,_0x64a8ca=_0xb451;return _0x174f13[_0x8d20ac(0x158)](/([*_[\]`])/g,_0x64a8ca(0x13e));}export function buildTickerText(_0x203af3,_0xf62575){const _0x2e90ea=_0xb451,_0x58bc1a=_0xb451,_0xbed668=escapeMarkdown(_0x203af3);return'🔄\x20Running\x20'+'*'+_0xbed668+_0x2e90ea(0x13d)+formatElapsed(_0xf62575)+_0x2e90ea(0x150);}export function buildDoneText(_0x2df4c3,_0x1854fb,_0x4e34ab){const _0x32d0a8=_0xb451,_0x3a1567=_0xb451,_0x3d7432=escapeMarkdown(_0x2df4c3);if(_0x4e34ab[_0x32d0a8(0x141)])return _0x3a1567(0x153)+_0x3d7432+(_0x32d0a8(0x157)+'dy\x20running'+_0x32d0a8(0x143)+_0x32d0a8(0x146)+'plicate');if(!_0x4e34ab['ok']){const _0x4a455e=_0x4e34ab[_0x3a1567(0x14f)]?'\x0a\x0a'+_0x4e34ab[_0x3a1567(0x14f)][_0x32d0a8(0x14e)](0x40a*-0x7+0x2627*0x1+-0x9e1,0x1c26*-0x1+0x1c*0x22+0x1a62):'';return _0x32d0a8(0x159)+_0x3d7432+_0x3a1567(0x14b)+formatElapsed(_0x1854fb)+_0x4a455e;}return _0x32d0a8(0x14c)+_0x3d7432+_0x3a1567(0x13d)+formatElapsed(_0x1854fb);}
@@ -1,194 +1 @@
1
- import { InputFile } from "grammy";
2
- import fs from "fs";
3
- import path from "path";
4
- import os from "os";
5
- import https from "https";
6
- import { config } from "../config.js";
7
- import { getSession, addToHistory } from "../services/session.js";
8
- import { TelegramStreamer } from "../services/telegram.js";
9
- import { getRegistry } from "../engine.js";
10
- import { textToSpeech } from "../services/voice.js";
11
- import { buildSystemPrompt } from "../services/personality.js";
12
- const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot");
13
- if (!fs.existsSync(TEMP_DIR))
14
- fs.mkdirSync(TEMP_DIR, { recursive: true });
15
- /** React to a message with an emoji. Silently fails if not supported. */
16
- async function react(ctx, emoji) {
17
- try {
18
- await ctx.react(emoji);
19
- }
20
- catch { /* ignore */ }
21
- }
22
- async function downloadFile(url, dest) {
23
- return new Promise((resolve, reject) => {
24
- const file = fs.createWriteStream(dest);
25
- https.get(url, (response) => {
26
- response.pipe(file);
27
- file.on("finish", () => file.close(() => resolve()));
28
- }).on("error", (err) => {
29
- fs.unlink(dest, () => { });
30
- reject(err);
31
- });
32
- });
33
- }
34
- // File types we can handle
35
- const SUPPORTED_EXTENSIONS = new Set([
36
- ".pdf", ".txt", ".md", ".csv", ".json", ".xml", ".html", ".htm",
37
- ".doc", ".docx", ".xls", ".xlsx", ".pptx",
38
- ".py", ".js", ".ts", ".jsx", ".tsx", ".java", ".c", ".cpp", ".h",
39
- ".rs", ".go", ".rb", ".php", ".sh", ".bash", ".zsh",
40
- ".yaml", ".yml", ".toml", ".ini", ".conf", ".cfg",
41
- ".log", ".sql", ".env", ".gitignore", ".dockerfile",
42
- ]);
43
- function isSupportedFile(filename) {
44
- const ext = path.extname(filename).toLowerCase();
45
- return SUPPORTED_EXTENSIONS.has(ext);
46
- }
47
- export async function handleDocument(ctx) {
48
- const doc = ctx.message?.document;
49
- if (!doc)
50
- return;
51
- const userId = ctx.from.id;
52
- const session = getSession(userId);
53
- if (session.isProcessing) {
54
- await ctx.reply("Please wait, previous request still running... (/cancel to abort)");
55
- return;
56
- }
57
- const filename = doc.file_name || "unknown";
58
- const ext = path.extname(filename).toLowerCase();
59
- // Check file size (Telegram max is 20MB for bots)
60
- if (doc.file_size && doc.file_size > 20 * 1024 * 1024) {
61
- await ctx.reply("⚠️ File too large (max 20 MB).");
62
- return;
63
- }
64
- session.isProcessing = true;
65
- session.abortController = new AbortController();
66
- const streamer = new TelegramStreamer(ctx.chat.id, ctx.api, ctx.message?.message_id);
67
- let finalText = "";
68
- const typingInterval = setInterval(() => {
69
- ctx.api.sendChatAction(ctx.chat.id, "typing").catch(() => { });
70
- }, 4000);
71
- try {
72
- await react(ctx, "📄");
73
- await ctx.api.sendChatAction(ctx.chat.id, "typing");
74
- // Download the file
75
- const file = await ctx.api.getFile(doc.file_id);
76
- const fileUrl = `https://api.telegram.org/file/bot${config.botToken}/${file.file_path}`;
77
- // H2: strip any path components from the attacker-controlled file_name
78
- // to prevent writing outside TEMP_DIR (e.g. file_name="../../../x").
79
- const safeFilename = path.basename(filename);
80
- const localPath = path.join(TEMP_DIR, `doc_${Date.now()}_${safeFilename}`);
81
- // Containment assertion: resolved path must stay inside TEMP_DIR.
82
- if (!path.resolve(localPath).startsWith(path.resolve(TEMP_DIR))) {
83
- throw new Error("File path containment violation");
84
- }
85
- await downloadFile(fileUrl, localPath);
86
- const caption = ctx.message?.caption || "";
87
- const userInstruction = caption || `Analysiere diese Datei: ${filename}`;
88
- session.messageCount++;
89
- const registry = getRegistry();
90
- const activeProvider = registry.getActive();
91
- const isSDK = activeProvider.config.type === "claude-sdk";
92
- let queryOpts;
93
- if (isSDK) {
94
- // SDK provider: pass file path — Claude can read files natively
95
- queryOpts = {
96
- prompt: `Der User hat eine Datei gesendet: ${localPath}\nDateiname: ${filename}\n\nLies die Datei mit dem Read-Tool und bearbeite folgende Anfrage:\n${userInstruction}`,
97
- systemPrompt: buildSystemPrompt(true, session.language),
98
- workingDir: session.workingDir,
99
- effort: session.effort,
100
- abortSignal: session.abortController.signal,
101
- sessionId: session.sessionId,
102
- _sessionState: {
103
- messageCount: session.messageCount,
104
- toolUseCount: session.toolUseCount,
105
- },
106
- };
107
- }
108
- else {
109
- // Non-SDK: try to extract text content and include in prompt
110
- let fileContent = "";
111
- if ([".txt", ".md", ".csv", ".json", ".xml", ".html", ".htm",
112
- ".py", ".js", ".ts", ".jsx", ".tsx", ".java", ".c", ".cpp", ".h",
113
- ".rs", ".go", ".rb", ".php", ".sh", ".bash", ".zsh",
114
- ".yaml", ".yml", ".toml", ".ini", ".conf", ".cfg",
115
- ".log", ".sql", ".env", ".gitignore", ".dockerfile"].includes(ext)) {
116
- // Plain text files — read directly
117
- fileContent = fs.readFileSync(localPath, "utf-8");
118
- // Truncate very large files
119
- if (fileContent.length > 50000) {
120
- fileContent = fileContent.slice(0, 50000) + "\n\n[... File truncated, total " + fileContent.length + " characters]";
121
- }
122
- }
123
- else {
124
- fileContent = `[Binary file: ${filename}, ${doc.file_size ? Math.round(doc.file_size / 1024) + " KB" : "unknown size"}. Can only be analyzed with the SDK provider (Claude).]`;
125
- }
126
- const fullPrompt = `Datei: ${filename}\n\n\`\`\`\n${fileContent}\n\`\`\`\n\n${userInstruction}`;
127
- addToHistory(userId, { role: "user", content: fullPrompt });
128
- queryOpts = {
129
- prompt: fullPrompt,
130
- systemPrompt: buildSystemPrompt(false, session.language),
131
- workingDir: session.workingDir,
132
- effort: session.effort,
133
- abortSignal: session.abortController.signal,
134
- history: session.history,
135
- };
136
- }
137
- for await (const chunk of registry.queryWithFallback(queryOpts)) {
138
- switch (chunk.type) {
139
- case "text":
140
- finalText = chunk.text || "";
141
- await streamer.update(finalText);
142
- break;
143
- case "tool_use":
144
- if (chunk.toolName)
145
- session.toolUseCount++;
146
- break;
147
- case "done":
148
- if (chunk.sessionId)
149
- session.sessionId = chunk.sessionId;
150
- if (chunk.costUsd)
151
- session.totalCost += chunk.costUsd;
152
- session.lastActivity = Date.now();
153
- break;
154
- case "error":
155
- await ctx.reply(`Error: ${chunk.error}`);
156
- break;
157
- }
158
- }
159
- await streamer.finalize(finalText);
160
- await react(ctx, "👍");
161
- if (!isSDK && finalText) {
162
- addToHistory(userId, { role: "assistant", content: finalText });
163
- }
164
- // Voice reply if enabled
165
- if (session.voiceReply && finalText.trim()) {
166
- try {
167
- await ctx.api.sendChatAction(ctx.chat.id, "upload_voice");
168
- const audioPath = await textToSpeech(finalText);
169
- await ctx.replyWithVoice(new InputFile(fs.readFileSync(audioPath), "response.mp3"));
170
- fs.unlink(audioPath, () => { });
171
- }
172
- catch (err) {
173
- console.error("TTS error:", err);
174
- }
175
- }
176
- // Clean up temp file after a delay (SDK might still need it)
177
- setTimeout(() => fs.unlink(localPath, () => { }), 60000);
178
- }
179
- catch (err) {
180
- const errorMsg = err instanceof Error ? err.message : String(err);
181
- await react(ctx, "👎");
182
- if (errorMsg.includes("abort")) {
183
- await ctx.reply("Anfrage abgebrochen.");
184
- }
185
- else {
186
- await ctx.reply(`Error: ${errorMsg}`);
187
- }
188
- }
189
- finally {
190
- clearInterval(typingInterval);
191
- session.isProcessing = false;
192
- session.abortController = null;
193
- }
194
- }
1
+ const _0x14ab64=_0x7faa,_0xf86e83=_0x7faa;(function(_0x44a3dd,_0x21fa29){const _0x3ffc21=_0x7faa,_0x4d294d=_0x7faa,_0x438f4f=_0x44a3dd();while(!![]){try{const _0x4d7d17=-parseInt(_0x3ffc21(0x219))/(-0x4*-0x704+0x1c42*-0x1+-0x3*-0x11)+-parseInt(_0x3ffc21(0x1f1))/(0x1bfb+0x1831*-0x1+-0x3c8)*(parseInt(_0x4d294d(0x226))/(-0x857*-0x3+-0x1*-0x171f+0x14d*-0x25))+-parseInt(_0x3ffc21(0x1fb))/(0x1f58+0x2615+-0x4569)*(-parseInt(_0x3ffc21(0x1e9))/(0x1f64+-0x15a5+0x4dd*-0x2))+-parseInt(_0x3ffc21(0x1ca))/(0xae7*-0x1+0xde8+-0x2fb)+-parseInt(_0x3ffc21(0x23e))/(0x6*0x2e3+0x161*-0x3+-0xd28)+-parseInt(_0x3ffc21(0x21e))/(0x27*-0xe0+-0xefe*-0x1+0x132a)*(parseInt(_0x4d294d(0x1b2))/(-0x26ea+0x1a74+0xc7f))+parseInt(_0x3ffc21(0x221))/(-0x14*-0x1e8+-0x416+-0x2200);if(_0x4d7d17===_0x21fa29)break;else _0x438f4f['push'](_0x438f4f['shift']());}catch(_0x27fc42){_0x438f4f['push'](_0x438f4f['shift']());}}}(_0x1e92,0x49386+-0x12cb6+0x2956f));const _0x3ea78c=(function(){let _0x18c9e2=!![];return function(_0x17cfa1,_0x206c42){const _0x2e6a3b=_0x18c9e2?function(){const _0x2ab490=_0x7faa;if(_0x206c42){const _0x15e322=_0x206c42[_0x2ab490(0x228)](_0x17cfa1,arguments);return _0x206c42=null,_0x15e322;}}:function(){};return _0x18c9e2=![],_0x2e6a3b;};}()),_0x316cf2=_0x3ea78c(this,function(){const _0x194782=_0x7faa,_0x543d6a=_0x7faa;return _0x316cf2[_0x194782(0x1fe)]()[_0x543d6a(0x1a9)]('(((.+)+)+)'+'+$')[_0x194782(0x1fe)]()[_0x543d6a(0x239)+'r'](_0x316cf2)[_0x543d6a(0x1a9)]('(((.+)+)+)'+'+$');});_0x316cf2();import{InputFile}from'grammy';import _0x13fb69 from'fs';import _0x40f9f8 from'path';import _0x408e8e from'os';import _0x38b302 from'https';import{config}from'../config.js';import{getSession,addToHistory}from'../services/session.js';function _0x1e92(){const _0x43d0cb=['DhLWzq','yw5JzwWGDg8Gyq','m0PezwP3AG','zMLUywXPEMu','yxbWBhK','zMLSzv9Uyw1L','y2XVC2u','zMLSzv9WyxrO','yM90vg9Rzw4','CgLWzq','zcWGDg90ywWG','DgvPigDLC2vUza','DgLVBG','CMvHzezPBgvtEq','DcWGChjLDMLVDq','igrLBsbszwfKlq','Dw5RBM93BIbZAq','y2fWDgLVBG','zg9JxW','vg9VBcb1BMqGyG','cKrHDgvPBMfTzq','y29UC3rYDwn0BW','lNnXBa','lNnO','lM1K','lMvUDG','nZK0oduWD09UyLHi','yM90','AxnqCM9JzxnZAq','zxH0BMfTzq','yxnZAxn0yw50','lNrZEa','lNjI','zMLSzv9ZAxPL','lNb5','lMPZEa','zsb0CNvUy2f0zq','Ahr0Chm6lY9HCa','C2vZC2LVBKLK','lNLHBwW','C2vHCMnO','DxbSB2fKx3zVAq','lNbKzG','zg9Uzq','zNjVBq','lMnWCa','igXHCMDLicHTyq','zguPlL0','y2XHDwrLlxnKAW','nZq0mdnhse94twu','AgfZ','CMvZB2X2zq','y29ZDfvZza','CMvZCg9UC2uUBq','lNHTBa','lMPHDMe','yM9YDcK','lMjHC2G','C2vUzenOyxrbyW','CYbYzxf1zxn0ia','lNrVBwW','DxrMltG','D29YA2LUz0rPCG','C3rPBgWGCNvUBG','ugXLyxnLihDHAq','CMvHy3q','lMPZB24','ywjVCNq','lMH0Bq','ieTc','lIbdyw4GB25SEq','ywX2Aw4TyM90','rgf0zwK6ia','nduZmdmXogHwsg5Lta','ignOyxjHy3rLCG','BM93','y2HHDa','B2XSzxi','Dw5SAw5R','Dg9VBe5HBwu','Dg9VBf91C2u','igjLigfUywX5EG','ierHDgvPig1PDa','zg9JDw1LBNq','lNbOCa','lNjZ','qw5MCMfNzsbHyG','cMbGyaOk','rMLSzsbWyxrOia','C2LNBMfS','z2v0','lMH0BwW','yxbP','Dg1WzgLY','ywXSyMfJAW','Dw5RBM93BG','lMLUAq','lNHSCW','yMfZzw5HBwu','B2LJzq','lMrVy2TLCMzPBa','BgfUz3vHz2u','cGPGygak','y3jLyxrLv3jPDa','mZCXndCXnwf4qLLSAa','BgfZDefJDgL2Aq','C2XPy2u','As50zwXLz3jHBq','zxHPC3rZu3LUyW','DxnLCG','BwvZC2fNzq','rgvYifvZzxiGAa','mJu4mJC4whH6BwPY','zwK6ia','DhLWAw5N','w0jPBMfYEsbMAq','CMvWBhK','Dg9mB3DLCKnHCW','lMrVy3G','lNr4Da','zsbtreSGChjVDG','lNrZ','nfPgzuvwCW','BgvUz3rO','Dgv4Da','Dg9tDhjPBMC','BwTKAxjtEw5J','lNPZAa','cGPmAwvZigrPzq','lMnMzW','y29UzMLN','vfrtigvYCM9YoG','Bgu6ia','zxjYB3i','lMPZ','igrPzxnLierHDa','4PQG77IpiezPBguGDg9V','CMvWBhLxAxrOvG','lNLTBa','lMnZDG','Aw5NlI4UicGVyW','CxvLCNLxAxrOrG','Dg9VBfvZzunVDq','rxjYB3i6ia','Dg90ywXdB3n0','lMDV','zNjHz2u6cG','Aw5JBhvKzxm','CM91BMq','AM9PBG','y29UDgfPBM1LBG','z2vICM9JAgvUlG','mtiZmte4u055AMPy','ywjVCNrdB250CG','y2f0y2G','zwfYyMvPDguGzG','zwzMB3j0','mJe2wMDKvhLO','lM9YzY9MAwXLlW','Dcb2Aw9SyxrPBW','otKZmZGXmhnUzLHeCa','AgLZDg9YEq','lNHSC3G'];_0x1e92=function(){return _0x43d0cb;};return _0x1e92();}import{TelegramStreamer}from'../services/telegram.js';import{getRegistry}from'../engine.js';import{textToSpeech}from'../services/voice.js';import{buildSystemPrompt}from'../services/personality.js';const TEMP_DIR=_0x40f9f8[_0x14ab64(0x216)](_0x408e8e[_0x14ab64(0x1de)](),_0xf86e83(0x1c8));if(!_0x13fb69[_0x14ab64(0x1ed)](TEMP_DIR))_0x13fb69[_0x14ab64(0x1ff)](TEMP_DIR,{'recursive':!![]});async function react(_0x5e81a9,_0x48e15f){const _0x9f273d=_0x14ab64;try{await _0x5e81a9[_0x9f273d(0x1c2)](_0x48e15f);}catch{}}async function downloadFile(_0x3d7b8e,_0x386e8b){return new Promise((_0x83b955,_0x17670f)=>{const _0x15400c=_0x7faa,_0x394562=_0x7faa,_0x45af20=_0x13fb69[_0x15400c(0x1e8)+'eStream'](_0x386e8b);_0x38b302[_0x394562(0x1db)](_0x3d7b8e,_0x5a5f56=>{const _0x67b6e9=_0x394562,_0x470380=_0x15400c;_0x5a5f56[_0x67b6e9(0x22d)](_0x45af20),_0x45af20['on']('finish',()=>_0x45af20[_0x67b6e9(0x22a)](()=>_0x83b955()));})['on'](_0x15400c(0x206),_0x4c20a1=>{const _0x44b07=_0x394562;_0x13fb69[_0x44b07(0x1cf)](_0x386e8b,()=>{}),_0x17670f(_0x4c20a1);});});}function _0x7faa(_0x8d9ae5,_0x383f23){_0x8d9ae5=_0x8d9ae5-(0xde9+0x21*0xf5+-0x2be1);const _0x57004f=_0x1e92();let _0x22820e=_0x57004f[_0x8d9ae5];if(_0x7faa['aHiTkW']===undefined){var _0xc1c3c=function(_0x147b30){const _0xe79c5b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xcde047='',_0x57ad39='',_0x3d7dac=_0xcde047+_0xc1c3c;for(let _0x192aaa=-0x2089+0x1*0xb7f+-0xa85*-0x2,_0x7e51fe,_0x43e30b,_0x29acd1=-0x9*-0x10c+0x1*0x1f8a+-0xe*0x2ed;_0x43e30b=_0x147b30['charAt'](_0x29acd1++);~_0x43e30b&&(_0x7e51fe=_0x192aaa%(0x1aa5+0x2696+-0x4137)?_0x7e51fe*(0x135e+-0xfc0+-0x35e)+_0x43e30b:_0x43e30b,_0x192aaa++%(-0x1d2c+0xd6f+0xfc1))?_0xcde047+=_0x3d7dac['charCodeAt'](_0x29acd1+(0x1*0x1e52+-0x1215*0x1+0x15b*-0x9))-(-0x12c9+0x6b*-0x1f+0x1fc8)!==-0x2487+0x2001+0x486*0x1?String['fromCharCode'](0x1818+0x9*0x221+-0xe16*0x3&_0x7e51fe>>(-(0x1d14+0xf*-0xd4+-0x10a6)*_0x192aaa&0x3*-0x791+0xe2a+0x88f)):_0x192aaa:-0xc82+0x59*-0x3+0x1*0xd8d){_0x43e30b=_0xe79c5b['indexOf'](_0x43e30b);}for(let _0x4af4b4=0x2054*-0x1+-0x13e6*0x1+-0x2*-0x1a1d,_0x192927=_0xcde047['length'];_0x4af4b4<_0x192927;_0x4af4b4++){_0x57ad39+='%'+('00'+_0xcde047['charCodeAt'](_0x4af4b4)['toString'](0x17*0x6b+0x22*0x5b+-0x15a3))['slice'](-(-0x1a07+-0x755*0x5+0x3eb2));}return decodeURIComponent(_0x57ad39);};_0x7faa['TarvUh']=_0xc1c3c,_0x7faa['sfLvUr']={},_0x7faa['aHiTkW']=!![];}const _0x2b83c4=_0x57004f[0x1*0x1dd1+0xb0f*0x3+-0x1*0x3efe],_0x32cb6f=_0x8d9ae5+_0x2b83c4,_0x5c7c31=_0x7faa['sfLvUr'][_0x32cb6f];if(!_0x5c7c31){const _0x30c92a=function(_0x5a6499){this['JrOjxd']=_0x5a6499,this['XFslvV']=[-0x1ad7+-0xf19+0x29f1,-0x621*0x1+-0x66e+0xc8f,-0x1d4d+-0x7*-0x4d+0x1b32],this['YmtxBp']=function(){return'newState';},this['xQhRjn']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['LTbMIr']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x30c92a['prototype']['zSXqus']=function(){const _0x3cc87b=new RegExp(this['xQhRjn']+this['LTbMIr']),_0x5e4a60=_0x3cc87b['test'](this['YmtxBp']['toString']())?--this['XFslvV'][-0x443+0x20b3+0xfb*-0x1d]:--this['XFslvV'][-0x28b+0xc9c*-0x2+0x1bc3];return this['ZCCinS'](_0x5e4a60);},_0x30c92a['prototype']['ZCCinS']=function(_0xc91e93){if(!Boolean(~_0xc91e93))return _0xc91e93;return this['OVZlYd'](this['JrOjxd']);},_0x30c92a['prototype']['OVZlYd']=function(_0x5f73a6){for(let _0x5295bc=-0x93+-0x1461+0x3*0x6fc,_0x2cd30d=this['XFslvV']['length'];_0x5295bc<_0x2cd30d;_0x5295bc++){this['XFslvV']['push'](Math['round'](Math['random']())),_0x2cd30d=this['XFslvV']['length'];}return _0x5f73a6(this['XFslvV'][-0x1fdf+-0x192d+0x3*0x1304]);},new _0x30c92a(_0x7faa)['zSXqus'](),_0x22820e=_0x7faa['TarvUh'](_0x22820e),_0x7faa['sfLvUr'][_0x32cb6f]=_0x22820e;}else _0x22820e=_0x5c7c31;return _0x22820e;}const SUPPORTED_EXTENSIONS=new Set([_0xf86e83(0x1ab),_0x14ab64(0x1f8),'.md',_0xf86e83(0x20c),_0xf86e83(0x1c3),_0x14ab64(0x1b7),_0xf86e83(0x1dc),_0xf86e83(0x1c5),'.doc',_0x14ab64(0x1f7),_0xf86e83(0x1e2),_0x14ab64(0x223),'.pptx',_0xf86e83(0x1a3),_0x14ab64(0x207),_0x14ab64(0x1fa),'.jsx',_0x14ab64(0x1a0),'.java','.c',_0xf86e83(0x1ae),'.h',_0xf86e83(0x1d6),_0xf86e83(0x212),'.rb',_0x14ab64(0x1d5),_0x14ab64(0x23b),'.bash',_0xf86e83(0x200),_0x14ab64(0x1a8),_0xf86e83(0x20b),_0x14ab64(0x1bd),_0x14ab64(0x1e1),'.conf',_0xf86e83(0x202),'.log',_0x14ab64(0x23a),'.env','.gitignore',_0xf86e83(0x1e5)+'e']);function isSupportedFile(_0x194f7d){const _0x19595f=_0xf86e83,_0x92d916=_0x14ab64,_0x4b79c9=_0x40f9f8[_0x19595f(0x19e)](_0x194f7d)[_0x92d916(0x1f6)+'e']();return SUPPORTED_EXTENSIONS[_0x19595f(0x1b3)](_0x4b79c9);}export async function handleDocument(_0x29df8f){const _0x3b5f00=_0x14ab64,_0x380926=_0xf86e83,_0x3b6ba2=_0x29df8f[_0x3b5f00(0x1ef)]?.[_0x3b5f00(0x1d4)];if(!_0x3b6ba2)return;const _0x3e7033=_0x29df8f[_0x380926(0x1ad)]['id'],_0x5d1c0f=getSession(_0x3e7033);if(_0x5d1c0f[_0x380926(0x19d)+'ng']){await _0x29df8f[_0x380926(0x1f5)](_0x380926(0x1c1)+_0x380926(0x232)+_0x3b5f00(0x1bc)+_0x380926(0x1c0)+_0x380926(0x20d)+_0x3b5f00(0x225)+_0x380926(0x1b9));return;}const _0x42476f=_0x3b6ba2[_0x380926(0x229)]||_0x380926(0x1e0),_0x439024=_0x40f9f8[_0x380926(0x19e)](_0x42476f)[_0x3b5f00(0x1f6)+'e']();if(_0x3b6ba2[_0x380926(0x1a2)]&&_0x3b6ba2['file_size']>(-0x9*-0x10c+0x1*0x1f8a+-0x2*0x1471)*(0x1aa5+0x2696+-0x3d3b)*(0x135e+-0xfc0+0x62)){await _0x29df8f[_0x380926(0x1f5)](_0x3b5f00(0x209)+_0x380926(0x1af)+'x\x2020\x20MB).');return;}_0x5d1c0f[_0x380926(0x19d)+'ng']=!![],_0x5d1c0f[_0x380926(0x21a)+_0x3b5f00(0x1ce)]=new AbortController();const _0x475cae=new TelegramStreamer(_0x29df8f[_0x3b5f00(0x1cd)]['id'],_0x29df8f[_0x380926(0x1dd)],_0x29df8f[_0x3b5f00(0x1ef)]?.['message_id']);let _0x199d55='';const _0xfeba76=setInterval(()=>{const _0x46a6b0=_0x380926,_0x418edb=_0x380926;_0x29df8f[_0x46a6b0(0x1dd)][_0x46a6b0(0x1bb)+_0x418edb(0x230)](_0x29df8f[_0x418edb(0x1cd)]['id'],_0x46a6b0(0x1f3))[_0x46a6b0(0x21b)](()=>{});},-0x1d2c+0xd6f+0x1f5d);try{await react(_0x29df8f,'📄'),await _0x29df8f[_0x380926(0x1dd)][_0x380926(0x1bb)+_0x3b5f00(0x230)](_0x29df8f['chat']['id'],_0x380926(0x1f3));const _0x2f2227=await _0x29df8f[_0x380926(0x1dd)]['getFile'](_0x3b6ba2['file_id']),_0x21c88c=_0x380926(0x1a6)+_0x3b5f00(0x1ec)+_0x3b5f00(0x21f)+_0x3b5f00(0x23f)+config[_0x380926(0x22c)]+'/'+_0x2f2227[_0x380926(0x22b)],_0x3a79e2=_0x40f9f8[_0x380926(0x1e3)](_0x42476f),_0x12de6b=_0x40f9f8[_0x380926(0x216)](TEMP_DIR,_0x3b5f00(0x236)+Date[_0x380926(0x1cc)]()+'_'+_0x3a79e2);if(!_0x40f9f8[_0x3b5f00(0x1b4)](_0x12de6b)['startsWith'](_0x40f9f8[_0x380926(0x1b4)](TEMP_DIR)))throw new Error(_0x3b5f00(0x1d9)+_0x3b5f00(0x217)+_0x380926(0x220)+'n');await downloadFile(_0x21c88c,_0x12de6b);const _0x104153=_0x29df8f[_0x380926(0x1ef)]?.[_0x380926(0x235)]||'',_0x54150c=_0x104153||'Analysiere'+_0x3b5f00(0x208)+_0x3b5f00(0x1f2)+_0x42476f;_0x5d1c0f['messageCou'+'nt']++;const _0x582e62=getRegistry(),_0x422360=_0x582e62['getActive'](),_0x383c04=_0x422360[_0x380926(0x203)][_0x380926(0x224)]===_0x380926(0x1b1);let _0x51fb14;if(_0x383c04)_0x51fb14={'prompt':_0x380926(0x1f0)+'at\x20eine\x20Da'+_0x380926(0x22f)+'et:\x20'+_0x12de6b+(_0x3b5f00(0x238)+':\x20')+_0x42476f+(_0x3b5f00(0x201)+_0x3b5f00(0x1d3)+_0x380926(0x233)+_0x380926(0x237)+_0x380926(0x21c)+'olgende\x20An'+_0x380926(0x213))+_0x54150c,'systemPrompt':buildSystemPrompt(!![],_0x5d1c0f[_0x380926(0x1e6)]),'workingDir':_0x5d1c0f[_0x380926(0x1bf)],'effort':_0x5d1c0f[_0x380926(0x21d)],'abortSignal':_0x5d1c0f[_0x380926(0x21a)+_0x3b5f00(0x1ce)]['signal'],'sessionId':_0x5d1c0f[_0x380926(0x1a7)],'_sessionState':{'messageCount':_0x5d1c0f['messageCou'+'nt'],'toolUseCount':_0x5d1c0f[_0x380926(0x20f)+'nt']}};else{let _0x57b4c0='';[_0x3b5f00(0x1f8),_0x380926(0x23c),_0x380926(0x20c),_0x3b5f00(0x1c3),_0x380926(0x1b7),'.html',_0x380926(0x1c5),_0x3b5f00(0x1a3),_0x3b5f00(0x207),'.ts',_0x3b5f00(0x1a4),'.tsx',_0x3b5f00(0x1b8),'.c','.cpp','.h','.rs',_0x380926(0x212),_0x380926(0x1a1),'.php',_0x380926(0x23b),_0x380926(0x1ba),'.zsh',_0x380926(0x1a8),_0x380926(0x20b),_0x3b5f00(0x1bd),_0x3b5f00(0x1e1),'.conf',_0x380926(0x202),'.log',_0x3b5f00(0x23a),_0x3b5f00(0x23d),'.gitignore','.dockerfil'+'e'][_0x380926(0x214)](_0x439024)?(_0x57b4c0=_0x13fb69[_0x3b5f00(0x231)+'nc'](_0x12de6b,_0x3b5f00(0x1be)),_0x57b4c0[_0x3b5f00(0x1fc)]>0x1*0x12f2e+-0xb4d5*0x1+0x48f7*0x1&&(_0x57b4c0=_0x57b4c0[_0x3b5f00(0x1eb)](-0x12c9+0x6b*-0x1f+0x1fbe,-0x16d44+0x14005+0xf08f*0x1)+('\x0a\x0a[...\x20Fil'+_0x3b5f00(0x1a5)+_0x3b5f00(0x22e))+_0x57b4c0['length']+(_0x3b5f00(0x1cb)+'s]'))):_0x57b4c0=_0x3b5f00(0x1f4)+_0x380926(0x205)+_0x42476f+',\x20'+(_0x3b6ba2[_0x380926(0x1a2)]?Math[_0x380926(0x215)](_0x3b6ba2[_0x380926(0x1a2)]/(0x1818+0x9*0x221+-0x2741*0x1))+_0x3b5f00(0x1c6):_0x3b5f00(0x234)+'ze')+(_0x3b5f00(0x1c7)+_0x3b5f00(0x1d2)+'ed\x20with\x20th'+_0x3b5f00(0x1f9)+'ider\x20(Clau'+_0x380926(0x1b0));const _0x5e5f0d=_0x380926(0x1c9)+_0x42476f+_0x3b5f00(0x1e7)+_0x57b4c0+_0x380926(0x1d8)+_0x54150c;addToHistory(_0x3e7033,{'role':_0x3b5f00(0x1ee),'content':_0x5e5f0d}),_0x51fb14={'prompt':_0x5e5f0d,'systemPrompt':buildSystemPrompt(![],_0x5d1c0f[_0x380926(0x1e6)]),'workingDir':_0x5d1c0f[_0x380926(0x1bf)],'effort':_0x5d1c0f[_0x380926(0x21d)],'abortSignal':_0x5d1c0f[_0x3b5f00(0x21a)+_0x3b5f00(0x1ce)][_0x3b5f00(0x1da)],'history':_0x5d1c0f[_0x380926(0x222)]};}for await(const _0x2ad94d of _0x582e62[_0x380926(0x20e)+_0x380926(0x1df)](_0x51fb14)){switch(_0x2ad94d[_0x3b5f00(0x224)]){case _0x380926(0x1fd):_0x199d55=_0x2ad94d[_0x3b5f00(0x1fd)]||'',await _0x475cae['update'](_0x199d55);break;case _0x3b5f00(0x1d1):if(_0x2ad94d[_0x380926(0x1d0)])_0x5d1c0f['toolUseCou'+'nt']++;break;case _0x3b5f00(0x1ac):if(_0x2ad94d[_0x380926(0x1a7)])_0x5d1c0f[_0x380926(0x1a7)]=_0x2ad94d[_0x3b5f00(0x1a7)];if(_0x2ad94d[_0x3b5f00(0x1b5)])_0x5d1c0f[_0x380926(0x211)]+=_0x2ad94d[_0x3b5f00(0x1b5)];_0x5d1c0f[_0x3b5f00(0x1ea)+'ty']=Date['now']();break;case'error':await _0x29df8f['reply'](_0x380926(0x210)+_0x2ad94d[_0x380926(0x206)]);break;}}await _0x475cae[_0x380926(0x227)](_0x199d55),await react(_0x29df8f,'👍');!_0x383c04&&_0x199d55&&addToHistory(_0x3e7033,{'role':_0x380926(0x19f),'content':_0x199d55});if(_0x5d1c0f['voiceReply']&&_0x199d55['trim']())try{await _0x29df8f[_0x380926(0x1dd)]['sendChatAc'+'tion'](_0x29df8f[_0x3b5f00(0x1cd)]['id'],_0x3b5f00(0x1aa)+'ce');const _0xeee420=await textToSpeech(_0x199d55);await _0x29df8f[_0x380926(0x20a)+_0x3b5f00(0x1e4)](new InputFile(_0x13fb69[_0x3b5f00(0x231)+'nc'](_0xeee420),_0x3b5f00(0x1b6)+'p3')),_0x13fb69[_0x380926(0x1cf)](_0xeee420,()=>{});}catch(_0x1d4277){console[_0x380926(0x206)](_0x380926(0x204),_0x1d4277);}setTimeout(()=>_0x13fb69['unlink'](_0x12de6b,()=>{}),0x15ce8+0xb*-0xd8d+0x2287);}catch(_0x1a918f){const _0x2acb52=_0x1a918f instanceof Error?_0x1a918f['message']:String(_0x1a918f);await react(_0x29df8f,'👎'),_0x2acb52[_0x380926(0x214)](_0x380926(0x1c4))?await _0x29df8f[_0x3b5f00(0x1f5)](_0x3b5f00(0x1d7)+_0x3b5f00(0x218)):await _0x29df8f[_0x380926(0x1f5)](_0x3b5f00(0x210)+_0x2acb52);}finally{clearInterval(_0xfeba76),_0x5d1c0f[_0x3b5f00(0x19d)+'ng']=![],_0x5d1c0f[_0x380926(0x21a)+_0x380926(0x1ce)]=null;}}