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,54 +1 @@
1
- /**
2
- * Task-aware stuck timer for the Telegram message handler (v4.12.1).
3
- *
4
- * The main handler must detect genuine SDK hangs (no chunks for N minutes)
5
- * while NOT aborting legitimate long-running work — specifically sync Agent
6
- * tool calls that emit no intermediate chunks for their entire duration.
7
- *
8
- * State machine:
9
- * - Normal mode: idle timeout = NORMAL_MS (default 10 min, env-configurable
10
- * in message.ts via ALVIN_STUCK_TIMEOUT_MINUTES)
11
- * - When any Agent/Task tool call is known to be running sync (tracked by
12
- * its toolUseId), the next reset() arms the timer with EXTENDED_MS
13
- * instead (default 120 min, env-configurable via
14
- * ALVIN_SYNC_AGENT_IDLE_TIMEOUT_MINUTES)
15
- * - Back to NORMAL_MS once all tracked sync tool calls have emitted their
16
- * tool_result and been released via exitSync()
17
- *
18
- * This module is pure — no grammy, no session, no provider. Takes its ms
19
- * values and onTimeout callback as constructor args. Testable in isolation
20
- * with vi.useFakeTimers(). The handler owns the state; the handler decides
21
- * which chunks flip the mode based on chunk.toolName and chunk.runInBackground.
22
- *
23
- * See docs/superpowers/plans/... and test/stuck-timer.test.ts.
24
- */
25
- export function createStuckTimer(cfg) {
26
- const pending = new Set();
27
- let handle = null;
28
- const currentTimeout = () => pending.size > 0 ? cfg.extendedMs : cfg.normalMs;
29
- const rearm = () => {
30
- if (handle)
31
- clearTimeout(handle);
32
- handle = setTimeout(cfg.onTimeout, currentTimeout());
33
- };
34
- return {
35
- reset: rearm,
36
- enterSync(id) {
37
- pending.add(id);
38
- rearm();
39
- },
40
- exitSync(id) {
41
- pending.delete(id);
42
- rearm();
43
- },
44
- cancel() {
45
- if (handle) {
46
- clearTimeout(handle);
47
- handle = null;
48
- }
49
- },
50
- _pendingCount() {
51
- return pending.size;
52
- },
53
- };
54
- }
1
+ (function(_0x260d2f,_0x585314){const _0x3745fc=_0x2abc,_0x3a169b=_0x2abc,_0xe30fcc=_0x260d2f();while(!![]){try{const _0x29cbc7=-parseInt(_0x3745fc(0xe7))/(-0x1e7c+0x2e9*-0x7+0x136*0x2a)*(parseInt(_0x3a169b(0xf0))/(0x69+-0xfd*-0x23+-0x1*0x22fe))+-parseInt(_0x3a169b(0xe3))/(0x7a5*-0x1+-0xc64+0x140c)*(parseInt(_0x3745fc(0xf1))/(-0x30d*-0x5+-0x112f+0x1f2))+parseInt(_0x3745fc(0xe1))/(0x25df+0x21e3+0x1*-0x47bd)*(-parseInt(_0x3745fc(0xed))/(-0x3b4*0x8+0xa87+0x131f))+parseInt(_0x3a169b(0xe8))/(-0x32f*0x7+-0x247a+0x3aca)+-parseInt(_0x3a169b(0xe4))/(-0x640+0x250e+-0x1ec6)*(-parseInt(_0x3a169b(0xee))/(0xc*-0x21a+0x1c3*0xd+0x25a))+-parseInt(_0x3a169b(0xdd))/(-0x6a1+-0x2469+0x2b14)+parseInt(_0x3745fc(0xec))/(-0x14f7+-0x9ed+0x1eef);if(_0x29cbc7===_0x585314)break;else _0xe30fcc['push'](_0xe30fcc['shift']());}catch(_0x4a2c07){_0xe30fcc['push'](_0xe30fcc['shift']());}}}(_0x3570,0x2c49*-0xd+-0x1*-0x4e61e+0x5edf));function _0x3570(){const _0x3d2e75=['mtu0otm1mKfezgzIza','C2vHCMnO','y29UC3rYDwn0BW','zgvSzxrL','mZiZoteYnLDwC2jpwq','nNrPt3zdqG','owPiqxvJvW','BM9YBwfStxm','mZz6Ahzwq1u','mtCYDhboEgPd','ywrK','mtu2nZC3mhbOs1vyDa','Dg9tDhjPBMC','C2L6zq','kcGOlISPkYKRkq','mta0otmXnunQCfzoCG','B25uAw1LB3v0','otu0ovLTywDSCa','mJKXmJy2neTKEwzmza','yxbWBhK','zxH0zw5KzwrnCW','otKXmNb0BxfmAG'];_0x3570=function(){return _0x3d2e75;};return _0x3570();}const _0x5c7a50=(function(){let _0xf6608c=!![];return function(_0x266a91,_0x296101){const _0x5b3e59=_0xf6608c?function(){const _0x220307=_0x2abc;if(_0x296101){const _0x4ff14a=_0x296101[_0x220307(0xe5)](_0x266a91,arguments);return _0x296101=null,_0x4ff14a;}}:function(){};return _0xf6608c=![],_0x5b3e59;};}()),_0x557c23=_0x5c7a50(this,function(){const _0x25b883=_0x2abc,_0x391705=_0x2abc;return _0x557c23[_0x25b883(0xde)]()['search'](_0x25b883(0xe0)+'+$')[_0x25b883(0xde)]()[_0x391705(0xea)+'r'](_0x557c23)[_0x25b883(0xe9)](_0x391705(0xe0)+'+$');});_0x557c23();function _0x2abc(_0xb59665,_0xb3da2d){_0xb59665=_0xb59665-(-0x2240+0x8ea*0x1+-0x1*-0x1a32);const _0x20fc69=_0x3570();let _0x147d72=_0x20fc69[_0xb59665];if(_0x2abc['hfAkOa']===undefined){var _0x32b859=function(_0x17897d){const _0x280fcd='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5ceaac='',_0x66f2e7='',_0x9efa33=_0x5ceaac+_0x32b859;for(let _0x10d8f0=-0x3*-0x4a7+-0x26e4+0x18ef,_0x10e826,_0x4ba3a1,_0x3fffd9=-0x2*0x690+0xb23*0x1+0x1fd;_0x4ba3a1=_0x17897d['charAt'](_0x3fffd9++);~_0x4ba3a1&&(_0x10e826=_0x10d8f0%(-0x1a75+-0x799*0x1+-0x62*-0x59)?_0x10e826*(0x2268+-0x9e1+-0x4db*0x5)+_0x4ba3a1:_0x4ba3a1,_0x10d8f0++%(-0x119b+0xd81*-0x1+0x1f20))?_0x5ceaac+=_0x9efa33['charCodeAt'](_0x3fffd9+(-0xd1*-0x24+0x597*-0x6+0x430))-(0xa88+-0x22c1+0x1843)!==-0x942+-0x55*0x3d+0x1d83?String['fromCharCode'](0x1*-0x1c25+0x76d*-0x1+0x2491&_0x10e826>>(-(-0x26fc+-0x1cce+0x43cc)*_0x10d8f0&-0x1002+0x14cf+0x1*-0x4c7)):_0x10d8f0:0x283*-0xa+-0x1047+0x2965){_0x4ba3a1=_0x280fcd['indexOf'](_0x4ba3a1);}for(let _0x421545=-0x19a2+0x1*0x1647+0x1*0x35b,_0x484365=_0x5ceaac['length'];_0x421545<_0x484365;_0x421545++){_0x66f2e7+='%'+('00'+_0x5ceaac['charCodeAt'](_0x421545)['toString'](-0x228e+-0x1f65+-0x4203*-0x1))['slice'](-(-0x291*0x1+-0x1e15+0x1*0x20a8));}return decodeURIComponent(_0x66f2e7);};_0x2abc['YwcCsU']=_0x32b859,_0x2abc['qtjTpt']={},_0x2abc['hfAkOa']=!![];}const _0x460a99=_0x20fc69[-0x13*0x79+-0x22aa+0x2ba5*0x1],_0xf38426=_0xb59665+_0x460a99,_0x1183eb=_0x2abc['qtjTpt'][_0xf38426];if(!_0x1183eb){const _0x4f8e8c=function(_0x2be5f9){this['VsYmQt']=_0x2be5f9,this['chCsHH']=[0xbbc*0x3+-0xa5d+-0x18d6,0x1512+0x2474+-0x3986,0xb5a*0x3+0xde6*0x2+-0x3dda],this['ExvHan']=function(){return'newState';},this['MJqxSk']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['HxbEaM']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4f8e8c['prototype']['mFCpYx']=function(){const _0x279961=new RegExp(this['MJqxSk']+this['HxbEaM']),_0x3401ed=_0x279961['test'](this['ExvHan']['toString']())?--this['chCsHH'][-0x1*-0x20c0+-0x198f+-0x730]:--this['chCsHH'][0x169d+0x2186+-0x7*0x805];return this['csoOjn'](_0x3401ed);},_0x4f8e8c['prototype']['csoOjn']=function(_0x1c362f){if(!Boolean(~_0x1c362f))return _0x1c362f;return this['dBTAhs'](this['VsYmQt']);},_0x4f8e8c['prototype']['dBTAhs']=function(_0x15c6db){for(let _0x260240=0x25ea+-0x1f44+0x353*-0x2,_0x161a49=this['chCsHH']['length'];_0x260240<_0x161a49;_0x260240++){this['chCsHH']['push'](Math['round'](Math['random']())),_0x161a49=this['chCsHH']['length'];}return _0x15c6db(this['chCsHH'][0x1*-0xcc1+-0x1b79+0x26*0x10f]);},new _0x4f8e8c(_0x2abc)['mFCpYx'](),_0x147d72=_0x2abc['YwcCsU'](_0x147d72),_0x2abc['qtjTpt'][_0xf38426]=_0x147d72;}else _0x147d72=_0x1183eb;return _0x147d72;}export function createStuckTimer(_0x3bc00b){const _0x134140=_0x2abc,_0x55d5e0=_0x2abc,_0x1409cd=new Set();let _0x59aeeb=null;const _0x23a1e0=()=>_0x1409cd['size']>-0x2*0x690+0xb23*0x1+0x1fd?_0x3bc00b[_0x134140(0xe6)]:_0x3bc00b[_0x55d5e0(0xef)],_0xe7befd=()=>{const _0x5f0fd4=_0x55d5e0;if(_0x59aeeb)clearTimeout(_0x59aeeb);_0x59aeeb=setTimeout(_0x3bc00b[_0x5f0fd4(0xe2)],_0x23a1e0());};return{'reset':_0xe7befd,'enterSync'(_0x2d7826){const _0x1d9ce4=_0x55d5e0;_0x1409cd[_0x1d9ce4(0xdc)](_0x2d7826),_0xe7befd();},'exitSync'(_0x526228){const _0x5a2330=_0x55d5e0;_0x1409cd[_0x5a2330(0xeb)](_0x526228),_0xe7befd();},'cancel'(){_0x59aeeb&&(clearTimeout(_0x59aeeb),_0x59aeeb=null);},'_pendingCount'(){const _0x25aeb7=_0x134140;return _0x1409cd[_0x25aeb7(0xdf)];}};}
@@ -1,237 +1 @@
1
- /**
2
- * Video Message Handler — Process video messages and video notes (round videos).
3
- *
4
- * Capabilities:
5
- * - Receive video messages → extract key frames → describe/analyze
6
- * - Receive video notes (round videos) → same processing
7
- * - Extract audio from video → transcribe (if voice content)
8
- * - Support for video files sent as documents (handled by document handler)
9
- */
10
- import fs from "fs";
11
- import path from "path";
12
- import os from "os";
13
- import https from "https";
14
- import { execSync } from "child_process";
15
- import { config } from "../config.js";
16
- import { getSession, addToHistory } from "../services/session.js";
17
- import { TelegramStreamer } from "../services/telegram.js";
18
- import { getRegistry } from "../engine.js";
19
- import { transcribeAudio } from "../services/voice.js";
20
- import { buildSystemPrompt } from "../services/personality.js";
21
- const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot", "video");
22
- if (!fs.existsSync(TEMP_DIR))
23
- fs.mkdirSync(TEMP_DIR, { recursive: true });
24
- /** React helper */
25
- async function react(ctx, emoji) {
26
- try {
27
- await ctx.react(emoji);
28
- }
29
- catch { /* ignore */ }
30
- }
31
- /** Download a Telegram file */
32
- async function downloadFile(url, dest) {
33
- return new Promise((resolve, reject) => {
34
- const file = fs.createWriteStream(dest);
35
- https.get(url, (response) => {
36
- response.pipe(file);
37
- file.on("finish", () => file.close(() => resolve()));
38
- }).on("error", (err) => {
39
- fs.unlink(dest, () => { });
40
- reject(err);
41
- });
42
- });
43
- }
44
- /** Check if ffmpeg is available */
45
- function hasFFmpeg() {
46
- try {
47
- execSync("which ffmpeg", { stdio: "pipe" });
48
- return true;
49
- }
50
- catch {
51
- return false;
52
- }
53
- }
54
- /** Extract key frames from a video (up to 4 frames, evenly spaced) */
55
- function extractFrames(videoPath, outputDir, maxFrames = 4) {
56
- // Get video duration
57
- let duration = 10;
58
- try {
59
- const probe = execSync(`ffprobe -v error -show_entries format=duration -of csv="p=0" "${videoPath}"`, { stdio: "pipe" }).toString().trim();
60
- duration = parseFloat(probe) || 10;
61
- }
62
- catch { /* default duration */ }
63
- const interval = Math.max(duration / (maxFrames + 1), 0.5);
64
- const frames = [];
65
- for (let i = 1; i <= maxFrames; i++) {
66
- const timestamp = Math.min(interval * i, duration - 0.1);
67
- const framePath = path.join(outputDir, `frame_${i}.jpg`);
68
- try {
69
- execSync(`ffmpeg -ss ${timestamp.toFixed(2)} -i "${videoPath}" -vframes 1 -q:v 3 -y "${framePath}" 2>/dev/null`, { stdio: "pipe", timeout: 10000 });
70
- if (fs.existsSync(framePath) && fs.statSync(framePath).size > 0) {
71
- frames.push(framePath);
72
- }
73
- }
74
- catch { /* skip this frame */ }
75
- }
76
- return frames;
77
- }
78
- /** Extract audio track from video */
79
- function extractAudio(videoPath) {
80
- const audioPath = videoPath.replace(/\.\w+$/, ".ogg");
81
- try {
82
- execSync(`ffmpeg -i "${videoPath}" -vn -acodec libopus -y "${audioPath}" 2>/dev/null`, { stdio: "pipe", timeout: 30000 });
83
- if (fs.existsSync(audioPath) && fs.statSync(audioPath).size > 1000) {
84
- return audioPath;
85
- }
86
- }
87
- catch { /* no audio track or extraction failed */ }
88
- return null;
89
- }
90
- export async function handleVideo(ctx) {
91
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
- const video = ctx.message?.video || ctx.message?.video_note;
93
- if (!video)
94
- return;
95
- const userId = ctx.from.id;
96
- const session = getSession(userId);
97
- if (session.isProcessing) {
98
- if (session.messageQueue.length < 3) {
99
- session.messageQueue.push("[Video-Nachricht empfangen]");
100
- await react(ctx, "📝");
101
- }
102
- return;
103
- }
104
- if (!hasFFmpeg()) {
105
- await ctx.reply("❌ Video processing requires ffmpeg. Install with: `brew install ffmpeg`", { parse_mode: "Markdown" });
106
- return;
107
- }
108
- session.isProcessing = true;
109
- session.abortController = new AbortController();
110
- const streamer = new TelegramStreamer(ctx.chat.id, ctx.api, ctx.message?.message_id);
111
- let finalText = "";
112
- const typingInterval = setInterval(() => {
113
- ctx.api.sendChatAction(ctx.chat.id, "typing").catch(() => { });
114
- }, 4000);
115
- try {
116
- await react(ctx, "👀");
117
- await ctx.api.sendChatAction(ctx.chat.id, "typing");
118
- // 1. Download video
119
- const file = await ctx.api.getFile(video.file_id);
120
- const ext = file.file_path?.split(".").pop() || "mp4";
121
- const videoPath = path.join(TEMP_DIR, `video_${Date.now()}.${ext}`);
122
- const fileUrl = `https://api.telegram.org/file/bot${config.botToken}/${file.file_path}`;
123
- await downloadFile(fileUrl, videoPath);
124
- // 2. Extract key frames
125
- const frameDir = path.join(TEMP_DIR, `frames_${Date.now()}`);
126
- fs.mkdirSync(frameDir, { recursive: true });
127
- const frames = extractFrames(videoPath, frameDir);
128
- // 3. Extract and transcribe audio (if available)
129
- let transcript = "";
130
- if (config.apiKeys.groq) {
131
- const audioPath = extractAudio(videoPath);
132
- if (audioPath) {
133
- try {
134
- transcript = await transcribeAudio(audioPath);
135
- fs.unlink(audioPath, () => { });
136
- }
137
- catch { /* no transcription */ }
138
- }
139
- }
140
- // 4. Build prompt with video context
141
- const caption = ctx.message?.caption || "";
142
- const duration = video.duration || 0;
143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
- const isVideoNote = !!ctx.message?.video_note;
145
- let prompt = `[Video empfangen: ${duration}s`;
146
- if (isVideoNote)
147
- prompt += ", runde Videonachricht";
148
- if (video.width && video.height)
149
- prompt += `, ${video.width}x${video.height}`;
150
- prompt += "]";
151
- if (transcript) {
152
- prompt += `\n\n[Audio-Transkription]: "${transcript}"`;
153
- }
154
- if (caption) {
155
- prompt += `\n\n[Bildunterschrift]: "${caption}"`;
156
- }
157
- if (frames.length > 0) {
158
- prompt += `\n\n[${frames.length} key frames extracted from the video]`;
159
- prompt += "\n\nBitte beschreibe was im Video zu sehen ist und beantworte eventuelle Fragen.";
160
- }
161
- else {
162
- prompt += "\n\nIch konnte keine Frames extrahieren. Basiere deine Antwort auf der Audio-Transkription.";
163
- }
164
- // Show what we extracted
165
- const infoLines = [];
166
- if (frames.length > 0)
167
- infoLines.push(`🎞️ ${frames.length} frames extracted`);
168
- if (transcript)
169
- infoLines.push(`🎙️ "${transcript.slice(0, 100)}${transcript.length > 100 ? "..." : ""}"`);
170
- if (infoLines.length > 0) {
171
- await ctx.reply(infoLines.join("\n"));
172
- }
173
- // 5. Send to AI
174
- session.messageCount++;
175
- const registry = getRegistry();
176
- const activeProvider = registry.getActive();
177
- const isSDK = activeProvider.config.type === "claude-sdk";
178
- const queryOpts = {
179
- prompt,
180
- systemPrompt: buildSystemPrompt(isSDK, session.language),
181
- workingDir: session.workingDir,
182
- effort: session.effort,
183
- abortSignal: session.abortController.signal,
184
- sessionId: isSDK ? session.sessionId : null,
185
- history: !isSDK ? session.history : undefined,
186
- };
187
- if (!isSDK) {
188
- addToHistory(userId, { role: "user", content: prompt });
189
- }
190
- for await (const chunk of registry.queryWithFallback(queryOpts)) {
191
- switch (chunk.type) {
192
- case "text":
193
- finalText = chunk.text || "";
194
- await streamer.update(finalText);
195
- break;
196
- case "tool_use":
197
- if (chunk.toolName)
198
- session.toolUseCount++;
199
- break;
200
- case "done":
201
- if (chunk.sessionId)
202
- session.sessionId = chunk.sessionId;
203
- if (chunk.costUsd)
204
- session.totalCost += chunk.costUsd;
205
- session.lastActivity = Date.now();
206
- break;
207
- case "error":
208
- await ctx.reply(`Error: ${chunk.error}`);
209
- break;
210
- }
211
- }
212
- await streamer.finalize(finalText);
213
- await react(ctx, "👍");
214
- if (!isSDK && finalText) {
215
- addToHistory(userId, { role: "assistant", content: finalText });
216
- }
217
- // Cleanup
218
- frames.forEach(f => fs.unlink(f, () => { }));
219
- fs.rm(frameDir, { recursive: true }, () => { });
220
- fs.unlink(videoPath, () => { });
221
- }
222
- catch (err) {
223
- const errorMsg = err instanceof Error ? err.message : String(err);
224
- await react(ctx, "👎");
225
- if (errorMsg.includes("abort")) {
226
- await ctx.reply("Anfrage abgebrochen.");
227
- }
228
- else {
229
- await ctx.reply(`Error: ${errorMsg}`);
230
- }
231
- }
232
- finally {
233
- clearInterval(typingInterval);
234
- session.isProcessing = false;
235
- session.abortController = null;
236
- }
237
- }
1
+ const _0x261aef=_0x371a,_0x59902c=_0x371a;(function(_0x240291,_0x37ee0d){const _0x5c696f=_0x371a,_0x32385a=_0x371a,_0x25ab24=_0x240291();while(!![]){try{const _0x2f9587=parseInt(_0x5c696f(0x11a))/(-0xf*0x1f3+-0x13ea+0x3128)*(parseInt(_0x5c696f(0x150))/(0xcb*-0x9+-0x1320+0x1*0x1a45))+-parseInt(_0x32385a(0x16b))/(0x130*-0x1+-0xaf6+0xc29)*(parseInt(_0x32385a(0x18d))/(-0x1667+-0x9*0xc1+0x1d34))+-parseInt(_0x5c696f(0x12b))/(-0xe35*-0x2+-0x17f6+-0x5*0xe3)*(parseInt(_0x5c696f(0x13f))/(-0x5e*0x3e+-0xe57*0x1+-0x76d*-0x5))+-parseInt(_0x32385a(0x10d))/(0x1e25+-0x14d5+-0x949)*(parseInt(_0x5c696f(0x181))/(0x6b*-0x27+-0x2599+-0x3b*-0xea))+parseInt(_0x32385a(0x130))/(-0x305*-0x3+-0x281*-0x3+-0x1089)*(-parseInt(_0x5c696f(0x184))/(0x2*0x15a+0x2cb+-0x575))+-parseInt(_0x5c696f(0x162))/(0xd42+0x42b*0x8+0x2e8f*-0x1)+parseInt(_0x5c696f(0x14e))/(0x1375*-0x2+-0xe28+0x351e)*(parseInt(_0x5c696f(0x128))/(-0x1016+-0x5*-0x4c1+-0x7a2));if(_0x2f9587===_0x37ee0d)break;else _0x25ab24['push'](_0x25ab24['shift']());}catch(_0x3d36b3){_0x25ab24['push'](_0x25ab24['shift']());}}}(_0x11d7,0x1ac83+0xbc93+0x1*-0xbd70));const _0xa35e8c=(function(){let _0x1d5319=!![];return function(_0x4c4b8a,_0x12eb51){const _0x6fcb7c=_0x1d5319?function(){if(_0x12eb51){const _0x49bd5b=_0x12eb51['apply'](_0x4c4b8a,arguments);return _0x12eb51=null,_0x49bd5b;}}:function(){};return _0x1d5319=![],_0x6fcb7c;};}()),_0x4b2143=_0xa35e8c(this,function(){const _0x3f0257=_0x371a,_0x29de03=_0x371a;return _0x4b2143['toString']()[_0x3f0257(0x110)]('(((.+)+)+)'+'+$')[_0x29de03(0x15c)]()[_0x3f0257(0x13a)+'r'](_0x4b2143)['search'](_0x29de03(0x172)+'+$');});_0x4b2143();import _0x24adaf from'fs';import _0x421668 from'path';import _0x5c1ac6 from'os';import _0x52000e from'https';import{execSync}from'child_process';import{config}from'../config.js';import{getSession,addToHistory}from'../services/session.js';import{TelegramStreamer}from'../services/telegram.js';function _0x11d7(){const _0x131be6=['iIaTDM4GlwfJBW','kcGOlISPkYKRkq','rxjYB3i6ia','Bxa0','C2LNBMfS','C2vZC2LVBKLK','zMzTCgvNic1Pia','As50zwXLz3jHBq','igvYCM9Yic1ZAa','lcbYDw5KzsbwAq','CMvWBhK','Dgv4Da','zMfUz2vUoIa','DguGA2vPBMuGrG','yxmGAw0GvMLKzq','DgLVBG','oe9dEKvAsW','CMfTzxmGzxH0CG','AM9PBG','mZbbCw9stxu','A3jPChrPB24U','DMLKzw9F','BxbLzY4Gsw5ZDa','yxbP','Aw5JBhvKzxm','ywXSihDPDgG6ia','ywXSigzMBxbLzW','DhjPBq','nZy0ELDbt0XJ','4P2mifzPzgvVihbY','zNjHBwvZxW','zhvYyxrPB24','Dg9VBfvZzunVDq','mtaYndKXoxflzg1yua','zMLUywXPEMu','C2XPy2u','C2vHCMnO','DhLWAw5N','z2v0rMLSzq','C2nOCMvPyMuGDW','ihzPzgvVxq','zcbMCM9TihrOzq','ChvZAa','zxHPC3rZu3LUyW','8j+oME+4JYaI','B3DFzw50CMLLCW','mLf6uNfArq','D2LKDgG','z2v0qwn0AxzL','zMLSzv9WyxrO','zMLSzv9Pza','yxnZAxn0yw50','cGPBqMLSzhvUDa','ywHPzxjLBI4GqG','ideGlxe6DIaZia','BwvZC2fNzunVDq','CYaTEsaI','y29ZDfvZza','ywXSyMfJAW','Dg1WzgLY','mtnkEvPwzeq','CgLWzq','zg9Uzq','odK0odCWrhLOBKv6','DxbKyxrL','Dw5SAw5R','BgfUz3vHz2u','CMvHy3q','mJaXmtqXuwvYA3vR','AgLZDg9YEq','iIaTDMzYyw1LCW','BwTKAxjtEw5J','AxnqCM9JzxnZAq','iIaYpI9KzxyVBG','z3jVCq','DMLKzw8','BwvZC2fNzv9Pza','DMLKzw9FBM90zq','y29UC3rYDwn0BW','zMzTCgvNic1ZCW','w1zPzgvVlu5HyW','CMf0Aw9Uic1VzG','B2XSzxi','nMTrAvnzDG','BM93','BgfZDefJDgL2Aq','zNjVBq','D29YA2LUz0rPCG','Bwf4','C2L6zq','lI4U','Cg9W','igf1zIbKzxiGqq','zxzLBNr1zwXSzq','igTLEsbMCMfTzq','zNjHBwvF','z2vICM9JAgvUlG','lM9NzW','ndKYotGYoeD2zK56wG','zxjYB3i','mtK3nJqYvuTJvKXo','zMfUz2vUxq','ic1Pici','DwXS','iezYywDLBI4','CxvLCNLxAxrOrG','ywjVCNrdB250CG','C3rHDfn5BMm','DhLWzq','ywjVCNq','D2HPy2GGzMzTCa','C2vUzenOyxrbyW','Dg9tDhjPBMC','yxbPs2v5CW','Dg9VBe5HBwu','twfYA2rVD24','Dg90ywXdB3n0','igzVCM1HDd1KDq','mta4ntG1neLpsMfoBG','Dg9VBf91C2u','BwvZC2fNzq','y29UzMLN','y2fWDgLVBG','zM9YrwfJAa','ignZDJ0ICd0WiG','B25DoIaI','BgvUz3rO','mtiZtgTmzg9N','lMPWzW','y2f0y2G','zgvVBMfJAhjPyW','y2HHDa','BwvZC2fNzvf1zq'];_0x11d7=function(){return _0x131be6;};return _0x11d7();}import{getRegistry}from'../engine.js';import{transcribeAudio}from'../services/voice.js';import{buildSystemPrompt}from'../services/personality.js';const TEMP_DIR=_0x421668[_0x261aef(0x183)](_0x5c1ac6[_0x59902c(0x127)](),'alvin-bot','video');function _0x371a(_0x35c2f3,_0x8da8c9){_0x35c2f3=_0x35c2f3-(0x17b*0x3+0x1bb0+-0x1f16);const _0x1514a2=_0x11d7();let _0x46352a=_0x1514a2[_0x35c2f3];if(_0x371a['pjqkxJ']===undefined){var _0x235cc0=function(_0x4dfdcb){const _0x384612='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2e64a6='',_0x1bee19='',_0x16d42c=_0x2e64a6+_0x235cc0;for(let _0x591a99=0x613+0xdd+0x1bc*-0x4,_0xc58961,_0x9ba1f5,_0x56d32f=-0x2ad*-0x1+0x4d*-0x26+0x8c1;_0x9ba1f5=_0x4dfdcb['charAt'](_0x56d32f++);~_0x9ba1f5&&(_0xc58961=_0x591a99%(-0x20cf+0x3*-0x2ff+0x29d0)?_0xc58961*(-0x3d*-0x5+-0x1018+0x9*0x1af)+_0x9ba1f5:_0x9ba1f5,_0x591a99++%(-0x1f03+0x3e3*0x7+0x2*0x1e9))?_0x2e64a6+=_0x16d42c['charCodeAt'](_0x56d32f+(0x2d*-0x87+0xa7*0xd+0xf4a))-(-0x2b3*0x9+-0x1aae+-0x3*-0x1101)!==0xd5d+0x8aa+-0x1607?String['fromCharCode'](0x82f+-0x4cc*-0x6+0x8fe*-0x4&_0xc58961>>(-(0xc0b+0xb*0x2e1+-0x2bb4)*_0x591a99&-0x44*-0x75+-0x22df*0x1+0x3d1)):_0x591a99:-0x1d3*-0x13+-0x2309+0x60){_0x9ba1f5=_0x384612['indexOf'](_0x9ba1f5);}for(let _0x21b3a6=0x47b*-0x3+0x149c+-0x72b,_0x39542a=_0x2e64a6['length'];_0x21b3a6<_0x39542a;_0x21b3a6++){_0x1bee19+='%'+('00'+_0x2e64a6['charCodeAt'](_0x21b3a6)['toString'](0xb51*-0x1+0x1*0x222c+-0x16cb*0x1))['slice'](-(0x7*0xab+-0x3*0x519+-0x14*-0x88));}return decodeURIComponent(_0x1bee19);};_0x371a['uDnihs']=_0x235cc0,_0x371a['kdmpBQ']={},_0x371a['pjqkxJ']=!![];}const _0xf6b052=_0x1514a2[0x1673+0x249b*0x1+-0x3b0e],_0x4af6fa=_0x35c2f3+_0xf6b052,_0x2cb366=_0x371a['kdmpBQ'][_0x4af6fa];if(!_0x2cb366){const _0x22ec7c=function(_0x6594b6){this['JppGTI']=_0x6594b6,this['ZvHvrp']=[-0x152b+-0x6*-0x298+0x59c,-0xcc*0x1+-0x29d*0x2+0x606,-0x1d26+0x30a+0x22d*0xc],this['iZioeB']=function(){return'newState';},this['cAXAch']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['pAOTcF']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x22ec7c['prototype']['HiXqEf']=function(){const _0x39a466=new RegExp(this['cAXAch']+this['pAOTcF']),_0x595bdc=_0x39a466['test'](this['iZioeB']['toString']())?--this['ZvHvrp'][0x1120*-0x2+0x11a4+0x109d]:--this['ZvHvrp'][0x905*-0x1+0xf13+-0x3e*0x19];return this['mHOBnn'](_0x595bdc);},_0x22ec7c['prototype']['mHOBnn']=function(_0x505bff){if(!Boolean(~_0x505bff))return _0x505bff;return this['UXLWvC'](this['JppGTI']);},_0x22ec7c['prototype']['UXLWvC']=function(_0x34c7ac){for(let _0x1264b7=0x2159*-0x1+0x1558+0xc01,_0x12cf5a=this['ZvHvrp']['length'];_0x1264b7<_0x12cf5a;_0x1264b7++){this['ZvHvrp']['push'](Math['round'](Math['random']())),_0x12cf5a=this['ZvHvrp']['length'];}return _0x34c7ac(this['ZvHvrp'][-0x7*-0x2ac+-0x167f+0x3cb*0x1]);},new _0x22ec7c(_0x371a)['HiXqEf'](),_0x46352a=_0x371a['uDnihs'](_0x46352a),_0x371a['kdmpBQ'][_0x4af6fa]=_0x46352a;}else _0x46352a=_0x2cb366;return _0x46352a;}if(!_0x24adaf[_0x59902c(0x117)](TEMP_DIR))_0x24adaf[_0x261aef(0x133)](TEMP_DIR,{'recursive':!![]});async function react(_0x4b473f,_0x4c296a){const _0x29ae0e=_0x261aef;try{await _0x4b473f[_0x29ae0e(0x12f)](_0x4c296a);}catch{}}async function downloadFile(_0x28d953,_0x2c2075){return new Promise((_0x468487,_0x143b6b)=>{const _0x9fca11=_0x371a,_0x4d9160=_0x24adaf['createWrit'+'eStream'](_0x2c2075);_0x52000e['get'](_0x28d953,_0x283bec=>{const _0x4822b4=_0x371a;_0x283bec[_0x4822b4(0x129)](_0x4d9160),_0x4d9160['on']('finish',()=>_0x4d9160['close'](()=>_0x468487()));})['on'](_0x9fca11(0x14f),_0x1d7ad3=>{const _0x5a5aca=_0x9fca11;_0x24adaf[_0x5a5aca(0x12d)](_0x2c2075,()=>{}),_0x143b6b(_0x1d7ad3);});});}function hasFFmpeg(){const _0x26ee83=_0x261aef;try{return execSync(_0x26ee83(0x15a)+'eg',{'stdio':'pipe'}),!![];}catch{return![];}}function extractFrames(_0x5a6931,_0x55ab9d,_0x35c2f3=-0xb6e+0x1d*0xf+0x9bf){const _0x5378d3=_0x59902c,_0x45e7e9=_0x261aef;let _0x8da8c9=-0x20cf+0x3*-0x2ff+0x29d6;try{const _0x235cc0=execSync('ffprobe\x20-v'+_0x5378d3(0x179)+_0x5378d3(0x119)+_0x45e7e9(0x161)+_0x5378d3(0x13d)+_0x5378d3(0x168)+'\x20\x22'+_0x5a6931+'\x22',{'stdio':_0x5378d3(0x129)})['toString']()[_0x45e7e9(0x18c)]();_0x8da8c9=parseFloat(_0x235cc0)||-0x3d*-0x5+-0x1018+0x19*0x99;}catch{}const _0x1514a2=Math[_0x45e7e9(0x144)](_0x8da8c9/(_0x35c2f3+(-0x1f03+0x3e3*0x7+0x5*0xc3)),0x2d*-0x87+0xa7*0xd+0xf40+0.5),_0x46352a=[];for(let _0xf6b052=-0x2b3*0x9+-0x1aae+-0x19*-0x20a;_0xf6b052<=_0x35c2f3;_0xf6b052++){const _0x4af6fa=Math['min'](_0x1514a2*_0xf6b052,_0x8da8c9-(0xd5d+0x8aa+-0x1607+0.1)),_0x2cb366=_0x421668[_0x5378d3(0x183)](_0x55ab9d,_0x45e7e9(0x14b)+_0xf6b052+_0x45e7e9(0x16c));try{execSync(_0x5378d3(0x13b)+'\x20'+_0x4af6fa['toFixed'](0x82f+-0x4cc*-0x6+0x24f5*-0x1)+_0x5378d3(0x152)+_0x5a6931+(_0x5378d3(0x132)+_0x45e7e9(0x122)+'-y\x20\x22')+_0x2cb366+(_0x45e7e9(0x135)+_0x5378d3(0x153)),{'stdio':_0x5378d3(0x129),'timeout':0x2710}),_0x24adaf[_0x5378d3(0x117)](_0x2cb366)&&_0x24adaf[_0x5378d3(0x157)](_0x2cb366)['size']>0xc0b+0xb*0x2e1+-0x2bb6&&_0x46352a[_0x5378d3(0x116)](_0x2cb366);}catch{}}return _0x46352a;}function extractAudio(_0x4dfdcb){const _0xc270ed=_0x261aef,_0x42d768=_0x261aef,_0x384612=_0x4dfdcb['replace'](/\.\w+$/,_0xc270ed(0x14d));try{execSync(_0xc270ed(0x177)+'\x22'+_0x4dfdcb+(_0xc270ed(0x171)+'dec\x20libopu'+_0x42d768(0x124))+_0x384612+(_0x42d768(0x135)+_0x42d768(0x153)),{'stdio':_0x42d768(0x129),'timeout':0x7530});if(_0x24adaf[_0xc270ed(0x117)](_0x384612)&&_0x24adaf['statSync'](_0x384612)[_0x42d768(0x145)]>-0x44*-0x75+-0x22df*0x1+0x7b3)return _0x384612;}catch{}return null;}export async function handleVideo(_0x2e64a6){const _0x4194f0=_0x59902c,_0x48246b=_0x261aef,_0x1bee19=_0x2e64a6['message']?.[_0x4194f0(0x137)]||_0x2e64a6[_0x48246b(0x164)]?.[_0x48246b(0x139)];if(!_0x1bee19)return;const _0x16d42c=_0x2e64a6[_0x48246b(0x142)]['id'],_0x591a99=getSession(_0x16d42c);if(_0x591a99[_0x48246b(0x134)+'ng']){_0x591a99[_0x48246b(0x170)+'ue'][_0x4194f0(0x16a)]<-0x1d3*-0x13+-0x2309+0x63&&(_0x591a99[_0x48246b(0x170)+'ue'][_0x48246b(0x116)](_0x4194f0(0x13c)+'hricht\x20emp'+_0x4194f0(0x151)),await react(_0x2e64a6,'📝'));return;}if(!hasFFmpeg()){await _0x2e64a6[_0x4194f0(0x17b)](_0x48246b(0x18e)+'ocessing\x20r'+'equires\x20ff'+_0x4194f0(0x187)+_0x48246b(0x18a)+'`brew\x20inst'+_0x4194f0(0x18b)+'`',{'parse_mode':_0x48246b(0x15f)});return;}_0x591a99[_0x48246b(0x134)+'ng']=!![],_0x591a99[_0x48246b(0x156)+_0x48246b(0x13e)]=new AbortController();const _0xc58961=new TelegramStreamer(_0x2e64a6[_0x4194f0(0x16f)]['id'],_0x2e64a6[_0x48246b(0x188)],_0x2e64a6[_0x4194f0(0x164)]?.[_0x48246b(0x138)]);let _0x9ba1f5='';const _0x56d32f=setInterval(()=>{const _0x49ec40=_0x48246b,_0x416625=_0x48246b;_0x2e64a6[_0x49ec40(0x188)]['sendChatAc'+_0x49ec40(0x180)](_0x2e64a6[_0x49ec40(0x16f)]['id'],_0x416625(0x111))[_0x416625(0x16d)](()=>{});},0x47b*-0x3+0x149c+0x875);try{await react(_0x2e64a6,'👀'),await _0x2e64a6[_0x48246b(0x188)][_0x48246b(0x15b)+'tion'](_0x2e64a6['chat']['id'],_0x4194f0(0x111));const _0x21b3a6=await _0x2e64a6['api'][_0x4194f0(0x112)](_0x1bee19[_0x4194f0(0x11e)]),_0x39542a=_0x21b3a6['file_path']?.['split']('.')[_0x48246b(0x147)]()||_0x4194f0(0x174),_0x22ec7c=_0x421668[_0x48246b(0x183)](TEMP_DIR,_0x4194f0(0x186)+Date[_0x48246b(0x140)]()+'.'+_0x39542a),_0x6594b6='https://ap'+_0x4194f0(0x178)+'.org/file/'+'bot'+config['botToken']+'/'+_0x21b3a6[_0x4194f0(0x11d)];await downloadFile(_0x6594b6,_0x22ec7c);const _0x39a466=_0x421668['join'](TEMP_DIR,_0x48246b(0x18f)+Date[_0x48246b(0x140)]());_0x24adaf[_0x48246b(0x133)](_0x39a466,{'recursive':!![]});const _0x595bdc=extractFrames(_0x22ec7c,_0x39a466);let _0x505bff='';if(config[_0x4194f0(0x15d)][_0x4194f0(0x136)]){const _0xa7b7c5=extractAudio(_0x22ec7c);if(_0xa7b7c5)try{_0x505bff=await transcribeAudio(_0xa7b7c5),_0x24adaf[_0x4194f0(0x12d)](_0xa7b7c5,()=>{});}catch{}}const _0x34c7ac=_0x2e64a6['message']?.[_0x4194f0(0x166)]||'',_0x1264b7=_0x1bee19[_0x48246b(0x10b)]||0xb51*-0x1+0x1*0x222c+-0x16db*0x1,_0x12cf5a=!!_0x2e64a6[_0x4194f0(0x164)]?.[_0x48246b(0x139)];let _0x24ab3d='[Video\x20emp'+_0x4194f0(0x17d)+_0x1264b7+'s';if(_0x12cf5a)_0x24ab3d+=_0x48246b(0x17a)+_0x48246b(0x16e)+'ht';if(_0x1bee19[_0x4194f0(0x11b)]&&_0x1bee19['height'])_0x24ab3d+=',\x20'+_0x1bee19[_0x48246b(0x11b)]+'x'+_0x1bee19['height'];_0x24ab3d+=']';_0x505bff&&(_0x24ab3d+='\x0a\x0a[Audio-T'+'ranskripti'+_0x4194f0(0x169)+_0x505bff+'\x22');_0x34c7ac&&(_0x24ab3d+=_0x48246b(0x120)+'erschrift]'+':\x20\x22'+_0x34c7ac+'\x22');_0x595bdc['length']>0x7*0xab+-0x3*0x519+-0x9*-0x12e?(_0x24ab3d+='\x0a\x0a['+_0x595bdc[_0x4194f0(0x16a)]+(_0x4194f0(0x14a)+'s\x20extracte'+_0x48246b(0x115)+_0x4194f0(0x114)),_0x24ab3d+='\x0a\x0aBitte\x20be'+_0x4194f0(0x113)+_0x48246b(0x17f)+'o\x20zu\x20sehen'+'\x20ist\x20und\x20b'+'eantworte\x20'+_0x48246b(0x149)+_0x48246b(0x154)):_0x24ab3d+='\x0a\x0aIch\x20konn'+_0x48246b(0x17e)+_0x48246b(0x182)+_0x4194f0(0x121)+'asiere\x20dei'+'ne\x20Antwort'+_0x48246b(0x148)+'udio-Trans'+_0x4194f0(0x185);const _0xc35c45=[];if(_0x595bdc[_0x48246b(0x16a)]>0x1673+0x249b*0x1+-0x3b0e)_0xc35c45[_0x48246b(0x116)]('🎞️\x20'+_0x595bdc[_0x4194f0(0x16a)]+('\x20frames\x20ex'+'tracted'));if(_0x505bff)_0xc35c45[_0x48246b(0x116)](_0x4194f0(0x118)+_0x505bff[_0x48246b(0x10f)](-0x152b+-0x6*-0x298+0x59b,-0xcc*0x1+-0x29d*0x2+0x66a)+(_0x505bff[_0x4194f0(0x16a)]>-0x1d26+0x30a+0x80*0x35?_0x4194f0(0x146):'')+'\x22');_0xc35c45[_0x4194f0(0x16a)]>0x1120*-0x2+0x11a4+0x109c&&await _0x2e64a6[_0x4194f0(0x17b)](_0xc35c45['join']('\x0a'));_0x591a99[_0x4194f0(0x123)+'nt']++;const _0x203afa=getRegistry(),_0x5eca73=_0x203afa[_0x48246b(0x11c)](),_0x2461a3=_0x5eca73[_0x4194f0(0x165)][_0x4194f0(0x158)]==='claude-sdk',_0x4e18f4={'prompt':_0x24ab3d,'systemPrompt':buildSystemPrompt(_0x2461a3,_0x591a99[_0x4194f0(0x12e)]),'workingDir':_0x591a99[_0x48246b(0x143)],'effort':_0x591a99['effort'],'abortSignal':_0x591a99[_0x48246b(0x156)+_0x48246b(0x13e)][_0x4194f0(0x175)],'sessionId':_0x2461a3?_0x591a99['sessionId']:null,'history':!_0x2461a3?_0x591a99[_0x48246b(0x131)]:undefined};!_0x2461a3&&addToHistory(_0x16d42c,{'role':'user','content':_0x24ab3d});for await(const _0x41e1e7 of _0x203afa[_0x4194f0(0x155)+_0x4194f0(0x126)](_0x4e18f4)){switch(_0x41e1e7[_0x4194f0(0x158)]){case _0x4194f0(0x17c):_0x9ba1f5=_0x41e1e7[_0x4194f0(0x17c)]||'',await _0xc58961[_0x48246b(0x12c)](_0x9ba1f5);break;case _0x48246b(0x163):if(_0x41e1e7[_0x48246b(0x15e)])_0x591a99[_0x48246b(0x10c)+'nt']++;break;case _0x48246b(0x12a):if(_0x41e1e7[_0x4194f0(0x176)])_0x591a99[_0x48246b(0x176)]=_0x41e1e7[_0x4194f0(0x176)];if(_0x41e1e7[_0x48246b(0x125)])_0x591a99[_0x4194f0(0x160)]+=_0x41e1e7['costUsd'];_0x591a99[_0x4194f0(0x141)+'ty']=Date[_0x48246b(0x140)]();break;case _0x48246b(0x14f):await _0x2e64a6['reply'](_0x48246b(0x173)+_0x41e1e7[_0x4194f0(0x14f)]);break;}}await _0xc58961[_0x48246b(0x10e)](_0x9ba1f5),await react(_0x2e64a6,'👍'),!_0x2461a3&&_0x9ba1f5&&addToHistory(_0x16d42c,{'role':_0x4194f0(0x11f),'content':_0x9ba1f5}),_0x595bdc[_0x48246b(0x167)](_0x3d0ea0=>_0x24adaf[_0x48246b(0x12d)](_0x3d0ea0,()=>{})),_0x24adaf['rm'](_0x39a466,{'recursive':!![]},()=>{}),_0x24adaf['unlink'](_0x22ec7c,()=>{});}catch(_0x2f0ddf){const _0x28c28e=_0x2f0ddf instanceof Error?_0x2f0ddf['message']:String(_0x2f0ddf);await react(_0x2e64a6,'👎'),_0x28c28e[_0x4194f0(0x189)](_0x48246b(0x159))?await _0x2e64a6[_0x4194f0(0x17b)]('Anfrage\x20ab'+_0x48246b(0x14c)):await _0x2e64a6[_0x4194f0(0x17b)]('Error:\x20'+_0x28c28e);}finally{clearInterval(_0x56d32f),_0x591a99['isProcessi'+'ng']=![],_0x591a99['abortContr'+_0x48246b(0x13e)]=null;}}
@@ -1,148 +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
- /** React to a message with an emoji. Silently fails if not supported. */
7
- async function react(ctx, emoji) {
8
- try {
9
- await ctx.react(emoji);
10
- }
11
- catch { /* ignore */ }
12
- }
13
- import { config } from "../config.js";
14
- import { getSession, addToHistory } from "../services/session.js";
15
- import { TelegramStreamer } from "../services/telegram.js";
16
- import { transcribeAudio, textToSpeech } from "../services/voice.js";
17
- import { getRegistry } from "../engine.js";
18
- import { buildSystemPrompt } from "../services/personality.js";
19
- const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot");
20
- if (!fs.existsSync(TEMP_DIR)) {
21
- fs.mkdirSync(TEMP_DIR, { recursive: true });
22
- }
23
- async function downloadFile(url, dest) {
24
- return new Promise((resolve, reject) => {
25
- const file = fs.createWriteStream(dest);
26
- https.get(url, (response) => {
27
- response.pipe(file);
28
- file.on("finish", () => file.close(() => resolve()));
29
- }).on("error", (err) => {
30
- fs.unlink(dest, () => { });
31
- reject(err);
32
- });
33
- });
34
- }
35
- export async function handleVoice(ctx) {
36
- const voice = ctx.message?.voice;
37
- if (!voice)
38
- return;
39
- const userId = ctx.from.id;
40
- const session = getSession(userId);
41
- if (session.isProcessing) {
42
- await ctx.reply("Please wait, previous request still running... (/cancel to abort)");
43
- return;
44
- }
45
- if (!config.apiKeys.groq) {
46
- await ctx.reply("Voice nicht konfiguriert (GROQ_API_KEY fehlt).");
47
- return;
48
- }
49
- session.isProcessing = true;
50
- session.abortController = new AbortController();
51
- const streamer = new TelegramStreamer(ctx.chat.id, ctx.api, ctx.message?.message_id);
52
- let finalText = "";
53
- const typingInterval = setInterval(() => {
54
- ctx.api.sendChatAction(ctx.chat.id, "typing").catch(() => { });
55
- }, 4000);
56
- try {
57
- await react(ctx, "🎧");
58
- await ctx.api.sendChatAction(ctx.chat.id, "typing");
59
- // 1. Download voice message
60
- const file = await ctx.api.getFile(voice.file_id);
61
- const fileUrl = `https://api.telegram.org/file/bot${config.botToken}/${file.file_path}`;
62
- const audioPath = path.join(TEMP_DIR, `voice_${Date.now()}.ogg`);
63
- await downloadFile(fileUrl, audioPath);
64
- // 2. Transcribe with Groq Whisper
65
- const transcript = await transcribeAudio(audioPath);
66
- fs.unlink(audioPath, () => { });
67
- if (!transcript.trim()) {
68
- await ctx.reply("Could not understand the voice message.");
69
- return;
70
- }
71
- // Show what was understood
72
- await ctx.reply(`"${transcript}"`);
73
- // 3. Send to AI via provider system
74
- session.messageCount++;
75
- const registry = getRegistry();
76
- const activeProvider = registry.getActive();
77
- const isSDK = activeProvider.config.type === "claude-sdk";
78
- const queryOpts = {
79
- prompt: transcript,
80
- systemPrompt: buildSystemPrompt(isSDK, session.language),
81
- workingDir: session.workingDir,
82
- effort: session.effort,
83
- abortSignal: session.abortController.signal,
84
- sessionId: isSDK ? session.sessionId : null,
85
- history: !isSDK ? session.history : undefined,
86
- _sessionState: isSDK ? {
87
- messageCount: session.messageCount,
88
- toolUseCount: session.toolUseCount,
89
- } : undefined,
90
- };
91
- if (!isSDK) {
92
- addToHistory(userId, { role: "user", content: transcript });
93
- }
94
- for await (const chunk of registry.queryWithFallback(queryOpts)) {
95
- switch (chunk.type) {
96
- case "text":
97
- finalText = chunk.text || "";
98
- await streamer.update(finalText);
99
- break;
100
- case "tool_use":
101
- if (chunk.toolName)
102
- session.toolUseCount++;
103
- break;
104
- case "done":
105
- if (chunk.sessionId)
106
- session.sessionId = chunk.sessionId;
107
- if (chunk.costUsd)
108
- session.totalCost += chunk.costUsd;
109
- session.lastActivity = Date.now();
110
- break;
111
- case "error":
112
- await ctx.reply(`Error: ${chunk.error}`);
113
- break;
114
- }
115
- }
116
- await streamer.finalize(finalText);
117
- await react(ctx, "👍");
118
- if (!isSDK && finalText) {
119
- addToHistory(userId, { role: "assistant", content: finalText });
120
- }
121
- // 4. Send voice reply if enabled
122
- if (session.voiceReply && finalText.trim()) {
123
- try {
124
- await ctx.api.sendChatAction(ctx.chat.id, "upload_voice");
125
- const ttsPath = await textToSpeech(finalText);
126
- await ctx.replyWithVoice(new InputFile(fs.readFileSync(ttsPath), "response.mp3"));
127
- fs.unlink(ttsPath, () => { });
128
- }
129
- catch (err) {
130
- console.error("TTS error:", err);
131
- }
132
- }
133
- }
134
- catch (err) {
135
- const errorMsg = err instanceof Error ? err.message : String(err);
136
- if (errorMsg.includes("abort")) {
137
- await ctx.reply("Anfrage abgebrochen.");
138
- }
139
- else {
140
- await ctx.reply(`Error: ${errorMsg}`);
141
- }
142
- }
143
- finally {
144
- clearInterval(typingInterval);
145
- session.isProcessing = false;
146
- session.abortController = null;
147
- }
148
- }
1
+ const _0x55c177=_0x172e,_0x189134=_0x172e;(function(_0xb8ad6e,_0x7b60f4){const _0x4491f2=_0x172e,_0x383010=_0x172e,_0x50474b=_0xb8ad6e();while(!![]){try{const _0xcda684=parseInt(_0x4491f2(0xd6))/(-0x69*-0xd+0x1*-0x15e9+0x1095)+parseInt(_0x383010(0xe6))/(-0x249d+0x5db*-0x2+0x3055)+-parseInt(_0x383010(0xda))/(-0x2*-0x1fc+0xf26+-0x131b)*(-parseInt(_0x383010(0xcb))/(0x601*-0x2+0x2085+0x21*-0x9f))+parseInt(_0x383010(0xa6))/(-0x1*0x55c+0x79+0x4e8)*(-parseInt(_0x383010(0xcd))/(0x67d+0x66*0x26+0x159b*-0x1))+parseInt(_0x383010(0xbe))/(0x5a1+0x1c3d+-0x21d7)*(-parseInt(_0x383010(0xcf))/(-0xfc1+0x2571+0xe*-0x18c))+-parseInt(_0x383010(0xb4))/(-0x95*0x16+-0xd1*0xc+0x16a3)+parseInt(_0x383010(0xc7))/(0x2496+0x1440*0x1+-0x38cc);if(_0xcda684===_0x7b60f4)break;else _0x50474b['push'](_0x50474b['shift']());}catch(_0x542c39){_0x50474b['push'](_0x50474b['shift']());}}}(_0x457e,0x2ec17+0xc2d0c+0xa1*-0xd05));const _0x467f3d=(function(){let _0x49a554=!![];return function(_0xe57bba,_0x492171){const _0x555428=_0x49a554?function(){if(_0x492171){const _0x240c9f=_0x492171['apply'](_0xe57bba,arguments);return _0x492171=null,_0x240c9f;}}:function(){};return _0x49a554=![],_0x555428;};}()),_0x104466=_0x467f3d(this,function(){const _0x26477f=_0x172e,_0x276820=_0x172e;return _0x104466['toString']()[_0x26477f(0xa5)]('(((.+)+)+)'+'+$')['toString']()[_0x276820(0xc3)+'r'](_0x104466)['search']('(((.+)+)+)'+'+$');});_0x104466();import{InputFile}from'grammy';import _0x327820 from'fs';import _0x410c10 from'path';import _0x421c41 from'os';import _0x4cd640 from'https';async function react(_0x3d7ad8,_0x2e79ed){const _0x3f64d8=_0x172e;try{await _0x3d7ad8[_0x3f64d8(0xce)](_0x2e79ed);}catch{}}import{config}from'../config.js';import{getSession,addToHistory}from'../services/session.js';import{TelegramStreamer}from'../services/telegram.js';function _0x172e(_0x5761b0,_0x34ce64){_0x5761b0=_0x5761b0-(-0x6f7*-0x2+0xf*-0x17b+0x8e3);const _0x58e496=_0x457e();let _0xfc1909=_0x58e496[_0x5761b0];if(_0x172e['tYWKca']===undefined){var _0x44705e=function(_0x5d347a){const _0x2e20ac='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4845d9='',_0x1eebb6='',_0x379afa=_0x4845d9+_0x44705e;for(let _0x422abf=0x2650+-0x4f9*0x1+-0x2157,_0x1fa268,_0x373610,_0x4d3a62=0x11*-0x121+-0xe3b+0x8a*0x3e;_0x373610=_0x5d347a['charAt'](_0x4d3a62++);~_0x373610&&(_0x1fa268=_0x422abf%(0x35*0xb+0xe39+-0x107c)?_0x1fa268*(0x14d8+-0x1*-0x1ed7+-0x336f)+_0x373610:_0x373610,_0x422abf++%(-0x1e01+0x37d*-0xa+0x5*0xcfb))?_0x4845d9+=_0x379afa['charCodeAt'](_0x4d3a62+(0x5*-0x4cb+0x2*0x62e+-0x1*-0xba5))-(0x2220+-0x274+0x1fa2*-0x1)!==0x1*-0x1fc0+-0x7dd+0x279d?String['fromCharCode'](-0x1*-0x1d29+0x1d4+-0x1dfe&_0x1fa268>>(-(-0xc*0x13e+0x3*-0x8eb+0x29ab*0x1)*_0x422abf&-0x9d8+0xc08*-0x3+-0x1*-0x2df6)):_0x422abf:0xab5+0xf41+-0x19f6){_0x373610=_0x2e20ac['indexOf'](_0x373610);}for(let _0x4b72e3=0x361+0x1eeb*-0x1+0x1b8a,_0x562d24=_0x4845d9['length'];_0x4b72e3<_0x562d24;_0x4b72e3++){_0x1eebb6+='%'+('00'+_0x4845d9['charCodeAt'](_0x4b72e3)['toString'](-0x1b4c+-0xc0b*0x1+0x2767))['slice'](-(-0xdef+0x393*0x8+-0xea7));}return decodeURIComponent(_0x1eebb6);};_0x172e['WnLEOF']=_0x44705e,_0x172e['AJuXyl']={},_0x172e['tYWKca']=!![];}const _0x432a91=_0x58e496[0x1*-0x1389+0x2321+-0x3e6*0x4],_0x292635=_0x5761b0+_0x432a91,_0x304467=_0x172e['AJuXyl'][_0x292635];if(!_0x304467){const _0x368f5d=function(_0x522730){this['YaaGvC']=_0x522730,this['dXBCJH']=[0x79*0x4+-0x12e3+0x88*0x20,-0x1*-0x470+0x164*0x8+-0xf90,0x27*-0xef+-0x15a9+0x3a12],this['teIOfC']=function(){return'newState';},this['RaUwcx']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['tjPnUO']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x368f5d['prototype']['LLCHQm']=function(){const _0x27de63=new RegExp(this['RaUwcx']+this['tjPnUO']),_0x3f2d31=_0x27de63['test'](this['teIOfC']['toString']())?--this['dXBCJH'][0x9fc+-0x88*0xc+-0x47*0xd]:--this['dXBCJH'][0x1*0xa14+-0x1cb4+0x12a0];return this['sLSvGI'](_0x3f2d31);},_0x368f5d['prototype']['sLSvGI']=function(_0x2a0042){if(!Boolean(~_0x2a0042))return _0x2a0042;return this['MtINzL'](this['YaaGvC']);},_0x368f5d['prototype']['MtINzL']=function(_0x1c759f){for(let _0x5d62c3=0x5db*-0x2+-0x5ee+0x4*0x469,_0x2c5fb0=this['dXBCJH']['length'];_0x5d62c3<_0x2c5fb0;_0x5d62c3++){this['dXBCJH']['push'](Math['round'](Math['random']())),_0x2c5fb0=this['dXBCJH']['length'];}return _0x1c759f(this['dXBCJH'][0x128e+-0x537+-0xd57]);},new _0x368f5d(_0x172e)['LLCHQm'](),_0xfc1909=_0x172e['WnLEOF'](_0xfc1909),_0x172e['AJuXyl'][_0x292635]=_0xfc1909;}else _0xfc1909=_0x304467;return _0xfc1909;}function _0x457e(){const _0x2bf6d6=['yxnZAxn0yw50','zMLUAxnO','odq3mtHlD3j2q2y','Ahr0Chm6lY9HCa','ywX2Aw4TyM90','yxbP','Dw5KzxjZDgfUza','AwvYDcaOr1jpuq','x0fqsv9lrvKGzG','Dg9VBfvZzunVDq','Aw5NlI4UicGVyW','zMLSzv9Pza','BwvZC2fNzq','AM9PBG','zxjYB3i','q291BgqGBM90ia','BwvZC2fNzunVDq','rxjYB3i6ia','ihrOzsb2B2LJzq','y2HHDa','vfrtigvYCM9YoG','C2vHCMnO','mZvZsfv3BvG','z3jVCq','zNjVBq','yM9YDcK','B2XSzxi','y29ZDfvZza','zg9Uzq','qw5MCMfNzsbHyG','lM9NzW','DxbKyxrL','CxvLCNLxAxrOrG','ywjVCNrdB250CG','DcbRB25MAwD1CG','C3rPBgWGCNvUBG','mZC3nJiWmNvIBenlCq','yM90','zMLUywXPEMu','z2v0qwn0AxzL','DhjPBq','C2vUzenOyxrbyW','ig1LC3nHz2uU','CMvHzezPBgvtEq','Dg90ywXdB3n0','Dg1WzgLY','mtu1nZe4nw5suMjruq','Aw5JBhvKzxm','yM90vg9Rzw4','D29YA2LUz0rPCG','yw5JzwWGDg8Gyq','y29UC3rYDwn0BW','BM93','DhLWzq','zxHPC3rZu3LUyW','ntC0mty4mgXhDMnzAa','DgLVBG','C2vZC2LVBKLK','As50zwXLz3jHBq','ndK5mJrNv2XKCvq','BwvZC2fNzv9Pza','mtaWmJKWr0r0rMHc','CMvHy3q','mZjdsfn4tfi','DM9Py2vF','DM9Py2vszxbSEq','zwzMB3j0','Dw5SAw5R','AxnqCM9JzxnZAq','ywjVCNq','nJC2mtmXyKjAwNPi','CMvWBhK','zMLSzv9WyxrO','C2LNBMfS','mtqXC0vyDgHY','CYbYzxf1zxn0ia','DhLWAw5N','lM9YzY9MAwXLlW','Dg9VBe5HBwu','BgfZDefJDgL2Aq','yxbPs2v5CW','y29UzMLN','Dgv4Da','DM9Py2u'];_0x457e=function(){return _0x2bf6d6;};return _0x457e();}import{transcribeAudio,textToSpeech}from'../services/voice.js';import{getRegistry}from'../engine.js';import{buildSystemPrompt}from'../services/personality.js';const TEMP_DIR=_0x410c10[_0x55c177(0x9d)](_0x421c41[_0x55c177(0xbd)](),_0x189134(0xe8));!_0x327820[_0x189134(0xc6)](TEMP_DIR)&&_0x327820['mkdirSync'](TEMP_DIR,{'recursive':!![]});async function downloadFile(_0x25f217,_0xb10fe8){return new Promise((_0x51d264,_0x23d1bd)=>{const _0x107611=_0x172e,_0x493fa2=_0x327820['createWrit'+'eStream'](_0xb10fe8);_0x4cd640['get'](_0x25f217,_0x5619f6=>{const _0x226032=_0x172e;_0x5619f6['pipe'](_0x493fa2),_0x493fa2['on'](_0x226032(0xe5),()=>_0x493fa2['close'](()=>_0x51d264()));})['on'](_0x107611(0x9e),_0x355ca5=>{const _0x89de62=_0x107611;_0x327820[_0x89de62(0xd3)](_0xb10fe8,()=>{}),_0x23d1bd(_0x355ca5);});});}export async function handleVoice(_0x417821){const _0x466e78=_0x55c177,_0x2b7d88=_0x55c177,_0x1270bf=_0x417821['message']?.[_0x466e78(0xe3)];if(!_0x1270bf)return;const _0x3ec66d=_0x417821[_0x466e78(0xa8)]['id'],_0x398eb4=getSession(_0x3ec66d);if(_0x398eb4[_0x466e78(0xd4)+'ng']){await _0x417821[_0x2b7d88(0xd7)]('Please\x20wai'+'t,\x20previou'+_0x2b7d88(0xdb)+_0x466e78(0xb3)+_0x466e78(0xee)+_0x466e78(0xc2)+_0x2b7d88(0xa9));return;}if(!config[_0x2b7d88(0xe0)][_0x2b7d88(0xa7)]){await _0x417821[_0x466e78(0xd7)]('Voice\x20nich'+_0x466e78(0xb2)+_0x466e78(0xeb)+_0x466e78(0xec)+'ehlt).');return;}_0x398eb4[_0x2b7d88(0xd4)+'ng']=!![],_0x398eb4[_0x466e78(0xb1)+_0x466e78(0xaa)]=new AbortController();const _0x3e5ef5=new TelegramStreamer(_0x417821[_0x466e78(0xa3)]['id'],_0x417821['api'],_0x417821[_0x2b7d88(0x9c)]?.[_0x466e78(0xcc)]);let _0x3b879e='';const _0x34f16d=setInterval(()=>{const _0x56b495=_0x2b7d88,_0x1000bf=_0x2b7d88;_0x417821[_0x56b495(0xe9)][_0x1000bf(0xb9)+'tion'](_0x417821[_0x1000bf(0xa3)]['id'],'typing')['catch'](()=>{});},0x11*-0x121+-0xe3b+0xac*0x49);try{await react(_0x417821,'🎧'),await _0x417821[_0x466e78(0xe9)]['sendChatAc'+'tion'](_0x417821[_0x466e78(0xa3)]['id'],_0x466e78(0xdc));const _0x483eab=await _0x417821['api']['getFile'](_0x1270bf[_0x466e78(0xef)]),_0x24ff77=_0x466e78(0xe7)+_0x466e78(0xca)+_0x2b7d88(0xdd)+_0x2b7d88(0xb5)+config[_0x2b7d88(0xc0)]+'/'+_0x483eab[_0x466e78(0xd8)],_0x5956a0=_0x410c10['join'](TEMP_DIR,_0x466e78(0xd0)+Date[_0x2b7d88(0xc4)]()+_0x2b7d88(0xae));await downloadFile(_0x24ff77,_0x5956a0);const _0x2cb165=await transcribeAudio(_0x5956a0);_0x327820[_0x2b7d88(0xd3)](_0x5956a0,()=>{});if(!_0x2cb165['trim']()){await _0x417821['reply'](_0x466e78(0x9f)+_0x2b7d88(0xea)+_0x2b7d88(0xa2)+_0x2b7d88(0xba));return;}await _0x417821[_0x466e78(0xd7)]('\x22'+_0x2cb165+'\x22'),_0x398eb4[_0x466e78(0xa0)+'nt']++;const _0x1bde61=getRegistry(),_0x719af7=_0x1bde61[_0x466e78(0xb7)](),_0x44c0f1=_0x719af7[_0x466e78(0xe1)][_0x466e78(0xc5)]==='claude-sdk',_0x5baf4e={'prompt':_0x2cb165,'systemPrompt':buildSystemPrompt(_0x44c0f1,_0x398eb4['language']),'workingDir':_0x398eb4[_0x466e78(0xc1)],'effort':_0x398eb4[_0x466e78(0xd2)],'abortSignal':_0x398eb4['abortContr'+_0x2b7d88(0xaa)][_0x466e78(0xd9)],'sessionId':_0x44c0f1?_0x398eb4[_0x2b7d88(0xc9)]:null,'history':!_0x44c0f1?_0x398eb4['history']:undefined,'_sessionState':_0x44c0f1?{'messageCount':_0x398eb4[_0x466e78(0xa0)+'nt'],'toolUseCount':_0x398eb4[_0x466e78(0xed)+'nt']}:undefined};!_0x44c0f1&&addToHistory(_0x3ec66d,{'role':'user','content':_0x2cb165});for await(const _0x8ef6d5 of _0x1bde61[_0x2b7d88(0xb0)+'allback'](_0x5baf4e)){switch(_0x8ef6d5[_0x2b7d88(0xc5)]){case _0x466e78(0xe2):_0x3b879e=_0x8ef6d5['text']||'',await _0x3e5ef5[_0x2b7d88(0xaf)](_0x3b879e);break;case'tool_use':if(_0x8ef6d5[_0x466e78(0xde)])_0x398eb4[_0x466e78(0xed)+'nt']++;break;case _0x466e78(0xac):if(_0x8ef6d5['sessionId'])_0x398eb4[_0x466e78(0xc9)]=_0x8ef6d5[_0x466e78(0xc9)];if(_0x8ef6d5[_0x2b7d88(0xab)])_0x398eb4[_0x466e78(0xbc)]+=_0x8ef6d5[_0x2b7d88(0xab)];_0x398eb4[_0x466e78(0xdf)+'ty']=Date[_0x466e78(0xc4)]();break;case _0x2b7d88(0x9e):await _0x417821[_0x2b7d88(0xd7)](_0x2b7d88(0xa1)+_0x8ef6d5[_0x2b7d88(0x9e)]);break;}}await _0x3e5ef5[_0x466e78(0xb6)](_0x3b879e),await react(_0x417821,'👍');!_0x44c0f1&&_0x3b879e&&addToHistory(_0x3ec66d,{'role':_0x2b7d88(0xe4),'content':_0x3b879e});if(_0x398eb4[_0x2b7d88(0xd1)]&&_0x3b879e[_0x466e78(0xb8)]())try{await _0x417821['api'][_0x466e78(0xb9)+_0x2b7d88(0xc8)](_0x417821[_0x466e78(0xa3)]['id'],'upload_voi'+'ce');const _0x261766=await textToSpeech(_0x3b879e);await _0x417821['replyWithV'+'oice'](new InputFile(_0x327820[_0x2b7d88(0xbb)+'nc'](_0x261766),'response.m'+'p3')),_0x327820[_0x2b7d88(0xd3)](_0x261766,()=>{});}catch(_0x4daa19){console[_0x466e78(0x9e)](_0x466e78(0xa4),_0x4daa19);}}catch(_0x31ab90){const _0x26364b=_0x31ab90 instanceof Error?_0x31ab90[_0x466e78(0x9c)]:String(_0x31ab90);_0x26364b[_0x466e78(0xbf)](_0x2b7d88(0xd5))?await _0x417821[_0x2b7d88(0xd7)](_0x2b7d88(0xad)+'gebrochen.'):await _0x417821[_0x2b7d88(0xd7)]('Error:\x20'+_0x26364b);}finally{clearInterval(_0x34f16d),_0x398eb4[_0x2b7d88(0xd4)+'ng']=![],_0x398eb4['abortContr'+_0x2b7d88(0xaa)]=null;}}