alvin-bot 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -31
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -174
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -583
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -86
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1902
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,227 +1 @@
1
- /**
2
- * Alvin Bot — Multi-Model Provider Abstraction
3
- *
4
- * Unified interfaces for different LLM backends.
5
- * Every provider implements the same interface, making model switching seamless.
6
- */
7
- // ── Provider Presets (common configurations) ────────────
8
- export const PROVIDER_PRESETS = {
9
- // OpenAI (via Codex CLI — full tool use)
10
- "codex-cli": {
11
- type: "codex-cli",
12
- name: "Codex CLI (OpenAI)",
13
- model: "gpt-5.4",
14
- supportsTools: true,
15
- supportsVision: false,
16
- supportsStreaming: true,
17
- contextWindow: 400_000,
18
- },
19
- // Anthropic (via Agent SDK — full tool use, 1M-context beta enabled)
20
- "claude-sdk": {
21
- type: "claude-sdk",
22
- name: "Claude (Agent SDK)",
23
- supportsTools: true,
24
- supportsVision: true,
25
- supportsStreaming: true,
26
- contextWindow: 1_000_000,
27
- },
28
- // Anthropic API (via OpenAI-compatible endpoint — no Agent SDK needed)
29
- "claude-opus": {
30
- type: "openai-compatible",
31
- name: "Claude Opus 4",
32
- model: "claude-opus-4-6",
33
- baseUrl: "https://api.anthropic.com/v1/",
34
- supportsVision: true,
35
- supportsStreaming: true,
36
- supportsTools: true,
37
- contextWindow: 200_000,
38
- },
39
- "claude-sonnet": {
40
- type: "openai-compatible",
41
- name: "Claude Sonnet 4.6",
42
- model: "claude-sonnet-4-6",
43
- baseUrl: "https://api.anthropic.com/v1/",
44
- supportsVision: true,
45
- supportsStreaming: true,
46
- supportsTools: true,
47
- contextWindow: 200_000,
48
- },
49
- "claude-haiku": {
50
- type: "openai-compatible",
51
- name: "Claude Haiku 4.5",
52
- model: "claude-haiku-4-5",
53
- baseUrl: "https://api.anthropic.com/v1/",
54
- supportsVision: true,
55
- supportsStreaming: true,
56
- supportsTools: true,
57
- contextWindow: 200_000,
58
- },
59
- // Groq (fast inference, free tier, supports function calling)
60
- "groq": {
61
- type: "openai-compatible",
62
- name: "Groq (Llama 3.3 70B)",
63
- model: "llama-3.3-70b-versatile",
64
- baseUrl: "https://api.groq.com/openai/v1",
65
- supportsVision: false,
66
- supportsStreaming: true,
67
- supportsTools: true,
68
- contextWindow: 128_000,
69
- },
70
- // OpenAI (supports function calling)
71
- "gpt-4o": {
72
- type: "openai-compatible",
73
- name: "GPT-4o",
74
- model: "gpt-4o",
75
- baseUrl: "https://api.openai.com/v1",
76
- supportsVision: true,
77
- supportsStreaming: true,
78
- supportsTools: true,
79
- contextWindow: 128_000,
80
- },
81
- "gpt-4o-mini": {
82
- type: "openai-compatible",
83
- name: "GPT-4o Mini",
84
- model: "gpt-4o-mini",
85
- baseUrl: "https://api.openai.com/v1",
86
- supportsVision: true,
87
- supportsStreaming: true,
88
- supportsTools: true,
89
- contextWindow: 128_000,
90
- },
91
- // Google Gemini (via OpenAI-compatible endpoint, supports function calling)
92
- "gemini-2.5-pro": {
93
- type: "openai-compatible",
94
- name: "Gemini 2.5 Pro",
95
- model: "gemini-2.5-pro",
96
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
97
- supportsVision: true,
98
- supportsStreaming: true,
99
- supportsTools: true,
100
- contextWindow: 1_000_000,
101
- },
102
- "gemini-2.5-flash": {
103
- type: "openai-compatible",
104
- name: "Gemini 2.5 Flash",
105
- model: "gemini-2.5-flash",
106
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
107
- supportsVision: true,
108
- supportsStreaming: true,
109
- supportsTools: true,
110
- contextWindow: 1_000_000,
111
- },
112
- "gemini-3-pro": {
113
- type: "openai-compatible",
114
- name: "Gemini 3 Pro (Preview)",
115
- model: "gemini-3-pro-preview",
116
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
117
- supportsVision: true,
118
- supportsStreaming: true,
119
- supportsTools: true,
120
- contextWindow: 2_000_000,
121
- },
122
- "gemini-3-flash": {
123
- type: "openai-compatible",
124
- name: "Gemini 3 Flash (Preview)",
125
- model: "gemini-3-flash-preview",
126
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
127
- supportsVision: true,
128
- supportsStreaming: true,
129
- supportsTools: true,
130
- contextWindow: 1_000_000,
131
- },
132
- // OpenAI newer models
133
- "gpt-4.1": {
134
- type: "openai-compatible",
135
- name: "GPT-4.1",
136
- model: "gpt-4.1",
137
- baseUrl: "https://api.openai.com/v1",
138
- supportsVision: true,
139
- supportsStreaming: true,
140
- supportsTools: true,
141
- contextWindow: 1_000_000,
142
- },
143
- "gpt-4.1-mini": {
144
- type: "openai-compatible",
145
- name: "GPT-4.1 Mini",
146
- model: "gpt-4.1-mini",
147
- baseUrl: "https://api.openai.com/v1",
148
- supportsVision: true,
149
- supportsStreaming: true,
150
- supportsTools: true,
151
- contextWindow: 1_000_000,
152
- },
153
- "o3-mini": {
154
- type: "openai-compatible",
155
- name: "o3 Mini",
156
- model: "o3-mini",
157
- baseUrl: "https://api.openai.com/v1",
158
- supportsVision: false,
159
- supportsStreaming: true,
160
- supportsTools: true,
161
- contextWindow: 200_000,
162
- },
163
- // Groq additional models
164
- "groq-llama-3.1-8b": {
165
- type: "openai-compatible",
166
- name: "Llama 3.1 8B (Groq)",
167
- model: "llama-3.1-8b-instant",
168
- baseUrl: "https://api.groq.com/openai/v1",
169
- supportsVision: false,
170
- supportsStreaming: true,
171
- supportsTools: true,
172
- contextWindow: 128_000,
173
- },
174
- "groq-mixtral": {
175
- type: "openai-compatible",
176
- name: "Mixtral 8x7B (Groq)",
177
- model: "mixtral-8x7b-32768",
178
- baseUrl: "https://api.groq.com/openai/v1",
179
- supportsVision: false,
180
- supportsStreaming: true,
181
- supportsTools: true,
182
- contextWindow: 32_768,
183
- },
184
- // NVIDIA NIM (150+ free models)
185
- "nvidia-llama-3.3-70b": {
186
- type: "openai-compatible",
187
- name: "Llama 3.3 70B (NVIDIA)",
188
- model: "meta/llama-3.3-70b-instruct",
189
- baseUrl: "https://integrate.api.nvidia.com/v1",
190
- supportsVision: false,
191
- supportsStreaming: true,
192
- supportsTools: true,
193
- contextWindow: 128_000,
194
- },
195
- "nvidia-kimi-k2.5": {
196
- type: "openai-compatible",
197
- name: "Kimi K2.5 (NVIDIA)",
198
- model: "moonshotai/kimi-k2.5",
199
- baseUrl: "https://integrate.api.nvidia.com/v1",
200
- supportsVision: true,
201
- supportsStreaming: true,
202
- supportsTools: true,
203
- contextWindow: 200_000,
204
- },
205
- // Ollama (local models) — Gemma 4 E4B has an 8k context window
206
- "ollama": {
207
- type: "openai-compatible",
208
- name: "Gemma 4 E4B (Ollama)",
209
- model: "gemma4:e4b",
210
- baseUrl: "http://localhost:11434/v1",
211
- supportsVision: true,
212
- supportsStreaming: true,
213
- contextWindow: 8_192,
214
- },
215
- // OpenRouter (any model, one API, supports function calling).
216
- // Context window varies by model — default 200k is a middle-ground guess.
217
- "openrouter": {
218
- type: "openai-compatible",
219
- name: "OpenRouter",
220
- model: "anthropic/claude-sonnet-4",
221
- baseUrl: "https://openrouter.ai/api/v1",
222
- supportsVision: true,
223
- supportsStreaming: true,
224
- supportsTools: true,
225
- contextWindow: 200_000,
226
- },
227
- };
1
+ function _0x1381(){const _0x4fc30a=['r1bultqUmq','z2XLyxbPCY5JBW','ke9Wzw5bssK','Ahr0Chm6lY9VCa','tgXHBweGmY4Xia','ysaZlJmGnZbckq','z2vTAw5PltmTCa','mZqVDJe','As5NCM9XlMnVBq','Ahr0Chm6lY9Nzq','r2vTAw5PidiUnq','BgXHBweTmY4Zlq','iezSyxnO','As5VCgvUywKUyW','kcGOlISPkYKRkq','z3b0ltrVlw1PBG','z2vTAw5PltmTzG','A3uGnc41','tgXHBweGmY4Zia','ke5wsurjqsK','y2XHDwrLlw9WDq','Ahr0Chm6lY9PBG','ody3otK4tg56ANzs','ntC5nJi4ofj2DLPryG','z3b0ltrV','DgvNCMf0zs5HCa','q2XHDwrLie9WDq','r2vTBweGncbfna','r3jVCsaOtgXHBq','zw5YB3v0zxiUyq','C2vHCMnO','z2vTBwe0oMu0yG','oeiGkeDYB3eP','B3bLBMfPlwnVBq','CgvUywK','mJuZntqZmMPXtw5ZDG','y29KzxGTy2XP','n2iTmZi3nJG','Bwv0ys9SBgfTyq','As5HBNrOCM9WAq','B20VDJe','Ahr0Chm6lY9HCa','z3b0ltuUna','nJyYodi2whPMuMjP','Bs92mwjLDgeVBW','CM8TChjLDMLLDW','BMv0ltq','mMLdC21Uza','q29KzxGGq0Xjia','BMD1ywDLlMDVBW','ltmUmY03mgiTAq','r1bultqUmsbnAq','twL4DhjHBca4Ea','n0iGkeDYB3eP','y2XHDwrLlxnVBG','l29Wzw5HAs92mq','ogiTAw5ZDgfUDa','BMvYyxrPDMvSyq','lxbYBW','BgfZAcaOuhjLDG','r1bultrVie1PBG','nZbcicHovKLesq','Bw9VBNnOB3rHAq','Cgf0AwjSzq','Dg9tDhjPBMC','As5UDMLKAweUyW','BMv0idqUnG','CYa0','s2LTAsblmI41ia','y29UC3rYDwn0BW','nJu0nuXZvuftCq','mte4me9QqKjntq','qIaOt2XSyw1Hkq','yY5JB20VDJeV','yxbWBhK','BZmGtwLUAq','zw50ifnesYK','BZmTBwLUAq','r2vTAw5PidmGua','z2vTAw5PltiUnq','BNn0CNvJDa','mtbmEvLdzfK','q2XHDwrLifnVBG','CY00lty','CM8GkfbYzxzPzq','mZu1nZaYmLjzB1rgzq','As9HCgKVDJe','BgXHBweTmY4Xlq','l2TPBwKTAZiUnq','mtCZmtu5mZDTBfzmDKy','BMv0ltqTnG','q2XHDwrLieHHAq','y2XHDwrLlxnKAW','BwL4DhjHBc04Ea','r1bultrV','A3uTnc01','ywXOB3n0oJeXna','BgfZAc1WCMv2Aq','r2vTAw5PidmGrG','yw50AhjVCgLJlW'];_0x1381=function(){return _0x4fc30a;};return _0x1381();}const _0x4f9f3f=_0x5c4e,_0x416440=_0x5c4e;(function(_0x8ac295,_0x3890d7){const _0x504754=_0x5c4e,_0x262177=_0x5c4e,_0x3e607=_0x8ac295();while(!![]){try{const _0x3fdda1=-parseInt(_0x504754(0x125))/(0x272*0x2+-0x92*-0x12+-0x3*0x50d)*(-parseInt(_0x262177(0x170))/(0x12d+0xa+-0x67*0x3))+parseInt(_0x262177(0x121))/(0x1565*0x1+-0x744+-0xe1e*0x1)+-parseInt(_0x262177(0x13d))/(0x21cd+-0x5*0x65c+-0x1fd)*(parseInt(_0x504754(0x13c))/(-0x1*-0x5ff+0x12de*0x2+-0x2bb6))+parseInt(_0x262177(0x119))/(-0x26b6+0x2171+0x54b)+parseInt(_0x504754(0x14b))/(-0xb34+-0x1*-0x1cb3+-0x1178)+parseInt(_0x504754(0x171))/(-0x1b85+0x83*-0x37+0x37b2*0x1)+-parseInt(_0x504754(0x14f))/(-0x1517*0x1+-0x3*0x392+0x32*0xa3)*(parseInt(_0x262177(0x147))/(-0x5a3*-0x1+0xa9e*-0x2+0x1*0xfa3));if(_0x3fdda1===_0x3890d7)break;else _0x3e607['push'](_0x3e607['shift']());}catch(_0x4e8ddb){_0x3e607['push'](_0x3e607['shift']());}}}(_0x1381,0x37*-0x21a4+0x1*0x62135+0x273*0x327));function _0x5c4e(_0x482f66,_0x1ec567){_0x482f66=_0x482f66-(-0x1*-0x136c+-0x77e+-0xada);const _0x57b3ed=_0x1381();let _0x43c80a=_0x57b3ed[_0x482f66];if(_0x5c4e['gGEKnB']===undefined){var _0x369185=function(_0x346f7f){const _0x5c67d2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4b4fa0='',_0x446034='',_0x15ac5b=_0x4b4fa0+_0x369185;for(let _0x45c097=0x1*0x248f+0x1b5d+-0x3fec,_0x38022b,_0x423100,_0x562575=0x463+-0x2570+0x210d;_0x423100=_0x346f7f['charAt'](_0x562575++);~_0x423100&&(_0x38022b=_0x45c097%(0xb*0x293+-0xa11+0x30a*-0x6)?_0x38022b*(0x209b+0x4f9+-0x4*0x955)+_0x423100:_0x423100,_0x45c097++%(-0x90a+-0x1a52*0x1+0x2360))?_0x4b4fa0+=_0x15ac5b['charCodeAt'](_0x562575+(0x31e+-0xb09+0x7f5))-(0x117b+-0x1216+0xa5)!==0x1a11+0x23bb+-0x1ee6*0x2?String['fromCharCode'](-0x1ae9+0x1*0x15e8+0x20*0x30&_0x38022b>>(-(0x1*0x1199+-0x7*0x199+-0x668)*_0x45c097&-0xe1b+0x12b9+-0x498)):_0x45c097:0x1af7+0x1*0x253f+-0x4036){_0x423100=_0x5c67d2['indexOf'](_0x423100);}for(let _0x3910fe=0x1a93+0x86*-0xe+-0x133f,_0x4d49f6=_0x4b4fa0['length'];_0x3910fe<_0x4d49f6;_0x3910fe++){_0x446034+='%'+('00'+_0x4b4fa0['charCodeAt'](_0x3910fe)['toString'](0x22*-0x99+-0x15e8+0x2*0x1525))['slice'](-(-0x2e3*0x1+0x3*0xc35+0xb3e*-0x3));}return decodeURIComponent(_0x446034);};_0x5c4e['fzfsJL']=_0x369185,_0x5c4e['zYjmMr']={},_0x5c4e['gGEKnB']=!![];}const _0x15c5cf=_0x57b3ed[0x1b75+-0x1*-0xb17+0x1*-0x268c],_0x5e2d62=_0x482f66+_0x15c5cf,_0x3a4595=_0x5c4e['zYjmMr'][_0x5e2d62];if(!_0x3a4595){const _0x465f54=function(_0x8ac295){this['Aqmnqo']=_0x8ac295,this['VhcxHZ']=[-0x65*0xd+-0x1*0x1575+0x1a97*0x1,-0x1770+-0x40d*-0x2+0xf56,0x1653+0x67d*-0x1+-0x1*0xfd6],this['PngwUA']=function(){return'newState';},this['DpkPMb']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['tazGgu']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x465f54['prototype']['gRXDez']=function(){const _0x3890d7=new RegExp(this['DpkPMb']+this['tazGgu']),_0x3e607=_0x3890d7['test'](this['PngwUA']['toString']())?--this['VhcxHZ'][0x1c2c+0x25c2+-0x96b*0x7]:--this['VhcxHZ'][-0x1b3a+-0xb*0x2e3+-0x1*-0x3afb];return this['BoiFcn'](_0x3e607);},_0x465f54['prototype']['BoiFcn']=function(_0x3fdda1){if(!Boolean(~_0x3fdda1))return _0x3fdda1;return this['PCtIom'](this['Aqmnqo']);},_0x465f54['prototype']['PCtIom']=function(_0x4e8ddb){for(let _0x4c828e=-0x182e+-0x1b85+0xa57*0x5,_0x50383a=this['VhcxHZ']['length'];_0x4c828e<_0x50383a;_0x4c828e++){this['VhcxHZ']['push'](Math['round'](Math['random']())),_0x50383a=this['VhcxHZ']['length'];}return _0x4e8ddb(this['VhcxHZ'][0x190a+0x2303+-0x3c0d*0x1]);},new _0x465f54(_0x5c4e)['gRXDez'](),_0x43c80a=_0x5c4e['fzfsJL'](_0x43c80a),_0x5c4e['zYjmMr'][_0x5e2d62]=_0x43c80a;}else _0x43c80a=_0x3a4595;return _0x43c80a;}const _0x788fdb=(function(){let _0x1fe67f=!![];return function(_0x11adfa,_0x133fe3){const _0x148bb4=_0x1fe67f?function(){const _0x220d2b=_0x5c4e;if(_0x133fe3){const _0x523f52=_0x133fe3[_0x220d2b(0x140)](_0x11adfa,arguments);return _0x133fe3=null,_0x523f52;}}:function(){};return _0x1fe67f=![],_0x148bb4;};}()),_0x2f0c1d=_0x788fdb(this,function(){const _0x225183=_0x5c4e,_0x4f2cdd=_0x5c4e;return _0x2f0c1d[_0x225183(0x136)]()[_0x225183(0x114)](_0x4f2cdd(0x168)+'+$')[_0x225183(0x136)]()[_0x4f2cdd(0x13b)+'r'](_0x2f0c1d)[_0x4f2cdd(0x114)](_0x4f2cdd(0x168)+'+$');});_0x2f0c1d();export const PROVIDER_PRESETS={'codex-cli':{'type':_0x4f9f3f(0x11a),'name':_0x4f9f3f(0x126)+_0x4f9f3f(0x15c),'model':_0x416440(0x120),'supportsTools':!![],'supportsVision':![],'supportsStreaming':!![],'contextWindow':0x61a80},'claude-sdk':{'type':_0x416440(0x152),'name':'Claude\x20(Ag'+_0x4f9f3f(0x142),'supportsTools':!![],'supportsVision':!![],'supportsStreaming':!![],'contextWindow':0xf4240},'claude-opus':{'type':'openai-com'+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x174)+_0x416440(0x139),'model':_0x4f9f3f(0x16e)+_0x416440(0x149),'baseUrl':_0x416440(0x11f)+_0x4f9f3f(0x11d)+_0x416440(0x13f),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'claude-sonnet':{'type':_0x416440(0x117)+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x148)+_0x416440(0x138),'model':_0x416440(0x12c)+_0x416440(0x150),'baseUrl':_0x416440(0x11f)+_0x416440(0x11d)+_0x416440(0x13f),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'claude-haiku':{'type':_0x416440(0x117)+'patible','name':_0x4f9f3f(0x151)+_0x416440(0x16b),'model':'claude-hai'+_0x4f9f3f(0x155),'baseUrl':'https://ap'+_0x4f9f3f(0x11d)+_0x4f9f3f(0x13f),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'groq':{'type':_0x4f9f3f(0x117)+_0x416440(0x135),'name':_0x416440(0x176)+_0x4f9f3f(0x15f),'model':_0x416440(0x165)+'70b-versat'+'ile','baseUrl':_0x4f9f3f(0x11f)+'i.groq.com'+_0x416440(0x12d),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gpt-4o':{'type':'openai-com'+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x154),'model':_0x4f9f3f(0x172),'baseUrl':'https://ap'+'i.openai.c'+_0x4f9f3f(0x11e),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gpt-4o-mini':{'type':_0x416440(0x117)+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x132)+'i','model':_0x416440(0x169)+'i','baseUrl':_0x416440(0x11f)+_0x4f9f3f(0x167)+_0x4f9f3f(0x11e),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gemini-2.5-pro':{'type':_0x4f9f3f(0x117)+_0x416440(0x135),'name':'Gemini\x202.5'+'\x20Pro','model':_0x416440(0x145)+_0x416440(0x130),'baseUrl':_0x416440(0x163)+'nerativela'+_0x4f9f3f(0x127)+_0x4f9f3f(0x15b)+_0x4f9f3f(0x122)+_0x4f9f3f(0x118),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gemini-2.5-flash':{'type':_0x416440(0x117)+_0x416440(0x135),'name':_0x4f9f3f(0x164)+_0x4f9f3f(0x166),'model':_0x416440(0x145)+'-flash','baseUrl':_0x416440(0x163)+_0x416440(0x12f)+_0x416440(0x127)+_0x416440(0x15b)+'m/v1beta/o'+_0x4f9f3f(0x118),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gemini-3-pro':{'type':_0x4f9f3f(0x117)+_0x4f9f3f(0x135),'name':_0x416440(0x144)+_0x416440(0x14a)+'w)','model':_0x4f9f3f(0x160)+_0x4f9f3f(0x123),'baseUrl':_0x416440(0x163)+_0x416440(0x12f)+_0x416440(0x127)+_0x416440(0x15b)+'m/v1beta/o'+_0x416440(0x118),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1e8480},'gemini-3-flash':{'type':_0x4f9f3f(0x117)+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x158)+_0x416440(0x131)+'iew)','model':_0x4f9f3f(0x16a)+_0x4f9f3f(0x157)+'ew','baseUrl':_0x4f9f3f(0x163)+_0x416440(0x12f)+'nguage.goo'+_0x4f9f3f(0x15b)+_0x416440(0x122)+_0x416440(0x118),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gpt-4.1':{'type':_0x4f9f3f(0x117)+_0x416440(0x135),'name':_0x4f9f3f(0x15a),'model':'gpt-4.1','baseUrl':'https://ap'+_0x416440(0x167)+_0x416440(0x11e),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gpt-4.1-mini':{'type':_0x416440(0x117)+_0x416440(0x135),'name':_0x416440(0x129)+'ni','model':'gpt-4.1-mi'+'ni','baseUrl':_0x416440(0x11f)+_0x4f9f3f(0x167)+'om/v1','supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'o3-mini':{'type':_0x416440(0x117)+_0x416440(0x135),'name':_0x4f9f3f(0x141),'model':_0x4f9f3f(0x143),'baseUrl':_0x416440(0x11f)+'i.openai.c'+_0x4f9f3f(0x11e),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'groq-llama-3.1-8b':{'type':_0x416440(0x117)+_0x416440(0x135),'name':_0x4f9f3f(0x15e)+_0x4f9f3f(0x116),'model':_0x416440(0x14d)+_0x4f9f3f(0x12e),'baseUrl':_0x416440(0x11f)+_0x4f9f3f(0x162)+_0x4f9f3f(0x12d),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'groq-mixtral':{'type':_0x416440(0x117)+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x12a)+_0x416440(0x12b),'model':_0x4f9f3f(0x153)+_0x416440(0x11b),'baseUrl':'https://ap'+_0x416440(0x162)+_0x416440(0x12d),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x8000},'nvidia-llama-3.3-70b':{'type':_0x4f9f3f(0x117)+'patible','name':_0x4f9f3f(0x16c)+_0x416440(0x133)+'A)','model':_0x4f9f3f(0x11c)+_0x416440(0x128)+_0x4f9f3f(0x146),'baseUrl':_0x4f9f3f(0x16f)+_0x4f9f3f(0x173)+_0x4f9f3f(0x137)+'om/v1','supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'nvidia-kimi-k2.5':{'type':_0x4f9f3f(0x117)+_0x4f9f3f(0x135),'name':_0x4f9f3f(0x13a)+_0x416440(0x16d),'model':_0x416440(0x134)+_0x416440(0x14e),'baseUrl':_0x416440(0x16f)+_0x4f9f3f(0x173)+_0x4f9f3f(0x137)+_0x416440(0x11e),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'ollama':{'type':_0x4f9f3f(0x117)+'patible','name':_0x4f9f3f(0x175)+_0x416440(0x13e),'model':_0x416440(0x115),'baseUrl':'http://loc'+_0x416440(0x156)+_0x416440(0x161),'supportsVision':!![],'supportsStreaming':!![],'contextWindow':0x2000},'openrouter':{'type':_0x4f9f3f(0x117)+_0x416440(0x135),'name':'OpenRouter','model':_0x4f9f3f(0x159)+_0x4f9f3f(0x12c)+_0x4f9f3f(0x124),'baseUrl':_0x4f9f3f(0x15d)+_0x416440(0x177)+_0x416440(0x14c),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40}};
@@ -1,144 +1 @@
1
- /**
2
- * Access Control Service — Manages group approvals and security.
3
- *
4
- * Security model:
5
- * - DMs: only ALLOWED_USERS can interact (unchanged)
6
- * - Groups: must be explicitly approved by an admin before bot responds
7
- * - New groups: bot sends approval request to admin, stays silent until approved
8
- * - Admin can block/unblock groups at any time
9
- * - Forwarded message processing can be toggled
10
- */
11
- import fs from "fs";
12
- import { ACCESS_FILE, RUNTIME_DIR } from "../paths.js";
13
- // Ensure data dir exists
14
- if (!fs.existsSync(RUNTIME_DIR))
15
- fs.mkdirSync(RUNTIME_DIR, { recursive: true });
16
- let config = {
17
- groups: {},
18
- settings: {
19
- allowForwards: true,
20
- autoApproveGroups: false,
21
- groupRateLimitPerHour: 30,
22
- },
23
- };
24
- // Load on startup
25
- try {
26
- const raw = fs.readFileSync(ACCESS_FILE, "utf-8");
27
- config = JSON.parse(raw);
28
- }
29
- catch {
30
- save(); // Create default file
31
- }
32
- function save() {
33
- fs.writeFileSync(ACCESS_FILE, JSON.stringify(config, null, 2));
34
- }
35
- // ── Group Management ─────────────────────────────────
36
- /**
37
- * Check if a group chat is approved.
38
- * Returns: "approved" | "pending" | "blocked" | "new"
39
- */
40
- export function getGroupStatus(chatId) {
41
- const key = String(chatId);
42
- const group = config.groups[key];
43
- if (!group)
44
- return "new";
45
- return group.status;
46
- }
47
- /**
48
- * Register a new group (first time the bot sees it).
49
- * Returns the group info.
50
- */
51
- export function registerGroup(chatId, title, addedBy) {
52
- const key = String(chatId);
53
- if (config.groups[key]) {
54
- // Update title if changed
55
- config.groups[key].title = title;
56
- save();
57
- return config.groups[key];
58
- }
59
- const group = {
60
- chatId,
61
- title,
62
- addedBy,
63
- firstSeen: Date.now(),
64
- status: config.settings.autoApproveGroups ? "approved" : "pending",
65
- statusChanged: Date.now(),
66
- messageCount: 0,
67
- };
68
- config.groups[key] = group;
69
- save();
70
- return group;
71
- }
72
- /**
73
- * Approve a group.
74
- */
75
- export function approveGroup(chatId) {
76
- const key = String(chatId);
77
- const group = config.groups[key];
78
- if (!group)
79
- return false;
80
- group.status = "approved";
81
- group.statusChanged = Date.now();
82
- save();
83
- return true;
84
- }
85
- /**
86
- * Block a group.
87
- */
88
- export function blockGroup(chatId) {
89
- const key = String(chatId);
90
- const group = config.groups[key];
91
- if (!group)
92
- return false;
93
- group.status = "blocked";
94
- group.statusChanged = Date.now();
95
- save();
96
- return true;
97
- }
98
- /**
99
- * Increment message count for a group.
100
- */
101
- export function trackGroupMessage(chatId) {
102
- const key = String(chatId);
103
- if (config.groups[key]) {
104
- config.groups[key].messageCount++;
105
- // Save periodically (every 10 messages to reduce I/O)
106
- if (config.groups[key].messageCount % 10 === 0)
107
- save();
108
- }
109
- }
110
- /**
111
- * Get all groups.
112
- */
113
- export function listGroups() {
114
- return Object.values(config.groups).sort((a, b) => b.firstSeen - a.firstSeen);
115
- }
116
- /**
117
- * Remove a group from tracking.
118
- */
119
- export function removeGroup(chatId) {
120
- const key = String(chatId);
121
- if (!config.groups[key])
122
- return false;
123
- delete config.groups[key];
124
- save();
125
- return true;
126
- }
127
- // ── Settings ─────────────────────────────────────────
128
- export function isForwardingAllowed() {
129
- return config.settings.allowForwards;
130
- }
131
- export function setForwardingAllowed(allowed) {
132
- config.settings.allowForwards = allowed;
133
- save();
134
- }
135
- export function isAutoApproveEnabled() {
136
- return config.settings.autoApproveGroups;
137
- }
138
- export function setAutoApprove(enabled) {
139
- config.settings.autoApproveGroups = enabled;
140
- save();
141
- }
142
- export function getSettings() {
143
- return { ...config.settings };
144
- }
1
+ const _0x4f7647=_0x7126,_0x4fd5f1=_0x7126;(function(_0x354ef2,_0x370594){const _0x345ec5=_0x7126,_0x3f5713=_0x7126,_0x22762f=_0x354ef2();while(!![]){try{const _0x464f6b=-parseInt(_0x345ec5(0xab))/(0x690+0x52a*0x4+-0x1b37)*(-parseInt(_0x345ec5(0x9c))/(-0x5*-0x44f+0x1bb*-0x5+-0x2*0x671))+-parseInt(_0x345ec5(0x9e))/(-0x1cb8+-0xfd+0x1db8)+-parseInt(_0x3f5713(0xb3))/(-0x1e53*0x1+0xb3e+0x1319*0x1)*(-parseInt(_0x3f5713(0xa4))/(-0x1*0x1369+0x15ac+-0x23e))+parseInt(_0x3f5713(0xc1))/(-0x4b3*0x7+-0x233+0x383*0xa)*(parseInt(_0x3f5713(0xae))/(-0x225b+0x125b+0x1007))+-parseInt(_0x3f5713(0xb7))/(0x1d90+0xa51+-0x27d9)+parseInt(_0x345ec5(0xbe))/(0x11d4+-0x12*0x19d+-0xb3f*-0x1)+parseInt(_0x345ec5(0xb4))/(-0x2*-0x737+0x18*-0x18d+0x6*0x3ce)*(-parseInt(_0x3f5713(0x9f))/(-0x2e*-0xc6+-0x22a3*-0x1+-0x462c));if(_0x464f6b===_0x370594)break;else _0x22762f['push'](_0x22762f['shift']());}catch(_0x1f554c){_0x22762f['push'](_0x22762f['shift']());}}}(_0x5dfa,-0x7bb5+0x33925*-0x6+-0x3e351*-0x9));import _0x5b9eca from'fs';function _0x7126(_0x24136d,_0x13b338){_0x24136d=_0x24136d-(-0x47a+-0x1147+0x165c*0x1);const _0x20f473=_0x5dfa();let _0xaad9c0=_0x20f473[_0x24136d];if(_0x7126['kOnQoX']===undefined){var _0x3d6887=function(_0x3d2858){const _0x56fe81='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x17ffae='',_0x4a2377='',_0x393cf0=_0x17ffae+_0x3d6887;for(let _0x2760ae=0x1*-0x2147+-0x236*0x5+-0x1*-0x2c55,_0x8537a,_0x17ed06,_0x789d35=0x1*-0x1e4d+0x567*-0x3+-0x2e82*-0x1;_0x17ed06=_0x3d2858['charAt'](_0x789d35++);~_0x17ed06&&(_0x8537a=_0x2760ae%(0xcc8+0x116c+-0x1e30)?_0x8537a*(-0x6a3*-0x1+0x1f*0x42+-0xe61)+_0x17ed06:_0x17ed06,_0x2760ae++%(0x1e7b+0x407*-0x6+-0x64d))?_0x17ffae+=_0x393cf0['charCodeAt'](_0x789d35+(-0x15ee+-0x11*-0x37+0x1251))-(0x2ed*-0xd+-0xe01*-0x1+0x1812)!==-0xd60+-0x6a7+0x1407?String['fromCharCode'](-0x3*0x7a5+0x24fa+0x14*-0xa7&_0x8537a>>(-(-0x11*0x119+0x1*0x1d7c+-0xad1)*_0x2760ae&-0x665+0x3c5*0x2+-0x11f)):_0x2760ae:-0x1*0xcd6+-0x3*-0x4a5+-0x1*0x119){_0x17ed06=_0x56fe81['indexOf'](_0x17ed06);}for(let _0x2d00da=-0x3*0x93b+-0x50b*0x1+0x14*0x1a3,_0x3778ee=_0x17ffae['length'];_0x2d00da<_0x3778ee;_0x2d00da++){_0x4a2377+='%'+('00'+_0x17ffae['charCodeAt'](_0x2d00da)['toString'](-0xd*-0x20b+0x2572+-0x3ff1*0x1))['slice'](-(0x3*-0xa75+-0x577*-0x5+0x6*0xad));}return decodeURIComponent(_0x4a2377);};_0x7126['MPEBVQ']=_0x3d6887,_0x7126['xHHAIh']={},_0x7126['kOnQoX']=!![];}const _0x4ecbd0=_0x20f473[-0x174+-0x1586+0x16fa],_0xa9b1b4=_0x24136d+_0x4ecbd0,_0x11f29b=_0x7126['xHHAIh'][_0xa9b1b4];if(!_0x11f29b){const _0xc54dba=function(_0x15ec94){this['hwsOzK']=_0x15ec94,this['pCErpz']=[-0x13*0xbd+0x83d+0x5cb,-0x16*0x4f+-0x2bd*-0x1+-0x11*-0x3d,0x1096+0x2af*-0xb+0xcef],this['SwpbgW']=function(){return'newState';},this['GGbIhs']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['Jghpvp']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xc54dba['prototype']['FTZPNz']=function(){const _0x47799c=new RegExp(this['GGbIhs']+this['Jghpvp']),_0x566a96=_0x47799c['test'](this['SwpbgW']['toString']())?--this['pCErpz'][-0x41*-0x47+0x1*-0x134f+0x149*0x1]:--this['pCErpz'][0x481*-0x7+0x5*-0x711+-0x30a*-0x16];return this['xPVXSy'](_0x566a96);},_0xc54dba['prototype']['xPVXSy']=function(_0x5c139a){if(!Boolean(~_0x5c139a))return _0x5c139a;return this['KYILlA'](this['hwsOzK']);},_0xc54dba['prototype']['KYILlA']=function(_0x461735){for(let _0x82783a=0x1afd+-0x4*-0x72d+-0x35*0x10d,_0x1cf369=this['pCErpz']['length'];_0x82783a<_0x1cf369;_0x82783a++){this['pCErpz']['push'](Math['round'](Math['random']())),_0x1cf369=this['pCErpz']['length'];}return _0x461735(this['pCErpz'][-0x1*-0x37f+0x14fa+-0x1879]);},new _0xc54dba(_0x7126)['FTZPNz'](),_0xaad9c0=_0x7126['MPEBVQ'](_0xaad9c0),_0x7126['xHHAIh'][_0xa9b1b4]=_0xaad9c0;}else _0xaad9c0=_0x11f29b;return _0xaad9c0;}import{ACCESS_FILE,RUNTIME_DIR}from'../paths.js';if(!_0x5b9eca['existsSync'](RUNTIME_DIR))_0x5b9eca[_0x4f7647(0xc0)](RUNTIME_DIR,{'recursive':!![]});let config={'groups':{},'settings':{'allowForwards':!![],'autoApproveGroups':![],'groupRateLimitPerHour':0x1e}};try{const raw=_0x5b9eca[_0x4fd5f1(0x9d)+'nc'](ACCESS_FILE,_0x4f7647(0xa2));config=JSON[_0x4f7647(0xb2)](raw);}catch{save();}function _0x5dfa(){const _0x27fc45=['C2vHCMnO','BwvZC2fNzunVDq','nZmZD0v2t3DO','kcGOlISPkYKRkq','CgvUzgLUzW','ndq4C21KDKjh','BMv3','C3rYAw5NAwz5','Ew5J','CgfYC2u','nJaWmJKYnfvMzLnpta','mtqZmJeWBLPWvuzk','C3rHDhvZq2HHBG','C2v0DgLUz3m','nZeZodi4mg5jzunVta','D3jPDgvgAwXLuW','z3jVDxbZ','ywXSB3DgB3j3yq','CMrZ','BM93','DMfSDwvZ','mZa5mdC4z3bhvhvm','yxv0B0fWChjVDG','BwTKAxjtEw5J','mtq0otC4y3PHCuzk','yMXVy2TLza','yxbWCM92zwq','mJy1mNDtDLnJqG','CMvHzezPBgvtEq','mJG0otmYnuXswvnUBq','otm1wMzJwLbr','yxbWBhK','zMLYC3rtzwvU','DxrMltG','z2vK','nvvRqu16Ba','DgL0Bgu','Dg9tDhjPBMC','zuDYB3vWCW','C3rHDhvZ'];_0x5dfa=function(){return _0x27fc45;};return _0x5dfa();}function save(){const _0x3e44e4=_0x4f7647,_0x3e3ab8=_0x4f7647,_0x54e384=(function(){let _0x1d86f5=!![];return function(_0x31017b,_0x4bc26f){const _0x2580d4=_0x1d86f5?function(){const _0x13d677=_0x7126;if(_0x4bc26f){const _0x14ebed=_0x4bc26f[_0x13d677(0xa0)](_0x31017b,arguments);return _0x4bc26f=null,_0x14ebed;}}:function(){};return _0x1d86f5=![],_0x2580d4;};}()),_0x1231ec=_0x54e384(this,function(){const _0x29c0ec=_0x7126,_0x16ac0b=_0x7126;return _0x1231ec['toString']()['search']('(((.+)+)+)'+'+$')[_0x29c0ec(0xa6)]()['constructo'+'r'](_0x1231ec)[_0x29c0ec(0xa9)](_0x29c0ec(0xac)+'+$');});_0x1231ec(),_0x5b9eca[_0x3e44e4(0xb8)+_0x3e3ab8(0xb1)](ACCESS_FILE,JSON[_0x3e3ab8(0xb0)](config,null,-0x4+0x1*-0x1e4d+0x1e53*0x1));}export function getGroupStatus(_0x342550){const _0x164e21=_0x4f7647,_0x3e5d34=_0x4fd5f1,_0x223873=String(_0x342550),_0x306008=config[_0x164e21(0xb9)][_0x223873];if(!_0x306008)return _0x164e21(0xaf);return _0x306008[_0x3e5d34(0xa8)];}export function registerGroup(_0x1a95a8,_0x161829,_0x143cd9){const _0x522ec8=_0x4fd5f1,_0x56e2fc=_0x4f7647,_0x40c748=String(_0x1a95a8);if(config['groups'][_0x40c748])return config[_0x522ec8(0xb9)][_0x40c748][_0x56e2fc(0xa5)]=_0x161829,save(),config['groups'][_0x40c748];const _0x453e09={'chatId':_0x1a95a8,'title':_0x161829,'addedBy':_0x143cd9,'firstSeen':Date[_0x522ec8(0xbc)](),'status':config[_0x56e2fc(0xb6)][_0x56e2fc(0xbf)+_0x522ec8(0xa7)]?_0x56e2fc(0x9b):_0x56e2fc(0xad),'statusChanged':Date['now'](),'messageCount':0x0};return config['groups'][_0x40c748]=_0x453e09,save(),_0x453e09;}export function approveGroup(_0x52b66e){const _0x1735a8=_0x4fd5f1,_0x27a5e1=_0x4f7647,_0x534521=String(_0x52b66e),_0x3f44fc=config[_0x1735a8(0xb9)][_0x534521];if(!_0x3f44fc)return![];return _0x3f44fc[_0x27a5e1(0xa8)]=_0x1735a8(0x9b),_0x3f44fc[_0x27a5e1(0xb5)+'ged']=Date[_0x1735a8(0xbc)](),save(),!![];}export function blockGroup(_0x590320){const _0x2f9a39=_0x4fd5f1,_0x521aaf=_0x4f7647,_0x1f5d7d=String(_0x590320),_0x27914f=config[_0x2f9a39(0xb9)][_0x1f5d7d];if(!_0x27914f)return![];return _0x27914f[_0x2f9a39(0xa8)]=_0x521aaf(0xc2),_0x27914f['statusChan'+_0x521aaf(0xa3)]=Date[_0x521aaf(0xbc)](),save(),!![];}export function trackGroupMessage(_0x19c356){const _0x43318b=_0x4fd5f1,_0x14d6a7=_0x4f7647,_0x2d8430=String(_0x19c356);if(config['groups'][_0x2d8430]){config['groups'][_0x2d8430][_0x43318b(0xaa)+'nt']++;if(config[_0x14d6a7(0xb9)][_0x2d8430]['messageCou'+'nt']%(0x1e*0x116+-0x1de5+-0x2a5)===0xb*-0xbf+0x6a3+0x6*0x43)save();}}export function listGroups(){const _0x3e4ebe=_0x4f7647,_0x510177=_0x4fd5f1;return Object[_0x3e4ebe(0xbd)](config[_0x510177(0xb9)])['sort']((_0x18307c,_0x13b274)=>_0x13b274['firstSeen']-_0x18307c[_0x510177(0xa1)]);}export function removeGroup(_0x5cd1d0){const _0x4a19f3=_0x4f7647,_0x230aca=_0x4fd5f1,_0x5307fb=String(_0x5cd1d0);if(!config[_0x4a19f3(0xb9)][_0x5307fb])return![];return delete config[_0x4a19f3(0xb9)][_0x5307fb],save(),!![];}export function isForwardingAllowed(){const _0x210a6d=_0x4f7647,_0x3842a7=_0x4f7647;return config[_0x210a6d(0xb6)][_0x3842a7(0xba)+'rds'];}export function setForwardingAllowed(_0x273b0d){const _0x54050f=_0x4fd5f1,_0x405b25=_0x4f7647;config[_0x54050f(0xb6)][_0x405b25(0xba)+_0x405b25(0xbb)]=_0x273b0d,save();}export function isAutoApproveEnabled(){return config['settings']['autoApprov'+'eGroups'];}export function setAutoApprove(_0x923e6e){const _0x1c6268=_0x4fd5f1,_0x3fdcb5=_0x4f7647;config[_0x1c6268(0xb6)][_0x1c6268(0xbf)+'eGroups']=_0x923e6e,save();}export function getSettings(){return{...config['settings']};}
@@ -1,56 +1 @@
1
- /**
2
- * ALLOWED_USERS Startup Gate (v4.12.2)
3
- *
4
- * Pure decision function that runs at startup to decide whether Alvin should
5
- * refuse to start because its Telegram bot is configured but has no user
6
- * allowlist.
7
- *
8
- * Before v4.12.2, an empty ALLOWED_USERS with AUTH_MODE=allowlist would only
9
- * emit a console.warn and the bot would start anyway. On production this
10
- * left a "configured but unguarded" surface — any Telegram user who sends
11
- * a DM would reach the bot and could exploit shell/filesystem access via
12
- * prompt injection.
13
- *
14
- * The gate has two explicit escape hatches, both intentional:
15
- * 1. AUTH_MODE=open — user explicitly wants a public bot (not recommended)
16
- * 2. ALVIN_INSECURE_ACKNOWLEDGED=1 — explicit operator opt-out used for
17
- * test environments and scripted installs where the operator
18
- * acknowledges they know what they're doing.
19
- *
20
- * Pure: takes config values as args, returns a decision. The actual
21
- * process.exit(1) lives in src/index.ts as a thin wrapper.
22
- */
23
- export function checkAllowedUsersGate(input) {
24
- // WebUI-only deployments don't have a BOT_TOKEN → nothing to gate
25
- if (!input.hasTelegram) {
26
- return { allowed: true };
27
- }
28
- // Telegram is enabled AND allowlist is populated → normal path
29
- if (input.allowedUsersCount > 0) {
30
- return { allowed: true };
31
- }
32
- // Telegram enabled but allowlist empty — check escape hatches
33
- if (input.authMode === "open") {
34
- return {
35
- allowed: true,
36
- warning: "AUTH_MODE=open explicitly set. Any Telegram user can message the bot. " +
37
- "This is NOT recommended for machines with sensitive files or shell access.",
38
- };
39
- }
40
- if (input.insecureAcknowledged) {
41
- return {
42
- allowed: true,
43
- warning: "ALVIN_INSECURE_ACKNOWLEDGED=1 set. Bot starts with empty ALLOWED_USERS. " +
44
- "The operator has explicitly opted out of the safety gate.",
45
- };
46
- }
47
- // No escape hatch — refuse to start
48
- return {
49
- allowed: false,
50
- reason: "ALLOWED_USERS is empty but BOT_TOKEN is set. " +
51
- "Alvin Bot has full shell/filesystem access on this machine, so starting with " +
52
- "an empty allowlist would leave the bot open to anyone who sends it a Telegram message. " +
53
- "Fix: set ALLOWED_USERS=<your telegram user id> in ~/.alvin-bot/.env (get your ID from @userinfobot). " +
54
- "Explicit opt-out: AUTH_MODE=open OR ALVIN_INSECURE_ACKNOWLEDGED=1.",
55
- };
56
- }
1
+ (function(_0x5d285a,_0x685745){var _0x1b6e19=_0x1edf,_0x1f2055=_0x1edf,_0x1ef689=_0x5d285a();while(!![]){try{var _0x51c683=parseInt(_0x1b6e19(0x206))/(0xaf8+-0x5b*0x15+-0x380)+-parseInt(_0x1b6e19(0x216))/(-0x1*0x261a+-0x3*-0x621+0x1b*0xbb)*(parseInt(_0x1f2055(0x203))/(0xbf1*0x1+-0x825+-0x3c9))+-parseInt(_0x1f2055(0x20b))/(-0x2*0x878+0x1f*-0xc5+0x28cf)+-parseInt(_0x1f2055(0x223))/(0x12ef+-0x650+0x1*-0xc9a)+parseInt(_0x1b6e19(0x200))/(0x3*-0xc92+0xc3d+0x197f)*(-parseInt(_0x1f2055(0x1f9))/(0x4e5*-0x1+-0xcc1*0x1+0x11ad))+parseInt(_0x1b6e19(0x224))/(-0x1*0x1d95+0x2203+-0x233*0x2)*(parseInt(_0x1b6e19(0x1e3))/(-0x27*-0x8e+0x1*-0x2032+0xa99))+parseInt(_0x1f2055(0x1f1))/(-0x1*-0x25bf+-0x13*0x18a+0x877*-0x1)*(parseInt(_0x1f2055(0x1ef))/(0x1172+0x2413+0x357a*-0x1));if(_0x51c683===_0x685745)break;else _0x1ef689['push'](_0x1ef689['shift']());}catch(_0x2883f4){_0x1ef689['push'](_0x1ef689['shift']());}}}(_0x4ce5,-0x1444c+0x1*-0x6099f+-0x1*-0xd2be9));var _0x25ed9c=(function(){var _0x29b384=!![];return function(_0x54edb7,_0x5051c1){var _0x17fc35=_0x29b384?function(){var _0x5a0905=_0x1edf;if(_0x5051c1){var _0x569bf6=_0x5051c1[_0x5a0905(0x222)](_0x54edb7,arguments);return _0x5051c1=null,_0x569bf6;}}:function(){};return _0x29b384=![],_0x17fc35;};}()),_0x2c3b98=_0x25ed9c(this,function(){var _0x3135e9=_0x1edf,_0x461212=_0x1edf;return _0x2c3b98[_0x3135e9(0x20a)]()['search'](_0x3135e9(0x1ed)+'+$')[_0x461212(0x20a)]()[_0x461212(0x1e1)+'r'](_0x2c3b98)['search'](_0x3135e9(0x1ed)+'+$');});_0x2c3b98();function _0x1edf(_0x2bf76b,_0xb954e0){_0x2bf76b=_0x2bf76b-(-0x125f+-0x22d6+0x3716);var _0x5932f0=_0x4ce5();var _0x4cdfa9=_0x5932f0[_0x2bf76b];if(_0x1edf['EfiAbp']===undefined){var _0x19a862=function(_0x4a173b){var _0x864435='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x484db9='',_0x1c1474='',_0x47459d=_0x484db9+_0x19a862;for(var _0x3304ae=0x7fa*0x3+-0xdc7+-0xa27,_0xfd9cfd,_0x5dc1df,_0xbfed5a=0x60d+-0x2*-0xb55+-0x1cb7;_0x5dc1df=_0x4a173b['charAt'](_0xbfed5a++);~_0x5dc1df&&(_0xfd9cfd=_0x3304ae%(0x98*-0x25+-0x4e8+0x1ae4*0x1)?_0xfd9cfd*(-0xe5e+0x880+0x61e)+_0x5dc1df:_0x5dc1df,_0x3304ae++%(-0x693+-0x2*-0xba6+-0x10b5))?_0x484db9+=_0x47459d['charCodeAt'](_0xbfed5a+(0x6*-0x27d+0x37*0x79+0xb07*-0x1))-(0x20f*0x9+0x1a17+-0x3b7*0xc)!==0x10ec+-0x250f+0x1423?String['fromCharCode'](-0x1157+0x9*0x35b+-0xbdd&_0xfd9cfd>>(-(-0x1d6d+-0x641*0x6+0x3d*0x119)*_0x3304ae&-0x2c6+0x13de*0x1+0x1b5*-0xa)):_0x3304ae:-0xf5*0x2+-0x4c7+0x3*0x23b){_0x5dc1df=_0x864435['indexOf'](_0x5dc1df);}for(var _0x490ef0=0x2615+0x1*-0x59+-0x25bc,_0x2c9117=_0x484db9['length'];_0x490ef0<_0x2c9117;_0x490ef0++){_0x1c1474+='%'+('00'+_0x484db9['charCodeAt'](_0x490ef0)['toString'](0x25f8+0x173+-0x275b))['slice'](-(0x2226+-0x1*0x175d+-0xac7));}return decodeURIComponent(_0x1c1474);};_0x1edf['fEVxIs']=_0x19a862,_0x1edf['gEOSxw']={},_0x1edf['EfiAbp']=!![];}var _0xd42545=_0x5932f0[-0x712*-0x3+-0x1565*0x1+-0x1*-0x2f],_0x4e0ddf=_0x2bf76b+_0xd42545,_0xc277c1=_0x1edf['gEOSxw'][_0x4e0ddf];if(!_0xc277c1){var _0x460c31=function(_0x1edf15){this['uLaQcJ']=_0x1edf15,this['tlXGrC']=[0xc2a+0xaf8+-0xbf*0x1f,0xbab*-0x2+-0x261a+-0x4*-0xf5c,-0x6*-0xbe+0x61e*0x2+-0x10b0],this['NTOKLf']=function(){return'newState';},this['cqrACw']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['kdggVb']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x460c31['prototype']['pzKdTV']=function(){var _0x3471fd=new RegExp(this['cqrACw']+this['kdggVb']),_0x53cc0c=_0x3471fd['test'](this['NTOKLf']['toString']())?--this['tlXGrC'][-0x18f0+-0x2*0x878+0x47*0x97]:--this['tlXGrC'][-0x20c+0x12ef+-0x10e3];return this['hIDIjl'](_0x53cc0c);},_0x460c31['prototype']['hIDIjl']=function(_0x44fa8f){if(!Boolean(~_0x44fa8f))return _0x44fa8f;return this['qRRrQi'](this['uLaQcJ']);},_0x460c31['prototype']['qRRrQi']=function(_0x5bb727){for(var _0x63bc92=0x284+0x57*0x9+-0x593*0x1,_0x7670a4=this['tlXGrC']['length'];_0x63bc92<_0x7670a4;_0x63bc92++){this['tlXGrC']['push'](Math['round'](Math['random']())),_0x7670a4=this['tlXGrC']['length'];}return _0x5bb727(this['tlXGrC'][-0xd07+0x4e5*-0x1+-0x8f6*-0x2]);},new _0x460c31(_0x1edf)['pzKdTV'](),_0x4cdfa9=_0x1edf['fEVxIs'](_0x4cdfa9),_0x1edf['gEOSxw'][_0x4e0ddf]=_0x4cdfa9;}else _0x4cdfa9=_0xc277c1;return _0x4cdfa9;}function _0x4ce5(){var _0x255e5f=['rxHWBgLJAxqGBW','zxqGEw91CIbjra','C2v0lIbcB3qGCW','B3iGAgfZigv4Ca','AgvSBc9MAwXLCW','quXwsu5Fsu5trq','iefUEsbuzwXLzW','B3bLBIbLEhbSAq','kcGOlISPkYKRkq','q1vsrv9bq0TotW','ndG5mJG5owrAyKP2sq','x1rps0voigLZia','mZbpDgfpBeu','vcbYzwnVBw1LBG','rvjtigLZigvTCa','zw4Gt1iGquXwsq','yw4Gzw1WDhKGyq','B3qVlMvUDIaOzW','ihrOzsbIB3qUia','rML4oIbZzxqGqq','mJHKD0jjwNO','vgHPCYbPCYbotW','CgvUihrVigfUEq','r0vepteU','ihrOzsbZywzLDa','zYb3AxrOia','t1Dfrf9vu0vsuW','mtK0mdG4v05vExDA','zsbMAwXLCYbVCG','FI8UywX2Aw4TyG','mtq4ndq1mwnVvwLlta','AgfZvgvSzwDYyq','BMrZigL0igeGva','mty3mZa4v01ssfzL','qwX2Aw4GqM90ia','AgfZigz1BgWGCW','quXmt1Dfrf9vuW','Dg9tDhjPBMC','odyXnZi0y2DIAezT','uLm9phLVDxiGDa','zxiGAwq+igLUia','v0XfreDfrd0Xia','yw4GBwvZC2fNzq','C3mGB24GDgHPCW','qvvusf9nt0rfpq','CMfTihvZzxiGyW','x0fds05pv0Xfra','EsbNyxrLlG','ihnOzwXSigfJyW','mKrQtgjVDq','igzYB20GqhvZzq','B3vSzcbSzwf2zq','BgLJAxrSEsbVCa','A25VD2XLzgDLza','zwXLz3jHBsb1CW','igvTChr5iefmta','veHFtu9ert1VCa','zwXLz3jHBsbTzq','B25LihDOBYbZzq','C28GC3rHCNrPBG','DgvKig91DcbVzG','yxbWBhK','mZy4mta2mfjkEu5Pvq','mJGYmJmYzfHcyvPb','y29UC3rYDwn0BW','Aw5Zzwn1CMvbyW','mte3yxf5v2T2','CMLUzM9IB3qPlG'];_0x4ce5=function(){return _0x255e5f;};return _0x4ce5();}export function checkAllowedUsersGate(_0x5ade1c){var _0x3d95a0=_0x1edf,_0xbec6df=_0x1edf;if(!_0x5ade1c[_0x3d95a0(0x204)+'m'])return{'allowed':!![]};if(_0x5ade1c['allowedUse'+'rsCount']>-0x25cf+0x244a+0x185)return{'allowed':!![]};if(_0x5ade1c['authMode']==='open')return{'allowed':!![],'warning':_0xbec6df(0x211)+_0x3d95a0(0x1ec)+'citly\x20set.'+_0x3d95a0(0x1eb)+_0x3d95a0(0x212)+_0x3d95a0(0x20f)+_0x3d95a0(0x1f7)+(_0x3d95a0(0x1fa)+_0x3d95a0(0x1f2)+'ded\x20for\x20ma'+'chines\x20wit'+'h\x20sensitiv'+_0x3d95a0(0x201)+_0xbec6df(0x215)+'ess.')};if(_0x5ade1c[_0xbec6df(0x1e2)+_0x3d95a0(0x21a)])return{'allowed':!![],'warning':_0xbec6df(0x1ea)+_0xbec6df(0x1ee)+_0xbec6df(0x20e)+_0x3d95a0(0x1e7)+'tarts\x20with'+_0xbec6df(0x21c)+_0xbec6df(0x1ff)+'.\x20'+('The\x20operat'+_0x3d95a0(0x1e8)+_0xbec6df(0x219)+_0x3d95a0(0x221)+_0x3d95a0(0x1fd)+_0x3d95a0(0x214))};return{'allowed':![],'reason':_0xbec6df(0x209)+_0xbec6df(0x1f3)+'ty\x20but\x20BOT'+_0x3d95a0(0x1f0)+'set.\x20'+(_0x3d95a0(0x207)+_0x3d95a0(0x208)+_0xbec6df(0x1e9)+'ystem\x20acce'+_0xbec6df(0x210)+'\x20machine,\x20'+_0xbec6df(0x220)+_0xbec6df(0x1fe))+(_0x3d95a0(0x1f5)+'llowlist\x20w'+_0xbec6df(0x218)+'\x20the\x20bot\x20o'+_0x3d95a0(0x1fb)+_0x3d95a0(0x21f)+_0x3d95a0(0x205)+_0x3d95a0(0x21e)+'ssage.\x20')+(_0x3d95a0(0x1f8)+'LLOWED_USE'+_0xbec6df(0x20c)+_0xbec6df(0x21b)+_0x3d95a0(0x20d)+_0x3d95a0(0x202)+_0xbec6df(0x1f6)+_0xbec6df(0x1e6)+_0xbec6df(0x217)+_0x3d95a0(0x1e4)+'\x20')+(_0x3d95a0(0x1e5)+'pt-out:\x20AU'+_0x3d95a0(0x21d)+_0x3d95a0(0x1f4)+'N_INSECURE'+_0x3d95a0(0x213)+_0x3d95a0(0x1fc))};}