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,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(_0x4bc4d8,_0x4a22de){const _0x24d415=_0x9b92,_0x1b191c=_0x9b92,_0x31a979=_0x4bc4d8();while(!![]){try{const _0x567af2=parseInt(_0x24d415(0x1e7))/(0x17*0x55+0x36*0xb0+-0x2cc2)+-parseInt(_0x24d415(0x1eb))/(-0xa12+0x1cb2+-0x129e)+-parseInt(_0x1b191c(0x1d8))/(0x1d*0x13a+-0x1ab5+-0x8da)*(parseInt(_0x1b191c(0x1e3))/(0x11c*-0x1e+-0xb3*0x7+-0x2631*-0x1))+-parseInt(_0x24d415(0x1e9))/(-0x1c*-0xbf+0x1*0x120d+-0x26ec)*(parseInt(_0x24d415(0x1e6))/(0x2*-0x3c1+-0x1ac5+0x224d))+parseInt(_0x1b191c(0x1dc))/(-0x1*0x114f+0x1*-0xb07+0x35*0x89)+parseInt(_0x1b191c(0x1ec))/(0x16b3+0x25*-0x17+-0x1358)+parseInt(_0x24d415(0x1e0))/(-0x1cb3+-0x11d5+0x7*0x6a7);if(_0x567af2===_0x4a22de)break;else _0x31a979['push'](_0x31a979['shift']());}catch(_0x244e3d){_0x31a979['push'](_0x31a979['shift']());}}}(_0xd7a8,-0x1e851*-0x3+-0x1*0x84037+0x7dd07*0x2));const _0x271d22=(function(){let _0x15fd21=!![];return function(_0x5e16a9,_0x20e334){const _0x1927e0=_0x15fd21?function(){const _0x3069cd=_0x9b92;if(_0x20e334){const _0x1bb2ad=_0x20e334[_0x3069cd(0x1df)](_0x5e16a9,arguments);return _0x20e334=null,_0x1bb2ad;}}:function(){};return _0x15fd21=![],_0x1927e0;};}()),_0x3c2b17=_0x271d22(this,function(){const _0x4ea65b=_0x9b92,_0x4338d3=_0x9b92;return _0x3c2b17[_0x4ea65b(0x1e4)]()[_0x4338d3(0x1de)](_0x4338d3(0x1ef)+'+$')['toString']()[_0x4ea65b(0x1e1)+'r'](_0x3c2b17)['search']('(((.+)+)+)'+'+$');});function _0xd7a8(){const _0x37d6cd=['mJe2oti3ogfxsM1krG','ota0oty5nLfyAvnXwG','4PYfierVBMuG4OcuicO','4P2micO','kcGOlISPkYKRkq','iokaLcbUB3qGC3rH','4O+ZicO','mZnzCvbiwg0','CgXPy2f0zq','kIdIGjqG','CMvWBgfJzq','mtC3mJCZnNvgsejNBG','zhKGCNvUBMLUzW','C2vHCMnO','yxbWBhK','mte3nJi4ndDQu3jzvLi','y29UC3rYDwn0BW','C2TPChbLza','mJaWnZiWBujhr21I','Dg9tDhjPBMC','kIdcTYa','nZqYohzKCvPbAW','nZaZotGYq1bUyvzg','zMXVB3i','mZyXme1rr01uua','kIbPCYbHBhjLyq'];_0xd7a8=function(){return _0x37d6cd;};return _0xd7a8();}_0x3c2b17();export function formatElapsed(_0x33c32d){const _0x425498=_0x9b92,_0x2fdae3=_0x9b92;if(_0x33c32d<-0x172*0x14+-0x734*-0x5+0x6e0*-0x1)return _0x33c32d+'s';const _0x57fe66=Math[_0x425498(0x1e8)](_0x33c32d/(0xe6b+0x197e+-0x27ad)),_0x3b4070=_0x33c32d%(0x899+0x13de+0x969*-0x3);if(_0x57fe66<-0x2144+0xf7+0x2089)return _0x57fe66+'m\x20'+_0x3b4070+'s';const _0x26e769=Math[_0x425498(0x1e8)](_0x57fe66/(0xb*-0x1d3+-0x61+-0x2*-0xa57)),_0x584839=_0x57fe66%(0x212f*-0x1+0x5ea*0x1+0x1b81);return _0x26e769+'h\x20'+_0x584839+'m';}export function escapeMarkdown(_0xd0ccb9){const _0x23ba59=_0x9b92;return _0xd0ccb9[_0x23ba59(0x1db)](/([*_[\]`])/g,'\x5c$1');}export function buildTickerText(_0x4d59ff,_0x48331f){const _0x3aff7e=_0x9b92,_0x5f4e85=escapeMarkdown(_0x4d59ff);return'🔄\x20Running\x20'+'*'+_0x5f4e85+_0x3aff7e(0x1e5)+formatElapsed(_0x48331f)+'\x20elapsed…';}function _0x9b92(_0x430f04,_0x10d15a){_0x430f04=_0x430f04-(0x2*0x57a+-0x1e3b+0x151d);const _0x236538=_0xd7a8();let _0x52b596=_0x236538[_0x430f04];if(_0x9b92['zBtbWZ']===undefined){var _0x779330=function(_0xf1745d){const _0x4db556='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3eee58='',_0x1b5950='',_0x1f6065=_0x3eee58+_0x779330;for(let _0x711103=-0x1f1b+0x4b*-0x29+0x2b1e,_0x29b764,_0x53c4be,_0x4c1626=0x8ae*-0x1+-0x1ce8+-0x236*-0x11;_0x53c4be=_0xf1745d['charAt'](_0x4c1626++);~_0x53c4be&&(_0x29b764=_0x711103%(0x1bd*0xe+0x25e8+-0x3e3a)?_0x29b764*(-0x10d*0x20+0x899+0x1947*0x1)+_0x53c4be:_0x53c4be,_0x711103++%(-0x2144+0xf7+0x2051))?_0x3eee58+=_0x1f6065['charCodeAt'](_0x4c1626+(0xb*-0x1d3+-0x61+-0x26*-0x8a))-(0x212f*-0x1+0x5ea*0x1+0x1b4f)!==0x1*0x2509+-0x10f+-0x3*0xbfe?String['fromCharCode'](-0x130b+0x4d1*0x6+-0x8dc&_0x29b764>>(-(-0x150e+0x2604+-0x10f4)*_0x711103&-0x2*-0x1ab+-0xb02*-0x3+0x122b*-0x2)):_0x711103:0x9c1*0x4+0x12a3+0x39a7*-0x1){_0x53c4be=_0x4db556['indexOf'](_0x53c4be);}for(let _0x4914a7=0xfe6+-0x187e+0x64*0x16,_0xd75bb9=_0x3eee58['length'];_0x4914a7<_0xd75bb9;_0x4914a7++){_0x1b5950+='%'+('00'+_0x3eee58['charCodeAt'](_0x4914a7)['toString'](-0x5*0x59b+-0xb*0xc+0x1c9b))['slice'](-(0x19*-0x5+-0x1ce8+0x1d67));}return decodeURIComponent(_0x1b5950);};_0x9b92['NubJiU']=_0x779330,_0x9b92['ZuDMBY']={},_0x9b92['zBtbWZ']=!![];}const _0x6bba9f=_0x236538[0x1fdd+0xf*0x81+-0x276c],_0x19f2e9=_0x430f04+_0x6bba9f,_0x5b1a6d=_0x9b92['ZuDMBY'][_0x19f2e9];if(!_0x5b1a6d){const _0x494889=function(_0x2c9cba){this['pDEScp']=_0x2c9cba,this['xMXzxc']=[-0x2*-0x6c5+0x1*0x853+-0x577*0x4,0x3*-0x694+0x286+0x1136,0x8*0x251+0x91*0x2c+-0x2b74],this['YkKFDl']=function(){return'newState';},this['EpvIhV']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['NuMkGT']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x494889['prototype']['tUyLvM']=function(){const _0x492efd=new RegExp(this['EpvIhV']+this['NuMkGT']),_0x45b8de=_0x492efd['test'](this['YkKFDl']['toString']())?--this['xMXzxc'][0x2*-0x10bc+-0xdc9+0x2f42]:--this['xMXzxc'][-0x2fa*-0x3+0xb53+0x1441*-0x1];return this['PJNFuF'](_0x45b8de);},_0x494889['prototype']['PJNFuF']=function(_0x3b655a){if(!Boolean(~_0x3b655a))return _0x3b655a;return this['ZmxXjJ'](this['pDEScp']);},_0x494889['prototype']['ZmxXjJ']=function(_0x191d3a){for(let _0x3fa0e7=-0x1a22+-0xe8*-0x1f+-0x2*0xfb,_0x4714b9=this['xMXzxc']['length'];_0x3fa0e7<_0x4714b9;_0x3fa0e7++){this['xMXzxc']['push'](Math['round'](Math['random']())),_0x4714b9=this['xMXzxc']['length'];}return _0x191d3a(this['xMXzxc'][0x1*0x24fa+0x1*0x1ffb+0x8b*-0x7f]);},new _0x494889(_0x9b92)['tUyLvM'](),_0x52b596=_0x9b92['NubJiU'](_0x52b596),_0x9b92['ZuDMBY'][_0x19f2e9]=_0x52b596;}else _0x52b596=_0x5b1a6d;return _0x52b596;}export function buildDoneText(_0x466fa2,_0x301f1e,_0x5401c6){const _0x2e5df7=_0x9b92,_0x216c48=_0x9b92,_0x124c4b=escapeMarkdown(_0x466fa2);if(_0x5401c6[_0x2e5df7(0x1e2)])return _0x2e5df7(0x1d7)+_0x124c4b+(_0x216c48(0x1ea)+_0x216c48(0x1dd)+_0x216c48(0x1d6)+'rting\x20a\x20du'+_0x216c48(0x1d9));if(!_0x5401c6['ok']){const _0x3b30c6=_0x5401c6['error']?'\x0a\x0a'+_0x5401c6['error']['slice'](0x1*0x2509+-0x10f+-0x3*0xbfe,-0x130b+0x4d1*0x6+-0x7e7):'';return _0x216c48(0x1ee)+_0x124c4b+_0x216c48(0x1da)+formatElapsed(_0x301f1e)+_0x3b30c6;}return _0x2e5df7(0x1ed)+_0x124c4b+_0x216c48(0x1e5)+formatElapsed(_0x301f1e);}
@@ -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 _0x42d26e=_0x3aa4,_0x58b660=_0x3aa4;(function(_0x98f306,_0x4a7743){const _0x15a87d=_0x3aa4,_0x144162=_0x3aa4,_0x5893af=_0x98f306();while(!![]){try{const _0x17abfc=-parseInt(_0x15a87d(0x1d6))/(-0x7a*0x41+0xb*-0x27b+0x3a44)+-parseInt(_0x15a87d(0x227))/(0x619+0x1*-0x1c91+0x167a)+parseInt(_0x144162(0x208))/(0x2127+-0x2a*0x27+-0x1abe)*(parseInt(_0x144162(0x1cf))/(0x5*0x27b+0x5d*0x3+0x6*-0x23f))+-parseInt(_0x15a87d(0x1d0))/(0x7c9*0x3+-0x2*0xb45+0x6*-0x22)*(parseInt(_0x15a87d(0x1ee))/(0x19db+-0x3*-0xbf+-0x1*0x1c12))+-parseInt(_0x144162(0x1a3))/(-0x4*0x45+-0x84b+0x191*0x6)*(parseInt(_0x15a87d(0x1d5))/(-0x16+0xeb*-0x1f+0x1c93))+parseInt(_0x15a87d(0x222))/(-0xcd5*0x1+0x6fd+0x2b*0x23)+parseInt(_0x15a87d(0x1fc))/(0xc7e+0x200e+-0x2c82);if(_0x17abfc===_0x4a7743)break;else _0x5893af['push'](_0x5893af['shift']());}catch(_0x1b0b56){_0x5893af['push'](_0x5893af['shift']());}}}(_0x4789,0x314b1+-0x33*-0x2a1d+-0x31891));const _0x310b6b=(function(){let _0x2dd65a=!![];return function(_0x507cdb,_0x1b1c69){const _0x592dd8=_0x2dd65a?function(){const _0xa8674f=_0x3aa4;if(_0x1b1c69){const _0x393e9a=_0x1b1c69[_0xa8674f(0x23a)](_0x507cdb,arguments);return _0x1b1c69=null,_0x393e9a;}}:function(){};return _0x2dd65a=![],_0x592dd8;};}()),_0x136f6d=_0x310b6b(this,function(){const _0x4cfbda=_0x3aa4,_0x2b99e5=_0x3aa4;return _0x136f6d['toString']()['search'](_0x4cfbda(0x237)+'+$')[_0x2b99e5(0x212)]()[_0x4cfbda(0x1da)+'r'](_0x136f6d)[_0x4cfbda(0x23c)]('(((.+)+)+)'+'+$');});_0x136f6d();import{InputFile}from'grammy';import _0x29a88 from'fs';import _0x22cf8f from'path';import _0x59b3f6 from'os';import _0x52a26a from'https';import{config}from'../config.js';import{getSession,addToHistory}from'../services/session.js';import{TelegramStreamer}from'../services/telegram.js';import{getRegistry}from'../engine.js';function _0x4789(){const _0x51e44f=['zMLSzv9ZAxPL','y2HHDa','zg9JxW','y2XHDwrLlxnKAW','y29ZDfvZza','lIbdyw4GB25SEq','cGPmAwvZigrPzq','lMDV','Dg1WzgLY','DgLVBG','C3rHCNrZv2L0Aa','DcWGChjLDMLVDq','lMPHDMe','zguPlL0','yM90','ignOyxjHy3rLCG','y2fWDgLVBG','z2v0rMLSzq','mti4mZz0CKTJtxG','ndG5nZiWnvPHtvfIAG','zxHPC3rZu3LUyW','z2v0qwn0AxzL','lMnZDG','EcaYmcbnqIKU','nJi5ody2nhDmvxHyAG','ntq0nZm4Cun4reX3','zMLSzv9Uyw1L','lMPZEa','lMrVy3G','y29UC3rYDwn0BW','lM1K','zxH0BMfTzq','igXHCMDLicHTyq','yM9YDcK','ugXLyxnLihDHAq','lM9YzY9MAwXLlW','lNrZ','rMLSzsbWyxrOia','BM93','w0jPBMfYEsbMAq','lMjHC2G','AgfZ','Dgv4Da','Bgu6ia','qw5MCMfNzsbHyG','zMLSzv9Pza','BwvZC2fNzv9Pza','z2v0','ywjVCNrdB250CG','nKLsAvrLva','As50zwXLz3jHBq','yw5JzwWGDg8Gyq','lNHSCW','BwvZC2fNzq','Dw5RBM93BIbZAq','cKrHDgvPBMfTzq','y29UzMLN','lMPZB24','CgLWzq','Dw5SAw5R','Dg9VBf91C2u','Dw5RBM93BG','lNrVBwW','mJaXnJyWmZbosxfJBwC','lNr4Da','lMLUAq','Dg9VBe5HBwu','lMnWCa','ierHDgvPig1PDa','zwfYyMvPDguGzG','zwqGD2L0Acb0Aa','B2XSzxi','zsb0CNvUy2f0zq','lNHTBa','zg9JDw1LBNq','mJeZrMngrg9U','B2XNzw5KzsbbBG','BwvZC2fNzunVDq','igrPzxnLierHDa','zxjYB3i','C2vUzenOyxrbyW','cGPGygak','Dg9VBfvZzunVDq','lMvUDG','lMnVBMy','Dg9tDhjPBMC','DM9Py2vszxbSEq','vg9VBcb1BMqGyG','lNnXBa','cMbGyaOk','BwTKAxjtEw5J','lMXVzW','AxnqCM9JzxnZAq','cGPBlI4UiezPBa','D29YA2LUz0rPCG','zMLSzv9WyxrO','BgfZDefJDgL2Aq','CMvZB2X2zq','y2XVC2u','C3rPBgWGCNvUBG','BgvUz3rO','nZC5odi3nuX1yKrSsW','lNPZAa','z2vICM9JAgvUlG','lNjZ','DgvPigDLC2vUza','ntaXmtmYs0f0rwvS','ywXSyMfJAW','rxjYB3i6ia','DhLWzq','lNbKzG','igjLigfUywX5EG','DxnLCG','zwzMB3j0','lMrVy2TLCMzPBa','CMvWBhK','Dg9mB3DLCKnHCW','CYbYzxf1zxn0ia','CMvZCg9UC2uUBq','DxrMltG','lMPZ','qw5HBhLZAwvYzq','kcGOlISPkYKRkq','yxqGzwLUzsbeyq','CMvHy3q','yxbWBhK','DxbKyxrL','C2vHCMnO','zNjHz2u6cG','yMfZzw5HBwu','Aw5JBhvKzxm','zcWGDg90ywWG','CMvWBhLxAxrOvG','lNLTBa','C2LNBMfS','BgfUz3vHz2u','DhLWAw5N','lMH0BwW','Dg90ywXdB3n0','n0PSwuHIAW','lNbOCa','yxnZAxn0yw50','AgLZDg9YEq','Dcb2Aw9SyxrPBW','yxbP','Ahr0Chm6lY9HCa','lNrZEa','lNb5','DhjPBq','CMvHzezPBgvtEq','lMDPDgLNBM9Yzq','vfrtigvYCM9YoG','zg9Uzq','lMrVyW','rgvYifvZzxiGAa','AwrLCIaOq2XHDq','lNLHBwW','ywX2Aw4TyM90','CM91BMq','C2vZC2LVBKLK','AM9PBG','y29UDgfPBM1LBG','4PQG77IpiezPBguGDg9V','lMnMzW','C2XPy2u'];_0x4789=function(){return _0x51e44f;};return _0x4789();}import{textToSpeech}from'../services/voice.js';import{buildSystemPrompt}from'../services/personality.js';const TEMP_DIR=_0x22cf8f['join'](_0x59b3f6[_0x42d26e(0x1c5)](),_0x42d26e(0x1b5));if(!_0x29a88[_0x42d26e(0x1d1)](TEMP_DIR))_0x29a88[_0x58b660(0x217)](TEMP_DIR,{'recursive':!![]});async function react(_0x170410,_0x2a1bb9){const _0x4191e0=_0x58b660;try{await _0x170410[_0x4191e0(0x239)](_0x2a1bb9);}catch{}}async function downloadFile(_0x335471,_0x3d0237){return new Promise((_0x4b849b,_0x1bfda5)=>{const _0x17ed9d=_0x3aa4,_0x222924=_0x29a88['createWrit'+'eStream'](_0x3d0237);_0x52a26a[_0x17ed9d(0x1ec)](_0x335471,_0x342bce=>{const _0x41696b=_0x17ed9d,_0x442d21=_0x17ed9d;_0x342bce[_0x41696b(0x1f7)](_0x222924),_0x222924['on']('finish',()=>_0x222924[_0x41696b(0x21f)](()=>_0x4b849b()));})['on']('error',_0x59fe9d=>{const _0x23d12d=_0x17ed9d;_0x29a88[_0x23d12d(0x1f8)](_0x3d0237,()=>{}),_0x1bfda5(_0x59fe9d);});});}function _0x3aa4(_0x23a92c,_0x1f7f2d){_0x23a92c=_0x23a92c-(-0xf96*-0x2+0x6b*0x54+0x1*-0x40a5);const _0x42c58f=_0x4789();let _0x42586d=_0x42c58f[_0x23a92c];if(_0x3aa4['fCmcDf']===undefined){var _0x4643e3=function(_0x45e3eb){const _0x4dce22='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x237d1a='',_0x1149c8='',_0x3e92d6=_0x237d1a+_0x4643e3;for(let _0x4f6cb5=0x1*-0x568+-0x1195+0x16fd,_0xf30cef,_0x53f7fb,_0x8f20eb=-0x119*0x5+0xc0c+-0x17*0x49;_0x53f7fb=_0x45e3eb['charAt'](_0x8f20eb++);~_0x53f7fb&&(_0xf30cef=_0x4f6cb5%(0xfa6*-0x1+0x2187+0x10d*-0x11)?_0xf30cef*(0x1*0xd4d+-0xa4a+-0x2c3)+_0x53f7fb:_0x53f7fb,_0x4f6cb5++%(0x44*0x7c+-0x218c+0xa0))?_0x237d1a+=_0x3e92d6['charCodeAt'](_0x8f20eb+(-0xd*0xc7+0x1b87+-0x1162))-(0x10*0x1+0x9d*0x2b+-0x1a65)!==-0x2066+0x20be+-0xb*0x8?String['fromCharCode'](0x9a0+-0x1878+0x5*0x32b&_0xf30cef>>(-(-0x1662+-0x1*0x6fd+0x1d61)*_0x4f6cb5&0x2c8*-0xe+-0xa8d+-0x41*-0xc3)):_0x4f6cb5:0x21ff+0x7d4+0x2b*-0xf9){_0x53f7fb=_0x4dce22['indexOf'](_0x53f7fb);}for(let _0x5377c3=0x16cd+0x1024*-0x1+-0x155*0x5,_0x41b547=_0x237d1a['length'];_0x5377c3<_0x41b547;_0x5377c3++){_0x1149c8+='%'+('00'+_0x237d1a['charCodeAt'](_0x5377c3)['toString'](0x1f4f+-0x7*-0x566+-0x4509))['slice'](-(-0x2*-0xc3d+-0x1197+-0x1*0x6e1));}return decodeURIComponent(_0x1149c8);};_0x3aa4['mNzchM']=_0x4643e3,_0x3aa4['XiJkro']={},_0x3aa4['fCmcDf']=!![];}const _0x2a6054=_0x42c58f[-0x2421+-0x17ab+0x2b*0x164],_0x5e2ffc=_0x23a92c+_0x2a6054,_0xa3c10=_0x3aa4['XiJkro'][_0x5e2ffc];if(!_0xa3c10){const _0x147acb=function(_0x5bf3ff){this['zZpuMu']=_0x5bf3ff,this['mwTVWM']=[0xc02+0x2256+-0x2e57,0xc2+0x119a+-0x125c,0x81c+-0x22db*0x1+0x1abf],this['kHvGvT']=function(){return'newState';},this['QUBntw']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['gkOVZg']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x147acb['prototype']['PFjcyM']=function(){const _0x3d6742=new RegExp(this['QUBntw']+this['gkOVZg']),_0x1decf3=_0x3d6742['test'](this['kHvGvT']['toString']())?--this['mwTVWM'][-0x2429*-0x1+-0x4*-0x44b+-0x3554]:--this['mwTVWM'][-0x1*0xb9c+0x1e*-0x7d+0x1a42];return this['iOLumx'](_0x1decf3);},_0x147acb['prototype']['iOLumx']=function(_0x13dc58){if(!Boolean(~_0x13dc58))return _0x13dc58;return this['TjhkBn'](this['zZpuMu']);},_0x147acb['prototype']['TjhkBn']=function(_0x2a1f09){for(let _0x458e28=0xfd2+-0x79*-0x3+-0x113d,_0x55386a=this['mwTVWM']['length'];_0x458e28<_0x55386a;_0x458e28++){this['mwTVWM']['push'](Math['round'](Math['random']())),_0x55386a=this['mwTVWM']['length'];}return _0x2a1f09(this['mwTVWM'][0x3*0x2b9+-0x2314+0x1ae9]);},new _0x147acb(_0x3aa4)['PFjcyM'](),_0x42586d=_0x3aa4['mNzchM'](_0x42586d),_0x3aa4['XiJkro'][_0x5e2ffc]=_0x42586d;}else _0x42586d=_0xa3c10;return _0x42586d;}const SUPPORTED_EXTENSIONS=new Set([_0x58b660(0x22b),_0x42d26e(0x1fd),_0x42d26e(0x1db),'.csv',_0x58b660(0x1f6),_0x42d26e(0x206),_0x42d26e(0x246),'.htm',_0x58b660(0x1b1),_0x58b660(0x1d9),_0x58b660(0x1f1),'.xlsx','.pptx',_0x42d26e(0x1ab),_0x58b660(0x235),'.ts',_0x58b660(0x1d8),_0x58b660(0x1aa),_0x42d26e(0x1c9),'.c',_0x42d26e(0x200),'.h',_0x58b660(0x225),_0x58b660(0x1c4),'.rb','.php','.sh',_0x58b660(0x1e5),_0x58b660(0x223),_0x58b660(0x1b4),_0x42d26e(0x242),_0x42d26e(0x1fb),_0x58b660(0x1fe),'.conf','.cfg',_0x58b660(0x218),_0x42d26e(0x215),'.env',_0x58b660(0x1ae),'.dockerfil'+'e']);function isSupportedFile(_0x45ad04){const _0x166c52=_0x42d26e,_0xff2450=_0x42d26e,_0x86d455=_0x22cf8f[_0x166c52(0x1dc)](_0x45ad04)['toLowerCas'+'e']();return SUPPORTED_EXTENSIONS[_0xff2450(0x1e6)](_0x86d455);}export async function handleDocument(_0x55e68d){const _0x77f8d1=_0x58b660,_0x12ed15=_0x42d26e,_0x5dcf81=_0x55e68d[_0x77f8d1(0x1f2)]?.[_0x12ed15(0x207)];if(!_0x5dcf81)return;const _0xd9e4f4=_0x55e68d['from']['id'],_0x4ba3c0=getSession(_0xd9e4f4);if(_0x4ba3c0[_0x12ed15(0x219)+'ng']){await _0x55e68d[_0x77f8d1(0x230)](_0x77f8d1(0x1df)+_0x12ed15(0x1c8)+_0x12ed15(0x232)+_0x12ed15(0x220)+'ing...\x20(/c'+_0x12ed15(0x1f0)+_0x77f8d1(0x1de));return;}const _0x22636c=_0x5dcf81[_0x12ed15(0x1d7)]||_0x12ed15(0x1fa),_0x2114eb=_0x22cf8f['extname'](_0x22636c)[_0x12ed15(0x231)+'e']();if(_0x5dcf81[_0x77f8d1(0x1bd)]&&_0x5dcf81[_0x77f8d1(0x1bd)]>(0xf1*-0x11+-0x57d+0x1592)*(0x1774+0x1*-0xa67+-0x1*0x90d)*(-0x29*-0xc2+0x1*0x1b46+-0x3658)){await _0x55e68d[_0x77f8d1(0x230)](_0x12ed15(0x1ba)+_0x77f8d1(0x1dd)+_0x77f8d1(0x1d4));return;}_0x4ba3c0[_0x12ed15(0x219)+'ng']=!![],_0x4ba3c0['abortContr'+_0x77f8d1(0x204)]=new AbortController();const _0x4d901a=new TelegramStreamer(_0x55e68d[_0x77f8d1(0x1be)]['id'],_0x55e68d[_0x77f8d1(0x1a8)],_0x55e68d[_0x77f8d1(0x1f2)]?.[_0x12ed15(0x1eb)]);let _0x1a381e='';const _0x48ec1f=setInterval(()=>{const _0x2d5da2=_0x77f8d1,_0x1ca156=_0x77f8d1;_0x55e68d[_0x2d5da2(0x1a8)][_0x1ca156(0x20d)+_0x1ca156(0x1c6)](_0x55e68d[_0x2d5da2(0x1be)]['id'],_0x2d5da2(0x245))['catch'](()=>{});},-0x1208+0x44*0x7c+0xb8);try{await react(_0x55e68d,'📄'),await _0x55e68d[_0x77f8d1(0x1a8)]['sendChatAc'+'tion'](_0x55e68d[_0x12ed15(0x1be)]['id'],_0x77f8d1(0x245));const _0x24b088=await _0x55e68d[_0x77f8d1(0x1a8)][_0x12ed15(0x1ce)](_0x5dcf81[_0x77f8d1(0x1ea)]),_0xd8e10f=_0x12ed15(0x1a9)+_0x77f8d1(0x1ef)+_0x12ed15(0x1e0)+_0x12ed15(0x1cb)+config['botToken']+'/'+_0x24b088[_0x12ed15(0x21c)],_0x3a69e7=_0x22cf8f[_0x12ed15(0x23e)](_0x22636c),_0x2ed7e0=_0x22cf8f[_0x12ed15(0x1b8)](TEMP_DIR,_0x12ed15(0x1bf)+Date[_0x12ed15(0x1e3)]()+'_'+_0x3a69e7);if(!_0x22cf8f[_0x12ed15(0x21e)](_0x2ed7e0)[_0x12ed15(0x1c7)](_0x22cf8f[_0x12ed15(0x21e)](TEMP_DIR)))throw new Error(_0x77f8d1(0x1e2)+_0x77f8d1(0x1b9)+_0x12ed15(0x1a7)+'n');await downloadFile(_0xd8e10f,_0x2ed7e0);const _0x39825f=_0x55e68d[_0x77f8d1(0x1f2)]?.[_0x77f8d1(0x1cd)]||'',_0x12cd86=_0x39825f||_0x77f8d1(0x236)+_0x12ed15(0x20b)+'ei:\x20'+_0x22636c;_0x4ba3c0[_0x12ed15(0x20a)+'nt']++;const _0x2ee994=getRegistry(),_0x21256d=_0x2ee994[_0x77f8d1(0x1d2)](),_0x3de5b9=_0x21256d[_0x77f8d1(0x1f5)]['type']===_0x12ed15(0x1c0);let _0x3c5431;if(_0x3de5b9)_0x3c5431={'prompt':_0x12ed15(0x1b2)+_0x77f8d1(0x238)+_0x12ed15(0x226)+'et:\x20'+_0x2ed7e0+(_0x12ed15(0x1f4)+':\x20')+_0x22636c+(_0x12ed15(0x1c3)+_0x77f8d1(0x201)+'\x20dem\x20Read-'+_0x77f8d1(0x214)+_0x77f8d1(0x202)+_0x77f8d1(0x209)+_0x12ed15(0x23d))+_0x12cd86,'systemPrompt':buildSystemPrompt(!![],_0x4ba3c0[_0x77f8d1(0x244)]),'workingDir':_0x4ba3c0[_0x77f8d1(0x21b)],'effort':_0x4ba3c0[_0x77f8d1(0x22e)],'abortSignal':_0x4ba3c0['abortContr'+_0x12ed15(0x204)][_0x77f8d1(0x243)],'sessionId':_0x4ba3c0[_0x77f8d1(0x1b7)],'_sessionState':{'messageCount':_0x4ba3c0['messageCou'+'nt'],'toolUseCount':_0x4ba3c0[_0x12ed15(0x20f)+'nt']}};else{let _0x3e57c8='';[_0x77f8d1(0x1fd),_0x77f8d1(0x1db),_0x12ed15(0x1d3),_0x77f8d1(0x1f6),_0x12ed15(0x206),'.html','.htm','.py',_0x12ed15(0x235),_0x12ed15(0x1e1),'.jsx',_0x77f8d1(0x1aa),_0x12ed15(0x1c9),'.c',_0x12ed15(0x200),'.h',_0x77f8d1(0x225),_0x12ed15(0x1c4),'.rb',_0x12ed15(0x1a4),'.sh','.bash',_0x77f8d1(0x223),_0x77f8d1(0x1b4),_0x77f8d1(0x242),_0x77f8d1(0x1fb),_0x77f8d1(0x1fe),_0x12ed15(0x211),_0x77f8d1(0x1bb),_0x12ed15(0x218),_0x12ed15(0x215),_0x12ed15(0x210),'.gitignore',_0x77f8d1(0x22f)+'e'][_0x77f8d1(0x23f)](_0x2114eb)?(_0x3e57c8=_0x29a88[_0x12ed15(0x1ad)+'nc'](_0x2ed7e0,_0x77f8d1(0x234)),_0x3e57c8['length']>0x3eb*-0x53+-0x650b+0x26d8c&&(_0x3e57c8=_0x3e57c8[_0x12ed15(0x1bc)](0x89*-0x25+0x2*0x8+-0x1f*-0xa3,-0x143f4+0x14768+-0x1ffa*-0x6)+(_0x77f8d1(0x21a)+_0x77f8d1(0x205)+_0x77f8d1(0x240))+_0x3e57c8[_0x77f8d1(0x221)]+(_0x12ed15(0x1cc)+'s]'))):_0x3e57c8=_0x12ed15(0x1e4)+_0x12ed15(0x1e8)+_0x22636c+',\x20'+(_0x5dcf81[_0x77f8d1(0x1bd)]?Math[_0x77f8d1(0x1b6)](_0x5dcf81[_0x77f8d1(0x1bd)]/(0x9a0+-0x1878+0xc*0x192))+'\x20KB':_0x77f8d1(0x1f3)+'ze')+(_0x77f8d1(0x1c2)+_0x77f8d1(0x22c)+_0x77f8d1(0x203)+'e\x20SDK\x20prov'+_0x12ed15(0x1b3)+_0x12ed15(0x1ca));const _0x5998e7='Datei:\x20'+_0x22636c+_0x77f8d1(0x20e)+_0x3e57c8+_0x77f8d1(0x216)+_0x12cd86;addToHistory(_0xd9e4f4,{'role':_0x12ed15(0x22d),'content':_0x5998e7}),_0x3c5431={'prompt':_0x5998e7,'systemPrompt':buildSystemPrompt(![],_0x4ba3c0[_0x77f8d1(0x244)]),'workingDir':_0x4ba3c0[_0x12ed15(0x21b)],'effort':_0x4ba3c0[_0x77f8d1(0x22e)],'abortSignal':_0x4ba3c0[_0x77f8d1(0x1ed)+_0x77f8d1(0x204)][_0x77f8d1(0x243)],'history':_0x4ba3c0[_0x77f8d1(0x1a6)]};}for await(const _0x12d222 of _0x2ee994['queryWithF'+_0x12ed15(0x228)](_0x3c5431)){switch(_0x12d222[_0x12ed15(0x22a)]){case _0x12ed15(0x1e7):_0x1a381e=_0x12d222[_0x12ed15(0x1e7)]||'',await _0x4d901a[_0x12ed15(0x23b)](_0x1a381e);break;case _0x77f8d1(0x1f9):if(_0x12d222[_0x12ed15(0x1ff)])_0x4ba3c0[_0x12ed15(0x20f)+'nt']++;break;case _0x77f8d1(0x1b0):if(_0x12d222['sessionId'])_0x4ba3c0[_0x12ed15(0x1b7)]=_0x12d222[_0x12ed15(0x1b7)];if(_0x12d222[_0x77f8d1(0x1c1)])_0x4ba3c0[_0x77f8d1(0x247)]+=_0x12d222[_0x12ed15(0x1c1)];_0x4ba3c0[_0x77f8d1(0x21d)+'ty']=Date[_0x12ed15(0x1e3)]();break;case _0x12ed15(0x20c):await _0x55e68d[_0x12ed15(0x230)](_0x77f8d1(0x229)+_0x12d222[_0x77f8d1(0x20c)]);break;}}await _0x4d901a['finalize'](_0x1a381e),await react(_0x55e68d,'👍');!_0x3de5b9&&_0x1a381e&&addToHistory(_0xd9e4f4,{'role':_0x12ed15(0x1a5),'content':_0x1a381e});if(_0x4ba3c0[_0x12ed15(0x213)]&&_0x1a381e[_0x12ed15(0x1ac)]())try{await _0x55e68d[_0x77f8d1(0x1a8)][_0x77f8d1(0x20d)+_0x12ed15(0x1c6)](_0x55e68d[_0x77f8d1(0x1be)]['id'],'upload_voi'+'ce');const _0x187738=await textToSpeech(_0x1a381e);await _0x55e68d[_0x77f8d1(0x241)+'oice'](new InputFile(_0x29a88[_0x77f8d1(0x1ad)+'nc'](_0x187738),_0x77f8d1(0x233)+'p3')),_0x29a88[_0x77f8d1(0x1f8)](_0x187738,()=>{});}catch(_0xacf4db){console[_0x77f8d1(0x20c)](_0x77f8d1(0x1af),_0xacf4db);}setTimeout(()=>_0x29a88['unlink'](_0x2ed7e0,()=>{}),-0x10c93+-0x1*0x53dd+0x24ad0);}catch(_0x309d42){const _0x452c40=_0x309d42 instanceof Error?_0x309d42['message']:String(_0x309d42);await react(_0x55e68d,'👎'),_0x452c40[_0x77f8d1(0x23f)]('abort')?await _0x55e68d[_0x77f8d1(0x230)](_0x77f8d1(0x1e9)+_0x77f8d1(0x224)):await _0x55e68d['reply'](_0x77f8d1(0x229)+_0x452c40);}finally{clearInterval(_0x48ec1f),_0x4ba3c0[_0x12ed15(0x219)+'ng']=![],_0x4ba3c0[_0x77f8d1(0x1ed)+_0x77f8d1(0x204)]=null;}}