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.
- package/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -130
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -443
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -0
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1831
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
package/dist/platforms/signal.js
CHANGED
|
@@ -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;}
|