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,252 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI-Compatible API — /v1/chat/completions + /v1/models
|
|
3
|
-
*
|
|
4
|
-
* Allows external tools (e.g., OpenClaw) to use Claude via Alvin-Bot's
|
|
5
|
-
* Agent SDK. Routes through Claude Code CLI OAuth (Max subscription).
|
|
6
|
-
*
|
|
7
|
-
* Auth: Bearer token (WEBHOOK_TOKEN from .env)
|
|
8
|
-
*/
|
|
9
|
-
import crypto from "crypto";
|
|
10
|
-
import { ClaudeSDKProvider } from "../providers/claude-sdk-provider.js";
|
|
11
|
-
import { config } from "../config.js";
|
|
12
|
-
// Lazy-initialized provider (shares nothing with Telegram sessions)
|
|
13
|
-
let provider = null;
|
|
14
|
-
function getProvider() {
|
|
15
|
-
if (!provider) {
|
|
16
|
-
provider = new ClaudeSDKProvider();
|
|
17
|
-
}
|
|
18
|
-
return provider;
|
|
19
|
-
}
|
|
20
|
-
// ── Auth ────────────────────────────────────────────────
|
|
21
|
-
function checkBearer(req) {
|
|
22
|
-
if (!config.webhookToken)
|
|
23
|
-
return false; // No token = disabled
|
|
24
|
-
const auth = req.headers.authorization || "";
|
|
25
|
-
return auth === `Bearer ${config.webhookToken}`;
|
|
26
|
-
}
|
|
27
|
-
// ── Models Endpoint ─────────────────────────────────────
|
|
28
|
-
function handleModels(res) {
|
|
29
|
-
const now = Math.floor(Date.now() / 1000);
|
|
30
|
-
res.setHeader("Content-Type", "application/json");
|
|
31
|
-
res.end(JSON.stringify({
|
|
32
|
-
object: "list",
|
|
33
|
-
data: [
|
|
34
|
-
{ id: "alvin-opus-4", object: "model", created: now, owned_by: "alvin-bot" },
|
|
35
|
-
{ id: "alvin-sonnet-4", object: "model", created: now, owned_by: "alvin-bot" },
|
|
36
|
-
{ id: "alvin-haiku-4", object: "model", created: now, owned_by: "alvin-bot" },
|
|
37
|
-
],
|
|
38
|
-
}));
|
|
39
|
-
}
|
|
40
|
-
function buildPromptFromMessages(messages) {
|
|
41
|
-
let systemPrompt = "";
|
|
42
|
-
const conversationParts = [];
|
|
43
|
-
for (const msg of messages) {
|
|
44
|
-
if (msg.role === "system") {
|
|
45
|
-
systemPrompt += (systemPrompt ? "\n\n" : "") + msg.content;
|
|
46
|
-
}
|
|
47
|
-
else if (msg.role === "user") {
|
|
48
|
-
conversationParts.push(`User: ${msg.content}`);
|
|
49
|
-
}
|
|
50
|
-
else if (msg.role === "assistant") {
|
|
51
|
-
conversationParts.push(`Assistant: ${msg.content}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Single message: extract raw content without "User:" prefix
|
|
55
|
-
if (conversationParts.length <= 1) {
|
|
56
|
-
const lastUser = messages.filter(m => m.role === "user").pop();
|
|
57
|
-
return { prompt: lastUser?.content || "", systemPrompt };
|
|
58
|
-
}
|
|
59
|
-
// Multi-turn: format as conversation context
|
|
60
|
-
return { prompt: conversationParts.join("\n\n"), systemPrompt };
|
|
61
|
-
}
|
|
62
|
-
async function handleChatCompletions(req, res, body) {
|
|
63
|
-
// Parse request
|
|
64
|
-
let oaiReq;
|
|
65
|
-
try {
|
|
66
|
-
oaiReq = JSON.parse(body);
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
res.writeHead(400, { "Content-Type": "application/json" });
|
|
70
|
-
res.end(JSON.stringify({ error: { message: "Invalid JSON body", type: "invalid_request_error" } }));
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (!oaiReq.messages || !Array.isArray(oaiReq.messages) || oaiReq.messages.length === 0) {
|
|
74
|
-
res.writeHead(400, { "Content-Type": "application/json" });
|
|
75
|
-
res.end(JSON.stringify({ error: { message: "messages array is required", type: "invalid_request_error" } }));
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const { prompt, systemPrompt } = buildPromptFromMessages(oaiReq.messages);
|
|
79
|
-
const completionId = `chatcmpl-${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
|
|
80
|
-
const created = Math.floor(Date.now() / 1000);
|
|
81
|
-
const model = oaiReq.model || "claude-opus-4-6";
|
|
82
|
-
// Optional session resumption via header
|
|
83
|
-
const sessionId = req.headers["x-session-id"] || null;
|
|
84
|
-
const p = getProvider();
|
|
85
|
-
if (oaiReq.stream !== false) {
|
|
86
|
-
// ── Streaming Response (SSE) ──────────────────────
|
|
87
|
-
res.writeHead(200, {
|
|
88
|
-
"Content-Type": "text/event-stream",
|
|
89
|
-
"Cache-Control": "no-cache",
|
|
90
|
-
"Connection": "keep-alive",
|
|
91
|
-
"X-Accel-Buffering": "no",
|
|
92
|
-
});
|
|
93
|
-
// Initial role chunk
|
|
94
|
-
const roleChunk = {
|
|
95
|
-
id: completionId,
|
|
96
|
-
object: "chat.completion.chunk",
|
|
97
|
-
created,
|
|
98
|
-
model,
|
|
99
|
-
choices: [{ index: 0, delta: { role: "assistant", content: "" }, finish_reason: null }],
|
|
100
|
-
};
|
|
101
|
-
res.write(`data: ${JSON.stringify(roleChunk)}\n\n`);
|
|
102
|
-
let outputSessionId = "";
|
|
103
|
-
let inputTokens = 0;
|
|
104
|
-
let outputTokens = 0;
|
|
105
|
-
try {
|
|
106
|
-
for await (const chunk of p.query({ prompt, systemPrompt, sessionId })) {
|
|
107
|
-
if (chunk.type === "text" && chunk.delta) {
|
|
108
|
-
const sseChunk = {
|
|
109
|
-
id: completionId,
|
|
110
|
-
object: "chat.completion.chunk",
|
|
111
|
-
created,
|
|
112
|
-
model,
|
|
113
|
-
choices: [{ index: 0, delta: { content: chunk.delta }, finish_reason: null }],
|
|
114
|
-
};
|
|
115
|
-
res.write(`data: ${JSON.stringify(sseChunk)}\n\n`);
|
|
116
|
-
}
|
|
117
|
-
if (chunk.type === "done") {
|
|
118
|
-
outputSessionId = chunk.sessionId || "";
|
|
119
|
-
inputTokens = chunk.inputTokens || 0;
|
|
120
|
-
outputTokens = chunk.outputTokens || 0;
|
|
121
|
-
// Final chunk with finish_reason
|
|
122
|
-
const doneChunk = {
|
|
123
|
-
id: completionId,
|
|
124
|
-
object: "chat.completion.chunk",
|
|
125
|
-
created,
|
|
126
|
-
model,
|
|
127
|
-
choices: [{ index: 0, delta: {}, finish_reason: "stop" }],
|
|
128
|
-
...(inputTokens || outputTokens ? {
|
|
129
|
-
usage: { prompt_tokens: inputTokens, completion_tokens: outputTokens, total_tokens: inputTokens + outputTokens },
|
|
130
|
-
} : {}),
|
|
131
|
-
};
|
|
132
|
-
res.write(`data: ${JSON.stringify(doneChunk)}\n\n`);
|
|
133
|
-
}
|
|
134
|
-
if (chunk.type === "error") {
|
|
135
|
-
const errChunk = {
|
|
136
|
-
id: completionId,
|
|
137
|
-
object: "chat.completion.chunk",
|
|
138
|
-
created,
|
|
139
|
-
model,
|
|
140
|
-
choices: [{ index: 0, delta: { content: `\n\n[Error: ${chunk.error}]` }, finish_reason: "stop" }],
|
|
141
|
-
};
|
|
142
|
-
res.write(`data: ${JSON.stringify(errChunk)}\n\n`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
148
|
-
const errChunk = {
|
|
149
|
-
id: completionId,
|
|
150
|
-
object: "chat.completion.chunk",
|
|
151
|
-
created,
|
|
152
|
-
model,
|
|
153
|
-
choices: [{ index: 0, delta: { content: `\n\n[Error: ${errMsg}]` }, finish_reason: "stop" }],
|
|
154
|
-
};
|
|
155
|
-
res.write(`data: ${JSON.stringify(errChunk)}\n\n`);
|
|
156
|
-
}
|
|
157
|
-
// Emit session ID for multi-turn support
|
|
158
|
-
if (outputSessionId) {
|
|
159
|
-
res.write(`data: ${JSON.stringify({ session_id: outputSessionId })}\n\n`);
|
|
160
|
-
}
|
|
161
|
-
res.write("data: [DONE]\n\n");
|
|
162
|
-
res.end();
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
// ── Non-Streaming Response ────────────────────────
|
|
166
|
-
let fullText = "";
|
|
167
|
-
let inputTokens = 0;
|
|
168
|
-
let outputTokens = 0;
|
|
169
|
-
let outputSessionId = "";
|
|
170
|
-
try {
|
|
171
|
-
for await (const chunk of p.query({ prompt, systemPrompt, sessionId })) {
|
|
172
|
-
if (chunk.type === "text" && chunk.delta) {
|
|
173
|
-
fullText += chunk.delta;
|
|
174
|
-
}
|
|
175
|
-
if (chunk.type === "done") {
|
|
176
|
-
outputSessionId = chunk.sessionId || "";
|
|
177
|
-
inputTokens = chunk.inputTokens || 0;
|
|
178
|
-
outputTokens = chunk.outputTokens || 0;
|
|
179
|
-
}
|
|
180
|
-
if (chunk.type === "error") {
|
|
181
|
-
res.writeHead(500, { "Content-Type": "application/json" });
|
|
182
|
-
res.end(JSON.stringify({
|
|
183
|
-
error: { message: chunk.error || "Provider error", type: "server_error" },
|
|
184
|
-
}));
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
191
|
-
res.writeHead(500, { "Content-Type": "application/json" });
|
|
192
|
-
res.end(JSON.stringify({
|
|
193
|
-
error: { message: errMsg, type: "server_error" },
|
|
194
|
-
}));
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
res.writeHead(200, {
|
|
198
|
-
"Content-Type": "application/json",
|
|
199
|
-
...(outputSessionId ? { "x-session-id": outputSessionId } : {}),
|
|
200
|
-
});
|
|
201
|
-
res.end(JSON.stringify({
|
|
202
|
-
id: completionId,
|
|
203
|
-
object: "chat.completion",
|
|
204
|
-
created,
|
|
205
|
-
model,
|
|
206
|
-
choices: [{
|
|
207
|
-
index: 0,
|
|
208
|
-
message: { role: "assistant", content: fullText },
|
|
209
|
-
finish_reason: "stop",
|
|
210
|
-
}],
|
|
211
|
-
usage: {
|
|
212
|
-
prompt_tokens: inputTokens,
|
|
213
|
-
completion_tokens: outputTokens,
|
|
214
|
-
total_tokens: inputTokens + outputTokens,
|
|
215
|
-
},
|
|
216
|
-
}));
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
// ── Exported Handler ────────────────────────────────────
|
|
220
|
-
/**
|
|
221
|
-
* Handle OpenAI-compatible API requests (/v1/...).
|
|
222
|
-
* Returns true if the request was handled, false if not an /v1/ route.
|
|
223
|
-
*/
|
|
224
|
-
export function handleOpenAICompat(req, res, urlPath, body) {
|
|
225
|
-
// Only handle /v1/ routes
|
|
226
|
-
if (!urlPath.startsWith("/v1/"))
|
|
227
|
-
return false;
|
|
228
|
-
// Auth check (Bearer token required)
|
|
229
|
-
if (!checkBearer(req)) {
|
|
230
|
-
res.writeHead(401, { "Content-Type": "application/json" });
|
|
231
|
-
res.end(JSON.stringify({
|
|
232
|
-
error: { message: "Invalid API key", type: "authentication_error" },
|
|
233
|
-
}));
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
// GET /v1/models
|
|
237
|
-
if (urlPath === "/v1/models" && req.method === "GET") {
|
|
238
|
-
handleModels(res);
|
|
239
|
-
return true;
|
|
240
|
-
}
|
|
241
|
-
// POST /v1/chat/completions
|
|
242
|
-
if (urlPath === "/v1/chat/completions" && req.method === "POST") {
|
|
243
|
-
handleChatCompletions(req, res, body);
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
// Unknown /v1/ route
|
|
247
|
-
res.writeHead(404, { "Content-Type": "application/json" });
|
|
248
|
-
res.end(JSON.stringify({
|
|
249
|
-
error: { message: `Unknown endpoint: ${urlPath}`, type: "invalid_request_error" },
|
|
250
|
-
}));
|
|
251
|
-
return true;
|
|
252
|
-
}
|
|
1
|
+
(function(_0x3f1e70,_0x1bfc5b){const _0x5221e6=_0x3f8f,_0x457a0b=_0x3f8f,_0x1fa5de=_0x3f1e70();while(!![]){try{const _0x443f07=-parseInt(_0x5221e6(0x12a))/(0x617*0x1+0x243+-0x859)+-parseInt(_0x457a0b(0x117))/(0x18d0+-0x1cf1+0x3*0x161)+-parseInt(_0x457a0b(0xfd))/(0x1f42*-0x1+0xb45*-0x1+0x6*0x717)+-parseInt(_0x457a0b(0x126))/(-0x106*-0xd+0x21b+0x7*-0x233)+parseInt(_0x457a0b(0x129))/(-0x229*-0x8+0x760*-0x1+-0x9e3)*(parseInt(_0x457a0b(0x11a))/(-0x2144+-0x17e8+0x3932))+-parseInt(_0x457a0b(0x121))/(0x8e2+0x14e5+-0x1dc0)*(parseInt(_0x5221e6(0x11c))/(-0x2*0x236+-0x1*-0x1a9a+-0x1626))+parseInt(_0x457a0b(0xf9))/(-0x1863+-0x946+0x21b2);if(_0x443f07===_0x1bfc5b)break;else _0x1fa5de['push'](_0x1fa5de['shift']());}catch(_0x1317fe){_0x1fa5de['push'](_0x1fa5de['shift']());}}}(_0x18d4,0x1073*-0x21+0x8627e+-0x1*-0x216a3));const _0x294bb8=(function(){let _0x47ca53=!![];return function(_0x484b98,_0x143ec4){const _0x56b765=_0x47ca53?function(){if(_0x143ec4){const _0x4c0fec=_0x143ec4['apply'](_0x484b98,arguments);return _0x143ec4=null,_0x4c0fec;}}:function(){};return _0x47ca53=![],_0x56b765;};}()),_0x142d9a=_0x294bb8(this,function(){const _0x1e2727=_0x3f8f,_0x5681b5=_0x3f8f;return _0x142d9a[_0x1e2727(0xe7)]()[_0x5681b5(0xfe)](_0x1e2727(0x111)+'+$')[_0x1e2727(0xe7)]()[_0x1e2727(0xf7)+'r'](_0x142d9a)[_0x1e2727(0xfe)]('(((.+)+)+)'+'+$');});_0x142d9a();import _0x3f05c3 from'crypto';import{ClaudeSDKProvider}from'../providers/claude-sdk-provider.js';function _0x3f8f(_0x4dbf4,_0x304267){_0x4dbf4=_0x4dbf4-(0xd43+-0x1487+0x81c);const _0x461cdd=_0x18d4();let _0xd609ae=_0x461cdd[_0x4dbf4];if(_0x3f8f['zrQDPV']===undefined){var _0x2903f2=function(_0x47ca53){const _0x484b98='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x143ec4='',_0x56b765='',_0x4c0fec=_0x143ec4+_0x2903f2;for(let _0x3a8a8c=-0x12bb+0xd01+0x5ba,_0x4d2423,_0x11c66c,_0x122c4c=-0x1c3e+0x1a1d+0x221;_0x11c66c=_0x47ca53['charAt'](_0x122c4c++);~_0x11c66c&&(_0x4d2423=_0x3a8a8c%(0x2425+-0x1*0x11b3+-0x126e)?_0x4d2423*(-0x1f06+0x8ad*-0x1+-0x5b5*-0x7)+_0x11c66c:_0x11c66c,_0x3a8a8c++%(0x1*-0x166f+0x1545+-0x97*-0x2))?_0x143ec4+=_0x4c0fec['charCodeAt'](_0x122c4c+(0x2201*0x1+-0x1dc2+-0x435*0x1))-(0xf2e+-0xa*0x11e+-0x3f8)!==-0x52*-0x26+0x1f6d*-0x1+0x1341?String['fromCharCode'](0x1*-0x148b+-0x1515*0x1+0x2a9f&_0x4d2423>>(-(-0x1*-0x1889+-0x1885+-0x2)*_0x3a8a8c&0x1ca6+0x1315*0x1+-0x2fb5)):_0x3a8a8c:0x6f*-0x7+-0x68+0x371){_0x11c66c=_0x484b98['indexOf'](_0x11c66c);}for(let _0x2425dc=-0x66d+-0x892*0x1+0xeff,_0x43575c=_0x143ec4['length'];_0x2425dc<_0x43575c;_0x2425dc++){_0x56b765+='%'+('00'+_0x143ec4['charCodeAt'](_0x2425dc)['toString'](0x2249+0x49*0x5b+-0x3c2c))['slice'](-(-0x601*-0x2+-0x1653+0xa53));}return decodeURIComponent(_0x56b765);};_0x3f8f['gycKGD']=_0x2903f2,_0x3f8f['GMesHX']={},_0x3f8f['zrQDPV']=!![];}const _0x572110=_0x461cdd[0x31c*0x6+-0x5dc+-0xccc],_0x45c710=_0x4dbf4+_0x572110,_0x3f05c3=_0x3f8f['GMesHX'][_0x45c710];if(!_0x3f05c3){const _0x469d3a=function(_0x2a276c){this['zNxIDr']=_0x2a276c,this['PmXiND']=[0x625+-0x2575*-0x1+-0x2b99,-0x5af+-0x2384+0x2933,0x7b8+-0x1832+-0x2bf*-0x6],this['okVaVs']=function(){return'newState';},this['tGNFDa']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['zlEHJZ']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x469d3a['prototype']['IyVepO']=function(){const _0x14bd4b=new RegExp(this['tGNFDa']+this['zlEHJZ']),_0x4e2f5f=_0x14bd4b['test'](this['okVaVs']['toString']())?--this['PmXiND'][-0x710*0x2+-0xaf1+0x1912*0x1]:--this['PmXiND'][0x5f*0x1f+-0x23d0+0x7*0x379];return this['pfCWYV'](_0x4e2f5f);},_0x469d3a['prototype']['pfCWYV']=function(_0x28b700){if(!Boolean(~_0x28b700))return _0x28b700;return this['KdrsZI'](this['zNxIDr']);},_0x469d3a['prototype']['KdrsZI']=function(_0x12773b){for(let _0x31a840=-0x11b5*-0x1+-0x1f5*0x13+0x137a,_0x2a0c8f=this['PmXiND']['length'];_0x31a840<_0x2a0c8f;_0x31a840++){this['PmXiND']['push'](Math['round'](Math['random']())),_0x2a0c8f=this['PmXiND']['length'];}return _0x12773b(this['PmXiND'][0x3*-0x703+0xe9d+-0x6*-0x112]);},new _0x469d3a(_0x3f8f)['IyVepO'](),_0xd609ae=_0x3f8f['gycKGD'](_0xd609ae),_0x3f8f['GMesHX'][_0x45c710]=_0xd609ae;}else _0xd609ae=_0x3f05c3;return _0xd609ae;}import{config}from'../config.js';let provider=null;function getProvider(){return!provider&&(provider=new ClaudeSDKProvider()),provider;}function checkBearer(_0x3a8a8c){const _0x53f5ce=_0x3f8f,_0x8d06fa=_0x3f8f;if(!config[_0x53f5ce(0xe8)+'en'])return![];const _0x4d2423=_0x3a8a8c[_0x53f5ce(0x10c)][_0x53f5ce(0xd9)+_0x8d06fa(0xda)]||'';return _0x4d2423==='Bearer\x20'+config[_0x53f5ce(0xe8)+'en'];}function handleModels(_0x11c66c){const _0x19ac83=_0x3f8f,_0x229cdf=_0x3f8f,_0x122c4c=Math[_0x19ac83(0x10b)](Date[_0x229cdf(0xf4)]()/(-0x6*0x167+-0x15dd+-0x1*-0x222f));_0x11c66c[_0x19ac83(0x11f)]('Content-Ty'+'pe',_0x19ac83(0xe2)+_0x229cdf(0xed)),_0x11c66c[_0x229cdf(0xe1)](JSON[_0x229cdf(0x108)]({'object':_0x19ac83(0xdf),'data':[{'id':_0x229cdf(0x114)+'-4','object':'model','created':_0x122c4c,'owned_by':_0x19ac83(0x101)},{'id':'alvin-sonn'+'et-4','object':_0x19ac83(0x102),'created':_0x122c4c,'owned_by':'alvin-bot'},{'id':_0x19ac83(0xeb)+_0x229cdf(0x118),'object':_0x229cdf(0x102),'created':_0x122c4c,'owned_by':_0x19ac83(0x101)}]}));}function _0x18d4(){const _0x2c3376=['C2v0sgvHzgvY','D3jPDgvizwfK','mJu0muX6sejHwG','zg9Uzq','BgvUz3rO','CxvLC3rFzxjYBW','rv0kcG','mZyXndCYme9oy2jJwG','CgfYC2u','C3rVCa','mtGYnJq1CKjxuLLh','mJK4ntGZB2LXtwvK','Dgv4Dc9LDMvUDa','BM8Ty2fJAgu','yxnZAxn0yw50','zhbVAw50oIa','uhjVDMLKzxiGzq','yxv0Ag9YAxPHDa','Aw9U','C2vYDMvYx2vYCG','zgvSDge','AxnbCNjHEq','CNjVCG','BgLZDa','l3yXlW','zw5K','yxbWBgLJyxrPBW','CMfUzg9Tvvvjra','Ec1ZzxnZAw9Ulq','CxvPCMvK','l3yXl2nOyxqVyW','Dg9tDhjPBMC','D2vIAg9VA1rVAW','BwvZC2fNzxmGyq','B21WBgv0Aw9UCW','ywX2Aw4TAgfPAW','zMLSDgvY','BI9QC29U','DgLVBL9LCNjVCG','DhLWzq','D3jPDgu','Aw52ywXPzf9Yzq','zgf0ytOG','lxn0CMvHBq','BM93','ue9tva','vw5RBM93BIbLBG','y29UC3rYDwn0BW','Dgv4Da','mZa2mZa5ntfHDLbOCgS','C2vZC2LVBKLK','zxrPB24','B3v0Chv0vg9Rzq','mJe1ndK2nNr6C1bksW','C2vHCMnO','ssbRzxK','C2XPy2u','ywX2Aw4TyM90','Bw9KzwW','cGPBrxjYB3i6ia','DxnLCG','zxjYB3i','y29UDgvUDa','BwvZC2fNzxm','C3rYAw5NAwz5','zxrPB24Uy2H1BG','CNjHEsbPCYbYzq','zMXVB3i','AgvHzgvYCW','C3rYzwfT','C3LZDgvT','y2HHDc5JB21WBa','CM9Szq','kcGOlISPkYKRkq','sw52ywXPzcbkuW','CxvLCNK','ywX2Aw4TB3b1CW','zgf0ytOGw0rptG','Bwv0Ag9K','mtG2odKWofvmt25hDW','Ds00','Aw5WDxruB2TLBG','mtjowfnUwK0','qxnZAxn0yw50oG','mtyZmNLsy3jItq','AM9PBG','BwvZC2fNzq'];_0x18d4=function(){return _0x2c3376;};return _0x18d4();}function buildPromptFromMessages(_0x2425dc){const _0x17bdc7=_0x3f8f,_0x32727d=_0x3f8f;let _0x43575c='';const _0x469d3a=[];for(const _0x2a276c of _0x2425dc){if(_0x2a276c['role']===_0x17bdc7(0x10e))_0x43575c+=(_0x43575c?'\x0a\x0a':'')+_0x2a276c['content'];else{if(_0x2a276c[_0x32727d(0x110)]===_0x17bdc7(0x104))_0x469d3a['push']('User:\x20'+_0x2a276c[_0x17bdc7(0x106)]);else _0x2a276c['role']===_0x17bdc7(0x12d)&&_0x469d3a['push'](_0x17bdc7(0x11b)+'\x20'+_0x2a276c['content']);}}if(_0x469d3a[_0x17bdc7(0x123)]<=-0x26b8+-0x1f06+0x45bf*0x1){const _0x14bd4b=_0x2425dc[_0x32727d(0xec)](_0x4e2f5f=>_0x4e2f5f[_0x17bdc7(0x110)]==='user')['pop']();return{'prompt':_0x14bd4b?.[_0x17bdc7(0x106)]||'','systemPrompt':_0x43575c};}return{'prompt':_0x469d3a[_0x17bdc7(0x11d)]('\x0a\x0a'),'systemPrompt':_0x43575c};}async function handleChatCompletions(_0x28b700,_0x12773b,_0x31a840){const _0x1997d3=_0x3f8f,_0x1f10aa=_0x3f8f;let _0x2a0c8f;try{_0x2a0c8f=JSON[_0x1997d3(0x127)](_0x31a840);}catch{_0x12773b[_0x1f10aa(0x120)](0x484+0x10*-0x1d2+-0x10c*-0x19,{'Content-Type':'applicatio'+_0x1997d3(0xed)}),_0x12773b[_0x1f10aa(0xe1)](JSON[_0x1997d3(0x108)]({'error':{'message':_0x1997d3(0x112)+'ON\x20body','type':_0x1f10aa(0xf1)+_0x1f10aa(0x124)+'r'}}));return;}if(!_0x2a0c8f[_0x1997d3(0x107)]||!Array[_0x1f10aa(0xdd)](_0x2a0c8f[_0x1f10aa(0x107)])||_0x2a0c8f['messages'][_0x1997d3(0x123)]===-0x12f9*-0x2+0xa53*-0x2+-0x114c){_0x12773b[_0x1997d3(0x120)](-0x2*-0x113e+-0x2062+-0x2*0x45,{'Content-Type':'applicatio'+_0x1997d3(0xed)}),_0x12773b[_0x1f10aa(0xe1)](JSON[_0x1997d3(0x108)]({'error':{'message':_0x1f10aa(0xe9)+_0x1997d3(0x10a)+_0x1f10aa(0xe5),'type':_0x1997d3(0xf1)+_0x1f10aa(0x124)+'r'}}));return;}const {prompt:_0x23bacb,systemPrompt:_0xab5c7d}=buildPromptFromMessages(_0x2a0c8f[_0x1f10aa(0x107)]),_0x55b43a='chatcmpl-'+_0x3f05c3[_0x1f10aa(0xe3)]()['replace'](/-/g,'')[_0x1f10aa(0x100)](-0x1981+-0x52*-0x26+0xd55*0x1,-0xe65+0x1*-0x148b+-0x1184*-0x2),_0x532d30=Math[_0x1f10aa(0x10b)](Date[_0x1997d3(0xf4)]()/(-0x2293+-0x1*-0x1889+0xdf2)),_0xcd8015=_0x2a0c8f[_0x1997d3(0x102)]||'claude-opu'+'s-4-6',_0x4ff78a=_0x28b700['headers'][_0x1f10aa(0xe4)+'id']||null,_0x1213a1=getProvider();if(_0x2a0c8f[_0x1f10aa(0x10d)]!==![]){_0x12773b[_0x1997d3(0x120)](-0x7e1*0x1+0xe53*0x2+-0x13fd,{'Content-Type':_0x1f10aa(0x12b)+_0x1997d3(0xf3),'Cache-Control':_0x1f10aa(0x12c),'Connection':'keep-alive','X-Accel-Buffering':'no'});const _0x293de1={'id':_0x55b43a,'object':_0x1997d3(0x10f)+'etion.chun'+'k','created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'delta':{'role':'assistant','content':''},'finish_reason':null}]};_0x12773b['write']('data:\x20'+JSON[_0x1f10aa(0x108)](_0x293de1)+'\x0a\x0a');let _0x49089b='',_0x3b9083=0x6f*-0x7+-0x68+0x371,_0x23cb13=-0x66d+-0x892*0x1+0xeff;try{for await(const _0x7f7fee of _0x1213a1[_0x1f10aa(0x113)]({'prompt':_0x23bacb,'systemPrompt':_0xab5c7d,'sessionId':_0x4ff78a})){if(_0x7f7fee[_0x1f10aa(0xef)]===_0x1f10aa(0xf8)&&_0x7f7fee['delta']){const _0x3f56d9={'id':_0x55b43a,'object':_0x1997d3(0x10f)+_0x1f10aa(0x109)+'k','created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'delta':{'content':_0x7f7fee[_0x1f10aa(0xdc)]},'finish_reason':null}]};_0x12773b['write'](_0x1f10aa(0xf2)+JSON[_0x1f10aa(0x108)](_0x3f56d9)+'\x0a\x0a');}if(_0x7f7fee[_0x1f10aa(0xef)]===_0x1f10aa(0x122)){_0x49089b=_0x7f7fee[_0x1f10aa(0xfa)]||'',_0x3b9083=_0x7f7fee[_0x1f10aa(0x119)+'s']||0x2249+0x49*0x5b+-0x3c3c,_0x23cb13=_0x7f7fee[_0x1997d3(0xfc)+'ns']||-0x601*-0x2+-0x1653+0xa51;const _0x598684={'id':_0x55b43a,'object':_0x1f10aa(0x10f)+_0x1997d3(0x109)+'k','created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'delta':{},'finish_reason':_0x1f10aa(0x128)}],..._0x3b9083||_0x23cb13?{'usage':{'prompt_tokens':_0x3b9083,'completion_tokens':_0x23cb13,'total_tokens':_0x3b9083+_0x23cb13}}:{}};_0x12773b[_0x1f10aa(0xf0)](_0x1f10aa(0xf2)+JSON['stringify'](_0x598684)+'\x0a\x0a');}if(_0x7f7fee['type']===_0x1f10aa(0x105)){const _0x1a50e1={'id':_0x55b43a,'object':_0x1f10aa(0x10f)+'etion.chun'+'k','created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'delta':{'content':_0x1997d3(0x103)+_0x7f7fee[_0x1997d3(0x105)]+']'},'finish_reason':_0x1f10aa(0x128)}]};_0x12773b[_0x1997d3(0xf0)](_0x1997d3(0xf2)+JSON[_0x1997d3(0x108)](_0x1a50e1)+'\x0a\x0a');}}}catch(_0x311587){const _0x2c0d3b=_0x311587 instanceof Error?_0x311587[_0x1f10aa(0x11e)]:String(_0x311587),_0xf68f6={'id':_0x55b43a,'object':'chat.compl'+_0x1f10aa(0x109)+'k','created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'delta':{'content':_0x1997d3(0x103)+_0x2c0d3b+']'},'finish_reason':_0x1f10aa(0x128)}]};_0x12773b[_0x1f10aa(0xf0)](_0x1997d3(0xf2)+JSON['stringify'](_0xf68f6)+'\x0a\x0a');}_0x49089b&&_0x12773b[_0x1997d3(0xf0)](_0x1f10aa(0xf2)+JSON['stringify']({'session_id':_0x49089b})+'\x0a\x0a'),_0x12773b[_0x1997d3(0xf0)](_0x1f10aa(0x115)+_0x1997d3(0x125)),_0x12773b['end']();}else{let _0x2a38dc='',_0x3c2de1=0x31c*0x6+-0x5dc+-0xccc,_0x4567f8=0x625+-0x2575*-0x1+-0x2b9a,_0x561f12='';try{for await(const _0x27023d of _0x1213a1[_0x1997d3(0x113)]({'prompt':_0x23bacb,'systemPrompt':_0xab5c7d,'sessionId':_0x4ff78a})){_0x27023d[_0x1f10aa(0xef)]==='text'&&_0x27023d[_0x1997d3(0xdc)]&&(_0x2a38dc+=_0x27023d['delta']);_0x27023d[_0x1f10aa(0xef)]===_0x1997d3(0x122)&&(_0x561f12=_0x27023d[_0x1f10aa(0xfa)]||'',_0x3c2de1=_0x27023d[_0x1997d3(0x119)+'s']||-0x5af+-0x2384+0x2933,_0x4567f8=_0x27023d[_0x1997d3(0xfc)+'ns']||0x7b8+-0x1832+-0x2bf*-0x6);if(_0x27023d[_0x1f10aa(0xef)]===_0x1997d3(0x105)){_0x12773b[_0x1f10aa(0x120)](-0x710*0x2+-0xaf1+0x1b05*0x1,{'Content-Type':'applicatio'+_0x1997d3(0xed)}),_0x12773b[_0x1f10aa(0xe1)](JSON['stringify']({'error':{'message':_0x27023d[_0x1f10aa(0x105)]||_0x1f10aa(0xd8)+_0x1f10aa(0xde),'type':_0x1f10aa(0xdb)+'or'}}));return;}}}catch(_0x3fc04b){const _0x361b4e=_0x3fc04b instanceof Error?_0x3fc04b[_0x1f10aa(0x11e)]:String(_0x3fc04b);_0x12773b[_0x1997d3(0x120)](0x5f*0x1f+-0x23d0+0x9*0x2eb,{'Content-Type':'applicatio'+'n/json'}),_0x12773b[_0x1f10aa(0xe1)](JSON['stringify']({'error':{'message':_0x361b4e,'type':'server_err'+'or'}}));return;}_0x12773b[_0x1997d3(0x120)](-0x11b5*-0x1+-0x1f5*0x13+0x1442,{'Content-Type':_0x1f10aa(0xe2)+_0x1997d3(0xed),..._0x561f12?{'x-session-id':_0x561f12}:{}}),_0x12773b[_0x1997d3(0xe1)](JSON[_0x1997d3(0x108)]({'id':_0x55b43a,'object':'chat.compl'+_0x1997d3(0xfb),'created':_0x532d30,'model':_0xcd8015,'choices':[{'index':0x0,'message':{'role':_0x1997d3(0x12d),'content':_0x2a38dc},'finish_reason':'stop'}],'usage':{'prompt_tokens':_0x3c2de1,'completion_tokens':_0x4567f8,'total_tokens':_0x3c2de1+_0x4567f8}}));}}export function handleOpenAICompat(_0x28ce4f,_0x1a4950,_0x1c58a9,_0x2a55cb){const _0x4bfff8=_0x3f8f,_0x17e7f4=_0x3f8f;if(!_0x1c58a9['startsWith'](_0x4bfff8(0xe0)))return![];if(!checkBearer(_0x28ce4f))return _0x1a4950[_0x17e7f4(0x120)](0x3*-0x703+0xe9d+-0x5*-0x199,{'Content-Type':_0x4bfff8(0xe2)+_0x4bfff8(0xed)}),_0x1a4950[_0x4bfff8(0xe1)](JSON[_0x17e7f4(0x108)]({'error':{'message':'Invalid\x20AP'+_0x17e7f4(0xff),'type':'authentica'+_0x4bfff8(0xee)}})),!![];if(_0x1c58a9==='/v1/models'&&_0x28ce4f[_0x17e7f4(0x116)]==='GET')return handleModels(_0x1a4950),!![];if(_0x1c58a9===_0x4bfff8(0xe6)+_0x17e7f4(0xea)&&_0x28ce4f['method']===_0x4bfff8(0xf5))return handleChatCompletions(_0x28ce4f,_0x1a4950,_0x2a55cb),!![];return _0x1a4950['writeHead'](-0xcf1*0x3+0x78+0x1*0x27ef,{'Content-Type':_0x17e7f4(0xe2)+_0x4bfff8(0xed)}),_0x1a4950[_0x4bfff8(0xe1)](JSON[_0x17e7f4(0x108)]({'error':{'message':_0x4bfff8(0xf6)+_0x4bfff8(0x12e)+_0x1c58a9,'type':'invalid_re'+_0x4bfff8(0x124)+'r'}})),!![];}
|