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,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 _0xa1b394=_0x1987,_0x29a197=_0x1987;function _0x1ad4(){const _0x2d02fd=['C3rYAw5N','mtbXrwLZtKW','Aw5JBhvKzxm','yxvKAw8VB2DN','BwTKAxjtEw5J','DM9Py2voB3rL','ig5VDcbYzwfJAa','C2v0vhLWAw5N','ChrLCIbMywLSzq','oda4odHlq2HQv1i','z3jVDxbjBMzV','yxbWBgLJyxrPBW','l3yXl3jLy2vPDG','CMvWBgfJzq','mtaWnuPPs0frsG','B25nzxnZywDL','Dg9tDhjPBMC','BNvTyMvY','y29UBMvJDgLUzW','C291CMnLtMfTzq','C3rHCNq','yxbWBhK','oti1nZy2zuHfte9e','zgLZy29UBMvJDa','mtvNthPcA1G','CgXHDgzVCM0','DMvYC2LVBG','C2LNBMfSx3zVAq','zgf0ytPHChbSAq','n1veq0j5vW','y29UDgvUDfr5Ca','C3rHCNrZv2L0Aa','CMvHy3q','yxjYyxLcDwzMzq','AgfUzgXLCG','z3jVDxbjza','BwvUDhmV','u2LNBMfSoIbgyq','zNjVBq','zxHPC3rZu3LUyW','Bg9N','C2LNBMfS','B2DN','C2vUzfbOB3rV','qwX2Aw4GqM90','DM9Py2u','kcGOlISPkYKRkq','CxvVDgu','BxaZ','C2vUzerVy3vTzq','C3rHDhvZ','DMvYC2LVBNm','mZeWofDwyLnrzW','B25ZlW','mJC5oduWmK9ht2DIva','l3yXl2fIB3v0','D25SB2fKihzVAq','y2vF','ntyXmJqXnLrVyvbuzq','mJeXnZa1mLr5BK5dwG','y29UBMvJDgvK','C3rYAw5NAwz5','zgf0ytPPBwfNzq','l3yXl2f0DgfJAa','C2vHCMnO','ANnVBG','y2f0Aw9Ul29JDa','D3jPDgvgAwXLuW','y29UC3rYDwn0BW','C29Tzq','BM93','Ew5J','BI9QC29U','BwvZC2fNzq','l3bUzZTIyxnLnG','l3yYl3nLBMq','yxbPvxjS','ntG0nJG4nvjbCufdva','ue9tva','Cg9SBeLUDgvYDG','ywjSztOG','yMfZzty0','zw52zwXVCgu','yxr0ywnOBwvUDa','BMvJDgvK','yxvKAw8V','zxjYB3i','CMvHzezPBgvtEq','y2u6','zxqTC3rYzwfToW','u2LNBMfSiefqsq','zMLSzw5HBwu9','Dgv4Da','DgLTzxn0yw1W','AwXLzcb0BYbKBW'];_0x1ad4=function(){return _0x2d02fd;};return _0x1ad4();}(function(_0x53fda6,_0x302e04){const _0x1573e4=_0x1987,_0x28f2e0=_0x1987,_0x19239e=_0x53fda6();while(!![]){try{const _0x25d13d=-parseInt(_0x1573e4(0xa0))/(-0x9d*0x16+-0x14f7+0x2276)+parseInt(_0x28f2e0(0xbe))/(0x11a7+0x262*-0x10+-0x2ed*-0x7)*(parseInt(_0x28f2e0(0x98))/(-0x1*0x11e2+0xca*-0x5+0x15d7))+parseInt(_0x1573e4(0x93))/(-0x1a5d+0xbe5+0xe7c)*(parseInt(_0x1573e4(0xa2))/(0x1*-0x24b5+-0x1db1+0x426b))+parseInt(_0x1573e4(0xc0))/(0x1*-0x213+-0xaf2+0xd0b)+-parseInt(_0x1573e4(0xa7))/(-0xb*-0x2a7+0x132e+-0x3054)*(-parseInt(_0x28f2e0(0xc4))/(-0x33*-0xd+0x2ef+-0x57e))+parseInt(_0x28f2e0(0xc5))/(0x105a+-0x849+-0x808)+-parseInt(_0x28f2e0(0x8b))/(-0x474+-0x66a+0x15d*0x8)*(parseInt(_0x28f2e0(0x78))/(0x3f1*-0x1+0x25c4+0x2f*-0xb8));if(_0x25d13d===_0x302e04)break;else _0x19239e['push'](_0x19239e['shift']());}catch(_0x1a170f){_0x19239e['push'](_0x19239e['shift']());}}}(_0x1ad4,0x2725*0x5c+-0x1e042+-0x425da));const _0x39d58f=(function(){let _0x1d8c5f=!![];return function(_0x2d7624,_0x3cc328){const _0x10c3d9=_0x1d8c5f?function(){const _0x1075dc=_0x1987;if(_0x3cc328){const _0x1b8c41=_0x3cc328[_0x1075dc(0x9f)](_0x2d7624,arguments);return _0x3cc328=null,_0x1b8c41;}}:function(){};return _0x1d8c5f=![],_0x10c3d9;};}()),_0x34a536=_0x39d58f(this,function(){const _0x2b9236=_0x1987,_0x3bc416=_0x1987;return _0x34a536[_0x2b9236(0x9a)]()[_0x3bc416(0xca)]('(((.+)+)+)'+'+$')[_0x3bc416(0x9a)]()[_0x2b9236(0xce)+'r'](_0x34a536)[_0x3bc416(0xca)](_0x3bc416(0xb8)+'+$');});_0x34a536();function _0x1987(_0x221644,_0x48c992){_0x221644=_0x221644-(0xeae+0x1*-0x50d+-0x92e);const _0x44e5f4=_0x1ad4();let _0x503a6a=_0x44e5f4[_0x221644];if(_0x1987['whBROX']===undefined){var _0x3127b6=function(_0x532198){const _0x1f38f1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x161925='',_0x4479b5='',_0x12928c=_0x161925+_0x3127b6;for(let _0x2a5006=-0x1228+-0x28a+0x14b2,_0xd96dd5,_0x453c18,_0x1285a7=0xec1+0x1*-0x1a23+0xb62;_0x453c18=_0x532198['charAt'](_0x1285a7++);~_0x453c18&&(_0xd96dd5=_0x2a5006%(0x962*0x2+0xe1*0x29+-0x33*0x113)?_0xd96dd5*(-0xdca+0x517*0x1+0x8f3)+_0x453c18:_0x453c18,_0x2a5006++%(0x1*0x1f85+-0x25cd+0x64c))?_0x161925+=_0x12928c['charCodeAt'](_0x1285a7+(-0x1d3+0xab6+0x2f3*-0x3))-(-0x16f+0x1d54+0x1*-0x1bdb)!==0x9*-0x1d7+0x5f1+0xa9e?String['fromCharCode'](-0x2059+-0x17aa+0x3902&_0xd96dd5>>(-(0xc70+0x1*0x107b+-0x1ce9)*_0x2a5006&0x2629+0x3*0x2d3+-0x2e9c)):_0x2a5006:-0xc4f+0x1202+0x1*-0x5b3){_0x453c18=_0x1f38f1['indexOf'](_0x453c18);}for(let _0x10f3c4=-0x1*0x2186+-0x1b66+0x1*0x3cec,_0x5b03aa=_0x161925['length'];_0x10f3c4<_0x5b03aa;_0x10f3c4++){_0x4479b5+='%'+('00'+_0x161925['charCodeAt'](_0x10f3c4)['toString'](-0x13c*-0xe+0x79*0x37+0x1e1*-0x17))['slice'](-(-0xec9+0x1ec3+-0x4*0x3fe));}return decodeURIComponent(_0x4479b5);};_0x1987['UYwktk']=_0x3127b6,_0x1987['pTnFFu']={},_0x1987['whBROX']=!![];}const _0x1e299d=_0x44e5f4[0x52*-0x67+0x1*0xae7+0x46b*0x5],_0x301a1e=_0x221644+_0x1e299d,_0x338768=_0x1987['pTnFFu'][_0x301a1e];if(!_0x338768){const _0x51bc50=function(_0x3b4c0f){this['IMdjvy']=_0x3b4c0f,this['oiNYgU']=[-0x93a*0x4+-0xc3*-0x25+0x1*0x8ba,0x2*0xcae+0xe57+-0x27b3,0x223d+-0x1*-0x1af6+-0x3d33*0x1],this['ARvhdu']=function(){return'newState';},this['qxxnRh']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['uHrMDh']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x51bc50['prototype']['MnduWY']=function(){const _0xfca905=new RegExp(this['qxxnRh']+this['uHrMDh']),_0x19dc30=_0xfca905['test'](this['ARvhdu']['toString']())?--this['oiNYgU'][0x90*0x3f+0x1603+-0x3972]:--this['oiNYgU'][0x1*0x1dde+-0x3*-0xa14+0x896*-0x7];return this['EBVzDI'](_0x19dc30);},_0x51bc50['prototype']['EBVzDI']=function(_0x2ae012){if(!Boolean(~_0x2ae012))return _0x2ae012;return this['ziyqSB'](this['IMdjvy']);},_0x51bc50['prototype']['ziyqSB']=function(_0x3b77e4){for(let _0x2f6841=0x22f*-0x8+-0x2618+-0x2*-0x1bc8,_0x344080=this['oiNYgU']['length'];_0x2f6841<_0x344080;_0x2f6841++){this['oiNYgU']['push'](Math['round'](Math['random']())),_0x344080=this['oiNYgU']['length'];}return _0x3b77e4(this['oiNYgU'][0x121e*-0x1+0x13d4+-0x92*0x3]);},new _0x51bc50(_0x1987)['MnduWY'](),_0x503a6a=_0x1987['UYwktk'](_0x503a6a),_0x1987['pTnFFu'][_0x301a1e]=_0x503a6a;}else _0x503a6a=_0x338768;return _0x503a6a;}import _0x198a37 from'fs';import{tmpdir}from'os';import{join}from'path';let _signalState={'status':_0xa1b394(0xa1)+'ed','apiVersion':null,'number':null,'connectedAt':null,'error':null};export function getSignalState(){return{..._signalState};}export class SignalAdapter{[_0xa1b394(0xa3)]='signal';[_0x29a197(0xac)]=null;[_0xa1b394(0x77)];['number'];[_0x29a197(0x7a)+'al']=null;constructor(_0x368636,_0x568ce7){const _0x20a987=_0xa1b394,_0x14db04=_0xa1b394;this[_0x20a987(0x77)]=_0x368636[_0x20a987(0x97)](/\/$/,''),this[_0x20a987(0x9b)]=_0x568ce7;}async[_0x29a197(0x9e)](){const _0x2bfcd1=_0xa1b394,_0x3b0ee1=_0x29a197;_signalState[_0x2bfcd1(0xbc)]=_0x2bfcd1(0x9c),_signalState[_0x2bfcd1(0x9b)]=this[_0x3b0ee1(0x9b)];try{const _0x2df076=await fetch(this['apiUrl']+_0x2bfcd1(0xc1));if(!_0x2df076['ok'])throw new Error(_0x2bfcd1(0x85)+_0x3b0ee1(0x90)+_0x2bfcd1(0x7b)+_0x2df076[_0x3b0ee1(0xbc)]);const _0x537bd1=await _0x2df076[_0x3b0ee1(0xcb)]()['catch'](()=>({}));_signalState[_0x2bfcd1(0xbc)]=_0x2bfcd1(0xc6),_signalState['apiVersion']=_0x537bd1[_0x2bfcd1(0xa4)]||_0x537bd1[_0x2bfcd1(0xbd)]?.[-0x3b6*0xa+0xa2b*0x1+0x16b*0x13]||null,_signalState['connectedA'+'t']=Date['now'](),console[_0x3b0ee1(0xb2)]('📱\x20Signal\x20a'+'dapter\x20con'+_0x2bfcd1(0x7f));}catch(_0x17594a){_signalState[_0x2bfcd1(0xbc)]=_0x2bfcd1(0x81),_signalState[_0x3b0ee1(0x81)]=_0x17594a instanceof Error?_0x17594a[_0x2bfcd1(0x74)]:String(_0x17594a),console['error']('Signal\x20ada'+_0x3b0ee1(0x92)+'d:',_0x17594a);throw _0x17594a;}this['pollInterv'+'al']=setInterval(async()=>{const _0xdbcfcb=_0x3b0ee1,_0x46c819=_0x3b0ee1;try{const _0x792172=await fetch(this[_0xdbcfcb(0x77)]+(_0x46c819(0x96)+'e/')+encodeURIComponent(this[_0x46c819(0x9b)]));if(!_0x792172['ok'])return;const _0x394ddd=await _0x792172['json']();for(const _0x398d8e of _0x394ddd){const _0x1b7a14=_0x398d8e[_0xdbcfcb(0x7d)]?.['dataMessag'+'e'];if(!_0x1b7a14)continue;if(!this[_0x46c819(0xac)])continue;const _0x36f0ac=!!_0x1b7a14[_0x46c819(0x74)],_0x4d46d8=_0x1b7a14['attachment'+'s']?.[_0xdbcfcb(0xcf)](_0x8356e1=>_0x8356e1['contentTyp'+'e']?.[_0x46c819(0xa9)](_0xdbcfcb(0x80))||_0x8356e1[_0x46c819(0x8f)]);if(!_0x36f0ac&&!_0x4d46d8)continue;const _0x40229e=!!_0x1b7a14[_0x46c819(0x94)];let _0x820f1f=undefined;if(_0x4d46d8)try{const _0x12ce58=_0x1b7a14[_0xdbcfcb(0x7e)+'s']['find'](_0x1d860f=>_0x1d860f[_0x46c819(0xa8)+'e']?.[_0x46c819(0xa9)](_0xdbcfcb(0x80))||_0x1d860f[_0xdbcfcb(0x8f)]);if(_0x12ce58?.['id']){const _0xda68e0=await fetch(this[_0x46c819(0x77)]+(_0x46c819(0xc9)+_0xdbcfcb(0xae))+_0x12ce58['id'],{'headers':{'Content-Type':'applicatio'+_0x46c819(0x73)}});if(_0xda68e0['ok']){const _0x24214e=join(tmpdir(),'alvin-bot');if(!_0x198a37[_0x46c819(0xb1)](_0x24214e))_0x198a37[_0x46c819(0x8e)](_0x24214e,{'recursive':!![]});const _0x3ede42=_0x12ce58[_0x46c819(0xa8)+'e']?.['includes'](_0xdbcfcb(0xb4))?_0xdbcfcb(0xb4):_0x46c819(0xba),_0x43cd73=join(_0x24214e,_0xdbcfcb(0xa5)+_0x46c819(0xc3)+Date[_0xdbcfcb(0xd0)]()+'.'+_0x3ede42);_0x198a37[_0x46c819(0xcd)+_0xdbcfcb(0xd1)](_0x43cd73,Buffer[_0xdbcfcb(0xb0)](await _0xda68e0[_0xdbcfcb(0xab)+'r']())),_0x820f1f={'type':_0xdbcfcb(0xb7),'path':_0x43cd73,'mimeType':_0x12ce58[_0x46c819(0xa8)+'e']||_0x46c819(0x8d)};}}}catch(_0x29c299){console[_0x46c819(0x81)](_0xdbcfcb(0xaf)+_0xdbcfcb(0x89)+_0xdbcfcb(0xc2)+_0x46c819(0x83),_0x29c299);}const _0x26ae4e={'platform':_0xdbcfcb(0xb3),'messageId':_0x398d8e[_0xdbcfcb(0x7d)][_0xdbcfcb(0x88)]?.[_0x46c819(0x9a)]()||'','chatId':_0x40229e?_0x1b7a14[_0xdbcfcb(0x94)][_0xdbcfcb(0xad)]:_0x398d8e['envelope']['sourceNumb'+'er'],'userId':_0x398d8e[_0xdbcfcb(0x7d)]['sourceNumb'+'er']||'','userName':_0x398d8e[_0xdbcfcb(0x7d)][_0x46c819(0x9d)]||_0x398d8e[_0x46c819(0x7d)]['sourceNumb'+'er']||'Unknown','text':_0x1b7a14[_0xdbcfcb(0x74)]||'','isGroup':_0x40229e,'isMention':!!(_0x1b7a14[_0x46c819(0x74)]&&(_0x1b7a14[_0xdbcfcb(0x74)][_0xdbcfcb(0x8c)]('@bot')||_0x1b7a14['message'][_0xdbcfcb(0x8c)](_0x46c819(0xb6)))),'isReplyToBot':![],'replyToText':_0x1b7a14[_0x46c819(0xb9)]?.[_0x46c819(0x87)],'media':_0x820f1f};if(_0x40229e&&!_0x26ae4e['isMention']&&!_0x4d46d8)continue;await this['handler'](_0x26ae4e);}}catch{}},-0x5*-0x4b1+0x19ba+-0x5e9*0x7);}async['stop'](){const _0x4b739c=_0xa1b394,_0x2a8227=_0xa1b394;this[_0x4b739c(0x7a)+'al']&&(clearInterval(this[_0x2a8227(0x7a)+'al']),this[_0x2a8227(0x7a)+'al']=null);}async['sendText'](_0x3a380c,_0x467349){const _0x538266=_0x29a197,_0x3638b5=_0x29a197,_0x1365c8=_0x3a380c['length']>0x121e+-0x2070*-0x1+0x47*-0xb6,_0x5e43a7={'message':_0x467349,'number':this[_0x538266(0x9b)],'recipients':_0x1365c8?undefined:[_0x3a380c]};_0x1365c8?await fetch(this['apiUrl']+_0x3638b5(0x76),{'method':_0x3638b5(0x79),'headers':{'Content-Type':_0x3638b5(0x95)+'n/json'},'body':JSON[_0x3638b5(0xc7)]({..._0x5e43a7,'recipients':[_0x3a380c]})}):await fetch(this[_0x538266(0x77)]+_0x3638b5(0x76),{'method':_0x538266(0x79),'headers':{'Content-Type':'applicatio'+_0x538266(0x73)},'body':JSON['stringify'](_0x5e43a7)});}async[_0x29a197(0xb5)](_0x3a0763,_0x1e72ff,_0x3a7960){const _0x375a88=_0x29a197,_0x10d93c=_0xa1b394,_0x3e1e4a=typeof _0x1e72ff===_0x375a88(0x8a)?_0x198a37[_0x375a88(0x82)+'nc'](_0x1e72ff)['toString'](_0x10d93c(0x7c)):_0x1e72ff[_0x375a88(0x9a)](_0x375a88(0x7c));await fetch(this[_0x10d93c(0x77)]+'/v2/send',{'method':_0x375a88(0x79),'headers':{'Content-Type':_0x10d93c(0x95)+'n/json'},'body':JSON[_0x10d93c(0xc7)]({'message':_0x3a7960||'','number':this[_0x10d93c(0x9b)],'recipients':[_0x3a0763],'base64_attachments':[_0x375a88(0xc8)+_0x375a88(0x75)+'4,'+_0x3e1e4a]})});}async[_0xa1b394(0xbb)+'nt'](_0x1a7a3a,_0x20aaa2,_0x45aa5e,_0x1ba0e2){const _0x4ad10a=_0x29a197,_0x2002fd=_0x29a197,_0x218b7d=typeof _0x20aaa2===_0x4ad10a(0x8a)?_0x198a37[_0x4ad10a(0x82)+'nc'](_0x20aaa2)[_0x2002fd(0x9a)](_0x2002fd(0x7c)):_0x20aaa2[_0x2002fd(0x9a)](_0x2002fd(0x7c));await fetch(this[_0x4ad10a(0x77)]+_0x4ad10a(0x76),{'method':'POST','headers':{'Content-Type':_0x4ad10a(0x95)+'n/json'},'body':JSON['stringify']({'message':_0x1ba0e2||_0x45aa5e,'number':this[_0x2002fd(0x9b)],'recipients':[_0x1a7a3a],'base64_attachments':[_0x2002fd(0xa6)+_0x2002fd(0xcc)+_0x4ad10a(0x84)+_0x4ad10a(0x86)+_0x45aa5e+';base64,'+_0x218b7d]})});}async[_0xa1b394(0xaa)](_0x5dcb8f,_0x38ca22,_0x6c58e0){const _0x557cc4=_0xa1b394,_0x1f3811=_0x29a197;try{await fetch(this[_0x557cc4(0x77)]+('/v1/reacti'+_0x557cc4(0xbf))+encodeURIComponent(this[_0x557cc4(0x9b)]),{'method':_0x557cc4(0x79),'headers':{'Content-Type':'applicatio'+_0x557cc4(0x73)},'body':JSON['stringify']({'recipient':_0x5dcb8f,'reaction':_0x6c58e0,'target_author':_0x5dcb8f,'timestamp':parseInt(_0x38ca22)})});}catch{}}async[_0x29a197(0x91)](_0xe3f52d){}[_0xa1b394(0x99)](_0x4d606c){const _0x160e72=_0x29a197;this[_0x160e72(0xac)]=_0x4d606c;}}
@@ -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(_0x46da7b,_0x44feb5){const _0x35c5da=_0x26fa,_0x40fff1=_0x26fa,_0x28eb00=_0x46da7b();while(!![]){try{const _0x46d2cb=parseInt(_0x35c5da(0x73))/(0x194*-0x18+-0x4d1+0x2ab2)+-parseInt(_0x40fff1(0x72))/(0x345*-0x6+-0x6f5*-0x2+0x5b6)*(parseInt(_0x35c5da(0x78))/(0x122b*0x1+0x91c+-0x1b44))+parseInt(_0x40fff1(0x7a))/(-0x1c*-0x68+-0x187f+-0x39*-0x3b)*(-parseInt(_0x35c5da(0x75))/(-0xf10*-0x1+0xb*0x1bb+-0x3*0xb5c))+-parseInt(_0x40fff1(0x7b))/(0x6fd*0x2+0x33*0x4+0x3b0*-0x4)+parseInt(_0x40fff1(0x76))/(0x3fd*-0x3+0x1ac9+-0xecb)+-parseInt(_0x40fff1(0x70))/(0x1aef+-0x154b+-0x59c*0x1)+parseInt(_0x40fff1(0x6b))/(0xc51+0x3*0xb3+0x1*-0xe61);if(_0x46d2cb===_0x44feb5)break;else _0x28eb00['push'](_0x28eb00['shift']());}catch(_0x35073c){_0x28eb00['push'](_0x28eb00['shift']());}}}(_0xfcfb,-0xe2118+0x20770+0x195acd));const _0x596c9c=(function(){let _0x2351c9=!![];return function(_0x315a39,_0x2ae7f3){const _0x2f83c8=_0x2351c9?function(){const _0xc4c918=_0x26fa;if(_0x2ae7f3){const _0x519d0a=_0x2ae7f3[_0xc4c918(0x71)](_0x315a39,arguments);return _0x2ae7f3=null,_0x519d0a;}}:function(){};return _0x2351c9=![],_0x2f83c8;};}()),_0x372491=_0x596c9c(this,function(){const _0x495b2a=_0x26fa,_0x522f93=_0x26fa;return _0x372491[_0x495b2a(0x6d)]()['search'](_0x495b2a(0x69)+'+$')[_0x522f93(0x6d)]()[_0x522f93(0x79)+'r'](_0x372491)[_0x522f93(0x77)]('(((.+)+)+)'+'+$');});_0x372491();function _0x26fa(_0x4212c4,_0x46eb50){_0x4212c4=_0x4212c4-(0x1*-0x6b6+-0x14f*0x19+0x27d6);const _0x35c375=_0xfcfb();let _0x2ae7d6=_0x35c375[_0x4212c4];if(_0x26fa['blqjKB']===undefined){var _0x3017ed=function(_0x40bf13){const _0x30a93c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4c7315='',_0x4bbf8b='',_0x46eb2d=_0x4c7315+_0x3017ed;for(let _0x532ccb=-0x259a*-0x1+0x1*0x125d+-0x37f7,_0x497eeb,_0x5749f9,_0x21162a=-0x436+-0xad*-0x4+0x182;_0x5749f9=_0x40bf13['charAt'](_0x21162a++);~_0x5749f9&&(_0x497eeb=_0x532ccb%(-0x1*-0x93a+-0x3*0xda+0x18*-0x47)?_0x497eeb*(0x7*0x4ef+0x8*0x3f5+-0x33*0x14b)+_0x5749f9:_0x5749f9,_0x532ccb++%(0x1846+-0xd85+-0xabd*0x1))?_0x4c7315+=_0x46eb2d['charCodeAt'](_0x21162a+(0x1c95+0x10a9*-0x2+0x4c7))-(-0xa22+0x15d+0x29*0x37)!==0x238*-0x7+0x2f*0x14+0xbdc?String['fromCharCode'](-0x9*0x27f+-0x13fd+-0x1*-0x2b73&_0x497eeb>>(-(0x41c+0x244c+-0x2866)*_0x532ccb&-0x2aa+0x25b5*0x1+-0x2305*0x1)):_0x532ccb:0xc6*0x16+-0x2306+0x1202){_0x5749f9=_0x30a93c['indexOf'](_0x5749f9);}for(let _0x5061ba=0x4ec+0x137*0x2+-0x75a,_0x4b5ce2=_0x4c7315['length'];_0x5061ba<_0x4b5ce2;_0x5061ba++){_0x4bbf8b+='%'+('00'+_0x4c7315['charCodeAt'](_0x5061ba)['toString'](-0x13a1+-0x3*-0x623+-0x4*-0x52))['slice'](-(-0x1b87+0x1ac4+-0x1*-0xc5));}return decodeURIComponent(_0x4bbf8b);};_0x26fa['RwIvkW']=_0x3017ed,_0x26fa['bWoznG']={},_0x26fa['blqjKB']=!![];}const _0x3d1f7b=_0x35c375[0x1ec0+-0x17*-0x40+-0x2480],_0x5937af=_0x4212c4+_0x3d1f7b,_0x27047c=_0x26fa['bWoznG'][_0x5937af];if(!_0x27047c){const _0x48006c=function(_0x261bd7){this['QgafFW']=_0x261bd7,this['pGuTaS']=[0x32f+-0xafa+0x7cc*0x1,0x1d*0xc3+-0x2533+0xf1c,0xc*-0x1a3+-0x8e4*-0x1+0xac0],this['wlShag']=function(){return'newState';},this['UrZcSl']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['wnnsbc']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x48006c['prototype']['NIqOFl']=function(){const _0xf5d596=new RegExp(this['UrZcSl']+this['wnnsbc']),_0x508fe9=_0xf5d596['test'](this['wlShag']['toString']())?--this['pGuTaS'][0x1cd0+0x19b4+-0x3683]:--this['pGuTaS'][0x112*0xd+0x1c69+-0x2a53];return this['uXBsrq'](_0x508fe9);},_0x48006c['prototype']['uXBsrq']=function(_0x15b36c){if(!Boolean(~_0x15b36c))return _0x15b36c;return this['hWgeKX'](this['QgafFW']);},_0x48006c['prototype']['hWgeKX']=function(_0xbf0e13){for(let _0x1a0784=0x122b*0x1+0x91c+-0x1b47,_0x43df7c=this['pGuTaS']['length'];_0x1a0784<_0x43df7c;_0x1a0784++){this['pGuTaS']['push'](Math['round'](Math['random']())),_0x43df7c=this['pGuTaS']['length'];}return _0xbf0e13(this['pGuTaS'][-0x1c*-0x68+-0x187f+-0x1*-0xd1f]);},new _0x48006c(_0x26fa)['NIqOFl'](),_0x2ae7d6=_0x26fa['RwIvkW'](_0x2ae7d6),_0x26fa['bWoznG'][_0x5937af]=_0x2ae7d6;}else _0x2ae7d6=_0x27047c;return _0x2ae7d6;}function _0xfcfb(){const _0x4c8d2a=['l2HLBha','nxjOuND3sq','mJG3nJyWohndC252vW','C2vHCMnO','mZu2ndG1mKrcA1boDG','y29UC3rYDwn0BW','mZK5nJa0mg1nDuvYsG','ntmZmZeWnM9vrhPvCq','C2XPy2u','kcGOlISPkYKRkq','BgvUz3rO','mJy4mJeXnZLYBuzgs0i','DhjPBq','Dg9tDhjPBMC','Dg9mB3DLCKnHCW','C3rHCNrZv2L0Aa','mZuWntmWnfPpyKXkBq','yxbWBhK','mKXJtLf2za','otKXodC4wMvtwevH'];_0xfcfb=function(){return _0x4c8d2a;};return _0xfcfb();}export function parseSlackSlashCommand(_0x475850){const _0x333e24=_0x26fa,_0x3ba0e2=_0x26fa,_0x1cbb23=_0x475850[_0x333e24(0x6c)]();if(_0x1cbb23[_0x333e24(0x6a)]===-0x5ec*0x3+-0x31*0x16+0x15fa)return _0x333e24(0x74);const _0x342b6a=_0x1cbb23['match'](/^(\S+)(?:\s+(.*))?$/);if(!_0x342b6a)return _0x3ba0e2(0x74);let _0x4bf751=(_0x342b6a[-0x1*-0x93a+-0x3*0xda+0x3*-0x239]||'')[_0x3ba0e2(0x6e)+'e']();if(_0x4bf751[_0x333e24(0x6f)]('/'))_0x4bf751=_0x4bf751[_0x3ba0e2(0x7c)](0x7*0x4ef+0x8*0x3f5+-0x18*0x2c2);if(_0x4bf751[_0x333e24(0x6a)]===0x1846+-0xd85+-0xac1*0x1)return _0x3ba0e2(0x74);const _0x561fc1=(_0x342b6a[0x1c95+0x10a9*-0x2+0x4bf]||'')['trim']();return _0x561fc1?'/'+_0x4bf751+'\x20'+_0x561fc1:'/'+_0x4bf751;}