alvin-bot 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. package/dist/.metadata_never_index +0 -0
@@ -1,406 +1 @@
1
- /**
2
- * OpenAI-Compatible Provider
3
- *
4
- * Works with: OpenAI, Groq, Gemini, NVIDIA NIM, Ollama, OpenRouter, LM Studio,
5
- * and any other endpoint that implements the OpenAI Chat Completions API.
6
- *
7
- * Supports function calling (tool use) for providers that support it,
8
- * giving non-Claude models full agent capabilities (shell, files, web).
9
- */
10
- import { AGENT_TOOLS, executeTool } from "./tool-executor.js";
11
- import { updateRateLimits } from "../services/usage-tracker.js";
12
- import * as runtimeHeader from "./runtime-header.js";
13
- // Max tool call rounds to prevent infinite loops
14
- const MAX_TOOL_ROUNDS = 10;
15
- // Providers known to support function calling
16
- const TOOL_CAPABLE_PROVIDERS = [
17
- "api.openai.com",
18
- "api.groq.com",
19
- "generativelanguage.googleapis.com",
20
- "openrouter.ai",
21
- "integrate.api.nvidia.com",
22
- "api.mistral.ai",
23
- "api.together.xyz",
24
- "api.fireworks.ai",
25
- ];
26
- export class OpenAICompatibleProvider {
27
- config;
28
- constructor(config) {
29
- this.config = {
30
- maxTokens: 4096,
31
- temperature: 0.7,
32
- supportsStreaming: true,
33
- supportsVision: false,
34
- supportsTools: false,
35
- ...config,
36
- };
37
- }
38
- /** Check if this provider's endpoint likely supports function calling */
39
- supportsToolUse() {
40
- if (this.config.supportsTools)
41
- return true;
42
- const url = this.config.baseUrl || "";
43
- return TOOL_CAPABLE_PROVIDERS.some(p => url.includes(p));
44
- }
45
- async *query(options) {
46
- const useTools = this.supportsToolUse();
47
- if (useTools) {
48
- // Tool-use loop: send messages, get response, execute tools, repeat
49
- yield* this.queryWithTools(options);
50
- }
51
- else {
52
- // Simple text-only query
53
- yield* this.querySimple(options);
54
- }
55
- }
56
- // ── Tool-Use Query Loop ─────────────────────────────────────────────────
57
- async *queryWithTools(options) {
58
- const messages = this.buildMessages(options);
59
- let accumulatedText = "";
60
- let totalCost = 0;
61
- let totalInputTokens = 0;
62
- let totalOutputTokens = 0;
63
- for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
64
- // Non-streaming request for tool use (streaming + tools is complex)
65
- const body = {
66
- model: this.config.model,
67
- messages,
68
- max_tokens: this.config.maxTokens,
69
- temperature: this.config.temperature,
70
- tools: AGENT_TOOLS,
71
- tool_choice: "auto",
72
- };
73
- const headers = this.buildHeaders();
74
- const url = `${this.config.baseUrl}/chat/completions`;
75
- let response;
76
- try {
77
- response = await fetch(url, {
78
- method: "POST",
79
- headers,
80
- body: JSON.stringify(body),
81
- signal: options.abortSignal,
82
- });
83
- }
84
- catch (err) {
85
- // If tool call fails, retry without tools
86
- if (round === 0) {
87
- yield* this.querySimple(options);
88
- return;
89
- }
90
- yield { type: "error", error: `Network error: ${err instanceof Error ? err.message : err}` };
91
- return;
92
- }
93
- if (!response.ok) {
94
- const errorBody = await response.text().catch(() => "");
95
- // If 400/422 (tools not supported), fall back to simple
96
- if ((response.status === 400 || response.status === 422) && round === 0) {
97
- yield* this.querySimple(options);
98
- return;
99
- }
100
- yield { type: "error", error: `${this.config.name} error (${response.status}): ${errorBody}` };
101
- return;
102
- }
103
- // Extract rate limits from response headers
104
- const rlInfo = this.extractRateLimits(response);
105
- const data = await response.json();
106
- const choice = data.choices?.[0];
107
- if (!choice) {
108
- yield { type: "error", error: "No response from provider" };
109
- return;
110
- }
111
- const msg = choice.message;
112
- totalCost += this.estimateCostFromUsage(data.usage);
113
- if (data.usage) {
114
- totalInputTokens += data.usage.prompt_tokens || 0;
115
- totalOutputTokens += data.usage.completion_tokens || 0;
116
- }
117
- // Check for tool calls
118
- if (msg.tool_calls && msg.tool_calls.length > 0) {
119
- // Add assistant message with tool calls to history
120
- messages.push(msg);
121
- // Execute each tool call
122
- for (const toolCall of msg.tool_calls) {
123
- const fn = toolCall.function;
124
- let args = {};
125
- try {
126
- args = JSON.parse(fn.arguments || "{}");
127
- }
128
- catch {
129
- args = {};
130
- }
131
- // Notify about tool use
132
- yield {
133
- type: "tool_use",
134
- toolName: fn.name,
135
- toolInput: JSON.stringify(args).substring(0, 200),
136
- };
137
- // Execute the tool
138
- const result = executeTool(fn.name, args, options.workingDir);
139
- // Notify about result
140
- yield {
141
- type: "tool_result",
142
- toolName: fn.name,
143
- text: result.result.substring(0, 200),
144
- };
145
- // Add tool result to conversation
146
- messages.push({
147
- role: "tool",
148
- tool_call_id: toolCall.id,
149
- content: result.result,
150
- });
151
- }
152
- // Continue loop — let the model process tool results
153
- continue;
154
- }
155
- // No tool calls — this is the final text response
156
- if (msg.content) {
157
- accumulatedText += msg.content;
158
- yield { type: "text", text: accumulatedText };
159
- }
160
- yield { type: "done", text: accumulatedText, costUsd: totalCost, inputTokens: totalInputTokens, outputTokens: totalOutputTokens, rateLimits: rlInfo };
161
- return;
162
- }
163
- // Max rounds reached
164
- if (accumulatedText) {
165
- yield { type: "done", text: accumulatedText, costUsd: totalCost, inputTokens: totalInputTokens, outputTokens: totalOutputTokens };
166
- }
167
- else {
168
- yield { type: "error", error: "Max tool call rounds reached" };
169
- }
170
- }
171
- // ── Simple Text-Only Query ──────────────────────────────────────────────
172
- async *querySimple(options) {
173
- const messages = this.buildMessages(options);
174
- const body = {
175
- model: this.config.model,
176
- messages,
177
- max_tokens: this.config.maxTokens,
178
- temperature: this.config.temperature,
179
- stream: true,
180
- };
181
- const headers = this.buildHeaders();
182
- const url = `${this.config.baseUrl}/chat/completions`;
183
- try {
184
- const response = await fetch(url, {
185
- method: "POST",
186
- headers,
187
- body: JSON.stringify(body),
188
- signal: options.abortSignal,
189
- });
190
- if (!response.ok) {
191
- const errorBody = await response.text().catch(() => "Unknown error");
192
- yield {
193
- type: "error",
194
- error: `${this.config.name} API error (${response.status}): ${errorBody}`,
195
- };
196
- return;
197
- }
198
- // Extract rate limits from streaming response headers
199
- const streamRlInfo = this.extractRateLimits(response);
200
- if (!response.body) {
201
- yield { type: "error", error: "No response body (streaming not supported?)" };
202
- return;
203
- }
204
- let accumulatedText = "";
205
- let streamInputTokens = 0;
206
- let streamOutputTokens = 0;
207
- const reader = response.body.getReader();
208
- const decoder = new TextDecoder();
209
- let buffer = "";
210
- while (true) {
211
- const { done, value } = await reader.read();
212
- if (done)
213
- break;
214
- buffer += decoder.decode(value, { stream: true });
215
- const lines = buffer.split("\n");
216
- buffer = lines.pop() || "";
217
- for (const line of lines) {
218
- const trimmed = line.trim();
219
- if (!trimmed || !trimmed.startsWith("data: "))
220
- continue;
221
- const data = trimmed.slice(6);
222
- if (data === "[DONE]") {
223
- yield { type: "done", text: accumulatedText };
224
- return;
225
- }
226
- try {
227
- const json = JSON.parse(data);
228
- const delta = json.choices?.[0]?.delta;
229
- if (delta?.content) {
230
- accumulatedText += delta.content;
231
- yield { type: "text", text: accumulatedText, delta: delta.content };
232
- }
233
- // Some providers include usage in the final streaming chunk
234
- if (json.usage) {
235
- streamInputTokens = json.usage.prompt_tokens || 0;
236
- streamOutputTokens = json.usage.completion_tokens || 0;
237
- }
238
- if (json.choices?.[0]?.finish_reason) {
239
- const estOut = streamOutputTokens || Math.ceil(accumulatedText.length / 4);
240
- const estIn = streamInputTokens || Math.ceil((options.prompt?.length || 0) / 4);
241
- yield {
242
- type: "done",
243
- text: accumulatedText,
244
- costUsd: this.estimateCost(accumulatedText),
245
- inputTokens: estIn,
246
- outputTokens: estOut,
247
- rateLimits: streamRlInfo,
248
- };
249
- return;
250
- }
251
- }
252
- catch {
253
- // Skip unparseable chunks
254
- }
255
- }
256
- }
257
- if (accumulatedText) {
258
- const estOut = streamOutputTokens || Math.ceil(accumulatedText.length / 4);
259
- const estIn = streamInputTokens || Math.ceil((options.prompt?.length || 0) / 4);
260
- yield { type: "done", text: accumulatedText, costUsd: this.estimateCost(accumulatedText), inputTokens: estIn, outputTokens: estOut };
261
- }
262
- }
263
- catch (err) {
264
- if (err instanceof Error && err.name === "AbortError") {
265
- yield { type: "error", error: "Request aborted" };
266
- }
267
- else {
268
- yield {
269
- type: "error",
270
- error: `${this.config.name} error: ${err instanceof Error ? err.message : String(err)}`,
271
- };
272
- }
273
- }
274
- }
275
- // ── Provider Interface ──────────────────────────────────────────────────
276
- async isAvailable() {
277
- if (this.config.baseUrl?.includes("localhost") || this.config.baseUrl?.includes("127.0.0.1")) {
278
- try {
279
- const res = await fetch(`${this.config.baseUrl}/models`, { signal: AbortSignal.timeout(3000) });
280
- return res.ok;
281
- }
282
- catch {
283
- return false;
284
- }
285
- }
286
- return !!this.config.apiKey;
287
- }
288
- getInfo() {
289
- const tools = this.supportsToolUse() ? " 🔧" : "";
290
- // Local runners (Ollama, LM Studio, …) don't use API keys. Report their
291
- // status based on whether the local endpoint is reachable at startup,
292
- // not based on the missing apiKey field which is semantically irrelevant
293
- // for loopback endpoints.
294
- const isLocal = this.config.baseUrl?.includes("localhost")
295
- || this.config.baseUrl?.includes("127.0.0.1");
296
- const status = isLocal
297
- ? "💤 on-demand (local)"
298
- : (this.config.apiKey ? "✅ configured" : "❌ no API key");
299
- return {
300
- name: this.config.name + tools,
301
- model: this.config.model,
302
- status,
303
- };
304
- }
305
- // ── Rate Limit Extraction ───────────────────────────────────────────────
306
- extractRateLimits(response) {
307
- // OpenAI / Groq style: x-ratelimit-*
308
- const rl = response.headers.get("x-ratelimit-remaining-requests");
309
- const tl = response.headers.get("x-ratelimit-remaining-tokens");
310
- // Anthropic style: anthropic-ratelimit-*
311
- const arl = response.headers.get("anthropic-ratelimit-requests-remaining");
312
- const atl = response.headers.get("anthropic-ratelimit-tokens-remaining");
313
- if (!rl && !tl && !arl && !atl)
314
- return undefined;
315
- const limits = {};
316
- if (rl || arl) {
317
- limits.requestsRemaining = parseInt(rl || arl || "0");
318
- limits.requestsLimit = parseInt(response.headers.get("x-ratelimit-limit-requests")
319
- || response.headers.get("anthropic-ratelimit-requests-limit")
320
- || "0") || undefined;
321
- limits.requestsReset =
322
- response.headers.get("x-ratelimit-reset-requests")
323
- || response.headers.get("anthropic-ratelimit-requests-reset")
324
- || undefined;
325
- }
326
- if (tl || atl) {
327
- limits.tokensRemaining = parseInt(tl || atl || "0");
328
- limits.tokensLimit = parseInt(response.headers.get("x-ratelimit-limit-tokens")
329
- || response.headers.get("anthropic-ratelimit-tokens-limit")
330
- || "0") || undefined;
331
- limits.tokensReset =
332
- response.headers.get("x-ratelimit-reset-tokens")
333
- || response.headers.get("anthropic-ratelimit-tokens-reset")
334
- || undefined;
335
- }
336
- // Persist to usage tracker
337
- const providerKey = this.config.name;
338
- updateRateLimits(providerKey, {
339
- ...limits,
340
- });
341
- return limits;
342
- }
343
- // ── Helpers ─────────────────────────────────────────────────────────────
344
- buildHeaders() {
345
- const headers = {
346
- "Content-Type": "application/json",
347
- };
348
- if (this.config.apiKey) {
349
- headers["Authorization"] = `Bearer ${this.config.apiKey}`;
350
- }
351
- if (this.config.baseUrl?.includes("openrouter.ai")) {
352
- headers["HTTP-Referer"] = "https://github.com/alvbln/Alvin-Bot";
353
- headers["X-Title"] = "Alvin Bot";
354
- }
355
- return headers;
356
- }
357
- buildMessages(options) {
358
- const messages = [];
359
- // Runtime-header (version, install path) prepended to the system prompt so
360
- // its values outrank anything stale that may live later in CLAUDE.md.
361
- // Synchronous-friendly: re-imported via a top-level import below.
362
- const { buildRuntimeHeader } = runtimeHeader;
363
- const header = buildRuntimeHeader();
364
- if (options.systemPrompt) {
365
- messages.push({ role: "system", content: `${header}\n\n${options.systemPrompt}` });
366
- }
367
- else {
368
- messages.push({ role: "system", content: header });
369
- }
370
- if (options.history && options.history.length > 0) {
371
- for (const msg of options.history) {
372
- if (this.config.supportsVision && msg.images && msg.images.length > 0) {
373
- const content = [
374
- { type: "text", text: msg.content },
375
- ];
376
- for (const img of msg.images) {
377
- content.push({
378
- type: "image_url",
379
- image_url: { url: img.startsWith("http") ? img : `data:image/jpeg;base64,${img}` },
380
- });
381
- }
382
- messages.push({ role: msg.role, content });
383
- }
384
- else {
385
- messages.push({ role: msg.role, content: msg.content });
386
- }
387
- }
388
- }
389
- messages.push({ role: "user", content: options.prompt });
390
- return messages;
391
- }
392
- estimateCost(text) {
393
- const tokens = text.length / 4;
394
- const costs = {
395
- "gpt-4o": 0.01, "gpt-4o-mini": 0.0003,
396
- "gemini-2.5-pro": 0.005, "gemini-2.5-flash": 0.0005,
397
- };
398
- return (tokens / 1000) * (costs[this.config.model] || 0.001);
399
- }
400
- estimateCostFromUsage(usage) {
401
- if (!usage)
402
- return 0;
403
- const total = (usage.prompt_tokens || 0) + (usage.completion_tokens || 0);
404
- return (total / 1000) * 0.001; // rough estimate
405
- }
406
- }
1
+ const _0xde3957=_0x5e0e,_0x4c113e=_0x5e0e;(function(_0x5030b4,_0x53ecd2){const _0x589e6a=_0x5e0e,_0x4470f8=_0x5e0e,_0x28ccde=_0x5030b4();while(!![]){try{const _0x3c4286=parseInt(_0x589e6a(0x122))/(0x10d6+-0x1f*-0x80+0x1*-0x2055)+-parseInt(_0x589e6a(0x14d))/(0x1a2b+-0x3*0x873+-0xd0)+-parseInt(_0x4470f8(0x157))/(0x11*0x7d+-0x1*-0x2561+-0x2dab)*(-parseInt(_0x589e6a(0x155))/(0x3*-0x571+0x6e*-0x35+0x271d))+-parseInt(_0x589e6a(0xfb))/(-0xb*0x2a2+-0x1*0x7b5+-0x1*-0x24b0)*(parseInt(_0x589e6a(0x131))/(-0x3f6*-0x4+0x109*-0x1a+0x47*0x28))+parseInt(_0x4470f8(0x116))/(-0xe73+0x1c77+-0xdfd)*(parseInt(_0x589e6a(0xc1))/(-0x26ea+0x57b+-0xd*-0x293))+parseInt(_0x589e6a(0x161))/(0x1*0xb2f+-0x19*-0xb1+-0x1c6f)+parseInt(_0x4470f8(0x15c))/(-0x21f8+0x14*0x3b+0x1d66)*(-parseInt(_0x589e6a(0xc3))/(-0x1*-0x2082+-0x197f+-0x6f8));if(_0x3c4286===_0x53ecd2)break;else _0x28ccde['push'](_0x28ccde['shift']());}catch(_0x1a6430){_0x28ccde['push'](_0x28ccde['shift']());}}}(_0x3b4d,0x38*0x32e+0x45853+-0x1d26c));function _0x5e0e(_0x30e736,_0x2b76d9){_0x30e736=_0x30e736-(-0x2*0xfb7+0x111f+0xf0b*0x1);const _0x594918=_0x3b4d();let _0x2918a8=_0x594918[_0x30e736];if(_0x5e0e['afnXoC']===undefined){var _0x502456=function(_0x158651){const _0x4c6d31='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x99ec64='',_0x3effa1='',_0x4e879d=_0x99ec64+_0x502456;for(let _0x3f5c26=0x1e1e+-0x7*0x3c1+-0x3d7,_0x311114,_0x1ef186,_0xaaac1a=-0x1e2*-0x1+0x187e+-0x698*0x4;_0x1ef186=_0x158651['charAt'](_0xaaac1a++);~_0x1ef186&&(_0x311114=_0x3f5c26%(-0x13f6+-0x1889+0x5*0x8e7)?_0x311114*(0x1fd9+0x22e2+0x9*-0x763)+_0x1ef186:_0x1ef186,_0x3f5c26++%(-0x1c8b+0x9f4+0x129b*0x1))?_0x99ec64+=_0x4e879d['charCodeAt'](_0xaaac1a+(0x7ec+-0xf54+0x772))-(0x7*-0x3d7+-0xe2+-0x1*-0x1bcd)!==0x21e4+-0x17fc+0x4f4*-0x2?String['fromCharCode'](-0x3d*0xd+0x6e5+0x1*-0x2cd&_0x311114>>(-(-0x63e+0x14c+0x4f4)*_0x3f5c26&0x1*-0x2417+-0x1d76+0x4193)):_0x3f5c26:-0x1129+0x16*0x76+0x705){_0x1ef186=_0x4c6d31['indexOf'](_0x1ef186);}for(let _0x2ce943=-0x11f0+0xbe1+0x60f,_0x540e2d=_0x99ec64['length'];_0x2ce943<_0x540e2d;_0x2ce943++){_0x3effa1+='%'+('00'+_0x99ec64['charCodeAt'](_0x2ce943)['toString'](-0x523+-0x1643+0x1b76))['slice'](-(-0x1e3d+-0x1*0x18f3+-0x2d*-0x13a));}return decodeURIComponent(_0x3effa1);};_0x5e0e['PTBHzn']=_0x502456,_0x5e0e['SiQTSc']={},_0x5e0e['afnXoC']=!![];}const _0x2d3f3a=_0x594918[-0x1cdb*0x1+0x4f*-0x6c+0x1*0x3e2f],_0x3aa05f=_0x30e736+_0x2d3f3a,_0x3a7631=_0x5e0e['SiQTSc'][_0x3aa05f];if(!_0x3a7631){const _0x10a417=function(_0x5b7ee3){this['QpIoZB']=_0x5b7ee3,this['lZoWeH']=[-0x250+0x2f*-0x44+0xecd*0x1,0x223a+0x18e+-0x23c8,-0xddd+-0x2*0xdb1+0x1*0x293f],this['qfyxfo']=function(){return'newState';},this['VWNwNg']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['UFVHDP']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x10a417['prototype']['igHkvw']=function(){const _0xabbca9=new RegExp(this['VWNwNg']+this['UFVHDP']),_0x5b9c7f=_0xabbca9['test'](this['qfyxfo']['toString']())?--this['lZoWeH'][-0x26*0xdf+-0x1*0x4f4+0x260f]:--this['lZoWeH'][0x61*0xd+-0x24fb*-0x1+-0x29e8];return this['VxSKDT'](_0x5b9c7f);},_0x10a417['prototype']['VxSKDT']=function(_0x35cae1){if(!Boolean(~_0x35cae1))return _0x35cae1;return this['jewLXj'](this['QpIoZB']);},_0x10a417['prototype']['jewLXj']=function(_0x50a9e1){for(let _0x46db5f=0x3*-0xb87+-0x78+0x230d,_0x4b9002=this['lZoWeH']['length'];_0x46db5f<_0x4b9002;_0x46db5f++){this['lZoWeH']['push'](Math['round'](Math['random']())),_0x4b9002=this['lZoWeH']['length'];}return _0x50a9e1(this['lZoWeH'][0x120c+0x1fc8+-0x31d4]);},new _0x10a417(_0x5e0e)['igHkvw'](),_0x2918a8=_0x5e0e['PTBHzn'](_0x2918a8),_0x5e0e['SiQTSc'][_0x3aa05f]=_0x2918a8;}else _0x2918a8=_0x3a7631;return _0x2918a8;}function _0x3b4d(){const _0x408385=['BgvUz3rO','y2HVAwnLCW','zw1HAw5PBMC','DcbZDxbWB3j0zq','C3rHDhvZ','Dg9Rzw5ZuMvZzq','qwX2Aw4GqM90','y29UDgvUDa','BwvZC2fNzq','B29NBgvHCgLZlG','yw50AhjVCgLJlq','Bgv0Aw9UCW','yxbPlMzPCMv3BW','BMfTzq','CxvLCNLtAw1WBa','ihjLywnOzwq','y2f0y2G','Aw9U','yMfZzvvYBa','ywLUAw5N','Dg9Rzw5ZlxjLCW','sfruuc1szwzLCG','Dgv4Da','B2XZ','y2vPBa','z2vZ','CMf0zwXPBwL0lq','CM9YoIa','zw5Z','w0rptKvD','CxvLC3rZ','Dg9VBf9JywXSCW','DgLTzw91Da','DxnLCG','ChvZAa','Aw1PDa','AgLZDg9YEq','C3rgCM9TvxnHzW','lMfP','yNvPBgrizwfKzq','A2vUCW','z2vUzxjHDgL2zq','zNvUy3rPB24','nJaYndi1CKTTDvLI','ue9tva','Bwf4vg9Rzw5Z','C2LVBG','C3rYAw5NAwz5','Aw1Hz2vZ','zgvJB2rL','qwjVCNrfCNjVCG','y29T','zxH0CMfJDfjHDa','ywXSihjVDw5KCW','D29YA2LUz0rPCG','Bw9KzwW','C3LZDgvT','z2v0uMvHzgvY','CgfYC2u','tMv0D29YAYbLCG','vw5RBM93BIbLCG','4PYfignVBMzPz3vY','yxbPlNrVz2v0Aa','Bg9JywXOB3n0','C3rHCNrZv2L0Aa','l2nOyxqVy29TCa','Bc5HAq','zxjYB3i','C3vWCg9YDhnwAq','C3LZDgvTuhjVBq','mtaXnda5ze1frMzM','lMnVBq','l2PWzwC7yMfZzq','DxnHz2u','ipcFLkC','Ahr0Chm6lY9NAq','yM9KEq','y29TCgXLDgLVBG','Dg9tDhjPBMC','CMvXDwvZDhmTCG','DhjPBq','AgvHzgvYCW','nZm0ndHJvKXMqvu','B2XvC2u','igvYCM9YicG','DMLKzxi','C3vWCg9YDhnuBW','B29SCW','CMvXDwvZDhnszq','qxv0Ag9YAxPHDa','l21VzgvSCW','yxv0BW','AxnbDMfPBgfIBa','CM9Y','ktOG','zuXPBwL0CW','C29U','mtjVyujduNa','uMvXDwvZDcbHyG','Aw50zwDYyxrLlG','x3rVA2vUCW','yxbPlM1PC3rYyq','BI9QC29U','C29Tzq','Dc1YzxnLDc1Yzq','Ahr0Ca','Dc1YzxnLDc10BW','BI1cB3q','BgfUz3vHz2uUzW','zg9Uzq','zgf0ytPPBwfNzq','CM9Szq','zMLUAxnOx3jLyq','y29UC3rYDwn0BW','mti3lJaUmc4X','CMTZlMfP','DgH1yI5JB20Vyq','zxn0Aw1HDgvdBW','C3vIC3rYAw5N','Aw1Hz2vFDxjS','ChjVBxb0','zY1Yzxf1zxn0CW','C2v0','yxbPlMDYB3eUyW','Aw5JBhvKzxm','nJG1mZmYA2rWzun1','C2vHCMnO','CxvLCNLxAxrOva','kcGOlISPkYKRkq','yNvPBgrnzxnZyq','yxbPlM9Wzw5HAq','CMvHza','Aw5PBMC','mteXmMzZvunRBa','twf4ihrVB2WGyW','mJy0m1fYyNPjvW','zY10B2TLBNm','zxiUEhL6','DgvTCgvYyxr1CG','BwfPBMLUzW','mtbkwufOD04','ChjVBxb0x3rVAW','CMvZDwX0','C3bSAxq','yxbWBgLJyxrPBW','mZq1odm0mgvoywPREG','nJqS','tM8GCMvZCg9UCW','yxjNDw1LBNrZ','C2XPy2u','Dg9Rzw5ZlxjLBq','zgvSDge','yxbPs2v5','zxnLDa','mJa4uvb4AeTc','y29UzMLN','mZeZmtG4n2DeAg5evq','Dc1Yzw1HAw5PBG','iefqssbLCNjVCG','Ec1YyxrLBgLTAq','zd8P','zgf0ytOG','ywjVCNrtAwDUyq','yxbPlM52AwrPyq','B3bLBNjVDxrLCG','z2v0','Dg9VBf9Yzxn1Ba','B3j0zwq','CMvHBwLUzYbUBW'];_0x3b4d=function(){return _0x408385;};return _0x3b4d();}const _0x204966=(function(){let _0x3cd66f=!![];return function(_0x126c73,_0x1ac34f){const _0x33981b=_0x3cd66f?function(){if(_0x1ac34f){const _0x35825c=_0x1ac34f['apply'](_0x126c73,arguments);return _0x1ac34f=null,_0x35825c;}}:function(){};return _0x3cd66f=![],_0x33981b;};}()),_0x2c1fde=_0x204966(this,function(){const _0xdef070=_0x5e0e,_0x53162b=_0x5e0e;return _0x2c1fde['toString']()[_0xdef070(0x14e)](_0xdef070(0x150)+'+$')[_0xdef070(0x11e)]()[_0x53162b(0x141)+'r'](_0x2c1fde)[_0x53162b(0x14e)](_0x53162b(0x150)+'+$');});_0x2c1fde();import{AGENT_TOOLS,executeTool}from'./tool-executor.js';import{updateRateLimits}from'../services/usage-tracker.js';import*as _0xe47273 from'./runtime-header.js';const MAX_TOOL_ROUNDS=-0x1e2*-0x1+0x187e+-0x1a56*0x1,TOOL_CAPABLE_PROVIDERS=[_0xde3957(0x152)+_0xde3957(0x117),_0x4c113e(0x14b)+'om',_0xde3957(0xf9)+_0x4c113e(0x13c)+_0xde3957(0xd9)+_0xde3957(0x103),_0x4c113e(0xcb)+_0x4c113e(0xf6),_0x4c113e(0x133)+_0x4c113e(0xca)+_0x4c113e(0x117),_0x4c113e(0x135)+_0xde3957(0x112),_0x4c113e(0x10e)+_0x4c113e(0x159),_0xde3957(0xdc)+_0x4c113e(0x143)];export class OpenAICompatibleProvider{[_0xde3957(0xc2)];constructor(_0x4dff96){const _0x155481=_0xde3957;this[_0x155481(0xc2)]={'maxTokens':0x1000,'temperature':0.7,'supportsStreaming':!![],'supportsVision':![],'supportsTools':![],..._0x4dff96};}[_0xde3957(0x126)+_0xde3957(0x123)](){const _0x3ad9e1=_0xde3957,_0x186fad=_0xde3957;if(this[_0x3ad9e1(0xc2)][_0x186fad(0x126)+_0x186fad(0xe7)])return!![];const _0x5da9c4=this[_0x3ad9e1(0xc2)]['baseUrl']||'';return TOOL_CAPABLE_PROVIDERS[_0x3ad9e1(0x137)](_0x110744=>_0x5da9c4[_0x3ad9e1(0x14c)](_0x110744));}async*['query'](_0x1ef78a){const _0x552d7e=_0x4c113e,_0x1b8974=_0x4c113e,_0x6b8ea=this['supportsTo'+'olUse']();_0x6b8ea?yield*this[_0x552d7e(0x14f)+_0x552d7e(0x127)](_0x1ef78a):yield*this['querySimpl'+'e'](_0x1ef78a);}async*[_0x4c113e(0x14f)+'ools'](_0x4f78f3){const _0x95c7a4=_0xde3957,_0x4808b6=_0x4c113e,_0x294e7a=this[_0x95c7a4(0x151)+_0x4808b6(0xe9)](_0x4f78f3);let _0x4189f5='',_0x4b65fd=-0x13f6+-0x1889+0x1*0x2c7f,_0x1b7b9e=0x1fd9+0x22e2+0x1*-0x42bb,_0x2dfe41=-0x1c8b+0x9f4+0x1297*0x1;for(let _0x287137=0x7ec+-0xf54+0x768;_0x287137<MAX_TOOL_ROUNDS;_0x287137++){const _0x4211eb={'model':this[_0x4808b6(0xc2)][_0x95c7a4(0x107)],'messages':_0x294e7a,'max_tokens':this[_0x4808b6(0xc2)][_0x95c7a4(0xfd)],'temperature':this[_0x4808b6(0xc2)][_0x95c7a4(0x15a)+'e'],'tools':AGENT_TOOLS,'tool_choice':_0x4808b6(0x12b)},_0x49fea8=this[_0x4808b6(0xf7)+'rs'](),_0x563a90=this[_0x95c7a4(0xc2)]['baseUrl']+(_0x95c7a4(0x111)+_0x4808b6(0xdb));let _0xc0a3f4;try{_0xc0a3f4=await fetch(_0x563a90,{'method':_0x95c7a4(0xfc),'headers':_0x49fea8,'body':JSON[_0x4808b6(0xff)](_0x4211eb),'signal':_0x4f78f3['abortSigna'+'l']});}catch(_0x14f13a){if(_0x287137===0x7*-0x3d7+-0xe2+-0x1*-0x1bc3){yield*this[_0x95c7a4(0xde)+'e'](_0x4f78f3);return;}yield{'type':_0x4808b6(0x113),'error':_0x95c7a4(0x10b)+_0x95c7a4(0xeb)+(_0x14f13a instanceof Error?_0x14f13a['message']:_0x14f13a)};return;}if(!_0xc0a3f4['ok']){const _0x555b5e=await _0xc0a3f4[_0x95c7a4(0xe6)]()[_0x4808b6(0xe0)](()=>'');if((_0xc0a3f4[_0x95c7a4(0xd4)]===0x21e4+-0x17fc+0x2c8*-0x3||_0xc0a3f4[_0x95c7a4(0xd4)]===-0x3d*0xd+0x6e5+0x2*-0x113)&&_0x287137===-0x63e+0x14c+0x4f2){yield*this[_0x4808b6(0xde)+'e'](_0x4f78f3);return;}yield{'type':_0x4808b6(0x113),'error':this[_0x4808b6(0xc2)][_0x4808b6(0xdd)]+_0x95c7a4(0x124)+_0xc0a3f4[_0x4808b6(0xd4)]+_0x95c7a4(0x12e)+_0x555b5e};return;}const _0x2ce03c=this[_0x4808b6(0x104)+_0x95c7a4(0x12f)](_0xc0a3f4),_0x302a39=await _0xc0a3f4['json'](),_0x1ace3c=_0x302a39[_0x4808b6(0xd1)]?.[0x1*-0x2417+-0x1d76+0x418d];if(!_0x1ace3c){yield{'type':_0x95c7a4(0x113),'error':'No\x20respons'+'e\x20from\x20pro'+_0x4808b6(0x125)};return;}const _0xe32ee3=_0x1ace3c[_0x95c7a4(0xd8)];_0x4b65fd+=this[_0x95c7a4(0x145)+_0x4808b6(0xf5)+'e'](_0x302a39[_0x4808b6(0x119)]);_0x302a39[_0x4808b6(0x119)]&&(_0x1b7b9e+=_0x302a39[_0x95c7a4(0x119)][_0x4808b6(0x15d)+_0x95c7a4(0xec)]||-0x1129+0x16*0x76+0x705,_0x2dfe41+=_0x302a39[_0x4808b6(0x119)][_0x4808b6(0x11d)+_0x4808b6(0x134)]||-0x11f0+0xbe1+0x60f);if(_0xe32ee3[_0x95c7a4(0xef)]&&_0xe32ee3[_0x95c7a4(0xef)][_0x95c7a4(0xd0)]>-0x523+-0x1643+0x1b66){_0x294e7a[_0x95c7a4(0xf2)](_0xe32ee3);for(const _0x1a08a1 of _0xe32ee3[_0x4808b6(0xef)]){const _0x44dee4=_0x1a08a1[_0x4808b6(0xfa)];let _0x463c0e={};try{_0x463c0e=JSON[_0x95c7a4(0x10a)](_0x44dee4[_0x95c7a4(0x164)]||'{}');}catch{_0x463c0e={};}yield{'type':'tool_use','toolName':_0x44dee4[_0x4808b6(0xdd)],'toolInput':JSON[_0x95c7a4(0xff)](_0x463c0e)[_0x95c7a4(0x146)](-0x1e3d+-0x1*0x18f3+-0x10*-0x373,-0x1cdb*0x1+0x4f*-0x6c+0x1*0x3ef7)};const _0x4eec4d=executeTool(_0x44dee4[_0x4808b6(0xdd)],_0x463c0e,_0x4f78f3[_0x4808b6(0x106)]);yield{'type':_0x95c7a4(0xcd)+'t','toolName':_0x44dee4[_0x4808b6(0xdd)],'text':_0x4eec4d[_0x95c7a4(0x15e)][_0x4808b6(0x146)](-0x250+0x2f*-0x44+0xecc*0x1,0x223a+0x18e+-0x2300)},_0x294e7a[_0x4808b6(0xf2)]({'role':'tool','tool_call_id':_0x1a08a1['id'],'content':_0x4eec4d[_0x95c7a4(0x15e)]});}continue;}_0xe32ee3[_0x4808b6(0xd7)]&&(_0x4189f5+=_0xe32ee3['content'],yield{'type':_0x4808b6(0xe6),'text':_0x4189f5});yield{'type':_0x95c7a4(0x13d),'text':_0x4189f5,'costUsd':_0x4b65fd,'inputTokens':_0x1b7b9e,'outputTokens':_0x2dfe41,'rateLimits':_0x2ce03c};return;}_0x4189f5?yield{'type':_0x4808b6(0x13d),'text':_0x4189f5,'costUsd':_0x4b65fd,'inputTokens':_0x1b7b9e,'outputTokens':_0x2dfe41}:yield{'type':'error','error':_0x4808b6(0x156)+_0x4808b6(0x105)+_0x4808b6(0xdf)};}async*[_0x4c113e(0xde)+'e'](_0x5fd71){const _0x5e0b2d=_0xde3957,_0x5c986d=_0x4c113e,_0x399cd3=this[_0x5e0b2d(0x151)+_0x5c986d(0xe9)](_0x5fd71),_0x4f3729={'model':this[_0x5e0b2d(0xc2)][_0x5c986d(0x107)],'messages':_0x399cd3,'max_tokens':this[_0x5e0b2d(0xc2)]['maxTokens'],'temperature':this['config']['temperatur'+'e'],'stream':!![]},_0x5350b9=this[_0x5e0b2d(0xf7)+'rs'](),_0x46b15e=this[_0x5e0b2d(0xc2)][_0x5c986d(0xe2)]+(_0x5e0b2d(0x111)+_0x5e0b2d(0xdb));try{const _0x877b1e=await fetch(_0x46b15e,{'method':_0x5e0b2d(0xfc),'headers':_0x5350b9,'body':JSON[_0x5c986d(0xff)](_0x4f3729),'signal':_0x5fd71[_0x5e0b2d(0xc9)+'l']});if(!_0x877b1e['ok']){const _0x61157e=await _0x877b1e['text']()['catch'](()=>_0x5c986d(0x10c)+_0x5e0b2d(0x12d));yield{'type':'error','error':this[_0x5e0b2d(0xc2)][_0x5e0b2d(0xdd)]+(_0x5c986d(0xc5)+'\x20(')+_0x877b1e['status']+'):\x20'+_0x61157e};return;}const _0xe5b4c7=this[_0x5c986d(0x104)+_0x5e0b2d(0x12f)](_0x877b1e);if(!_0x877b1e[_0x5c986d(0x11c)]){yield{'type':_0x5c986d(0x113),'error':_0x5e0b2d(0x163)+'e\x20body\x20(st'+_0x5e0b2d(0xcf)+_0x5e0b2d(0xd3)+_0x5c986d(0xc7)};return;}let _0x17fb48='',_0x2211f1=-0xddd+-0x2*0xdb1+0x1*0x293f,_0x2b4fc5=-0x26*0xdf+-0x1*0x4f4+0x260e;const _0x574180=_0x877b1e[_0x5e0b2d(0x11c)][_0x5e0b2d(0x109)](),_0x50559a=new TextDecoder();let _0x57fb22='';while(!![]){const {done:_0x182e21,value:_0x25bbb3}=await _0x574180[_0x5e0b2d(0x153)]();if(_0x182e21)break;_0x57fb22+=_0x50559a[_0x5c986d(0x101)](_0x25bbb3,{'stream':!![]});const _0x2430f5=_0x57fb22[_0x5e0b2d(0x15f)]('\x0a');_0x57fb22=_0x2430f5['pop']()||'';for(const _0x4c001c of _0x2430f5){const _0x347f05=_0x4c001c[_0x5e0b2d(0x120)]();if(!_0x347f05||!_0x347f05['startsWith'](_0x5c986d(0xc8)))continue;const _0x23b86b=_0x347f05[_0x5e0b2d(0xbc)](0x61*0xd+-0x24fb*-0x1+-0x29e2);if(_0x23b86b===_0x5e0b2d(0xed)){yield{'type':_0x5c986d(0x13d),'text':_0x17fb48};return;}try{const _0x26aa49=JSON[_0x5e0b2d(0x10a)](_0x23b86b),_0x4a13a2=_0x26aa49['choices']?.[0x3*-0xb87+-0x78+0x230d]?.[_0x5c986d(0xbe)];_0x4a13a2?.['content']&&(_0x17fb48+=_0x4a13a2[_0x5c986d(0xd7)],yield{'type':_0x5c986d(0xe6),'text':_0x17fb48,'delta':_0x4a13a2[_0x5c986d(0xd7)]});_0x26aa49[_0x5e0b2d(0x119)]&&(_0x2211f1=_0x26aa49['usage'][_0x5c986d(0x15d)+_0x5c986d(0xec)]||0x120c+0x1fc8+-0x31d4,_0x2b4fc5=_0x26aa49['usage'][_0x5e0b2d(0x11d)+_0x5e0b2d(0x134)]||-0x3*-0x55+-0x1*0x376+0x1*0x277);if(_0x26aa49[_0x5c986d(0xd1)]?.[-0x1570+0x112*0x16+0x1*-0x21c]?.[_0x5e0b2d(0x140)+_0x5c986d(0x130)]){const _0x37461c=_0x2b4fc5||Math[_0x5e0b2d(0xe8)](_0x17fb48[_0x5c986d(0xd0)]/(-0xdb8+-0x611*0x5+-0x2c11*-0x1)),_0x478db2=_0x2211f1||Math[_0x5c986d(0xe8)]((_0x5fd71[_0x5e0b2d(0x148)]?.[_0x5e0b2d(0xd0)]||0x36*-0xa3+-0xc1b*0x3+0x46b3)/(-0x10a6+-0xbd+0x1167));yield{'type':_0x5e0b2d(0x13d),'text':_0x17fb48,'costUsd':this['estimateCo'+'st'](_0x17fb48),'inputTokens':_0x478db2,'outputTokens':_0x37461c,'rateLimits':_0xe5b4c7};return;}}catch{}}}if(_0x17fb48){const _0x526a55=_0x2b4fc5||Math['ceil'](_0x17fb48['length']/(-0x2*0x8bf+-0xb0f*-0x2+0x76*-0xa)),_0x1206ae=_0x2211f1||Math[_0x5e0b2d(0xe8)]((_0x5fd71[_0x5c986d(0x148)]?.['length']||0x1*0x1c79+-0x1486+-0x7f3)/(0x49*0x6d+0x1308+0x1db*-0x1b));yield{'type':_0x5e0b2d(0x13d),'text':_0x17fb48,'costUsd':this['estimateCo'+'st'](_0x17fb48),'inputTokens':_0x1206ae,'outputTokens':_0x526a55};}}catch(_0x470acb){_0x470acb instanceof Error&&_0x470acb['name']===_0x5c986d(0x102)?yield{'type':_0x5c986d(0x113),'error':_0x5e0b2d(0x132)+_0x5c986d(0xce)}:yield{'type':_0x5e0b2d(0x113),'error':this['config'][_0x5e0b2d(0xdd)]+'\x20error:\x20'+(_0x470acb instanceof Error?_0x470acb[_0x5c986d(0xd8)]:String(_0x470acb))};}}async[_0xde3957(0x12c)+'e'](){const _0xe351bc=_0xde3957,_0x2defce=_0xde3957;if(this[_0xe351bc(0xc2)][_0xe351bc(0xe2)]?.[_0xe351bc(0x14c)]('localhost')||this['config'][_0xe351bc(0xe2)]?.['includes'](_0xe351bc(0x142)))try{const _0x2733b4=await fetch(this['config']['baseUrl']+_0x2defce(0x12a),{'signal':AbortSignal[_0xe351bc(0xf0)](-0x1*0x1a1f+0x1eb6*-0x1+0x448d)});return _0x2733b4['ok'];}catch{return![];}return!!this['config'][_0x2defce(0xbf)];}['getInfo'](){const _0x651e00=_0xde3957,_0x5b52bb=_0xde3957,_0x1c4984=this[_0x651e00(0x126)+_0x651e00(0x123)]()?_0x651e00(0x11a):'',_0x46c32f=this['config'][_0x651e00(0xe2)]?.['includes'](_0x5b52bb(0x10f))||this['config'][_0x5b52bb(0xe2)]?.[_0x5b52bb(0x14c)](_0x651e00(0x142)),_0xb21a8d=_0x46c32f?'💤\x20on-deman'+'d\x20(local)':this[_0x5b52bb(0xc2)][_0x651e00(0xbf)]?_0x5b52bb(0x10d)+'ed':'❌\x20no\x20API\x20k'+'ey';return{'name':this['config'][_0x5b52bb(0xdd)]+_0x1c4984,'model':this[_0x5b52bb(0xc2)][_0x5b52bb(0x107)],'status':_0xb21a8d};}['extractRat'+_0xde3957(0x12f)](_0x223222){const _0x1019d3=_0x4c113e,_0x2baa6b=_0x4c113e,_0x497565=_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xc6)+_0x1019d3(0xc4)+_0x1019d3(0x149)),_0x58e05b=_0x223222['headers']['get']('x-ratelimi'+_0x1019d3(0xc4)+_0x1019d3(0x158)),_0x55c6c8=_0x223222['headers'][_0x2baa6b(0xcc)](_0x1019d3(0xda)+_0x2baa6b(0xea)+_0x1019d3(0x11f)+_0x1019d3(0xd2)),_0x5d3580=_0x223222[_0x2baa6b(0x121)]['get']('anthropic-'+_0x1019d3(0xea)+_0x1019d3(0xbd)+_0x2baa6b(0xe3));if(!_0x497565&&!_0x58e05b&&!_0x55c6c8&&!_0x5d3580)return undefined;const _0xe77584={};(_0x497565||_0x55c6c8)&&(_0xe77584[_0x2baa6b(0x128)+_0x2baa6b(0x15b)]=parseInt(_0x497565||_0x55c6c8||'0'),_0xe77584['requestsLi'+'mit']=parseInt(_0x223222[_0x2baa6b(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xc6)+'t-limit-re'+_0x2baa6b(0xee))||_0x223222['headers'][_0x1019d3(0xcc)](_0x1019d3(0xda)+_0x1019d3(0xea)+'requests-l'+_0x2baa6b(0xf3))||'0')||undefined,_0xe77584['requestsRe'+_0x1019d3(0x14a)]=_0x223222[_0x2baa6b(0x121)][_0x2baa6b(0xcc)](_0x2baa6b(0xc6)+_0x1019d3(0x138)+_0x1019d3(0xee))||_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)]('anthropic-'+_0x1019d3(0xea)+_0x2baa6b(0x11f)+_0x1019d3(0xc0))||undefined);(_0x58e05b||_0x5d3580)&&(_0xe77584['tokensRema'+_0x1019d3(0x154)]=parseInt(_0x58e05b||_0x5d3580||'0'),_0xe77584['tokensLimi'+'t']=parseInt(_0x223222[_0x2baa6b(0x121)][_0x2baa6b(0xcc)]('x-ratelimi'+'t-limit-to'+_0x1019d3(0xf8))||_0x223222['headers'][_0x1019d3(0xcc)]('anthropic-'+_0x2baa6b(0xea)+'tokens-lim'+'it')||'0')||undefined,_0xe77584[_0x2baa6b(0xd5)+'t']=_0x223222['headers'][_0x2baa6b(0xcc)](_0x1019d3(0xc6)+_0x2baa6b(0x13a)+_0x1019d3(0xf8))||_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xda)+'ratelimit-'+_0x2baa6b(0xe4)+'et')||undefined);const _0x5dd6bc=this['config'][_0x1019d3(0xdd)];return updateRateLimits(_0x5dd6bc,{..._0xe77584}),_0xe77584;}[_0xde3957(0xf7)+'rs'](){const _0x572ead=_0x4c113e,_0xb9dae8=_0xde3957,_0x1328e5={'Content-Type':_0x572ead(0x160)+_0xb9dae8(0x136)};return this[_0xb9dae8(0xc2)][_0x572ead(0xbf)]&&(_0x1328e5[_0x572ead(0x129)+_0xb9dae8(0xe1)]='Bearer\x20'+this['config']['apiKey']),this[_0x572ead(0xc2)]['baseUrl']?.[_0x572ead(0x14c)](_0xb9dae8(0xcb)+'.ai')&&(_0x1328e5[_0x572ead(0xe5)+'er']=_0xb9dae8(0x11b)+_0x572ead(0x144)+'lvbln/Alvi'+_0x572ead(0x13b),_0x1328e5['X-Title']=_0xb9dae8(0xd6)),_0x1328e5;}[_0x4c113e(0x151)+_0xde3957(0xe9)](_0x3331c8){const _0x3c26f5=_0x4c113e,_0x233ac3=_0x4c113e,_0x2a120c=[],{buildRuntimeHeader:_0xfd52c5}=_0xe47273,_0x193a8d=_0xfd52c5();_0x3331c8[_0x3c26f5(0x115)+'pt']?_0x2a120c[_0x233ac3(0xf2)]({'role':'system','content':_0x193a8d+'\x0a\x0a'+_0x3331c8[_0x3c26f5(0x115)+'pt']}):_0x2a120c[_0x233ac3(0xf2)]({'role':_0x233ac3(0x108),'content':_0x193a8d});if(_0x3331c8[_0x233ac3(0xf4)]&&_0x3331c8[_0x233ac3(0xf4)]['length']>-0x785+0x28e*-0x1+0x1*0xa13)for(const _0x2b657a of _0x3331c8[_0x3c26f5(0xf4)]){if(this[_0x3c26f5(0xc2)][_0x3c26f5(0x114)+_0x233ac3(0xfe)]&&_0x2b657a[_0x3c26f5(0x100)]&&_0x2b657a[_0x3c26f5(0x100)]['length']>-0x1*0x16ca+-0x1f12+-0x3*-0x11f4){const _0x1a54a5=[{'type':_0x3c26f5(0xe6),'text':_0x2b657a['content']}];for(const _0x5e8014 of _0x2b657a[_0x3c26f5(0x100)]){_0x1a54a5[_0x233ac3(0xf2)]({'type':_0x233ac3(0x147),'image_url':{'url':_0x5e8014[_0x3c26f5(0x110)](_0x233ac3(0x139))?_0x5e8014:_0x233ac3(0x13e)+_0x3c26f5(0x118)+_0x3c26f5(0x162)+_0x5e8014}});}_0x2a120c[_0x3c26f5(0xf2)]({'role':_0x2b657a[_0x3c26f5(0x13f)],'content':_0x1a54a5});}else _0x2a120c[_0x3c26f5(0xf2)]({'role':_0x2b657a[_0x233ac3(0x13f)],'content':_0x2b657a[_0x3c26f5(0xd7)]});}return _0x2a120c[_0x3c26f5(0xf2)]({'role':_0x233ac3(0xf1),'content':_0x3331c8[_0x233ac3(0x148)]}),_0x2a120c;}[_0x4c113e(0x145)+'st'](_0x2354b4){const _0x51f7e1=_0xde3957,_0x16b022=_0xde3957,_0x522f76=_0x2354b4[_0x51f7e1(0xd0)]/(-0x11d7+0x1*-0x1f2e+0x3109),_0x2f60e7={'gpt-4o':0.01,'gpt-4o-mini':0.0003,'gemini-2.5-pro':0.005,'gemini-2.5-flash':0.0005};return _0x522f76/(0x13ee+0x2402+0x78*-0x6f)*(_0x2f60e7[this[_0x51f7e1(0xc2)]['model']]||-0xd5b+-0x1676*-0x1+-0x91b+0.001);}[_0x4c113e(0x145)+_0xde3957(0xf5)+'e'](_0x450417){const _0x21d762=_0xde3957,_0x1838af=_0xde3957;if(!_0x450417)return 0x173c+0x1cc+-0x24*0xb2;const _0x443823=(_0x450417[_0x21d762(0x15d)+'ens']||-0x2b1*-0x5+-0x2*0xfd+-0xb7b*0x1)+(_0x450417[_0x1838af(0x11d)+_0x21d762(0x134)]||-0x155d+0x374+0x28f*0x7);return _0x443823/(0x9fb+0x197+-0x6d*0x12)*(0x11a6+-0x1167+0x3f*-0x1+0.001);}}