alvin-bot 5.7.0 → 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 (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. 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
+ const _0x13f223=_0x46e4,_0x15aab6=_0x46e4;(function(_0x50ffc1,_0x430c23){const _0x59c9ee=_0x46e4,_0x3843e2=_0x46e4,_0x411608=_0x50ffc1();while(!![]){try{const _0x4049d2=-parseInt(_0x59c9ee(0xe6))/(-0xafd*0x1+-0x3c*0x7a+0x2796)*(-parseInt(_0x59c9ee(0xbb))/(0x1c1*-0x3+0x1447+0xf02*-0x1))+-parseInt(_0x59c9ee(0xc1))/(0x32*-0x6c+0x25c9+-0x10ae)*(parseInt(_0x59c9ee(0xda))/(-0x3c5+-0x895*-0x1+-0x2*0x266))+parseInt(_0x59c9ee(0xe1))/(-0x1*0x4b8+-0x22*0xa1+0x9*0x2e7)+-parseInt(_0x59c9ee(0xdf))/(-0x2699+0x1*-0x1c39+-0x592*-0xc)+parseInt(_0x59c9ee(0xad))/(-0x565+-0x2078+0x25e4)+-parseInt(_0x59c9ee(0xdc))/(-0x7*0x2da+-0x18ce+-0x4*-0xb33)+parseInt(_0x3843e2(0xb9))/(0x25a9+-0x43*-0x26+-0x2f92)*(-parseInt(_0x59c9ee(0xb2))/(-0x13ce+0x82f*-0x1+0x29*0xaf));if(_0x4049d2===_0x430c23)break;else _0x411608['push'](_0x411608['shift']());}catch(_0x440ae2){_0x411608['push'](_0x411608['shift']());}}}(_0x33da,-0xd0b3+-0x1d4af+0x49bf5));const _0x23898f=(function(){let _0x4e072a=!![];return function(_0x492fd9,_0x4a4315){const _0x57e918=_0x4e072a?function(){if(_0x4a4315){const _0x4b643f=_0x4a4315['apply'](_0x492fd9,arguments);return _0x4a4315=null,_0x4b643f;}}:function(){};return _0x4e072a=![],_0x57e918;};}()),_0x54f3d5=_0x23898f(this,function(){const _0x1ce697=_0x46e4,_0x1bd906=_0x46e4;return _0x54f3d5[_0x1ce697(0xa8)]()['search'](_0x1ce697(0xeb)+'+$')[_0x1bd906(0xa8)]()['constructo'+'r'](_0x54f3d5)['search'](_0x1bd906(0xeb)+'+$');});function _0x46e4(_0x178430,_0x25b36d){_0x178430=_0x178430-(0x1bb2+-0x1f*0x95+-0x905*0x1);const _0x13da90=_0x33da();let _0x4db26e=_0x13da90[_0x178430];if(_0x46e4['tvADbB']===undefined){var _0x5c0fd9=function(_0x1974e4){const _0x184509='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1aa4b3='',_0x2daf3c='',_0x50ffc1=_0x1aa4b3+_0x5c0fd9;for(let _0x430c23=0x1eaf+-0x1*0x255b+0x7a*0xe,_0x411608,_0x4049d2,_0x440ae2=0xbf*0x1c+0x15c6+-0x2aaa*0x1;_0x4049d2=_0x1974e4['charAt'](_0x440ae2++);~_0x4049d2&&(_0x411608=_0x430c23%(-0x199*-0xb+-0xd*0x92+-0x35*0x31)?_0x411608*(-0x215e+-0x12aa+0x3bc*0xe)+_0x4049d2:_0x4049d2,_0x430c23++%(-0xb5*0xd+0xe2b+-0x4f6))?_0x1aa4b3+=_0x50ffc1['charCodeAt'](_0x440ae2+(0x862+-0x18*-0xe8+-0x1e18))-(-0x1*0x291+0xcd5+0x11*-0x9a)!==0x5*0x142+0x4*0x582+-0x19*0x122?String['fromCharCode'](-0x81*-0x17+-0xde5*0x1+0x34d&_0x411608>>(-(-0xa04+-0xdf3+-0x1*-0x17f9)*_0x430c23&-0x16a7+-0x1eb+0x1898)):_0x430c23:-0x4*0xa7+-0x119b+0x1437){_0x4049d2=_0x184509['indexOf'](_0x4049d2);}for(let _0xdc7cde=0xa*0x13d+-0x1faa+0x1348,_0xea5d3b=_0x1aa4b3['length'];_0xdc7cde<_0xea5d3b;_0xdc7cde++){_0x2daf3c+='%'+('00'+_0x1aa4b3['charCodeAt'](_0xdc7cde)['toString'](0x1264+0x7a3+-0x19f7))['slice'](-(-0x10*-0x265+-0x1e9b+-0x7b3));}return decodeURIComponent(_0x2daf3c);};_0x46e4['MwkHfv']=_0x5c0fd9,_0x46e4['ScsdVI']={},_0x46e4['tvADbB']=!![];}const _0x43a72d=_0x13da90[-0xb3*-0x1d+0xffa*0x2+-0x343b],_0x441ebb=_0x178430+_0x43a72d,_0x25c9fb=_0x46e4['ScsdVI'][_0x441ebb];if(!_0x25c9fb){const _0x1aa5d4=function(_0x1a77a1){this['KHxITs']=_0x1a77a1,this['jYPupj']=[-0x1*-0x25c9+0x615+-0x2bdd,-0x895*-0x1+-0x6*0x1f1+0x311,-0x1562+-0x1*-0x1df5+0x5*-0x1b7],this['qFFubp']=function(){return'newState';},this['LwMacV']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['IRNYNN']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1aa5d4['prototype']['PUqjfJ']=function(){const _0x3c6946=new RegExp(this['LwMacV']+this['IRNYNN']),_0x1016b6=_0x3c6946['test'](this['qFFubp']['toString']())?--this['jYPupj'][-0x2699+0x1*-0x1c39+-0x42d3*-0x1]:--this['jYPupj'][-0x565+-0x2078+0x25dd];return this['mwOCAa'](_0x1016b6);},_0x1aa5d4['prototype']['mwOCAa']=function(_0x4db469){if(!Boolean(~_0x4db469))return _0x4db469;return this['JyCZXi'](this['KHxITs']);},_0x1aa5d4['prototype']['JyCZXi']=function(_0x3c488f){for(let _0x44eb75=-0x7*0x2da+-0x18ce+-0x6*-0x776,_0x12c6be=this['jYPupj']['length'];_0x44eb75<_0x12c6be;_0x44eb75++){this['jYPupj']['push'](Math['round'](Math['random']())),_0x12c6be=this['jYPupj']['length'];}return _0x3c488f(this['jYPupj'][0x25a9+-0x43*-0x26+-0x2f9b]);},new _0x1aa5d4(_0x46e4)['PUqjfJ'](),_0x4db26e=_0x46e4['MwkHfv'](_0x4db26e),_0x46e4['ScsdVI'][_0x441ebb]=_0x4db26e;}else _0x4db26e=_0x25c9fb;return _0x4db26e;}_0x54f3d5();export const PROVIDER_PRESETS={'codex-cli':{'type':_0x13f223(0xd2),'name':'Codex\x20CLI\x20'+_0x13f223(0xcd),'model':_0x15aab6(0xb8),'supportsTools':!![],'supportsVision':![],'supportsStreaming':!![],'contextWindow':0x61a80},'claude-sdk':{'type':'claude-sdk','name':_0x15aab6(0xca)+_0x15aab6(0xcb),'supportsTools':!![],'supportsVision':!![],'supportsStreaming':!![],'contextWindow':0xf4240},'claude-opus':{'type':_0x13f223(0xb1)+'patible','name':_0x15aab6(0xf2)+_0x15aab6(0xed),'model':_0x13f223(0xb6)+'s-4-6','baseUrl':_0x15aab6(0xf3)+_0x13f223(0xb7)+_0x13f223(0xc4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'claude-sonnet':{'type':'openai-com'+'patible','name':'Claude\x20Son'+_0x15aab6(0xe0),'model':'claude-son'+_0x15aab6(0xef),'baseUrl':'https://ap'+_0x15aab6(0xb7)+_0x13f223(0xc4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'claude-haiku':{'type':_0x13f223(0xb1)+'patible','name':_0x15aab6(0xcc)+_0x15aab6(0xb0),'model':_0x13f223(0xdb)+'ku-4-5','baseUrl':_0x13f223(0xf3)+_0x15aab6(0xb7)+_0x15aab6(0xc4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'groq':{'type':_0x15aab6(0xb1)+_0x13f223(0xae),'name':_0x15aab6(0xd4)+_0x15aab6(0xe3),'model':_0x15aab6(0xe9)+_0x13f223(0xb5)+_0x15aab6(0xc0),'baseUrl':_0x13f223(0xf3)+_0x15aab6(0xd0)+'/openai/v1','supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gpt-4o':{'type':'openai-com'+_0x13f223(0xae),'name':_0x15aab6(0xc5),'model':_0x15aab6(0xbd),'baseUrl':_0x13f223(0xf3)+_0x15aab6(0xd6)+_0x15aab6(0xb4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gpt-4o-mini':{'type':'openai-com'+'patible','name':_0x13f223(0xc6)+'i','model':_0x13f223(0xe5)+'i','baseUrl':_0x15aab6(0xf3)+_0x13f223(0xd6)+_0x13f223(0xb4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'gemini-2.5-pro':{'type':_0x15aab6(0xb1)+_0x15aab6(0xae),'name':_0x15aab6(0xf0)+'\x20Pro','model':_0x13f223(0xbf)+_0x15aab6(0xaf),'baseUrl':'https://ge'+_0x13f223(0xf7)+_0x15aab6(0xd5)+_0x15aab6(0xa5)+_0x15aab6(0xd9)+_0x15aab6(0xee),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gemini-2.5-flash':{'type':_0x13f223(0xb1)+_0x15aab6(0xae),'name':_0x15aab6(0xf0)+_0x13f223(0xde),'model':'gemini-2.5'+'-flash','baseUrl':_0x15aab6(0xd7)+_0x13f223(0xf7)+_0x15aab6(0xd5)+'gleapis.co'+_0x15aab6(0xd9)+_0x15aab6(0xee),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gemini-3-pro':{'type':_0x15aab6(0xb1)+_0x13f223(0xae),'name':'Gemini\x203\x20P'+'ro\x20(Previe'+'w)','model':'gemini-3-p'+_0x15aab6(0xf8),'baseUrl':_0x15aab6(0xd7)+_0x15aab6(0xf7)+_0x13f223(0xd5)+_0x15aab6(0xa5)+_0x13f223(0xd9)+'penai','supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1e8480},'gemini-3-flash':{'type':_0x13f223(0xb1)+_0x15aab6(0xae),'name':_0x15aab6(0xac)+'lash\x20(Prev'+_0x15aab6(0xc9),'model':_0x13f223(0xba)+_0x15aab6(0xf6)+'ew','baseUrl':'https://ge'+_0x15aab6(0xf7)+'nguage.goo'+_0x15aab6(0xa5)+_0x13f223(0xd9)+'penai','supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gpt-4.1':{'type':'openai-com'+_0x15aab6(0xae),'name':_0x13f223(0xe2),'model':'gpt-4.1','baseUrl':_0x13f223(0xf3)+'i.openai.c'+_0x13f223(0xb4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'gpt-4.1-mini':{'type':'openai-com'+_0x13f223(0xae),'name':_0x13f223(0xc3)+'ni','model':_0x13f223(0xce)+'ni','baseUrl':'https://ap'+_0x15aab6(0xd6)+_0x13f223(0xb4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0xf4240},'o3-mini':{'type':_0x15aab6(0xb1)+_0x13f223(0xae),'name':_0x15aab6(0xa2),'model':_0x13f223(0xa3),'baseUrl':_0x15aab6(0xf3)+'i.openai.c'+_0x15aab6(0xb4),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'groq-llama-3.1-8b':{'type':_0x13f223(0xb1)+_0x13f223(0xae),'name':_0x15aab6(0xbc)+_0x13f223(0xbe),'model':_0x13f223(0xcf)+_0x13f223(0xdd),'baseUrl':_0x15aab6(0xf3)+_0x13f223(0xd0)+'/openai/v1','supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'groq-mixtral':{'type':_0x13f223(0xb1)+_0x15aab6(0xae),'name':_0x13f223(0xf1)+_0x13f223(0xe8),'model':_0x15aab6(0xc8)+'7b-32768','baseUrl':_0x15aab6(0xf3)+'i.groq.com'+_0x15aab6(0xd1),'supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x8000},'nvidia-llama-3.3-70b':{'type':_0x13f223(0xb1)+_0x15aab6(0xae),'name':_0x13f223(0xc2)+'70B\x20(NVIDI'+'A)','model':'meta/llama'+_0x15aab6(0xab)+'nstruct','baseUrl':'https://in'+_0x13f223(0xd3)+'i.nvidia.c'+'om/v1','supportsVision':![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x1f400},'nvidia-kimi-k2.5':{'type':'openai-com'+'patible','name':_0x13f223(0xaa)+_0x15aab6(0xa9),'model':'moonshotai'+_0x15aab6(0xe7),'baseUrl':'https://in'+_0x15aab6(0xd3)+_0x13f223(0xc7)+_0x15aab6(0xb4),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40},'ollama':{'type':'openai-com'+'patible','name':_0x15aab6(0xa6)+_0x15aab6(0xe4),'model':_0x13f223(0xf5),'baseUrl':'http://loc'+_0x15aab6(0xa4)+_0x15aab6(0xf4),'supportsVision':!![],'supportsStreaming':!![],'contextWindow':0x2000},'openrouter':{'type':_0x15aab6(0xb1)+_0x13f223(0xae),'name':_0x15aab6(0xb3),'model':_0x13f223(0xea)+_0x15aab6(0xa7)+'net-4','baseUrl':_0x13f223(0xd8)+'enrouter.a'+_0x13f223(0xec),'supportsVision':!![],'supportsStreaming':!![],'supportsTools':!![],'contextWindow':0x30d40}};function _0x33da(){const _0x2c19d9=['r1bultqUmsbnAq','yY5JB20VDJeV','r1bultrV','r1bultrVie1PBG','As5UDMLKAweUyW','BwL4DhjHBc04Ea','Awv3kq','q2XHDwrLicHbzW','zw50ifnesYK','q2XHDwrLieHHAq','ke9Wzw5bssK','z3b0ltqUms1TAq','BgXHBweTmY4Xlq','As5NCM9XlMnVBq','l29Wzw5HAs92mq','y29KzxGTy2XP','DgvNCMf0zs5HCa','r3jVCsaOtgXHBq','BMD1ywDLlMDVBW','As5VCgvUywKUyW','Ahr0Chm6lY9Nzq','Ahr0Chm6lY9VCa','Bs92mwjLDgeVBW','nZG4sKvpsuvv','y2XHDwrLlwHHAq','mti3nZG5nNvSAxLVvW','ogiTAw5ZDgfUDa','iezSyxnO','mJKZmdCWAvzPzNrX','BMv0idqUnG','ntC4odiWq0DZshfA','r1bultqUmq','ysaZlJmGnZbckq','qIaOt2XSyw1Hkq','z3b0ltrVlw1PBG','mtb0sK1OEgC','l2TPBwKTAZiUnq','n0iGkeDYB3eP','BgXHBweTmY4Zlq','yw50AhjVCgLJlW','kcGOlISPkYKRkq','As9HCgKVDJe','CYa0','CgvUywK','BMv0ltqTnG','r2vTAw5PidiUnq','twL4DhjHBca4Ea','q2XHDwrLie9WDq','Ahr0Chm6lY9HCa','mZqVDJe','z2vTBwe0oMu0yG','BgfZAc1WCMv2Aq','BMvYyxrPDMvSyq','CM8TChjLDMLLDW','BZmGtwLUAq','BZmTBwLUAq','ywXOB3n0oJeXna','z2XLyxbPCY5JBW','r2vTBweGncbfna','y2XHDwrLlxnVBG','Dg9tDhjPBMC','ke5wsurjqsK','s2LTAsblmI41ia','ltmUmY03mgiTAq','r2vTAw5PidmGrG','mtC5ntKYn2nQrxHREq','Cgf0AwjSzq','lxbYBW','A3uGnc41','B3bLBMfPlwnVBq','mZblywvnrNi','t3bLBLjVDxrLCG','B20VDJe','nZbIlxzLCNnHDa','y2XHDwrLlw9WDq','As5HBNrOCM9WAq','z3b0ltuUna','mtG2mJfUBgHjzum','z2vTAw5PltmTzG','ndm5mdHgt2fbCMO','tgXHBweGmY4Xia','z3b0ltrV','oeiGkeDYB3eP','z2vTAw5PltiUnq','AwXL','mZC4m3Ljr3z5wa','tgXHBweGmY4Zia'];_0x33da=function(){return _0x2c19d9;};return _0x33da();}
@@ -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 _0xf2923c=_0x4fa2,_0xadb944=_0x4fa2;(function(_0x55978a,_0x4c32ab){const _0x533c3b=_0x4fa2,_0x16e9e4=_0x4fa2,_0x33b1b1=_0x55978a();while(!![]){try{const _0x6ce9e7=-parseInt(_0x533c3b(0xfe))/(0x2*0x6d9+-0xa31+-0x380)+parseInt(_0x533c3b(0x10f))/(0x12b9*-0x2+0x2261+-0x1*-0x313)*(parseInt(_0x533c3b(0xea))/(0xe66+0x2576+0x3fd*-0xd))+-parseInt(_0x16e9e4(0x102))/(-0x200d+-0x2*-0x1265+0x27*-0x1f)*(parseInt(_0x533c3b(0x106))/(0xbef+0x21da+0x65*-0x74))+-parseInt(_0x16e9e4(0x10e))/(-0x1*-0xeef+-0x20*0xef+0x3*0x4fd)+-parseInt(_0x16e9e4(0x105))/(-0x1100+-0xf1a+0x2021)*(-parseInt(_0x533c3b(0xe9))/(-0x5df*-0x5+0x2bb*0x6+-0x2db5*0x1))+-parseInt(_0x533c3b(0xf0))/(0x23c6*-0x1+0x27*-0x53+0x7*0x6ec)*(-parseInt(_0x533c3b(0x108))/(0x2446+0x9*0x2f9+-0x3efd))+parseInt(_0x533c3b(0xfd))/(-0x2041+0xd0f+-0x19*-0xc5)*(parseInt(_0x533c3b(0x10b))/(-0x1*-0x169f+-0x2100+0xa6d));if(_0x6ce9e7===_0x4c32ab)break;else _0x33b1b1['push'](_0x33b1b1['shift']());}catch(_0x474c49){_0x33b1b1['push'](_0x33b1b1['shift']());}}}(_0x5f32,-0xb891+-0x3ba40*0x5+-0x1*-0x2087e3));import _0x2626cf from'fs';import{ACCESS_FILE,RUNTIME_DIR}from'../paths.js';if(!_0x2626cf[_0xf2923c(0xf4)](RUNTIME_DIR))_0x2626cf[_0xadb944(0xef)](RUNTIME_DIR,{'recursive':!![]});let config={'groups':{},'settings':{'allowForwards':!![],'autoApproveGroups':![],'groupRateLimitPerHour':0x1e}};try{const raw=_0x2626cf[_0xadb944(0xf9)+'nc'](ACCESS_FILE,_0xf2923c(0x10c));config=JSON['parse'](raw);}catch{save();}function save(){const _0x29add0=_0xadb944,_0x2876d0=_0xf2923c,_0x27427f=(function(){let _0x2f509d=!![];return function(_0x5043d1,_0xd8624d){const _0x26c64b=_0x2f509d?function(){const _0x4e33a1=_0x4fa2;if(_0xd8624d){const _0x4a5bc2=_0xd8624d[_0x4e33a1(0x104)](_0x5043d1,arguments);return _0xd8624d=null,_0x4a5bc2;}}:function(){};return _0x2f509d=![],_0x26c64b;};}()),_0x15a30b=_0x27427f(this,function(){const _0x154aae=_0x4fa2,_0x20e6bc=_0x4fa2;return _0x15a30b[_0x154aae(0x10a)]()[_0x154aae(0xee)](_0x154aae(0xf2)+'+$')[_0x154aae(0x10a)]()[_0x20e6bc(0xf3)+'r'](_0x15a30b)['search'](_0x154aae(0xf2)+'+$');});_0x15a30b(),_0x2626cf['writeFileS'+_0x29add0(0xec)](ACCESS_FILE,JSON[_0x2876d0(0xeb)](config,null,-0x1*0x1b73+0x1579*-0x1+0x1*0x30ee));}export function getGroupStatus(_0x4606f4){const _0x213f57=_0xf2923c,_0x1efdb0=_0xf2923c,_0x3f817d=String(_0x4606f4),_0x18d200=config[_0x213f57(0xed)][_0x3f817d];if(!_0x18d200)return _0x1efdb0(0xf1);return _0x18d200[_0x213f57(0xf8)];}export function registerGroup(_0xa3c2bc,_0x1ed7c4,_0x1a774b){const _0x415435=_0xadb944,_0x561ae6=_0xadb944,_0x486e7c=String(_0xa3c2bc);if(config['groups'][_0x486e7c])return config[_0x415435(0xed)][_0x486e7c][_0x415435(0x100)]=_0x1ed7c4,save(),config[_0x415435(0xed)][_0x486e7c];const _0x453fd5={'chatId':_0xa3c2bc,'title':_0x1ed7c4,'addedBy':_0x1a774b,'firstSeen':Date[_0x415435(0x111)](),'status':config['settings'][_0x415435(0x107)+_0x561ae6(0xfc)]?'approved':_0x415435(0xf6),'statusChanged':Date[_0x415435(0x111)](),'messageCount':0x0};return config['groups'][_0x486e7c]=_0x453fd5,save(),_0x453fd5;}export function approveGroup(_0x36e01d){const _0x4a267f=_0xadb944,_0x3583ff=_0xadb944,_0x4a8f15=String(_0x36e01d),_0x50d627=config[_0x4a267f(0xed)][_0x4a8f15];if(!_0x50d627)return![];return _0x50d627[_0x4a267f(0xf8)]=_0x3583ff(0x110),_0x50d627[_0x3583ff(0x103)+_0x3583ff(0x10d)]=Date[_0x3583ff(0x111)](),save(),!![];}export function blockGroup(_0x536022){const _0x382b9e=_0xadb944,_0x8b1b33=_0xf2923c,_0x540bd8=String(_0x536022),_0x192fd9=config[_0x382b9e(0xed)][_0x540bd8];if(!_0x192fd9)return![];return _0x192fd9[_0x8b1b33(0xf8)]=_0x8b1b33(0x109),_0x192fd9[_0x8b1b33(0x103)+_0x382b9e(0x10d)]=Date[_0x382b9e(0x111)](),save(),!![];}export function trackGroupMessage(_0x55a730){const _0x249a08=_0xf2923c,_0x1d6d02=_0xadb944,_0x9e9e97=String(_0x55a730);if(config[_0x249a08(0xed)][_0x9e9e97]){config[_0x249a08(0xed)][_0x9e9e97][_0x249a08(0x101)+'nt']++;if(config[_0x249a08(0xed)][_0x9e9e97]['messageCou'+'nt']%(-0x9*-0x2c5+-0x17ff+0x26*-0x6)===0x10f8+-0x17*-0x11f+-0x2ac1)save();}}export function listGroups(){const _0xee727e=_0xadb944,_0x16ba04=_0xadb944;return Object[_0xee727e(0xf5)](config[_0xee727e(0xed)])['sort']((_0x39c93e,_0x39a65b)=>_0x39a65b['firstSeen']-_0x39c93e[_0x16ba04(0xf7)]);}function _0x4fa2(_0x2efa27,_0x1fcdb2){_0x2efa27=_0x2efa27-(0x121d+-0x1585+0x451);const _0x59a67e=_0x5f32();let _0x40d684=_0x59a67e[_0x2efa27];if(_0x4fa2['zCMbeq']===undefined){var _0x4bf555=function(_0x414336){const _0x5d6966='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a2f14='',_0x2567f6='',_0x5de6b3=_0x1a2f14+_0x4bf555;for(let _0x4f3e74=-0x26ed*-0x1+-0x1*-0x1a2d+-0x411a,_0x891514,_0x5c9794,_0x214114=-0x1a8a+-0x1*0x1b73+0x11ff*0x3;_0x5c9794=_0x414336['charAt'](_0x214114++);~_0x5c9794&&(_0x891514=_0x4f3e74%(-0xc0*-0x2b+-0x14*-0x14+-0x21cc)?_0x891514*(0x142f*0x1+0x198e+-0x11*0x2ad)+_0x5c9794:_0x5c9794,_0x4f3e74++%(-0xeb6+-0x7d0+0x168a))?_0x1a2f14+=_0x5de6b3['charCodeAt'](_0x214114+(0x1ab1+0x2*-0xdff+-0x7*-0x31))-(-0x1eb0+0x1*-0xdcd+0x2c87*0x1)!==-0x11*-0x199+-0x9bf*-0x3+0x1*-0x3866?String['fromCharCode'](0x134d+0xcf*-0xb+-0x969&_0x891514>>(-(0x1f2a+0x2*-0x300+-0x1928)*_0x4f3e74&-0x4db*-0x8+0x183c+-0x1*0x3f0e)):_0x4f3e74:0xbf*0x10+-0xc27+0x37){_0x5c9794=_0x5d6966['indexOf'](_0x5c9794);}for(let _0x52e2f1=-0x162f+-0x18bb+0x2eea*0x1,_0x295c95=_0x1a2f14['length'];_0x52e2f1<_0x295c95;_0x52e2f1++){_0x2567f6+='%'+('00'+_0x1a2f14['charCodeAt'](_0x52e2f1)['toString'](-0x1f44+0xe49+0x110b))['slice'](-(-0x2*0x80e+0x355*0xb+-0x7*0x2ef));}return decodeURIComponent(_0x2567f6);};_0x4fa2['IWTgqV']=_0x4bf555,_0x4fa2['ITkKBu']={},_0x4fa2['zCMbeq']=!![];}const _0x1f10e1=_0x59a67e[0x85*0x3e+-0xb4d+0x1*-0x14e9],_0x3e14e8=_0x2efa27+_0x1f10e1,_0x219b20=_0x4fa2['ITkKBu'][_0x3e14e8];if(!_0x219b20){const _0x5289cd=function(_0x495ed3){this['XmwhnK']=_0x495ed3,this['YShGuG']=[0x973*-0x1+0x12de+0x96a*-0x1,0x2b*0x39+0xf*-0xf9+0x504,0x1080+-0x28d*0x7+0x15b*0x1],this['zONiOt']=function(){return'newState';},this['LXeAUO']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['kYTcEK']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5289cd['prototype']['wuvKwi']=function(){const _0x3e407b=new RegExp(this['LXeAUO']+this['kYTcEK']),_0x590179=_0x3e407b['test'](this['zONiOt']['toString']())?--this['YShGuG'][0xb5*0x2+0x10f6+0x125f*-0x1]:--this['YShGuG'][0x10d*0x1d+0x3*-0x64+-0xd*0x241];return this['gJfcNB'](_0x590179);},_0x5289cd['prototype']['gJfcNB']=function(_0x1d98b0){if(!Boolean(~_0x1d98b0))return _0x1d98b0;return this['PygGMJ'](this['XmwhnK']);},_0x5289cd['prototype']['PygGMJ']=function(_0x191982){for(let _0x512843=-0x13e*0x17+0x2f5+0x4f*0x53,_0x44c0d3=this['YShGuG']['length'];_0x512843<_0x44c0d3;_0x512843++){this['YShGuG']['push'](Math['round'](Math['random']())),_0x44c0d3=this['YShGuG']['length'];}return _0x191982(this['YShGuG'][0xb3d+0x2*0x6d9+-0x18ef]);},new _0x5289cd(_0x4fa2)['wuvKwi'](),_0x40d684=_0x4fa2['IWTgqV'](_0x40d684),_0x4fa2['ITkKBu'][_0x3e14e8]=_0x40d684;}else _0x40d684=_0x219b20;return _0x40d684;}export function removeGroup(_0x473e76){const _0x2d5f84=_0xf2923c,_0x1a6fea=_0xadb944,_0x24d50b=String(_0x473e76);if(!config[_0x2d5f84(0xed)][_0x24d50b])return![];return delete config[_0x2d5f84(0xed)][_0x24d50b],save(),!![];}export function isForwardingAllowed(){return config['settings']['allowForwa'+'rds'];}export function setForwardingAllowed(_0x2dedad){const _0x51fd69=_0xadb944,_0x45d76f=_0xadb944;config[_0x51fd69(0xff)][_0x51fd69(0xfa)+_0x51fd69(0xfb)]=_0x2dedad,save();}export function isAutoApproveEnabled(){const _0x5cd389=_0xf2923c,_0x4caf88=_0xadb944;return config[_0x5cd389(0xff)]['autoApprov'+_0x4caf88(0xfc)];}function _0x5f32(){const _0x5234e8=['CMvHzezPBgvtEq','ywXSB3DgB3j3yq','CMrZ','zuDYB3vWCW','nJqXm0PfsNbNqG','mtm2mZm4owX4BgPNCG','C2v0DgLUz3m','DgL0Bgu','BwvZC2fNzunVDq','ntmWndeYuLj0vNnj','C3rHDhvZq2HHBG','yxbWBhK','n3fzs0Pjzq','mtboDercDe0','yxv0B0fWChjVDG','mta5ndiZmfHpvxPiva','yMXVy2TLza','Dg9tDhjPBMC','mZGWneLOCLvjsa','DxrMltG','z2vK','mZyWnJu0mfvAzfPArW','mte2nZjbwgzkDwC','yxbWCM92zwq','BM93','mteZnZeYndblB3rxAuq','nZa4DNbzwNng','C3rYAw5NAwz5','Ew5J','z3jVDxbZ','C2vHCMnO','BwTKAxjtEw5J','ovLbtfbrAG','BMv3','kcGOlISPkYKRkq','y29UC3rYDwn0BW','zxHPC3rZu3LUyW','DMfSDwvZ','CgvUzgLUzW','zMLYC3rtzwvU','C3rHDhvZ'];_0x5f32=function(){return _0x5234e8;};return _0x5f32();}export function setAutoApprove(_0x548eff){const _0x50489e=_0xf2923c,_0x1901c6=_0xf2923c;config[_0x50489e(0xff)]['autoApprov'+_0x50489e(0xfc)]=_0x548eff,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(_0x20739b,_0x35b4ff){var _0xab28b4=_0x146b,_0x2e297c=_0x146b,_0x34ba53=_0x20739b();while(!![]){try{var _0x598d60=parseInt(_0xab28b4(0x1f4))/(0x10*0x17e+0x1656+-0x3*0xf67)+-parseInt(_0x2e297c(0x205))/(-0x1ddc+-0x8b+0xf*0x207)*(parseInt(_0x2e297c(0x219))/(0x16e3+-0x134f*-0x1+0x1*-0x2a2f))+-parseInt(_0x2e297c(0x1ee))/(-0x232+-0xd71+0xfa7)*(-parseInt(_0x2e297c(0x1ea))/(0x3*0x305+0x1e5*-0x14+0x1cda))+-parseInt(_0x2e297c(0x206))/(0x3*-0x847+0x1b*-0x8d+0x27ba)*(parseInt(_0xab28b4(0x1ec))/(0x2f*0x75+-0x21b+-0x1359))+parseInt(_0x2e297c(0x216))/(0x7ca+-0x3*-0x6cd+-0x1c29)*(parseInt(_0xab28b4(0x1f8))/(-0x11c9*0x1+0x24fc+-0x132a))+-parseInt(_0xab28b4(0x1e7))/(-0x1da4+-0x401*0x7+0x365*0x11)+parseInt(_0x2e297c(0x20c))/(-0x517*0x1+0x248f+-0x649*0x5);if(_0x598d60===_0x35b4ff)break;else _0x34ba53['push'](_0x34ba53['shift']());}catch(_0x348686){_0x34ba53['push'](_0x34ba53['shift']());}}}(_0x5c58,-0x1750c+-0x23*-0x447e+-0x315bd));function _0x146b(_0x19fb5d,_0x5cd4ad){_0x19fb5d=_0x19fb5d-(-0x736+0x3d7*-0x8+-0x9f5*-0x4);var _0x34cd4d=_0x5c58();var _0x377f8d=_0x34cd4d[_0x19fb5d];if(_0x146b['zURmvg']===undefined){var _0x118a52=function(_0x3b858e){var _0x4c7e12='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0xae5f80='',_0x5e4f0a='',_0x50dd7e=_0xae5f80+_0x118a52;for(var _0x2979d4=0x51e+-0x3d9*0x7+0x15d1,_0x5c4f84,_0x559a4c,_0x17a188=-0x740+0x1157*0x1+-0xa17;_0x559a4c=_0x3b858e['charAt'](_0x17a188++);~_0x559a4c&&(_0x5c4f84=_0x2979d4%(-0x14*-0x19c+-0xc9*-0x7+-0x25ab)?_0x5c4f84*(-0x2303*-0x1+-0x1*0x15ff+-0xcc4)+_0x559a4c:_0x559a4c,_0x2979d4++%(-0x2*-0xa4b+-0x1*0x804+0xc8e*-0x1))?_0xae5f80+=_0x50dd7e['charCodeAt'](_0x17a188+(-0x5*0x364+0x2*-0x1a6+0x144a))-(0xbd*-0x21+0x70+0x17f7)!==0x2199+-0x1bd2+-0x11*0x57?String['fromCharCode'](0x177f+0x1719+-0xf33*0x3&_0x5c4f84>>(-(0x18e6+0x2547*0x1+0xc6f*-0x5)*_0x2979d4&-0x1aae*-0x1+-0x1*0x146f+-0x3*0x213)):_0x2979d4:0x112*-0x8+0x1d7e+-0x14ee){_0x559a4c=_0x4c7e12['indexOf'](_0x559a4c);}for(var _0x1f874b=-0x26*0x79+0x39*0xa3+0x1255*-0x1,_0x53777b=_0xae5f80['length'];_0x1f874b<_0x53777b;_0x1f874b++){_0x5e4f0a+='%'+('00'+_0xae5f80['charCodeAt'](_0x1f874b)['toString'](-0x102e*0x2+-0x2379+0x43e5))['slice'](-(0x1cc7+0x8*0x1bf+0x2abd*-0x1));}return decodeURIComponent(_0x5e4f0a);};_0x146b['pQuugf']=_0x118a52,_0x146b['GrnErt']={},_0x146b['zURmvg']=!![];}var _0x254a6e=_0x34cd4d[0xe*0xc9+-0x4*-0x5f8+-0x2*0x116f],_0xb82e04=_0x19fb5d+_0x254a6e,_0xd7aa46=_0x146b['GrnErt'][_0xb82e04];if(!_0xd7aa46){var _0x1480f8=function(_0x287bf5){this['TKTLef']=_0x287bf5,this['pQrGSZ']=[-0x1ddc+-0x8b+0xe*0x22c,0x16e3+-0x134f*-0x1+0x16*-0x1eb,-0x232+-0xd71+0xfa3],this['LphrEW']=function(){return'newState';},this['iCbNFz']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['VBbpUt']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1480f8['prototype']['WWcyDf']=function(){var _0x5dfbca=new RegExp(this['iCbNFz']+this['VBbpUt']),_0x1153c3=_0x5dfbca['test'](this['LphrEW']['toString']())?--this['pQrGSZ'][0x3*0x305+0x1e5*-0x14+0x1cd6]:--this['pQrGSZ'][0x3*-0x847+0x1b*-0x8d+0x27b4];return this['rJekcE'](_0x1153c3);},_0x1480f8['prototype']['rJekcE']=function(_0x422baf){if(!Boolean(~_0x422baf))return _0x422baf;return this['nQYfJy'](this['TKTLef']);},_0x1480f8['prototype']['nQYfJy']=function(_0x23616b){for(var _0x9ad1a1=0x2f*0x75+-0x21b+-0x1360,_0x20739b=this['pQrGSZ']['length'];_0x9ad1a1<_0x20739b;_0x9ad1a1++){this['pQrGSZ']['push'](Math['round'](Math['random']())),_0x20739b=this['pQrGSZ']['length'];}return _0x23616b(this['pQrGSZ'][0x7ca+-0x3*-0x6cd+-0x1c31]);},new _0x1480f8(_0x146b)['WWcyDf'](),_0x377f8d=_0x146b['pQuugf'](_0x377f8d),_0x146b['GrnErt'][_0xb82e04]=_0x377f8d;}else _0x377f8d=_0xd7aa46;return _0x377f8d;}function _0x5c58(){var _0x9d7068=['CNndB3vUDa','ntK1nJCWwwjkwuvs','B3vSzcbSzwf2zq','mJy5nJG2ou91Dvrguq','zxqGEw91CIbjra','nfb3BuPPuq','DgvKig91DcbVzG','zxnZlG','zxiGAwq+igLUia','q1vsrv9bq0TotW','y2L0BhKGC2v0lG','nty2ndGYqxDAsgHQ','teXpv0vex1vtrq','Dg9tDhjPBMC','B3bLBIbLEhbSAq','ournuvDLyW','zw4Gt1iGquXwsq','x1rps0voigLZia','C3nHz2uUia','ihnOzwXSigfJyW','yxv0Ae1Vzgu','ihrOzsbZywzLDa','Exn0zw0GywnJzq','EsbNyxrLlG','ihrOzsbIB3qGBW','A25VD2XLzgDLza','v0XfreDfrd0Xia','C2v0lIbcB3qGCW','nZHbtLbOBLC','nLjTq2jeEa','iefUEsbuzwXLzW','rxHWBgLJAxqGBW','CMfTihvZzxiGyW','C3mGB24GDgHPCW','B25LihDOBYbZzq','mta3otq1mMvxsKXysa','zwXLz3jHBsb1CW','AgvSBc9MAwXLCW','quXwsu5Fsu5trq','C2v0lIa','yw4Gzw1WDhKGyq','igzYB20GqhvZzq','FI8UywX2Aw4TyG','veHFtu9ert1VCa','DgfYDhmGD2L0Aa','mJCYmdaYnhrUB1LjBW','B3qVlMvUDIaOzW','kcGOlISPkYKRkq','mJCZnZvOywzdCLa','zgvKigzVCIbTyq','B3bLBG','CgvUihrVigfUEq','vcbYzwnVBw1LBG','igvTChr5iefmta','ihrOzsbIB3qUia','AgfZvgvSzwDYyq','BgXVD2XPC3qGDW','Aw5Zzwn1CMvbyW','C2vHCMnO','qvvusf9nt0rfpq','C28GC3rHCNrPBG','qwX2Aw4GqM90ia','zYb3AxrOia','zwXLz3jHBsbTzq','vgHLig9WzxjHDa','vgHPCYbPCYbotW','nJy1otiWu2nIz1rk','yxbWBhK'];_0x5c58=function(){return _0x9d7068;};return _0x5c58();}var _0x48bdf0=(function(){var _0x56f97a=!![];return function(_0x3665cc,_0x33b185){var _0x1e5b9b=_0x56f97a?function(){var _0x4bcc71=_0x146b;if(_0x33b185){var _0x34430f=_0x33b185[_0x4bcc71(0x1e8)](_0x3665cc,arguments);return _0x33b185=null,_0x34430f;}}:function(){};return _0x56f97a=![],_0x1e5b9b;};}()),_0x34ad0c=_0x48bdf0(this,function(){var _0x11deec=_0x146b,_0x392274=_0x146b;return _0x34ad0c[_0x11deec(0x1f6)]()[_0x392274(0x223)](_0x392274(0x218)+'+$')['toString']()['constructo'+'r'](_0x34ad0c)['search'](_0x392274(0x218)+'+$');});_0x34ad0c();export function checkAllowedUsersGate(_0xc64594){var _0x2f82cf=_0x146b,_0x5ba604=_0x146b;if(!_0xc64594[_0x2f82cf(0x220)+'m'])return{'allowed':!![]};if(_0xc64594['allowedUse'+_0x5ba604(0x1e9)]>-0x740+0x1157*0x1+-0xa17)return{'allowed':!![]};if(_0xc64594[_0x2f82cf(0x1fd)]===_0x2f82cf(0x21b))return{'allowed':!![],'warning':_0x2f82cf(0x224)+_0x5ba604(0x1f7)+_0x2f82cf(0x1f3)+_0x2f82cf(0x207)+_0x5ba604(0x209)+'an\x20message'+_0x5ba604(0x21f)+(_0x2f82cf(0x1e6)+_0x2f82cf(0x21d)+_0x5ba604(0x21a)+'chines\x20wit'+'h\x20sensitiv'+'e\x20files\x20or'+_0x5ba604(0x1fc)+_0x5ba604(0x1f0))};if(_0xc64594[_0x2f82cf(0x222)+_0x2f82cf(0x202)])return{'allowed':!![],'warning':_0x5ba604(0x20f)+_0x5ba604(0x1f2)+_0x2f82cf(0x203)+_0x5ba604(0x204)+_0x5ba604(0x215)+_0x2f82cf(0x21e)+'OWED_USERS'+'.\x20'+(_0x5ba604(0x229)+'or\x20has\x20exp'+'licitly\x20op'+_0x5ba604(0x1ef)+_0x5ba604(0x1fe)+_0x5ba604(0x200))};return{'allowed':![],'reason':'ALLOWED_US'+'ERS\x20is\x20emp'+'ty\x20but\x20BOT'+_0x5ba604(0x1fa)+_0x5ba604(0x210)+(_0x5ba604(0x226)+'has\x20full\x20s'+_0x5ba604(0x20e)+_0x2f82cf(0x1ff)+_0x5ba604(0x20a)+'\x20machine,\x20'+_0x5ba604(0x225)+_0x5ba604(0x227))+(_0x2f82cf(0x211)+_0x2f82cf(0x221)+_0x5ba604(0x1eb)+_0x5ba604(0x201)+_0x5ba604(0x21c)+_0x2f82cf(0x20b)+'nds\x20it\x20a\x20T'+_0x2f82cf(0x228)+_0x2f82cf(0x1fb))+('Fix:\x20set\x20A'+_0x5ba604(0x1f5)+'RS=<your\x20t'+_0x2f82cf(0x20d)+_0x2f82cf(0x1f1)+_0x5ba604(0x213)+_0x5ba604(0x217)+_0x2f82cf(0x1ed)+_0x5ba604(0x212)+'rinfobot).'+'\x20')+(_0x5ba604(0x208)+'pt-out:\x20AU'+_0x5ba604(0x214)+_0x5ba604(0x1f9)+'N_INSECURE'+'_ACKNOWLED'+'GED=1.')};}