alvin-bot 5.6.2 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -130
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -443
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -0
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,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);}}