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/init-data-dir.js
CHANGED
|
@@ -1,98 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Data Directory Bootstrap — Ensures ~/.alvin-bot/ exists with all required structure.
|
|
3
|
-
*
|
|
4
|
-
* Called as the very first thing at bot startup, before any service imports.
|
|
5
|
-
* Idempotent — safe to call multiple times.
|
|
6
|
-
*/
|
|
7
|
-
import fs from "fs";
|
|
8
|
-
import { DATA_DIR, MEMORY_DIR, USERS_DIR, RUNTIME_DIR, WHATSAPP_AUTH, BACKUP_DIR, SOUL_FILE, TOOLS_MD, TOOLS_JSON, CRON_FILE, MCP_CONFIG, FALLBACK_FILE, CUSTOM_MODELS, WA_GROUPS, SOUL_EXAMPLE, TOOLS_EXAMPLE_MD, TOOLS_EXAMPLE_JSON, WA_MEDIA_DIR, DELIVERY_QUEUE_FILE, AGENTS_FILE, HOOKS_DIR, USER_SKILLS_DIR, APPROVED_USERS_FILE } from "./paths.js";
|
|
9
|
-
/**
|
|
10
|
-
* Create the directory structure only (no file seeding).
|
|
11
|
-
* Must run BEFORE migration so directories exist for copying.
|
|
12
|
-
*
|
|
13
|
-
* M5: DATA_DIR is created with mode 0700 (owner-only traverse) so that
|
|
14
|
-
* even before the per-file chmod audit runs, any file written by the bot
|
|
15
|
-
* is not accessible by other users on multi-user systems. On Windows,
|
|
16
|
-
* chmod is a no-op — we skip it silently to avoid alarming log output,
|
|
17
|
-
* mirroring how the file-permissions audit handles win32.
|
|
18
|
-
*/
|
|
19
|
-
export function ensureDataDirs() {
|
|
20
|
-
const dirs = [
|
|
21
|
-
DATA_DIR,
|
|
22
|
-
MEMORY_DIR,
|
|
23
|
-
USERS_DIR,
|
|
24
|
-
RUNTIME_DIR,
|
|
25
|
-
WHATSAPP_AUTH,
|
|
26
|
-
WA_MEDIA_DIR,
|
|
27
|
-
BACKUP_DIR,
|
|
28
|
-
HOOKS_DIR,
|
|
29
|
-
USER_SKILLS_DIR,
|
|
30
|
-
];
|
|
31
|
-
for (const dir of dirs) {
|
|
32
|
-
if (!fs.existsSync(dir)) {
|
|
33
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
// M5: Ensure the DATA_DIR itself is 0700 (owner-only). New dirs are
|
|
37
|
-
// created without an explicit mode above (inherits umask), so we chmod
|
|
38
|
-
// after creation. Windows doesn't support POSIX modes — skip silently.
|
|
39
|
-
if (process.platform !== "win32") {
|
|
40
|
-
try {
|
|
41
|
-
fs.chmodSync(DATA_DIR, 0o700);
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// Best-effort — some network filesystems may not support chmod
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Seed default files for a fresh install (only if they don't exist yet).
|
|
50
|
-
* Must run AFTER migration so legacy data takes priority over templates.
|
|
51
|
-
*/
|
|
52
|
-
export function seedDefaults() {
|
|
53
|
-
// SOUL.md — copy from example template if available
|
|
54
|
-
if (!fs.existsSync(SOUL_FILE)) {
|
|
55
|
-
if (fs.existsSync(SOUL_EXAMPLE)) {
|
|
56
|
-
fs.copyFileSync(SOUL_EXAMPLE, SOUL_FILE);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
fs.writeFileSync(SOUL_FILE, "# Bot Personality\n\nYou are a direct, lightly sarcastic, and genuinely helpful AI assistant.\nYou have opinions, you verify your work, and you don't pad answers with filler.\nMirror the user's language naturally.\n");
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// TOOLS.md — copy from example template if available
|
|
63
|
-
if (!fs.existsSync(TOOLS_MD)) {
|
|
64
|
-
if (fs.existsSync(TOOLS_EXAMPLE_MD)) {
|
|
65
|
-
fs.copyFileSync(TOOLS_EXAMPLE_MD, TOOLS_MD);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// tools.json (legacy) — copy from example if available
|
|
69
|
-
if (!fs.existsSync(TOOLS_JSON)) {
|
|
70
|
-
if (fs.existsSync(TOOLS_EXAMPLE_JSON)) {
|
|
71
|
-
fs.copyFileSync(TOOLS_EXAMPLE_JSON, TOOLS_JSON);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Empty JSON defaults
|
|
75
|
-
const jsonDefaults = [
|
|
76
|
-
[CRON_FILE, "[]"],
|
|
77
|
-
[DELIVERY_QUEUE_FILE, "[]"],
|
|
78
|
-
[CUSTOM_MODELS, "[]"],
|
|
79
|
-
[APPROVED_USERS_FILE, "[]"],
|
|
80
|
-
[WA_GROUPS, '{"groups":[]}'],
|
|
81
|
-
[FALLBACK_FILE, ""], // Empty = use env defaults
|
|
82
|
-
[MCP_CONFIG, ""], // Empty = no MCP servers
|
|
83
|
-
];
|
|
84
|
-
for (const [file, defaultContent] of jsonDefaults) {
|
|
85
|
-
if (!fs.existsSync(file) && defaultContent) {
|
|
86
|
-
fs.writeFileSync(file, defaultContent);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// MEMORY.md — seed with empty template
|
|
90
|
-
const memoryFile = `${MEMORY_DIR}/MEMORY.md`;
|
|
91
|
-
if (!fs.existsSync(memoryFile)) {
|
|
92
|
-
fs.writeFileSync(memoryFile, "# Long-term Memory\n\n> This file is your agent's long-term memory. Add important context here.\n");
|
|
93
|
-
}
|
|
94
|
-
// AGENTS.md — seed with default standing orders template
|
|
95
|
-
if (!fs.existsSync(AGENTS_FILE)) {
|
|
96
|
-
fs.writeFileSync(AGENTS_FILE, "# Standing Orders\n\n> Permanent instructions that apply to every session.\n> Edit this file to add rules, workflows, or recurring tasks.\n");
|
|
97
|
-
}
|
|
98
|
-
}
|
|
1
|
+
(function(_0x20bc8a,_0x4fcae4){const _0x3fe410=_0x4d84,_0x27544=_0x4d84,_0x363ef1=_0x20bc8a();while(!![]){try{const _0x469ba4=-parseInt(_0x3fe410(0x166))/(0x1a4a+-0xa*-0x22f+-0x301f)+parseInt(_0x27544(0x178))/(0x19b4+0x24ee+-0x3ea0)*(-parseInt(_0x27544(0x172))/(-0xd68*-0x2+0x1b20+0xfb*-0x37))+parseInt(_0x27544(0x179))/(-0x3*0x6e7+-0x460+0x5*0x505)*(parseInt(_0x3fe410(0x168))/(-0x2b3*-0x7+-0x1cc*-0x15+-0x389c))+-parseInt(_0x27544(0x15c))/(-0x1ed7*-0x1+-0x2e0*-0xc+-0x4151)+-parseInt(_0x27544(0x15a))/(-0x1a11+-0xa*0x35+-0x1*-0x1c2a)+parseInt(_0x27544(0x15f))/(-0x7bb*0x5+0x22f4+0x3bb)*(parseInt(_0x3fe410(0x14a))/(-0x2*-0x1156+0x1*-0x60e+-0x1c95))+parseInt(_0x27544(0x170))/(0x19cc+0x1891+-0x3253)*(parseInt(_0x3fe410(0x14f))/(-0x1590+0x14ad+0xee));if(_0x469ba4===_0x4fcae4)break;else _0x363ef1['push'](_0x363ef1['shift']());}catch(_0x3bb1f4){_0x363ef1['push'](_0x363ef1['shift']());}}}(_0x5e67,-0x5*0x25877+0x36a23+0xfdc48));const _0x584cb7=(function(){let _0x1de238=!![];return function(_0x1363c9,_0xca702c){const _0x4e4c13=_0x1de238?function(){const _0x2d345e=_0x4d84;if(_0xca702c){const _0x1b6726=_0xca702c[_0x2d345e(0x17d)](_0x1363c9,arguments);return _0xca702c=null,_0x1b6726;}}:function(){};return _0x1de238=![],_0x4e4c13;};}()),_0x5f0ba8=_0x584cb7(this,function(){const _0x482524=_0x4d84,_0x324b05=_0x4d84;return _0x5f0ba8[_0x482524(0x177)]()[_0x324b05(0x149)](_0x324b05(0x159)+'+$')[_0x324b05(0x177)]()[_0x324b05(0x150)+'r'](_0x5f0ba8)[_0x482524(0x149)](_0x482524(0x159)+'+$');});_0x5f0ba8();import _0x310591 from'fs';import{DATA_DIR,MEMORY_DIR,USERS_DIR,RUNTIME_DIR,WHATSAPP_AUTH,BACKUP_DIR,SOUL_FILE,TOOLS_MD,TOOLS_JSON,CRON_FILE,MCP_CONFIG,FALLBACK_FILE,CUSTOM_MODELS,WA_GROUPS,SOUL_EXAMPLE,TOOLS_EXAMPLE_MD,TOOLS_EXAMPLE_JSON,WA_MEDIA_DIR,DELIVERY_QUEUE_FILE,AGENTS_FILE,HOOKS_DIR,USER_SKILLS_DIR,APPROVED_USERS_FILE}from'./paths.js';function _0x4d84(_0x83533,_0x5a59ed){_0x83533=_0x83533-(0x6a+0x125d*0x2+0x89*-0x43);const _0x354e3c=_0x5e67();let _0x1768a8=_0x354e3c[_0x83533];if(_0x4d84['fRgRQV']===undefined){var _0x1974d2=function(_0x589d3c){const _0x2afc10='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x31865a='',_0x306ca4='',_0x249033=_0x31865a+_0x1974d2;for(let _0x4f2c5e=0x3bd+0x161a+0x9*-0x2df,_0x4dac55,_0x21689c,_0x29571f=-0x1e50+-0x1cd*0x4+0x2584;_0x21689c=_0x589d3c['charAt'](_0x29571f++);~_0x21689c&&(_0x4dac55=_0x4f2c5e%(0x118+-0xe96+-0x1a*-0x85)?_0x4dac55*(0x5ec+-0x17d1+0x1225)+_0x21689c:_0x21689c,_0x4f2c5e++%(0x43c+-0x4cf+-0x1*-0x97))?_0x31865a+=_0x249033['charCodeAt'](_0x29571f+(-0x34e+0x11*0x142+0x120a*-0x1))-(0xc2d*-0x3+0x2b9*-0xa+0x3fcb*0x1)!==0x5b*-0x22+0x173*0x1+0xaa3?String['fromCharCode'](0x19d1+-0x33b*-0x2+0x1c*-0x11e&_0x4dac55>>(-(0x72f+0x1*-0x6e9+0x2*-0x22)*_0x4f2c5e&-0x1871+0x2ce*-0x4+0x519*0x7)):_0x4f2c5e:-0x3f3+-0xf31*-0x1+-0xb3e){_0x21689c=_0x2afc10['indexOf'](_0x21689c);}for(let _0xb2f2cf=0x1a74+-0x557*0x5+0x3f,_0x155ec2=_0x31865a['length'];_0xb2f2cf<_0x155ec2;_0xb2f2cf++){_0x306ca4+='%'+('00'+_0x31865a['charCodeAt'](_0xb2f2cf)['toString'](0x8*0xb+0x1326+-0x2*0x9b7))['slice'](-(0x39e*-0x8+-0x132f+-0x14d*-0x25));}return decodeURIComponent(_0x306ca4);};_0x4d84['MFLBWw']=_0x1974d2,_0x4d84['SRGixm']={},_0x4d84['fRgRQV']=!![];}const _0xc5e55a=_0x354e3c[0x62a+-0x571*0x1+-0x1*0xb9],_0x5a01da=_0x83533+_0xc5e55a,_0x284c6b=_0x4d84['SRGixm'][_0x5a01da];if(!_0x284c6b){const _0x48ebf9=function(_0xbe1e6e){this['raMJBf']=_0xbe1e6e,this['tIrVGy']=[0xdb*0x17+-0x3b9*0x6+-0x2*-0x155,-0x31*0x2f+0x19b4+-0x10b5,-0xd68*-0x2+0x1b20+0x35f*-0x10],this['SAEQfu']=function(){return'newState';},this['HHRhFe']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['WFzFdG']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x48ebf9['prototype']['cPTaKO']=function(){const _0x13478a=new RegExp(this['HHRhFe']+this['WFzFdG']),_0x17cdcc=_0x13478a['test'](this['SAEQfu']['toString']())?--this['tIrVGy'][-0x3*0x6e7+-0x460+0x13*0x152]:--this['tIrVGy'][-0x2b3*-0x7+-0x1cc*-0x15+-0x38a1];return this['WUNXGx'](_0x17cdcc);},_0x48ebf9['prototype']['WUNXGx']=function(_0xaa4cee){if(!Boolean(~_0xaa4cee))return _0xaa4cee;return this['hsFTXo'](this['raMJBf']);},_0x48ebf9['prototype']['hsFTXo']=function(_0x3a7963){for(let _0x324823=-0x1ed7*-0x1+-0x2e0*-0xc+-0x4157,_0x1eee62=this['tIrVGy']['length'];_0x324823<_0x1eee62;_0x324823++){this['tIrVGy']['push'](Math['round'](Math['random']())),_0x1eee62=this['tIrVGy']['length'];}return _0x3a7963(this['tIrVGy'][-0x1a11+-0xa*0x35+-0x1*-0x1c23]);},new _0x48ebf9(_0x4d84)['cPTaKO'](),_0x1768a8=_0x4d84['MFLBWw'](_0x1768a8),_0x4d84['SRGixm'][_0x5a01da]=_0x1768a8;}else _0x1768a8=_0x284c6b;return _0x1768a8;}function _0x5e67(){const _0x1d6c62=['CMuUcG','D3jPDgvgAwXLuW','mJe2nJeWnefnqKT6vq','C3rPyYWGyw5Kia','iYbtDgfUzgLUzW','ChbSEsb0BYbLDG','AxrOigzPBgXLCG','D2LUmZi','Ew5J','otuYndCXrLLYquHo','BgfUz3vHz2uGBG','nxn4rLflvG','C2TZlGO','igfZC2LZDgfUDa','w119','igrVBID0ihbHza','y29WEuzPBgvtEq','ywDLBNqNCYbSBW','z2vUDwLUzwX5ia','odGWndm5mfzQrxD4ta','lGPzB3uGAgf2zq','mJyZnJu4wgXxsuv2','iYbcB3qGugvYCW','zxHPC3rZu3LUyW','ihLVDsb2zxjPzG','ie9YzgvYCWOkpG','Dg9tDhjPBMC','nLbwz1jfDa','mJqXmZy1mNbkrfPhAG','BMCTDgvYBsbTzq','yxr1CMfSBhKUcG','AguGDxnLCIDZia','yxbWBhK','l01ftu9sws5Tza','AgvSCgz1Bcbbsq','Esb5B3vYihDVCG','C2vHCMnO','mtH1z25ruwm','Bw9YEs4GqwrKia','B3uGyxjLigeGza','AxjLy3qSigXPzW','BI4kpIbfzgL0ia','mtfMsxLoBeS','y29UC3rYDwn0BW','zxj5ihnLC3nPBW','Bsbnzw1VCNKkcG','DgHPCYbMAwXLia','zsbPCYb5B3vYia','zxmSihDVCMTMBa','Aw1WB3j0yw50ia','y3vYCMLUzYb0yq','B25HBgL0EqOkwq','kcGOlISPkYKRkq','ntG2mdGYuMLTrMH3','Dg8GywrKihj1Ba','mtm4ntq0mNHlBK1JBW'];_0x5e67=function(){return _0x1d6c62;};return _0x5e67();}export function ensureDataDirs(){const _0x4eca7e=_0x4d84,_0x275975=_0x4d84,_0x36ea2d=[DATA_DIR,MEMORY_DIR,USERS_DIR,RUNTIME_DIR,WHATSAPP_AUTH,WA_MEDIA_DIR,BACKUP_DIR,HOOKS_DIR,USER_SKILLS_DIR];for(const _0x129e33 of _0x36ea2d){!_0x310591[_0x4eca7e(0x174)](_0x129e33)&&_0x310591['mkdirSync'](_0x129e33,{'recursive':!![]});}if(process['platform']!==_0x4eca7e(0x164))try{_0x310591['chmodSync'](DATA_DIR,-0x1e50+-0x1cd*0x4+0x2744);}catch{}}export function seedDefaults(){const _0x56e975=_0x4d84,_0x4dcbcd=_0x4d84;!_0x310591[_0x56e975(0x174)](SOUL_FILE)&&(_0x310591[_0x4dcbcd(0x174)](SOUL_EXAMPLE)?_0x310591['copyFileSy'+'nc'](SOUL_EXAMPLE,SOUL_FILE):_0x310591[_0x56e975(0x15e)+'ync'](SOUL_FILE,_0x56e975(0x173)+_0x4dcbcd(0x158)+_0x56e975(0x14c)+_0x4dcbcd(0x14d)+'htly\x20sarca'+_0x56e975(0x160)+_0x4dcbcd(0x16f)+_0x4dcbcd(0x17f)+_0x4dcbcd(0x16a)+_0x4dcbcd(0x171)+'\x20opinions,'+_0x56e975(0x175)+_0x56e975(0x180)+'k,\x20and\x20you'+_0x4dcbcd(0x16c)+'\x20answers\x20w'+_0x4dcbcd(0x163)+'.\x0aMirror\x20t'+_0x4dcbcd(0x17c)+_0x4dcbcd(0x167)+_0x56e975(0x17b)));!_0x310591[_0x4dcbcd(0x174)](TOOLS_MD)&&(_0x310591['existsSync'](TOOLS_EXAMPLE_MD)&&_0x310591[_0x4dcbcd(0x16d)+'nc'](TOOLS_EXAMPLE_MD,TOOLS_MD));!_0x310591[_0x4dcbcd(0x174)](TOOLS_JSON)&&(_0x310591[_0x56e975(0x174)](TOOLS_EXAMPLE_JSON)&&_0x310591[_0x56e975(0x16d)+'nc'](TOOLS_EXAMPLE_JSON,TOOLS_JSON));const _0x27c488=[[CRON_FILE,'[]'],[DELIVERY_QUEUE_FILE,'[]'],[CUSTOM_MODELS,'[]'],[APPROVED_USERS_FILE,'[]'],[WA_GROUPS,'{\x22groups\x22:'+_0x4dcbcd(0x16b)],[FALLBACK_FILE,''],[MCP_CONFIG,'']];for(const [_0x6efe11,_0x34dacf]of _0x27c488){!_0x310591['existsSync'](_0x6efe11)&&_0x34dacf&&_0x310591[_0x4dcbcd(0x15e)+_0x56e975(0x165)](_0x6efe11,_0x34dacf);}const _0xef02eb=MEMORY_DIR+_0x56e975(0x17e);!_0x310591[_0x4dcbcd(0x174)](_0xef02eb)&&_0x310591[_0x4dcbcd(0x15e)+_0x4dcbcd(0x165)](_0xef02eb,'#\x20Long-ter'+_0x56e975(0x152)+'>\x20This\x20fil'+_0x4dcbcd(0x154)+_0x56e975(0x16e)+_0x4dcbcd(0x17a)+_0x4dcbcd(0x14b)+_0x4dcbcd(0x156)+'context\x20he'+_0x4dcbcd(0x15d)),!_0x310591['existsSync'](AGENTS_FILE)&&_0x310591[_0x4dcbcd(0x15e)+_0x56e975(0x165)](AGENTS_FILE,_0x56e975(0x161)+_0x4dcbcd(0x176)+'\x20Permanent'+'\x20instructi'+'ons\x20that\x20a'+_0x4dcbcd(0x162)+_0x56e975(0x151)+_0x4dcbcd(0x14e)+_0x56e975(0x153)+_0x4dcbcd(0x15b)+_0x4dcbcd(0x155)+'ows,\x20or\x20re'+_0x4dcbcd(0x157)+_0x56e975(0x169));}
|
package/dist/middleware/auth.js
CHANGED
|
@@ -1,233 +1 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import crypto from "crypto";
|
|
3
|
-
import { InlineKeyboard } from "grammy";
|
|
4
|
-
import { config } from "../config.js";
|
|
5
|
-
import { APPROVED_USERS_FILE } from "../paths.js";
|
|
6
|
-
import { getGroupStatus, registerGroup, trackGroupMessage, } from "../services/access.js";
|
|
7
|
-
/**
|
|
8
|
-
* Auth + Group Chat + Access Control middleware.
|
|
9
|
-
*
|
|
10
|
-
* Security model:
|
|
11
|
-
* - DMs: controlled by AUTH_MODE env var
|
|
12
|
-
* - "allowlist" (default): only ALLOWED_USERS can interact
|
|
13
|
-
* - "pairing": unknown users get a 6-digit code, admin must approve
|
|
14
|
-
* - "open": all DMs allowed
|
|
15
|
-
* - Groups: must be approved by admin + only respond to @mentions/replies
|
|
16
|
-
* - New groups: sends approval request to admin, stays silent until approved
|
|
17
|
-
* - Blocked groups: completely ignored
|
|
18
|
-
* - Forwarded messages: can be disabled globally
|
|
19
|
-
*/
|
|
20
|
-
// ── Approved Users (persistent, for pairing mode) ──────────────────
|
|
21
|
-
function loadApprovedUsers() {
|
|
22
|
-
try {
|
|
23
|
-
const raw = fs.readFileSync(APPROVED_USERS_FILE, "utf-8");
|
|
24
|
-
const parsed = JSON.parse(raw);
|
|
25
|
-
return Array.isArray(parsed) ? parsed.map(Number).filter(Boolean) : [];
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function saveApprovedUsers(ids) {
|
|
32
|
-
fs.writeFileSync(APPROVED_USERS_FILE, JSON.stringify(ids, null, 2));
|
|
33
|
-
}
|
|
34
|
-
export function addApprovedUser(userId) {
|
|
35
|
-
const current = loadApprovedUsers();
|
|
36
|
-
if (!current.includes(userId)) {
|
|
37
|
-
current.push(userId);
|
|
38
|
-
saveApprovedUsers(current);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
export function isApprovedUser(userId) {
|
|
42
|
-
return loadApprovedUsers().includes(userId);
|
|
43
|
-
}
|
|
44
|
-
const MAX_PENDING = 3;
|
|
45
|
-
const pendingPairings = new Map(); // code → pairing
|
|
46
|
-
function generateCode() {
|
|
47
|
-
return String(crypto.randomInt(100000, 1000000));
|
|
48
|
-
}
|
|
49
|
-
function cleanExpired() {
|
|
50
|
-
const now = Date.now();
|
|
51
|
-
for (const [code, pairing] of pendingPairings.entries()) {
|
|
52
|
-
if (pairing.expiresAt <= now) {
|
|
53
|
-
pendingPairings.delete(code);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/** Get a pending pairing by code. Returns undefined if not found or expired. */
|
|
58
|
-
export function getPendingPairing(code) {
|
|
59
|
-
const pairing = pendingPairings.get(code);
|
|
60
|
-
if (!pairing)
|
|
61
|
-
return undefined;
|
|
62
|
-
if (pairing.expiresAt <= Date.now()) {
|
|
63
|
-
pendingPairings.delete(code);
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
return pairing;
|
|
67
|
-
}
|
|
68
|
-
/** Remove a pending pairing by code. */
|
|
69
|
-
export function removePendingPairing(code) {
|
|
70
|
-
const pairing = pendingPairings.get(code);
|
|
71
|
-
pendingPairings.delete(code);
|
|
72
|
-
return pairing;
|
|
73
|
-
}
|
|
74
|
-
// ── Middleware ───────────────────────────────────────────────────────
|
|
75
|
-
export async function authMiddleware(ctx, next) {
|
|
76
|
-
const userId = ctx.from?.id;
|
|
77
|
-
const chatType = ctx.chat?.type;
|
|
78
|
-
const isGroup = chatType === "group" || chatType === "supergroup";
|
|
79
|
-
// ── DM Auth ─────────────────────────────────────
|
|
80
|
-
if (chatType === "private") {
|
|
81
|
-
// "open" mode: allow everyone
|
|
82
|
-
if (config.authMode === "open") {
|
|
83
|
-
await next();
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
// Always allow configured users
|
|
87
|
-
if (userId && config.allowedUsers.includes(userId)) {
|
|
88
|
-
await next();
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
// "pairing" mode: unknown users go through code-based approval
|
|
92
|
-
if (config.authMode === "pairing" && userId) {
|
|
93
|
-
// Already approved via pairing?
|
|
94
|
-
if (isApprovedUser(userId)) {
|
|
95
|
-
await next();
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// Check if user already has a pending pairing (avoid duplicate codes)
|
|
99
|
-
cleanExpired();
|
|
100
|
-
const existingEntry = [...pendingPairings.values()].find(p => p.userId === userId);
|
|
101
|
-
if (existingEntry) {
|
|
102
|
-
await ctx.reply(`Your approval request is still pending.\n\nYour code: \`${existingEntry.code}\`\n\nAsk the bot admin to approve it.`, { parse_mode: "Markdown" });
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
// Enforce max pending limit
|
|
106
|
-
if (pendingPairings.size >= MAX_PENDING) {
|
|
107
|
-
await ctx.reply("The approval queue is currently full. Please try again later.");
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
// Generate pairing code
|
|
111
|
-
const code = generateCode();
|
|
112
|
-
const pairing = {
|
|
113
|
-
userId,
|
|
114
|
-
username: ctx.from?.username,
|
|
115
|
-
code,
|
|
116
|
-
expiresAt: Date.now() + 3_600_000, // 1 hour
|
|
117
|
-
};
|
|
118
|
-
pendingPairings.set(code, pairing);
|
|
119
|
-
// Tell user their code
|
|
120
|
-
await ctx.reply(`Hi! I need admin approval before we can chat.\n\nSend this code to the bot admin: \`${code}\``, { parse_mode: "Markdown" });
|
|
121
|
-
// Notify admin with approve/deny inline keyboard
|
|
122
|
-
const adminId = config.allowedUsers[0];
|
|
123
|
-
if (adminId) {
|
|
124
|
-
const keyboard = new InlineKeyboard()
|
|
125
|
-
.text("✅ Approve", `pair:approve:${code}`)
|
|
126
|
-
.text("❌ Deny", `pair:deny:${code}`);
|
|
127
|
-
const userTag = pairing.username ? `@${pairing.username}` : `ID ${userId}`;
|
|
128
|
-
try {
|
|
129
|
-
await ctx.api.sendMessage(adminId, `🔔 *New DM Pairing Request*\n\n` +
|
|
130
|
-
`*User:* ${userTag}\n` +
|
|
131
|
-
`*User ID:* \`${userId}\`\n` +
|
|
132
|
-
`*Code:* \`${code}\`\n\n` +
|
|
133
|
-
`Approve this user to chat with the bot?`, { parse_mode: "Markdown", reply_markup: keyboard });
|
|
134
|
-
}
|
|
135
|
-
catch (err) {
|
|
136
|
-
console.error("Failed to send pairing approval request:", err);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
// Default "allowlist" mode (or pairing mode but no userId)
|
|
142
|
-
console.log(`Unauthorized DM attempt from user ID: ${userId || "unknown"} (username: ${ctx.from?.username || "none"})`);
|
|
143
|
-
await ctx.reply(`Hi! I'm not set up to chat with you yet.\n\nAsk my admin to add your user ID: ${userId || "unknown"}`);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
// ── Group Access Control ────────────────────────
|
|
147
|
-
if (isGroup) {
|
|
148
|
-
const chatId = ctx.chat.id;
|
|
149
|
-
const chatTitle = ctx.chat && "title" in ctx.chat ? ctx.chat.title || "Unknown" : "Unknown";
|
|
150
|
-
// Check group approval status
|
|
151
|
-
const status = getGroupStatus(chatId);
|
|
152
|
-
if (status === "blocked") {
|
|
153
|
-
return; // Completely ignore blocked groups
|
|
154
|
-
}
|
|
155
|
-
if (status === "new") {
|
|
156
|
-
// Register and request approval from admin
|
|
157
|
-
registerGroup(chatId, chatTitle, userId);
|
|
158
|
-
// Notify the first allowed user (admin) about the new group
|
|
159
|
-
const adminId = config.allowedUsers[0];
|
|
160
|
-
if (adminId) {
|
|
161
|
-
const keyboard = new InlineKeyboard()
|
|
162
|
-
.text("✅ Approve", `access:approve:${chatId}`)
|
|
163
|
-
.text("❌ Block", `access:block:${chatId}`);
|
|
164
|
-
try {
|
|
165
|
-
await ctx.api.sendMessage(adminId, `🔔 *New group request*\n\n` +
|
|
166
|
-
`*Gruppe:* ${chatTitle}\n` +
|
|
167
|
-
`*Chat-ID:* \`${chatId}\`\n` +
|
|
168
|
-
`*Added by:* ${userId}\n\n` +
|
|
169
|
-
`Soll Alvin Bot in dieser Gruppe antworten?`, { parse_mode: "Markdown", reply_markup: keyboard });
|
|
170
|
-
}
|
|
171
|
-
catch (err) {
|
|
172
|
-
console.error("Failed to send group approval request:", err);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return; // Don't respond until approved
|
|
176
|
-
}
|
|
177
|
-
if (status === "pending") {
|
|
178
|
-
return; // Still waiting for approval
|
|
179
|
-
}
|
|
180
|
-
// status === "approved" — continue with group logic
|
|
181
|
-
// Only allowed users can trigger the bot in groups
|
|
182
|
-
if (!userId || !config.allowedUsers.includes(userId)) {
|
|
183
|
-
return; // Silently ignore unauthorized users
|
|
184
|
-
}
|
|
185
|
-
trackGroupMessage(chatId);
|
|
186
|
-
const message = ctx.message;
|
|
187
|
-
if (!message) {
|
|
188
|
-
await next(); // callback queries
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
// Commands always go through
|
|
192
|
-
if (message.text?.startsWith("/")) {
|
|
193
|
-
await next();
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
// Check if bot is mentioned
|
|
197
|
-
const botUsername = ctx.me?.username?.toLowerCase();
|
|
198
|
-
const text = message.text || message.caption || "";
|
|
199
|
-
if (botUsername && text.toLowerCase().includes(`@${botUsername}`)) {
|
|
200
|
-
if (message.text) {
|
|
201
|
-
message.text = message.text.replace(new RegExp(`@${botUsername}`, "gi"), "").trim();
|
|
202
|
-
}
|
|
203
|
-
await next();
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
// Check if replying to a bot message
|
|
207
|
-
if (message.reply_to_message?.from?.id === ctx.me?.id) {
|
|
208
|
-
await next();
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
// Otherwise: ignore in groups
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
// ── Callback queries (inline keyboards) ─────────
|
|
215
|
-
// Only allowedUsers may trigger admin action callbacks (approve/deny).
|
|
216
|
-
// Other callbacks (e.g. pairing-mode approved users) continue through.
|
|
217
|
-
if (userId && config.allowedUsers.includes(userId)) {
|
|
218
|
-
await next();
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
// Unknown users: silently drop admin-action callbacks to prevent
|
|
222
|
-
// approval forgery / self-approval. Non-admin callbacks from pairing-
|
|
223
|
-
// approved users in "pairing" mode are also gated here intentionally;
|
|
224
|
-
// the approve flow is an admin-only action.
|
|
225
|
-
const callbackData = ctx.callbackQuery?.data || "";
|
|
226
|
-
const isAdminCallback = /^(pair|access|wa):(approve|deny|block):/.test(callbackData);
|
|
227
|
-
if (isAdminCallback) {
|
|
228
|
-
// Silently drop — no answer (grammy will time-out the spinner client-side)
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
// Non-admin callbacks from unknown users: pass through (e.g. inline mode)
|
|
232
|
-
await next();
|
|
233
|
-
}
|
|
1
|
+
(function(_0x4fa65b,_0x5eab0e){const _0x51355b=_0x1d1c,_0x7c3a6c=_0x1d1c,_0x326f46=_0x4fa65b();while(!![]){try{const _0x541c83=-parseInt(_0x51355b(0x216))/(-0x9cb+-0x651+0x101d)+parseInt(_0x7c3a6c(0x21a))/(-0x1*-0x1b64+-0x24e6+-0xcb*-0xc)+parseInt(_0x51355b(0x1f6))/(0x1597+-0x8c2*0x2+0x34*-0x14)+-parseInt(_0x51355b(0x219))/(0x1e1*0x6+-0x1c*-0x95+-0x1b8e)*(-parseInt(_0x7c3a6c(0x237))/(0x9ee+-0x3*-0x5c6+0x1b3b*-0x1))+parseInt(_0x51355b(0x21b))/(-0x22d0+0x211c+0xd*0x22)*(parseInt(_0x7c3a6c(0x26c))/(0x2524+-0x2*0x884+-0x1415))+-parseInt(_0x7c3a6c(0x251))/(-0x1*-0x1f42+0xf2b*-0x2+-0xe4)+parseInt(_0x7c3a6c(0x268))/(0xcaa+0x1*-0x24ae+0x2f*0x83)*(-parseInt(_0x51355b(0x265))/(0x14f6+0x8de+-0x1dca));if(_0x541c83===_0x5eab0e)break;else _0x326f46['push'](_0x326f46['shift']());}catch(_0x774253){_0x326f46['push'](_0x326f46['shift']());}}}(_0x2633,0x1*-0x27e1f+-0x62311+0x2d7*0x45e));const _0x2eb3bc=(function(){let _0x1f9031=!![];return function(_0x27d5a1,_0x5b38d0){const _0x4a7961=_0x1f9031?function(){const _0x2a8ac5=_0x1d1c;if(_0x5b38d0){const _0x36450d=_0x5b38d0[_0x2a8ac5(0x25f)](_0x27d5a1,arguments);return _0x5b38d0=null,_0x36450d;}}:function(){};return _0x1f9031=![],_0x4a7961;};}()),_0x2345d4=_0x2eb3bc(this,function(){const _0x2396b7=_0x1d1c,_0x4b1fca=_0x1d1c;return _0x2345d4[_0x2396b7(0x246)]()[_0x2396b7(0x211)]('(((.+)+)+)'+'+$')['toString']()['constructo'+'r'](_0x2345d4)['search'](_0x2396b7(0x239)+'+$');});_0x2345d4();import _0x57eabe from'fs';import _0x59b37c from'crypto';import{InlineKeyboard}from'grammy';import{config}from'../config.js';function _0x1d1c(_0x51e3d1,_0x2effbb){_0x51e3d1=_0x51e3d1-(-0x1*-0x1529+-0x2297+0xf62);const _0xc49013=_0x2633();let _0x2f53c4=_0xc49013[_0x51e3d1];if(_0x1d1c['PQiuqF']===undefined){var _0x3d583d=function(_0x5766ee){const _0x58d686='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a44b8='',_0x2a14d0='',_0x454046=_0x1a44b8+_0x3d583d;for(let _0x72df33=-0xf38+0x5f8*-0x2+0x13c*0x16,_0x3325c2,_0x279dba,_0x1c3d50=-0x236*-0xf+0x2*-0xf74+0x121*-0x2;_0x279dba=_0x5766ee['charAt'](_0x1c3d50++);~_0x279dba&&(_0x3325c2=_0x72df33%(-0x2*-0xba1+-0x1*-0x5d8+0x22*-0xdb)?_0x3325c2*(0x1*-0x1a4d+0x1696+0x3f7)+_0x279dba:_0x279dba,_0x72df33++%(-0x2163+0x1052+0x1115))?_0x1a44b8+=_0x454046['charCodeAt'](_0x1c3d50+(-0x8b6+-0x4e5*-0x7+0x1983*-0x1))-(0x1b72+0x17*-0x1ab+0xaf5)!==0x8b4+0x2388*0x1+-0x13*0x254?String['fromCharCode'](0x20f6+0x226c+0xa5*-0x67&_0x3325c2>>(-(0xa*0x8a+-0x1*0x3f1+0x9*-0x29)*_0x72df33&-0xef8*0x2+-0x8e5+0x26db)):_0x72df33:0x2355+-0x7*-0x467+-0x4226){_0x279dba=_0x58d686['indexOf'](_0x279dba);}for(let _0x2b3cbc=0x335*-0xb+0x1464+0xee3*0x1,_0x4e9802=_0x1a44b8['length'];_0x2b3cbc<_0x4e9802;_0x2b3cbc++){_0x2a14d0+='%'+('00'+_0x1a44b8['charCodeAt'](_0x2b3cbc)['toString'](-0x9b2*0x3+-0x4*0x455+-0x7bf*-0x6))['slice'](-(-0x211*-0xb+0x1a76+0x1065*-0x3));}return decodeURIComponent(_0x2a14d0);};_0x1d1c['FtObkh']=_0x3d583d,_0x1d1c['bjqEDN']={},_0x1d1c['PQiuqF']=!![];}const _0x14e2ce=_0xc49013[0x81f+0x171f+-0x1f3e],_0x2ee674=_0x51e3d1+_0x14e2ce,_0x458907=_0x1d1c['bjqEDN'][_0x2ee674];if(!_0x458907){const _0xf68887=function(_0x1fd9fd){this['CDmbzu']=_0x1fd9fd,this['wnKOaO']=[-0x21a+0x1*0xb89+-0x96e,-0x1*-0x16+0xca9*0x3+0x2611*-0x1,0x103+0x269c+-0x279f],this['WPixNU']=function(){return'newState';},this['FqMqGf']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['VDTxph']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xf68887['prototype']['wcJiRt']=function(){const _0xb9c549=new RegExp(this['FqMqGf']+this['VDTxph']),_0x23bc74=_0xb9c549['test'](this['WPixNU']['toString']())?--this['wnKOaO'][-0x1d*-0x71+-0x260c+0x1940]:--this['wnKOaO'][-0xa7f*0x1+0x1*-0x699+0x1118];return this['yELJbK'](_0x23bc74);},_0xf68887['prototype']['yELJbK']=function(_0x27fa30){if(!Boolean(~_0x27fa30))return _0x27fa30;return this['gwbLgW'](this['CDmbzu']);},_0xf68887['prototype']['gwbLgW']=function(_0xc19254){for(let _0x111316=-0x102f*-0x2+-0x66f*0x2+-0x9c0*0x2,_0x2cd2d3=this['wnKOaO']['length'];_0x111316<_0x2cd2d3;_0x111316++){this['wnKOaO']['push'](Math['round'](Math['random']())),_0x2cd2d3=this['wnKOaO']['length'];}return _0xc19254(this['wnKOaO'][0x276+0x23b+-0x4b1*0x1]);},new _0xf68887(_0x1d1c)['wcJiRt'](),_0x2f53c4=_0x1d1c['FtObkh'](_0x2f53c4),_0x1d1c['bjqEDN'][_0x2ee674]=_0x2f53c4;}else _0x2f53c4=_0x458907;return _0x2f53c4;}import{APPROVED_USERS_FILE}from'../paths.js';import{getGroupStatus,registerGroup,trackGroupMessage}from'../services/access.js';function loadApprovedUsers(){const _0x412627=_0x1d1c,_0x224cef=_0x1d1c;try{const _0x2ae0e0=_0x57eabe['readFileSy'+'nc'](APPROVED_USERS_FILE,'utf-8'),_0x525b3e=JSON[_0x412627(0x263)](_0x2ae0e0);return Array[_0x412627(0x235)](_0x525b3e)?_0x525b3e[_0x224cef(0x226)](Number)[_0x224cef(0x209)](Boolean):[];}catch{return[];}}function saveApprovedUsers(_0x3cb215){const _0xd63fab=_0x1d1c,_0x59d02d=_0x1d1c;_0x57eabe[_0xd63fab(0x254)+'ync'](APPROVED_USERS_FILE,JSON[_0xd63fab(0x242)](_0x3cb215,null,-0x236*-0xf+0x2*-0xf74+0x60*-0x6));}export function addApprovedUser(_0x3be4d3){const _0x4652ec=_0x1d1c,_0x167319=_0x1d1c,_0x28853f=loadApprovedUsers();!_0x28853f[_0x4652ec(0x208)](_0x3be4d3)&&(_0x28853f[_0x4652ec(0x227)](_0x3be4d3),saveApprovedUsers(_0x28853f));}export function isApprovedUser(_0x462c01){const _0x2ceca3=_0x1d1c;return loadApprovedUsers()[_0x2ceca3(0x208)](_0x462c01);}const MAX_PENDING=-0x2*-0xba1+-0x1*-0x5d8+0xb*-0x2a5,pendingPairings=new Map();function generateCode(){const _0x555af5=_0x1d1c;return String(_0x59b37c[_0x555af5(0x1fb)](0x3*-0xaf57+0x1c3b5+0x1d0f0,-0x1a1558+0xcbff9+0x1c979f));}function _0x2633(){const _0x54fa7b=['DgL0Bgu','ywWGCxvLDwuGAq','CxvLC3qQcGO','y2HHDc4kcLnLBG','DMfSihjLCxvLCW','ihrVigfWChjVDG','CYbJDxjYzw50Ba','Bxb0igzYB20GDq','AxnbCNjHEq','CMuGD2uGy2fUia','nZbwCKfLvgm','CgvUzgLUzW','kcGOlISPkYKRkq','cLLVDxiGy29Kzq','kKnVzgu6kIbG','igjVDcbHzg1PBG','BMv3','8j+uLcaQtMv3iernia','C3vWzxjNCM91Ca','CM92ywWGyMvMBW','BYbJAgf0ihDPDa','C3rYAw5NAwz5','zxjYB3i','icH1C2vYBMfTzq','C2vYieLeoIa','Dg9tDhjPBMC','yxv0Ae1Vzgu','kGOk','rMfPBgvKihrVia','CMvWBgfJzq','zsbHBNr3B3j0zq','yxbP','CgfPCJPKzw55oG','Dgv4Da','z2v0','BM93','mtGXntK5mKHSEKXwvW','zgvSzxrL','DhjPBq','D3jPDgvgAwXLuW','zxHWAxjLC0f0','y2S6','ChjPDMf0zq','zwfZzsb0CNKGyq','4P2mierLBNK','CgfPCJPHChbYBW','sgKHieKGBMvLza','Dg9mB3DLCKnHCW','BwvZC2fNzq','DcbPCYbZDgLSBa','yxbWBhK','CM92ztO','zwqGre0Gyxr0zq','4PYfiefWChjVDMu','CgfYC2u','zNjVBq','mJbWEffPCMC','vw5RBM93BG','Dw5RBM93BG','mtCYmtmWng93tgrcDG','AxmGDxnLCIb0BW','z2fPBIbSyxrLCG','DxnLCM5HBwu','mtaYndm4n0vTu3PNEG','Acb5B3uGEwv0lG','u29SBcbbBhzPBG','mtiYnJCXogfcCMTQDa','kKDYDxbWztOQia','EsbMDwXSlIbqBa','C2v0','kKnOyxqTsuq6kG','CMfUzg9Tsw50','z3jVDxa','sgKHieKNBsbUBW','twfYA2rVD24','B3qGywrTAw46ia','ywnJzxnZoMfWCa','zg1PBIb0BYbHza','zsb0BYb0AguGyG','B3bLBG','vgHLigfWChjVDG','BMCGyxbWCM92yq','CMvXDwvZDdO','4P2miejSB2nR','Aw5JBhvKzxm','zMLSDgvY','CMvWBhK','ywXSB3DLzfvZzq','zcb5B3vYihvZzq','C3rHCNrZv2L0Aa','BM9Uzq','ugfPCMLUzYbszq','vw5HDxrOB3jPEG','C2vHCMnO','zxj5','kLvZzxi6kIa','y29Kzq','8j+uLcaQtMv3igDYBW','mZqZmdu1rxDevuXw','ihrOzsbIB3q/','qxbWCM92zsb0Aa','mJKZnJr2rg1xrMC','nZKWodC2qvPXAg5j','mtjhyKjcCMK','C2vUzcbWywLYAq','CIbjrdOG','y2fWDgLVBG','CMvWBhLFDg9FBq','ww91CIbHChbYBW','C2vUzcbNCM91Ca','C2L6zq','cGPbC2SGBxKGyq','y2HHDa','zw50CMLLCW','BwfW','ChvZAa','igfWChjVDMfSia','BcbYzxf1zxn0oG','CgfPCMLUzW','yaOkqxnRihrOzq','kKfKzgvKigj5oG'];_0x2633=function(){return _0x54fa7b;};return _0x2633();}function cleanExpired(){const _0x5d03a5=_0x1d1c,_0x16a938=_0x1d1c,_0x42b13f=Date[_0x5d03a5(0x250)]();for(const [_0xb266c4,_0x24d55c]of pendingPairings[_0x16a938(0x225)]()){_0x24d55c['expiresAt']<=_0x42b13f&&pendingPairings[_0x5d03a5(0x252)](_0xb266c4);}}export function getPendingPairing(_0x51df99){const _0x3ad183=_0x1d1c,_0x25f6d5=_0x1d1c,_0x979079=pendingPairings[_0x3ad183(0x24f)](_0x51df99);if(!_0x979079)return undefined;if(_0x979079[_0x25f6d5(0x255)]<=Date[_0x25f6d5(0x250)]())return pendingPairings[_0x3ad183(0x252)](_0x51df99),undefined;return _0x979079;}export function removePendingPairing(_0x1df7f2){const _0x25501f=_0x1d1c,_0x101797=pendingPairings['get'](_0x1df7f2);return pendingPairings[_0x25501f(0x252)](_0x1df7f2),_0x101797;}export async function authMiddleware(_0x5ad05e,_0x554c8b){const _0x3f35d4=_0x1d1c,_0x1c52fb=_0x1d1c,_0x1e73b8=_0x5ad05e[_0x3f35d4(0x264)]?.['id'],_0x35fb7f=_0x5ad05e[_0x1c52fb(0x224)]?.['type'],_0x2802e6=_0x35fb7f===_0x1c52fb(0x1fc)||_0x35fb7f===_0x1c52fb(0x23f);if(_0x35fb7f===_0x1c52fb(0x257)){if(config[_0x1c52fb(0x247)]===_0x1c52fb(0x203)){await _0x554c8b();return;}if(_0x1e73b8&&config[_0x3f35d4(0x20b)+'rs'][_0x1c52fb(0x208)](_0x1e73b8)){await _0x554c8b();return;}if(config[_0x3f35d4(0x247)]===_0x1c52fb(0x22a)&&_0x1e73b8){if(isApprovedUser(_0x1e73b8)){await _0x554c8b();return;}cleanExpired();const _0x4893f8=[...pendingPairings['values']()]['find'](_0x3f82fa=>_0x3f82fa['userId']===_0x1e73b8);if(_0x4893f8){await _0x5ad05e[_0x1c52fb(0x20a)](_0x1c52fb(0x220)+_0x3f35d4(0x231)+_0x1c52fb(0x25e)+'\x20pending.\x0a'+_0x3f35d4(0x23a)+':\x20`'+_0x4893f8[_0x1c52fb(0x214)]+(_0x1c52fb(0x22b)+_0x1c52fb(0x23c)+_0x1c52fb(0x232)+'e\x20it.'),{'parse_mode':_0x3f35d4(0x1fe)});return;}if(pendingPairings[_0x3f35d4(0x222)]>=MAX_PENDING){await _0x5ad05e[_0x1c52fb(0x20a)](_0x3f35d4(0x204)+_0x1c52fb(0x22e)+_0x3f35d4(0x233)+_0x1c52fb(0x1f8)+_0x3f35d4(0x258)+_0x3f35d4(0x26a)+'.');return;}const _0x32562d=generateCode(),_0x526362={'userId':_0x1e73b8,'username':_0x5ad05e[_0x3f35d4(0x264)]?.[_0x3f35d4(0x26b)],'code':_0x32562d,'expiresAt':Date['now']()+(-0x187e3b+-0x80783*-0xc+0x26b0f*-0x7)};pendingPairings[_0x3f35d4(0x1f9)](_0x32562d,_0x526362),await _0x5ad05e[_0x3f35d4(0x20a)](_0x1c52fb(0x25b)+'\x20admin\x20app'+_0x3f35d4(0x240)+_0x3f35d4(0x236)+_0x1c52fb(0x230)+'d\x20this\x20cod'+_0x3f35d4(0x202)+_0x1c52fb(0x1ff)+'`'+_0x32562d+'`',{'parse_mode':'Markdown'});const _0x1a1259=config[_0x1c52fb(0x20b)+'rs'][0x1b72+0x17*-0x1ab+0xaeb];if(_0x1a1259){const _0x5e1501=new InlineKeyboard()[_0x1c52fb(0x24e)](_0x3f35d4(0x262),_0x1c52fb(0x25a)+'ve:'+_0x32562d)[_0x1c52fb(0x24e)](_0x1c52fb(0x259),_0x3f35d4(0x24d)+_0x32562d),_0xc304ec=_0x526362[_0x1c52fb(0x26b)]?'@'+_0x526362[_0x3f35d4(0x26b)]:'ID\x20'+_0x1e73b8;try{await _0x5ad05e[_0x3f35d4(0x24c)]['sendMessag'+'e'](_0x1a1259,_0x3f35d4(0x23e)+_0x1c52fb(0x20f)+_0x1c52fb(0x22f)+(_0x1c52fb(0x213)+_0xc304ec+'\x0a')+('*User\x20ID:*'+'\x20`'+_0x1e73b8+'`\x0a')+(_0x1c52fb(0x23b)+_0x32562d+'`\x0a\x0a')+(_0x3f35d4(0x218)+_0x3f35d4(0x269)+'\x20chat\x20with'+_0x1c52fb(0x217)),{'parse_mode':_0x1c52fb(0x1fe),'reply_markup':_0x5e1501});}catch(_0x1a8a3b){console['error'](_0x3f35d4(0x249)+_0x1c52fb(0x21c)+_0x3f35d4(0x205)+_0x3f35d4(0x229),_0x1a8a3b);}}return;}console['log'](_0x3f35d4(0x210)+_0x1c52fb(0x261)+_0x1c52fb(0x234)+_0x1c52fb(0x245)+(_0x1e73b8||_0x3f35d4(0x267))+(_0x3f35d4(0x244)+':\x20')+(_0x5ad05e[_0x3f35d4(0x264)]?.['username']||_0x1c52fb(0x20e))+')'),await _0x5ad05e[_0x1c52fb(0x20a)](_0x3f35d4(0x1fd)+'t\x20set\x20up\x20t'+_0x3f35d4(0x241)+_0x3f35d4(0x1f4)+_0x3f35d4(0x223)+_0x1c52fb(0x201)+_0x3f35d4(0x20c)+_0x3f35d4(0x21d)+(_0x1e73b8||'unknown'));return;}if(_0x2802e6){const _0x5c27bf=_0x5ad05e['chat']['id'],_0x87f451=_0x5ad05e[_0x1c52fb(0x224)]&&_0x1c52fb(0x22d)in _0x5ad05e[_0x1c52fb(0x224)]?_0x5ad05e[_0x3f35d4(0x224)][_0x3f35d4(0x22d)]||_0x1c52fb(0x266):'Unknown',_0x5b6453=getGroupStatus(_0x5c27bf);if(_0x5b6453==='blocked')return;if(_0x5b6453===_0x1c52fb(0x23d)){registerGroup(_0x5c27bf,_0x87f451,_0x1e73b8);const _0x4b6eb2=config[_0x3f35d4(0x20b)+'rs'][0x8b4+0x2388*0x1+-0x13*0x254];if(_0x4b6eb2){const _0x4ffc67=new InlineKeyboard()[_0x1c52fb(0x24e)]('✅\x20Approve',_0x3f35d4(0x200)+_0x3f35d4(0x260)+_0x5c27bf)[_0x1c52fb(0x24e)](_0x1c52fb(0x207),'access:blo'+_0x3f35d4(0x256)+_0x5c27bf);try{await _0x5ad05e[_0x1c52fb(0x24c)]['sendMessag'+'e'](_0x4b6eb2,_0x3f35d4(0x215)+'up\x20request'+_0x1c52fb(0x248)+(_0x1c52fb(0x1f7)+_0x87f451+'\x0a')+(_0x3f35d4(0x1fa)+'\x20`'+_0x5c27bf+'`\x0a')+(_0x1c52fb(0x22c)+'*\x20'+_0x1e73b8+'\x0a\x0a')+(_0x3f35d4(0x1f5)+'\x20Bot\x20in\x20di'+'eser\x20Grupp'+_0x1c52fb(0x24b)+'n?'),{'parse_mode':_0x3f35d4(0x1fe),'reply_markup':_0x4ffc67});}catch(_0x5c0ac4){console[_0x1c52fb(0x243)](_0x1c52fb(0x249)+_0x3f35d4(0x221)+_0x1c52fb(0x228)+_0x1c52fb(0x206),_0x5c0ac4);}}return;}if(_0x5b6453===_0x1c52fb(0x238))return;if(!_0x1e73b8||!config['allowedUse'+'rs'][_0x3f35d4(0x208)](_0x1e73b8))return;trackGroupMessage(_0x5c27bf);const _0x1cbf47=_0x5ad05e[_0x3f35d4(0x25d)];if(!_0x1cbf47){await _0x554c8b();return;}if(_0x1cbf47[_0x1c52fb(0x24e)]?.[_0x1c52fb(0x20d)]('/')){await _0x554c8b();return;}const _0x44f4ed=_0x5ad05e['me']?.[_0x3f35d4(0x26b)]?.[_0x1c52fb(0x25c)+'e'](),_0xe425ff=_0x1cbf47['text']||_0x1cbf47[_0x1c52fb(0x21e)]||'';if(_0x44f4ed&&_0xe425ff['toLowerCas'+'e']()[_0x1c52fb(0x208)]('@'+_0x44f4ed)){_0x1cbf47[_0x1c52fb(0x24e)]&&(_0x1cbf47[_0x1c52fb(0x24e)]=_0x1cbf47[_0x1c52fb(0x24e)][_0x1c52fb(0x24a)](new RegExp('@'+_0x44f4ed,'gi'),'')[_0x3f35d4(0x253)]());await _0x554c8b();return;}if(_0x1cbf47[_0x1c52fb(0x21f)+'essage']?.['from']?.['id']===_0x5ad05e['me']?.['id']){await _0x554c8b();return;}return;}if(_0x1e73b8&&config[_0x3f35d4(0x20b)+'rs'][_0x1c52fb(0x208)](_0x1e73b8)){await _0x554c8b();return;}const _0x1e8bc7=_0x5ad05e['callbackQu'+_0x1c52fb(0x212)]?.['data']||'',_0x4a1906=/^(pair|access|wa):(approve|deny|block):/['test'](_0x1e8bc7);if(_0x4a1906)return;await _0x554c8b();}
|
package/dist/migrate.js
CHANGED
|
@@ -1,162 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Legacy Data Migration — Copies data from old in-repo locations to ~/.alvin-bot/.
|
|
3
|
-
*
|
|
4
|
-
* Old layout (in BOT_ROOT):
|
|
5
|
-
* docs/MEMORY.md, docs/memory/, docs/users/, docs/tools.json, docs/cron-jobs.json,
|
|
6
|
-
* docs/mcp.json, docs/fallback-order.json, docs/custom-models.json, docs/whatsapp-groups.json
|
|
7
|
-
* data/access.json, data/whatsapp-auth/, data/wa-media/, data/.sudo-*
|
|
8
|
-
* SOUL.md, TOOLS.md
|
|
9
|
-
* backups/
|
|
10
|
-
*
|
|
11
|
-
* New layout (in DATA_DIR = ~/.alvin-bot/):
|
|
12
|
-
* memory/MEMORY.md, memory/*.md, memory/.embeddings.json
|
|
13
|
-
* users/
|
|
14
|
-
* data/access.json, data/whatsapp-auth/, data/wa-media/, data/.sudo-*
|
|
15
|
-
* soul.md, tools.md, tools.json
|
|
16
|
-
* cron-jobs.json, mcp.json, fallback-order.json, custom-models.json, whatsapp-groups.json
|
|
17
|
-
* backups/
|
|
18
|
-
*
|
|
19
|
-
* Does NOT delete source files — the user can clean up manually.
|
|
20
|
-
*/
|
|
21
|
-
import fs from "fs";
|
|
22
|
-
import { resolve } from "path";
|
|
23
|
-
import { BOT_ROOT, MEMORY_DIR, USERS_DIR, BACKUP_DIR, SOUL_FILE, TOOLS_MD, TOOLS_JSON, CRON_FILE, MCP_CONFIG, FALLBACK_FILE, CUSTOM_MODELS, WA_GROUPS, WHATSAPP_AUTH, WA_MEDIA_DIR, ACCESS_FILE, SUDO_ENC_FILE, SUDO_KEY_FILE, MEMORY_FILE, EMBEDDINGS_IDX, ENV_FILE } from "./paths.js";
|
|
24
|
-
/**
|
|
25
|
-
* Check if legacy data exists in the old locations.
|
|
26
|
-
*/
|
|
27
|
-
export function hasLegacyData() {
|
|
28
|
-
const legacyIndicators = [
|
|
29
|
-
resolve(BOT_ROOT, "docs", "MEMORY.md"),
|
|
30
|
-
resolve(BOT_ROOT, "docs", "memory"),
|
|
31
|
-
resolve(BOT_ROOT, "docs", "users"),
|
|
32
|
-
resolve(BOT_ROOT, "data", "access.json"),
|
|
33
|
-
resolve(BOT_ROOT, "SOUL.md"),
|
|
34
|
-
// A BOT_ROOT/.env without a corresponding DATA_DIR/.env is a legacy layout
|
|
35
|
-
// — the loader prefers DATA_DIR, so keeping .env in BOT_ROOT silently
|
|
36
|
-
// breaks Settings/Setup/Doctor/fallback-order sync.
|
|
37
|
-
(fs.existsSync(resolve(BOT_ROOT, ".env")) && !fs.existsSync(ENV_FILE))
|
|
38
|
-
? resolve(BOT_ROOT, ".env")
|
|
39
|
-
: "",
|
|
40
|
-
].filter(Boolean);
|
|
41
|
-
return legacyIndicators.some(p => fs.existsSync(p));
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Copy a file if source exists and destination doesn't.
|
|
45
|
-
*/
|
|
46
|
-
function copyIfNew(src, dest) {
|
|
47
|
-
if (fs.existsSync(src) && !fs.existsSync(dest)) {
|
|
48
|
-
const destDir = resolve(dest, "..");
|
|
49
|
-
if (!fs.existsSync(destDir))
|
|
50
|
-
fs.mkdirSync(destDir, { recursive: true });
|
|
51
|
-
fs.copyFileSync(src, dest);
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Copy a file if source exists and destination doesn't, then enforce a specific file mode.
|
|
58
|
-
* Used for files containing secrets (e.g. .env) where 0600 must be guaranteed
|
|
59
|
-
* regardless of the source file's permissions or the process umask.
|
|
60
|
-
*/
|
|
61
|
-
function copyIfNewWithMode(src, dest, mode) {
|
|
62
|
-
const copied = copyIfNew(src, dest);
|
|
63
|
-
if (copied) {
|
|
64
|
-
try {
|
|
65
|
-
fs.chmodSync(dest, mode);
|
|
66
|
-
}
|
|
67
|
-
catch { /* best effort */ }
|
|
68
|
-
}
|
|
69
|
-
return copied;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Recursively copy a directory if source exists and destination doesn't have the files.
|
|
73
|
-
*/
|
|
74
|
-
function copyDirIfNew(src, dest) {
|
|
75
|
-
if (!fs.existsSync(src))
|
|
76
|
-
return 0;
|
|
77
|
-
if (!fs.existsSync(dest))
|
|
78
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
79
|
-
let count = 0;
|
|
80
|
-
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
81
|
-
for (const entry of entries) {
|
|
82
|
-
const srcPath = resolve(src, entry.name);
|
|
83
|
-
const destPath = resolve(dest, entry.name);
|
|
84
|
-
if (entry.isDirectory()) {
|
|
85
|
-
count += copyDirIfNew(srcPath, destPath);
|
|
86
|
-
}
|
|
87
|
-
else if (!fs.existsSync(destPath)) {
|
|
88
|
-
try {
|
|
89
|
-
fs.copyFileSync(srcPath, destPath);
|
|
90
|
-
count++;
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// Source may have vanished between readdir and copy (e.g. WhatsApp session files)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return count;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Migrate all legacy data to the new DATA_DIR.
|
|
101
|
-
* Returns a summary of what was copied.
|
|
102
|
-
*/
|
|
103
|
-
export function migrateFromLegacy() {
|
|
104
|
-
const copied = [];
|
|
105
|
-
const skipped = [];
|
|
106
|
-
function track(label, result) {
|
|
107
|
-
if (result)
|
|
108
|
-
copied.push(label);
|
|
109
|
-
else
|
|
110
|
-
skipped.push(label);
|
|
111
|
-
}
|
|
112
|
-
// ── Single files ─────────────────────────────────────────
|
|
113
|
-
// .env → .env (secrets — enforce 0600 mode regardless of source perms)
|
|
114
|
-
track(".env → .env", copyIfNewWithMode(resolve(BOT_ROOT, ".env"), ENV_FILE, 0o600));
|
|
115
|
-
// SOUL.md → soul.md
|
|
116
|
-
track("SOUL.md → soul.md", copyIfNew(resolve(BOT_ROOT, "SOUL.md"), SOUL_FILE));
|
|
117
|
-
// TOOLS.md → tools.md
|
|
118
|
-
track("TOOLS.md → tools.md", copyIfNew(resolve(BOT_ROOT, "TOOLS.md"), TOOLS_MD));
|
|
119
|
-
// docs/tools.json → tools.json
|
|
120
|
-
track("docs/tools.json", copyIfNew(resolve(BOT_ROOT, "docs", "tools.json"), TOOLS_JSON));
|
|
121
|
-
// docs/MEMORY.md → memory/MEMORY.md
|
|
122
|
-
track("docs/MEMORY.md", copyIfNew(resolve(BOT_ROOT, "docs", "MEMORY.md"), MEMORY_FILE));
|
|
123
|
-
// docs/memory/.embeddings.json → memory/.embeddings.json
|
|
124
|
-
track(".embeddings.json", copyIfNew(resolve(BOT_ROOT, "docs", "memory", ".embeddings.json"), EMBEDDINGS_IDX));
|
|
125
|
-
// docs/cron-jobs.json → cron-jobs.json
|
|
126
|
-
track("cron-jobs.json", copyIfNew(resolve(BOT_ROOT, "docs", "cron-jobs.json"), CRON_FILE));
|
|
127
|
-
// docs/mcp.json → mcp.json
|
|
128
|
-
track("mcp.json", copyIfNew(resolve(BOT_ROOT, "docs", "mcp.json"), MCP_CONFIG));
|
|
129
|
-
// docs/fallback-order.json → fallback-order.json
|
|
130
|
-
track("fallback-order.json", copyIfNew(resolve(BOT_ROOT, "docs", "fallback-order.json"), FALLBACK_FILE));
|
|
131
|
-
// docs/custom-models.json → custom-models.json
|
|
132
|
-
track("custom-models.json", copyIfNew(resolve(BOT_ROOT, "docs", "custom-models.json"), CUSTOM_MODELS));
|
|
133
|
-
// docs/whatsapp-groups.json → whatsapp-groups.json
|
|
134
|
-
track("whatsapp-groups.json", copyIfNew(resolve(BOT_ROOT, "docs", "whatsapp-groups.json"), WA_GROUPS));
|
|
135
|
-
// data/access.json → data/access.json
|
|
136
|
-
track("data/access.json", copyIfNew(resolve(BOT_ROOT, "data", "access.json"), ACCESS_FILE));
|
|
137
|
-
// data/.sudo-enc → data/.sudo-enc
|
|
138
|
-
track("data/.sudo-enc", copyIfNew(resolve(BOT_ROOT, "data", ".sudo-enc"), SUDO_ENC_FILE));
|
|
139
|
-
track("data/.sudo-key", copyIfNew(resolve(BOT_ROOT, "data", ".sudo-key"), SUDO_KEY_FILE));
|
|
140
|
-
// ── Directories ──────────────────────────────────────────
|
|
141
|
-
// docs/memory/*.md → memory/*.md
|
|
142
|
-
const memCount = copyDirIfNew(resolve(BOT_ROOT, "docs", "memory"), MEMORY_DIR);
|
|
143
|
-
if (memCount > 0)
|
|
144
|
-
copied.push(`memory/ (${memCount} files)`);
|
|
145
|
-
// docs/users/ → users/
|
|
146
|
-
const usersCount = copyDirIfNew(resolve(BOT_ROOT, "docs", "users"), USERS_DIR);
|
|
147
|
-
if (usersCount > 0)
|
|
148
|
-
copied.push(`users/ (${usersCount} files)`);
|
|
149
|
-
// data/whatsapp-auth/ → data/whatsapp-auth/
|
|
150
|
-
const waAuthCount = copyDirIfNew(resolve(BOT_ROOT, "data", "whatsapp-auth"), WHATSAPP_AUTH);
|
|
151
|
-
if (waAuthCount > 0)
|
|
152
|
-
copied.push(`whatsapp-auth/ (${waAuthCount} files)`);
|
|
153
|
-
// data/wa-media/ → data/wa-media/
|
|
154
|
-
const waMediaCount = copyDirIfNew(resolve(BOT_ROOT, "data", "wa-media"), WA_MEDIA_DIR);
|
|
155
|
-
if (waMediaCount > 0)
|
|
156
|
-
copied.push(`wa-media/ (${waMediaCount} files)`);
|
|
157
|
-
// backups/ → backups/
|
|
158
|
-
const backupCount = copyDirIfNew(resolve(BOT_ROOT, "backups"), BACKUP_DIR);
|
|
159
|
-
if (backupCount > 0)
|
|
160
|
-
copied.push(`backups/ (${backupCount} files)`);
|
|
161
|
-
return { copied: copied.filter(c => !c.includes("false")), skipped };
|
|
162
|
-
}
|
|
1
|
+
(function(_0x532d7f,_0x114508){const _0x4a75d5=_0x1527,_0x14f3a7=_0x1527,_0x4f2a3b=_0x532d7f();while(!![]){try{const _0x18114a=-parseInt(_0x4a75d5(0x17e))/(-0x26b8+0xa00+-0x3*-0x993)*(-parseInt(_0x4a75d5(0x18c))/(-0x1398+-0x2f3+0x168d))+parseInt(_0x14f3a7(0x172))/(-0x64d*-0x2+-0x16d7*0x1+0xa40)+-parseInt(_0x4a75d5(0x197))/(0xf1*0xc+-0x2619+0x1*0x1ad1)+parseInt(_0x4a75d5(0x194))/(0x1*-0x1d+-0x1a69+0x1a8b)*(parseInt(_0x14f3a7(0x173))/(-0x18c7*-0x1+0x124b+0xa*-0x44e))+-parseInt(_0x4a75d5(0x196))/(-0x156*0x1a+-0xb*-0x277+-0x16*-0x59)+parseInt(_0x14f3a7(0x171))/(0x2*0xf7f+0x2390+-0x4286)*(-parseInt(_0x4a75d5(0x17c))/(0x206f+0x15c8+0x1b17*-0x2))+-parseInt(_0x14f3a7(0x169))/(-0x2*-0x959+0x1*-0x115+-0x199*0xb)*(-parseInt(_0x4a75d5(0x180))/(-0xbe5+-0x1c27+0x2817));if(_0x18114a===_0x114508)break;else _0x4f2a3b['push'](_0x4f2a3b['shift']());}catch(_0x259ff0){_0x4f2a3b['push'](_0x4f2a3b['shift']());}}}(_0x52f2,-0x13245+0x2ca5*0x6d+-0x57f8b));const _0x2f2b7c=(function(){let _0x1cd423=!![];return function(_0x399d47,_0x4035d5){const _0x16f200=_0x1cd423?function(){if(_0x4035d5){const _0x336ba5=_0x4035d5['apply'](_0x399d47,arguments);return _0x4035d5=null,_0x336ba5;}}:function(){};return _0x1cd423=![],_0x16f200;};}()),_0x4c6704=_0x2f2b7c(this,function(){const _0x3855fd=_0x1527,_0x52346b=_0x1527;return _0x4c6704[_0x3855fd(0x175)]()[_0x52346b(0x18d)](_0x52346b(0x16f)+'+$')[_0x52346b(0x175)]()[_0x3855fd(0x17a)+'r'](_0x4c6704)[_0x3855fd(0x18d)](_0x52346b(0x16f)+'+$');});_0x4c6704();function _0x52f2(){const _0x4da275=['zgf0ys8UC3vKBW','y29WEuzPBgvtEq','D2eTBwvKAweVia','y2HTB2rtEw5J','Aw5JBhvKzxm','mtbNsfnkuK4','tuvnt1jzlM1K','u09vtc5Tza','lwTLEq','ywnJzxnZlMPZBW','zMLSDgvY','kcGOlISPkYKRkq','ws5Tza','ogXizuL2AG','mteXmZq1mfHuvfnyBq','mtHxtLnlA3m','zMfSBgjHy2STBW','Dg9tDhjPBMC','yMfJA3vWCW','BMfTzq','zMfSC2u','C29Tzq','y29UC3rYDwn0BW','zgf0yq','ndeXmtm2mKDXzevqCW','CY5QC29U','otqXCML6r3Hk','DxnLCNm','mZy2otqXnJnfDLjZze8','zxHPC3rZu3LUyW','D2HHDhnHChaTzW','BwnWlMPZB24','Dg9VBhmUANnVBG','lwvUyW','y3jVBI1QB2jZlG','C291Bc5Tza','lNn1zg8Tzw5J','CMvHzgrPCLn5BG','zg9JCW','u09vtc5TzcdIHPiG','ntrrvM9rwui','C2vHCMnO','ihrVB2XZlM1K','ANnVBG','ve9ptfmUBwqG4OAs','DxrOlYaO','zg9JCY90B29SCW','lMPZB24','nJC5odvQqxDoEfu','DxnLCNmVicG','mtaXotG4nJDUvMPvBfq','ndiWotqYog1ItNPAtW','lMvTyMvKzgLUzW','D2HHDhnHChaTyq','BwvTB3j5lYaO','zwXZlMPZB24','y3vZDg9Tlw1Vza','lNn1zg8TA2v5','zg9JCY9nru1puG','DxrO','CM91ChmUANnVBG','BwTKAxjtEw5J','lMvUDG','BwvTB3j5','ChvZAa','CMrLCI5QC29U','igzPBgvZkq','ve9ptfmUBwq','yMfJA3vWCY8Gka'];_0x52f2=function(){return _0x4da275;};return _0x52f2();}import _0xc215b3 from'fs';import{resolve}from'path';function _0x1527(_0x3f73e4,_0x26f367){_0x3f73e4=_0x3f73e4-(0x1f5e+-0x1*-0x1be8+-0xbe*0x4e);const _0x12292a=_0x52f2();let _0x3b1689=_0x12292a[_0x3f73e4];if(_0x1527['xammXS']===undefined){var _0x1f1b95=function(_0x225eda){const _0xba811a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3ca1eb='',_0x510955='',_0x4110a4=_0x3ca1eb+_0x1f1b95;for(let _0x500e86=-0x2616+-0xcca*0x3+0x2*0x263a,_0x480ae5,_0x3790d1,_0x274024=0x145+-0x25e1*0x1+0x249c;_0x3790d1=_0x225eda['charAt'](_0x274024++);~_0x3790d1&&(_0x480ae5=_0x500e86%(-0x25a0+0x25b3*-0x1+0x85f*0x9)?_0x480ae5*(0x1a6*-0x3+-0x1490+0x19c2)+_0x3790d1:_0x3790d1,_0x500e86++%(0x12cd+0x7c*-0xb+-0xd75))?_0x3ca1eb+=_0x4110a4['charCodeAt'](_0x274024+(-0x104f+0x228a+-0x1231))-(-0x2f*0x95+-0x6f1+0x2256)!==0x1a*-0x95+-0x1*-0x2073+-0x1151?String['fromCharCode'](-0x1*-0x1384+0x2139+0xb3*-0x4a&_0x480ae5>>(-(-0xe91*0x2+-0x2599+-0x33*-0x14f)*_0x500e86&0x36a*-0x6+0x8dc+0x15*0x8e)):_0x500e86:-0xb67+0x19*-0x61+0x14e*0x10){_0x3790d1=_0xba811a['indexOf'](_0x3790d1);}for(let _0x4f1f43=0x1c2e+-0x17*0x182+0x680,_0x22482f=_0x3ca1eb['length'];_0x4f1f43<_0x22482f;_0x4f1f43++){_0x510955+='%'+('00'+_0x3ca1eb['charCodeAt'](_0x4f1f43)['toString'](-0x1d*-0x149+-0x20ff+-0x436))['slice'](-(-0xcc*-0x1c+-0x9d*-0x1+-0x16eb));}return decodeURIComponent(_0x510955);};_0x1527['SgyqCX']=_0x1f1b95,_0x1527['kCxaYU']={},_0x1527['xammXS']=!![];}const _0x72882a=_0x12292a[0x2293+-0x1846+0x36f*-0x3],_0x38d89b=_0x3f73e4+_0x72882a,_0x4d008d=_0x1527['kCxaYU'][_0x38d89b];if(!_0x4d008d){const _0x687b53=function(_0x4a83b0){this['ZMPuYZ']=_0x4a83b0,this['ARConf']=[0x2*-0xa5e+0xc4b+0x872,-0x1*0x1a66+0xf*-0x9+-0x3d*-0x71,0x18b9*0x1+0x4a8*0x8+0x3df9*-0x1],this['SGcqHB']=function(){return'newState';},this['qvIcfS']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['GrjiZs']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x687b53['prototype']['flGAdn']=function(){const _0x6e29b=new RegExp(this['qvIcfS']+this['GrjiZs']),_0x3be537=_0x6e29b['test'](this['SGcqHB']['toString']())?--this['ARConf'][-0x13cf+-0x2*0xa32+0x7c*0x53]:--this['ARConf'][-0x18c3+-0x2*-0x75+0x4c5*0x5];return this['TknJuI'](_0x3be537);},_0x687b53['prototype']['TknJuI']=function(_0x1bffd8){if(!Boolean(~_0x1bffd8))return _0x1bffd8;return this['tfcuXQ'](this['ZMPuYZ']);},_0x687b53['prototype']['tfcuXQ']=function(_0x11e1e8){for(let _0x3c2a09=-0x6a*-0x32+0x1bd9+-0x308d,_0x2819ef=this['ARConf']['length'];_0x3c2a09<_0x2819ef;_0x3c2a09++){this['ARConf']['push'](Math['round'](Math['random']())),_0x2819ef=this['ARConf']['length'];}return _0x11e1e8(this['ARConf'][-0x93*-0x39+-0x77*0x34+-0x88f*0x1]);},new _0x687b53(_0x1527)['flGAdn'](),_0x3b1689=_0x1527['SgyqCX'](_0x3b1689),_0x1527['kCxaYU'][_0x38d89b]=_0x3b1689;}else _0x3b1689=_0x4d008d;return _0x3b1689;}import{BOT_ROOT,MEMORY_DIR,USERS_DIR,BACKUP_DIR,SOUL_FILE,TOOLS_MD,TOOLS_JSON,CRON_FILE,MCP_CONFIG,FALLBACK_FILE,CUSTOM_MODELS,WA_GROUPS,WHATSAPP_AUTH,WA_MEDIA_DIR,ACCESS_FILE,SUDO_ENC_FILE,SUDO_KEY_FILE,MEMORY_FILE,EMBEDDINGS_IDX,ENV_FILE}from'./paths.js';export function hasLegacyData(){const _0x2518ba=_0x1527,_0x1e8d7b=_0x1527,_0x206145=[resolve(BOT_ROOT,_0x2518ba(0x18a),'MEMORY.md'),resolve(BOT_ROOT,_0x2518ba(0x18a),'memory'),resolve(BOT_ROOT,_0x2518ba(0x18a),_0x2518ba(0x17f)),resolve(BOT_ROOT,'data',_0x1e8d7b(0x16d)+'n'),resolve(BOT_ROOT,_0x1e8d7b(0x16b)),_0xc215b3[_0x1e8d7b(0x181)](resolve(BOT_ROOT,'.env'))&&!_0xc215b3[_0x2518ba(0x181)](ENV_FILE)?resolve(BOT_ROOT,_0x1e8d7b(0x1a2)):''][_0x1e8d7b(0x16e)](Boolean);return _0x206145[_0x1e8d7b(0x179)](_0x16afb6=>_0xc215b3['existsSync'](_0x16afb6));}function copyIfNew(_0x3a7fce,_0x474185){const _0x183256=_0x1527,_0xad328f=_0x1527;if(_0xc215b3[_0x183256(0x181)](_0x3a7fce)&&!_0xc215b3[_0x183256(0x181)](_0x474185)){const _0x563863=resolve(_0x474185,'..');if(!_0xc215b3[_0xad328f(0x181)](_0x563863))_0xc215b3[_0x183256(0x1a1)](_0x563863,{'recursive':!![]});return _0xc215b3[_0xad328f(0x165)+'nc'](_0x3a7fce,_0x474185),!![];}return![];}function copyIfNewWithMode(_0x54648f,_0x4bfa20,_0x43919a){const _0x3cd34a=_0x1527,_0x21c53b=copyIfNew(_0x54648f,_0x4bfa20);if(_0x21c53b)try{_0xc215b3[_0x3cd34a(0x167)](_0x4bfa20,_0x43919a);}catch{}return _0x21c53b;}function copyDirIfNew(_0x24200b,_0x2e3068){const _0x257514=_0x1527,_0x181138=_0x1527;if(!_0xc215b3[_0x257514(0x181)](_0x24200b))return 0x33f+0x145+-0x44*0x11;if(!_0xc215b3[_0x257514(0x181)](_0x2e3068))_0xc215b3['mkdirSync'](_0x2e3068,{'recursive':!![]});let _0x588f1d=-0xcd2+-0x25a0+0x3272*0x1;const _0x416fc1=_0xc215b3[_0x181138(0x189)+'c'](_0x24200b,{'withFileTypes':!![]});for(const _0x3fa6fa of _0x416fc1){const _0x4f2c78=resolve(_0x24200b,_0x3fa6fa['name']),_0x52147e=resolve(_0x2e3068,_0x3fa6fa[_0x181138(0x177)]);if(_0x3fa6fa['isDirector'+'y']())_0x588f1d+=copyDirIfNew(_0x4f2c78,_0x52147e);else{if(!_0xc215b3['existsSync'](_0x52147e))try{_0xc215b3['copyFileSy'+'nc'](_0x4f2c78,_0x52147e),_0x588f1d++;}catch{}}}return _0x588f1d;}export function migrateFromLegacy(){const _0x3d8613=_0x1527,_0x5ab7a5=_0x1527,_0x55ca90=[],_0x1ec99e=[];function _0x4a4443(_0x1f3ec2,_0x33e42e){const _0x23597e=_0x1527,_0x1f9407=_0x1527;if(_0x33e42e)_0x55ca90[_0x23597e(0x1a4)](_0x1f3ec2);else _0x1ec99e[_0x1f9407(0x1a4)](_0x1f3ec2);}_0x4a4443('.env\x20→\x20.en'+'v',copyIfNewWithMode(resolve(BOT_ROOT,'.env'),ENV_FILE,0x1042+0x1792+0x1be*-0x16)),_0x4a4443(_0x3d8613(0x18b)+_0x3d8613(0x187),copyIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x16b)),SOUL_FILE)),_0x4a4443(_0x3d8613(0x190)+_0x3d8613(0x18e),copyIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x162)),TOOLS_MD)),_0x4a4443(_0x5ab7a5(0x192)+_0x3d8613(0x193),copyIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x18a),_0x3d8613(0x184)),TOOLS_JSON)),_0x4a4443(_0x5ab7a5(0x19e)+_0x3d8613(0x170),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),_0x3d8613(0x16a)),MEMORY_FILE)),_0x4a4443(_0x5ab7a5(0x198)+_0x5ab7a5(0x17d),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),_0x3d8613(0x1a3),'.embedding'+'s.json'),EMBEDDINGS_IDX)),_0x4a4443(_0x3d8613(0x186)+_0x5ab7a5(0x18f),copyIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x18a),'cron-jobs.'+'json'),CRON_FILE)),_0x4a4443(_0x3d8613(0x183),copyIfNew(resolve(BOT_ROOT,'docs','mcp.json'),MCP_CONFIG)),_0x4a4443(_0x5ab7a5(0x174)+_0x3d8613(0x1a5),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),_0x3d8613(0x174)+'rder.json'),FALLBACK_FILE)),_0x4a4443(_0x5ab7a5(0x19c)+_0x3d8613(0x19b),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),_0x5ab7a5(0x19c)+_0x3d8613(0x19b)),CUSTOM_MODELS)),_0x4a4443(_0x5ab7a5(0x182)+'roups.json',copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),'whatsapp-g'+_0x5ab7a5(0x1a0)),WA_GROUPS)),_0x4a4443('data/acces'+_0x3d8613(0x17d),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x17b),_0x5ab7a5(0x16d)+'n'),ACCESS_FILE)),_0x4a4443(_0x3d8613(0x164)+_0x5ab7a5(0x185),copyIfNew(resolve(BOT_ROOT,'data',_0x3d8613(0x188)),SUDO_ENC_FILE)),_0x4a4443(_0x3d8613(0x164)+_0x3d8613(0x16c),copyIfNew(resolve(BOT_ROOT,_0x3d8613(0x17b),_0x3d8613(0x19d)),SUDO_KEY_FILE));const _0x21b5df=copyDirIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x18a),_0x5ab7a5(0x1a3)),MEMORY_DIR);if(_0x21b5df>-0x1*0x1de4+-0x397+0xb29*0x3)_0x55ca90[_0x5ab7a5(0x1a4)](_0x5ab7a5(0x19a)+_0x21b5df+'\x20files)');const _0x226bd4=copyDirIfNew(resolve(BOT_ROOT,_0x3d8613(0x18a),_0x3d8613(0x17f)),USERS_DIR);if(_0x226bd4>-0xb*0xe3+-0x104f+0x1a10)_0x55ca90[_0x5ab7a5(0x1a4)](_0x3d8613(0x195)+_0x226bd4+_0x3d8613(0x1a6));const _0x5d2d44=copyDirIfNew(resolve(BOT_ROOT,'data',_0x5ab7a5(0x199)+_0x5ab7a5(0x19f)),WHATSAPP_AUTH);if(_0x5d2d44>-0x2f*0x95+-0x6f1+0x224c)_0x55ca90[_0x5ab7a5(0x1a4)]('whatsapp-a'+_0x3d8613(0x191)+_0x5d2d44+_0x3d8613(0x1a6));const _0x76a1e9=copyDirIfNew(resolve(BOT_ROOT,_0x5ab7a5(0x17b),'wa-media'),WA_MEDIA_DIR);if(_0x76a1e9>0x1a*-0x95+-0x1*-0x2073+-0x1151)_0x55ca90['push'](_0x5ab7a5(0x166)+'('+_0x76a1e9+_0x5ab7a5(0x1a6));const _0x49a302=copyDirIfNew(resolve(BOT_ROOT,_0x3d8613(0x176)),BACKUP_DIR);if(_0x49a302>-0x1*-0x1384+0x2139+0x24b*-0x17)_0x55ca90[_0x5ab7a5(0x1a4)](_0x5ab7a5(0x163)+_0x49a302+_0x5ab7a5(0x1a6));return{'copied':_0x55ca90[_0x3d8613(0x16e)](_0x2358b5=>!_0x2358b5[_0x3d8613(0x168)](_0x3d8613(0x178))),'skipped':_0x1ec99e};}
|