alvin-bot 5.6.2 → 5.8.0

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