alvin-bot 5.6.2 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -130
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -443
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -0
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,352 +1 @@
1
- /**
2
- * Provider Registry — Model selection, fallback chain, and runtime switching.
3
- *
4
- * This is the central hub for multi-model support. It manages:
5
- * - Which providers are configured and available
6
- * - The active provider (switchable at runtime via /model)
7
- * - Fallback chain when the active provider fails
8
- */
9
- import { ClaudeSDKProvider } from "./claude-sdk-provider.js";
10
- import { CodexCLIProvider } from "./codex-cli-provider.js";
11
- import { OpenAICompatibleProvider } from "./openai-compatible.js";
12
- import { OllamaProvider } from "./ollama-provider.js";
13
- import { PROVIDER_PRESETS } from "./types.js";
14
- import { t } from "../i18n.js";
15
- /**
16
- * Identify an Ollama endpoint by its baseUrl rather than by a hardcoded
17
- * provider key. This lets users define aliases (e.g. `my-ollama`,
18
- * `ollama-local`) in FALLBACK_PROVIDERS or custom-models.json and still
19
- * get the on-demand lifecycle behaviour automatically.
20
- */
21
- function isOllamaEndpoint(baseUrl) {
22
- if (!baseUrl)
23
- return false;
24
- return baseUrl.includes("localhost:11434") || baseUrl.includes("127.0.0.1:11434");
25
- }
26
- export class ProviderRegistry {
27
- providers = new Map();
28
- primaryKey;
29
- fallbackKeys;
30
- activeKey;
31
- constructor(config) {
32
- this.primaryKey = config.primary;
33
- this.fallbackKeys = config.fallbacks || [];
34
- this.activeKey = config.primary;
35
- // Register all configured providers
36
- for (const [key, providerConfig] of Object.entries(config.providers)) {
37
- this.register(key, providerConfig);
38
- }
39
- }
40
- /**
41
- * Register a provider by key.
42
- */
43
- register(key, config) {
44
- const provider = this.createProvider(config);
45
- this.providers.set(key, provider);
46
- }
47
- /**
48
- * Get the currently active provider.
49
- */
50
- getActive() {
51
- const provider = this.providers.get(this.activeKey);
52
- if (!provider) {
53
- throw new Error(`Active provider "${this.activeKey}" not found`);
54
- }
55
- return provider;
56
- }
57
- /**
58
- * Get a specific provider by key.
59
- */
60
- get(key) {
61
- return this.providers.get(key);
62
- }
63
- /**
64
- * Switch the active provider (e.g., via /model command).
65
- */
66
- switchTo(key) {
67
- if (!this.providers.has(key))
68
- return false;
69
- this.activeKey = key;
70
- return true;
71
- }
72
- /**
73
- * Get the active provider key.
74
- */
75
- getActiveKey() {
76
- return this.activeKey;
77
- }
78
- /**
79
- * List all registered providers with their status.
80
- */
81
- async listAll() {
82
- const result = [];
83
- for (const [key, provider] of this.providers) {
84
- const info = provider.getInfo();
85
- result.push({
86
- key,
87
- ...info,
88
- active: key === this.activeKey,
89
- });
90
- }
91
- return result;
92
- }
93
- /**
94
- * Query with automatic fallback.
95
- * Tries the active provider first, then fallbacks in order.
96
- *
97
- * Two invariants beyond the obvious chain-walk:
98
- *
99
- * 1. Lifecycle-managed providers (local runners like Ollama) get booted
100
- * on-demand if they're not already running. Without this, a
101
- * mid-session Claude failure would silently skip Ollama because its
102
- * daemon isn't awake yet — the heartbeat's 5-minute cadence can't
103
- * react fast enough to save an in-flight user request.
104
- *
105
- * 2. If the active provider has already emitted text to the user and
106
- * then errors out mid-stream, we do NOT silently failover to the
107
- * next provider. Chaining a second model underneath a half-finished
108
- * Claude response is more confusing than surfacing a clear error
109
- * and asking the user to retry. The failover is only silent when
110
- * the failing provider hadn't committed any visible text yet.
111
- */
112
- async *queryWithFallback(options, providerOverride) {
113
- // v4.19.0 — Per-workspace provider override. If supplied AND registered,
114
- // it becomes the primary for this query; fallbacks still apply so the
115
- // bot can degrade gracefully if the override provider is unavailable.
116
- const primary = providerOverride && this.providers.has(providerOverride)
117
- ? providerOverride
118
- : this.activeKey;
119
- const chain = [primary, ...this.fallbackKeys.filter(k => k !== primary)];
120
- // Also include activeKey as a last-resort fallback if override was used
121
- if (providerOverride && !chain.includes(this.activeKey)) {
122
- chain.push(this.activeKey);
123
- }
124
- const errors = [];
125
- for (const key of chain) {
126
- // v5.1 PRIMARY FIX — bail before attempting any provider if the caller
127
- // has already aborted. Without this guard, the outer fallback loop kept
128
- // trying successive providers (e.g. Ollama) even after abort(), leaving
129
- // the typing indicator on and wasting resources.
130
- if (options.abortSignal?.aborted)
131
- break;
132
- const provider = this.providers.get(key);
133
- if (!provider)
134
- continue;
135
- // Check availability. For lifecycle-managed providers (Ollama et al.)
136
- // that are currently asleep, actively try to boot them before giving up.
137
- let available = await provider.isAvailable().catch(() => false);
138
- if (!available && provider.lifecycle) {
139
- console.log(`Provider "${key}" asleep — booting on-demand…`);
140
- const booted = await provider.lifecycle.ensureRunning().catch(() => false);
141
- if (booted) {
142
- available = await provider.isAvailable().catch(() => false);
143
- }
144
- }
145
- if (!available) {
146
- console.log(`Provider "${key}" not available, trying next...`);
147
- errors.push({ key, error: "not available (check auth/config)" });
148
- continue;
149
- }
150
- // ─── Query with silent retry for transient mid-stream aborts ─────
151
- // Anthropic occasionally drops streams (network hiccup, server-side
152
- // flap, rate-limit blip). Rather than surfacing the error on the
153
- // first failure, we retry the SAME provider once with a short delay.
154
- // Only mid-stream abort-shaped errors trigger the retry — pre-stream
155
- // failures and user cancels go straight to the fallback / error path.
156
- const MAX_ATTEMPTS = 2;
157
- const RETRY_DELAY_MS = 2_000;
158
- let attempts = 0;
159
- let hadError = false;
160
- let lastError = "";
161
- let hadVisibleText = false;
162
- while (attempts < MAX_ATTEMPTS) {
163
- attempts++;
164
- hadError = false;
165
- lastError = "";
166
- hadVisibleText = false;
167
- try {
168
- for await (const chunk of provider.query(options)) {
169
- if (chunk.type === "error") {
170
- hadError = true;
171
- lastError = chunk.error || "Unknown error";
172
- break;
173
- }
174
- if (chunk.type === "text" && chunk.text && chunk.text.length > 0) {
175
- hadVisibleText = true;
176
- }
177
- yield chunk;
178
- if (chunk.type === "done")
179
- return;
180
- }
181
- }
182
- catch (err) {
183
- hadError = true;
184
- lastError = err instanceof Error ? err.message : String(err);
185
- }
186
- if (!hadError) {
187
- // Loop ended naturally without a done — unusual, fall through.
188
- break;
189
- }
190
- // Retry eligibility:
191
- // - mid-stream (had visible text before error)
192
- // - not a user-initiated cancel (abortSignal is externally fired)
193
- // - error looks transient (contains "abort")
194
- // - still have attempts left
195
- const isUserAbort = options.abortSignal?.aborted === true;
196
- const isTransientLooking = lastError.toLowerCase().includes("abort");
197
- const shouldRetry = hadVisibleText
198
- && attempts < MAX_ATTEMPTS
199
- && !isUserAbort
200
- && isTransientLooking;
201
- if (!shouldRetry)
202
- break;
203
- console.log(`Provider "${key}" mid-stream abort (attempt ${attempts}/${MAX_ATTEMPTS}) — retrying in ${RETRY_DELAY_MS}ms: ${lastError}`);
204
- await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS));
205
- // If the user cancelled during the delay, bail before the next attempt.
206
- if (options.abortSignal?.aborted === true)
207
- break;
208
- }
209
- if (hadError) {
210
- console.log(`Provider "${key}" failed: ${lastError}. ${hadVisibleText ? "Mid-stream — surfacing error." : "Trying next..."}`);
211
- errors.push({ key, error: lastError });
212
- // Mid-stream failure: the user already has partial text on screen.
213
- // Yield a terminal error instead of switching to a different model
214
- // that would write a second, unrelated response underneath.
215
- if (hadVisibleText) {
216
- yield {
217
- type: "error",
218
- error: t("bot.error.midStream", options.locale, {
219
- name: provider.getInfo().name,
220
- detail: lastError,
221
- }),
222
- };
223
- return;
224
- }
225
- // Pre-stream failure: safe to silently switch to the next provider.
226
- const nextIdx = chain.indexOf(key) + 1;
227
- if (nextIdx < chain.length) {
228
- const nextProvider = this.providers.get(chain[nextIdx]);
229
- if (nextProvider) {
230
- yield {
231
- type: "fallback",
232
- failedProvider: provider.getInfo().name,
233
- providerName: nextProvider.getInfo().name,
234
- error: lastError,
235
- };
236
- }
237
- }
238
- continue;
239
- }
240
- // If we got here without done or error, something's off
241
- return;
242
- }
243
- // v5.1 stop: clean user cancellation — the outer loop broke on an
244
- // aborted signal with nothing attempted. Don't surface a misleading
245
- // "no provider" error; end the generator quietly (the consumer's
246
- // _stopRequested handling owns the user-facing acknowledgement).
247
- if (options.abortSignal?.aborted)
248
- return;
249
- // All providers failed — show specific errors
250
- const errorDetail = errors.map(e => ` ${e.key}: ${e.error}`).join("\n");
251
- yield {
252
- type: "error",
253
- error: `No provider available.\n${errorDetail}\n\nFix: alvin-bot setup | Telegram: /model`,
254
- };
255
- }
256
- /**
257
- * Reset to primary provider.
258
- */
259
- resetToDefault() {
260
- this.activeKey = this.primaryKey;
261
- }
262
- // ── Private ─────────────────────────────────────────
263
- createProvider(config) {
264
- switch (config.type) {
265
- case "claude-sdk":
266
- return new ClaudeSDKProvider(config);
267
- case "codex-cli":
268
- return new CodexCLIProvider(config);
269
- case "openai-compatible":
270
- // Local runners that happen to speak the OpenAI-compat protocol
271
- // get a subclass that layers on-demand lifecycle management.
272
- if (isOllamaEndpoint(config.baseUrl)) {
273
- return new OllamaProvider(config);
274
- }
275
- return new OpenAICompatibleProvider(config);
276
- default:
277
- throw new Error(`Unknown provider type: ${config.type}`);
278
- }
279
- }
280
- }
281
- /**
282
- * Create a ProviderRegistry from a simple, user-friendly config.
283
- * Auto-configures providers based on available API keys.
284
- */
285
- export function createRegistry(config) {
286
- const providers = {};
287
- // Register Codex CLI if referenced
288
- if (config.primary === "codex-cli" || config.fallbacks?.includes("codex-cli")) {
289
- providers["codex-cli"] = {
290
- ...PROVIDER_PRESETS["codex-cli"],
291
- type: "codex-cli",
292
- name: "Codex CLI (OpenAI)",
293
- model: "gpt-5.4",
294
- };
295
- }
296
- // Claude (Agent SDK) — the base provider plus three tier-aliased virtual
297
- // entries. All four route through the same ClaudeSDKProvider implementation
298
- // but pass a different `model:` to the Agent SDK at query time. The aliases
299
- // ("opus" | "sonnet" | "haiku") auto-resolve to the latest tier on the
300
- // Claude CLI — no hardcoded version IDs, no manual updates when Anthropic
301
- // releases a new model.
302
- const claudeKeys = ["claude-sdk", "claude-opus", "claude-sonnet", "claude-haiku"];
303
- const claudeReferenced = claudeKeys.some((k) => config.primary === k || config.fallbacks?.includes(k));
304
- if (claudeReferenced) {
305
- providers["claude-sdk"] = {
306
- ...PROVIDER_PRESETS["claude-sdk"],
307
- type: "claude-sdk",
308
- name: "Claude (Agent SDK)",
309
- model: "inherit", // CLI default → currently Opus 4.7 on Max plan
310
- };
311
- providers["claude-opus"] = {
312
- ...PROVIDER_PRESETS["claude-sdk"],
313
- type: "claude-sdk",
314
- name: "Claude Opus (auto-latest)",
315
- model: "opus",
316
- };
317
- providers["claude-sonnet"] = {
318
- ...PROVIDER_PRESETS["claude-sdk"],
319
- type: "claude-sdk",
320
- name: "Claude Sonnet (auto-latest)",
321
- model: "sonnet",
322
- };
323
- providers["claude-haiku"] = {
324
- ...PROVIDER_PRESETS["claude-sdk"],
325
- type: "claude-sdk",
326
- name: "Claude Haiku (auto-latest)",
327
- model: "haiku",
328
- };
329
- }
330
- // Register Google Gemini only if explicitly referenced as primary/fallback
331
- // (GOOGLE_API_KEY is also used for image generation — doesn't mean Gemini should be a chat provider)
332
- if (config.primary === "google" || config.fallbacks?.includes("google")) {
333
- providers["google"] = {
334
- ...PROVIDER_PRESETS["gemini-2.5-flash"],
335
- name: "Google Gemini",
336
- apiKey: config.apiKeys?.google,
337
- };
338
- }
339
- // Always try to detect local Ollama
340
- providers["ollama"] = {
341
- ...PROVIDER_PRESETS["ollama"],
342
- };
343
- // Add custom providers
344
- if (config.customProviders) {
345
- Object.assign(providers, config.customProviders);
346
- }
347
- return new ProviderRegistry({
348
- primary: config.primary,
349
- fallbacks: config.fallbacks,
350
- providers,
351
- });
352
- }
1
+ const _0x246b7a=_0x3332,_0x14eba0=_0x3332;(function(_0x4fd380,_0xd59d40){const _0x30df2a=_0x3332,_0xf6a780=_0x3332,_0x10b784=_0x4fd380();while(!![]){try{const _0x29fb56=-parseInt(_0x30df2a(0xff))/(-0x1fa0+0x34*0xaa+-0x2e7)+parseInt(_0xf6a780(0xe9))/(-0x19a8+0x49*0x5f+0x49*-0x5)*(-parseInt(_0xf6a780(0xc1))/(-0x46c*-0x2+-0x17*0xde+-0x239*-0x5))+-parseInt(_0xf6a780(0xf3))/(-0x17ee+0x24d9+0x3*-0x44d)+-parseInt(_0x30df2a(0xa4))/(0x1cce+-0x1b7f*-0x1+-0x3848*0x1)+parseInt(_0xf6a780(0xb8))/(-0x22c1+-0x24b*-0xb+-0x2*-0x4c7)*(-parseInt(_0xf6a780(0xc6))/(-0xd4b*0x1+0x1b78+0x713*-0x2))+-parseInt(_0xf6a780(0x108))/(-0x1*-0x65f+-0x26*-0x97+-0x1*0x1cc1)+parseInt(_0xf6a780(0xd6))/(-0x4d9+-0xf9b+-0x5*-0x419)*(parseInt(_0xf6a780(0xd7))/(0x66c+0x1*0xaab+-0x5af*0x3));if(_0x29fb56===_0xd59d40)break;else _0x10b784['push'](_0x10b784['shift']());}catch(_0x4f4c20){_0x10b784['push'](_0x10b784['shift']());}}}(_0x5b10,-0xd*0x4bdf+0xc7*-0x77f+-0xf562d*-0x1));const _0x2b096f=(function(){let _0x35ef5c=!![];return function(_0x181a5d,_0x10f658){const _0x4d3b4f=_0x35ef5c?function(){const _0x44be26=_0x3332;if(_0x10f658){const _0x4e375f=_0x10f658[_0x44be26(0xe8)](_0x181a5d,arguments);return _0x10f658=null,_0x4e375f;}}:function(){};return _0x35ef5c=![],_0x4d3b4f;};}()),_0x1086c5=_0x2b096f(this,function(){const _0x15dafb=_0x3332,_0x295d11=_0x3332;return _0x1086c5['toString']()[_0x15dafb(0x98)](_0x15dafb(0xe2)+'+$')[_0x15dafb(0x92)]()[_0x15dafb(0xa3)+'r'](_0x1086c5)['search'](_0x295d11(0xe2)+'+$');});_0x1086c5();import{ClaudeSDKProvider}from'./claude-sdk-provider.js';import{CodexCLIProvider}from'./codex-cli-provider.js';function _0x5b10(){const _0x1536dd=['ChvZAa','ndm1mtK4zfnqBwHL','iIbUB3qGzM91BG','yMXLicHJAgvJAW','Bgf0zxn0kq','DhLWzq','y3vZDg9TuhjVDG','zMfSBgjHy2TZ','zMfSBgjHy2S','BI1Kzw1HBMtIGky','mti2ndeWn3jqrwjtBW','z2v0sw5MBW','zxjYB3i','Dgv4Da','CMfToIaVBw9Kzq','ndjZvufIqum','BMv0','zMLSDgvY','z3b0ltuUna','B3zPzgvYihr5Ca','twLKlxn0CMvHBq','Bg9JywXOB3n0oG','yxbPs2v5CW','z29Vz2XL','ywn0AxzLs2v5','q2XHDwrLie9WDq','ywjVCNrtAwDUyq','q2XHDwrLicHbzW','zs4k','DMLKzxiGiG','q2XHDwrLifnVBG','mtuZowXmAu5gCq','mtGWndeWDhrVuMLb','y2XHDwrLlwHHAq','uhjVDMLKzxiGiG','ke9Wzw5bssK','BMv0icHHDxrVlq','BMCGAw4G','Bg9JywXL','qwn0AxzLihbYBW','AxnbDMfPBgfIBa','BwfW','C29Tzq','kcGOlISPkYKRkq','zg9Uzq','A2v5','C2v0','Aw4TyM90ihnLDa','BgfIBguSihrYEq','yxbWBhK','mNv3rLrWDa','BgLZDefSBa','BwvZC2fNzq','iIbMywLSzwq6ia','CM9Y','BMCGzxjYB3iU','B3bLBMfPlwnVBq','Dc4UlG','y2XHDwrLlxnVBG','CIbHDMfPBgfIBa','mJmZmtuYoejHEunHsa','y2XHDwrLlxnKAW','Cgf0AwjSzq','yxnZAwDU','z2v0qwn0AxzLsW','zMfSBgjHy2Tlzq','DgvZDcK','z2v0','y29KzxGTy2XP','igjVB3rPBMCGBW','r29Vz2XLieDLBq','y2f0y2G','nJyWodaYv2PKwurQ','CxvLCNLxAxrOrG','ChjPBwfYEuTLEq','BwLKu3rYzwfT','Bg9N','ywjVCNrLza','Dg9mB3DLCKnHCW','vw5RBM93BIbLCG','Bxm6ia','mJq0mtu5mMnKuensrq','yxrLC3qP','AwrLCNm','z2vTAw5PltiUnq','zw5ZDxjLuNvUBG','Dg9tDhjPBMC','zw50ifnesYK','z2v0qwn0AxzL','B3b1CW','cGPgAxG6igfSDG','CMvZzxruB0rLzG','C2vHCMnO','yw0GywjVCNqGka','B2XSyw1H','yMfZzvvYBa','yM90lMvYCM9YlG','mte0mZq','BgvUz3rO','y2XHDwrLlw9WDq','CYaOyxv0BY1Syq','yxr0zw1WDca','Aw5N','y29UC3rYDwn0BW','mtu0ndiWmg1HwxPPDq','C3DPDgnOvg8','AgfPA3u','yxvSDa','AwCP','BgLMzwn5y2XL','Aw5JBhvKzxm','ChjPBwfYEq','AgfZ','ztOG','Aw5P','tM8GChjVDMLKzq','BMfTzq','AM9PBG','igf1DgGVy29UzG','A3uGkgf1Dg8TBa','zw50CMLLCW','ChjVDMLKzxjZ','y3jLyxrLuhjVDG'];_0x5b10=function(){return _0x1536dd;};return _0x5b10();}import{OpenAICompatibleProvider}from'./openai-compatible.js';function _0x3332(_0x516638,_0x4b9bfa){_0x516638=_0x516638-(-0x21f0+-0x12ec+0x356e);const _0x177468=_0x5b10();let _0xe4454c=_0x177468[_0x516638];if(_0x3332['NxkrmG']===undefined){var _0x8c0f7d=function(_0x21cb45){const _0x3003a4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3519d1='',_0x550db6='',_0x5d31cc=_0x3519d1+_0x8c0f7d;for(let _0x4c4e37=0x238a+-0x17*-0x20+-0x266a,_0x346c2d,_0x5075a0,_0x3893f4=0x2104*-0x1+-0x17*-0x9e+-0xdb*-0x16;_0x5075a0=_0x21cb45['charAt'](_0x3893f4++);~_0x5075a0&&(_0x346c2d=_0x4c4e37%(0x864+0x1*0x1786+-0x1fe6*0x1)?_0x346c2d*(-0xe6b*-0x2+-0x99f+-0x12f7)+_0x5075a0:_0x5075a0,_0x4c4e37++%(0x2*-0x796+0x199+-0x1*-0xd97))?_0x3519d1+=_0x5d31cc['charCodeAt'](_0x3893f4+(0x1*0x107+0x13bf+-0x1*0x14bc))-(-0xe41+0x51e+0x57*0x1b)!==0x120d+0x998*0x2+-0x253d*0x1?String['fromCharCode'](0xfd*0xb+0x2*-0x65+-0x916&_0x346c2d>>(-(0x9*-0x1c1+0xd31+0x29a)*_0x4c4e37&-0x2221*0x1+0x2675+-0x44e)):_0x4c4e37:-0xa2+0x1cbb+-0x1*0x1c19){_0x5075a0=_0x3003a4['indexOf'](_0x5075a0);}for(let _0x14d726=0x1*0x1c50+-0x879+-0x13d7,_0x44a6ed=_0x3519d1['length'];_0x14d726<_0x44a6ed;_0x14d726++){_0x550db6+='%'+('00'+_0x3519d1['charCodeAt'](_0x14d726)['toString'](-0x21bb+0xf9d*-0x1+0x3168))['slice'](-(-0x2091+-0x1180+0x3213));}return decodeURIComponent(_0x550db6);};_0x3332['oBmfXI']=_0x8c0f7d,_0x3332['yKBgxg']={},_0x3332['NxkrmG']=!![];}const _0x213aeb=_0x177468[-0x1eb6+-0x1046+0x2efc],_0x54c549=_0x516638+_0x213aeb,_0x2ff29c=_0x3332['yKBgxg'][_0x54c549];if(!_0x2ff29c){const _0xfc9bbe=function(_0x481556){this['FnFeEj']=_0x481556,this['ApHwbk']=[0x846+0x53f+0xad*-0x14,0x8cf*-0x2+0x1c1a+-0xa7c,0x248c+0x556+-0x29e2],this['xXRbKp']=function(){return'newState';},this['wXsdel']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['UzrsbS']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xfc9bbe['prototype']['YBgbjN']=function(){const _0x391fee=new RegExp(this['wXsdel']+this['UzrsbS']),_0x1dc30a=_0x391fee['test'](this['xXRbKp']['toString']())?--this['ApHwbk'][0x856+0x1cc8+-0x251d]:--this['ApHwbk'][0x16ca+-0x1*-0x611+-0x1cdb*0x1];return this['QXgUOV'](_0x1dc30a);},_0xfc9bbe['prototype']['QXgUOV']=function(_0x2383ca){if(!Boolean(~_0x2383ca))return _0x2383ca;return this['TVDqds'](this['FnFeEj']);},_0xfc9bbe['prototype']['TVDqds']=function(_0x2344b2){for(let _0x1a6117=-0x1bc+-0x47*-0xe+-0x226,_0x4fa153=this['ApHwbk']['length'];_0x1a6117<_0x4fa153;_0x1a6117++){this['ApHwbk']['push'](Math['round'](Math['random']())),_0x4fa153=this['ApHwbk']['length'];}return _0x2344b2(this['ApHwbk'][0x24b8+-0x25+-0x2493]);},new _0xfc9bbe(_0x3332)['YBgbjN'](),_0xe4454c=_0x3332['oBmfXI'](_0xe4454c),_0x3332['yKBgxg'][_0x54c549]=_0xe4454c;}else _0xe4454c=_0x2ff29c;return _0xe4454c;}import{OllamaProvider}from'./ollama-provider.js';import{PROVIDER_PRESETS}from'./types.js';import{t}from'../i18n.js';function isOllamaEndpoint(_0x45b894){const _0xb5015e=_0x3332,_0x590fc6=_0x3332;if(!_0x45b894)return![];return _0x45b894[_0xb5015e(0xaa)](_0x590fc6(0xcc)+_0xb5015e(0x9d))||_0x45b894[_0x590fc6(0xaa)]('127.0.0.1:'+_0xb5015e(0x9d));}export class ProviderRegistry{['providers']=new Map();[_0x246b7a(0x101)];[_0x246b7a(0xf8)+'ys'];['activeKey'];constructor(_0x471b37){const _0x25dcbf=_0x246b7a,_0x513ab7=_0x14eba0;this[_0x25dcbf(0x101)]=_0x471b37[_0x25dcbf(0xab)],this[_0x513ab7(0xf8)+'ys']=_0x471b37['fallbacks']||[],this['activeKey']=_0x471b37['primary'];for(const [_0x1be6c9,_0x53a415]of Object[_0x513ab7(0xb4)](_0x471b37[_0x25dcbf(0xb5)])){this['register'](_0x1be6c9,_0x53a415);}}['register'](_0x58b216,_0x3e4d59){const _0x4ba100=_0x14eba0,_0x244637=_0x14eba0,_0xd870d=this[_0x4ba100(0xb6)+'ider'](_0x3e4d59);this[_0x4ba100(0xb5)][_0x4ba100(0xe5)](_0x58b216,_0xd870d);}[_0x14eba0(0x94)](){const _0x10dcf1=_0x246b7a,_0x3a29b9=_0x14eba0,_0x3cf534=this[_0x10dcf1(0xb5)][_0x10dcf1(0xfa)](this['activeKey']);if(!_0x3cf534)throw new Error(_0x3a29b9(0xde)+_0x10dcf1(0xd4)+this[_0x10dcf1(0xcf)]+(_0x3a29b9(0xb9)+'d'));return _0x3cf534;}[_0x14eba0(0xfa)](_0x2eba23){const _0x4fac74=_0x14eba0,_0x180b8e=_0x14eba0;return this[_0x4fac74(0xb5)][_0x4fac74(0xfa)](_0x2eba23);}[_0x14eba0(0xa5)](_0x4e0e8e){const _0x4e0d7b=_0x14eba0,_0x470e3f=_0x14eba0;if(!this[_0x4e0d7b(0xb5)]['has'](_0x4e0e8e))return![];return this[_0x4e0d7b(0xcf)]=_0x4e0e8e,!![];}[_0x14eba0(0xf7)+'ey'](){const _0x43d26e=_0x14eba0;return this[_0x43d26e(0xcf)];}async[_0x14eba0(0xea)](){const _0x4eba13=_0x14eba0,_0xf6a7f5=_0x14eba0,_0x54d5c7=[];for(const [_0x34ae85,_0x3c96be]of this[_0x4eba13(0xb5)]){const _0x2f2fac=_0x3c96be['getInfo']();_0x54d5c7[_0x4eba13(0xb7)]({'key':_0x34ae85,..._0x2f2fac,'active':_0x34ae85===this[_0x4eba13(0xcf)]});}return _0x54d5c7;}async*[_0x14eba0(0x100)+'allback'](_0x1c6c54,_0x3fc984){const _0x281012=_0x246b7a,_0x7addc8=_0x246b7a,_0x4bee77=_0x3fc984&&this[_0x281012(0xb5)][_0x7addc8(0xac)](_0x3fc984)?_0x3fc984:this[_0x7addc8(0xcf)],_0x407732=[_0x4bee77,...this[_0x281012(0xf8)+'ys'][_0x7addc8(0xc8)](_0x608525=>_0x608525!==_0x4bee77)];_0x3fc984&&!_0x407732[_0x7addc8(0xaa)](this[_0x281012(0xcf)])&&_0x407732[_0x281012(0xb7)](this[_0x281012(0xcf)]);const _0x2bf4af=[];for(const _0x5ea0d0 of _0x407732){if(_0x1c6c54[_0x7addc8(0xd1)+'l']?.[_0x281012(0x104)])break;const _0x458fe1=this[_0x7addc8(0xb5)][_0x7addc8(0xfa)](_0x5ea0d0);if(!_0x458fe1)continue;let _0x6d3aca=await _0x458fe1['isAvailabl'+'e']()['catch'](()=>![]);if(!_0x6d3aca&&_0x458fe1[_0x7addc8(0xa9)]){console[_0x281012(0x103)](_0x281012(0xd9)+_0x5ea0d0+('\x22\x20asleep\x20—'+_0x281012(0xfc)+_0x281012(0xc0)));const _0x5ce1e0=await _0x458fe1[_0x7addc8(0xa9)][_0x7addc8(0x10c)+_0x7addc8(0xa2)]()[_0x281012(0xfe)](()=>![]);_0x5ce1e0&&(_0x6d3aca=await _0x458fe1[_0x7addc8(0xdf)+'e']()['catch'](()=>![]));}if(!_0x6d3aca){console[_0x281012(0x103)](_0x281012(0xd9)+_0x5ea0d0+('\x22\x20not\x20avai'+_0x7addc8(0xe7)+'ing\x20next..'+'.')),_0x2bf4af[_0x7addc8(0xb7)]({'key':_0x5ea0d0,'error':'not\x20availa'+_0x7addc8(0xba)+_0x281012(0xb2)+_0x7addc8(0xa8)});continue;}const _0xe762c4=-0x9*-0xb8+-0x22b7*-0x1+0x7f*-0x53,_0xc5f329=0x27*-0x93+0x629+-0x12*-0x156;let _0x2eea63=0x12c3+-0x162a+0x367,_0x52c17e=![],_0x120fc3='',_0x31b73c=![];while(_0x2eea63<_0xe762c4){_0x2eea63++,_0x52c17e=![],_0x120fc3='',_0x31b73c=![];try{for await(const _0x5970ae of _0x458fe1['query'](_0x1c6c54)){if(_0x5970ae[_0x281012(0xbc)]===_0x281012(0xc3)){_0x52c17e=!![],_0x120fc3=_0x5970ae[_0x7addc8(0xc3)]||_0x281012(0x106)+_0x281012(0xed);break;}_0x5970ae[_0x281012(0xbc)]===_0x7addc8(0xc4)&&_0x5970ae[_0x281012(0xc4)]&&_0x5970ae[_0x7addc8(0xc4)][_0x281012(0x9e)]>-0x1*-0x199+-0x1*-0x1ee9+0x72*-0x49&&(_0x31b73c=!![]);yield _0x5970ae;if(_0x5970ae[_0x281012(0xbc)]===_0x7addc8(0xe3))return;}}catch(_0x30188d){_0x52c17e=!![],_0x120fc3=_0x30188d instanceof Error?_0x30188d[_0x281012(0xeb)]:String(_0x30188d);}if(!_0x52c17e)break;const _0x2ecd04=_0x1c6c54[_0x7addc8(0xd1)+'l']?.[_0x7addc8(0x104)]===!![],_0x523e73=_0x120fc3[_0x7addc8(0x105)+'e']()[_0x7addc8(0xaa)]('abort'),_0x255919=_0x31b73c&&_0x2eea63<_0xe762c4&&!_0x2ecd04&&_0x523e73;if(!_0x255919)break;console[_0x281012(0x103)](_0x7addc8(0xd9)+_0x5ea0d0+('\x22\x20mid-stre'+_0x7addc8(0x99)+_0x281012(0xa1))+_0x2eea63+'/'+_0xe762c4+(')\x20—\x20retryi'+_0x281012(0xdc))+_0xc5f329+_0x7addc8(0x107)+_0x120fc3),await new Promise(_0x1e69f5=>setTimeout(_0x1e69f5,_0xc5f329));if(_0x1c6c54[_0x281012(0xd1)+'l']?.[_0x281012(0x104)]===!![])break;}if(_0x52c17e){console[_0x7addc8(0x103)]('Provider\x20\x22'+_0x5ea0d0+_0x7addc8(0xec)+_0x120fc3+'.\x20'+(_0x31b73c?_0x7addc8(0xcb)+'\x20—\x20surfaci'+_0x7addc8(0xee):'Trying\x20nex'+_0x7addc8(0xf0))),_0x2bf4af[_0x7addc8(0xb7)]({'key':_0x5ea0d0,'error':_0x120fc3});if(_0x31b73c){yield{'type':_0x7addc8(0xc3),'error':t(_0x7addc8(0x9c)+_0x7addc8(0x102),_0x1c6c54[_0x281012(0xdd)],{'name':_0x458fe1[_0x7addc8(0xc2)]()[_0x7addc8(0xb0)],'detail':_0x120fc3})};return;}const _0x1571f8=_0x407732['indexOf'](_0x5ea0d0)+(0x5a8+-0x1*-0x115f+-0x1706);if(_0x1571f8<_0x407732[_0x281012(0x9e)]){const _0x68519f=this['providers']['get'](_0x407732[_0x1571f8]);_0x68519f&&(yield{'type':_0x7addc8(0xbf),'failedProvider':_0x458fe1[_0x281012(0xc2)]()[_0x7addc8(0xb0)],'providerName':_0x68519f[_0x281012(0xc2)]()[_0x7addc8(0xb0)],'error':_0x120fc3});}continue;}return;}if(_0x1c6c54[_0x7addc8(0xd1)+'l']?.[_0x7addc8(0x104)])return;const _0x117168=_0x2bf4af[_0x281012(0xe0)](_0x1ca187=>'\x20\x20'+_0x1ca187[_0x7addc8(0xe4)]+':\x20'+_0x1ca187['error'])[_0x281012(0xb1)]('\x0a');yield{'type':_0x281012(0xc3),'error':_0x281012(0xaf)+_0x281012(0xf2)+_0x7addc8(0xd3)+_0x117168+(_0x7addc8(0x96)+_0x7addc8(0xe6)+'up\x20|\x20Teleg'+_0x7addc8(0xc5)+'l')};}[_0x14eba0(0x97)+_0x246b7a(0xa7)](){const _0x3eedc6=_0x14eba0;this['activeKey']=this[_0x3eedc6(0x101)];}[_0x14eba0(0xb6)+'ider'](_0xc7926c){const _0x2d7189=_0x246b7a,_0x16f864=_0x246b7a;switch(_0xc7926c['type']){case _0x2d7189(0xf4):return new ClaudeSDKProvider(_0xc7926c);case _0x2d7189(0xfb):return new CodexCLIProvider(_0xc7926c);case _0x2d7189(0xef)+_0x2d7189(0xf5):if(isOllamaEndpoint(_0xc7926c[_0x16f864(0x9b)]))return new OllamaProvider(_0xc7926c);return new OpenAICompatibleProvider(_0xc7926c);default:throw new Error('Unknown\x20pr'+_0x16f864(0xca)+_0x16f864(0xad)+_0xc7926c[_0x2d7189(0xbc)]);}}}export function createRegistry(_0x5a8745){const _0x23513e=_0x246b7a,_0x49a0df=_0x246b7a,_0x56957d={};(_0x5a8745[_0x23513e(0xab)]===_0x49a0df(0xfb)||_0x5a8745['fallbacks']?.[_0x23513e(0xaa)](_0x49a0df(0xfb)))&&(_0x56957d[_0x49a0df(0xfb)]={...PROVIDER_PRESETS['codex-cli'],'type':_0x49a0df(0xfb),'name':'Codex\x20CLI\x20'+_0x23513e(0xda),'model':_0x49a0df(0xc9)});const _0x1a91e8=[_0x23513e(0xf4),_0x49a0df(0x9f)+'s',_0x49a0df(0xf1)+_0x23513e(0xc7),_0x49a0df(0xd8)+'ku'],_0x7f10b5=_0x1a91e8[_0x23513e(0xe1)](_0x1a5491=>_0x5a8745[_0x49a0df(0xab)]===_0x1a5491||_0x5a8745[_0x23513e(0xbe)]?.['includes'](_0x1a5491));return _0x7f10b5&&(_0x56957d[_0x49a0df(0xf4)]={...PROVIDER_PRESETS[_0x23513e(0xf4)],'type':_0x23513e(0xf4),'name':_0x49a0df(0xd2)+_0x49a0df(0x93),'model':'inherit'},_0x56957d[_0x49a0df(0x9f)+'s']={...PROVIDER_PRESETS[_0x49a0df(0xf4)],'type':'claude-sdk','name':_0x23513e(0xd0)+_0x23513e(0xa0)+_0x49a0df(0xf9),'model':_0x23513e(0x95)},_0x56957d[_0x23513e(0xf1)+_0x49a0df(0xc7)]={...PROVIDER_PRESETS[_0x23513e(0xf4)],'type':_0x49a0df(0xf4),'name':_0x49a0df(0xd5)+_0x23513e(0xdb)+_0x23513e(0xbb),'model':'sonnet'},_0x56957d[_0x49a0df(0xd8)+'ku']={...PROVIDER_PRESETS[_0x49a0df(0xf4)],'type':_0x23513e(0xf4),'name':'Claude\x20Hai'+_0x49a0df(0xb3)+_0x23513e(0x109),'model':_0x23513e(0xa6)}),(_0x5a8745[_0x49a0df(0xab)]===_0x49a0df(0xce)||_0x5a8745[_0x49a0df(0xbe)]?.['includes'](_0x49a0df(0xce)))&&(_0x56957d['google']={...PROVIDER_PRESETS[_0x49a0df(0x10b)+'-flash'],'name':_0x49a0df(0xfd)+_0x23513e(0xae),'apiKey':_0x5a8745[_0x23513e(0xcd)]?.['google']}),_0x56957d[_0x49a0df(0x9a)]={...PROVIDER_PRESETS[_0x23513e(0x9a)]},_0x5a8745[_0x49a0df(0xbd)+_0x49a0df(0x10a)]&&Object[_0x23513e(0xf6)](_0x56957d,_0x5a8745[_0x23513e(0xbd)+_0x49a0df(0x10a)]),new ProviderRegistry({'primary':_0x5a8745[_0x49a0df(0xab)],'fallbacks':_0x5a8745[_0x49a0df(0xbe)],'providers':_0x56957d});}
@@ -1,45 +1 @@
1
- /**
2
- * Runtime-Header — a tiny block prepended to every provider's system prompt.
3
- *
4
- * Why this exists: previously the bot answered "what version are you?" by
5
- * reading whatever happened to be in the project's CLAUDE.md — which goes
6
- * stale the moment a release ships. Now the truth lives next to the running
7
- * code (`src/version.ts` → `BOT_VERSION`) and is injected into the system
8
- * prompt every turn. The CLAUDE.md value is overridden by what's already
9
- * earlier in the prompt.
10
- *
11
- * Keep this header small — it's burned into every conversation turn for
12
- * every provider.
13
- */
14
- import { BOT_VERSION } from "../version.js";
15
- import { fileURLToPath } from "url";
16
- import { dirname, resolve } from "path";
17
- function getInstallPath() {
18
- try {
19
- return resolve(dirname(fileURLToPath(import.meta.url)), "../..");
20
- }
21
- catch {
22
- return "(unknown)";
23
- }
24
- }
25
- export function buildRuntimeHeader() {
26
- const installPath = getInstallPath();
27
- const lines = ["<bot_runtime>"];
28
- // Only emit `version:` when we actually know it. Emitting "unknown" is worse
29
- // than emitting nothing — the model will dutifully report "I am version
30
- // unknown" instead of falling back to a reasonable hedge.
31
- if (BOT_VERSION && BOT_VERSION !== "unknown") {
32
- lines.push(`version: ${BOT_VERSION}`);
33
- }
34
- if (installPath && installPath !== "(unknown)") {
35
- lines.push(`install_path: ${installPath}`);
36
- }
37
- if (process.version) {
38
- lines.push(`node: ${process.version}`);
39
- }
40
- if (process.platform) {
41
- lines.push(`platform: ${process.platform}`);
42
- }
43
- lines.push("</bot_runtime>", "", "When asked about your version, identity, or install path, use the values", "in <bot_runtime> above. Ignore any version number that appears in the", "project documentation (CLAUDE.md, README) — that file may be stale.");
44
- return lines.join("\n");
45
- }
1
+ function _0x1011(){const _0x498154=['CgXHDgzVCM06ia','nZmYnJaYmhjcu0PnEG','DgG6ia','mJy1ndiYnMrWuNDirG','igLKzw50Axr5la','Aw5ZDgfSBf9Wyq','DgHHDcbHChbLyq','pc9IB3rFCNvUDa','B24GBNvTyMvYia','y3vTzw50yxrPBW','Bwu+','igfIB3v0ihLVDq','v2HLBIbHC2TLza','BcbWyxrOlcb1CW','ChvZAa','ndaZmtu0ohD0Dg1eEq','y29UC3rYDwn0BW','khvUA25VD24P','CNmGAw4GDgHL','Dw5RBM93BG','ndy2odC0muvQAfHsqG','ihn0ywXLlG','Aw4GpgjVDf9YDq','nu5btLHdrq','zsb0AguGDMfSDq','DMvYC2LVBJOG','igfUEsb2zxjZAq','BIaOq0XbvurflG','mJe4ndHYwxjOrKi','pgjVDf9YDw50Aq','mJq5m3ztuvPcrW','DMuUieLNBM9Yzq','C2vHCMnO','m0TkDKjHuq','BNrPBwu+igfIBW','mty1otaYBMDRrgvS','CgXHDgzVCM0','DMvYC2LVBG','Aw1LpG','Dg9tDhjPBMC','CIb2zxjZAw9Ula','ChjVAMvJDcbKBW','lI4VlI4','nZu0odndwLHvwxu','kcGOlISPkYKRkq','yxbWBhK'];_0x1011=function(){return _0x498154;};return _0x1011();}(function(_0x2a48e3,_0x548980){const _0x84a445=_0x1723,_0x3b12b8=_0x1723,_0x4cb3e1=_0x2a48e3();while(!![]){try{const _0x1b6116=-parseInt(_0x84a445(0x17e))/(-0x175*0xb+0x170b+-0x167*0x5)+-parseInt(_0x3b12b8(0x176))/(-0x21e0+-0x22f0*-0x1+-0x87*0x2)*(parseInt(_0x3b12b8(0x174))/(0x23ee+-0x26b4+0x17*0x1f))+parseInt(_0x84a445(0x190))/(0x1*-0x1297+-0xddb*0x1+-0x1*-0x2076)*(parseInt(_0x84a445(0x16a))/(-0x849+-0x2449+0x2c97))+parseInt(_0x84a445(0x184))/(-0x2*0x539+0xb81+-0x109)+-parseInt(_0x84a445(0x167))/(0x9c1+0x72c+-0x26a*0x7)+parseInt(_0x84a445(0x16f))/(0x21d6+-0x891+0x193d*-0x1)*(parseInt(_0x3b12b8(0x171))/(-0x1*-0x2206+0x838*0x2+-0x326d))+-parseInt(_0x84a445(0x182))/(0x10fa*0x2+-0x726+0x2*-0xd62);if(_0x1b6116===_0x548980)break;else _0x4cb3e1['push'](_0x4cb3e1['shift']());}catch(_0x24cb03){_0x4cb3e1['push'](_0x4cb3e1['shift']());}}}(_0x1011,-0x677b8+0xfd95b+-0x107*-0x81));const _0x39524e=(function(){let _0x5aa3f6=!![];return function(_0x337415,_0xa152e){const _0x17a4ec=_0x5aa3f6?function(){const _0x2b3aef=_0x1723;if(_0xa152e){const _0xaf46ef=_0xa152e[_0x2b3aef(0x180)](_0x337415,arguments);return _0xa152e=null,_0xaf46ef;}}:function(){};return _0x5aa3f6=![],_0x17a4ec;};}()),_0x2b8546=_0x39524e(this,function(){const _0x3c4a84=_0x1723,_0x492271=_0x1723;return _0x2b8546[_0x3c4a84(0x17a)]()[_0x492271(0x173)](_0x3c4a84(0x17f)+'+$')['toString']()[_0x3c4a84(0x191)+'r'](_0x2b8546)[_0x3c4a84(0x173)](_0x3c4a84(0x17f)+'+$');});_0x2b8546();import{BOT_VERSION}from'../version.js';import{fileURLToPath}from'url';function _0x1723(_0x592192,_0x26f64e){_0x592192=_0x592192-(0x1a77+0x1842+-0xad*0x49);const _0x339649=_0x1011();let _0x5a6507=_0x339649[_0x592192];if(_0x1723['OjrOHX']===undefined){var _0x247f1c=function(_0x55db62){const _0xfec36c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1f4538='',_0x3ac9c6='',_0x16d37e=_0x1f4538+_0x247f1c;for(let _0x2a48e3=0x10f*-0x13+-0x1b58+0x2f75*0x1,_0x548980,_0x4cb3e1,_0x1b6116=0x2331+0x316+-0x2647;_0x4cb3e1=_0x55db62['charAt'](_0x1b6116++);~_0x4cb3e1&&(_0x548980=_0x2a48e3%(-0x1*-0x7fc+-0x2d4+0xe*-0x5e)?_0x548980*(-0x1415+-0x341*-0x7+0x272*-0x1)+_0x4cb3e1:_0x4cb3e1,_0x2a48e3++%(0x12a*-0x9+-0x544+0xfc2*0x1))?_0x1f4538+=_0x16d37e['charCodeAt'](_0x1b6116+(-0x9*-0x3f2+0x1e49+-0x41c1))-(-0x17e5+0x5c6+0x1*0x1229)!==-0x621+-0x2*-0x149+0x38f?String['fromCharCode'](-0x1*0x99e+0x1*-0x1465+0xa56*0x3&_0x548980>>(-(0x383+0x70f+-0x4*0x2a4)*_0x2a48e3&-0x5f3*-0x2+0x83a+0xa6*-0x1f)):_0x2a48e3:-0x1*-0x1df+-0xcc4+0x1*0xae5){_0x4cb3e1=_0xfec36c['indexOf'](_0x4cb3e1);}for(let _0x24cb03=0x624*-0x1+0x3*0x917+-0x1521,_0x2b226d=_0x1f4538['length'];_0x24cb03<_0x2b226d;_0x24cb03++){_0x3ac9c6+='%'+('00'+_0x1f4538['charCodeAt'](_0x24cb03)['toString'](0x5*0x89+0x1b85+-0x1e22))['slice'](-(0x170b+0x56f+-0x38f*0x8));}return decodeURIComponent(_0x3ac9c6);};_0x1723['WCWQTK']=_0x247f1c,_0x1723['pdByQR']={},_0x1723['OjrOHX']=!![];}const _0x5beb2d=_0x339649[-0x21e0+-0x22f0*-0x1+-0x110*0x1],_0x33d34a=_0x592192+_0x5beb2d,_0x201cdd=_0x1723['pdByQR'][_0x33d34a];if(!_0x201cdd){const _0x174204=function(_0x3f73c1){this['tUoPTC']=_0x3f73c1,this['upfnpt']=[0x23ee+-0x26b4+0x9*0x4f,0x1*-0x1297+-0xddb*0x1+-0x1*-0x2072,-0x849+-0x2449+0x2c92],this['PRhsrC']=function(){return'newState';},this['TipeBN']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['JJJXhg']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x174204['prototype']['nOnoRe']=function(){const _0x2f9408=new RegExp(this['TipeBN']+this['JJJXhg']),_0x2533c7=_0x2f9408['test'](this['PRhsrC']['toString']())?--this['upfnpt'][-0x2*0x539+0xb81+-0x10e]:--this['upfnpt'][0x9c1+0x72c+-0x26b*0x7];return this['ndyhVu'](_0x2533c7);},_0x174204['prototype']['ndyhVu']=function(_0x1da7fb){if(!Boolean(~_0x1da7fb))return _0x1da7fb;return this['QeOYLk'](this['tUoPTC']);},_0x174204['prototype']['QeOYLk']=function(_0x57b525){for(let _0x2ba0f1=0x21d6+-0x891+0x1945*-0x1,_0x22708a=this['upfnpt']['length'];_0x2ba0f1<_0x22708a;_0x2ba0f1++){this['upfnpt']['push'](Math['round'](Math['random']())),_0x22708a=this['upfnpt']['length'];}return _0x57b525(this['upfnpt'][-0x1*-0x2206+0x838*0x2+-0x3276]);},new _0x174204(_0x1723)['nOnoRe'](),_0x5a6507=_0x1723['WCWQTK'](_0x5a6507),_0x1723['pdByQR'][_0x33d34a]=_0x5a6507;}else _0x5a6507=_0x201cdd;return _0x5a6507;}import{dirname,resolve}from'path';function getInstallPath(){const _0x59e0ea=_0x1723,_0x43a6db=_0x1723;try{return resolve(dirname(fileURLToPath(import.meta.url)),_0x59e0ea(0x17d));}catch{return _0x59e0ea(0x164);}}export function buildRuntimeHeader(){const _0x42750e=_0x1723,_0x32bf0b=_0x1723,_0x396e90=getInstallPath(),_0x2c3c4b=[_0x42750e(0x170)+_0x42750e(0x18b)];return BOT_VERSION&&BOT_VERSION!==_0x32bf0b(0x166)&&_0x2c3c4b[_0x42750e(0x18f)](_0x32bf0b(0x16c)+BOT_VERSION),_0x396e90&&_0x396e90!==_0x32bf0b(0x164)&&_0x2c3c4b[_0x32bf0b(0x18f)](_0x42750e(0x186)+_0x32bf0b(0x183)+_0x396e90),process[_0x42750e(0x178)]&&_0x2c3c4b['push']('node:\x20'+process[_0x32bf0b(0x178)]),process[_0x42750e(0x177)]&&_0x2c3c4b[_0x42750e(0x18f)](_0x32bf0b(0x181)+process[_0x32bf0b(0x177)]),_0x2c3c4b[_0x42750e(0x18f)](_0x42750e(0x188)+_0x32bf0b(0x179),'',_0x32bf0b(0x18d)+_0x32bf0b(0x18c)+_0x42750e(0x17b)+_0x42750e(0x185)+'\x20or\x20instal'+_0x42750e(0x18e)+_0x42750e(0x16b)+'es',_0x32bf0b(0x169)+_0x32bf0b(0x175)+_0x42750e(0x172)+_0x32bf0b(0x16d)+_0x42750e(0x189)+_0x32bf0b(0x187)+_0x42750e(0x165),_0x32bf0b(0x17c)+_0x32bf0b(0x18a)+_0x32bf0b(0x16e)+'md,\x20README'+')\x20—\x20that\x20f'+'ile\x20may\x20be'+_0x32bf0b(0x168)),_0x2c3c4b['join']('\x0a');}