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.
- package/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -130
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -443
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -0
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1831
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- 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');}
|