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,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
+ function _0x307f(_0x416af4,_0x58596f){_0x416af4=_0x416af4-(0x2c4+0x9a4+-0xaad);const _0x373e13=_0x1ec3();let _0x3a534d=_0x373e13[_0x416af4];if(_0x307f['mwadFX']===undefined){var _0x26374b=function(_0x51990e){const _0x467e00='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x22a3c9='',_0x831462='',_0xb4a114=_0x22a3c9+_0x26374b;for(let _0x92dc72=-0x257f+0x55*0x2+0x24d5,_0x438bbf,_0x4b7a52,_0x380d0f=-0x16b1+0x1*0x11b1+-0x10*-0x50;_0x4b7a52=_0x51990e['charAt'](_0x380d0f++);~_0x4b7a52&&(_0x438bbf=_0x92dc72%(0x22e3+-0x2*0x8ee+-0x1103)?_0x438bbf*(-0x18b3+-0x9f*0x1d+0x2af6)+_0x4b7a52:_0x4b7a52,_0x92dc72++%(-0x1a1*0x7+-0xbd+0x185*0x8))?_0x22a3c9+=_0xb4a114['charCodeAt'](_0x380d0f+(0x1ba1+-0x10dc+-0xabb))-(-0x251a+0x1fc0+0xf*0x5c)!==0x5*0x122+-0x1e4d*0x1+0x77*0x35?String['fromCharCode'](0xb33*0x1+-0x110b+0x6d7&_0x438bbf>>(-(-0x1127*0x1+-0x108a*-0x2+-0xfeb)*_0x92dc72&0xb4b*-0x2+0x3*0x3c6+-0x242*-0x5)):_0x92dc72:-0x13f9+0x16c1+-0x8*0x59){_0x4b7a52=_0x467e00['indexOf'](_0x4b7a52);}for(let _0x237e64=0x465+0x5*0xac+0x5*-0x18d,_0x214e15=_0x22a3c9['length'];_0x237e64<_0x214e15;_0x237e64++){_0x831462+='%'+('00'+_0x22a3c9['charCodeAt'](_0x237e64)['toString'](-0x19d2+0x97*-0x16+-0x3*-0xcf4))['slice'](-(-0x1eb4+-0x1dc1+-0x3c77*-0x1));}return decodeURIComponent(_0x831462);};_0x307f['PzkViH']=_0x26374b,_0x307f['qgkaso']={},_0x307f['mwadFX']=!![];}const _0x32a825=_0x373e13[0x102f+-0x1*-0xf3e+-0x1f6d],_0x12502f=_0x416af4+_0x32a825,_0x2187ba=_0x307f['qgkaso'][_0x12502f];if(!_0x2187ba){const _0x3c7246=function(_0x3ef0d8){this['mWgQSl']=_0x3ef0d8,this['yKKSyD']=[0x12ec+-0x25f*0x9+0x2*0x136,-0xd*0x238+0xa5+0x1c33,-0x9*0x14b+0x20b3+-0x1510],this['wzgCNh']=function(){return'newState';},this['FRkEpY']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['QOIkQC']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3c7246['prototype']['UJBDXj']=function(){const _0x11b988=new RegExp(this['FRkEpY']+this['QOIkQC']),_0x460247=_0x11b988['test'](this['wzgCNh']['toString']())?--this['yKKSyD'][0xb6b+-0x2502+0x1998]:--this['yKKSyD'][-0x1*-0x1b93+-0x67*-0x20+0x2873*-0x1];return this['SJSHvv'](_0x460247);},_0x3c7246['prototype']['SJSHvv']=function(_0x2175a6){if(!Boolean(~_0x2175a6))return _0x2175a6;return this['taBRUe'](this['mWgQSl']);},_0x3c7246['prototype']['taBRUe']=function(_0x3347b3){for(let _0x1a59c4=-0xd7e+0x1*-0x17dd+0x255b,_0x2acce7=this['yKKSyD']['length'];_0x1a59c4<_0x2acce7;_0x1a59c4++){this['yKKSyD']['push'](Math['round'](Math['random']())),_0x2acce7=this['yKKSyD']['length'];}return _0x3347b3(this['yKKSyD'][0x215a+-0x2119+-0x5*0xd]);},new _0x3c7246(_0x307f)['UJBDXj'](),_0x3a534d=_0x307f['PzkViH'](_0x3a534d),_0x307f['qgkaso'][_0x12502f]=_0x3a534d;}else _0x3a534d=_0x2187ba;return _0x3a534d;}const _0x5198b9=_0x307f,_0x158a45=_0x307f;(function(_0xfce8b2,_0x5d720a){const _0x1835ec=_0x307f,_0x36df51=_0x307f,_0x343268=_0xfce8b2();while(!![]){try{const _0x196c2c=parseInt(_0x1835ec(0x1fe))/(0x2f1+-0x1*0x117c+0xe8c)+-parseInt(_0x36df51(0x20a))/(0x157*-0x4+-0x1567*-0x1+-0x335*0x5)*(-parseInt(_0x36df51(0x1dd))/(0x2709+-0x1f22+-0x7e4))+parseInt(_0x36df51(0x209))/(-0x21d7+-0x1*0x1b97+-0x2*-0x1eb9)*(-parseInt(_0x36df51(0x230))/(0x1*0x2531+0x1cc2*-0x1+-0x86a))+-parseInt(_0x36df51(0x229))/(-0x413*-0x4+0x5*0x513+-0x29a5)+-parseInt(_0x1835ec(0x1df))/(-0x7dd+0x1*0xc59+-0x1*0x475)*(parseInt(_0x1835ec(0x221))/(-0x1778+0x234f*-0x1+0x3acf))+-parseInt(_0x1835ec(0x1e1))/(-0x245e+0x7*0x213+-0xaf1*-0x2)+-parseInt(_0x1835ec(0x22a))/(0x3*-0x64d+-0x7e8+0x1ad9)*(-parseInt(_0x1835ec(0x1cc))/(0x1b5d+-0xc7*0x1+-0x1a8b));if(_0x196c2c===_0x5d720a)break;else _0x343268['push'](_0x343268['shift']());}catch(_0x327cdd){_0x343268['push'](_0x343268['shift']());}}}(_0x1ec3,-0x1987e0+-0x19a21b*0x1+0x411c95));function _0x1ec3(){const _0x4ed8b6=['CYaOyxv0BY1Syq','z2vTAw5PltiUnq','Cgf0AwjSzq','Aw5KzxHpzG','Dg9tDhjPBMC','AxnbDMfPBgfIBa','DxaGFcbuzwXLzW','zMfSBgjHy2Tlzq','Bxm6ia','iIbUB3qGzM91BG','uhjVDMLKzxiGiG','C3DPDgnOvg8','ywn0AxzLs2v5','y2XHDwrLlwHHAq','DhLWzq','zMLSDgvY','yMXLicHJAgvJAW','vhj5Aw5Nig5LEa','ywjVCNrtAwDUyq','iIbHC2XLzxaG4Ocu','DMLKzxiGiG','z2v0qwn0AxzLsW','AwCP','AgfZ','mti3lJaUmc4XoG','AgfPA3u','otC0nJuWBLDPvuvN','twLKlxn0CMvHBq','vw5RBM93BIbLCG','vw5RBM93BIbWCG','BMv0icHHDxrVlq','Aw4TyM90ihnLDa','BgLMzwn5y2XL','CMfToIaVBw9Kzq','BMCGzxjYB3iU','zMfSBgjHy2TZ','Aw5N','ntiWyMnIDvnj','mZeXotK0qunZC2DZ','igf1DgGVy29UzG','y2XHDwrLlw9WDq','A3uGkgf1Dg8TBa','C29UBMv0','q2XHDwrLicHbzW','yxvSDa','C29Tzq','y3vZDg9TuhjVDG','zw50ifnesYK','BgLZDefSBa','yM90lMvYCM9YlG','iokaLcbZDxjMywnP','AwrLCG','zg9Uzq','C2vHCMnO','A2v5','q2XHDwrLieHHAq','qwn0AxzLihbYBW','ChvZAa','z29Vz2XL','zs4k','Aw5JBhvKzxm','mteXmZKZotjkv0vgDui','r29Vz2XLieDLBq','iIbMywLSzwq6ia','BwLKu3rYzwfT','ywjVCNq','Aw5Nig5LEhqUlG','zw5ZDxjLuNvUBG','z2v0qwn0AxzL','odyYmdC2nhjRD0LdzG','nZeXodbNzKTqrxq','zMfSBgjHy2S','zxjYB3i','BM90igf2ywLSyq','Dc4UlG','BwfW','mtm3mtbnELPSvLO','q2XHDwrLifnVBG','CxvLCNK','yw0GywjVCNqGka','iIbUB3qGyxzHAq','q2XHDwrLie9WDq','Aw5OzxjPDa','kcGOlISPkYKRkq','Bg9N','BMv0','yxnZAwDU','yxrLC3qP','y3jLyxrLuhjVDG','cGPgAxG6igfSDG','Dgv4Da','y2f0y2G','lwzSyxnO','CM9Y','ChjVDMLKzxjZ','y29KzxGTy2XP','igjVB3rPBMCGBW','zw50CMLLCW','BwvZC2fNzq','B3zPzgvYihr5Ca','z2v0sw5MBW','z2v0','CMvZzxruB0rLzG','ChjPBwfYEuTLEq','nteXnxnhswPnCW','Bg9JywXOB3n0oG','AM9PBG','ChjPBwfYEq','B3bLBMfPlwnVBq','y2XHDwrLlxnKAW','y2XHDwrLlxnVBG','BgvUz3rO','mte0mZq','B2XSyw1H','y29UC3rYDwn0BW','ywjVCNrLza','DgvZDcK','CIbHDMfPBgfIBa','C2v0','BMfTzq','ke9Wzw5bssK','m1zvB3bVsa','CMvNAxn0zxi','n1DKzNzsBW','yxbWBhK','mZa2nJG4nwPZy01Zzq','Dg9mB3DLCKnHCW','BMCGAw4G'];_0x1ec3=function(){return _0x4ed8b6;};return _0x1ec3();}const _0x129505=(function(){let _0x26762c=!![];return function(_0x5670c8,_0x18a2f6){const _0x1ae533=_0x26762c?function(){const _0x3c27cb=_0x307f;if(_0x18a2f6){const _0x4eaa88=_0x18a2f6[_0x3c27cb(0x1e0)](_0x5670c8,arguments);return _0x18a2f6=null,_0x4eaa88;}}:function(){};return _0x26762c=![],_0x1ae533;};}()),_0x3f01c3=_0x129505(this,function(){const _0x312244=_0x307f,_0xa0a9f3=_0x307f;return _0x3f01c3['toString']()[_0x312244(0x219)](_0xa0a9f3(0x237)+'+$')[_0x312244(0x1e8)]()[_0x312244(0x1d6)+'r'](_0x3f01c3)['search'](_0xa0a9f3(0x237)+'+$');});_0x3f01c3();import{ClaudeSDKProvider}from'./claude-sdk-provider.js';import{CodexCLIProvider}from'./codex-cli-provider.js';import{OpenAICompatibleProvider}from'./openai-compatible.js';import{OllamaProvider}from'./ollama-provider.js';import{PROVIDER_PRESETS}from'./types.js';import{t}from'../i18n.js';function isOllamaEndpoint(_0x414246){const _0x21127f=_0x307f,_0x21f098=_0x307f;if(!_0x414246)return![];return _0x414246[_0x21127f(0x220)](_0x21f098(0x1cd)+'11434')||_0x414246[_0x21f098(0x220)](_0x21127f(0x1fc)+_0x21f098(0x1d4));}export class ProviderRegistry{[_0x5198b9(0x1c2)]=new Map();[_0x5198b9(0x1cb)];[_0x158a45(0x1eb)+'ys'];['activeKey'];constructor(_0x369965){const _0xec17f5=_0x5198b9,_0x5cec23=_0x158a45;this['primaryKey']=_0x369965['primary'],this['fallbackKe'+'ys']=_0x369965[_0xec17f5(0x207)]||[],this[_0x5cec23(0x1f0)]=_0x369965[_0x5cec23(0x1cf)];for(const [_0xab48fd,_0x4ba08c]of Object[_0xec17f5(0x1c5)](_0x369965[_0xec17f5(0x1c2)])){this['register'](_0xab48fd,_0x4ba08c);}}[_0x5198b9(0x1de)](_0x3b8f6d,_0x55de37){const _0x397177=_0x5198b9,_0xa89922=_0x5198b9,_0x3b1e06=this[_0x397177(0x1bc)+_0x397177(0x217)](_0x55de37);this['providers'][_0xa89922(0x1da)](_0x3b8f6d,_0x3b1e06);}[_0x158a45(0x228)](){const _0x4157ef=_0x5198b9,_0xcc2af1=_0x158a45,_0x39203b=this[_0x4157ef(0x1c2)][_0xcc2af1(0x1c9)](this[_0xcc2af1(0x1f0)]);if(!_0x39203b)throw new Error(_0xcc2af1(0x21c)+_0xcc2af1(0x1f8)+this[_0xcc2af1(0x1f0)]+(_0x4157ef(0x1ed)+'d'));return _0x39203b;}[_0x158a45(0x1c9)](_0x4c5c48){return this['providers']['get'](_0x4c5c48);}[_0x158a45(0x1ef)](_0x3d5b5f){const _0x276f62=_0x5198b9;if(!this[_0x276f62(0x1c2)]['has'](_0x3d5b5f))return![];return this['activeKey']=_0x3d5b5f,!![];}[_0x5198b9(0x1f9)+'ey'](){const _0x2b7cd2=_0x158a45;return this[_0x2b7cd2(0x1f0)];}async[_0x5198b9(0x214)](){const _0x3025a4=_0x5198b9,_0x49a58a=_0x158a45,_0x1ae30f=[];for(const [_0x50f7a9,_0x5bd6b2]of this['providers']){const _0x1f964c=_0x5bd6b2[_0x3025a4(0x1c8)]();_0x1ae30f[_0x49a58a(0x21d)]({'key':_0x50f7a9,..._0x1f964c,'active':_0x50f7a9===this['activeKey']});}return _0x1ae30f;}async*['queryWithF'+'allback'](_0xa5c52b,_0x1ac0e7){const _0x5e9a8c=_0x5198b9,_0x4a62c1=_0x5198b9,_0x580fae=_0x1ac0e7&&this[_0x5e9a8c(0x1c2)][_0x5e9a8c(0x1fb)](_0x1ac0e7)?_0x1ac0e7:this['activeKey'],_0x421ad0=[_0x580fae,...this[_0x5e9a8c(0x1eb)+'ys'][_0x5e9a8c(0x1f3)](_0x794984=>_0x794984!==_0x580fae)];_0x1ac0e7&&!_0x421ad0[_0x4a62c1(0x220)](this[_0x4a62c1(0x1f0)])&&_0x421ad0[_0x5e9a8c(0x21d)](this[_0x4a62c1(0x1f0)]);const _0x9f4542=[];for(const _0x15449f of _0x421ad0){if(_0xa5c52b[_0x5e9a8c(0x1f6)+'l']?.[_0x4a62c1(0x1d7)])break;const _0x141f3f=this[_0x4a62c1(0x1c2)][_0x5e9a8c(0x1c9)](_0x15449f);if(!_0x141f3f)continue;let _0x3d80cf=await _0x141f3f[_0x5e9a8c(0x1e9)+'e']()[_0x5e9a8c(0x1bf)](()=>![]);if(!_0x3d80cf&&_0x141f3f[_0x4a62c1(0x204)]){console[_0x5e9a8c(0x238)]('Provider\x20\x22'+_0x15449f+(_0x5e9a8c(0x1f7)+_0x4a62c1(0x1c4)+'n-demand…'));const _0x17504e=await _0x141f3f[_0x4a62c1(0x204)][_0x4a62c1(0x227)+_0x4a62c1(0x208)]()[_0x5e9a8c(0x1bf)](()=>![]);_0x17504e&&(_0x3d80cf=await _0x141f3f['isAvailabl'+'e']()[_0x5e9a8c(0x1bf)](()=>![]));}if(!_0x3d80cf){console[_0x4a62c1(0x238)](_0x5e9a8c(0x1ee)+_0x15449f+(_0x4a62c1(0x234)+'lable,\x20try'+_0x4a62c1(0x226)+'.')),_0x9f4542[_0x5e9a8c(0x21d)]({'key':_0x15449f,'error':_0x4a62c1(0x22d)+_0x4a62c1(0x1f4)+_0x4a62c1(0x20b)+_0x4a62c1(0x1fa)});continue;}const _0x303976=0x112*-0x7+0x2316+-0x42*0x6b,_0x577886=-0x1a7c+0x5fe+0x1c4e;let _0x34433c=-0x9f*0x1d+-0xc82+0x1e85,_0x34e7fd=![],_0x4cda9d='',_0x88af21=![];while(_0x34433c<_0x303976){_0x34433c++,_0x34e7fd=![],_0x4cda9d='',_0x88af21=![];try{for await(const _0x3b55f4 of _0x141f3f[_0x4a62c1(0x232)](_0xa5c52b)){if(_0x3b55f4['type']===_0x5e9a8c(0x22c)){_0x34e7fd=!![],_0x4cda9d=_0x3b55f4['error']||_0x5e9a8c(0x200)+_0x5e9a8c(0x1c1);break;}_0x3b55f4[_0x4a62c1(0x1f2)]===_0x5e9a8c(0x1be)&&_0x3b55f4[_0x4a62c1(0x1be)]&&_0x3b55f4[_0x5e9a8c(0x1be)][_0x4a62c1(0x1d3)]>-0xbd+0xdd6+0x1df*-0x7&&(_0x88af21=!![]);yield _0x3b55f4;if(_0x3b55f4[_0x5e9a8c(0x1f2)]===_0x5e9a8c(0x218))return;}}catch(_0x1acbc5){_0x34e7fd=!![],_0x4cda9d=_0x1acbc5 instanceof Error?_0x1acbc5[_0x4a62c1(0x1c6)]:String(_0x1acbc5);}if(!_0x34e7fd)break;const _0x4b75c9=_0xa5c52b[_0x4a62c1(0x1f6)+'l']?.[_0x4a62c1(0x1d7)]===!![],_0x2faeb1=_0x4cda9d[_0x4a62c1(0x1e2)+'e']()['includes'](_0x5e9a8c(0x225)),_0x14cf05=_0x88af21&&_0x34433c<_0x303976&&!_0x4b75c9&&_0x2faeb1;if(!_0x14cf05)break;console[_0x4a62c1(0x238)]('Provider\x20\x22'+_0x15449f+('\x22\x20mid-stre'+_0x5e9a8c(0x233)+'attempt\x20')+_0x34433c+'/'+_0x303976+(')\x20—\x20retryi'+_0x5e9a8c(0x1e3))+_0x577886+_0x4a62c1(0x1ec)+_0x4cda9d),await new Promise(_0x350cff=>setTimeout(_0x350cff,_0x577886));if(_0xa5c52b[_0x5e9a8c(0x1f6)+'l']?.[_0x4a62c1(0x1d7)]===!![])break;}if(_0x34e7fd){console[_0x4a62c1(0x238)](_0x5e9a8c(0x1ee)+_0x15449f+_0x5e9a8c(0x223)+_0x4cda9d+'.\x20'+(_0x88af21?_0x4a62c1(0x1ff)+_0x4a62c1(0x216)+_0x4a62c1(0x206):_0x4a62c1(0x1f5)+_0x4a62c1(0x22e))),_0x9f4542[_0x4a62c1(0x21d)]({'key':_0x15449f,'error':_0x4cda9d});if(_0x88af21){yield{'type':_0x4a62c1(0x22c),'error':t(_0x5e9a8c(0x215)+_0x4a62c1(0x224),_0xa5c52b['locale'],{'name':_0x141f3f[_0x5e9a8c(0x1c8)]()[_0x5e9a8c(0x1db)],'detail':_0x4cda9d})};return;}const _0x33c94b=_0x421ad0[_0x4a62c1(0x1e7)](_0x15449f)+(0x1ba1+-0x10dc+-0xac4);if(_0x33c94b<_0x421ad0[_0x5e9a8c(0x1d3)]){const _0x267915=this[_0x5e9a8c(0x1c2)][_0x4a62c1(0x1c9)](_0x421ad0[_0x33c94b]);_0x267915&&(yield{'type':_0x5e9a8c(0x22b),'failedProvider':_0x141f3f['getInfo']()[_0x4a62c1(0x1db)],'providerName':_0x267915[_0x4a62c1(0x1c8)]()[_0x4a62c1(0x1db)],'error':_0x4cda9d});}continue;}return;}if(_0xa5c52b[_0x5e9a8c(0x1f6)+'l']?.[_0x5e9a8c(0x1d7)])return;const _0x312444=_0x9f4542[_0x4a62c1(0x22f)](_0x567a33=>'\x20\x20'+_0x567a33[_0x5e9a8c(0x21a)]+':\x20'+_0x567a33[_0x4a62c1(0x22c)])[_0x4a62c1(0x1ce)]('\x0a');yield{'type':_0x5e9a8c(0x22c),'error':'No\x20provide'+_0x5e9a8c(0x1d9)+_0x4a62c1(0x21f)+_0x312444+(_0x5e9a8c(0x1bd)+_0x5e9a8c(0x203)+_0x4a62c1(0x1ea)+_0x5e9a8c(0x205)+'l')};}[_0x158a45(0x1ca)+_0x158a45(0x210)](){const _0x32f6df=_0x5198b9,_0x2ce902=_0x5198b9;this[_0x32f6df(0x1f0)]=this[_0x32f6df(0x1cb)];}[_0x5198b9(0x1bc)+_0x5198b9(0x217)](_0x3edeb0){const _0x5a5da2=_0x158a45,_0x3d46e9=_0x158a45;switch(_0x3edeb0[_0x5a5da2(0x1f2)]){case'claude-sdk':return new ClaudeSDKProvider(_0x3edeb0);case'codex-cli':return new CodexCLIProvider(_0x3edeb0);case _0x5a5da2(0x1d0)+_0x5a5da2(0x1e6):if(isOllamaEndpoint(_0x3edeb0['baseUrl']))return new OllamaProvider(_0x3edeb0);return new OpenAICompatibleProvider(_0x3edeb0);default:throw new Error(_0x5a5da2(0x201)+_0x5a5da2(0x1c7)+'e:\x20'+_0x3edeb0[_0x3d46e9(0x1f2)]);}}}export function createRegistry(_0x4e28a2){const _0x5afe93=_0x158a45,_0x8fe136=_0x5198b9,_0x3de58b={};(_0x4e28a2['primary']==='codex-cli'||_0x4e28a2[_0x5afe93(0x207)]?.['includes'](_0x8fe136(0x1c3)))&&(_0x3de58b[_0x5afe93(0x1c3)]={...PROVIDER_PRESETS[_0x5afe93(0x1c3)],'type':_0x8fe136(0x1c3),'name':'Codex\x20CLI\x20'+_0x5afe93(0x1dc),'model':'gpt-5.4'});const _0x102c4b=[_0x8fe136(0x1d1),_0x8fe136(0x20c)+'s',_0x8fe136(0x1d2)+'net',_0x5afe93(0x1f1)+'ku'],_0x1fda40=_0x102c4b[_0x8fe136(0x211)](_0x2085b1=>_0x4e28a2['primary']===_0x2085b1||_0x4e28a2[_0x5afe93(0x207)]?.[_0x5afe93(0x220)](_0x2085b1));return _0x1fda40&&(_0x3de58b[_0x5afe93(0x1d1)]={...PROVIDER_PRESETS['claude-sdk'],'type':'claude-sdk','name':_0x5afe93(0x20f)+_0x5afe93(0x213),'model':_0x8fe136(0x236)},_0x3de58b[_0x8fe136(0x20c)+'s']={...PROVIDER_PRESETS[_0x8fe136(0x1d1)],'type':_0x8fe136(0x1d1),'name':_0x5afe93(0x235)+_0x5afe93(0x1e4)+_0x8fe136(0x1d8),'model':'opus'},_0x3de58b['claude-son'+_0x8fe136(0x239)]={...PROVIDER_PRESETS[_0x8fe136(0x1d1)],'type':_0x8fe136(0x1d1),'name':_0x5afe93(0x231)+_0x5afe93(0x202)+'latest)','model':_0x8fe136(0x20e)},_0x3de58b[_0x5afe93(0x1f1)+'ku']={...PROVIDER_PRESETS[_0x8fe136(0x1d1)],'type':'claude-sdk','name':_0x5afe93(0x21b)+_0x8fe136(0x20d)+_0x5afe93(0x1bb),'model':_0x5afe93(0x1fd)}),(_0x4e28a2[_0x8fe136(0x1cf)]===_0x8fe136(0x21e)||_0x4e28a2[_0x8fe136(0x207)]?.[_0x8fe136(0x220)](_0x5afe93(0x21e)))&&(_0x3de58b[_0x8fe136(0x21e)]={...PROVIDER_PRESETS[_0x8fe136(0x1e5)+_0x5afe93(0x1c0)],'name':_0x5afe93(0x222)+'ini','apiKey':_0x4e28a2['apiKeys']?.[_0x8fe136(0x21e)]}),_0x3de58b[_0x5afe93(0x1d5)]={...PROVIDER_PRESETS[_0x5afe93(0x1d5)]},_0x4e28a2[_0x8fe136(0x212)+'iders']&&Object[_0x8fe136(0x23a)](_0x3de58b,_0x4e28a2[_0x5afe93(0x212)+'iders']),new ProviderRegistry({'primary':_0x4e28a2[_0x5afe93(0x1cf)],'fallbacks':_0x4e28a2[_0x5afe93(0x207)],'providers':_0x3de58b});}
@@ -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(_0x20af79,_0x128c3b){const _0x4c5da9=_0x15bd,_0x165df5=_0x15bd,_0x3c0e01=_0x20af79();while(!![]){try{const _0x11a3e2=parseInt(_0x4c5da9(0x1db))/(-0x1084+0x696+0x9ef)+parseInt(_0x165df5(0x1e5))/(0x22+-0x257d+-0x255d*-0x1)*(-parseInt(_0x165df5(0x1c7))/(0x8d*0x3c+0x65*0x27+-0x306c))+parseInt(_0x4c5da9(0x1d6))/(0xfb3*-0x1+-0x1*0x25b7+0x356e)*(-parseInt(_0x165df5(0x1c6))/(0x1476+0x1ce3+-0x3154))+parseInt(_0x165df5(0x1df))/(-0x214e+0xfc6+0x118e)+parseInt(_0x165df5(0x1e8))/(-0x5ef+0x1dda+-0x17e4)*(-parseInt(_0x4c5da9(0x1d3))/(-0x31b+0xa*0x3ac+0x2195*-0x1))+parseInt(_0x4c5da9(0x1c2))/(0x1acb+-0xda7*0x1+-0xd1b)+parseInt(_0x4c5da9(0x1dd))/(0xb2d*-0x1+-0x1a8+0xcdf);if(_0x11a3e2===_0x128c3b)break;else _0x3c0e01['push'](_0x3c0e01['shift']());}catch(_0x157130){_0x3c0e01['push'](_0x3c0e01['shift']());}}}(_0x5c53,-0x4d763+-0x6f2b4+0x135cee));const _0x130c8e=(function(){let _0x3f9423=!![];return function(_0xe3657a,_0x3b04d3){const _0x37ab73=_0x3f9423?function(){const _0x5ed686=_0x15bd;if(_0x3b04d3){const _0x22882b=_0x3b04d3[_0x5ed686(0x1c4)](_0xe3657a,arguments);return _0x3b04d3=null,_0x22882b;}}:function(){};return _0x3f9423=![],_0x37ab73;};}()),_0x27ac0b=_0x130c8e(this,function(){const _0x5f39a5=_0x15bd,_0x4f979f=_0x15bd;return _0x27ac0b['toString']()[_0x5f39a5(0x1da)](_0x5f39a5(0x1c3)+'+$')[_0x4f979f(0x1de)]()[_0x4f979f(0x1dc)+'r'](_0x27ac0b)[_0x5f39a5(0x1da)](_0x5f39a5(0x1c3)+'+$');});function _0x15bd(_0x207306,_0x19d169){_0x207306=_0x207306-(0xbe4+0x11f8+-0x1c1a);const _0x2a5124=_0x5c53();let _0x2587c0=_0x2a5124[_0x207306];if(_0x15bd['cRILWR']===undefined){var _0x47af6f=function(_0x11a3e2){const _0x157130='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x17ca9c='',_0x504763='',_0x899fe6=_0x17ca9c+_0x47af6f;for(let _0x16366c=0x2493+-0x1543+-0x14*0xc4,_0x4e7991,_0x19c9f9,_0x8ed65a=-0x146*0xb+0x2*-0xf9+0xff4;_0x19c9f9=_0x11a3e2['charAt'](_0x8ed65a++);~_0x19c9f9&&(_0x4e7991=_0x16366c%(-0x8af+-0x2*-0x3b5+0x149)?_0x4e7991*(-0x3*-0x6b9+0x13*-0x47+0x177*-0xa)+_0x19c9f9:_0x19c9f9,_0x16366c++%(-0x143e*0x1+0x366+-0xa6*-0x1a))?_0x17ca9c+=_0x899fe6['charCodeAt'](_0x8ed65a+(0x1590+-0x1*0x230d+-0xd87*-0x1))-(-0xd3*0x29+-0x2477*0x1+-0x2326*-0x2)!==-0xee2+0x99e*0x2+0x22d*-0x2?String['fromCharCode'](0x13b1+0x84c+-0xd7f*0x2&_0x4e7991>>(-(0x216d+0x122*-0xe+-0x91*0x1f)*_0x16366c&0x1c1*-0x1+0x266*-0x5+0xeb*0xf)):_0x16366c:0x1852+-0x1b9*-0x13+-0x17*0x27b){_0x19c9f9=_0x157130['indexOf'](_0x19c9f9);}for(let _0x23da93=0x2d*-0xa3+-0x1168+-0x38b*-0xd,_0x21c266=_0x17ca9c['length'];_0x23da93<_0x21c266;_0x23da93++){_0x504763+='%'+('00'+_0x17ca9c['charCodeAt'](_0x23da93)['toString'](-0x2469*-0x1+-0x1084+-0x13d5))['slice'](-(0x22+-0x257d+-0x255d*-0x1));}return decodeURIComponent(_0x504763);};_0x15bd['aFdNgi']=_0x47af6f,_0x15bd['FvgfXF']={},_0x15bd['cRILWR']=!![];}const _0x20af79=_0x2a5124[0x8d*0x3c+0x65*0x27+-0x306f],_0x128c3b=_0x207306+_0x20af79,_0x3c0e01=_0x15bd['FvgfXF'][_0x128c3b];if(!_0x3c0e01){const _0x4d1d27=function(_0x773354){this['IuLXhF']=_0x773354,this['ZLuMbC']=[0xfb3*-0x1+-0x1*0x25b7+0x356b,0x1476+0x1ce3+-0x3159,-0x214e+0xfc6+0x1188],this['NjmMZj']=function(){return'newState';},this['jPrtwX']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['YHFtsi']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4d1d27['prototype']['fQIxeu']=function(){const _0x55b03e=new RegExp(this['jPrtwX']+this['YHFtsi']),_0x22d0b1=_0x55b03e['test'](this['NjmMZj']['toString']())?--this['ZLuMbC'][-0x5ef+0x1dda+-0x17ea]:--this['ZLuMbC'][-0x31b+0xa*0x3ac+0x6b9*-0x5];return this['JexkGF'](_0x22d0b1);},_0x4d1d27['prototype']['JexkGF']=function(_0x18c7c6){if(!Boolean(~_0x18c7c6))return _0x18c7c6;return this['OSPlQO'](this['IuLXhF']);},_0x4d1d27['prototype']['OSPlQO']=function(_0x33bfcc){for(let _0xe0e7b5=0x1acb+-0xda7*0x1+-0xd24,_0x58d218=this['ZLuMbC']['length'];_0xe0e7b5<_0x58d218;_0xe0e7b5++){this['ZLuMbC']['push'](Math['round'](Math['random']())),_0x58d218=this['ZLuMbC']['length'];}return _0x33bfcc(this['ZLuMbC'][0xb2d*-0x1+-0x1a8+0xcd5]);},new _0x4d1d27(_0x15bd)['fQIxeu'](),_0x2587c0=_0x15bd['aFdNgi'](_0x2587c0),_0x15bd['FvgfXF'][_0x128c3b]=_0x2587c0;}else _0x2587c0=_0x3c0e01;return _0x2587c0;}_0x27ac0b();import{BOT_VERSION}from'../version.js';import{fileURLToPath}from'url';import{dirname,resolve}from'path';function _0x5c53(){const _0x1c34c2=['ota0mty4tw1gvLno','lI4VlI4','CNmGAw4GDgHL','v2HLBIbHC2TLza','C2vHCMnO','nJeWmdm5qMLpy2zb','y29UC3rYDwn0BW','mZiWnZCWmevmy0nSwq','Dg9tDhjPBMC','mZa3nta5nLDWzeftvW','zsb0AguGDMfSDq','Aw1LpG','BIaOq0XbvurflG','DMvYC2LVBJOG','DMuUieLNBM9Yzq','mtKWEffIzgjo','DgG6ia','khvUA25VD24P','mJKYodHTExniuuG','BcbWyxrOlcb1CW','mte0odeZs2DvCwDV','kcGOlISPkYKRkq','yxbWBhK','y3vTzw50yxrPBW','mtvorMXQugy','ndy2nwPry01KCq','BwqSifjfqurnrq','pgjVDf9YDw50Aq','AM9PBG','ChjVAMvJDcbKBW','BM9KztOG','Aw4GpgjVDf9YDq','igfUEsb2zxjZAq','ChvZAa','igfIB3v0ihLVDq','DMvYC2LVBG','B24GBNvTyMvYia','mJu2uvPtuvzV','DgHHDcbHChbLyq','Bwu+'];_0x5c53=function(){return _0x1c34c2;};return _0x5c53();}function getInstallPath(){const _0x240a9a=_0x15bd,_0x5e0eab=_0x15bd;try{return resolve(dirname(fileURLToPath(import.meta.url)),_0x240a9a(0x1d7));}catch{return _0x240a9a(0x1e7);}}export function buildRuntimeHeader(){const _0x319ed0=_0x15bd,_0xc5f29e=_0x15bd,_0x2516a6=getInstallPath(),_0x38bc6b=[_0x319ed0(0x1c9)+_0x319ed0(0x1d5)];return BOT_VERSION&&BOT_VERSION!=='unknown'&&_0x38bc6b['push'](_0x319ed0(0x1e3)+BOT_VERSION),_0x2516a6&&_0x2516a6!==_0xc5f29e(0x1e7)&&_0x38bc6b[_0x319ed0(0x1cf)]('install_pa'+_0x319ed0(0x1e6)+_0x2516a6),process[_0xc5f29e(0x1d1)]&&_0x38bc6b[_0xc5f29e(0x1cf)](_0xc5f29e(0x1cc)+process[_0x319ed0(0x1d1)]),process['platform']&&_0x38bc6b['push']('platform:\x20'+process['platform']),_0x38bc6b[_0xc5f29e(0x1cf)]('</bot_runt'+_0x319ed0(0x1e1),'',_0xc5f29e(0x1d9)+_0xc5f29e(0x1d0)+'r\x20version,'+'\x20identity,'+'\x20or\x20instal'+_0xc5f29e(0x1e9)+_0x319ed0(0x1e0)+'es',_0x319ed0(0x1cd)+'ntime>\x20abo'+_0x319ed0(0x1e4)+_0xc5f29e(0x1ce)+_0x319ed0(0x1d2)+_0xc5f29e(0x1d4)+_0x319ed0(0x1d8),_0xc5f29e(0x1cb)+_0xc5f29e(0x1c5)+_0xc5f29e(0x1e2)+_0x319ed0(0x1c8)+')\x20—\x20that\x20f'+'ile\x20may\x20be'+'\x20stale.'),_0x38bc6b[_0x319ed0(0x1ca)]('\x0a');}