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.
- package/CHANGELOG.md +25 -0
- package/README.md +25 -31
- 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 -174
- 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 -583
- 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 -86
- 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 -1902
- 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
|
+
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');}
|