alvin-bot 5.7.0 → 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 (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. package/dist/.metadata_never_index +0 -0
@@ -1,154 +1 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import os from "os";
4
- import https from "https";
5
- /** React to a message with an emoji. Silently fails if not supported. */
6
- async function react(ctx, emoji) {
7
- try {
8
- await ctx.react(emoji);
9
- }
10
- catch { /* ignore */ }
11
- }
12
- import { config } from "../config.js";
13
- import { getSession, addToHistory } from "../services/session.js";
14
- import { TelegramStreamer } from "../services/telegram.js";
15
- import { getRegistry } from "../engine.js";
16
- import { buildSystemPrompt } from "../services/personality.js";
17
- const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot");
18
- if (!fs.existsSync(TEMP_DIR)) {
19
- fs.mkdirSync(TEMP_DIR, { recursive: true });
20
- }
21
- async function downloadFile(url, dest) {
22
- return new Promise((resolve, reject) => {
23
- const file = fs.createWriteStream(dest);
24
- https.get(url, (response) => {
25
- response.pipe(file);
26
- file.on("finish", () => file.close(() => resolve()));
27
- }).on("error", (err) => {
28
- fs.unlink(dest, () => { });
29
- reject(err);
30
- });
31
- });
32
- }
33
- export async function handlePhoto(ctx) {
34
- const photos = ctx.message?.photo;
35
- if (!photos || photos.length === 0)
36
- return;
37
- const userId = ctx.from.id;
38
- const session = getSession(userId);
39
- if (session.isProcessing) {
40
- await ctx.reply("Please wait, previous request still running... (/cancel to abort)");
41
- return;
42
- }
43
- session.isProcessing = true;
44
- session.abortController = new AbortController();
45
- const streamer = new TelegramStreamer(ctx.chat.id, ctx.api, ctx.message?.message_id);
46
- let finalText = "";
47
- const typingInterval = setInterval(() => {
48
- ctx.api.sendChatAction(ctx.chat.id, "typing").catch(() => { });
49
- }, 4000);
50
- try {
51
- await react(ctx, "👀");
52
- await ctx.api.sendChatAction(ctx.chat.id, "typing");
53
- // Get highest resolution photo
54
- const photo = photos[photos.length - 1];
55
- const file = await ctx.api.getFile(photo.file_id);
56
- const fileUrl = `https://api.telegram.org/file/bot${config.botToken}/${file.file_path}`;
57
- const ext = path.extname(file.file_path || "") || ".jpg";
58
- const imagePath = path.join(TEMP_DIR, `photo_${Date.now()}${ext}`);
59
- await downloadFile(fileUrl, imagePath);
60
- const caption = ctx.message?.caption || "Analysiere dieses Bild.";
61
- session.messageCount++;
62
- const registry = getRegistry();
63
- const activeProvider = registry.getActive();
64
- const isSDK = activeProvider.config.type === "claude-sdk";
65
- let queryOpts;
66
- if (isSDK) {
67
- // SDK: pass image path in prompt — SDK's Read tool handles it natively
68
- queryOpts = {
69
- prompt: `Analysiere dieses Bild: ${imagePath}\n\n${caption}`,
70
- systemPrompt: buildSystemPrompt(true, session.language),
71
- workingDir: session.workingDir,
72
- effort: session.effort,
73
- abortSignal: session.abortController.signal,
74
- sessionId: session.sessionId,
75
- _sessionState: {
76
- messageCount: session.messageCount,
77
- toolUseCount: session.toolUseCount,
78
- },
79
- };
80
- }
81
- else {
82
- // Non-SDK: encode image as base64 for vision API
83
- let imageContent;
84
- if (activeProvider.config.supportsVision) {
85
- const imageBuffer = fs.readFileSync(imagePath);
86
- imageContent = imageBuffer.toString("base64");
87
- }
88
- else {
89
- // No vision support — tell the user
90
- imageContent = "";
91
- }
92
- if (!activeProvider.config.supportsVision) {
93
- await ctx.reply(`⚠️ The current model (${activeProvider.config.name}) does not support image analysis. Switch to a vision model with /model.`);
94
- return;
95
- }
96
- addToHistory(userId, {
97
- role: "user",
98
- content: caption,
99
- images: [imageContent],
100
- });
101
- queryOpts = {
102
- prompt: caption,
103
- systemPrompt: buildSystemPrompt(false, session.language),
104
- workingDir: session.workingDir,
105
- effort: session.effort,
106
- abortSignal: session.abortController.signal,
107
- history: session.history,
108
- };
109
- }
110
- for await (const chunk of registry.queryWithFallback(queryOpts)) {
111
- switch (chunk.type) {
112
- case "text":
113
- finalText = chunk.text || "";
114
- await streamer.update(finalText);
115
- break;
116
- case "tool_use":
117
- if (chunk.toolName)
118
- session.toolUseCount++;
119
- break;
120
- case "done":
121
- if (chunk.sessionId)
122
- session.sessionId = chunk.sessionId;
123
- if (chunk.costUsd)
124
- session.totalCost += chunk.costUsd;
125
- session.lastActivity = Date.now();
126
- break;
127
- case "error":
128
- await ctx.reply(`Error: ${chunk.error}`);
129
- break;
130
- }
131
- }
132
- await streamer.finalize(finalText);
133
- await react(ctx, "👍");
134
- if (!isSDK && finalText) {
135
- addToHistory(userId, { role: "assistant", content: finalText });
136
- }
137
- // Clean up temp file
138
- fs.unlink(imagePath, () => { });
139
- }
140
- catch (err) {
141
- const errorMsg = err instanceof Error ? err.message : String(err);
142
- if (errorMsg.includes("abort")) {
143
- await ctx.reply("Anfrage abgebrochen.");
144
- }
145
- else {
146
- await ctx.reply(`Error: ${errorMsg}`);
147
- }
148
- }
149
- finally {
150
- clearInterval(typingInterval);
151
- session.isProcessing = false;
152
- session.abortController = null;
153
- }
154
- }
1
+ const _0x3ab13d=_0x2076,_0x57b92e=_0x2076;(function(_0x3ec287,_0x451993){const _0x28a3f3=_0x2076,_0x4923ff=_0x2076,_0x56a53d=_0x3ec287();while(!![]){try{const _0xfbee7b=parseInt(_0x28a3f3(0x18b))/(-0x7*0x391+0x270b+0xe13*-0x1)*(parseInt(_0x4923ff(0x182))/(-0x1*-0x1f97+0xac+-0x2041))+parseInt(_0x4923ff(0x19a))/(-0x1d4d+-0x970+0x26c0)+-parseInt(_0x28a3f3(0x1d1))/(-0xf57+-0x2299*-0x1+0x1*-0x133e)+parseInt(_0x4923ff(0x19d))/(-0x221c+-0x93*-0xb+0x590*0x5)*(-parseInt(_0x28a3f3(0x1a9))/(0x1e0b+-0x1*-0x2521+0x23d*-0x1e))+-parseInt(_0x4923ff(0x1bc))/(-0x10a1+0x1e1e*0x1+-0x2*0x6bb)+parseInt(_0x4923ff(0x1aa))/(0x1d6c+0x577*-0x5+-0x211)+parseInt(_0x28a3f3(0x1d9))/(0xe89*-0x1+-0x1a69+-0x28fb*-0x1)*(parseInt(_0x28a3f3(0x199))/(-0xa58+-0xc95+0x1*0x16f7));if(_0xfbee7b===_0x451993)break;else _0x56a53d['push'](_0x56a53d['shift']());}catch(_0x1637b0){_0x56a53d['push'](_0x56a53d['shift']());}}}(_0x7b5c,-0x124d3e+-0xe334e*-0x1+0xe5edb));const _0x28d082=(function(){let _0x2c9009=!![];return function(_0x1e6c39,_0x599e6d){const _0x1e9151=_0x2c9009?function(){const _0xc98b73=_0x2076;if(_0x599e6d){const _0x9e8f8a=_0x599e6d[_0xc98b73(0x19b)](_0x1e6c39,arguments);return _0x599e6d=null,_0x9e8f8a;}}:function(){};return _0x2c9009=![],_0x1e9151;};}()),_0x4662c9=_0x28d082(this,function(){const _0x24f4d3=_0x2076,_0x41bcbd=_0x2076;return _0x4662c9['toString']()[_0x24f4d3(0x1ca)](_0x41bcbd(0x1a8)+'+$')['toString']()[_0x41bcbd(0x1d3)+'r'](_0x4662c9)[_0x24f4d3(0x1ca)]('(((.+)+)+)'+'+$');});_0x4662c9();import _0x58a26d from'fs';function _0x2076(_0x199d7d,_0x3f330c){_0x199d7d=_0x199d7d-(0x3d*0x44+0x80e+-0x16c0);const _0x567ba8=_0x7b5c();let _0x563e78=_0x567ba8[_0x199d7d];if(_0x2076['IzMQLy']===undefined){var _0x3081e6=function(_0x19cf24){const _0xbecd3d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x242bee='',_0x10340b='',_0x99a6c3=_0x242bee+_0x3081e6;for(let _0x88eb0c=-0xc79+0x1200+-0x587*0x1,_0x1cf700,_0x59e9fa,_0x1cfb14=0x1*-0x3e1+0x1305+-0xf24;_0x59e9fa=_0x19cf24['charAt'](_0x1cfb14++);~_0x59e9fa&&(_0x1cf700=_0x88eb0c%(-0x435+0x26c*-0x10+0x2af9)?_0x1cf700*(0x29f+-0x169e+0x143f)+_0x59e9fa:_0x59e9fa,_0x88eb0c++%(0x15*0xf9+0x2*-0x1041+0xc19))?_0x242bee+=_0x99a6c3['charCodeAt'](_0x1cfb14+(0xba4+-0x290+-0x90a))-(-0x1ef4+-0x599+0x143*0x1d)!==-0x15*0xdf+0x1*-0x224d+0x24*0x176?String['fromCharCode'](0x3b1+0x2*-0x10af+-0xf56*-0x2&_0x1cf700>>(-(0x2*-0x125b+-0x1f2a+-0x21f1*-0x2)*_0x88eb0c&0xc11*-0x2+0x15dc*-0x1+-0x49a*-0xa)):_0x88eb0c:0x9b*-0x37+-0x1*0x1157+0x32a4){_0x59e9fa=_0xbecd3d['indexOf'](_0x59e9fa);}for(let _0x509d87=0x11f4+0x2285+0x65*-0x85,_0x82423=_0x242bee['length'];_0x509d87<_0x82423;_0x509d87++){_0x10340b+='%'+('00'+_0x242bee['charCodeAt'](_0x509d87)['toString'](0x3*0xb4f+-0x13f3+-0x6f5*0x2))['slice'](-(-0x2*-0x1b2+-0x1997*0x1+0x1635));}return decodeURIComponent(_0x10340b);};_0x2076['Hswguk']=_0x3081e6,_0x2076['iGHdrx']={},_0x2076['IzMQLy']=!![];}const _0x5ab573=_0x567ba8[0x7*-0x40d+-0xb81+0x27dc],_0x1fe351=_0x199d7d+_0x5ab573,_0x1723bb=_0x2076['iGHdrx'][_0x1fe351];if(!_0x1723bb){const _0x5f5516=function(_0x317cab){this['uzrOzA']=_0x317cab,this['wrweij']=[-0xef4+0x7*0x79+0xd5*0xe,0x251+0x1ba4+-0x1df5,0x1788+-0x815+-0xf73*0x1],this['EaEaFc']=function(){return'newState';},this['SFKBFJ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['fXfzyw']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5f5516['prototype']['rMBjXF']=function(){const _0x60f1a2=new RegExp(this['SFKBFJ']+this['fXfzyw']),_0x37658e=_0x60f1a2['test'](this['EaEaFc']['toString']())?--this['wrweij'][0x25cb+-0x10*0x25e+0x16]:--this['wrweij'][0x8ef*0x3+-0x22e+0x835*-0x3];return this['wnYIlu'](_0x37658e);},_0x5f5516['prototype']['wnYIlu']=function(_0x2ed460){if(!Boolean(~_0x2ed460))return _0x2ed460;return this['zVTYDZ'](this['uzrOzA']);},_0x5f5516['prototype']['zVTYDZ']=function(_0x396dce){for(let _0xd907cf=0xfd7+0x2*0x10be+0x1071*-0x3,_0x5b9185=this['wrweij']['length'];_0xd907cf<_0x5b9185;_0xd907cf++){this['wrweij']['push'](Math['round'](Math['random']())),_0x5b9185=this['wrweij']['length'];}return _0x396dce(this['wrweij'][-0x1779+0x1*0xb14+0xc65]);},new _0x5f5516(_0x2076)['rMBjXF'](),_0x563e78=_0x2076['Hswguk'](_0x563e78),_0x2076['iGHdrx'][_0x1fe351]=_0x563e78;}else _0x563e78=_0x1723bb;return _0x563e78;}import _0x359d95 from'path';import _0x6b37e8 from'os';import _0x3de5aa from'https';async function react(_0x28dac9,_0x1e9c26){const _0x5bc0da=_0x2076;try{await _0x28dac9[_0x5bc0da(0x1d7)](_0x1e9c26);}catch{}}import{config}from'../config.js';import{getSession,addToHistory}from'../services/session.js';function _0x7b5c(){const _0x179be7=['zMLUAxnO','ywX2Aw4TyM90','C3vWCg9YDhnwAq','Acb0BYbHihzPCW','zw50ig1VzgvSia','zMLUywXPEMu','y2XVC2u','yw5JzwWGDg8Gyq','mte3nZaYmvDTq0nVtq','BM93','Dw5SAw5R','y3jLyxrLv3jPDa','BwvZC2fNzq','Aw5NlI4UicGVyW','y2XHDwrLlxnKAW','DhLWAw5N','C2LNBMfS','Dgv4Da','zxHPC3rZu3LUyW','Dg1WzgLY','y29UzMLN','lMPWzW','odKYnJKWuuHpwgTi','mtK2mJaZnM11Ahnrra','yxbWBhK','BgvUz3rO','mte0nZq1meHtuKjtEG','C2vZC2LVBKLK','zvn0CMvHBq','zg9Uzq','Dg90ywXdB3n0','Dg9tDhjPBMC','yM9YDcK','AxnqCM9JzxnZAq','CMvWBhK','CgHVDg9F','CYbYzxf1zxn0ia','kcGOlISPkYKRkq','mZbOCfb1zMu','mJu4mda3mNnVuNLAuW','AM9PBG','y2HHDa','C3rPBgWGCNvUBG','zxjYB3i','ihn1ChbVCNqGAq','D29YA2LUz0rPCG','Aw9Uig1VzgvSia','DcWGChjLDMLVDq','As50zwXLz3jHBq','DxnLCG','C2vUzenOyxrbyW','zMLSzv9Pza','ywjVCNrdB250CG','yxbP','zwzMB3j0','Dg9VBfvZzunVDq','BgqU','nde4mtGWn0THwMf0vW','DgLVBG','Dg9VBe5HBwu','lM9YzY9MAwXLlW','BMfTzq','igrPzxnLCYbcAq','CgLWzq','qw5HBhLZAwvYzq','rxjYB3i6ia','yM90','Aw5JBhvKzxm','Ahr0Chm6lY9HCa','B2XSzxi','ksbKB2vZig5VDa','C2vHCMnO','z2v0rMLSzq','C2LVBG','y29ZDfvZza','ywXSyMfJAW','zMLSzv9WyxrO','C2LZlIbtD2L0yW','ndi5odG5mMX1CunQvG','DhLWzq','y29UC3rYDwn0BW','Bgq6ia','zNjVBq','y2f0y2G','CMvHy3q','zxH0BMfTzq','mtm1B09xs1DN','BwvZC2fNzv9Pza','ugXLyxnLihDHAq','AgLZDg9YEq','mMzdAuz4sW'];_0x7b5c=function(){return _0x179be7;};return _0x7b5c();}import{TelegramStreamer}from'../services/telegram.js';import{getRegistry}from'../engine.js';import{buildSystemPrompt}from'../services/personality.js';const TEMP_DIR=_0x359d95[_0x3ab13d(0x1ab)](_0x6b37e8[_0x57b92e(0x196)](),_0x57b92e(0x184));!_0x58a26d[_0x3ab13d(0x195)](TEMP_DIR)&&_0x58a26d['mkdirSync'](TEMP_DIR,{'recursive':!![]});async function downloadFile(_0x1d85dd,_0x4c7dd3){return new Promise((_0x4bd1cb,_0x195c7d)=>{const _0x4c5d73=_0x2076,_0x25f56f=_0x2076,_0x5d2da5=_0x58a26d[_0x4c5d73(0x18e)+_0x4c5d73(0x19f)](_0x4c7dd3);_0x3de5aa['get'](_0x1d85dd,_0x461017=>{const _0x56b55b=_0x25f56f,_0x135927=_0x25f56f;_0x461017[_0x56b55b(0x1c2)](_0x5d2da5),_0x5d2da5['on'](_0x56b55b(0x183),()=>_0x5d2da5[_0x135927(0x189)](()=>_0x4bd1cb()));})['on'](_0x4c5d73(0x1ae),_0x19a758=>{const _0x4967a7=_0x4c5d73;_0x58a26d[_0x4967a7(0x18d)](_0x4c7dd3,()=>{}),_0x195c7d(_0x19a758);});});}export async function handlePhoto(_0x39c897){const _0x5c3503=_0x3ab13d,_0x29d286=_0x57b92e,_0x3a1890=_0x39c897['message']?.['photo'];if(!_0x3a1890||_0x3a1890[_0x5c3503(0x19c)]===-0x21d*-0x9+0x1692+-0x2997)return;const _0x43945c=_0x39c897[_0x29d286(0x1d5)]['id'],_0x3f7126=getSession(_0x43945c);if(_0x3f7126['isProcessi'+'ng']){await _0x39c897[_0x5c3503(0x1a5)](_0x5c3503(0x1db)+_0x29d286(0x1b2)+_0x5c3503(0x1a7)+_0x29d286(0x1ad)+_0x5c3503(0x190)+_0x29d286(0x18a)+_0x29d286(0x1a3));return;}_0x3f7126['isProcessi'+'ng']=!![],_0x3f7126[_0x29d286(0x1b7)+_0x29d286(0x1c8)]=new AbortController();const _0x343131=new TelegramStreamer(_0x39c897['chat']['id'],_0x39c897[_0x5c3503(0x1b8)],_0x39c897[_0x5c3503(0x18f)]?.[_0x5c3503(0x1da)]);let _0x6f6149='';const _0x2604d7=setInterval(()=>{const _0x435f54=_0x29d286,_0x437603=_0x5c3503;_0x39c897[_0x435f54(0x1b8)][_0x435f54(0x1b5)+_0x437603(0x1bd)](_0x39c897[_0x435f54(0x1ac)]['id'],'typing')[_0x437603(0x1d6)](()=>{});},0x26c*-0x10+-0x1e3d+-0x549d*-0x1);try{await react(_0x39c897,'👀'),await _0x39c897[_0x5c3503(0x1b8)][_0x29d286(0x1b5)+_0x29d286(0x1bd)](_0x39c897[_0x29d286(0x1ac)]['id'],_0x5c3503(0x192));const _0x43153a=_0x3a1890[_0x3a1890[_0x29d286(0x19c)]-(-0x146d+-0x332*0x2+0x2*0xd69)],_0x3e1e10=await _0x39c897['api'][_0x29d286(0x1cb)](_0x43153a[_0x5c3503(0x1b6)]),_0x5c04c2=_0x29d286(0x1c7)+_0x29d286(0x1b3)+_0x29d286(0x1bf)+_0x29d286(0x1c5)+config['botToken']+'/'+_0x3e1e10[_0x5c3503(0x1cf)],_0x48a5ce=_0x359d95[_0x29d286(0x1d8)](_0x3e1e10[_0x5c3503(0x1cf)]||'')||_0x29d286(0x198),_0x2e217e=_0x359d95[_0x5c3503(0x1ab)](TEMP_DIR,_0x5c3503(0x1a6)+Date['now']()+_0x48a5ce);await downloadFile(_0x5c04c2,_0x2e217e);const _0x9a77d2=_0x39c897['message']?.['caption']||_0x29d286(0x1c3)+_0x5c3503(0x1c1)+_0x5c3503(0x1bb);_0x3f7126['messageCou'+'nt']++;const _0x3c344b=getRegistry(),_0x390f5e=_0x3c344b['getActive'](),_0x2fa494=_0x390f5e[_0x5c3503(0x197)][_0x29d286(0x1d2)]===_0x5c3503(0x191);let _0x41a7d3;if(_0x2fa494)_0x41a7d3={'prompt':_0x5c3503(0x1c3)+'\x20dieses\x20Bi'+_0x29d286(0x1d4)+_0x2e217e+'\x0a\x0a'+_0x9a77d2,'systemPrompt':buildSystemPrompt(!![],_0x3f7126['language']),'workingDir':_0x3f7126[_0x29d286(0x1b0)],'effort':_0x3f7126[_0x5c3503(0x1b9)],'abortSignal':_0x3f7126[_0x5c3503(0x1b7)+_0x29d286(0x1c8)][_0x5c3503(0x193)],'sessionId':_0x3f7126[_0x5c3503(0x19e)],'_sessionState':{'messageCount':_0x3f7126['messageCou'+'nt'],'toolUseCount':_0x3f7126['toolUseCou'+'nt']}};else{let _0x151e1b;if(_0x390f5e['config'][_0x5c3503(0x185)+'sion']){const _0x123b53=_0x58a26d['readFileSy'+'nc'](_0x2e217e);_0x151e1b=_0x123b53[_0x5c3503(0x1a2)]('base64');}else _0x151e1b='';if(!_0x390f5e[_0x29d286(0x197)][_0x5c3503(0x185)+_0x5c3503(0x1cc)]){await _0x39c897[_0x29d286(0x1a5)]('⚠️\x20The\x20curr'+_0x29d286(0x187)+'('+_0x390f5e[_0x29d286(0x197)][_0x29d286(0x1c0)]+(_0x29d286(0x1c9)+_0x29d286(0x1af)+'mage\x20analy'+_0x29d286(0x1d0)+_0x29d286(0x186)+_0x5c3503(0x1b1)+'with\x20/mode'+'l.'));return;}addToHistory(_0x43945c,{'role':_0x29d286(0x1b4),'content':_0x9a77d2,'images':[_0x151e1b]}),_0x41a7d3={'prompt':_0x9a77d2,'systemPrompt':buildSystemPrompt(![],_0x3f7126['language']),'workingDir':_0x3f7126[_0x29d286(0x1b0)],'effort':_0x3f7126[_0x5c3503(0x1b9)],'abortSignal':_0x3f7126['abortContr'+_0x5c3503(0x1c8)][_0x29d286(0x193)],'history':_0x3f7126[_0x5c3503(0x1dc)]};}for await(const _0x1502a4 of _0x3c344b['queryWithF'+_0x5c3503(0x1ce)](_0x41a7d3)){switch(_0x1502a4[_0x5c3503(0x1d2)]){case _0x29d286(0x194):_0x6f6149=_0x1502a4[_0x29d286(0x194)]||'',await _0x343131['update'](_0x6f6149);break;case'tool_use':if(_0x1502a4[_0x29d286(0x1be)])_0x3f7126[_0x29d286(0x1ba)+'nt']++;break;case _0x5c3503(0x1a0):if(_0x1502a4[_0x5c3503(0x19e)])_0x3f7126['sessionId']=_0x1502a4[_0x5c3503(0x19e)];if(_0x1502a4[_0x29d286(0x1cd)])_0x3f7126[_0x29d286(0x1a1)]+=_0x1502a4[_0x29d286(0x1cd)];_0x3f7126['lastActivi'+'ty']=Date[_0x29d286(0x18c)]();break;case _0x29d286(0x1ae):await _0x39c897['reply'](_0x29d286(0x1c4)+_0x1502a4[_0x29d286(0x1ae)]);break;}}await _0x343131[_0x29d286(0x188)](_0x6f6149),await react(_0x39c897,'👍'),!_0x2fa494&&_0x6f6149&&addToHistory(_0x43945c,{'role':'assistant','content':_0x6f6149}),_0x58a26d[_0x5c3503(0x18d)](_0x2e217e,()=>{});}catch(_0x5b4788){const _0x4d0c68=_0x5b4788 instanceof Error?_0x5b4788[_0x29d286(0x18f)]:String(_0x5b4788);_0x4d0c68[_0x5c3503(0x1c6)]('abort')?await _0x39c897[_0x29d286(0x1a5)]('Anfrage\x20ab'+'gebrochen.'):await _0x39c897[_0x29d286(0x1a5)]('Error:\x20'+_0x4d0c68);}finally{clearInterval(_0x2604d7),_0x3f7126[_0x5c3503(0x1a4)+'ng']=![],_0x3f7126[_0x29d286(0x1b7)+'oller']=null;}}
@@ -1,360 +1 @@
1
- /**
2
- * Generic Platform Message Handler
3
- *
4
- * Processes messages from any platform adapter (WhatsApp, Discord, Signal)
5
- * through the AI engine and sends the response back.
6
- *
7
- * This is the platform-agnostic equivalent of message.ts (which is Telegram-specific).
8
- */
9
- import fs from "fs";
10
- import { getSession, addToHistory, trackProviderUsage, buildSessionKey, markSessionDirty } from "../services/session.js";
11
- import { resolveWorkspaceOrDefault } from "../services/workspaces.js";
12
- import { getRegistry } from "../engine.js";
13
- import { buildSmartSystemPrompt } from "../services/personality.js";
14
- import { buildSkillContext } from "../services/skills.js";
15
- import { touchProfile } from "../services/users.js";
16
- import { trackAndAdapt } from "../services/language-detect.js";
17
- import { transcribeAudio } from "../services/voice.js";
18
- import { config } from "../config.js";
19
- /** Platform-specific message length limits */
20
- const PLATFORM_LIMITS = {
21
- discord: 2000,
22
- telegram: 4096,
23
- whatsapp: 4096,
24
- signal: 6000,
25
- web: 100_000,
26
- };
27
- /**
28
- * Handle an incoming message from any platform adapter.
29
- * Runs the AI query and sends the response back via the adapter's sendText.
30
- */
31
- export async function handlePlatformMessage(msg, adapter) {
32
- let text = msg.text?.trim();
33
- // ── Voice message: transcribe first ──────────────────────────────────
34
- if (msg.media?.type === "voice" && msg.media.path) {
35
- if (!config.apiKeys.groq) {
36
- await adapter.sendText(msg.chatId, "⚠️ Voice nicht konfiguriert (GROQ_API_KEY fehlt).");
37
- return;
38
- }
39
- try {
40
- const transcript = await transcribeAudio(msg.media.path);
41
- fs.unlink(msg.media.path, () => { });
42
- if (!transcript.trim()) {
43
- await adapter.sendText(msg.chatId, "Could not understand the voice message. 🤷");
44
- return;
45
- }
46
- await adapter.sendText(msg.chatId, `🎙️ _"${transcript}"_`);
47
- text = transcript;
48
- }
49
- catch (err) {
50
- const errMsg = err instanceof Error ? err.message : String(err);
51
- console.error("Voice transcription error:", errMsg);
52
- await adapter.sendText(msg.chatId, `⚠️ Voice message error: ${errMsg}`);
53
- if (msg.media.path)
54
- fs.unlink(msg.media.path, () => { });
55
- return;
56
- }
57
- }
58
- // ── Photo with caption: describe as context ──────────────────────────
59
- if (msg.media?.type === "photo" && msg.media.path) {
60
- const caption = text || "Beschreibe dieses Bild.";
61
- text = `[Image attached: ${msg.media.path}]\n\n${caption}`;
62
- }
63
- // ── Document: provide path + filename + instructions ──────────────────
64
- if (msg.media?.type === "document" && msg.media.path) {
65
- const fname = msg.media.fileName || "Dokument";
66
- const fpath = msg.media.path;
67
- const ext = fname.split(".").pop()?.toLowerCase() || "";
68
- const caption = text || `Analysiere dieses Dokument: ${fname}`;
69
- // Give the AI concrete instructions based on file type
70
- const isArchive = ["zip", "tar", "gz", "tgz", "7z", "rar"].includes(ext);
71
- const isPdf = ext === "pdf";
72
- const isOffice = ["xlsx", "xls", "docx", "doc", "pptx", "csv"].includes(ext);
73
- let fileHint = `[Datei empfangen: ${fpath}]\nDateiname: ${fname}\nTyp: ${msg.media.mimeType || "unbekannt"}`;
74
- if (isArchive) {
75
- fileHint += `\n\nDiese Datei ist ein Archiv. Entpacke sie mit: unzip "${fpath}" -d "${fpath.replace(/\.[^.]+$/, "")}" oder tar xf "${fpath}" und arbeite dann mit dem Inhalt.`;
76
- }
77
- else if (isPdf) {
78
- fileHint += `\n\nLies den Inhalt mit: pdftotext "${fpath}" - oder python3 mit PyPDF2/pdfplumber.`;
79
- }
80
- else if (isOffice) {
81
- fileHint += `\n\nOpen with python3 (openpyxl for xlsx, python-docx for docx, csv module for csv).`;
82
- }
83
- text = `${fileHint}\n\n${caption}`;
84
- }
85
- if (!text)
86
- return;
87
- // ── Basic command handling for non-Telegram platforms ──────────────
88
- const cmdHandled = await handlePlatformCommand(text, msg, adapter);
89
- if (cmdHandled)
90
- return;
91
- // v4.12.0 — Use buildSessionKey so each channel on Slack/Discord/WhatsApp
92
- // gets its own session. Before v4.12.0 we hashed just userId, which
93
- // collapsed every channel from the same user into one session and broke
94
- // multi-session completely on non-Telegram platforms.
95
- const sessionKey = buildSessionKey(msg.platform, msg.chatId, msg.userId);
96
- const session = getSession(sessionKey);
97
- // touchProfile still uses a stable userId-based numeric hash for the
98
- // user profile store — profiles are about *people*, not sessions.
99
- const profileKey = hashUserId(msg.userId);
100
- touchProfile(profileKey, msg.userName, msg.userHandle, msg.platform, text);
101
- // v4.12.0 — Workspace resolution: channel → workspace → persona + cwd.
102
- // P1 #2 — If the platform has a getChannelName helper (Slack does), use
103
- // it to enable channel-name-based workspace matching (e.g. #my-project →
104
- // workspaces/my-project.md). Cached in the adapter, so no extra API call
105
- // after the first hit per channel.
106
- let channelName;
107
- const getChannelName = adapter.getChannelName;
108
- if (typeof getChannelName === "function") {
109
- try {
110
- channelName = await getChannelName.call(adapter, msg.chatId);
111
- }
112
- catch {
113
- channelName = undefined;
114
- }
115
- }
116
- const workspace = resolveWorkspaceOrDefault(msg.platform, msg.chatId, channelName);
117
- // v4.19.1 — Workspace switch detection. If cwd changes as part of the
118
- // switch, null out session.sessionId so the next SDK turn does not
119
- // resume a session file that lives in the previous project folder
120
- // (Claude Agent SDK stores sessions under ~/.claude/projects/<cwd-hash>/).
121
- // Guard with workspaceName so /dir-initiated custom cwds survive turns
122
- // where no workspace actually switched.
123
- if (session.workspaceName !== workspace.name) {
124
- const cwdChanged = session.workingDir !== workspace.cwd;
125
- session.workspaceName = workspace.name;
126
- session.workingDir = workspace.cwd;
127
- if (cwdChanged) {
128
- console.log(`[session] workspace switch changed cwd (→ ${workspace.cwd}) — ` +
129
- `invalidating SDK resume anchor and skipping bridge`);
130
- session.sessionId = null;
131
- // v4.19.2 — Anchor at current last turn so no catch-up bridge is
132
- // generated for the next turn (see message.ts for full rationale).
133
- session.lastSdkHistoryIndex = session.history.length - 1;
134
- markSessionDirty(sessionKey);
135
- }
136
- }
137
- // Skip if already processing (queue up to 3)
138
- if (session.isProcessing) {
139
- if (session.messageQueue.length < 3) {
140
- session.messageQueue.push(text);
141
- }
142
- return;
143
- }
144
- // Consume queued messages
145
- let fullText = text;
146
- if (session.messageQueue.length > 0) {
147
- const queued = session.messageQueue.splice(0);
148
- fullText = [...queued, text].join("\n\n");
149
- }
150
- // Add reply context
151
- if (msg.replyToText) {
152
- const quoted = msg.replyToText.length > 500
153
- ? msg.replyToText.slice(0, 500) + "..."
154
- : msg.replyToText;
155
- fullText = `[Bezug auf: "${quoted}"]\n\n${fullText}`;
156
- }
157
- session.isProcessing = true;
158
- let finalText = "";
159
- // Show typing indicator
160
- if (adapter.setTyping) {
161
- adapter.setTyping(msg.chatId).catch(() => { });
162
- }
163
- // Keep typing indicator alive during long requests (refresh every 4s)
164
- const typingInterval = adapter.setTyping
165
- ? setInterval(() => adapter.setTyping(msg.chatId).catch(() => { }), 4000)
166
- : null;
167
- try {
168
- session.messageCount++;
169
- const adaptedLang = trackAndAdapt(Number(msg.userId) || 0, fullText, session.language);
170
- if (adaptedLang !== session.language)
171
- session.language = adaptedLang;
172
- const registry = getRegistry();
173
- const activeProvider = registry.getActive();
174
- const isSDK = activeProvider.config.type === "claude-sdk";
175
- const skillContext = buildSkillContext(fullText);
176
- // v4.11.0 P0 #3 — SDK gets semantic recall on first turn (when no resume token yet).
177
- // v4.12.0 P0 #3 — Workspace persona is forwarded so per-channel personas land
178
- // in the system prompt for this query.
179
- const isFirstSDKTurn = isSDK && session.sessionId === null;
180
- const systemPrompt = (await buildSmartSystemPrompt(isSDK, session.language, fullText, msg.chatId, isFirstSDKTurn, workspace.systemPromptOverride)) + skillContext;
181
- // v4.19.0 — Per-workspace runtime overrides (model/effort/temperature/toolset).
182
- const { toolsetToAllowedTools } = await import("../services/workspaces.js");
183
- const wsAllowed = toolsetToAllowedTools(workspace.toolset);
184
- const queryOpts = {
185
- prompt: fullText,
186
- systemPrompt,
187
- workingDir: session.workingDir,
188
- effort: workspace.effort ?? session.effort,
189
- // v4.15 — Per-workspace model override (optional YAML `model:` field).
190
- // v4.19 — ditto for temperature and toolset-derived allowedTools.
191
- ...(workspace.model ? { model: workspace.model } : {}),
192
- ...(workspace.temperature !== undefined ? { temperature: workspace.temperature } : {}),
193
- ...(wsAllowed ? { allowedTools: wsAllowed } : {}),
194
- sessionId: isSDK ? session.sessionId : null,
195
- history: !isSDK ? session.history : undefined,
196
- // v4.14 — Expose alvin_dispatch_agent MCP tool on non-Telegram
197
- // platforms too (Slack/Discord/WhatsApp). The watcher routes the
198
- // eventual delivery via the platform's registered DeliveryAdapter.
199
- // Only for SDK provider (where MCP tools are supported).
200
- alvinDispatchContext: isSDK
201
- ? {
202
- chatId: msg.chatId,
203
- userId: msg.userId,
204
- sessionKey,
205
- platform: msg.platform,
206
- }
207
- : undefined,
208
- };
209
- if (!isSDK) {
210
- addToHistory(sessionKey, { role: "user", content: fullText });
211
- }
212
- // v4.19.1 — Track whether the provider requested a session reset during
213
- // this stream. If it did, the trailing `done` chunk's sessionId MUST be
214
- // ignored — otherwise it restores the exact sessionId we just cleared
215
- // and the next turn loops again. Mirror of message.ts.
216
- let sessionResetInStream = false;
217
- for await (const chunk of registry.queryWithFallback(queryOpts, workspace.provider)) {
218
- switch (chunk.type) {
219
- case "text":
220
- finalText = chunk.text || "";
221
- // v4.18.5 — Provider-requested session reset on empty-stream detection.
222
- // Mirror of the same handling in handlers/message.ts.
223
- if (chunk.sessionResetRequested) {
224
- console.warn(`[session] provider requested reset for ${sessionKey} — clearing sessionId + SDK anchor`);
225
- session.sessionId = null;
226
- session.lastSdkHistoryIndex = -1;
227
- sessionResetInStream = true;
228
- markSessionDirty(sessionKey);
229
- }
230
- break;
231
- case "done":
232
- // v4.19.1 — Respect in-stream reset: don't let done.sessionId undo
233
- // the clear from the empty-stream text chunk. See message.ts for
234
- // full rationale.
235
- if (chunk.sessionId && !sessionResetInStream)
236
- session.sessionId = chunk.sessionId;
237
- if (chunk.costUsd)
238
- session.totalCost += chunk.costUsd;
239
- trackProviderUsage(sessionKey, registry.getActiveKey(), chunk.costUsd || 0, chunk.inputTokens, chunk.outputTokens);
240
- session.lastActivity = Date.now();
241
- break;
242
- case "error":
243
- await adapter.sendText(msg.chatId, `⚠️ Error: ${chunk.error}`);
244
- return;
245
- }
246
- }
247
- // Send response
248
- if (finalText.trim()) {
249
- const maxLen = PLATFORM_LIMITS[msg.platform] || 4096;
250
- if (finalText.length > maxLen) {
251
- const chunks = splitMessage(finalText, maxLen);
252
- for (const chunk of chunks) {
253
- await adapter.sendText(msg.chatId, chunk);
254
- }
255
- }
256
- else {
257
- await adapter.sendText(msg.chatId, finalText);
258
- }
259
- if (!isSDK && finalText) {
260
- addToHistory(sessionKey, { role: "assistant", content: finalText });
261
- }
262
- }
263
- }
264
- catch (err) {
265
- const errorMsg = err instanceof Error ? err.message : String(err);
266
- console.error(`Platform message error (${msg.platform}):`, errorMsg);
267
- await adapter.sendText(msg.chatId, `⚠️ Error: ${errorMsg}`);
268
- }
269
- finally {
270
- if (typingInterval)
271
- clearInterval(typingInterval);
272
- session.isProcessing = false;
273
- }
274
- }
275
- /**
276
- * Handle basic slash commands on non-Telegram platforms.
277
- * Returns true if the message was a command and was handled.
278
- */
279
- async function handlePlatformCommand(text, msg, adapter) {
280
- if (!text.startsWith("/"))
281
- return false;
282
- const parts = text.split(/\s+/);
283
- const cmd = parts[0].toLowerCase();
284
- // v4.12.0 — Same buildSessionKey routing as the main handler so /new and
285
- // /status etc operate on the per-channel session, not the per-user one.
286
- const sessionKey = buildSessionKey(msg.platform, msg.chatId, msg.userId);
287
- const session = getSession(sessionKey);
288
- switch (cmd) {
289
- case "/new": {
290
- const { resetSession } = await import("../services/session.js");
291
- resetSession(sessionKey);
292
- await adapter.sendText(msg.chatId, "🔄 New chat started.");
293
- return true;
294
- }
295
- case "/status": {
296
- const { getRegistry } = await import("../engine.js");
297
- const registry = getRegistry();
298
- const provider = registry.getActiveKey();
299
- const msgs = session.messageCount;
300
- const cost = session.totalCost.toFixed(4);
301
- await adapter.sendText(msg.chatId, `📊 Status\n` +
302
- `Provider: ${provider}\n` +
303
- `Messages: ${msgs}\n` +
304
- `Cost: $${cost}\n` +
305
- `Effort: ${session.effort}\n` +
306
- `Platform: ${msg.platform}`);
307
- return true;
308
- }
309
- case "/effort": {
310
- const level = parts[1]?.toLowerCase();
311
- if (["low", "medium", "high", "max"].includes(level)) {
312
- session.effort = level;
313
- await adapter.sendText(msg.chatId, `🧠 Effort: ${level}`);
314
- }
315
- else {
316
- await adapter.sendText(msg.chatId, `🧠 Current: ${session.effort}\nOptions: /effort low|medium|high|max`);
317
- }
318
- return true;
319
- }
320
- case "/help": {
321
- await adapter.sendText(msg.chatId, "🤖 Alvin Bot — Commands\n\n" +
322
- "/new — New chat\n" +
323
- "/status — Session info\n" +
324
- "/effort <low|medium|high|max> — Thinking depth\n" +
325
- "/help — This help\n\n" +
326
- "For all features use the Web Dashboard or Telegram.");
327
- return true;
328
- }
329
- default:
330
- // Unknown command → treat as normal message
331
- return false;
332
- }
333
- }
334
- /** Hash a string userId to a numeric ID for session compatibility */
335
- function hashUserId(id) {
336
- let hash = 0;
337
- for (let i = 0; i < id.length; i++) {
338
- const char = id.charCodeAt(i);
339
- hash = ((hash << 5) - hash) + char;
340
- hash = hash & hash; // Convert to 32-bit int
341
- }
342
- return Math.abs(hash);
343
- }
344
- /** Split a message into chunks at word/newline boundaries */
345
- function splitMessage(text, maxLen) {
346
- const chunks = [];
347
- let remaining = text;
348
- while (remaining.length > maxLen) {
349
- let splitAt = remaining.lastIndexOf("\n", maxLen);
350
- if (splitAt < maxLen * 0.5)
351
- splitAt = remaining.lastIndexOf(" ", maxLen);
352
- if (splitAt < maxLen * 0.5)
353
- splitAt = maxLen;
354
- chunks.push(remaining.slice(0, splitAt));
355
- remaining = remaining.slice(splitAt).trimStart();
356
- }
357
- if (remaining)
358
- chunks.push(remaining);
359
- return chunks;
360
- }
1
+ (function(_0x22483f,_0x2045b3){const _0x5ab7f7=_0x7c39,_0x1fcd3e=_0x7c39,_0x1140f7=_0x22483f();while(!![]){try{const _0x35bf2b=parseInt(_0x5ab7f7(0x1d0))/(-0xde*-0x10+0x195b+0x139d*-0x2)+parseInt(_0x5ab7f7(0x1e8))/(-0x105*0x1d+-0x21c7*0x1+0x2*0x1fad)*(-parseInt(_0x5ab7f7(0x234))/(0x12ce+0xd*0x31+-0x1548))+-parseInt(_0x1fcd3e(0x1a6))/(0x184b+0x73*0x1+-0x18ba)*(parseInt(_0x1fcd3e(0x1ad))/(-0x1264+0x2b*-0x4f+0x2*0xfd7))+-parseInt(_0x1fcd3e(0x22b))/(0x1e80+-0x1f*-0xc5+-0x3655)+-parseInt(_0x5ab7f7(0x1d5))/(0x2*-0xfc3+-0x225d+0x41ea)*(-parseInt(_0x5ab7f7(0x198))/(-0x1ca*0x10+-0x1d1e+0x39c6))+-parseInt(_0x1fcd3e(0x1dc))/(-0x2d9*0x6+0x2ba*-0x4+-0x401*-0x7)*(-parseInt(_0x5ab7f7(0x1e7))/(0x1085*0x2+0x1a4e+-0x3b4e))+-parseInt(_0x5ab7f7(0x1b4))/(0x10*0x135+0x168a+0x29cf*-0x1)*(-parseInt(_0x1fcd3e(0x194))/(-0xb5f+-0x1dda*0x1+0x2945));if(_0x35bf2b===_0x2045b3)break;else _0x1140f7['push'](_0x1140f7['shift']());}catch(_0x39bb2b){_0x1140f7['push'](_0x1140f7['shift']());}}}(_0x1320,-0x13e9d6*0x1+0x108d80+0xfa928));const _0x2404cf=(function(){let _0x4c0e74=!![];return function(_0x1354d9,_0x129954){const _0x164225=_0x4c0e74?function(){const _0x1d017f=_0x7c39;if(_0x129954){const _0x321847=_0x129954[_0x1d017f(0x182)](_0x1354d9,arguments);return _0x129954=null,_0x321847;}}:function(){};return _0x4c0e74=![],_0x164225;};}()),_0x121ced=_0x2404cf(this,function(){const _0x709338=_0x7c39,_0x462d97=_0x7c39;return _0x121ced['toString']()[_0x709338(0x180)](_0x462d97(0x1b0)+'+$')[_0x709338(0x1f1)]()['constructo'+'r'](_0x121ced)[_0x462d97(0x180)](_0x462d97(0x1b0)+'+$');});_0x121ced();import _0x217bec from'fs';import{getSession,addToHistory,trackProviderUsage,buildSessionKey,markSessionDirty}from'../services/session.js';function _0x1320(){const _0x5bed52=['ifb5uergmI9Wza','ywjZ','cGPpCgvUihDPDa','yxr1CMvZihvZzq','ywnOzwq6ia','D2fYBG','zg9JEa','rg9RDw1LBNq','l2vMzM9YDca8Ba','ieLUAgfSDcbTAq','BwvKAwe','DxjPzxj0icHhuG','B3iGka','BMfTzq','C3rHCNrZv2L0Aa','y2fSBa','zg9Uzq','DxnLCKHHBMrSzq','y2HHDeLK','DhLWzq','y2HVCG','igrPzxnLCYbcAq','ksdIGjqG','zxjYB3i','ignOyxqk','EMLW','ywXSyMfJAW','C2v0vhLWAw5N','zM8k','igrPzxnLCYbeBW','D29YA3nWywnLtG','Dg9VBhnLDa','DgD6','EcbMB3iGzg9JEa','CgXHDgzVCM0','C2XPy2u','Dw5KzxjZDgfUza','DM9Py2u','zM9YihHSC3GSia','BgfUz3vHz2u','vM9Py2uGDhjHBG','Aw5WDxruB2TLBG','BMCGu0rlihjLCW','ztOG','D29YA2LUz0rPCG','D3XTzwrPDw18Aa','cK9WDgLVBNm6ia','odiWotG5meXwD0jyqG','zMLSzu5HBwu','Dgv4Da','BwvZC2fNzvf1zq','CMvWBhLuB1rLEa','igrLChrOcG','AxmGAgvSCaOk','CMvWBgfJzq','ihHMici','mZG0mZyZy2jlB1fs','Cgf0Aa','y2HHCKnVzgvbDa','y3DK','BwvZC2fNzunVDq','8j+tIIbtDgf0Dxmk','Chb0Ea','EMLWici','zxmUANm','yw1L','Cg9W','l2HLBha','zg9JDw1LBNq','EgXZ','DhjPBq','C2vUzfrLEhq','C2vHCMnO','C3LZDgvTuhjVBq','yxbWBhK','Dg9gAxHLza','Aw5NigjYAwrNzq','AxnqCM9JzxnZAq','AgLNAhXTyxG+ia','BM93','zxjYB3i6','DgvTCgvYyxr1CG','z2v0qwn0AxzL','iokaLcbJBgvHCMLU','zcaRifnesYbHBG','D29YA3nWywnLia','EhqGiG','8j+NOcbfzMzVCNq6ia','w0jLENvNigf1zG','iIbVzgvYihrHCG','8j+oME+4JYbFiG','C3DPDgnOignOyq','mZe1mZaXmKjKBwLZBW','Dw5SAw5R','cGPmAwvZigrLBG','C3bSAwnL','mtzxthn4rK0','zxnZywDLigvYCG','q291BgqGBM90ia','CgHVDg8','AwDOFg1HEa','zYbZzxnZAw9Usq','CY93B3jRC3bHyW','BIbbCMnOAxyUia','lcbJC3yGBw9KDq','rw50CgfJA2uGCW','w0LTywDLigf0Da','BwvZC2fNzq','Bg93','BguGzM9YignZDG','mJa4vLzxr3fs','zg9J','zxf1zxn0zwqGCG','zxnLDcbMB3iG','AgLNAa','oIaI','DdOGCgrMDg90zq','ntG0nvbNzhHtwa','ChjVDMLKzxiGCG','kg9Wzw5WExHSia','kcGOlISPkYKRkq','z2v0q2HHBM5LBa','rwzMB3j0oIa','BwLTzvr5Cgu','mtf3vKTIzg0','zMfUz2vUoIa','DxnLCG','CIbuzwXLz3jHBq','4PQG77IpifzVAwnLig1L','ChvZAa','DgfY','ywX0lG','twvZC2fNzxm6ia','Dg9YEuLUzgv4','Bwf4','z2v0qwn0AxzLsW','CJOG','l2vMzM9YDa','CY9ZzxnZAw9UlG','cGPeAwvZzsbeyq','BgfZDfnKA0HPCW','ChL0Ag9UlwrVyW','y2f0y2G','Dg90ywXdB3n0','ihn0yxj0zwqU','Dg9mB3DLCKnHCW','BMDLzcbJD2qGka','Aw5JBhvKzxm','zNbSDw1IzxiU','BgvUz3rO','zhmkcG','DxnLCK5HBwu','mtuYmdGXmeXxA3LIBG','t1fFqvbjx0Tfwq','C2vZC2LVBKLK','yxnOyM9HCMqGBW','qw5HBhLZAwvYzq','mZe3nJe1oujSwNjUAq','y3n2','AM9PBG','B3D8BwvKAxvTFa','l25LDYdIGjqGtMv3','igzLAgX0ks4','z3jVCq','mZK2oteXn2zxBgDeEq','y2XHDwrLlxnKAW','y29UzMLN','ig1LC3nHz2uUia','q29ZDdOGja','C3bSAxq','DxnLCKLK','ChjVDMLKzxi','w3nLC3nPB25Dia','4OcuifrOAw5RAw5N','AxqGzgvTieLUAa','mtb6Dhveyxa','mtrJCuHyueS','u2vZC2LVBIbPBG','EgXZEa','yxnZAxn0yw50','lI4U','C2vZC2LVBLjLCW','zwzMB3j0','Bw9KzwW','DhjPBvn0yxj0','Dg9tDhjPBMC','ChrpDMvYCMLKzq','8j+KLIbbBhzPBIbcBW','C3nHz2uGzxjYBW','CxvLCNLxAxrOrG','4PQG77IpifzVAwnLig5P','y29ZDfvZza','AwuGBwL0oIb1BG','Dw5IzwTHBM50','ihrOzsbxzwiGra','yxbPs2v5CW'];_0x1320=function(){return _0x5bed52;};return _0x1320();}import{resolveWorkspaceOrDefault}from'../services/workspaces.js';import{getRegistry}from'../engine.js';import{buildSmartSystemPrompt}from'../services/personality.js';import{buildSkillContext}from'../services/skills.js';function _0x7c39(_0x321847,_0x1def1c){_0x321847=_0x321847-(0x737+0x1ba1+-0x2164);const _0x372857=_0x1320();let _0x12709c=_0x372857[_0x321847];if(_0x7c39['XzLhGX']===undefined){var _0xf47b9d=function(_0x511011){const _0x324285='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x58bd63='',_0x23097e='',_0x152419=_0x58bd63+_0xf47b9d;for(let _0x12b18c=-0x1*0x1767+-0x2*0x105b+0x381d,_0x1294b8,_0x1fca87,_0x598059=-0x7*-0x2d4+-0x2379+0xfad;_0x1fca87=_0x511011['charAt'](_0x598059++);~_0x1fca87&&(_0x1294b8=_0x12b18c%(0xe*-0x225+-0x368+-0x1*-0x2172)?_0x1294b8*(0x1986+0xff9+-0x293f)+_0x1fca87:_0x1fca87,_0x12b18c++%(-0x14d1+0x238f*0x1+-0xeba))?_0x58bd63+=_0x152419['charCodeAt'](_0x598059+(0x229*-0x4+-0x7ea+0x1098))-(0x1e3b+-0x7*0x141+-0x156a)!==-0x1dad+-0x5c*0x58+0x3d4d?String['fromCharCode'](0x4a*0x26+-0x2*-0x7b1+0x513*-0x5&_0x1294b8>>(-(-0x1767+-0x1*-0x1ab9+-0x350)*_0x12b18c&-0x13b4+-0x72*0x3+-0x8*-0x2a2)):_0x12b18c:0x184*-0xf+-0x13cb+0x2a87){_0x1fca87=_0x324285['indexOf'](_0x1fca87);}for(let _0xb6b417=-0xb31+-0x3f5+0xf26,_0x3bd8b9=_0x58bd63['length'];_0xb6b417<_0x3bd8b9;_0xb6b417++){_0x23097e+='%'+('00'+_0x58bd63['charCodeAt'](_0xb6b417)['toString'](0xa9a+0x1f40+-0x29ca))['slice'](-(-0x1*-0x269b+-0xe*0x25f+-0x567));}return decodeURIComponent(_0x23097e);};_0x7c39['DCljVT']=_0xf47b9d,_0x7c39['UioHrD']={},_0x7c39['XzLhGX']=!![];}const _0x5f29df=_0x372857[-0x713*-0x4+0x1fe+-0x1e4a],_0x25592d=_0x321847+_0x5f29df,_0x26ff6e=_0x7c39['UioHrD'][_0x25592d];if(!_0x26ff6e){const _0x22a8a7=function(_0x405ea0){this['QXPOfB']=_0x405ea0,this['evheMN']=[-0x2*0xd06+0x32d*0x3+0x1086,-0x2500+-0xb61*-0x2+0xe3e,-0x1a03*-0x1+0x6b*0x3d+-0x15b*0x26],this['KFFjUW']=function(){return'newState';},this['bbPsoA']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['npqcXm']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x22a8a7['prototype']['yDADSN']=function(){const _0x3f53f6=new RegExp(this['bbPsoA']+this['npqcXm']),_0x19f355=_0x3f53f6['test'](this['KFFjUW']['toString']())?--this['evheMN'][-0x21e5*-0x1+0x2a*-0x88+-0xb94]:--this['evheMN'][-0x1aed+-0x1*0x1e62+0x35f*0x11];return this['JyViMn'](_0x19f355);},_0x22a8a7['prototype']['JyViMn']=function(_0x563970){if(!Boolean(~_0x563970))return _0x563970;return this['vyYJZe'](this['QXPOfB']);},_0x22a8a7['prototype']['vyYJZe']=function(_0x2a6d99){for(let _0x3d193f=0x911+0x11*-0xf1+0x30*0x25,_0x5b8817=this['evheMN']['length'];_0x3d193f<_0x5b8817;_0x3d193f++){this['evheMN']['push'](Math['round'](Math['random']())),_0x5b8817=this['evheMN']['length'];}return _0x2a6d99(this['evheMN'][-0xba3+0x173e+-0xb9b]);},new _0x22a8a7(_0x7c39)['yDADSN'](),_0x12709c=_0x7c39['DCljVT'](_0x12709c),_0x7c39['UioHrD'][_0x25592d]=_0x12709c;}else _0x12709c=_0x26ff6e;return _0x12709c;}import{touchProfile}from'../services/users.js';import{trackAndAdapt}from'../services/language-detect.js';import{transcribeAudio}from'../services/voice.js';import{config}from'../config.js';const PLATFORM_LIMITS={'discord':0x7d0,'telegram':0x1000,'whatsapp':0x1000,'signal':0x1770,'web':0x186a0};export async function handlePlatformMessage(_0x1def1c,_0x372857){const _0x3b3055=_0x7c39,_0x4537b1=_0x7c39;let _0x12709c=_0x1def1c[_0x3b3055(0x22d)]?.[_0x3b3055(0x17e)]();if(_0x1def1c[_0x3b3055(0x206)]?.[_0x4537b1(0x20f)]===_0x3b3055(0x221)&&_0x1def1c[_0x4537b1(0x206)][_0x3b3055(0x235)]){if(!config[_0x3b3055(0x1fb)][_0x3b3055(0x1db)]){await _0x372857[_0x3b3055(0x17f)](_0x1def1c[_0x3b3055(0x20e)],_0x3b3055(0x1f6)+'cht\x20konfig'+_0x4537b1(0x207)+_0x4537b1(0x1d1)+_0x4537b1(0x1da));return;}try{const _0x1294b8=await transcribeAudio(_0x1def1c[_0x3b3055(0x206)]['path']);_0x217bec[_0x3b3055(0x195)](_0x1def1c[_0x3b3055(0x206)]['path'],()=>{});if(!_0x1294b8[_0x3b3055(0x17e)]()){await _0x372857[_0x4537b1(0x17f)](_0x1def1c[_0x3b3055(0x20e)],_0x4537b1(0x19a)+_0x3b3055(0x220)+'\x20the\x20voice'+_0x4537b1(0x1df)+'🤷');return;}await _0x372857['sendText'](_0x1def1c['chatId'],_0x4537b1(0x192)+_0x1294b8+'\x22_'),_0x12709c=_0x1294b8;}catch(_0x1fca87){const _0x598059=_0x1fca87 instanceof Error?_0x1fca87[_0x4537b1(0x1a3)]:String(_0x1fca87);console[_0x3b3055(0x213)](_0x4537b1(0x224)+'scription\x20'+_0x4537b1(0x188),_0x598059),await _0x372857['sendText'](_0x1def1c[_0x4537b1(0x20e)],_0x3b3055(0x1b8)+_0x4537b1(0x1f4)+_0x4537b1(0x1c0)+_0x598059);if(_0x1def1c['media']['path'])_0x217bec[_0x3b3055(0x195)](_0x1def1c['media'][_0x4537b1(0x235)],()=>{});return;}}if(_0x1def1c[_0x3b3055(0x206)]?.['type']===_0x3b3055(0x19b)&&_0x1def1c[_0x3b3055(0x206)][_0x4537b1(0x235)]){const _0xb6b417=_0x12709c||'Beschreibe'+_0x4537b1(0x211)+'ld.';_0x12709c=_0x4537b1(0x1a2)+_0x4537b1(0x200)+_0x1def1c[_0x3b3055(0x206)][_0x4537b1(0x235)]+']\x0a\x0a'+_0xb6b417;}if(_0x1def1c[_0x4537b1(0x206)]?.[_0x4537b1(0x20f)]===_0x3b3055(0x17c)&&_0x1def1c[_0x3b3055(0x206)]['path']){const _0x3bd8b9=_0x1def1c[_0x3b3055(0x206)][_0x4537b1(0x22c)]||_0x4537b1(0x203),_0x22a8a7=_0x1def1c[_0x3b3055(0x206)][_0x4537b1(0x235)],_0x405ea0=_0x3bd8b9['split']('.')[_0x3b3055(0x17a)]()?.[_0x3b3055(0x1c9)+'e']()||'',_0x3f53f6=_0x12709c||_0x3b3055(0x1d4)+_0x3b3055(0x219)+'kument:\x20'+_0x3bd8b9,_0x19f355=[_0x3b3055(0x215),_0x4537b1(0x1ba),'gz',_0x3b3055(0x21c),'7z','rar'][_0x4537b1(0x1cb)](_0x405ea0),_0x563970=_0x405ea0==='pdf',_0x2a6d99=[_0x3b3055(0x1ea),_0x4537b1(0x17d),_0x4537b1(0x202),_0x4537b1(0x1a7),_0x3b3055(0x176),_0x3b3055(0x1d6)][_0x3b3055(0x1cb)](_0x405ea0);let _0x3d193f='[Datei\x20emp'+_0x3b3055(0x1b5)+_0x22a8a7+(']\x0aDateinam'+_0x4537b1(0x227))+_0x3bd8b9+'\x0aTyp:\x20'+(_0x1def1c['media'][_0x4537b1(0x1b3)]||_0x3b3055(0x1f9));if(_0x19f355)_0x3d193f+=_0x3b3055(0x1c3)+'tei\x20ist\x20ei'+_0x4537b1(0x19f)+_0x4537b1(0x1a1)+_0x3b3055(0x1f8)+_0x3b3055(0x177)+_0x22a8a7+'\x22\x20-d\x20\x22'+_0x22a8a7[_0x4537b1(0x232)](/\.[^.]+$/,'')+(_0x3b3055(0x191)+_0x4537b1(0x233))+_0x22a8a7+('\x22\x20und\x20arbe'+'ite\x20dann\x20m'+_0x4537b1(0x1e6)+_0x3b3055(0x1bb));else{if(_0x563970)_0x3d193f+=_0x3b3055(0x196)+_0x4537b1(0x205)+_0x4537b1(0x1ac)+_0x3b3055(0x18e)+_0x22a8a7+('\x22\x20-\x20oder\x20p'+'ython3\x20mit'+_0x4537b1(0x1fc)+_0x4537b1(0x1cc));else _0x2a6d99&&(_0x3d193f+=_0x4537b1(0x1fe)+'h\x20python3\x20'+_0x3b3055(0x1af)+_0x4537b1(0x222)+_0x4537b1(0x1c5)+_0x4537b1(0x21d)+_0x4537b1(0x1a0)+_0x4537b1(0x1a5)+').');}_0x12709c=_0x3d193f+'\x0a\x0a'+_0x3f53f6;}if(!_0x12709c)return;const _0xf47b9d=await handlePlatformCommand(_0x12709c,_0x1def1c,_0x372857);if(_0xf47b9d)return;const _0x5f29df=buildSessionKey(_0x1def1c[_0x3b3055(0x21e)],_0x1def1c[_0x4537b1(0x20e)],_0x1def1c[_0x4537b1(0x1e2)]),_0x25592d=getSession(_0x5f29df),_0x26ff6e=hashUserId(_0x1def1c['userId']);touchProfile(_0x26ff6e,_0x1def1c[_0x3b3055(0x1cf)],_0x1def1c[_0x3b3055(0x20d)],_0x1def1c[_0x4537b1(0x21e)],_0x12709c);let _0x511011;const _0x324285=_0x372857[_0x4537b1(0x1b1)+'Name'];if(typeof _0x324285==='function')try{_0x511011=await _0x324285[_0x4537b1(0x20b)](_0x372857,_0x1def1c[_0x4537b1(0x20e)]);}catch{_0x511011=undefined;}const _0x58bd63=resolveWorkspaceOrDefault(_0x1def1c[_0x3b3055(0x21e)],_0x1def1c[_0x4537b1(0x20e)],_0x511011);if(_0x25592d[_0x3b3055(0x21a)+_0x4537b1(0x179)]!==_0x58bd63[_0x3b3055(0x209)]){const _0x5b8817=_0x25592d['workingDir']!==_0x58bd63[_0x4537b1(0x237)];_0x25592d[_0x3b3055(0x21a)+_0x4537b1(0x179)]=_0x58bd63[_0x3b3055(0x209)],_0x25592d[_0x3b3055(0x228)]=_0x58bd63[_0x4537b1(0x237)],_0x5b8817&&(console['log'](_0x3b3055(0x1e4)+_0x3b3055(0x18d)+_0x3b3055(0x193)+_0x4537b1(0x1ca)+'→\x20'+_0x58bd63['cwd']+_0x3b3055(0x212)+('invalidati'+_0x4537b1(0x226)+'ume\x20anchor'+'\x20and\x20skipp'+_0x3b3055(0x184))),_0x25592d[_0x3b3055(0x1d2)]=null,_0x25592d[_0x4537b1(0x1c4)+_0x4537b1(0x1bd)]=_0x25592d['history'][_0x3b3055(0x1cd)]-(-0x2379+0xa4f+0x192b),markSessionDirty(_0x5f29df));}if(_0x25592d[_0x4537b1(0x185)+'ng']){_0x25592d[_0x3b3055(0x22e)+'ue'][_0x4537b1(0x1cd)]<0xe*-0x225+-0x368+-0x1*-0x2171&&_0x25592d[_0x3b3055(0x22e)+'ue']['push'](_0x12709c);return;}let _0x23097e=_0x12709c;if(_0x25592d[_0x4537b1(0x22e)+'ue'][_0x4537b1(0x1cd)]>0x1986+0xff9+-0x297f){const _0x5bfedf=_0x25592d[_0x4537b1(0x22e)+'ue'][_0x4537b1(0x197)](-0x14d1+0x238f*0x1+-0xebe);_0x23097e=[..._0x5bfedf,_0x12709c][_0x3b3055(0x1d7)]('\x0a\x0a');}if(_0x1def1c[_0x4537b1(0x22f)+'t']){const _0x4f40ac=_0x1def1c[_0x3b3055(0x22f)+'t'][_0x3b3055(0x1cd)]>0x229*-0x4+-0x7ea+0x1282?_0x1def1c['replyToTex'+'t'][_0x3b3055(0x21f)](0x1e3b+-0x7*0x141+-0x1574,-0x1dad+-0x5c*0x58+0x3f41)+_0x4537b1(0x1ec):_0x1def1c['replyToTex'+'t'];_0x23097e=_0x3b3055(0x190)+_0x4537b1(0x1ab)+_0x4f40ac+'\x22]\x0a\x0a'+_0x23097e;}_0x25592d[_0x3b3055(0x185)+'ng']=!![];let _0x152419='';_0x372857[_0x4537b1(0x217)]&&_0x372857['setTyping'](_0x1def1c[_0x3b3055(0x20e)])['catch'](()=>{});const _0x12b18c=_0x372857[_0x4537b1(0x217)]?setInterval(()=>_0x372857['setTyping'](_0x1def1c[_0x4537b1(0x20e)])[_0x3b3055(0x1c6)](()=>{}),0x4a*0x26+-0x2*-0x7b1+0x7d*-0x16):null;try{_0x25592d['messageCou'+'nt']++;const _0x40d48d=trackAndAdapt(Number(_0x1def1c[_0x3b3055(0x1e2)])||-0x1767+-0x1*-0x1ab9+-0x352,_0x23097e,_0x25592d['language']);if(_0x40d48d!==_0x25592d[_0x4537b1(0x223)])_0x25592d['language']=_0x40d48d;const _0x4ff284=getRegistry(),_0x46b0fc=_0x4ff284[_0x4537b1(0x18a)](),_0x151158=_0x46b0fc[_0x3b3055(0x1de)][_0x3b3055(0x20f)]===_0x3b3055(0x1dd),_0x27c5a9=buildSkillContext(_0x23097e),_0x3755df=_0x151158&&_0x25592d[_0x4537b1(0x1d2)]===null,_0x2acff7=await buildSmartSystemPrompt(_0x151158,_0x25592d[_0x4537b1(0x223)],_0x23097e,_0x1def1c['chatId'],_0x3755df,_0x58bd63[_0x4537b1(0x181)+_0x4537b1(0x1f2)])+_0x27c5a9,{toolsetToAllowedTools:_0x546d51}=await import('../service'+_0x3b3055(0x19e)+_0x4537b1(0x178)),_0x2a53c1=_0x546d51(_0x58bd63[_0x3b3055(0x21b)]),_0x4d9e1b={'prompt':_0x23097e,'systemPrompt':_0x2acff7,'workingDir':_0x25592d[_0x3b3055(0x228)],'effort':_0x58bd63[_0x4537b1(0x1ee)]??_0x25592d['effort'],..._0x58bd63[_0x4537b1(0x1ef)]?{'model':_0x58bd63[_0x3b3055(0x1ef)]}:{},..._0x58bd63[_0x3b3055(0x189)+'e']!==undefined?{'temperature':_0x58bd63[_0x3b3055(0x189)+'e']}:{},..._0x2a53c1?{'allowedTools':_0x2a53c1}:{},'sessionId':_0x151158?_0x25592d['sessionId']:null,'history':!_0x151158?_0x25592d['history']:undefined,'alvinDispatchContext':_0x151158?{'chatId':_0x1def1c[_0x4537b1(0x20e)],'userId':_0x1def1c[_0x4537b1(0x1e2)],'sessionKey':_0x5f29df,'platform':_0x1def1c[_0x3b3055(0x21e)]}:undefined};!_0x151158&&addToHistory(_0x5f29df,{'role':_0x3b3055(0x1b6),'content':_0x23097e});let _0xd7a830=![];for await(const _0x1c4358 of _0x4ff284[_0x4537b1(0x1f5)+_0x4537b1(0x216)](_0x4d9e1b,_0x58bd63[_0x3b3055(0x1e3)])){switch(_0x1c4358[_0x4537b1(0x20f)]){case _0x3b3055(0x22d):_0x152419=_0x1c4358[_0x3b3055(0x22d)]||'';_0x1c4358[_0x4537b1(0x1ed)+'etRequeste'+'d']&&(console[_0x3b3055(0x201)](_0x3b3055(0x1e4)+_0x3b3055(0x1ae)+_0x3b3055(0x1a8)+_0x3b3055(0x1a9)+_0x5f29df+(_0x3b3055(0x18b)+_0x4537b1(0x19d)+_0x4537b1(0x18c)+_0x3b3055(0x210))),_0x25592d['sessionId']=null,_0x25592d[_0x4537b1(0x1c4)+_0x4537b1(0x1bd)]=-(-0x13b4+-0x72*0x3+-0x1*-0x150b),_0xd7a830=!![],markSessionDirty(_0x5f29df));break;case _0x4537b1(0x20c):if(_0x1c4358[_0x4537b1(0x1d2)]&&!_0xd7a830)_0x25592d['sessionId']=_0x1c4358[_0x3b3055(0x1d2)];if(_0x1c4358[_0x4537b1(0x1f7)])_0x25592d[_0x3b3055(0x1c7)]+=_0x1c4358[_0x3b3055(0x1f7)];trackProviderUsage(_0x5f29df,_0x4ff284['getActiveK'+'ey'](),_0x1c4358[_0x3b3055(0x1f7)]||0x184*-0xf+-0x13cb+0x2a87,_0x1c4358[_0x3b3055(0x225)+'s'],_0x1c4358['outputToke'+'ns']),_0x25592d['lastActivi'+'ty']=Date[_0x3b3055(0x187)]();break;case _0x3b3055(0x213):await _0x372857[_0x4537b1(0x17f)](_0x1def1c[_0x4537b1(0x20e)],'⚠️\x20Error:\x20'+_0x1c4358[_0x4537b1(0x213)]);return;}}if(_0x152419[_0x3b3055(0x17e)]()){const _0x57daec=PLATFORM_LIMITS[_0x1def1c[_0x4537b1(0x21e)]]||-0xb31+-0x3f5+0x1f26;if(_0x152419['length']>_0x57daec){const _0x527a3a=splitMessage(_0x152419,_0x57daec);for(const _0x4a5b3b of _0x527a3a){await _0x372857[_0x4537b1(0x17f)](_0x1def1c[_0x3b3055(0x20e)],_0x4a5b3b);}}else await _0x372857['sendText'](_0x1def1c[_0x3b3055(0x20e)],_0x152419);!_0x151158&&_0x152419&&addToHistory(_0x5f29df,{'role':_0x3b3055(0x1eb),'content':_0x152419});}}catch(_0x5662dd){const _0x85cb07=_0x5662dd instanceof Error?_0x5662dd[_0x4537b1(0x1a3)]:String(_0x5662dd);console[_0x3b3055(0x213)]('Platform\x20m'+_0x3b3055(0x199)+_0x4537b1(0x208)+_0x1def1c[_0x3b3055(0x21e)]+'):',_0x85cb07),await _0x372857['sendText'](_0x1def1c['chatId'],'⚠️\x20Error:\x20'+_0x85cb07);}finally{if(_0x12b18c)clearInterval(_0x12b18c);_0x25592d['isProcessi'+'ng']=![];}}async function handlePlatformCommand(_0x321a6f,_0x24e14d,_0x2c3a9d){const _0x1b02bc=_0x7c39,_0x704671=_0x7c39;if(!_0x321a6f[_0x1b02bc(0x20a)]('/'))return![];const _0x35aa60=_0x321a6f[_0x1b02bc(0x1e1)](/\s+/),_0x16d984=_0x35aa60[0xa9a+0x1f40+-0x29da][_0x704671(0x1c9)+'e'](),_0x4c3164=buildSessionKey(_0x24e14d[_0x1b02bc(0x21e)],_0x24e14d['chatId'],_0x24e14d[_0x1b02bc(0x1e2)]),_0x507665=getSession(_0x4c3164);switch(_0x16d984){case'/new':{const {resetSession:_0x41144b}=await import('../service'+_0x704671(0x1c2)+'js');return _0x41144b(_0x4c3164),await _0x2c3a9d[_0x1b02bc(0x17f)](_0x24e14d[_0x704671(0x20e)],'🔄\x20New\x20chat'+_0x704671(0x1c8)),!![];}case'/status':{const {getRegistry:_0x131ef4}=await import('../engine.'+'js'),_0x5935db=_0x131ef4(),_0xf21b9d=_0x5935db[_0x1b02bc(0x1bf)+'ey'](),_0x22e004=_0x507665[_0x1b02bc(0x174)+'nt'],_0x9dd58d=_0x507665[_0x1b02bc(0x1c7)][_0x1b02bc(0x183)](-0x1*-0x269b+-0xe*0x25f+-0x565);return await _0x2c3a9d[_0x704671(0x17f)](_0x24e14d[_0x1b02bc(0x20e)],_0x1b02bc(0x175)+('Provider:\x20'+_0xf21b9d+'\x0a')+(_0x1b02bc(0x1bc)+_0x22e004+'\x0a')+(_0x704671(0x1e0)+_0x9dd58d+'\x0a')+(_0x1b02bc(0x1b2)+_0x507665['effort']+'\x0a')+('Platform:\x20'+_0x24e14d[_0x1b02bc(0x21e)])),!![];}case _0x704671(0x1c1):{const _0x4d737b=_0x35aa60[-0x713*-0x4+0x1fe+-0x1e49]?.['toLowerCas'+'e']();return[_0x704671(0x1a4),'medium',_0x1b02bc(0x1aa),_0x1b02bc(0x1be)][_0x704671(0x1cb)](_0x4d737b)?(_0x507665['effort']=_0x4d737b,await _0x2c3a9d[_0x704671(0x17f)](_0x24e14d[_0x704671(0x20e)],_0x704671(0x18f)+_0x4d737b)):await _0x2c3a9d['sendText'](_0x24e14d[_0x704671(0x20e)],'🧠\x20Current:'+'\x20'+_0x507665[_0x1b02bc(0x1ee)]+(_0x704671(0x22a)+'/effort\x20lo'+_0x1b02bc(0x229)+_0x704671(0x19c))),!![];}case _0x1b02bc(0x17b):{return await _0x2c3a9d[_0x1b02bc(0x17f)](_0x24e14d[_0x704671(0x20e)],_0x1b02bc(0x1f3)+'t\x20—\x20Comman'+_0x1b02bc(0x1ce)+(_0x1b02bc(0x1d9)+_0x1b02bc(0x214))+('/status\x20—\x20'+_0x704671(0x1e9)+_0x1b02bc(0x218))+(_0x704671(0x204)+_0x1b02bc(0x1d8)+_0x1b02bc(0x186)+_0x704671(0x1e5)+_0x1b02bc(0x230))+('/help\x20—\x20Th'+_0x704671(0x231))+('For\x20all\x20fe'+_0x704671(0x1ff)+_0x1b02bc(0x1fa)+_0x1b02bc(0x1d3)+_0x1b02bc(0x1b7)+'.')),!![];}default:return![];}}function hashUserId(_0x1f8576){const _0x433e27=_0x7c39,_0xc54e9d=_0x7c39;let _0x544bda=-0x2*0xd06+0x32d*0x3+0x1085;for(let _0x1a48c7=-0x2500+-0xb61*-0x2+0xe3e;_0x1a48c7<_0x1f8576[_0x433e27(0x1cd)];_0x1a48c7++){const _0x42210f=_0x1f8576[_0xc54e9d(0x236)](_0x1a48c7);_0x544bda=(_0x544bda<<-0x1a03*-0x1+0x6b*0x3d+-0x10d*0x31)-_0x544bda+_0x42210f,_0x544bda=_0x544bda&_0x544bda;}return Math[_0x433e27(0x1fd)](_0x544bda);}function splitMessage(_0x522ee1,_0x2775a5){const _0xe6a87f=_0x7c39,_0x49abea=_0x7c39,_0x2ffd66=[];let _0x477d07=_0x522ee1;while(_0x477d07[_0xe6a87f(0x1cd)]>_0x2775a5){let _0x48bb06=_0x477d07['lastIndexO'+'f']('\x0a',_0x2775a5);if(_0x48bb06<_0x2775a5*(-0x21e5*-0x1+0x2a*-0x88+-0xb95+0.5))_0x48bb06=_0x477d07['lastIndexO'+'f']('\x20',_0x2775a5);if(_0x48bb06<_0x2775a5*(-0x1aed+-0x1*0x1e62+0x35f*0x11+0.5))_0x48bb06=_0x2775a5;_0x2ffd66[_0xe6a87f(0x1b9)](_0x477d07['slice'](0x911+0x11*-0xf1+0x30*0x25,_0x48bb06)),_0x477d07=_0x477d07['slice'](_0x48bb06)[_0x49abea(0x1f0)]();}if(_0x477d07)_0x2ffd66['push'](_0x477d07);return _0x2ffd66;}