alvin-bot 5.6.2 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -130
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -443
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -0
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,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;}