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,205 +1 @@
1
- /**
2
- * Signal Platform Adapter
3
- *
4
- * Uses signal-cli (REST API mode) for Signal messaging.
5
- * Optional — only loaded if SIGNAL_API_URL is set.
6
- *
7
- * Setup:
8
- * 1. Run signal-cli in REST API mode:
9
- * docker run -p 8080:8080 bbernhard/signal-cli-rest-api
10
- * 2. Register/link a phone number via signal-cli
11
- * 3. Set SIGNAL_API_URL=http://localhost:8080 and SIGNAL_NUMBER=+49... in .env
12
- */
13
- import fs from "fs";
14
- import { tmpdir } from "os";
15
- import { join } from "path";
16
- let _signalState = {
17
- status: "disconnected",
18
- apiVersion: null,
19
- number: null,
20
- connectedAt: null,
21
- error: null,
22
- };
23
- export function getSignalState() {
24
- return { ..._signalState };
25
- }
26
- export class SignalAdapter {
27
- platform = "signal";
28
- handler = null;
29
- apiUrl;
30
- number;
31
- pollInterval = null;
32
- constructor(apiUrl, number) {
33
- this.apiUrl = apiUrl.replace(/\/$/, "");
34
- this.number = number;
35
- }
36
- async start() {
37
- _signalState.status = "connecting";
38
- _signalState.number = this.number;
39
- // Verify connection
40
- try {
41
- const res = await fetch(`${this.apiUrl}/v1/about`);
42
- if (!res.ok)
43
- throw new Error(`Signal API not reachable: ${res.status}`);
44
- const about = await res.json().catch(() => ({}));
45
- _signalState.status = "connected";
46
- _signalState.apiVersion = about.version || about.versions?.[0] || null;
47
- _signalState.connectedAt = Date.now();
48
- console.log("📱 Signal adapter connected");
49
- }
50
- catch (err) {
51
- _signalState.status = "error";
52
- _signalState.error = err instanceof Error ? err.message : String(err);
53
- console.error("Signal adapter failed:", err);
54
- throw err;
55
- }
56
- // Poll for new messages every 2 seconds
57
- this.pollInterval = setInterval(async () => {
58
- try {
59
- const res = await fetch(`${this.apiUrl}/v1/receive/${encodeURIComponent(this.number)}`);
60
- if (!res.ok)
61
- return;
62
- const messages = await res.json();
63
- for (const msg of messages) {
64
- const data = msg.envelope?.dataMessage;
65
- if (!data)
66
- continue;
67
- if (!this.handler)
68
- continue;
69
- const hasText = !!data.message;
70
- const hasVoice = data.attachments?.some((a) => a.contentType?.startsWith("audio/") || a.voiceNote);
71
- // Must have text or a voice attachment
72
- if (!hasText && !hasVoice)
73
- continue;
74
- const isGroup = !!data.groupInfo;
75
- // Download voice attachment if present
76
- let mediaInfo = undefined;
77
- if (hasVoice) {
78
- try {
79
- const voiceAtt = data.attachments.find((a) => a.contentType?.startsWith("audio/") || a.voiceNote);
80
- if (voiceAtt?.id) {
81
- const attRes = await fetch(`${this.apiUrl}/v1/attachments/${voiceAtt.id}`, { headers: { "Content-Type": "application/json" } });
82
- if (attRes.ok) {
83
- const tmpDir = join(tmpdir(), "alvin-bot");
84
- if (!fs.existsSync(tmpDir))
85
- fs.mkdirSync(tmpDir, { recursive: true });
86
- const ext = voiceAtt.contentType?.includes("ogg") ? "ogg" : "mp3";
87
- const audioPath = join(tmpDir, `signal_voice_${Date.now()}.${ext}`);
88
- fs.writeFileSync(audioPath, Buffer.from(await attRes.arrayBuffer()));
89
- mediaInfo = { type: "voice", path: audioPath, mimeType: voiceAtt.contentType || "audio/ogg" };
90
- }
91
- }
92
- }
93
- catch (err) {
94
- console.error("Signal: Failed to download voice:", err);
95
- }
96
- }
97
- const incoming = {
98
- platform: "signal",
99
- messageId: msg.envelope.timestamp?.toString() || "",
100
- chatId: isGroup ? data.groupInfo.groupId : msg.envelope.sourceNumber,
101
- userId: msg.envelope.sourceNumber || "",
102
- userName: msg.envelope.sourceName || msg.envelope.sourceNumber || "Unknown",
103
- text: data.message || "",
104
- isGroup,
105
- isMention: !!(data.message && (data.message.includes("@bot") || data.message.includes("Alvin Bot"))),
106
- isReplyToBot: false,
107
- replyToText: data.quote?.text,
108
- media: mediaInfo,
109
- };
110
- // In groups: only respond to mentions (voice in groups always allowed)
111
- if (isGroup && !incoming.isMention && !hasVoice)
112
- continue;
113
- await this.handler(incoming);
114
- }
115
- }
116
- catch { /* poll error — retry next interval */ }
117
- }, 2000);
118
- }
119
- async stop() {
120
- if (this.pollInterval) {
121
- clearInterval(this.pollInterval);
122
- this.pollInterval = null;
123
- }
124
- }
125
- async sendText(chatId, text) {
126
- // Determine if chatId is a group or direct message
127
- const isGroup = chatId.length > 20; // Signal group IDs are long base64 strings
128
- const body = {
129
- message: text,
130
- number: this.number,
131
- recipients: isGroup ? undefined : [chatId],
132
- };
133
- if (isGroup) {
134
- // Send to group
135
- await fetch(`${this.apiUrl}/v2/send`, {
136
- method: "POST",
137
- headers: { "Content-Type": "application/json" },
138
- body: JSON.stringify({
139
- ...body,
140
- recipients: [chatId],
141
- }),
142
- });
143
- }
144
- else {
145
- await fetch(`${this.apiUrl}/v2/send`, {
146
- method: "POST",
147
- headers: { "Content-Type": "application/json" },
148
- body: JSON.stringify(body),
149
- });
150
- }
151
- }
152
- async sendPhoto(chatId, photo, caption) {
153
- // Signal sends attachments as base64 in the message body
154
- const base64 = typeof photo === "string"
155
- ? fs.readFileSync(photo).toString("base64")
156
- : photo.toString("base64");
157
- await fetch(`${this.apiUrl}/v2/send`, {
158
- method: "POST",
159
- headers: { "Content-Type": "application/json" },
160
- body: JSON.stringify({
161
- message: caption || "",
162
- number: this.number,
163
- recipients: [chatId],
164
- base64_attachments: [`data:image/png;base64,${base64}`],
165
- }),
166
- });
167
- }
168
- async sendDocument(chatId, doc, fileName, caption) {
169
- const base64 = typeof doc === "string"
170
- ? fs.readFileSync(doc).toString("base64")
171
- : doc.toString("base64");
172
- await fetch(`${this.apiUrl}/v2/send`, {
173
- method: "POST",
174
- headers: { "Content-Type": "application/json" },
175
- body: JSON.stringify({
176
- message: caption || fileName,
177
- number: this.number,
178
- recipients: [chatId],
179
- base64_attachments: [`data:application/octet-stream;filename=${fileName};base64,${base64}`],
180
- }),
181
- });
182
- }
183
- async react(chatId, messageId, emoji) {
184
- try {
185
- await fetch(`${this.apiUrl}/v1/reactions/${encodeURIComponent(this.number)}`, {
186
- method: "POST",
187
- headers: { "Content-Type": "application/json" },
188
- body: JSON.stringify({
189
- recipient: chatId,
190
- reaction: emoji,
191
- target_author: chatId,
192
- timestamp: parseInt(messageId),
193
- }),
194
- });
195
- }
196
- catch { /* ignore */ }
197
- }
198
- async setTyping(chatId) {
199
- // Signal doesn't have a native typing indicator via REST API
200
- // No-op to satisfy the interface
201
- }
202
- onMessage(handler) {
203
- this.handler = handler;
204
- }
205
- }
1
+ const _0x37a449=_0x557e,_0x29930c=_0x557e;(function(_0x18bcdc,_0x30a8b1){const _0x1a1f43=_0x557e,_0x41c80b=_0x557e,_0x5143d7=_0x18bcdc();while(!![]){try{const _0x4fd043=parseInt(_0x1a1f43(0xc4))/(-0x10d*-0x17+-0x1c6a+-0x1*-0x440)+-parseInt(_0x41c80b(0xd8))/(0x2*0xb5a+-0x1989+0x2d7)+-parseInt(_0x41c80b(0xc3))/(-0x7c7+-0x8c7+0x1091)*(parseInt(_0x1a1f43(0xc6))/(-0xb63+0x1b2a+0x5*-0x327))+parseInt(_0x1a1f43(0xb2))/(0x17e3+0x2634+-0x3e12)*(parseInt(_0x1a1f43(0x96))/(-0x79f+-0x103a+0x17df))+-parseInt(_0x1a1f43(0xd1))/(0x122+-0x157*0xd+0x1050)*(parseInt(_0x41c80b(0xae))/(0x1c1*-0x12+0x18a+0x1e10))+-parseInt(_0x1a1f43(0xb6))/(-0xf1e+-0x15dc+0x2503*0x1)*(-parseInt(_0x41c80b(0x95))/(0xb*0x359+-0x1a8*0x16+-0x59))+parseInt(_0x1a1f43(0xaa))/(0x1cf6+-0x1592*0x1+-0x759);if(_0x4fd043===_0x30a8b1)break;else _0x5143d7['push'](_0x5143d7['shift']());}catch(_0x21049e){_0x5143d7['push'](_0x5143d7['shift']());}}}(_0x7012,-0x4de79+0xa696e+0x493a0));const _0x4c57ac=(function(){let _0x4015f5=!![];return function(_0x534e7d,_0x233207){const _0x5ec98f=_0x4015f5?function(){const _0x14608d=_0x557e;if(_0x233207){const _0x4d2363=_0x233207[_0x14608d(0xcf)](_0x534e7d,arguments);return _0x233207=null,_0x4d2363;}}:function(){};return _0x4015f5=![],_0x5ec98f;};}()),_0x1c18aa=_0x4c57ac(this,function(){const _0x3c69b6=_0x557e,_0x2290f5=_0x557e;return _0x1c18aa[_0x3c69b6(0x9a)]()[_0x3c69b6(0xb3)](_0x3c69b6(0xa9)+'+$')['toString']()[_0x3c69b6(0x9c)+'r'](_0x1c18aa)[_0x3c69b6(0xb3)](_0x3c69b6(0xa9)+'+$');});_0x1c18aa();function _0x557e(_0x4d2f1a,_0xd02b80){_0x4d2f1a=_0x4d2f1a-(0x23f7+0x26db+-0xc63*0x6);const _0x4e14da=_0x7012();let _0xe1387a=_0x4e14da[_0x4d2f1a];if(_0x557e['OIhQCQ']===undefined){var _0x6257cc=function(_0x108532){const _0x3e520b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3f8a1b='',_0x2d7860='',_0x2afed5=_0x3f8a1b+_0x6257cc;for(let _0x263230=0x3d*0x82+0x141d+0x1d*-0x1c3,_0x24f991,_0x2ae568,_0x1f31b0=-0x2624+0x3d1*-0x4+0x1ab4*0x2;_0x2ae568=_0x108532['charAt'](_0x1f31b0++);~_0x2ae568&&(_0x24f991=_0x263230%(-0x2678+0x14e+0x252e)?_0x24f991*(-0x7c*-0x43+-0x233b+0x1f*0x19)+_0x2ae568:_0x2ae568,_0x263230++%(-0xb*0x133+0xb5*0x13+-0x3a))?_0x3f8a1b+=_0x2afed5['charCodeAt'](_0x1f31b0+(-0x1d*-0x13d+0x2f5*0x2+0x233*-0x13))-(0x1b*-0x9+0xff0+-0xef3)!==-0x2*0x4e4+0x3*-0xcb1+0x1*0x2fdb?String['fromCharCode'](-0x1*-0x1e0a+0x923+-0x262e&_0x24f991>>(-(-0x717*-0x2+0x81+-0x1*0xead)*_0x263230&0x1*0x15ca+0x68*0x22+-0x2394)):_0x263230:-0x193b+-0x3*-0x503+0xa32){_0x2ae568=_0x3e520b['indexOf'](_0x2ae568);}for(let _0x133255=0x7*0x524+-0xb7*0x31+-0x1*0xf5,_0x21ca21=_0x3f8a1b['length'];_0x133255<_0x21ca21;_0x133255++){_0x2d7860+='%'+('00'+_0x3f8a1b['charCodeAt'](_0x133255)['toString'](-0xdf*0x1+-0x1*-0xb+0x1*0xe4))['slice'](-(-0x1b5*0xa+0xa*-0x26c+-0x294c*-0x1));}return decodeURIComponent(_0x2d7860);};_0x557e['DWIRCR']=_0x6257cc,_0x557e['XDdLXD']={},_0x557e['OIhQCQ']=!![];}const _0x5c3537=_0x4e14da[0x21ab+0x259d+0x11d2*-0x4],_0x2e2dfe=_0x4d2f1a+_0x5c3537,_0x4b65fa=_0x557e['XDdLXD'][_0x2e2dfe];if(!_0x4b65fa){const _0x50d7b5=function(_0x21ca46){this['aiGqOc']=_0x21ca46,this['pAxHsm']=[-0x799+0x16f9+-0xf5f,0x24e6*0x1+0x25c*0x1+-0x2742,0x2467+0x1*0x673+-0x2ada],this['ISOTKK']=function(){return'newState';},this['SAFNBQ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['xBwVUB']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x50d7b5['prototype']['ePshDe']=function(){const _0x244654=new RegExp(this['SAFNBQ']+this['xBwVUB']),_0x4f0f6c=_0x244654['test'](this['ISOTKK']['toString']())?--this['pAxHsm'][0x1872+-0x88c*-0x4+-0x3aa1]:--this['pAxHsm'][-0xb5*0x21+0x4*0x3ed+0x5d*0x15];return this['DIxyWi'](_0x4f0f6c);},_0x50d7b5['prototype']['DIxyWi']=function(_0x3d3710){if(!Boolean(~_0x3d3710))return _0x3d3710;return this['lIXnJQ'](this['aiGqOc']);},_0x50d7b5['prototype']['lIXnJQ']=function(_0x4cd729){for(let _0x5e5182=-0x595*-0x3+-0x1983*-0x1+-0x2a42,_0x201793=this['pAxHsm']['length'];_0x5e5182<_0x201793;_0x5e5182++){this['pAxHsm']['push'](Math['round'](Math['random']())),_0x201793=this['pAxHsm']['length'];}return _0x4cd729(this['pAxHsm'][0x83f*-0x3+-0x8e8+0x21a5]);},new _0x50d7b5(_0x557e)['ePshDe'](),_0xe1387a=_0x557e['DWIRCR'](_0xe1387a),_0x557e['XDdLXD'][_0x2e2dfe]=_0xe1387a;}else _0xe1387a=_0x4b65fa;return _0xe1387a;}import _0x1f963f from'fs';import{tmpdir}from'os';import{join}from'path';let _signalState={'status':_0x37a449(0xa1)+'ed','apiVersion':null,'number':null,'connectedAt':null,'error':null};export function getSignalState(){return{..._signalState};}export class SignalAdapter{['platform']=_0x29930c(0xd7);[_0x29930c(0xbe)]=null;[_0x29930c(0xc8)];['number'];[_0x29930c(0xb1)+'al']=null;constructor(_0x4fdd30,_0x5b842b){const _0x5239c3=_0x29930c,_0x1c59c2=_0x37a449;this[_0x5239c3(0xc8)]=_0x4fdd30[_0x5239c3(0x81)](/\/$/,''),this['number']=_0x5b842b;}async[_0x37a449(0xb5)](){const _0x197314=_0x37a449,_0x18a419=_0x37a449;_signalState[_0x197314(0x97)]=_0x197314(0x87),_signalState['number']=this[_0x18a419(0xa6)];try{const _0x36e854=await fetch(this[_0x18a419(0xc8)]+_0x197314(0x9f));if(!_0x36e854['ok'])throw new Error('Signal\x20API'+_0x18a419(0x8f)+'able:\x20'+_0x36e854[_0x18a419(0x97)]);const _0x35946a=await _0x36e854[_0x197314(0xc1)]()[_0x18a419(0x92)](()=>({}));_signalState[_0x18a419(0x97)]=_0x18a419(0x91),_signalState[_0x18a419(0xad)]=_0x35946a[_0x197314(0xc0)]||_0x35946a['versions']?.[-0x2624+0x3d1*-0x4+0x1ab4*0x2]||null,_signalState[_0x197314(0xd0)+'t']=Date[_0x18a419(0xdb)](),console[_0x197314(0xbc)](_0x18a419(0x8e)+'dapter\x20con'+_0x197314(0xb9));}catch(_0x229d3d){_signalState[_0x18a419(0x97)]='error',_signalState[_0x18a419(0xb4)]=_0x229d3d instanceof Error?_0x229d3d['message']:String(_0x229d3d),console[_0x18a419(0xb4)](_0x197314(0xbf)+'pter\x20faile'+'d:',_0x229d3d);throw _0x229d3d;}this[_0x18a419(0xb1)+'al']=setInterval(async()=>{const _0x302196=_0x197314,_0x225dc1=_0x197314;try{const _0x3f3f95=await fetch(this[_0x302196(0xc8)]+(_0x302196(0x85)+'e/')+encodeURIComponent(this[_0x302196(0xa6)]));if(!_0x3f3f95['ok'])return;const _0x520893=await _0x3f3f95[_0x225dc1(0xc1)]();for(const _0x37d345 of _0x520893){const _0x52eb39=_0x37d345[_0x225dc1(0x80)]?.[_0x225dc1(0xd4)+'e'];if(!_0x52eb39)continue;if(!this[_0x225dc1(0xbe)])continue;const _0x2e879d=!!_0x52eb39[_0x225dc1(0xd5)],_0x43245e=_0x52eb39[_0x302196(0xa2)+'s']?.[_0x225dc1(0xa5)](_0x648d8b=>_0x648d8b[_0x225dc1(0x8a)+'e']?.[_0x302196(0xab)](_0x302196(0x8c))||_0x648d8b[_0x225dc1(0xb8)]);if(!_0x2e879d&&!_0x43245e)continue;const _0x395564=!!_0x52eb39[_0x225dc1(0xdc)];let _0x4a2d7e=undefined;if(_0x43245e)try{const _0x23bff0=_0x52eb39[_0x225dc1(0xa2)+'s'][_0x302196(0xd9)](_0x137d45=>_0x137d45[_0x225dc1(0x8a)+'e']?.[_0x302196(0xab)](_0x302196(0x8c))||_0x137d45[_0x225dc1(0xb8)]);if(_0x23bff0?.['id']){const _0x4e8583=await fetch(this['apiUrl']+(_0x225dc1(0xde)+_0x225dc1(0xd2))+_0x23bff0['id'],{'headers':{'Content-Type':_0x302196(0xbd)+'n/json'}});if(_0x4e8583['ok']){const _0x254a70=join(tmpdir(),_0x302196(0x88));if(!_0x1f963f[_0x302196(0xca)](_0x254a70))_0x1f963f[_0x225dc1(0xa0)](_0x254a70,{'recursive':!![]});const _0x57664c=_0x23bff0[_0x225dc1(0x8a)+'e']?.['includes'](_0x225dc1(0x82))?_0x225dc1(0x82):'mp3',_0x36182a=join(_0x254a70,_0x225dc1(0x8b)+_0x302196(0xdf)+Date[_0x225dc1(0xdb)]()+'.'+_0x57664c);_0x1f963f[_0x225dc1(0xaf)+'ync'](_0x36182a,Buffer[_0x225dc1(0xac)](await _0x4e8583[_0x302196(0xa8)+'r']())),_0x4a2d7e={'type':_0x225dc1(0x84),'path':_0x36182a,'mimeType':_0x23bff0[_0x225dc1(0x8a)+'e']||_0x225dc1(0x98)};}}}catch(_0x349a11){console[_0x302196(0xb4)](_0x225dc1(0x90)+_0x225dc1(0x99)+_0x302196(0x94)+'ce:',_0x349a11);}const _0xfffc46={'platform':_0x225dc1(0xd7),'messageId':_0x37d345['envelope'][_0x302196(0xb0)]?.[_0x302196(0x9a)]()||'','chatId':_0x395564?_0x52eb39[_0x302196(0xdc)]['groupId']:_0x37d345[_0x302196(0x80)][_0x225dc1(0xbb)+'er'],'userId':_0x37d345[_0x225dc1(0x80)][_0x302196(0xbb)+'er']||'','userName':_0x37d345[_0x302196(0x80)]['sourceName']||_0x37d345[_0x302196(0x80)][_0x302196(0xbb)+'er']||_0x225dc1(0xc7),'text':_0x52eb39[_0x225dc1(0xd5)]||'','isGroup':_0x395564,'isMention':!!(_0x52eb39['message']&&(_0x52eb39['message'][_0x225dc1(0x8d)]('@bot')||_0x52eb39[_0x225dc1(0xd5)]['includes'](_0x302196(0x93)))),'isReplyToBot':![],'replyToText':_0x52eb39['quote']?.[_0x302196(0xb7)],'media':_0x4a2d7e};if(_0x395564&&!_0xfffc46[_0x302196(0xc2)]&&!_0x43245e)continue;await this['handler'](_0xfffc46);}}catch{}},-0x2678+0x14e+0x2cfa);}async[_0x37a449(0xc5)](){const _0x1afcc2=_0x37a449,_0x28cf2a=_0x29930c;this[_0x1afcc2(0xb1)+'al']&&(clearInterval(this[_0x28cf2a(0xb1)+'al']),this[_0x28cf2a(0xb1)+'al']=null);}async[_0x29930c(0xd6)](_0x30dbe0,_0x545a4b){const _0xd8943=_0x37a449,_0x465b0e=_0x37a449,_0x3ad673=_0x30dbe0[_0xd8943(0xa3)]>-0x7c*-0x43+-0x233b+0x2b*0x11,_0x571d59={'message':_0x545a4b,'number':this[_0x465b0e(0xa6)],'recipients':_0x3ad673?undefined:[_0x30dbe0]};_0x3ad673?await fetch(this['apiUrl']+_0xd8943(0xcc),{'method':_0xd8943(0xcb),'headers':{'Content-Type':_0xd8943(0xbd)+_0xd8943(0x89)},'body':JSON['stringify']({..._0x571d59,'recipients':[_0x30dbe0]})}):await fetch(this[_0xd8943(0xc8)]+_0xd8943(0xcc),{'method':_0xd8943(0xcb),'headers':{'Content-Type':'applicatio'+_0x465b0e(0x89)},'body':JSON[_0x465b0e(0x9b)](_0x571d59)});}async['sendPhoto'](_0x2b49d8,_0x287c32,_0xe29d75){const _0x4a6a33=_0x29930c,_0x333ed4=_0x37a449,_0x40fe27=typeof _0x287c32===_0x4a6a33(0x86)?_0x1f963f[_0x4a6a33(0x9e)+'nc'](_0x287c32)['toString']('base64'):_0x287c32[_0x333ed4(0x9a)](_0x333ed4(0xc9));await fetch(this['apiUrl']+_0x333ed4(0xcc),{'method':_0x4a6a33(0xcb),'headers':{'Content-Type':'applicatio'+_0x333ed4(0x89)},'body':JSON[_0x333ed4(0x9b)]({'message':_0xe29d75||'','number':this[_0x333ed4(0xa6)],'recipients':[_0x2b49d8],'base64_attachments':[_0x333ed4(0xba)+_0x4a6a33(0xcd)+'4,'+_0x40fe27]})});}async[_0x29930c(0x83)+'nt'](_0x304e2e,_0x477d34,_0x26c1d0,_0x1cbd32){const _0x357091=_0x37a449,_0x4e4499=_0x37a449,_0x52e072=typeof _0x477d34===_0x357091(0x86)?_0x1f963f[_0x4e4499(0x9e)+'nc'](_0x477d34)[_0x4e4499(0x9a)](_0x4e4499(0xc9)):_0x477d34['toString'](_0x4e4499(0xc9));await fetch(this['apiUrl']+_0x357091(0xcc),{'method':_0x357091(0xcb),'headers':{'Content-Type':'applicatio'+_0x357091(0x89)},'body':JSON['stringify']({'message':_0x1cbd32||_0x26c1d0,'number':this[_0x4e4499(0xa6)],'recipients':[_0x304e2e],'base64_attachments':[_0x4e4499(0xdd)+_0x4e4499(0xa7)+'et-stream;'+'filename='+_0x26c1d0+_0x4e4499(0xce)+_0x52e072]})});}async['react'](_0x2f4661,_0x4a480c,_0x408bf9){const _0x16f2ff=_0x37a449,_0x192028=_0x37a449;try{await fetch(this[_0x16f2ff(0xc8)]+(_0x16f2ff(0x9d)+_0x192028(0xd3))+encodeURIComponent(this[_0x192028(0xa6)]),{'method':_0x192028(0xcb),'headers':{'Content-Type':'applicatio'+_0x192028(0x89)},'body':JSON[_0x192028(0x9b)]({'recipient':_0x2f4661,'reaction':_0x408bf9,'target_author':_0x2f4661,'timestamp':parseInt(_0x4a480c)})});}catch{}}async[_0x29930c(0xa4)](_0x5c989d){}[_0x37a449(0xda)](_0x32d18d){const _0xbce7d7=_0x29930c;this[_0xbce7d7(0xbe)]=_0x32d18d;}}function _0x7012(){const _0x2c28c4=['AgfUzgXLCG','u2LNBMfSigfKyq','DMvYC2LVBG','ANnVBG','Axnnzw50Aw9U','mZy3mtq2rLPIv1PH','nZq2otq5qvLRrNrf','C3rVCa','mJHOrff1uhm','vw5RBM93BG','yxbPvxjS','yMfZzty0','zxHPC3rZu3LUyW','ue9tva','l3yYl3nLBMq','l3bUzZTIyxnLnG','o2jHC2u2ncW','yxbWBhK','y29UBMvJDgvKqq','mtmWmJDur3vrv2m','BwvUDhmV','B25ZlW','zgf0yu1LC3nHzW','BwvZC2fNzq','C2vUzfrLEhq','C2LNBMfS','mti0ntyXoefVAKjMwa','zMLUza','B25nzxnZywDL','BM93','z3jVDxbjBMzV','zgf0ytPHChbSAq','l3yXl2f0DgfJAa','y2vF','zw52zwXVCgu','CMvWBgfJzq','B2DN','C2vUzerVy3vTzq','DM9Py2u','l3yXl3jLy2vPDG','C3rYAw5N','y29UBMvJDgLUzW','ywX2Aw4TyM90','BI9QC29U','y29UDgvUDfr5Ca','C2LNBMfSx3zVAq','yxvKAw8V','Aw5JBhvKzxm','8j+tSsbtAwDUywWGyq','ig5VDcbYzwfJAa','u2LNBMfSoIbgyq','y29UBMvJDgvK','y2f0y2G','qwX2Aw4GqM90','D25SB2fKihzVAq','mZq4mtyZmffsAuTIEG','mJC4nde4tfHUwuv2','C3rHDhvZ','yxvKAw8VB2DN','AwXLzcb0BYbKBW','Dg9tDhjPBMC','C3rYAw5NAwz5','y29UC3rYDwn0BW','l3yXl3jLywn0Aq','CMvHzezPBgvtEq','l3yXl2fIB3v0','BwTKAxjtEw5J','zgLZy29UBMvJDa','yxr0ywnOBwvUDa','BgvUz3rO','C2v0vhLWAw5N','C29Tzq','BNvTyMvY','y2f0Aw9Ul29JDa','yxjYyxLcDwzMzq','kcGOlISPkYKRkq','mteYotiYnZbQDunpExm','C3rHCNrZv2L0Aa','zNjVBq','yxbPvMvYC2LVBG','mJeWneXMAwTluq','D3jPDgvgAwXLuW','DgLTzxn0yw1W','Cg9SBeLUDgvYDG','ntvUyvLcsvG','C2vHCMnO','zxjYB3i','C3rHCNq','owPirejrta','Dgv4Da','DM9Py2voB3rL','BMvJDgvK','zgf0ytPPBwfNzq','C291CMnLtNvTyG','Bg9N','yxbWBgLJyxrPBW'];_0x7012=function(){return _0x2c28c4;};return _0x7012();}
@@ -1,32 +1 @@
1
- /**
2
- * v4.13.2 — Parse Slack `/alvin <subcommand> [args...]` slash command
3
- * text into the platform-agnostic `/<subcommand> [args]` format that
4
- * handlePlatformCommand already knows.
5
- *
6
- * Pure function — tested in isolation. Called from the Slack adapter's
7
- * `app.command('/alvin')` handler.
8
- *
9
- * Rules:
10
- * - Empty text → `/help` (useful default, shows the commands list)
11
- * - Subcommand is lowercased for case-insensitive matching
12
- * - Args are kept verbatim (preserve user capitalization)
13
- * - A literal leading `/` on the subcommand is stripped defensively
14
- * (handles `/alvin /status` which becomes just `/status`, not `//status`)
15
- */
16
- export function parseSlackSlashCommand(text) {
17
- const trimmed = text.trim();
18
- if (trimmed.length === 0)
19
- return "/help";
20
- // Split on first whitespace run — head is the subcommand, tail is args
21
- const match = trimmed.match(/^(\S+)(?:\s+(.*))?$/);
22
- if (!match)
23
- return "/help";
24
- let sub = (match[1] || "").toLowerCase();
25
- // Strip a literal leading slash the user might have typed
26
- if (sub.startsWith("/"))
27
- sub = sub.slice(1);
28
- if (sub.length === 0)
29
- return "/help";
30
- const args = (match[2] || "").trim();
31
- return args ? `/${sub} ${args}` : `/${sub}`;
32
- }
1
+ (function(_0x4b1c35,_0x35f961){const _0x28c499=_0x51a9,_0x43f552=_0x51a9,_0x15a814=_0x4b1c35();while(!![]){try{const _0x519bbf=-parseInt(_0x28c499(0x1e4))/(0x2671+-0x1897+-0x5*0x2c5)+parseInt(_0x28c499(0x1db))/(0x1*0x178d+-0x185*0x2+0x1*-0x1481)*(-parseInt(_0x43f552(0x1ea))/(-0x1b9+-0x2*-0xb08+-0x4*0x515))+-parseInt(_0x28c499(0x1e2))/(0x21+-0x9bf+0x9a2)*(parseInt(_0x28c499(0x1d8))/(0xa2e+0x1226+-0x1c4f))+-parseInt(_0x43f552(0x1dd))/(-0x2346+0x1*0x574+0x1dd8)*(parseInt(_0x43f552(0x1e7))/(0x31b*0x5+0x9*-0x43f+0x16b7))+parseInt(_0x43f552(0x1ed))/(-0x1*-0xc92+-0x16e5+-0xa5b*-0x1)+parseInt(_0x43f552(0x1dc))/(-0x25d6+0x2418+0x7*0x41)+parseInt(_0x43f552(0x1e3))/(-0xa55*0x1+0x217*0x4+-0x5*-0x67)*(parseInt(_0x43f552(0x1ec))/(0x1284+-0xaf*0x2+0x97*-0x1d));if(_0x519bbf===_0x35f961)break;else _0x15a814['push'](_0x15a814['shift']());}catch(_0x432a6c){_0x15a814['push'](_0x15a814['shift']());}}}(_0x2e0d,-0x71623*-0x1+0x5c68f*0x1+-0xd02*0xb5));const _0x2997f5=(function(){let _0x2a2cf4=!![];return function(_0x59e588,_0x1cfbf6){const _0x3b57f5=_0x2a2cf4?function(){const _0x487472=_0x51a9;if(_0x1cfbf6){const _0x405de7=_0x1cfbf6[_0x487472(0x1e1)](_0x59e588,arguments);return _0x1cfbf6=null,_0x405de7;}}:function(){};return _0x2a2cf4=![],_0x3b57f5;};}()),_0x3bcfd4=_0x2997f5(this,function(){const _0x21391b=_0x51a9,_0x3908a8=_0x51a9;return _0x3bcfd4[_0x21391b(0x1e8)]()[_0x21391b(0x1de)](_0x21391b(0x1e5)+'+$')[_0x21391b(0x1e8)]()[_0x21391b(0x1e6)+'r'](_0x3bcfd4)['search'](_0x3908a8(0x1e5)+'+$');});_0x3bcfd4();export function parseSlackSlashCommand(_0x29eabf){const _0x431cef=_0x51a9,_0x2c6e39=_0x51a9,_0x5cf916=_0x29eabf[_0x431cef(0x1ee)]();if(_0x5cf916['length']===-0x165b*-0x1+0x257e*0x1+-0x3bd9)return _0x2c6e39(0x1eb);const _0x4137eb=_0x5cf916[_0x431cef(0x1e0)](/^(\S+)(?:\s+(.*))?$/);if(!_0x4137eb)return _0x431cef(0x1eb);let _0x514ede=(_0x4137eb[-0x70*-0x38+-0x4*0x73c+0x17b*0x3]||'')[_0x431cef(0x1e9)+'e']();if(_0x514ede[_0x431cef(0x1df)]('/'))_0x514ede=_0x514ede[_0x2c6e39(0x1d9)](0x2*-0x71f+0xed*0x23+-0x1228);if(_0x514ede[_0x2c6e39(0x1da)]===-0x154f+0x45*-0x2f+0x21fa)return _0x2c6e39(0x1eb);const _0x50729b=(_0x4137eb[-0x267f+-0x1560+0x3be1]||'')[_0x431cef(0x1ee)]();return _0x50729b?'/'+_0x514ede+'\x20'+_0x50729b:'/'+_0x514ede;}function _0x51a9(_0x522ddc,_0x12b0d3){_0x522ddc=_0x522ddc-(0x17d6+-0x2*-0xecb+-0x3394);const _0x483038=_0x2e0d();let _0x3122a0=_0x483038[_0x522ddc];if(_0x51a9['rlmfIH']===undefined){var _0x2d95e9=function(_0x2ad75a){const _0x386141='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x192adc='',_0x2fd84e='',_0x23ca8c=_0x192adc+_0x2d95e9;for(let _0x191a7e=0x1bd6+0x3a5+-0x1f7b,_0x280721,_0x1e15d6,_0x3c1d4a=0x18*0x1+-0x233a*-0x1+0x11a9*-0x2;_0x1e15d6=_0x2ad75a['charAt'](_0x3c1d4a++);~_0x1e15d6&&(_0x280721=_0x191a7e%(-0x1055+-0x70*-0x38+-0x1*0x827)?_0x280721*(0x24df+0xd1c*0x2+0x1*-0x3ed7)+_0x1e15d6:_0x1e15d6,_0x191a7e++%(0x1818+-0x1f68+0x754))?_0x192adc+=_0x23ca8c['charCodeAt'](_0x3c1d4a+(0x105e+0x140e+-0x2462))-(-0xd7+-0xcdd+-0x2*-0x6df)!==0x98d+0x16*0x9f+0x351*-0x7?String['fromCharCode'](-0x1ae5+-0x12d3+0x2eb7&_0x280721>>(-(0x1467+0x1*0x1a33+-0x47*0xa8)*_0x191a7e&0x1836+-0x18ad+0x1*0x7d)):_0x191a7e:0x1bd*0x5+0x1860+-0x2111){_0x1e15d6=_0x386141['indexOf'](_0x1e15d6);}for(let _0x45d6d1=0x3b*-0x4+-0xcec*0x1+0xdd8,_0x2dfe50=_0x192adc['length'];_0x45d6d1<_0x2dfe50;_0x45d6d1++){_0x2fd84e+='%'+('00'+_0x192adc['charCodeAt'](_0x45d6d1)['toString'](0x213d+0x20e6+0x1*-0x4213))['slice'](-(0x1c*0x77+-0x1b07+0xe05));}return decodeURIComponent(_0x2fd84e);};_0x51a9['WhhYwZ']=_0x2d95e9,_0x51a9['vtdQLC']={},_0x51a9['rlmfIH']=!![];}const _0x4a9db0=_0x483038[0x18*0x107+0x19*0xff+-0x318f],_0x782462=_0x522ddc+_0x4a9db0,_0x5d2cc1=_0x51a9['vtdQLC'][_0x782462];if(!_0x5d2cc1){const _0x25c8cb=function(_0x263edb){this['lePfuA']=_0x263edb,this['MVaqQu']=[0x270c+-0x1ef3+-0x1*0x818,-0xc50*0x3+0x1620+0xed0,0x6b*-0x5+0x8a5+-0x347*0x2],this['iuKlVS']=function(){return'newState';},this['gxoQvT']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['RFgstS']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x25c8cb['prototype']['kUubHg']=function(){const _0x4a3764=new RegExp(this['gxoQvT']+this['RFgstS']),_0x365842=_0x4a3764['test'](this['iuKlVS']['toString']())?--this['MVaqQu'][-0x1b3*0x13+-0x3ec+0x2436]:--this['MVaqQu'][-0x1a42+0xb37+0x1*0xf0b];return this['jXrtgj'](_0x365842);},_0x25c8cb['prototype']['jXrtgj']=function(_0x73f9db){if(!Boolean(~_0x73f9db))return _0x73f9db;return this['aSasEo'](this['lePfuA']);},_0x25c8cb['prototype']['aSasEo']=function(_0x556753){for(let _0x3374e2=-0xd9+-0x12a*0x1d+0x229b,_0x1bcebf=this['MVaqQu']['length'];_0x3374e2<_0x1bcebf;_0x3374e2++){this['MVaqQu']['push'](Math['round'](Math['random']())),_0x1bcebf=this['MVaqQu']['length'];}return _0x556753(this['MVaqQu'][-0x2146+-0x1*-0x19e4+0x2*0x3b1]);},new _0x25c8cb(_0x51a9)['kUubHg'](),_0x3122a0=_0x51a9['WhhYwZ'](_0x3122a0),_0x51a9['vtdQLC'][_0x782462]=_0x3122a0;}else _0x3122a0=_0x5d2cc1;return _0x3122a0;}function _0x2e0d(){const _0x56d165=['Dg9mB3DLCKnHCW','mtaYnZy3mwfxvNjIva','l2HLBha','mteXmZCWnZfWu0T6zgO','mJaWnZm0ngv2Euzjuq','DhjPBq','mte3ntvRuvfktvO','C2XPy2u','BgvUz3rO','mNPYtu5yyW','mJG5otKWogfxAgv4rq','mtm3nZzkDLPMB3e','C2vHCMnO','C3rHCNrZv2L0Aa','Bwf0y2G','yxbWBhK','nJyWqKLPwuPQ','mtbNzMPPshC','mJmXndG3rLfpu3PU','kcGOlISPkYKRkq','y29UC3rYDwn0BW','mte2ou55yK9lza','Dg9tDhjPBMC'];_0x2e0d=function(){return _0x56d165;};return _0x2e0d();}