alvin-bot 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -31
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -174
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -583
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -86
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1902
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,604 +1 @@
1
- /**
2
- * Doctor & Backup API — Self-healing, diagnostics, and backup/restore.
3
- *
4
- * Features:
5
- * - Health check (diagnose config issues)
6
- * - Auto-repair (fix common problems)
7
- * - Backup (snapshot all config files)
8
- * - Restore from backup
9
- * - Bot restart
10
- */
11
- import fs from "fs";
12
- import { resolve, dirname } from "path";
13
- import { execSync } from "child_process";
14
- import { BOT_ROOT, ENV_FILE, BACKUP_DIR, DATA_DIR, MEMORY_DIR, MEMORY_FILE, SOUL_FILE, SOUL_EXAMPLE, TOOLS_MD, TOOLS_JSON, CUSTOM_MODELS, CRON_FILE, MCP_CONFIG } from "../paths.js";
15
- import { writeSecure } from "../services/file-permissions.js";
16
- // Files to include in backups (absolute paths)
17
- const BACKUP_FILES = [
18
- { src: ENV_FILE, label: ".env" },
19
- { src: SOUL_FILE, label: "soul.md" },
20
- { src: resolve(BOT_ROOT, "CLAUDE.md"), label: "CLAUDE.md" },
21
- { src: TOOLS_MD, label: "tools.md" },
22
- { src: CUSTOM_MODELS, label: "custom-models.json" },
23
- { src: CRON_FILE, label: "cron-jobs.json" },
24
- { src: MCP_CONFIG, label: "mcp.json" },
25
- { src: MEMORY_FILE, label: "MEMORY.md" },
26
- ];
27
- function runHealthCheck() {
28
- const issues = [];
29
- // 1. Check .env exists
30
- if (!fs.existsSync(ENV_FILE)) {
31
- issues.push({
32
- severity: "error",
33
- category: "Config",
34
- message: ".env file missing",
35
- fix: "Create a default .env from .env.example",
36
- fixAction: "create-env",
37
- });
38
- }
39
- else {
40
- // Parse .env
41
- const envContent = fs.readFileSync(ENV_FILE, "utf-8");
42
- // Check BOT_TOKEN
43
- if (!envContent.includes("BOT_TOKEN=") || envContent.match(/BOT_TOKEN=\s*$/m)) {
44
- issues.push({
45
- severity: "error",
46
- category: "Telegram",
47
- message: "BOT_TOKEN not set — Telegram bot cannot start",
48
- });
49
- }
50
- // Check ALLOWED_USERS
51
- if (!envContent.includes("ALLOWED_USERS=") || envContent.match(/ALLOWED_USERS=\s*$/m)) {
52
- issues.push({
53
- severity: "warning",
54
- category: "Security",
55
- message: "ALLOWED_USERS not set — anyone can use the bot",
56
- });
57
- }
58
- // Check for syntax errors in .env
59
- const lines = envContent.split("\n");
60
- for (let i = 0; i < lines.length; i++) {
61
- const line = lines[i].trim();
62
- if (!line || line.startsWith("#"))
63
- continue;
64
- if (!line.includes("=")) {
65
- issues.push({
66
- severity: "error",
67
- category: "Config",
68
- message: `.env line ${i + 1}: Invalid format "${line.slice(0, 40)}..."`,
69
- fix: `Remove or fix the line`,
70
- fixAction: `fix-env-line:${i}`,
71
- });
72
- }
73
- }
74
- // Check for common issues
75
- if (envContent.includes('""') || envContent.match(/="?\s*$/m)) {
76
- issues.push({
77
- severity: "warning",
78
- category: "Config",
79
- message: "Empty values found in .env — some features may not work",
80
- });
81
- }
82
- }
83
- // 2. Check data directory
84
- if (!fs.existsSync(DATA_DIR)) {
85
- issues.push({
86
- severity: "error",
87
- category: "Files",
88
- message: "Data directory missing (~/.alvin-bot/)",
89
- fix: "Create data directory",
90
- fixAction: "create-docs",
91
- });
92
- }
93
- // 3. Check TOOLS.md validity (legacy tools.json as fallback)
94
- if (fs.existsSync(TOOLS_MD)) {
95
- // Validate TOOLS.md has at least one ## heading (tool definition)
96
- const content = fs.readFileSync(TOOLS_MD, "utf-8");
97
- if (!content.includes("## ")) {
98
- issues.push({
99
- severity: "warning",
100
- category: "Tools",
101
- message: "TOOLS.md contains no tool definitions (## headings missing)",
102
- fix: "Recreate TOOLS.md from TOOLS.example.md",
103
- fixAction: "fix-tools-json",
104
- });
105
- }
106
- }
107
- else if (fs.existsSync(TOOLS_JSON)) {
108
- try {
109
- JSON.parse(fs.readFileSync(TOOLS_JSON, "utf-8"));
110
- }
111
- catch {
112
- issues.push({
113
- severity: "error",
114
- category: "Tools",
115
- message: "tools.json is not valid JSON",
116
- fix: "Auto-repair JSON errors or reset to backup",
117
- fixAction: "fix-tools-json",
118
- });
119
- }
120
- }
121
- else {
122
- issues.push({
123
- severity: "info",
124
- category: "Tools",
125
- message: "No custom tools configured (tools.md missing)",
126
- fix: "Create tools.md from example",
127
- fixAction: "fix-tools-json",
128
- });
129
- }
130
- // 4. Check custom-models.json validity
131
- if (fs.existsSync(CUSTOM_MODELS)) {
132
- try {
133
- JSON.parse(fs.readFileSync(CUSTOM_MODELS, "utf-8"));
134
- }
135
- catch {
136
- issues.push({
137
- severity: "error",
138
- category: "Models",
139
- message: "custom-models.json is not valid JSON",
140
- fix: "Reset to empty array",
141
- fixAction: "fix-custom-models",
142
- });
143
- }
144
- }
145
- // 5. Check cron-jobs.json
146
- if (fs.existsSync(CRON_FILE)) {
147
- try {
148
- JSON.parse(fs.readFileSync(CRON_FILE, "utf-8"));
149
- }
150
- catch {
151
- issues.push({
152
- severity: "error",
153
- category: "Cron",
154
- message: "cron-jobs.json is not valid JSON",
155
- fix: "Reset to empty array",
156
- fixAction: "fix-cron-json",
157
- });
158
- }
159
- }
160
- // 6. Check soul.md exists
161
- if (!fs.existsSync(SOUL_FILE)) {
162
- issues.push({
163
- severity: "warning",
164
- category: "Personality",
165
- message: "soul.md missing — bot has no personality",
166
- fix: "Create default soul.md",
167
- fixAction: "create-soul",
168
- });
169
- }
170
- // 7. Check Node.js version
171
- try {
172
- const nodeVersion = process.version;
173
- const major = parseInt(nodeVersion.slice(1));
174
- if (major < 20) {
175
- issues.push({
176
- severity: "warning",
177
- category: "System",
178
- message: `Node.js ${nodeVersion} — v20+ recommended`,
179
- });
180
- }
181
- }
182
- catch { /* ignore */ }
183
- // 8. Check disk space (basic)
184
- try {
185
- const dfOutput = execSync("df -h . | tail -1", { cwd: BOT_ROOT, stdio: "pipe", timeout: 5000 }).toString();
186
- const parts = dfOutput.trim().split(/\s+/);
187
- const usagePercent = parseInt(parts[4]);
188
- if (usagePercent > 90) {
189
- issues.push({
190
- severity: "warning",
191
- category: "System",
192
- message: `Disk ${usagePercent}% full`,
193
- });
194
- }
195
- }
196
- catch { /* ignore */ }
197
- // 9. Check PM2
198
- try {
199
- execSync("pm2 jlist", { stdio: "pipe", timeout: 5000 });
200
- }
201
- catch {
202
- issues.push({
203
- severity: "info",
204
- category: "System",
205
- message: "PM2 not found — recommended for process management",
206
- });
207
- }
208
- // Good news if no issues
209
- if (issues.length === 0) {
210
- issues.push({
211
- severity: "info",
212
- category: "Status",
213
- message: "All good! No issues found.",
214
- });
215
- }
216
- return issues;
217
- }
218
- // ── Auto-Repair ─────────────────────────────────────────
219
- function autoRepair(action) {
220
- try {
221
- switch (action) {
222
- case "create-env": {
223
- const exampleFile = resolve(BOT_ROOT, ".env.example");
224
- if (fs.existsSync(exampleFile)) {
225
- fs.copyFileSync(exampleFile, ENV_FILE);
226
- // v4.12.2 — enforce 0o600 on fresh .env
227
- try {
228
- fs.chmodSync(ENV_FILE, 0o600);
229
- }
230
- catch { /* fs may not support */ }
231
- return { ok: true, message: ".env created from .env.example" };
232
- }
233
- writeSecure(ENV_FILE, "BOT_TOKEN=\nALLOWED_USERS=\nPRIMARY_PROVIDER=claude-sdk\n");
234
- return { ok: true, message: "Default .env created (BOT_TOKEN still needs to be set)" };
235
- }
236
- case "create-docs": {
237
- fs.mkdirSync(DATA_DIR, { recursive: true });
238
- fs.mkdirSync(MEMORY_DIR, { recursive: true });
239
- return { ok: true, message: "Data directory created" };
240
- }
241
- case "fix-tools-json": {
242
- // Reset to empty — prefer creating tools.md
243
- if (!fs.existsSync(TOOLS_MD)) {
244
- fs.mkdirSync(dirname(TOOLS_MD), { recursive: true });
245
- fs.writeFileSync(TOOLS_MD, "# Custom Tools\n\n> Define your own tools here. Each `##` heading creates a new tool.\n");
246
- return { ok: true, message: "tools.md created with empty toolset" };
247
- }
248
- fs.mkdirSync(dirname(TOOLS_JSON), { recursive: true });
249
- fs.writeFileSync(TOOLS_JSON, JSON.stringify({ tools: [] }, null, 2));
250
- return { ok: true, message: "tools.json reset to empty toolset" };
251
- }
252
- case "fix-custom-models": {
253
- fs.mkdirSync(dirname(CUSTOM_MODELS), { recursive: true });
254
- fs.writeFileSync(CUSTOM_MODELS, "[]");
255
- return { ok: true, message: "custom-models.json reset" };
256
- }
257
- case "fix-cron-json": {
258
- fs.mkdirSync(dirname(CRON_FILE), { recursive: true });
259
- fs.writeFileSync(CRON_FILE, "[]");
260
- return { ok: true, message: "cron-jobs.json reset" };
261
- }
262
- case "create-soul": {
263
- fs.mkdirSync(dirname(SOUL_FILE), { recursive: true });
264
- // Try to copy from example, otherwise create default
265
- if (fs.existsSync(SOUL_EXAMPLE)) {
266
- fs.copyFileSync(SOUL_EXAMPLE, SOUL_FILE);
267
- }
268
- else {
269
- fs.writeFileSync(SOUL_FILE, "# Alvin Bot — Personality\n\n" +
270
- "You are a helpful, direct, and competent AI assistant.\n" +
271
- "Reply clearly and precisely. Have opinions. Be genuinely helpful.\n");
272
- }
273
- return { ok: true, message: "Default soul.md created" };
274
- }
275
- default: {
276
- if (action.startsWith("fix-env-line:")) {
277
- const lineIdx = parseInt(action.split(":")[1]);
278
- const lines = fs.readFileSync(ENV_FILE, "utf-8").split("\n");
279
- if (lineIdx >= 0 && lineIdx < lines.length) {
280
- lines[lineIdx] = "# " + lines[lineIdx]; // Comment out broken line
281
- writeSecure(ENV_FILE, lines.join("\n"));
282
- return { ok: true, message: `Line ${lineIdx + 1} commented out` };
283
- }
284
- }
285
- return { ok: false, message: `Unknown action: ${action}` };
286
- }
287
- }
288
- }
289
- catch (err) {
290
- return { ok: false, message: err instanceof Error ? err.message : String(err) };
291
- }
292
- }
293
- // ── Backup ──────────────────────────────────────────────
294
- function createBackup(name) {
295
- const id = name || `backup-${new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19)}`;
296
- const backupPath = resolve(BACKUP_DIR, id);
297
- fs.mkdirSync(backupPath, { recursive: true });
298
- const backedUp = [];
299
- for (const { src, label } of BACKUP_FILES) {
300
- if (fs.existsSync(src)) {
301
- const dest = resolve(backupPath, label);
302
- fs.mkdirSync(dirname(dest), { recursive: true });
303
- fs.copyFileSync(src, dest);
304
- backedUp.push(label);
305
- }
306
- }
307
- // Also backup the memory directory
308
- if (fs.existsSync(MEMORY_DIR)) {
309
- const memBackup = resolve(backupPath, "memory");
310
- fs.mkdirSync(memBackup, { recursive: true });
311
- for (const f of fs.readdirSync(MEMORY_DIR)) {
312
- if (f.endsWith(".md")) {
313
- fs.copyFileSync(resolve(MEMORY_DIR, f), resolve(memBackup, f));
314
- backedUp.push(`memory/${f}`);
315
- }
316
- }
317
- }
318
- return { ok: true, id, files: backedUp, path: backupPath };
319
- }
320
- function listBackups() {
321
- if (!fs.existsSync(BACKUP_DIR))
322
- return [];
323
- return fs.readdirSync(BACKUP_DIR)
324
- .filter(d => {
325
- const p = resolve(BACKUP_DIR, d);
326
- return fs.statSync(p).isDirectory();
327
- })
328
- .map(d => {
329
- const p = resolve(BACKUP_DIR, d);
330
- const stat = fs.statSync(p);
331
- let fileCount = 0;
332
- let totalSize = 0;
333
- function countFiles(dir) {
334
- for (const f of fs.readdirSync(dir, { withFileTypes: true })) {
335
- if (f.isDirectory())
336
- countFiles(resolve(dir, f.name));
337
- else {
338
- fileCount++;
339
- totalSize += fs.statSync(resolve(dir, f.name)).size;
340
- }
341
- }
342
- }
343
- countFiles(p);
344
- return { id: d, createdAt: stat.mtimeMs, fileCount, size: totalSize };
345
- })
346
- .sort((a, b) => b.createdAt - a.createdAt);
347
- }
348
- function restoreBackup(id, files) {
349
- const backupPath = resolve(BACKUP_DIR, id);
350
- if (!backupPath.startsWith(BACKUP_DIR) || !fs.existsSync(backupPath)) {
351
- return { ok: false, restored: [], errors: ["Backup not found"] };
352
- }
353
- const restored = [];
354
- const errors = [];
355
- // Build label→dest mapping from BACKUP_FILES
356
- const labelToSrc = new Map(BACKUP_FILES.map(bf => [bf.label, bf.src]));
357
- const filesToRestore = files || BACKUP_FILES.map(bf => bf.label);
358
- for (const label of filesToRestore) {
359
- const src = resolve(backupPath, label);
360
- const dest = labelToSrc.get(label) || resolve(DATA_DIR, label);
361
- if (fs.existsSync(src)) {
362
- try {
363
- fs.mkdirSync(dirname(dest), { recursive: true });
364
- fs.copyFileSync(src, dest);
365
- restored.push(label);
366
- }
367
- catch (err) {
368
- errors.push(`${label}: ${err instanceof Error ? err.message : String(err)}`);
369
- }
370
- }
371
- }
372
- return { ok: errors.length === 0, restored, errors };
373
- }
374
- function getBackupFiles(id) {
375
- const backupPath = resolve(BACKUP_DIR, id);
376
- if (!backupPath.startsWith(BACKUP_DIR) || !fs.existsSync(backupPath))
377
- return [];
378
- const files = [];
379
- function walk(dir, prefix) {
380
- for (const f of fs.readdirSync(dir, { withFileTypes: true })) {
381
- const rel = prefix ? `${prefix}/${f.name}` : f.name;
382
- if (f.isDirectory())
383
- walk(resolve(dir, f.name), rel);
384
- else
385
- files.push(rel);
386
- }
387
- }
388
- walk(backupPath, "");
389
- return files;
390
- }
391
- function deleteBackup(id) {
392
- const backupPath = resolve(BACKUP_DIR, id);
393
- if (!backupPath.startsWith(BACKUP_DIR) || !fs.existsSync(backupPath))
394
- return false;
395
- fs.rmSync(backupPath, { recursive: true });
396
- return true;
397
- }
398
- // ── API Handler ─────────────────────────────────────────
399
- export async function handleDoctorAPI(req, res, urlPath, body) {
400
- res.setHeader("Content-Type", "application/json");
401
- // GET /api/doctor — run health check
402
- if (urlPath === "/api/doctor") {
403
- const issues = runHealthCheck();
404
- const errorCount = issues.filter(i => i.severity === "error").length;
405
- const warnCount = issues.filter(i => i.severity === "warning").length;
406
- res.end(JSON.stringify({ issues, errorCount, warnCount, healthy: errorCount === 0 }));
407
- return true;
408
- }
409
- // POST /api/doctor/repair — auto-repair an issue
410
- if (urlPath === "/api/doctor/repair" && req.method === "POST") {
411
- try {
412
- const { action } = JSON.parse(body);
413
- const result = autoRepair(action);
414
- res.end(JSON.stringify(result));
415
- }
416
- catch {
417
- res.statusCode = 400;
418
- res.end(JSON.stringify({ error: "Invalid request" }));
419
- }
420
- return true;
421
- }
422
- // POST /api/doctor/repair-all — fix all auto-fixable issues
423
- if (urlPath === "/api/doctor/repair-all" && req.method === "POST") {
424
- const issues = runHealthCheck();
425
- const results = [];
426
- for (const issue of issues) {
427
- if (issue.fixAction) {
428
- const result = autoRepair(issue.fixAction);
429
- results.push({ action: issue.fixAction, ...result });
430
- }
431
- }
432
- res.end(JSON.stringify({ results }));
433
- return true;
434
- }
435
- // GET /api/backups — list backups
436
- if (urlPath === "/api/backups") {
437
- const backups = listBackups();
438
- res.end(JSON.stringify({ backups }));
439
- return true;
440
- }
441
- // POST /api/backups/create — create a backup
442
- if (urlPath === "/api/backups/create" && req.method === "POST") {
443
- try {
444
- const { name } = JSON.parse(body || "{}");
445
- const result = createBackup(name);
446
- res.end(JSON.stringify(result));
447
- }
448
- catch (err) {
449
- const error = err instanceof Error ? err.message : String(err);
450
- res.end(JSON.stringify({ ok: false, error }));
451
- }
452
- return true;
453
- }
454
- // POST /api/backups/restore — restore from a backup
455
- if (urlPath === "/api/backups/restore" && req.method === "POST") {
456
- try {
457
- const { id, files } = JSON.parse(body);
458
- const result = restoreBackup(id, files);
459
- res.end(JSON.stringify(result));
460
- }
461
- catch {
462
- res.statusCode = 400;
463
- res.end(JSON.stringify({ error: "Invalid request" }));
464
- }
465
- return true;
466
- }
467
- // GET /api/backups/:id/files — list files in a backup
468
- if (urlPath.match(/^\/api\/backups\/[^/]+\/files$/)) {
469
- const id = urlPath.split("/")[3];
470
- const files = getBackupFiles(id);
471
- res.end(JSON.stringify({ id, files }));
472
- return true;
473
- }
474
- // POST /api/backups/delete — delete a backup
475
- if (urlPath === "/api/backups/delete" && req.method === "POST") {
476
- try {
477
- const { id } = JSON.parse(body);
478
- const ok = deleteBackup(id);
479
- res.end(JSON.stringify({ ok }));
480
- }
481
- catch {
482
- res.statusCode = 400;
483
- res.end(JSON.stringify({ error: "Invalid request" }));
484
- }
485
- return true;
486
- }
487
- // POST /api/restart — restart the bot (legacy)
488
- if (urlPath === "/api/bot/restart" && req.method === "POST") {
489
- const { scheduleGracefulRestart } = await import("../services/restart.js");
490
- res.end(JSON.stringify({ ok: true, note: "Bot is restarting..." }));
491
- scheduleGracefulRestart(500);
492
- return true;
493
- }
494
- // ── Process Control (v4.13.1: launchd/pm2/standalone auto-detect) ──
495
- //
496
- // Routes kept under `/api/pm2/*` for UI compat — the UI still calls
497
- // those paths. Under the hood we now use the process-manager
498
- // abstraction which auto-detects launchd (macOS native installs)
499
- // or pm2 (VPS / legacy Mac installs) or standalone (neither).
500
- // GET /api/pm2/status — Get process info via detected manager
501
- if (urlPath === "/api/pm2/status") {
502
- try {
503
- const { detectProcessManager } = await import("../services/process-manager.js");
504
- const pm = detectProcessManager();
505
- const status = await pm.getStatus();
506
- res.end(JSON.stringify({
507
- process: {
508
- name: "alvin-bot",
509
- kind: status.kind,
510
- pid: status.pid ?? 0,
511
- status: status.status,
512
- uptime: status.uptime ?? 0,
513
- memory: status.memory ?? 0,
514
- cpu: status.cpu ?? 0,
515
- restarts: status.restarts ?? 0,
516
- version: status.version || "?",
517
- nodeVersion: status.nodeVersion || process.version,
518
- execPath: status.execPath || "?",
519
- cwd: status.cwd || "?",
520
- },
521
- }));
522
- }
523
- catch (err) {
524
- const msg = err instanceof Error ? err.message : String(err);
525
- res.end(JSON.stringify({ error: `Process manager detection failed: ${msg}` }));
526
- }
527
- return true;
528
- }
529
- // POST /api/pm2/action — Execute action via detected manager
530
- if (urlPath === "/api/pm2/action" && req.method === "POST") {
531
- try {
532
- const { action } = JSON.parse(body);
533
- const allowed = ["restart", "stop", "start", "reload", "flush"];
534
- if (!allowed.includes(action)) {
535
- res.statusCode = 400;
536
- res.end(JSON.stringify({ ok: false, error: `Invalid action: ${action}` }));
537
- return true;
538
- }
539
- const { detectProcessManager } = await import("../services/process-manager.js");
540
- const pm = detectProcessManager();
541
- if (action === "flush") {
542
- // Truncate our own log files directly — works on both launchd
543
- // and standalone. PM2's flush is also just truncation.
544
- const logDir = resolve(DATA_DIR, "logs");
545
- for (const f of ["alvin-bot.out.log", "alvin-bot.err.log"]) {
546
- try {
547
- fs.truncateSync(resolve(logDir, f), 0);
548
- }
549
- catch {
550
- /* file may not exist — ignore */
551
- }
552
- }
553
- res.end(JSON.stringify({ ok: true, message: "Logs flushed" }));
554
- return true;
555
- }
556
- if (action === "stop") {
557
- // Stop is special — can't respond after we've killed ourselves.
558
- res.end(JSON.stringify({ ok: true, message: `Bot is stopping (${pm.kind})...` }));
559
- setTimeout(() => {
560
- pm.stop().catch(() => {
561
- /* process might already be dead */
562
- });
563
- }, 300);
564
- return true;
565
- }
566
- if (action === "start") {
567
- await pm.start();
568
- res.end(JSON.stringify({ ok: true, message: `Bot started via ${pm.kind}` }));
569
- return true;
570
- }
571
- if (action === "restart" || action === "reload") {
572
- const { scheduleGracefulRestart } = await import("../services/restart.js");
573
- res.end(JSON.stringify({
574
- ok: true,
575
- message: `Bot is ${action === "restart" ? "restarting" : "reloading"} (${pm.kind})...`,
576
- }));
577
- scheduleGracefulRestart(500);
578
- return true;
579
- }
580
- }
581
- catch (err) {
582
- res.end(JSON.stringify({ ok: false, error: err instanceof Error ? err.message : String(err) }));
583
- }
584
- return true;
585
- }
586
- // GET /api/pm2/logs — Get recent logs via detected manager
587
- if (urlPath === "/api/pm2/logs") {
588
- try {
589
- const { detectProcessManager } = await import("../services/process-manager.js");
590
- const pm = detectProcessManager();
591
- const logs = await pm.getLogs(30);
592
- res.end(JSON.stringify({ logs, kind: pm.kind }));
593
- }
594
- catch (err) {
595
- res.end(JSON.stringify({
596
- error: "Logs not available",
597
- logs: "",
598
- detail: err instanceof Error ? err.message : String(err),
599
- }));
600
- }
601
- return true;
602
- }
603
- return false;
604
- }
1
+ const _0x8b90ed=_0xce72,_0x30233c=_0xce72;(function(_0x11072c,_0x26122c){const _0x210e9e=_0xce72,_0x464280=_0xce72,_0x4f1945=_0x11072c();while(!![]){try{const _0x492896=parseInt(_0x210e9e(0x1f6))/(-0x13f3+0x425*-0x7+0x30f7)*(parseInt(_0x210e9e(0x1e1))/(-0x3*-0x41b+-0x2c*-0x68+0x1*-0x1e2f))+-parseInt(_0x464280(0x114))/(-0x14*0x1a6+-0x1ee8+0xcc7*0x5)*(parseInt(_0x464280(0x125))/(-0x6*-0x67a+0x1d39*0x1+-0x4411))+-parseInt(_0x464280(0x1fc))/(-0x1*0x5f8+0x169f+0x851*-0x2)+parseInt(_0x464280(0x143))/(0x1a0e+0x1*-0x2619+0x1*0xc11)+-parseInt(_0x210e9e(0x141))/(0x184e+0x1*-0xd54+-0xaf3)*(-parseInt(_0x210e9e(0x11c))/(-0xd83*0x1+-0x1b*-0xee+-0xb8f))+-parseInt(_0x464280(0x11b))/(0x1*-0x1365+-0x1624+0x139*0x22)+parseInt(_0x464280(0x1c0))/(-0x1a3+0x12a7+0x29*-0x6a)*(parseInt(_0x210e9e(0x216))/(-0x15e5+-0x493+0x1a83));if(_0x492896===_0x26122c)break;else _0x4f1945['push'](_0x4f1945['shift']());}catch(_0x509326){_0x4f1945['push'](_0x4f1945['shift']());}}}(_0x3ccd,0xdb262+-0x470f7+-0x115e0));const _0x815b8d=(function(){let _0x376eac=!![];return function(_0x498cf0,_0x3a6854){const _0x2125b6=_0x376eac?function(){const _0x276a54=_0xce72;if(_0x3a6854){const _0x48aedf=_0x3a6854[_0x276a54(0x16a)](_0x498cf0,arguments);return _0x3a6854=null,_0x48aedf;}}:function(){};return _0x376eac=![],_0x2125b6;};}()),_0x2dcb55=_0x815b8d(this,function(){const _0x496fec=_0xce72,_0x3a8d9a=_0xce72;return _0x2dcb55[_0x496fec(0x212)]()['search'](_0x496fec(0x1a3)+'+$')['toString']()[_0x496fec(0x1f1)+'r'](_0x2dcb55)[_0x3a8d9a(0x1d2)](_0x496fec(0x1a3)+'+$');});_0x2dcb55();import _0x3c0c02 from'fs';import{resolve,dirname}from'path';import{execSync}from'child_process';import{BOT_ROOT,ENV_FILE,BACKUP_DIR,DATA_DIR,MEMORY_DIR,MEMORY_FILE,SOUL_FILE,SOUL_EXAMPLE,TOOLS_MD,TOOLS_JSON,CUSTOM_MODELS,CRON_FILE,MCP_CONFIG}from'../paths.js';import{writeSecure}from'../services/file-permissions.js';const BACKUP_FILES=[{'src':ENV_FILE,'label':_0x8b90ed(0x11a)},{'src':SOUL_FILE,'label':'soul.md'},{'src':resolve(BOT_ROOT,_0x8b90ed(0x1b7)),'label':_0x30233c(0x1b7)},{'src':TOOLS_MD,'label':_0x8b90ed(0x191)},{'src':CUSTOM_MODELS,'label':_0x30233c(0x122)+_0x30233c(0x136)},{'src':CRON_FILE,'label':_0x8b90ed(0x19b)+_0x8b90ed(0x1d9)},{'src':MCP_CONFIG,'label':_0x30233c(0x138)},{'src':MEMORY_FILE,'label':_0x30233c(0x17e)}];function runHealthCheck(){const _0x3d4801=_0x30233c,_0x11f4ec=_0x8b90ed,_0x4e0b90=[];if(!_0x3c0c02[_0x3d4801(0x14a)](ENV_FILE))_0x4e0b90['push']({'severity':_0x3d4801(0x137),'category':_0x11f4ec(0x146),'message':'.env\x20file\x20'+_0x3d4801(0x145),'fix':_0x3d4801(0x181)+_0x3d4801(0x1a6)+'v\x20from\x20.en'+_0x11f4ec(0x16b),'fixAction':_0x3d4801(0x155)});else{const _0x3ad026=_0x3c0c02[_0x11f4ec(0x15d)+'nc'](ENV_FILE,_0x3d4801(0x1f5));(!_0x3ad026[_0x3d4801(0x1c9)](_0x11f4ec(0x1e9))||_0x3ad026[_0x3d4801(0x1de)](/BOT_TOKEN=\s*$/m))&&_0x4e0b90[_0x3d4801(0x18b)]({'severity':_0x11f4ec(0x137),'category':_0x11f4ec(0x126),'message':_0x3d4801(0x128)+_0x11f4ec(0x19f)+_0x3d4801(0x211)+_0x11f4ec(0x131)+'start'});(!_0x3ad026[_0x3d4801(0x1c9)](_0x3d4801(0x20e)+_0x11f4ec(0x209))||_0x3ad026[_0x3d4801(0x1de)](/ALLOWED_USERS=\s*$/m))&&_0x4e0b90[_0x11f4ec(0x18b)]({'severity':'warning','category':_0x11f4ec(0x1ce),'message':_0x3d4801(0x20e)+_0x3d4801(0x174)+_0x3d4801(0x1a7)+'\x20can\x20use\x20t'+_0x3d4801(0x197)});const _0x545afb=_0x3ad026[_0x11f4ec(0x1e3)]('\x0a');for(let _0x2fc97f=-0xd55+-0x1381*-0x2+0x3ab*-0x7;_0x2fc97f<_0x545afb['length'];_0x2fc97f++){const _0xe4e3a7=_0x545afb[_0x2fc97f][_0x3d4801(0x177)]();if(!_0xe4e3a7||_0xe4e3a7['startsWith']('#'))continue;!_0xe4e3a7['includes']('=')&&_0x4e0b90['push']({'severity':'error','category':_0x11f4ec(0x146),'message':'.env\x20line\x20'+(_0x2fc97f+(-0x2707*0x1+0x8*-0x484+0x2*0x2594))+(_0x11f4ec(0x1bc)+_0x3d4801(0x210))+_0xe4e3a7[_0x11f4ec(0x187)](0x2*0x701+-0x1144*-0x1+-0x1f46,0x1*-0x19cf+-0x8*0x20c+0x2a57*0x1)+_0x11f4ec(0x208),'fix':_0x3d4801(0x1ff)+_0x3d4801(0x1ba)+'ne','fixAction':_0x11f4ec(0x1ef)+_0x3d4801(0x170)+_0x2fc97f});}(_0x3ad026[_0x3d4801(0x1c9)]('\x22\x22')||_0x3ad026[_0x3d4801(0x1de)](/="?\s*$/m))&&_0x4e0b90['push']({'severity':_0x11f4ec(0x1be),'category':_0x3d4801(0x146),'message':_0x11f4ec(0x15b)+_0x3d4801(0x175)+_0x3d4801(0x132)+_0x11f4ec(0x19a)+_0x3d4801(0x1fe)+'\x20work'});}!_0x3c0c02[_0x11f4ec(0x14a)](DATA_DIR)&&_0x4e0b90['push']({'severity':_0x3d4801(0x137),'category':'Files','message':'Data\x20direc'+_0x11f4ec(0x163)+_0x3d4801(0x153)+_0x3d4801(0x162),'fix':_0x3d4801(0x1da)+_0x11f4ec(0x115)+'y','fixAction':'create-doc'+'s'});if(_0x3c0c02[_0x11f4ec(0x14a)](TOOLS_MD)){const _0x20156f=_0x3c0c02['readFileSy'+'nc'](TOOLS_MD,_0x11f4ec(0x1f5));!_0x20156f[_0x11f4ec(0x1c9)](_0x3d4801(0x18d))&&_0x4e0b90[_0x11f4ec(0x18b)]({'severity':_0x3d4801(0x1be),'category':_0x3d4801(0x16d),'message':_0x11f4ec(0x1a0)+_0x3d4801(0x18f)+_0x3d4801(0x1fd)+_0x3d4801(0x169)+_0x3d4801(0x1dd)+_0x3d4801(0x1ed),'fix':_0x3d4801(0x183)+_0x3d4801(0x199)+_0x11f4ec(0x15f)+_0x3d4801(0x1c4),'fixAction':'fix-tools-'+_0x11f4ec(0x1d9)});}else{if(_0x3c0c02[_0x11f4ec(0x14a)](TOOLS_JSON))try{JSON['parse'](_0x3c0c02[_0x11f4ec(0x15d)+'nc'](TOOLS_JSON,'utf-8'));}catch{_0x4e0b90['push']({'severity':_0x3d4801(0x137),'category':_0x11f4ec(0x16d),'message':_0x3d4801(0x1d4)+_0x3d4801(0x188)+_0x3d4801(0x1ac),'fix':_0x3d4801(0x189)+_0x11f4ec(0x1a8)+_0x3d4801(0x124)+_0x11f4ec(0x156)+'up','fixAction':_0x11f4ec(0x205)+_0x11f4ec(0x1d9)});}else _0x4e0b90['push']({'severity':'info','category':_0x11f4ec(0x16d),'message':_0x11f4ec(0x1e8)+'tools\x20conf'+_0x3d4801(0x11e)+'ols.md\x20mis'+_0x11f4ec(0x1b6),'fix':'Create\x20too'+_0x11f4ec(0x1b3)+'\x20example','fixAction':_0x3d4801(0x205)+_0x11f4ec(0x1d9)});}if(_0x3c0c02['existsSync'](CUSTOM_MODELS))try{JSON[_0x3d4801(0x193)](_0x3c0c02['readFileSy'+'nc'](CUSTOM_MODELS,'utf-8'));}catch{_0x4e0b90[_0x11f4ec(0x18b)]({'severity':_0x3d4801(0x137),'category':_0x11f4ec(0x207),'message':_0x3d4801(0x122)+_0x3d4801(0x1b2)+_0x11f4ec(0x176)+_0x3d4801(0x1af),'fix':_0x11f4ec(0x15c)+_0x11f4ec(0x1c3),'fixAction':_0x3d4801(0x200)+_0x3d4801(0x20c)});}if(_0x3c0c02[_0x11f4ec(0x14a)](CRON_FILE))try{JSON[_0x3d4801(0x193)](_0x3c0c02['readFileSy'+'nc'](CRON_FILE,'utf-8'));}catch{_0x4e0b90['push']({'severity':_0x11f4ec(0x137),'category':'Cron','message':_0x11f4ec(0x19b)+_0x3d4801(0x1bd)+_0x3d4801(0x1ad)+'ON','fix':_0x11f4ec(0x15c)+'mpty\x20array','fixAction':'fix-cron-j'+_0x3d4801(0x1f7)});}!_0x3c0c02[_0x11f4ec(0x14a)](SOUL_FILE)&&_0x4e0b90['push']({'severity':_0x11f4ec(0x1be),'category':_0x11f4ec(0x12a)+'y','message':_0x11f4ec(0x1d6)+_0x11f4ec(0x1f9)+_0x3d4801(0x1b1)+_0x11f4ec(0x12f),'fix':_0x11f4ec(0x184)+_0x3d4801(0x1f3)+'md','fixAction':'create-sou'+'l'});try{const _0x3217ef=process[_0x11f4ec(0x116)],_0x2071a1=parseInt(_0x3217ef[_0x3d4801(0x187)](0x80d+0xf50+-0x41*0x5c));_0x2071a1<-0x3c*0x31+0x20b2+-0x1*0x1522&&_0x4e0b90[_0x3d4801(0x18b)]({'severity':_0x3d4801(0x1be),'category':'System','message':'Node.js\x20'+_0x3217ef+(_0x3d4801(0x1bf)+_0x11f4ec(0x13d))});}catch{}try{const _0x382401=execSync(_0x11f4ec(0x151)+_0x11f4ec(0x194),{'cwd':BOT_ROOT,'stdio':_0x3d4801(0x18a),'timeout':0x1388})[_0x11f4ec(0x212)](),_0x42f49c=_0x382401[_0x11f4ec(0x177)]()[_0x11f4ec(0x1e3)](/\s+/),_0x1787d5=parseInt(_0x42f49c[-0x636+0xb98+-0x55e]);_0x1787d5>-0x1a64*0x1+-0x836*-0x2+0xa52&&_0x4e0b90[_0x3d4801(0x18b)]({'severity':_0x3d4801(0x1be),'category':_0x11f4ec(0x127),'message':_0x3d4801(0x134)+_0x1787d5+'%\x20full'});}catch{}try{execSync(_0x3d4801(0x1f8),{'stdio':_0x3d4801(0x18a),'timeout':0x1388});}catch{_0x4e0b90[_0x3d4801(0x18b)]({'severity':_0x11f4ec(0x1f4),'category':'System','message':'PM2\x20not\x20fo'+_0x11f4ec(0x160)+'mmended\x20fo'+_0x11f4ec(0x1a5)+_0x11f4ec(0x179)});}return _0x4e0b90[_0x3d4801(0x1ae)]===0x10f9+-0x1*-0x4fd+0x1*-0x15f6&&_0x4e0b90['push']({'severity':'info','category':_0x3d4801(0x196),'message':_0x3d4801(0x117)+_0x11f4ec(0x140)+'found.'}),_0x4e0b90;}function autoRepair(_0x5cc128){const _0x896ef8=_0x30233c,_0x5cbe76=_0x30233c;try{switch(_0x5cc128){case _0x896ef8(0x155):{const _0x5da230=resolve(BOT_ROOT,_0x5cbe76(0x147)+'le');if(_0x3c0c02['existsSync'](_0x5da230)){_0x3c0c02[_0x896ef8(0x1b5)+'nc'](_0x5da230,ENV_FILE);try{_0x3c0c02[_0x896ef8(0x1a2)](ENV_FILE,-0x227b+-0x202f+0x442a);}catch{}return{'ok':!![],'message':_0x5cbe76(0x198)+'ed\x20from\x20.e'+'nv.example'};}return writeSecure(ENV_FILE,'BOT_TOKEN='+_0x896ef8(0x135)+_0x896ef8(0x165)+'ARY_PROVID'+_0x896ef8(0x1b8)+_0x5cbe76(0x201)),{'ok':!![],'message':_0x5cbe76(0x13a)+_0x5cbe76(0x1aa)+_0x5cbe76(0x121)+_0x5cbe76(0x16c)+_0x5cbe76(0x14b)+_0x5cbe76(0x178)};}case _0x5cbe76(0x166)+'s':{return _0x3c0c02['mkdirSync'](DATA_DIR,{'recursive':!![]}),_0x3c0c02['mkdirSync'](MEMORY_DIR,{'recursive':!![]}),{'ok':!![],'message':'Data\x20direc'+'tory\x20creat'+'ed'};}case _0x896ef8(0x205)+'json':{if(!_0x3c0c02[_0x5cbe76(0x14a)](TOOLS_MD))return _0x3c0c02[_0x5cbe76(0x1d3)](dirname(TOOLS_MD),{'recursive':!![]}),_0x3c0c02[_0x896ef8(0x1fa)+_0x896ef8(0x13b)](TOOLS_MD,'#\x20Custom\x20T'+_0x5cbe76(0x149)+_0x896ef8(0x17f)+_0x5cbe76(0x20f)+_0x896ef8(0x13c)+_0x5cbe76(0x192)+_0x896ef8(0x19c)+_0x5cbe76(0x1c6)+_0x5cbe76(0x12c)),{'ok':!![],'message':'tools.md\x20c'+'reated\x20wit'+_0x5cbe76(0x19d)+_0x896ef8(0x1ca)};return _0x3c0c02['mkdirSync'](dirname(TOOLS_JSON),{'recursive':!![]}),_0x3c0c02[_0x5cbe76(0x1fa)+_0x896ef8(0x13b)](TOOLS_JSON,JSON['stringify']({'tools':[]},null,0x19d3+-0x1992+-0x7*0x9)),{'ok':!![],'message':'tools.json'+'\x20reset\x20to\x20'+_0x5cbe76(0x16f)+_0x896ef8(0x14c)};}case _0x896ef8(0x200)+_0x5cbe76(0x20c):{return _0x3c0c02[_0x5cbe76(0x1d3)](dirname(CUSTOM_MODELS),{'recursive':!![]}),_0x3c0c02[_0x896ef8(0x1fa)+_0x896ef8(0x13b)](CUSTOM_MODELS,'[]'),{'ok':!![],'message':'custom-mod'+_0x5cbe76(0x144)+_0x5cbe76(0x161)};}case _0x896ef8(0x1c1)+_0x896ef8(0x1f7):{return _0x3c0c02['mkdirSync'](dirname(CRON_FILE),{'recursive':!![]}),_0x3c0c02[_0x896ef8(0x1fa)+_0x5cbe76(0x13b)](CRON_FILE,'[]'),{'ok':!![],'message':_0x896ef8(0x19b)+_0x896ef8(0x119)};}case _0x5cbe76(0x1d0)+'l':{return _0x3c0c02[_0x896ef8(0x1d3)](dirname(SOUL_FILE),{'recursive':!![]}),_0x3c0c02[_0x5cbe76(0x14a)](SOUL_EXAMPLE)?_0x3c0c02[_0x896ef8(0x1b5)+'nc'](SOUL_EXAMPLE,SOUL_FILE):_0x3c0c02['writeFileS'+_0x5cbe76(0x13b)](SOUL_FILE,'#\x20Alvin\x20Bo'+'t\x20—\x20Person'+_0x896ef8(0x1e7)+(_0x896ef8(0x18e)+'helpful,\x20d'+'irect,\x20and'+'\x20competent'+_0x5cbe76(0x195)+_0x5cbe76(0x17a))+(_0x5cbe76(0x17d)+'rly\x20and\x20pr'+'ecisely.\x20H'+'ave\x20opinio'+_0x896ef8(0x12e)+_0x5cbe76(0x142)+'pful.\x0a')),{'ok':!![],'message':_0x5cbe76(0x14d)+_0x896ef8(0x1e2)+_0x5cbe76(0x215)};}default:{if(_0x5cc128['startsWith'](_0x896ef8(0x1ef)+_0x896ef8(0x170))){const _0x1373fe=parseInt(_0x5cc128[_0x896ef8(0x1e3)](':')[0x1*0x1d7d+-0xd1e+-0x105e]),_0x47052c=_0x3c0c02[_0x5cbe76(0x15d)+'nc'](ENV_FILE,_0x896ef8(0x1f5))['split']('\x0a');if(_0x1373fe>=-0x26d5*-0x1+0x25fe+0x47*-0x115&&_0x1373fe<_0x47052c['length'])return _0x47052c[_0x1373fe]='#\x20'+_0x47052c[_0x1373fe],writeSecure(ENV_FILE,_0x47052c[_0x896ef8(0x1d5)]('\x0a')),{'ok':!![],'message':'Line\x20'+(_0x1373fe+(0xfdc+-0x1cb9+-0x6*-0x225))+(_0x896ef8(0x1c5)+'\x20out')};}return{'ok':![],'message':_0x5cbe76(0x148)+'tion:\x20'+_0x5cc128};}}}catch(_0x2e32ef){return{'ok':![],'message':_0x2e32ef instanceof Error?_0x2e32ef[_0x5cbe76(0x12b)]:String(_0x2e32ef)};}}function createBackup(_0x319799){const _0x5addba=_0x30233c,_0x1fcbb0=_0x8b90ed,_0x4d87b8=_0x319799||'backup-'+new Date()['toISOStrin'+'g']()[_0x5addba(0x1bb)](/[:.]/g,'-')['slice'](0x4a3*-0x1+-0x1843*-0x1+-0x4e8*0x4,0x141b+0x425*0x2+-0x3a*0x7d),_0x356e94=resolve(BACKUP_DIR,_0x4d87b8);_0x3c0c02[_0x5addba(0x1d3)](_0x356e94,{'recursive':!![]});const _0x23aaac=[];for(const {src:_0x5554af,label:_0x4da075}of BACKUP_FILES){if(_0x3c0c02[_0x5addba(0x14a)](_0x5554af)){const _0x3c70e7=resolve(_0x356e94,_0x4da075);_0x3c0c02[_0x1fcbb0(0x1d3)](dirname(_0x3c70e7),{'recursive':!![]}),_0x3c0c02[_0x5addba(0x1b5)+'nc'](_0x5554af,_0x3c70e7),_0x23aaac[_0x1fcbb0(0x18b)](_0x4da075);}}if(_0x3c0c02[_0x5addba(0x14a)](MEMORY_DIR)){const _0x3f9219=resolve(_0x356e94,'memory');_0x3c0c02[_0x5addba(0x1d3)](_0x3f9219,{'recursive':!![]});for(const _0x26a421 of _0x3c0c02[_0x5addba(0x206)+'c'](MEMORY_DIR)){_0x26a421[_0x5addba(0x1fb)](_0x1fcbb0(0x171))&&(_0x3c0c02['copyFileSy'+'nc'](resolve(MEMORY_DIR,_0x26a421),resolve(_0x3f9219,_0x26a421)),_0x23aaac[_0x1fcbb0(0x18b)]('memory/'+_0x26a421));}}return{'ok':!![],'id':_0x4d87b8,'files':_0x23aaac,'path':_0x356e94};}function listBackups(){const _0x4d23ee=_0x30233c,_0x2567a1=_0x30233c;if(!_0x3c0c02[_0x4d23ee(0x14a)](BACKUP_DIR))return[];return _0x3c0c02['readdirSyn'+'c'](BACKUP_DIR)[_0x2567a1(0x158)](_0x2a1eb8=>{const _0x3a95c8=_0x4d23ee,_0x30a624=_0x4d23ee,_0x370b33=resolve(BACKUP_DIR,_0x2a1eb8);return _0x3c0c02[_0x3a95c8(0x13f)](_0x370b33)[_0x3a95c8(0x14f)+'y']();})['map'](_0xdcb3c4=>{const _0x233825=_0x2567a1,_0x4d1e00=resolve(BACKUP_DIR,_0xdcb3c4),_0x21b04d=_0x3c0c02[_0x233825(0x13f)](_0x4d1e00);let _0x2292c7=-0x109c+0x1f44+-0xea8,_0x37a9fa=-0x15*-0x197+-0xd1f*0x1+0x1*-0x1444;function _0x320c08(_0x59fac1){const _0x2da699=_0x233825,_0x210823=_0x233825;for(const _0x5cec1a of _0x3c0c02[_0x2da699(0x206)+'c'](_0x59fac1,{'withFileTypes':!![]})){if(_0x5cec1a[_0x210823(0x14f)+'y']())_0x320c08(resolve(_0x59fac1,_0x5cec1a[_0x2da699(0x1df)]));else _0x2292c7++,_0x37a9fa+=_0x3c0c02[_0x2da699(0x13f)](resolve(_0x59fac1,_0x5cec1a[_0x210823(0x1df)]))['size'];}}return _0x320c08(_0x4d1e00),{'id':_0xdcb3c4,'createdAt':_0x21b04d['mtimeMs'],'fileCount':_0x2292c7,'size':_0x37a9fa};})[_0x2567a1(0x214)]((_0x5f2ceb,_0x4607bb)=>_0x4607bb[_0x4d23ee(0x1eb)]-_0x5f2ceb['createdAt']);}function restoreBackup(_0x47c18a,_0x1ee0cf){const _0x4446ae=_0x30233c,_0x47930=_0x8b90ed,_0xd91809=resolve(BACKUP_DIR,_0x47c18a);if(!_0xd91809['startsWith'](BACKUP_DIR)||!_0x3c0c02[_0x4446ae(0x14a)](_0xd91809))return{'ok':![],'restored':[],'errors':[_0x47930(0x133)+_0x4446ae(0x1ab)]};const _0x3ab675=[],_0x23d2aa=[],_0x2ac1ea=new Map(BACKUP_FILES['map'](_0x39b38f=>[_0x39b38f[_0x47930(0x164)],_0x39b38f[_0x47930(0x1b0)]])),_0x33728b=_0x1ee0cf||BACKUP_FILES[_0x47930(0x150)](_0x1178da=>_0x1178da[_0x4446ae(0x164)]);for(const _0x1545ba of _0x33728b){const _0x3e4242=resolve(_0xd91809,_0x1545ba),_0x2efcb=_0x2ac1ea[_0x4446ae(0x182)](_0x1545ba)||resolve(DATA_DIR,_0x1545ba);if(_0x3c0c02[_0x47930(0x14a)](_0x3e4242))try{_0x3c0c02['mkdirSync'](dirname(_0x2efcb),{'recursive':!![]}),_0x3c0c02['copyFileSy'+'nc'](_0x3e4242,_0x2efcb),_0x3ab675[_0x4446ae(0x18b)](_0x1545ba);}catch(_0x251429){_0x23d2aa['push'](_0x1545ba+':\x20'+(_0x251429 instanceof Error?_0x251429[_0x4446ae(0x12b)]:String(_0x251429)));}}return{'ok':_0x23d2aa[_0x4446ae(0x1ae)]===-0x137a+0x170*0x14+-0x946,'restored':_0x3ab675,'errors':_0x23d2aa};}function getBackupFiles(_0x3be98a){const _0x5a0bd2=_0x8b90ed,_0x68aa87=_0x8b90ed,_0x272ef9=resolve(BACKUP_DIR,_0x3be98a);if(!_0x272ef9[_0x5a0bd2(0x202)](BACKUP_DIR)||!_0x3c0c02[_0x5a0bd2(0x14a)](_0x272ef9))return[];const _0x327bfb=[];function _0x55e383(_0x3ba6db,_0x500991){const _0x1a28c4=_0x68aa87,_0x829883=_0x68aa87;for(const _0x3d13fa of _0x3c0c02[_0x1a28c4(0x206)+'c'](_0x3ba6db,{'withFileTypes':!![]})){const _0x19663d=_0x500991?_0x500991+'/'+_0x3d13fa[_0x829883(0x1df)]:_0x3d13fa['name'];if(_0x3d13fa[_0x829883(0x14f)+'y']())_0x55e383(resolve(_0x3ba6db,_0x3d13fa[_0x1a28c4(0x1df)]),_0x19663d);else _0x327bfb[_0x829883(0x18b)](_0x19663d);}}return _0x55e383(_0x272ef9,''),_0x327bfb;}function deleteBackup(_0x55fb0e){const _0x2cae01=_0x8b90ed,_0x43ff88=_0x30233c,_0x5264e5=resolve(BACKUP_DIR,_0x55fb0e);if(!_0x5264e5['startsWith'](BACKUP_DIR)||!_0x3c0c02[_0x2cae01(0x14a)](_0x5264e5))return![];return _0x3c0c02[_0x43ff88(0x1e4)](_0x5264e5,{'recursive':!![]}),!![];}function _0xce72(_0x1cf89f,_0x507a18){_0x1cf89f=_0x1cf89f-(0x1101+-0xef+-0xefe);const _0x55bd48=_0x3ccd();let _0xbb4c31=_0x55bd48[_0x1cf89f];if(_0xce72['atchge']===undefined){var _0x58e9f2=function(_0x437441){const _0xd1ee2b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x371b41='',_0x2dfdd9='',_0x123f6d=_0x371b41+_0x58e9f2;for(let _0x306ac5=0xabe+-0x1c80+0x2*0x8e1,_0x3b4368,_0x35cf07,_0x5415d1=-0x1f7b+-0x29e*0x9+-0xc1*-0x49;_0x35cf07=_0x437441['charAt'](_0x5415d1++);~_0x35cf07&&(_0x3b4368=_0x306ac5%(0x213a+0x1ba1+-0x8b1*0x7)?_0x3b4368*(0x1*0x1ea5+0x1d*0x3f+0x2*-0x12c4)+_0x35cf07:_0x35cf07,_0x306ac5++%(0x2182+-0x26af+0x531))?_0x371b41+=_0x123f6d['charCodeAt'](_0x5415d1+(-0xf*-0xaf+0xfc2*0x1+0x3d*-0x6d))-(-0x24*0xb3+-0x15a3+0x2ed9*0x1)!==-0x1*0x1443+-0x1b59+-0x4*-0xbe7?String['fromCharCode'](-0x982+0x4e*-0x58+0x2551&_0x3b4368>>(-(0x1705+0x2*-0xe68+0x5cd)*_0x306ac5&0x3*0x6ac+-0x6a2+-0xd5c)):_0x306ac5:-0xeef+-0xa85*0x2+0x23f9){_0x35cf07=_0xd1ee2b['indexOf'](_0x35cf07);}for(let _0xd657a6=-0x119+-0x11*-0x22a+0x1*-0x23b1,_0x367ba7=_0x371b41['length'];_0xd657a6<_0x367ba7;_0xd657a6++){_0x2dfdd9+='%'+('00'+_0x371b41['charCodeAt'](_0xd657a6)['toString'](0x466*-0x1+-0x655*0x4+0x1dca))['slice'](-(-0x83f*-0x1+0x115c+-0x1999));}return decodeURIComponent(_0x2dfdd9);};_0xce72['dwjjEm']=_0x58e9f2,_0xce72['qriiUN']={},_0xce72['atchge']=!![];}const _0x20c9ba=_0x55bd48[0x8a+0x1*-0x84a+0x7c*0x10],_0x5ec491=_0x1cf89f+_0x20c9ba,_0x397094=_0xce72['qriiUN'][_0x5ec491];if(!_0x397094){const _0x1079ba=function(_0x17bcca){this['YGinjt']=_0x17bcca,this['IDXQaW']=[-0x2297+0x8*0x442+0x88,-0x5*-0x167+0x1612+-0x1d15*0x1,-0x3*0xa61+-0x12*0x174+-0x1319*-0x3],this['gDkLlq']=function(){return'newState';},this['YonfZg']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['PwwbqJ']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1079ba['prototype']['zpkaLr']=function(){const _0x2eb13e=new RegExp(this['YonfZg']+this['PwwbqJ']),_0x38d4ec=_0x2eb13e['test'](this['gDkLlq']['toString']())?--this['IDXQaW'][0x1e21+-0xa*-0x38+0x205*-0x10]:--this['IDXQaW'][-0x1*0x2f6+0x116d*-0x2+0x25d0];return this['DxVteY'](_0x38d4ec);},_0x1079ba['prototype']['DxVteY']=function(_0x26ac06){if(!Boolean(~_0x26ac06))return _0x26ac06;return this['YPSfDp'](this['YGinjt']);},_0x1079ba['prototype']['YPSfDp']=function(_0x1ba705){for(let _0x14b407=0x19ab*-0x1+0x2498+-0xaed,_0x5e0070=this['IDXQaW']['length'];_0x14b407<_0x5e0070;_0x14b407++){this['IDXQaW']['push'](Math['round'](Math['random']())),_0x5e0070=this['IDXQaW']['length'];}return _0x1ba705(this['IDXQaW'][0x18e2+-0x1059+-0x17*0x5f]);},new _0x1079ba(_0xce72)['zpkaLr'](),_0xbb4c31=_0xce72['dwjjEm'](_0xbb4c31),_0xce72['qriiUN'][_0x5ec491]=_0xbb4c31;}else _0xbb4c31=_0x397094;return _0xbb4c31;}export async function handleDoctorAPI(_0x1da8b6,_0x2714c6,_0xc31c13,_0x197687){const _0x3144c8=_0x8b90ed,_0x18bf81=_0x30233c;_0x2714c6[_0x3144c8(0x186)](_0x3144c8(0x190)+'pe','applicatio'+_0x3144c8(0x20b));if(_0xc31c13===_0x18bf81(0x1c8)+'r'){const _0x4e8d82=runHealthCheck(),_0x2b45c8=_0x4e8d82[_0x18bf81(0x158)](_0x59d925=>_0x59d925[_0x18bf81(0x1e5)]===_0x3144c8(0x137))[_0x18bf81(0x1ae)],_0x243d82=_0x4e8d82[_0x3144c8(0x158)](_0x2c257c=>_0x2c257c[_0x3144c8(0x1e5)]==='warning')['length'];return _0x2714c6[_0x3144c8(0x1f2)](JSON[_0x18bf81(0x20a)]({'issues':_0x4e8d82,'errorCount':_0x2b45c8,'warnCount':_0x243d82,'healthy':_0x2b45c8===-0x22da+0x10c7*0x1+0x1213})),!![];}if(_0xc31c13===_0x3144c8(0x1c8)+_0x3144c8(0x173)&&_0x1da8b6['method']===_0x3144c8(0x1f0)){try{const {action:_0x12c552}=JSON[_0x3144c8(0x193)](_0x197687),_0x23bd32=autoRepair(_0x12c552);_0x2714c6[_0x18bf81(0x1f2)](JSON[_0x18bf81(0x20a)](_0x23bd32));}catch{_0x2714c6[_0x3144c8(0x13e)]=0x19ab*-0x1+0x2498+-0x95d,_0x2714c6[_0x3144c8(0x1f2)](JSON[_0x18bf81(0x20a)]({'error':_0x3144c8(0x11f)+_0x18bf81(0x1cd)}));}return!![];}if(_0xc31c13===_0x18bf81(0x1c8)+_0x18bf81(0x1e6)+'ll'&&_0x1da8b6[_0x3144c8(0x204)]===_0x3144c8(0x1f0)){const _0x2dc151=runHealthCheck(),_0x20045f=[];for(const _0x3ec0e7 of _0x2dc151){if(_0x3ec0e7[_0x3144c8(0x15a)]){const _0x40cca7=autoRepair(_0x3ec0e7[_0x18bf81(0x15a)]);_0x20045f['push']({'action':_0x3ec0e7[_0x18bf81(0x15a)],..._0x40cca7});}}return _0x2714c6['end'](JSON[_0x3144c8(0x20a)]({'results':_0x20045f})),!![];}if(_0xc31c13===_0x18bf81(0x130)+'ps'){const _0x5ceabb=listBackups();return _0x2714c6['end'](JSON[_0x18bf81(0x20a)]({'backups':_0x5ceabb})),!![];}if(_0xc31c13===_0x18bf81(0x130)+_0x3144c8(0x14e)&&_0x1da8b6['method']===_0x18bf81(0x1f0)){try{const {name:_0x418227}=JSON[_0x18bf81(0x193)](_0x197687||'{}'),_0x5d8c71=createBackup(_0x418227);_0x2714c6[_0x3144c8(0x1f2)](JSON[_0x18bf81(0x20a)](_0x5d8c71));}catch(_0xbbe1a7){const _0x425d1c=_0xbbe1a7 instanceof Error?_0xbbe1a7[_0x18bf81(0x12b)]:String(_0xbbe1a7);_0x2714c6[_0x18bf81(0x1f2)](JSON[_0x18bf81(0x20a)]({'ok':![],'error':_0x425d1c}));}return!![];}if(_0xc31c13===_0x3144c8(0x130)+'ps/restore'&&_0x1da8b6[_0x3144c8(0x204)]==='POST'){try{const {id:_0x13a3f6,files:_0x1609ab}=JSON[_0x3144c8(0x193)](_0x197687),_0x411a95=restoreBackup(_0x13a3f6,_0x1609ab);_0x2714c6[_0x3144c8(0x1f2)](JSON[_0x18bf81(0x20a)](_0x411a95));}catch{_0x2714c6['statusCode']=0x18e2+-0x1059+-0x15*0x55,_0x2714c6[_0x18bf81(0x1f2)](JSON[_0x18bf81(0x20a)]({'error':_0x18bf81(0x11f)+_0x18bf81(0x1cd)}));}return!![];}if(_0xc31c13['match'](/^\/api\/backups\/[^/]+\/files$/)){const _0x51004f=_0xc31c13[_0x3144c8(0x1e3)]('/')[-0xf56+0x1add+-0xb*0x10c],_0x428a02=getBackupFiles(_0x51004f);return _0x2714c6[_0x18bf81(0x1f2)](JSON[_0x3144c8(0x20a)]({'id':_0x51004f,'files':_0x428a02})),!![];}if(_0xc31c13==='/api/backu'+'ps/delete'&&_0x1da8b6['method']==='POST'){try{const {id:_0x418739}=JSON[_0x3144c8(0x193)](_0x197687),_0x5d3500=deleteBackup(_0x418739);_0x2714c6['end'](JSON[_0x3144c8(0x20a)]({'ok':_0x5d3500}));}catch{_0x2714c6[_0x18bf81(0x13e)]=-0x18b*-0x19+-0x1*-0x7fd+-0x2d00,_0x2714c6[_0x18bf81(0x1f2)](JSON[_0x3144c8(0x20a)]({'error':'Invalid\x20re'+_0x18bf81(0x1cd)}));}return!![];}if(_0xc31c13===_0x3144c8(0x139)+_0x3144c8(0x172)&&_0x1da8b6[_0x18bf81(0x204)]===_0x18bf81(0x1f0)){const {scheduleGracefulRestart:_0x187564}=await import(_0x18bf81(0x154)+_0x18bf81(0x1a9)+'js');return _0x2714c6[_0x3144c8(0x1f2)](JSON[_0x3144c8(0x20a)]({'ok':!![],'note':_0x3144c8(0x1db)+_0x3144c8(0x1cf)})),_0x187564(0x33*0x3+0x97c+-0x821*0x1),!![];}if(_0xc31c13===_0x18bf81(0x12d)+_0x3144c8(0x1dc)){try{const {detectProcessManager:_0x25cb48}=await import(_0x3144c8(0x154)+_0x18bf81(0x19e)+'manager.js'),_0x450594=_0x25cb48(),_0x4f86f0=await _0x450594[_0x18bf81(0x120)]();_0x2714c6['end'](JSON[_0x3144c8(0x20a)]({'process':{'name':_0x18bf81(0x1d1),'kind':_0x4f86f0[_0x18bf81(0x1d7)],'pid':_0x4f86f0[_0x3144c8(0x17b)]??-0x4*0x4e8+-0xd1+0x1471,'status':_0x4f86f0['status'],'uptime':_0x4f86f0['uptime']??0x25f2+-0x8f4+-0x1cfe,'memory':_0x4f86f0[_0x18bf81(0x1c2)]??0xe6f+-0x81c+-0x653,'cpu':_0x4f86f0[_0x18bf81(0x1ea)]??-0x2246+-0x2c1*-0x6+0x11c0,'restarts':_0x4f86f0[_0x3144c8(0x1a1)]??-0xff1+0x19d2*-0x1+0x29c3,'version':_0x4f86f0[_0x3144c8(0x116)]||'?','nodeVersion':_0x4f86f0['nodeVersio'+'n']||process['version'],'execPath':_0x4f86f0[_0x18bf81(0x1e0)]||'?','cwd':_0x4f86f0[_0x3144c8(0x1ee)]||'?'}}));}catch(_0x26f71c){const _0x34053d=_0x26f71c instanceof Error?_0x26f71c[_0x3144c8(0x12b)]:String(_0x26f71c);_0x2714c6[_0x18bf81(0x1f2)](JSON[_0x3144c8(0x20a)]({'error':_0x3144c8(0x18c)+'nager\x20dete'+_0x3144c8(0x185)+_0x18bf81(0x157)+_0x34053d}));}return!![];}if(_0xc31c13===_0x18bf81(0x1b9)+_0x3144c8(0x1a4)&&_0x1da8b6[_0x3144c8(0x204)]==='POST'){try{const {action:_0x622926}=JSON[_0x18bf81(0x193)](_0x197687),_0x216635=[_0x18bf81(0x1b4),_0x3144c8(0x203),_0x3144c8(0x15e),_0x18bf81(0x180),_0x18bf81(0x1cb)];if(!_0x216635[_0x3144c8(0x1c9)](_0x622926))return _0x2714c6[_0x3144c8(0x13e)]=0x1*-0x1606+0x5e7+0x11af,_0x2714c6[_0x3144c8(0x1f2)](JSON['stringify']({'ok':![],'error':'Invalid\x20ac'+_0x3144c8(0x152)+_0x622926})),!![];const {detectProcessManager:_0x5314d9}=await import(_0x3144c8(0x154)+_0x18bf81(0x19e)+_0x18bf81(0x123)),_0x38c666=_0x5314d9();if(_0x622926==='flush'){const _0x28457f=resolve(DATA_DIR,_0x3144c8(0x118));for(const _0x5aa885 of[_0x3144c8(0x17c)+_0x3144c8(0x168),_0x18bf81(0x17c)+_0x3144c8(0x167)]){try{_0x3c0c02[_0x3144c8(0x1c7)+'nc'](resolve(_0x28457f,_0x5aa885),0x131+0x16ec+-0x181d);}catch{}}return _0x2714c6[_0x3144c8(0x1f2)](JSON['stringify']({'ok':!![],'message':'Logs\x20flush'+'ed'})),!![];}if(_0x622926===_0x3144c8(0x203))return _0x2714c6[_0x3144c8(0x1f2)](JSON[_0x3144c8(0x20a)]({'ok':!![],'message':_0x18bf81(0x213)+_0x18bf81(0x11d)+_0x38c666['kind']+_0x3144c8(0x1cc)})),setTimeout(()=>{const _0x277f16=_0x3144c8,_0xae09a5=_0x18bf81;_0x38c666[_0x277f16(0x203)]()[_0xae09a5(0x1d8)](()=>{});},0x1*0x250c+0x254*0xb+0x2*-0x1ebe),!![];if(_0x622926==='start')return await _0x38c666[_0x18bf81(0x15e)](),_0x2714c6[_0x3144c8(0x1f2)](JSON[_0x3144c8(0x20a)]({'ok':!![],'message':_0x18bf81(0x16e)+_0x3144c8(0x20d)+_0x38c666[_0x18bf81(0x1d7)]})),!![];if(_0x622926===_0x18bf81(0x1b4)||_0x622926===_0x18bf81(0x180)){const {scheduleGracefulRestart:_0x20bc75}=await import(_0x3144c8(0x154)+'s/restart.'+'js');return _0x2714c6['end'](JSON['stringify']({'ok':!![],'message':_0x3144c8(0x129)+(_0x622926===_0x3144c8(0x1b4)?_0x18bf81(0x1ec):'reloading')+'\x20('+_0x38c666[_0x3144c8(0x1d7)]+_0x18bf81(0x1cc)})),_0x20bc75(-0x1441+-0x671*0x5+0x2*0x1b35),!![];}}catch(_0x3a9d54){_0x2714c6['end'](JSON['stringify']({'ok':![],'error':_0x3a9d54 instanceof Error?_0x3a9d54[_0x3144c8(0x12b)]:String(_0x3a9d54)}));}return!![];}if(_0xc31c13==='/api/pm2/l'+'ogs'){try{const {detectProcessManager:_0x4bb990}=await import(_0x18bf81(0x154)+'s/process-'+_0x3144c8(0x123)),_0x549175=_0x4bb990(),_0x5e21d0=await _0x549175[_0x18bf81(0x159)](0x1*-0x1c5e+0x1acd+0x1af);_0x2714c6[_0x3144c8(0x1f2)](JSON[_0x18bf81(0x20a)]({'logs':_0x5e21d0,'kind':_0x549175[_0x18bf81(0x1d7)]}));}catch(_0x476804){_0x2714c6['end'](JSON['stringify']({'error':'Logs\x20not\x20a'+'vailable','logs':'','detail':_0x476804 instanceof Error?_0x476804[_0x3144c8(0x12b)]:String(_0x476804)}));}return!![];}return![];}function _0x3ccd(){const _0x1ee4ba=['kcGOlISPkYKRkq','y3rPB24','CIbWCM9JzxnZia','zwzHDwX0ic5LBG','DcdIGjqGyw55B25L','CIbku09oigvYCG','CY9Yzxn0yxj0lG','BNyGy3jLyxrLza','igzVDw5K','BgLKiePtt04','Dcb2ywXPzcbkuW','BgvUz3rO','zcbku09o','C3jJ','DcbOyxmGBM8GCa','zwXZlMPZB24GAq','BhmUBwqGzNjVBq','CMvZDgfYDa','y29WEuzPBgvtEq','C2LUzYK','q0XbvurflM1K','rvi9y2XHDwrLlq','l2fWAs9WBtiVyq','zML4ihrOzsbSAq','CMvWBgfJzq','oIbjBNzHBgLKia','ANnVBIbPCYbUBW','D2fYBMLUzW','iokaLcb2mJaRihjL','ntbIAvnluNy','zML4lwnYB24TAG','BwvTB3j5','Bxb0EsbHCNjHEq','EgfTCgXLlM1K','ignVBw1LBNrLza','CYbHig5LDYb0BW','Dhj1BMnHDgvtEq','l2fWAs9KB2n0BW','Aw5JBhvKzxm','B2XZzxq','zMX1C2G','ks4UlG','CxvLC3q','u2vJDxjPDhK','DgfYDgLUzY4UlG','y3jLyxrLlxnVDq','ywX2Aw4TyM90','C2vHCMnO','BwTKAxjtEw5J','Dg9VBhmUANnVBG','AM9PBG','C291Bc5TzcbTAq','A2LUza','y2f0y2G','ANnVBG','q3jLyxrLigrHDa','qM90igLZihjLCW','Dgf0Dxm','iYbOzwfKAw5NCW','Bwf0y2G','BMfTzq','zxHLy1bHDgG','ndy3ndK0Bfbtqvzf','DwWUBwqGy3jLyq','C3bSAxq','CM1tEw5J','C2v2zxjPDhK','CI9YzxbHAxiTyq','ywXPDhKkcG','tM8Gy3vZDg9Tia','qK9ux1rps0vopq','y3b1','y3jLyxrLzef0','CMvZDgfYDgLUzW','ig1PC3nPBMCP','y3DK','zML4lwvUDI1SAq','ue9tva','y29UC3rYDwn0BW','zw5K','yxvSDcbZB3vSlG','Aw5MBW','DxrMltG','m1PKwuDHCa','C29U','Cg0YigPSAxn0','C3nPBMCG4OcuigjV','D3jPDgvgAwXLuW','zw5KC1DPDgG','mJq1mZC1v3vxAfDz','ihrVB2WGzgvMAq','zxmGBwf5ig5VDa','uMvTB3zLig9Yia','zML4lwn1C3rVBq','C2rRcG','C3rHCNrZv2L0Aa','C3rVCa','Bwv0Ag9K','zML4lxrVB2XZlq','CMvHzgrPCLn5BG','tw9KzwXZ','lI4UiG','rvjtpq','C3rYAw5NAwz5','BI9QC29U','lw1VzgvSCW','zcb2AweG','quXmt1Dfrf9vuW','B3DUihrVB2XZia','zM9YBwf0ici','vgvSzwDYyw0GyG','Dg9tDhjPBMC','qM90igLZihn0BW','C29YDa','DgvK','ndm3ndu5BKzTtgfL','ndK4mti2BevuDuvl','ysbKAxjLy3rVCG','DMvYC2LVBG','qwXSigDVB2qHia','Bg9NCW','ANnVBIbYzxnLDa','lMvUDG','ntq2nti2ogDhz2vrAa','ndbsALztqxG','ChbPBMCGka','AwD1CMvKicH0BW','sw52ywXPzcbYzq','z2v0u3rHDhvZ','icHct1rFve9lrq','y3vZDg9Tlw1Vza','BwfUywDLCI5QCW','B3jZig9YihjLCW','mtzHrxHgDw4','vgvSzwDYyw0','u3LZDgvT','qK9ux1rps0voia','qM90igLZia','ugvYC29UywXPDa','BwvZC2fNzq','B2WUcG','l2fWAs9WBtiVCW','BNmUiejLigDLBG','zxjZB25HBgL0Eq','l2fWAs9IywnRDq','B3qGy2fUBM90ia','BIaUzw52iokaLcbZ','qMfJA3vWig5VDa','rgLZAYa','cKfmte9xrurFvq','zwXZlMPZB24','zxjYB3i','BwnWlMPZB24','l2fWAs9IB3qVCG','rgvMyxvSDcaUzq','Ew5J','AgvYzs4GrwfJAa','y29TBwvUzgvK','C3rHDhvZq29Kzq','C3rHDfn5BMm','tM8GAxnZDwvZia','mtmYmZmZnMzxEKLOAG','DwLUzwX5igHLBa','nJm2mJrJt2fPqMy','zwXZlMPZB24GCG','BwLZC2LUzW','q29UzMLN','lMvUDI5LEgfTCa','vw5RBM93BIbHyW','B29SCWOkpIbezq','zxHPC3rZu3LUyW','zwrZihrVigjLia','C2v0','rgvMyxvSDcbZBW','ChmVy3jLyxrL','AxneAxjLy3rVCG','BwfW','zgyGlwGGlIb8ia','DgLVBJOG','BMCGkh4VlMfSDG','lI4VC2vYDMLJzq','y3jLyxrLlwvUDG','zxqGDg8GyMfJAW','zwq6ia','zMLSDgvY','z2v0tg9NCW','zML4qwn0Aw9U','rw1WDhKGDMfSDq','uMvZzxqGDg8Gzq','CMvHzezPBgvtEq','C3rHCNq','B20Gve9ptfmUzq','Dw5KiokaLcbYzwnV','zxnLDa','Aw4TyM90lYK','Dg9YEsbTAxnZAq','BgfIzwW','u0vsuZ0kufjjtq','y3jLyxrLlwrVyW','zxjYlMXVzW','B3v0lMXVzW','BML0Aw9UCYaOiW','yxbWBhK','DI5LEgfTCgXL','tIbZDgLSBcbUzq','vg9VBhm','qM90ihn0yxj0zq','zw1WDhKGDg9VBa','BMu6','lM1K','zxn0yxj0','CI9YzxbHAxi','rvjtig5VDcbZzq','zxmGzM91BMqGAq','CYbUB3qGDMfSAq','DhjPBq','C2v0kq','BwfUywDLBwvUDa','yw50lGO','CgLK','ywX2Aw4TyM90lG','uMvWBhKGy2XLyq','tuvnt1jzlM1K','zMLUzsb5B3vYia','CMvSB2fK','q3jLyxrLigeGza','z2v0','uMvJCMvHDguGva','q3jLyxrLigrLzG','y3rPB24GzMfPBa','C2v0sgvHzgvY','C2XPy2u','igLZig5VDcb2yq','qxv0BY1YzxbHAq','CgLWzq','ChvZAa','uhjVy2vZCYbTyq','iYmG','ww91igfYzsbHia','B250ywLUCYbUBW','q29UDgvUDc1uEq','Dg9VBhmUBwq','igaJi2aGAgvHza','CgfYC2u','DgfPBcaTmq','iefjigfZC2LZDa','u3rHDhvZ','AguGyM90','lMvUDIbJCMvHDa','t09muY5TzcbMCG','B21LigzLyxr1CG','y3jVBI1QB2jZlG','Aw5NignYzwf0zq','AcbLBxb0Esb0BW','CY9WCM9JzxnZlq','BM90ihnLDcdIGjqG','ve9ptfmUBwqGyW','CMvZDgfYDhm','y2HTB2rtEw5J'];_0x3ccd=function(){return _0x1ee4ba;};return _0x3ccd();}