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
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Alvin Bot are documented here.
|
|
4
4
|
|
|
5
|
+
## [5.8.1] — 2026-05-19
|
|
6
|
+
|
|
7
|
+
### Clearer package page and version-pinned changelog links
|
|
8
|
+
|
|
9
|
+
Documentation-only release — no code, configuration, data, or behavior
|
|
10
|
+
change. The npm package page (README) is refreshed and now renders
|
|
11
|
+
correctly on npm itself: the architecture overview is plain text instead
|
|
12
|
+
of a diagram format npm cannot display, and the "What's new" line and
|
|
13
|
+
roadmap reflect the current 5.x line. Separately, every release on the
|
|
14
|
+
project site now links to its own exact version-pinned changelog instead
|
|
15
|
+
of a generic package page.
|
|
16
|
+
|
|
17
|
+
## [5.8.0] — 2026-05-19
|
|
18
|
+
|
|
19
|
+
### Smaller, hardened distribution build
|
|
20
|
+
|
|
21
|
+
The published npm package now ships a hardened, build-optimized
|
|
22
|
+
distribution instead of raw compiled files. The bot behaves exactly as
|
|
23
|
+
before — same commands, same configuration, same data, same
|
|
24
|
+
performance — but the shipped code is leaner and more tamper-resistant.
|
|
25
|
+
Local development is completely untouched: `npm run build` still
|
|
26
|
+
produces the normal readable build for contributors, and an internal
|
|
27
|
+
debug build remains available for troubleshooting. As always, verified
|
|
28
|
+
with a fresh global install on a clean separate machine.
|
|
29
|
+
|
|
5
30
|
## [5.7.0] — 2026-05-19
|
|
6
31
|
|
|
7
32
|
### Background-task results now arrive the instant the task finishes, and survive a restart
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Alvin Bot is an open-source, MIT-licensed, self-hosted autonomous AI agent that runs on your own machine and answers you on Telegram, Slack, Discord, WhatsApp, Signal, a terminal TUI, and a web dashboard. It is built on the official Claude Agent SDK and runs a provider-agnostic engine that also drives OpenAI, Groq, Google Gemini, NVIDIA NIM, OpenRouter, and Ollama, with automatic failover after two consecutive provider failures and a heartbeat health check every five minutes. Unlike most personal AI agents, it ships a zero-config indexed memory store: with no embedding API key it falls back to a built-in SQLite FTS5 keyword index, so recall works out of the box. It dispatches detached sub-agents as independent `claude -p` subprocesses that keep running and deliver their result even if the parent conversation is aborted. It is local-first and telemetry-free — prompts and responses are never logged off-machine, secrets live in a chmod-0600 `.env`, and shell execution is allowlisted by default.
|
|
6
6
|
|
|
7
|
-
> **What's new — v5.
|
|
7
|
+
> **What's new — v5.8.1 (May 2026):** Leaner, hardened distribution build (v5.8.0) — the published package ships build-optimized, more tamper-resistant code while behaving exactly as before (same commands, config, data, performance); local development stays fully readable. v5.8.1 is a docs-only refresh of this page. Built on the rest of the 5.x line: live "btw …" steering of a running task, an honest instant ⛔ Stop, compact background-task delivery (tight header + answer, long output as a single file), evidence-based health monitoring, a zero-config FTS5 keyword memory index (**no embedding API key**), multi-provider failover, and detached sub-agents that survive a parent abort. [Full changelog →](CHANGELOG.md)
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -243,36 +243,27 @@ If your AI provider isn't working, run `doctor` — it tests the actual API conn
|
|
|
243
243
|
|
|
244
244
|
## 🏗️ Architecture
|
|
245
245
|
|
|
246
|
-
```mermaid
|
|
247
|
-
flowchart TB
|
|
248
|
-
classDef ent fill:#1e293b,color:#e2e8f0,stroke:#475569
|
|
249
|
-
classDef core fill:#0f172a,color:#f1f5f9,stroke:#3b82f6,stroke-width:2px
|
|
250
|
-
classDef prov fill:#1e293b,color:#cbd5e1,stroke:#64748b
|
|
251
|
-
classDef mem fill:#1e293b,color:#cbd5e1,stroke:#10b981
|
|
252
|
-
|
|
253
|
-
TG[Telegram]:::ent
|
|
254
|
-
SL[Slack]:::ent
|
|
255
|
-
WA[WhatsApp]:::ent
|
|
256
|
-
DC[Discord]:::ent
|
|
257
|
-
SG[Signal]:::ent
|
|
258
|
-
WEB[Web UI · TUI · CLI]:::ent
|
|
259
|
-
|
|
260
|
-
TG & SL & WA & DC & SG & WEB --> WR
|
|
261
|
-
|
|
262
|
-
WR[Workspace Resolver<br/>per-channel cwd + persona]:::core
|
|
263
|
-
WR --> ENG[Engine<br/>routing · fallback · heartbeat]:::core
|
|
264
|
-
|
|
265
|
-
ENG --> CL[Claude SDK]:::prov
|
|
266
|
-
ENG --> OAI[OpenAI · Groq · Gemini ·<br/>NVIDIA · OpenRouter]:::prov
|
|
267
|
-
ENG --> OL[Ollama · Codex CLI ·<br/>OpenAI-compatible]:::prov
|
|
268
|
-
|
|
269
|
-
ENG -.reads.-> MEM
|
|
270
|
-
MEM[Memory Layer]:::mem
|
|
271
|
-
MEM --> L0[L0 / L1<br/>identity.md · preferences.md<br/>always plain-text]:::mem
|
|
272
|
-
MEM --> SQL[SQLite store · provider auto-detect<br/>Gemini · OpenAI · Ollama · FTS5]:::mem
|
|
273
|
-
|
|
274
|
-
ENG -.dispatches.-> SUB[Detached sub-agents<br/>independent claude -p]:::prov
|
|
275
246
|
```
|
|
247
|
+
Telegram Slack WhatsApp Discord Signal Web UI · TUI · CLI
|
|
248
|
+
└─────────┴─────────┴────┬────┴─────────┴───────────┘
|
|
249
|
+
▼
|
|
250
|
+
Workspace Resolver (per-channel cwd + persona)
|
|
251
|
+
▼
|
|
252
|
+
Engine (routing · fallback · heartbeat)
|
|
253
|
+
┌──────────────────────┼───────────────────────────┐
|
|
254
|
+
▼ ▼ ▼
|
|
255
|
+
Claude SDK OpenAI · Groq · Gemini · Ollama · Codex CLI ·
|
|
256
|
+
NVIDIA · OpenRouter OpenAI-compatible
|
|
257
|
+
│
|
|
258
|
+
├─ reads ▶ Memory Layer
|
|
259
|
+
│ ├─ L0 / L1 — identity.md · preferences.md (always plain-text)
|
|
260
|
+
│ └─ SQLite store — provider auto-detect (Gemini · OpenAI · Ollama · FTS5)
|
|
261
|
+
│
|
|
262
|
+
└─ dispatches ▶ Detached sub-agents (independent `claude -p`, survive parent abort)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
> Rendered as plain text so it displays identically on npm **and** GitHub
|
|
266
|
+
> (npm's README renderer does not support Mermaid diagrams).
|
|
276
267
|
|
|
277
268
|
### Provider matrix
|
|
278
269
|
|
|
@@ -668,6 +659,9 @@ ALVIN_TRENDS_AI_AFTER_DAYS=7 # Days of history before AI anomaly detec
|
|
|
668
659
|
|
|
669
660
|
| Version | Theme | Highlights |
|
|
670
661
|
|---|---|---|
|
|
662
|
+
| **v5.7 – v5.8** *(May 2026)* | Distribution hardening | Leaner, more tamper-resistant published package; local dev stays fully readable. Verified by fresh global install on a clean machine. |
|
|
663
|
+
| **v5.3 – v5.6** *(May 2026)* | Control + delivery UX | Live `btw …` steering of a running task, honest instant ⛔ Stop with confirmation, compact background-task delivery (tight header + answer, long output as one file), 48 h monitor self-heal. |
|
|
664
|
+
| **v5.0 – v5.2** *(May 2026)* | Reliable mid-task stop + hardening | Dependable `/cancel` (soft) and `/stopall` (hard) with an inline ⛔ button; whole-project security + bug-hardening pass. |
|
|
671
665
|
| **v4.22** *(May 2026)* | Memory architecture overhaul | Pluggable embedding providers — **Gemini · OpenAI · Ollama · FTS5 (zero-config keyword fallback)**. Auto-detection picks the best available, so users with no API key still get a working indexed memory store. Smart inject mode stops bulk-injecting `MEMORY.md` once SQLite is populated. |
|
|
672
666
|
| **v4.21** | Agent Browser skill | Tier-1.5 token-efficient web automation via the [agent-browser](https://github.com/vercel-labs/agent-browser) CLI — opt-in by install. ~90 % token reduction vs Playwright on cooperative pages. |
|
|
673
667
|
| **v4.20** | SQLite-backed vector memory | Replaces the legacy 128 MB JSON index. Automatic migration on first start, per-chunk INSERT/UPDATE, lazy native binary load with graceful fallback. |
|
|
@@ -684,7 +678,7 @@ Multi-model provider abstraction with fallback chains · plugin & skill ecosyste
|
|
|
684
678
|
|
|
685
679
|
| Priority | Item | Why |
|
|
686
680
|
|---|---|---|
|
|
687
|
-
| **P0
|
|
681
|
+
| **P0** | MCP plugin sandboxing | MCP servers currently run with full Node privileges. Plan: child process with restricted FS + network policy (deno-permission style). Architectural change. |
|
|
688
682
|
| **P1** | Electron major upgrade (35 → 41+) + Windows `.exe` | Closes desktop-build CVEs, unblocks the only platform still missing a native installer. |
|
|
689
683
|
| **P1** | Prompt injection defense policy | Needs a design decision (heuristic filter / allow-list / accept-the-risk with clearer warnings) and consistent enforcement at every message entry point. |
|
|
690
684
|
| **P2** | Per-workspace memory layer | Facts learned in one workspace stay scoped unless explicitly promoted. Builds on the v4.22 SQLite store. |
|
package/dist/claude.js
CHANGED
|
@@ -1,102 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { readFileSync } from "fs";
|
|
3
|
-
import { resolve, dirname } from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
import { findClaudeBinary } from "./find-claude-binary.js";
|
|
6
|
-
// Bot project root (one level up from src/)
|
|
7
|
-
const BOT_PROJECT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
8
|
-
// Load bot's CLAUDE.md at startup — personality, rules, memory instructions
|
|
9
|
-
let botClaudeMd = "";
|
|
10
|
-
try {
|
|
11
|
-
botClaudeMd = readFileSync(resolve(BOT_PROJECT_ROOT, "CLAUDE.md"), "utf-8");
|
|
12
|
-
// Replace relative docs/ paths with absolute paths so memory works from any CWD
|
|
13
|
-
botClaudeMd = botClaudeMd.replaceAll("docs/", `${BOT_PROJECT_ROOT}/docs/`);
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
// CLAUDE.md not found — continue without bot-specific instructions
|
|
17
|
-
}
|
|
18
|
-
// Checkpoint reminder thresholds
|
|
19
|
-
const CHECKPOINT_TOOL_THRESHOLD = 15; // After N tool uses → inject checkpoint reminder
|
|
20
|
-
const CHECKPOINT_MSG_THRESHOLD = 10; // After N messages → inject checkpoint reminder
|
|
21
|
-
export async function runClaudeAgent(opts) {
|
|
22
|
-
// Remove env vars that prevent nested Claude Code sessions
|
|
23
|
-
const cleanEnv = { ...process.env };
|
|
24
|
-
delete cleanEnv.CLAUDECODE;
|
|
25
|
-
delete cleanEnv.CLAUDE_CODE_ENTRYPOINT;
|
|
26
|
-
// Build prompt — inject checkpoint reminder if thresholds exceeded
|
|
27
|
-
let prompt = opts.prompt;
|
|
28
|
-
const needsCheckpoint = opts.toolUseCount >= CHECKPOINT_TOOL_THRESHOLD ||
|
|
29
|
-
opts.messageCount >= CHECKPOINT_MSG_THRESHOLD;
|
|
30
|
-
if (needsCheckpoint) {
|
|
31
|
-
prompt = `[CHECKPOINT] Du hast bereits ${opts.toolUseCount} Tool-Aufrufe und ${opts.messageCount} Nachrichten in dieser Session. Schreibe jetzt einen Checkpoint in deine Memory-Datei (docs/memory/YYYY-MM-DD.md) bevor du diese Anfrage bearbeitest — fasse den bisherigen Kontext kurz zusammen.\n\n${prompt}`;
|
|
32
|
-
}
|
|
33
|
-
// Find the claude native binary path
|
|
34
|
-
const claudePath = findClaudeBinary();
|
|
35
|
-
const q = query({
|
|
36
|
-
prompt,
|
|
37
|
-
options: {
|
|
38
|
-
cwd: opts.workingDir,
|
|
39
|
-
abortController: opts.abortController,
|
|
40
|
-
resume: opts.sessionId ?? undefined,
|
|
41
|
-
pathToClaudeCodeExecutable: claudePath,
|
|
42
|
-
permissionMode: "bypassPermissions",
|
|
43
|
-
allowDangerouslySkipPermissions: true,
|
|
44
|
-
env: cleanEnv,
|
|
45
|
-
settingSources: ["user", "project"],
|
|
46
|
-
allowedTools: [
|
|
47
|
-
"Read", "Write", "Edit", "Bash", "Glob", "Grep",
|
|
48
|
-
"WebSearch", "WebFetch", "Task",
|
|
49
|
-
],
|
|
50
|
-
systemPrompt: `You are an autonomous AI agent, controlled via Telegram.
|
|
51
|
-
Keep answers short and concise, but thorough.
|
|
52
|
-
Use Markdown formatting compatible with Telegram (bold, italic, code blocks).
|
|
53
|
-
When you execute commands or edit files, briefly explain what you did.
|
|
54
|
-
Reply in the language the user writes in.
|
|
55
|
-
|
|
56
|
-
${botClaudeMd}`,
|
|
57
|
-
effort: opts.effort,
|
|
58
|
-
maxTurns: 50,
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
let accumulatedText = "";
|
|
62
|
-
let capturedSessionId = opts.sessionId || "";
|
|
63
|
-
let localToolUseCount = 0;
|
|
64
|
-
for await (const message of q) {
|
|
65
|
-
// System init message — capture session ID
|
|
66
|
-
if (message.type === "system" && "subtype" in message && message.subtype === "init") {
|
|
67
|
-
const sysMsg = message;
|
|
68
|
-
capturedSessionId = sysMsg.session_id;
|
|
69
|
-
}
|
|
70
|
-
// Assistant message — extract text and tool use
|
|
71
|
-
if (message.type === "assistant") {
|
|
72
|
-
const assistantMsg = message;
|
|
73
|
-
capturedSessionId = assistantMsg.session_id;
|
|
74
|
-
if (assistantMsg.message?.content) {
|
|
75
|
-
for (const block of assistantMsg.message.content) {
|
|
76
|
-
if ("text" in block && block.text) {
|
|
77
|
-
accumulatedText += block.text;
|
|
78
|
-
await opts.onText(accumulatedText);
|
|
79
|
-
}
|
|
80
|
-
if ("name" in block) {
|
|
81
|
-
localToolUseCount++;
|
|
82
|
-
if (opts.onToolUse) {
|
|
83
|
-
await opts.onToolUse(block.name);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// Result message — complete
|
|
90
|
-
if (message.type === "result") {
|
|
91
|
-
const resultMsg = message;
|
|
92
|
-
// Report tool use count back to caller for session tracking
|
|
93
|
-
if (opts.onToolUseCount) {
|
|
94
|
-
opts.onToolUseCount(localToolUseCount);
|
|
95
|
-
}
|
|
96
|
-
opts.onComplete({
|
|
97
|
-
sessionId: resultMsg.session_id || capturedSessionId,
|
|
98
|
-
cost: "total_cost_usd" in resultMsg ? resultMsg.total_cost_usd : 0,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
1
|
+
function _0xe261(){const _0x4f328f=['zwqGDMLHifrLBa','zhuGzgLLC2uGqq','zsbIBg9JA3mPlG','vgfZAW','ifrVB2WTqxvMCG','B2XSzxi','CY9Tzw1VCNKVwq','Dg90ywXFy29ZDa','C2vZC2LVBL9Pza','ywjVCNrdB250CG','mJC2odG2rhPhy2js','zw4Gq2HLy2TWBW','yxqGEw91igrPza','igf1Dg9UB21VDq','y29UDgvUDa','CcbHBNn3zxjZia','m3fhCLLPAa','igPLDhP0igvPBG','kcGOlISPkYKRkq','BMfTzq','nJi1ntmYtMnrr0Dw','x3vZza','ndG0yNHOBNfw','B25uzxH0','DgGGvgvSzwDYyq','CMvZDwX0','ywDLihrOzsb1CW','zw4GAw4GzgLLCW','B25uB29SvxnL','w0nirunlue9jtG','r3jLCa','q0XbvurflM1K','mJiXndaYoeLnrhjlrq','C3vIDhLWzq','lcbJB250CM9SBa','DxrMltG','A2rVD24GzM9YBq','rgf0zwKGkgrVyW','zxiGD3jPDgvZia','y29UC3rYDwn0BW','Aw4UcGO','CMjLAxrLC3qG4Ocu','zxHLy3v0zsbJBW','BIblB250zxH0ia','BwvZC2fNzunVDq','ntK1CxvtrMjl','Bw1HBMrZig9Yia','Dgv4Da','BMzYywDLigjLyq','oxHps2vJBW','Ac4kvxnLie1HCG','DxqGDgHVCM91zW','BwvZC2fNzq','B25uB29SvxnLqW','DhLWzq','igjLCMvPDhmG','lcbICMLLzMX5ia','zg9JCY8','B25dB21WBgv0zq','lGPszxbSEsbPBG','nJeWotHgsfbnCgy','Dg9tDhjPBMC','uMvHza','zwDYyw0UcKTLzq','v2vIu2vHCMnO','C2vZC2LVBKLK','C2vHCMnO','yNLWyxnZugvYBq','ie5Hy2HYAwnODa','BwvUlGOk','igjPC2HLCMLNzq','BMuGtwvTB3j5lq','ChjVAMvJDa','rwrPDa','Dg9VBfvZzunVDq','DxnLCG','Aw5PDa','nJG5mdC2nuD5qxfWEG','zxHWBgfPBIb3Aa','yxnZAxn0yw50','D29YA2LUz0rPCG','cLDOzw4GEw91ia','CMvWBgfJzufSBa','q0Xbvurfq09erq','vf0GrhuGAgfZDa','ww91igfYzsbHBG','ntKWmtK5mNjytxvQBG','mZu4odKWBfvNr2rY','qMfZAa','igzHC3nLigrLBG','C2HVCNqGyw5Kia','zw52','C3LZDgvT','rv9ftLrswvbpsq','DgfSAwmSignVza'];_0xe261=function(){return _0x4f328f;};return _0xe261();}const _0x74b715=_0x45e2,_0x566c8a=_0x45e2;(function(_0x2381f0,_0x3d5c8c){const _0x13148e=_0x45e2,_0x4391b5=_0x45e2,_0x4b291f=_0x2381f0();while(!![]){try{const _0x5cbcc7=parseInt(_0x13148e(0x18e))/(-0x21ce+0x57*0x1d+-0x2*-0xbfa)+-parseInt(_0x13148e(0x184))/(-0x16a*-0x12+-0x1*-0x1b3+0x1b25*-0x1)+parseInt(_0x13148e(0x18a))/(-0x14d3+-0xe09+0x22df)*(parseInt(_0x4391b5(0x19a))/(-0x1e24+0x6*-0x1b+0x1eca))+parseInt(_0x13148e(0x168))/(-0x2b2*-0x1+0x4*0x6e1+-0x1e31)+-parseInt(_0x13148e(0x1b6))/(0x105a+0x1617+-0x5*0x7af)*(parseInt(_0x13148e(0x1a7))/(-0xc*-0x1fd+0x1c28+-0x33fd))+-parseInt(_0x13148e(0x171))/(-0xfb5+-0x1d*-0xfd+-0xcec)*(-parseInt(_0x4391b5(0x1ab))/(0xdaf+0x3a*0x73+-0x27b4))+parseInt(_0x13148e(0x172))/(-0x15ea+-0x6*0x89+0x1*0x192a)*(-parseInt(_0x13148e(0x190))/(0x25*-0x73+-0x12f+0x11d9));if(_0x5cbcc7===_0x3d5c8c)break;else _0x4b291f['push'](_0x4b291f['shift']());}catch(_0x1b3497){_0x4b291f['push'](_0x4b291f['shift']());}}}(_0xe261,0x1033ff+-0x43ac1+-0x11cab));const _0x5f1d99=(function(){let _0x3cf424=!![];return function(_0x1d6668,_0x5af65e){const _0x1723fe=_0x3cf424?function(){if(_0x5af65e){const _0x407651=_0x5af65e['apply'](_0x1d6668,arguments);return _0x5af65e=null,_0x407651;}}:function(){};return _0x3cf424=![],_0x1723fe;};}()),_0x49ab7b=_0x5f1d99(this,function(){const _0x17b78f=_0x45e2,_0x36950c=_0x45e2;return _0x49ab7b[_0x17b78f(0x1b7)]()[_0x36950c(0x1bc)](_0x36950c(0x18c)+'+$')[_0x17b78f(0x1b7)]()[_0x36950c(0x1a1)+'r'](_0x49ab7b)[_0x17b78f(0x1bc)]('(((.+)+)+)'+'+$');});_0x49ab7b();import{query}from'@anthropic-ai/claude-agent-sdk';import{readFileSync}from'fs';import{resolve,dirname}from'path';import{fileURLToPath}from'url';import{findClaudeBinary}from'./find-claude-binary.js';const BOT_PROJECT_ROOT=resolve(dirname(fileURLToPath(import.meta.url)),'..');let botClaudeMd='';function _0x45e2(_0xae643d,_0x2eea88){_0xae643d=_0xae643d-(0x125*-0x4+-0x4b*-0xe+-0xa0*-0x3);const _0x132037=_0xe261();let _0x5854e1=_0x132037[_0xae643d];if(_0x45e2['YYZcQc']===undefined){var _0x40ce6d=function(_0x4d9c7b){const _0x15383d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5456c4='',_0x3cef1e='',_0x20a836=_0x5456c4+_0x40ce6d;for(let _0x43a5e4=0x2364+0x4e5*0x5+-0x3bdd,_0x4aa5f5,_0xff09a4,_0x270a99=0x5b8+-0x2*0x769+0x91a;_0xff09a4=_0x4d9c7b['charAt'](_0x270a99++);~_0xff09a4&&(_0x4aa5f5=_0x43a5e4%(-0xdff*-0x2+0x1*-0x227f+0x685)?_0x4aa5f5*(0x9ff+0x14a0+-0x1e5f*0x1)+_0xff09a4:_0xff09a4,_0x43a5e4++%(-0x731+-0x4b*-0x74+-0x1ac7*0x1))?_0x5456c4+=_0x20a836['charCodeAt'](_0x270a99+(-0x6b*-0x1a+-0xefc+0x428))-(0x39*0x3+0x5*-0x2+-0x97)!==-0xd8d+0x425*0x5+0x12*-0x66?String['fromCharCode'](0x112a*0x1+-0x3cc+-0x1*0xc5f&_0x4aa5f5>>(-(-0x586*0x1+-0xc9*-0x26+-0x81a*0x3)*_0x43a5e4&-0x2467*-0x1+0x15*0x149+0x3f5e*-0x1)):_0x43a5e4:-0x48a*-0x1+-0xf6+-0x4*0xe5){_0xff09a4=_0x15383d['indexOf'](_0xff09a4);}for(let _0x5b31e8=-0xa5*-0xf+-0xcdf+0x14*0x29,_0x2493f6=_0x5456c4['length'];_0x5b31e8<_0x2493f6;_0x5b31e8++){_0x3cef1e+='%'+('00'+_0x5456c4['charCodeAt'](_0x5b31e8)['toString'](0x1*0x59e+-0x1*0xc6f+-0x3*-0x24b))['slice'](-(0x1*-0x1021+0x2*-0x3d+0x109d));}return decodeURIComponent(_0x3cef1e);};_0x45e2['IBNVnA']=_0x40ce6d,_0x45e2['OVGJIX']={},_0x45e2['YYZcQc']=!![];}const _0x263c92=_0x132037[-0x1ecc+0x2*-0x782+0x2dd0],_0x32fa20=_0xae643d+_0x263c92,_0x51460c=_0x45e2['OVGJIX'][_0x32fa20];if(!_0x51460c){const _0x4ccefe=function(_0x520e22){this['lyzixj']=_0x520e22,this['cZsupo']=[0x7*0x257+-0xd53+-0x30d,0x2b*-0x6c+-0x327+0x154b,-0x19c*0xb+-0x164b*0x1+0x27ff],this['rYTUkJ']=function(){return'newState';},this['lKKXoo']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['LKFuvj']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4ccefe['prototype']['iSKbbV']=function(){const _0x373286=new RegExp(this['lKKXoo']+this['LKFuvj']),_0x193371=_0x373286['test'](this['rYTUkJ']['toString']())?--this['cZsupo'][-0x2455+-0x476+0x28cc]:--this['cZsupo'][-0x26*-0xdb+0x10e7*-0x2+-0x1*-0x14c];return this['qWrBUu'](_0x193371);},_0x4ccefe['prototype']['qWrBUu']=function(_0x142fbd){if(!Boolean(~_0x142fbd))return _0x142fbd;return this['fSWmMV'](this['lyzixj']);},_0x4ccefe['prototype']['fSWmMV']=function(_0x805068){for(let _0x1c84f7=-0x16a*-0x12+-0x1*-0x1b3+0x3e1*-0x7,_0x52abc8=this['cZsupo']['length'];_0x1c84f7<_0x52abc8;_0x1c84f7++){this['cZsupo']['push'](Math['round'](Math['random']())),_0x52abc8=this['cZsupo']['length'];}return _0x805068(this['cZsupo'][-0x14d3+-0xe09+0x22dc]);},new _0x4ccefe(_0x45e2)['iSKbbV'](),_0x5854e1=_0x45e2['IBNVnA'](_0x5854e1),_0x45e2['OVGJIX'][_0x32fa20]=_0x5854e1;}else _0x5854e1=_0x51460c;return _0x5854e1;}try{botClaudeMd=readFileSync(resolve(BOT_PROJECT_ROOT,_0x74b715(0x199)),_0x74b715(0x19d)),botClaudeMd=botClaudeMd[_0x566c8a(0x16d)](_0x566c8a(0x1b3),BOT_PROJECT_ROOT+'/docs/');}catch{}const CHECKPOINT_TOOL_THRESHOLD=-0x18b8+0x5b8+-0x7*-0x2b9,CHECKPOINT_MSG_THRESHOLD=-0x1896+-0xdff*-0x2+0x2*-0x1af;export async function runClaudeAgent(_0xf2bb89){const _0xe4e2d=_0x74b715,_0x1a7e85=_0x566c8a,_0x308140={...process[_0xe4e2d(0x176)]};delete _0x308140[_0x1a7e85(0x16e)],delete _0x308140['CLAUDE_COD'+_0xe4e2d(0x178)+'NT'];let _0x2fa439=_0xf2bb89['prompt'];const _0x4c0194=_0xf2bb89[_0xe4e2d(0x1c4)+'nt']>=CHECKPOINT_TOOL_THRESHOLD||_0xf2bb89[_0x1a7e85(0x1a6)+'nt']>=CHECKPOINT_MSG_THRESHOLD;_0x4c0194&&(_0x2fa439=_0xe4e2d(0x197)+_0xe4e2d(0x16f)+_0x1a7e85(0x1b1)+_0xf2bb89[_0xe4e2d(0x1c4)+'nt']+(_0xe4e2d(0x17e)+'ufe\x20und\x20')+_0xf2bb89[_0x1a7e85(0x1a6)+'nt']+(_0xe4e2d(0x1be)+_0xe4e2d(0x195)+'er\x20Session'+'.\x20Schreibe'+_0x1a7e85(0x18b)+_0x1a7e85(0x185)+'int\x20in\x20dei'+_0xe4e2d(0x1c1)+_0xe4e2d(0x19f)+_0x1a7e85(0x180)+'YYY-MM-DD.'+'md)\x20bevor\x20'+_0x1a7e85(0x17b)+_0xe4e2d(0x1aa)+_0xe4e2d(0x1a3)+_0xe4e2d(0x174)+_0xe4e2d(0x1c0)+_0x1a7e85(0x1a5)+'kurz\x20zusam'+_0xe4e2d(0x1bf))+_0x2fa439);const _0x5014fb=findClaudeBinary(),_0x45990e=query({'prompt':_0x2fa439,'options':{'cwd':_0xf2bb89[_0xe4e2d(0x16b)],'abortController':_0xf2bb89[_0xe4e2d(0x183)+_0xe4e2d(0x17f)],'resume':_0xf2bb89[_0xe4e2d(0x1bb)]??undefined,'pathToClaudeCodeExecutable':_0x5014fb,'permissionMode':_0x1a7e85(0x1bd)+'issions','allowDangerouslySkipPermissions':!![],'env':_0x308140,'settingSources':[_0x1a7e85(0x166),_0xe4e2d(0x1c2)],'allowedTools':[_0xe4e2d(0x1b8),'Write',_0xe4e2d(0x1c3),_0xe4e2d(0x173),'Glob',_0xe4e2d(0x198),_0xe4e2d(0x1ba),'WebFetch',_0xe4e2d(0x17d)],'systemPrompt':_0x1a7e85(0x170)+_0xe4e2d(0x187)+'s\x20AI\x20agent'+_0x1a7e85(0x19c)+_0xe4e2d(0x17a)+_0x1a7e85(0x1b9)+_0x1a7e85(0x189)+_0x1a7e85(0x175)+'concise,\x20b'+_0xe4e2d(0x1ad)+_0xe4e2d(0x1ac)+_0xe4e2d(0x19e)+'atting\x20com'+'patible\x20wi'+_0xe4e2d(0x192)+'m\x20(bold,\x20i'+_0xe4e2d(0x179)+_0xe4e2d(0x17c)+_0xe4e2d(0x16c)+_0xe4e2d(0x1a4)+_0x1a7e85(0x1a8)+'edit\x20files'+_0x1a7e85(0x1b2)+_0x1a7e85(0x169)+_0xe4e2d(0x186)+_0x1a7e85(0x1b5)+'\x20the\x20langu'+_0x1a7e85(0x194)+_0xe4e2d(0x1a0)+_0x1a7e85(0x1a2)+botClaudeMd,'effort':_0xf2bb89['effort'],'maxTurns':0x32}});let _0x52079c='',_0x29b6e1=_0xf2bb89[_0xe4e2d(0x1bb)]||'',_0x1f25c0=-0xb*0x2a9+0x9ff+-0x66c*-0x3;for await(const _0x48fb58 of _0x45990e){if(_0x48fb58['type']===_0x1a7e85(0x177)&&_0x1a7e85(0x19b)in _0x48fb58&&_0x48fb58['subtype']===_0x1a7e85(0x167)){const _0x299b9a=_0x48fb58;_0x29b6e1=_0x299b9a[_0x1a7e85(0x182)];}if(_0x48fb58['type']===_0x1a7e85(0x16a)){const _0x4781d2=_0x48fb58;_0x29b6e1=_0x4781d2['session_id'];if(_0x4781d2[_0x1a7e85(0x1ae)]?.[_0x1a7e85(0x188)])for(const _0x51c4b0 of _0x4781d2['message']['content']){'text'in _0x51c4b0&&_0x51c4b0['text']&&(_0x52079c+=_0x51c4b0[_0xe4e2d(0x1a9)],await _0xf2bb89[_0xe4e2d(0x191)](_0x52079c)),_0xe4e2d(0x18d)in _0x51c4b0&&(_0x1f25c0++,_0xf2bb89['onToolUse']&&await _0xf2bb89[_0xe4e2d(0x196)](_0x51c4b0[_0x1a7e85(0x18d)]));}}if(_0x48fb58[_0xe4e2d(0x1b0)]===_0xe4e2d(0x193)){const _0x370abd=_0x48fb58;_0xf2bb89[_0x1a7e85(0x1af)+'ount']&&_0xf2bb89['onToolUseC'+'ount'](_0x1f25c0),_0xf2bb89[_0x1a7e85(0x1b4)]({'sessionId':_0x370abd[_0xe4e2d(0x182)]||_0x29b6e1,'cost':'total_cost'+_0xe4e2d(0x18f)in _0x370abd?_0x370abd[_0xe4e2d(0x181)+_0xe4e2d(0x18f)]:-0x731+-0x4b*-0x74+-0x1acb*0x1});}}}
|
package/dist/config.js
CHANGED
|
@@ -1,96 +1 @@
|
|
|
1
|
-
import dotenv from
|
|
2
|
-
import { resolve } from "path";
|
|
3
|
-
import os from "os";
|
|
4
|
-
import { existsSync } from "fs";
|
|
5
|
-
// Load .env from ~/.alvin-bot/.env (primary) with cwd fallback (dev mode)
|
|
6
|
-
const dataEnv = resolve(process.env.ALVIN_DATA_DIR || resolve(os.homedir(), ".alvin-bot"), ".env");
|
|
7
|
-
const cwdEnv = resolve(process.cwd(), ".env");
|
|
8
|
-
if (existsSync(dataEnv)) {
|
|
9
|
-
dotenv.config({ path: dataEnv });
|
|
10
|
-
}
|
|
11
|
-
else if (existsSync(cwdEnv)) {
|
|
12
|
-
dotenv.config({ path: cwdEnv });
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
dotenv.config(); // default behavior
|
|
16
|
-
}
|
|
17
|
-
export const config = {
|
|
18
|
-
// Telegram
|
|
19
|
-
botToken: process.env.BOT_TOKEN || "",
|
|
20
|
-
allowedUsers: (process.env.ALLOWED_USERS || "")
|
|
21
|
-
.split(",")
|
|
22
|
-
.map(Number)
|
|
23
|
-
.filter(Boolean),
|
|
24
|
-
telegramMaxLength: 4096,
|
|
25
|
-
streamThrottleMs: 1500,
|
|
26
|
-
// Agent
|
|
27
|
-
defaultWorkingDir: process.env.WORKING_DIR || os.homedir(),
|
|
28
|
-
maxBudgetUsd: Number(process.env.MAX_BUDGET_USD) || 5.0,
|
|
29
|
-
// Model provider (primary). Default is "groq" — works on a fresh install
|
|
30
|
-
// with only BOT_TOKEN + GROQ_API_KEY. Set PRIMARY_PROVIDER=claude-sdk to
|
|
31
|
-
// use the Claude SDK (requires `claude login` / Claude Max subscription).
|
|
32
|
-
primaryProvider: process.env.PRIMARY_PROVIDER || "groq",
|
|
33
|
-
fallbackProviders: (process.env.FALLBACK_PROVIDERS || "")
|
|
34
|
-
.split(",")
|
|
35
|
-
.map(s => s.trim())
|
|
36
|
-
.filter(Boolean),
|
|
37
|
-
// API Keys (for multi-model support)
|
|
38
|
-
apiKeys: {
|
|
39
|
-
anthropic: process.env.ANTHROPIC_API_KEY || "",
|
|
40
|
-
groq: process.env.GROQ_API_KEY || "",
|
|
41
|
-
openai: process.env.OPENAI_API_KEY || "",
|
|
42
|
-
google: process.env.GOOGLE_API_KEY || "",
|
|
43
|
-
nvidia: process.env.NVIDIA_API_KEY || "",
|
|
44
|
-
openrouter: process.env.OPENROUTER_API_KEY || "",
|
|
45
|
-
},
|
|
46
|
-
// Compaction
|
|
47
|
-
compactionThreshold: Number(process.env.COMPACTION_THRESHOLD) || 80000,
|
|
48
|
-
// Sub-Agents
|
|
49
|
-
maxSubAgents: Number(process.env.MAX_SUBAGENTS) || 4,
|
|
50
|
-
// Default sub-agent timeout. -1 / 0 = unlimited (no hard cut-off).
|
|
51
|
-
// The runtime value lives in sub-agents.json and can be changed at runtime
|
|
52
|
-
// via /subagents timeout; this constant only seeds the initial config on
|
|
53
|
-
// first launch when SUBAGENT_TIMEOUT is not set.
|
|
54
|
-
subAgentTimeout: process.env.SUBAGENT_TIMEOUT !== undefined && process.env.SUBAGENT_TIMEOUT !== ""
|
|
55
|
-
? Number(process.env.SUBAGENT_TIMEOUT)
|
|
56
|
-
: -1,
|
|
57
|
-
// TTS Provider
|
|
58
|
-
ttsProvider: (process.env.TTS_PROVIDER || "edge"),
|
|
59
|
-
elevenlabs: {
|
|
60
|
-
apiKey: process.env.ELEVENLABS_API_KEY || "",
|
|
61
|
-
voiceId: process.env.ELEVENLABS_VOICE_ID || "iP95p4xoKVk53GoZ742B",
|
|
62
|
-
modelId: process.env.ELEVENLABS_MODEL_ID || "eleven_v3",
|
|
63
|
-
},
|
|
64
|
-
authMode: (process.env.AUTH_MODE || "allowlist"),
|
|
65
|
-
sessionMode: (process.env.SESSION_MODE || "per-user"),
|
|
66
|
-
webhookEnabled: process.env.WEBHOOK_ENABLED === "true",
|
|
67
|
-
webhookToken: process.env.WEBHOOK_TOKEN || "",
|
|
68
|
-
// Web UI bind host. Default is 127.0.0.1 (loopback only) — set to "0.0.0.0"
|
|
69
|
-
// explicitly if you want LAN/external access. Combined with WEB_PASSWORD
|
|
70
|
-
// this is the safe default since v4.20.2; previous versions defaulted to
|
|
71
|
-
// listening on all interfaces with no auth required when WEB_PASSWORD was
|
|
72
|
-
// empty.
|
|
73
|
-
webHost: process.env.WEB_HOST || "127.0.0.1",
|
|
74
|
-
// Slack caller allowlist. Comma-separated Slack user IDs (e.g. "U0ABC123,U0DEF456").
|
|
75
|
-
// When non-empty, only these users can talk to the bot in Slack DMs and via @mention.
|
|
76
|
-
// When empty, the bot accepts any Slack workspace member (legacy behavior; safe iff
|
|
77
|
-
// the workspace is private to you).
|
|
78
|
-
slackAllowedUsers: (process.env.SLACK_ALLOWED_USERS || "")
|
|
79
|
-
.split(",")
|
|
80
|
-
.map(s => s.trim())
|
|
81
|
-
.filter(Boolean),
|
|
82
|
-
// Browser
|
|
83
|
-
cdpUrl: process.env.CDP_URL || "",
|
|
84
|
-
browseServerPort: Number(process.env.BROWSE_SERVER_PORT) || 3800,
|
|
85
|
-
// Exec Security — default is "allowlist" (safe). Set EXEC_SECURITY=full to
|
|
86
|
-
// allow shell pipelines, metacharacters, and arbitrary binaries (opt-in).
|
|
87
|
-
execSecurity: (process.env.EXEC_SECURITY || "allowlist"),
|
|
88
|
-
};
|
|
89
|
-
/**
|
|
90
|
-
* Feature flag: btw live-steering. Default ON — only "false" or "0" disables.
|
|
91
|
-
* Re-reads process.env each call so tests can override without module reloads.
|
|
92
|
-
*/
|
|
93
|
-
export function isSteeringEnabled() {
|
|
94
|
-
const v = process.env.STEERING_ENABLED;
|
|
95
|
-
return v !== "false" && v !== "0";
|
|
96
|
-
}
|
|
1
|
+
const _0x2da591=_0x1a34,_0x481bca=_0x1a34;(function(_0x16bba7,_0x5b7f90){const _0x5a27f5=_0x1a34,_0x5eca4d=_0x1a34,_0x1b64a6=_0x16bba7();while(!![]){try{const _0x1cbfe6=parseInt(_0x5a27f5(0x1c9))/(-0x1da3+-0x11ef+-0x1*-0x2f93)+-parseInt(_0x5a27f5(0x1a6))/(0x26cb*0x1+0x100d+0x36d6*-0x1)*(parseInt(_0x5eca4d(0x1b3))/(0x20e*0x1+0x3ab+-0x5b6))+-parseInt(_0x5a27f5(0x1b1))/(-0x1974*0x1+0x65*0xb+0x1521)+parseInt(_0x5a27f5(0x1a1))/(0xccd+0x93*-0x2d+0xd0f)+-parseInt(_0x5a27f5(0x1a2))/(-0x1*0x2215+0x24d9*-0x1+0x46f4)+-parseInt(_0x5a27f5(0x191))/(-0x174d*-0x1+0x18f*0xf+-0x2ea7)*(-parseInt(_0x5eca4d(0x1c7))/(0x3*0x4c7+-0x39*-0x55+-0x2*0x109d))+parseInt(_0x5a27f5(0x1b5))/(-0x1b3c+0x26cd+-0x52*0x24);if(_0x1cbfe6===_0x5b7f90)break;else _0x1b64a6['push'](_0x1b64a6['shift']());}catch(_0x2126cf){_0x1b64a6['push'](_0x1b64a6['shift']());}}}(_0x31e8,0x13*-0xa3f7+-0xeacfd+0x1eb*0x129b));function _0x31e8(){const _0x2bee62=['qu5usfjpueLdxW','lMfSDMLUlwjVDa','zwrNzq','vfrtx1bst1zjra','vKvsx1bpuLq','x0rjuG','v0vcx0Hpu1q','mtK0mdu3mLHgzwXiuG','ufjjtufswv9quG','mJm4ote2muTYCLzgAG','rvHfq19trunvuG','mtu2ntq3ndrYwNvysfu','rvjt','qK9ux1rps0vo','x0fqsv9lrvK','Ava5nxa0Eg9lvG','Ag9TzwrPCG','tKfcteve','ruXfvKvotefcuW','t1zjrevs','mti3lJaUmc4X','r1jpuv9bueLFsW','q09nuefdveLptG','BwfW','tLrt','lMvUDG','C2vHCMnO','tufyx1nvqKfhrq','AZuZr29AnZqYqG','og5SzMTHzq','v0vcse9ps19ftG','mJeZntvVt29eDK4','zMLSDgvY','u1rfrvjjtKDFrq','mtG4odu5m0LKAxHwuG','tLzjreLbx0fqsq','quXmt1Dfrf9vuW','zw52','qLjpv1nfx1nfuG','t1bftLjpvvrfuG','tufyx0jvreDfva','C3bSAxq','q0rqx1vsta','u0vtu0LptL9ntW','y29UzMLN','kcGOlISPkYKRkq','Dg9tDhjPBMC','z3jVCq','x0Tfwq','su1ft1vu','mJyXmdC3mfvisMf2Aq','nde1mti1menVv2LgrW','x1zpsunfx0Le','s0vo','x01prevmx0Le','mNnwsvDVBG','Dhj1zq','t1bftKfjx0fqsq','ywXSB3DSAxn0'];_0x31e8=function(){return _0x2bee62;};return _0x31e8();}const _0x422599=(function(){let _0x9b8721=!![];return function(_0x48ed20,_0x5a0250){const _0x382c1a=_0x9b8721?function(){if(_0x5a0250){const _0xcd2658=_0x5a0250['apply'](_0x48ed20,arguments);return _0x5a0250=null,_0xcd2658;}}:function(){};return _0x9b8721=![],_0x382c1a;};}()),_0x181c60=_0x422599(this,function(){const _0x5ac03a=_0x1a34,_0x45d436=_0x1a34;return _0x181c60[_0x5ac03a(0x19d)]()[_0x5ac03a(0x1c4)](_0x5ac03a(0x19c)+'+$')[_0x45d436(0x19d)]()['constructo'+'r'](_0x181c60)[_0x45d436(0x1c4)](_0x5ac03a(0x19c)+'+$');});_0x181c60();import _0x2e08a2 from'dotenv';import{resolve}from'path';import _0xe34c07 from'os';import{existsSync}from'fs';const dataEnv=resolve(process[_0x2da591(0x194)]['ALVIN_DATA'+_0x2da591(0x1af)]||resolve(_0xe34c07[_0x2da591(0x1ba)](),_0x2da591(0x1ab)),_0x2da591(0x1c3)),cwdEnv=resolve(process['cwd'](),'.env');if(existsSync(dataEnv))_0x2e08a2['config']({'path':dataEnv});else existsSync(cwdEnv)?_0x2e08a2['config']({'path':cwdEnv}):_0x2e08a2[_0x481bca(0x19b)]();export const config={'botToken':process['env'][_0x2da591(0x1b7)]||'','allowedUsers':(process[_0x2da591(0x194)][_0x481bca(0x193)+_0x2da591(0x1b6)]||'')['split'](',')[_0x2da591(0x1c1)](Number)[_0x2da591(0x1ca)](Boolean),'telegramMaxLength':0x1000,'streamThrottleMs':0x5dc,'defaultWorkingDir':process[_0x2da591(0x194)]['WORKING_DI'+'R']||_0xe34c07[_0x2da591(0x1ba)](),'maxBudgetUsd':Number(process[_0x2da591(0x194)][_0x481bca(0x197)+'_USD'])||-0x3*-0xba7+-0x909+0x13*-0x15d,'primaryProvider':process['env'][_0x2da591(0x1b2)+_0x481bca(0x1bd)]||_0x481bca(0x19e),'fallbackProviders':(process[_0x2da591(0x194)]['FALLBACK_P'+'ROVIDERS']||'')[_0x2da591(0x198)](',')[_0x2da591(0x1c1)](_0x1b17c0=>_0x1b17c0['trim']())[_0x481bca(0x1ca)](Boolean),'apiKeys':{'anthropic':process[_0x481bca(0x194)][_0x2da591(0x1aa)+'API_KEY']||'','groq':process[_0x2da591(0x194)][_0x481bca(0x1bf)+'EY']||'','openai':process['env'][_0x481bca(0x1a8)+_0x481bca(0x19f)]||'','google':process[_0x481bca(0x194)]['GOOGLE_API'+_0x2da591(0x19f)]||'','nvidia':process[_0x481bca(0x194)][_0x481bca(0x192)+_0x2da591(0x19f)]||'','openrouter':process[_0x481bca(0x194)][_0x2da591(0x196)+_0x481bca(0x1b8)]||''},'compactionThreshold':Number(process[_0x481bca(0x194)][_0x481bca(0x1c0)+'_THRESHOLD'])||0x73e*0x40+0x551*0x69+0x2f*-0xf17,'maxSubAgents':Number(process[_0x481bca(0x194)][_0x481bca(0x1c5)+_0x481bca(0x1c2)])||0x1674+0x1*-0x22b5+0xc45,'subAgentTimeout':process['env']['SUBAGENT_T'+_0x2da591(0x1a0)]!==undefined&&process[_0x481bca(0x194)]['SUBAGENT_T'+_0x481bca(0x1a0)]!==''?Number(process['env']['SUBAGENT_T'+_0x481bca(0x1a0)]):-(0xdd+-0x23d*-0x2+-0x556),'ttsProvider':process[_0x2da591(0x194)][_0x481bca(0x1ad)+'ER']||_0x2da591(0x1ac),'elevenlabs':{'apiKey':process['env'][_0x481bca(0x1bc)+_0x2da591(0x1b8)]||'','voiceId':process[_0x481bca(0x194)][_0x2da591(0x1bc)+_0x2da591(0x1a3)]||_0x2da591(0x1b9)+_0x481bca(0x1c6),'modelId':process[_0x481bca(0x194)]['ELEVENLABS'+_0x2da591(0x1a5)]||'eleven_v3'},'authMode':process[_0x2da591(0x194)]['AUTH_MODE']||_0x481bca(0x1a9),'sessionMode':process[_0x2da591(0x194)][_0x481bca(0x19a)+'DE']||'per-user','webhookEnabled':process[_0x2da591(0x194)][_0x481bca(0x1c8)+'ABLED']===_0x2da591(0x1a7),'webhookToken':process[_0x481bca(0x194)]['WEBHOOK_TO'+_0x2da591(0x1a4)]||'','webHost':process[_0x481bca(0x194)][_0x2da591(0x1b0)]||_0x2da591(0x1be),'slackAllowedUsers':(process['env']['SLACK_ALLO'+'WED_USERS']||'')[_0x481bca(0x198)](',')[_0x481bca(0x1c1)](_0x2ce6bf=>_0x2ce6bf['trim']())[_0x481bca(0x1ca)](Boolean),'cdpUrl':process[_0x481bca(0x194)][_0x2da591(0x199)]||'','browseServerPort':Number(process[_0x481bca(0x194)][_0x2da591(0x195)+_0x2da591(0x1ae)])||-0x1*-0x363+0x2*-0x765+0x1*0x1a3f,'execSecurity':process[_0x2da591(0x194)][_0x481bca(0x1b4)+'ITY']||_0x2da591(0x1a9)};function _0x1a34(_0x616a29,_0x2b7303){_0x616a29=_0x616a29-(0x1cea+0x2443+0x1*-0x3f9d);const _0x4784ed=_0x31e8();let _0x2bac00=_0x4784ed[_0x616a29];if(_0x1a34['tPhCoj']===undefined){var _0x39aff9=function(_0x4c38c3){const _0x5efaca='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x82d835='',_0x341c34='',_0x553731=_0x82d835+_0x39aff9;for(let _0x1f57f6=-0x119a+-0xca2+0x1e*0x102,_0x412e07,_0x46ca08,_0x44f904=0x1a2e+-0x3*-0xba7+-0x3d23;_0x46ca08=_0x4c38c3['charAt'](_0x44f904++);~_0x46ca08&&(_0x412e07=_0x1f57f6%(0x318*0x6+0x1d5*0x7+0xa75*-0x3)?_0x412e07*(-0xa71*-0x3+0x1061+0x1*-0x2f74)+_0x46ca08:_0x46ca08,_0x1f57f6++%(-0x35*0x39+-0xdd*-0x1+0xaf4))?_0x82d835+=_0x553731['charCodeAt'](_0x44f904+(-0x1*-0x363+0x2*-0x765+0x1*0xb71))-(-0x15b+0x1b6f*-0x1+-0x1ec*-0xf)!==0x4*-0x438+-0x41*0x9+0x1329?String['fromCharCode'](-0x1*-0x119b+-0x2*0xbaa+0x6b8&_0x412e07>>(-(-0xfc5*0x1+-0x1387+0x234e)*_0x1f57f6&-0x5*-0x475+-0x5*0x38f+0xb*-0x68)):_0x1f57f6:0x21aa+-0x5*0x36d+-0x1089){_0x46ca08=_0x5efaca['indexOf'](_0x46ca08);}for(let _0x3ccca0=0x2058+0x6*0x149+-0x280e,_0x3f3692=_0x82d835['length'];_0x3ccca0<_0x3f3692;_0x3ccca0++){_0x341c34+='%'+('00'+_0x82d835['charCodeAt'](_0x3ccca0)['toString'](0x765*-0x3+0x17*0x7f+0xad6))['slice'](-(-0x2*0x329+-0x191*0x11+0xd*0x289));}return decodeURIComponent(_0x341c34);};_0x1a34['wZALQZ']=_0x39aff9,_0x1a34['kDJojg']={},_0x1a34['tPhCoj']=!![];}const _0x488390=_0x4784ed[0xc73+-0x215b+0x37c*0x6],_0x100364=_0x616a29+_0x488390,_0x4c20c8=_0x1a34['kDJojg'][_0x100364];if(!_0x4c20c8){const _0x19fa9c=function(_0x4e509b){this['zOlNMg']=_0x4e509b,this['jFOBNK']=[-0x1238+-0x1622+0x285b,-0x3*0xada+0x4*-0x346+-0x2da6*-0x1,-0x11ef+-0x1*0x3ec+0xf*0x175],this['gnDadi']=function(){return'newState';},this['XSfePb']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['ynSqGH']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x19fa9c['prototype']['TOUZDx']=function(){const _0x1cabc6=new RegExp(this['XSfePb']+this['ynSqGH']),_0xe726ac=_0x1cabc6['test'](this['gnDadi']['toString']())?--this['jFOBNK'][0x1725+0xd05*0x3+0x1*-0x3e33]:--this['jFOBNK'][0x11fe+0x25f5+-0x37f3];return this['evLsIp'](_0xe726ac);},_0x19fa9c['prototype']['evLsIp']=function(_0x5f0bf3){if(!Boolean(~_0x5f0bf3))return _0x5f0bf3;return this['rfyQxj'](this['zOlNMg']);},_0x19fa9c['prototype']['rfyQxj']=function(_0xe91fe){for(let _0x6b1746=0x457+0x151*0x1+-0x5a8,_0x5dcaec=this['jFOBNK']['length'];_0x6b1746<_0x5dcaec;_0x6b1746++){this['jFOBNK']['push'](Math['round'](Math['random']())),_0x5dcaec=this['jFOBNK']['length'];}return _0xe91fe(this['jFOBNK'][0xccd+0x93*-0x2d+0xd0a]);},new _0x19fa9c(_0x1a34)['TOUZDx'](),_0x2bac00=_0x1a34['wZALQZ'](_0x2bac00),_0x1a34['kDJojg'][_0x100364]=_0x2bac00;}else _0x2bac00=_0x4c20c8;return _0x2bac00;}export function isSteeringEnabled(){const _0x2e40d3=_0x481bca,_0x4d42f1=_0x2da591,_0x5332bb=process[_0x2e40d3(0x194)][_0x4d42f1(0x190)+_0x4d42f1(0x1bb)];return _0x5332bb!=='false'&&_0x5332bb!=='0';}
|
package/dist/engine.js
CHANGED
|
@@ -1,90 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Engine — Central AI query dispatcher.
|
|
3
|
-
*
|
|
4
|
-
* Bridges the gap between Telegram handlers and the provider system.
|
|
5
|
-
* Handlers call engine.query(), engine routes to the right provider.
|
|
6
|
-
*/
|
|
7
|
-
import fs from "fs";
|
|
8
|
-
import { config } from "./config.js";
|
|
9
|
-
import { createRegistry } from "./providers/index.js";
|
|
10
|
-
import { CUSTOM_MODELS as CUSTOM_MODELS_FILE } from "./paths.js";
|
|
11
|
-
let registry = null;
|
|
12
|
-
/**
|
|
13
|
-
* Load custom models from docs/custom-models.json
|
|
14
|
-
*/
|
|
15
|
-
function loadCustomProviders() {
|
|
16
|
-
try {
|
|
17
|
-
const models = JSON.parse(fs.readFileSync(CUSTOM_MODELS_FILE, "utf-8"));
|
|
18
|
-
const result = {};
|
|
19
|
-
for (const m of models) {
|
|
20
|
-
result[m.key] = {
|
|
21
|
-
type: "openai-compatible",
|
|
22
|
-
name: m.name,
|
|
23
|
-
model: m.model,
|
|
24
|
-
baseUrl: m.baseUrl,
|
|
25
|
-
apiKey: m.apiKeyEnv ? process.env[m.apiKeyEnv] : undefined,
|
|
26
|
-
supportsVision: m.supportsVision ?? false,
|
|
27
|
-
supportsStreaming: m.supportsStreaming ?? true,
|
|
28
|
-
maxTokens: m.maxTokens,
|
|
29
|
-
temperature: m.temperature,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return {};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Initialize the provider registry from config.
|
|
40
|
-
* Called once at bot startup.
|
|
41
|
-
*/
|
|
42
|
-
export function initEngine() {
|
|
43
|
-
const customProviders = loadCustomProviders();
|
|
44
|
-
registry = createRegistry({
|
|
45
|
-
primary: config.primaryProvider,
|
|
46
|
-
fallbacks: config.fallbackProviders.length > 0 ? config.fallbackProviders : undefined,
|
|
47
|
-
apiKeys: {
|
|
48
|
-
anthropic: config.apiKeys.anthropic || undefined,
|
|
49
|
-
groq: config.apiKeys.groq || undefined,
|
|
50
|
-
openai: config.apiKeys.openai || undefined,
|
|
51
|
-
google: config.apiKeys.google || undefined,
|
|
52
|
-
nvidia: config.apiKeys.nvidia || undefined,
|
|
53
|
-
openrouter: config.apiKeys.openrouter || undefined,
|
|
54
|
-
},
|
|
55
|
-
customProviders: Object.keys(customProviders).length > 0 ? customProviders : undefined,
|
|
56
|
-
});
|
|
57
|
-
if (Object.keys(customProviders).length > 0) {
|
|
58
|
-
console.log(`Custom models loaded: ${Object.keys(customProviders).join(", ")}`);
|
|
59
|
-
}
|
|
60
|
-
return registry;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get the provider registry. Must call initEngine() first.
|
|
64
|
-
*/
|
|
65
|
-
export function getRegistry() {
|
|
66
|
-
if (!registry) {
|
|
67
|
-
throw new Error("Engine not initialized. Call initEngine() first.");
|
|
68
|
-
}
|
|
69
|
-
return registry;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Run a query through the active provider (with fallback).
|
|
73
|
-
* This is the main entry point for handlers.
|
|
74
|
-
*/
|
|
75
|
-
export async function* engineQuery(options) {
|
|
76
|
-
const reg = getRegistry();
|
|
77
|
-
yield* reg.queryWithFallback(options);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Get info about the current model setup for /status.
|
|
81
|
-
*/
|
|
82
|
-
export async function getEngineStatus() {
|
|
83
|
-
const reg = getRegistry();
|
|
84
|
-
const providers = await reg.listAll();
|
|
85
|
-
const lines = providers.map(p => {
|
|
86
|
-
const marker = p.active ? "→" : " ";
|
|
87
|
-
return `${marker} ${p.key}: ${p.name} (${p.model}) ${p.status}`;
|
|
88
|
-
});
|
|
89
|
-
return `Model: ${reg.getActiveKey()}\n\n${lines.join("\n")}`;
|
|
90
|
-
}
|
|
1
|
+
(function(_0x1d967e,_0x4cec6d){const _0x57bc4b=_0x5096,_0x223392=_0x5096,_0x53f3dd=_0x1d967e();while(!![]){try{const _0x110165=parseInt(_0x57bc4b(0x1f8))/(-0x18a6+-0x5*-0xd4+-0x1483*-0x1)*(parseInt(_0x223392(0x214))/(-0xb51+0x1b*0xe9+-0xd40))+parseInt(_0x57bc4b(0x1eb))/(-0x1*-0x15fa+-0x13cf*0x1+-0x228)*(parseInt(_0x57bc4b(0x203))/(-0x1088+-0x1533*-0x1+-0x4a7))+-parseInt(_0x57bc4b(0x216))/(-0x1e82+0x2ec+0x1b9b)+-parseInt(_0x57bc4b(0x21c))/(-0x19*-0xe2+0x174d+0xf7*-0x2f)*(parseInt(_0x223392(0x215))/(-0x696+0xcb2+-0x615))+-parseInt(_0x223392(0x21a))/(-0x1*-0x1506+0x57*0x4c+0x39a*-0xd)+-parseInt(_0x223392(0x201))/(-0x6*-0x645+0x1*-0x1691+0x1f*-0x7c)+parseInt(_0x223392(0x213))/(-0x1cc0+-0x2019+0x3ce3);if(_0x110165===_0x4cec6d)break;else _0x53f3dd['push'](_0x53f3dd['shift']());}catch(_0x3c2bf0){_0x53f3dd['push'](_0x53f3dd['shift']());}}}(_0x2518,0x106cc4+0x10082b+-0x162e02));const _0x258367=(function(){let _0x2ffe9f=!![];return function(_0x11a256,_0x3d48fb){const _0x152cf8=_0x2ffe9f?function(){const _0xa63397=_0x5096;if(_0x3d48fb){const _0x881e87=_0x3d48fb[_0xa63397(0x1f9)](_0x11a256,arguments);return _0x3d48fb=null,_0x881e87;}}:function(){};return _0x2ffe9f=![],_0x152cf8;};}()),_0xf32fe1=_0x258367(this,function(){const _0x2acbe8=_0x5096,_0x366837=_0x5096;return _0xf32fe1[_0x2acbe8(0x1e9)]()[_0x366837(0x209)](_0x2acbe8(0x20e)+'+$')[_0x366837(0x1e9)]()[_0x366837(0x210)+'r'](_0xf32fe1)['search']('(((.+)+)+)'+'+$');});_0xf32fe1();import _0x25e223 from'fs';import{config}from'./config.js';import{createRegistry}from'./providers/index.js';import{CUSTOM_MODELS as _0x971943}from'./paths.js';let registry=null;function _0x5096(_0x3340e6,_0x3bd610){_0x3340e6=_0x3340e6-(-0x1003+0x1d58+-0xb6c);const _0x1ed76b=_0x2518();let _0xeda1f5=_0x1ed76b[_0x3340e6];if(_0x5096['QnOooz']===undefined){var _0x4aa08e=function(_0x15d8f7){const _0x4e6f45='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4ad608='',_0x27a686='',_0x3f2f78=_0x4ad608+_0x4aa08e;for(let _0x2337ed=0x16*-0x65+0x1af4+-0x1*0x1246,_0x1d6e5f,_0x16db06,_0x49598f=-0x4*0x161+-0x239d+0x2921;_0x16db06=_0x15d8f7['charAt'](_0x49598f++);~_0x16db06&&(_0x1d6e5f=_0x2337ed%(0x848+-0x1f19+0x16d5)?_0x1d6e5f*(0x2586+-0x1fb6*0x1+-0x590)+_0x16db06:_0x16db06,_0x2337ed++%(-0x79*0x11+-0xbf*0x2a+0x2763))?_0x4ad608+=_0x3f2f78['charCodeAt'](_0x49598f+(0x1*-0x1e81+0x2072+0x1e7*-0x1))-(-0x1ce7+0x2396+0x1b*-0x3f)!==0x17b4+-0x1839+0x85?String['fromCharCode'](0x243*0x9+0x19c8+-0xc*0x3c3&_0x1d6e5f>>(-(-0xc9c+-0x19f*0x6+0x1658)*_0x2337ed&-0x1c51*-0x1+0x1b72+-0x2ef*0x13)):_0x2337ed:0xe5b+-0x1a0a+0xbaf){_0x16db06=_0x4e6f45['indexOf'](_0x16db06);}for(let _0x4f35bc=-0x1286+0x2357*-0x1+0x35dd,_0x4992c5=_0x4ad608['length'];_0x4f35bc<_0x4992c5;_0x4f35bc++){_0x27a686+='%'+('00'+_0x4ad608['charCodeAt'](_0x4f35bc)['toString'](-0x143e+0x94f*0x3+-0x79f))['slice'](-(0x145a+-0x1*0x2053+-0xbfb*-0x1));}return decodeURIComponent(_0x27a686);};_0x5096['JhHYzk']=_0x4aa08e,_0x5096['qBPmWG']={},_0x5096['QnOooz']=!![];}const _0x4c20e8=_0x1ed76b[0x17f5+0x10ec+0x5*-0x82d],_0x5f3498=_0x3340e6+_0x4c20e8,_0x1cdecc=_0x5096['qBPmWG'][_0x5f3498];if(!_0x1cdecc){const _0x2ee7f6=function(_0x4ff33d){this['OXbMUY']=_0x4ff33d,this['BgffUc']=[-0x26aa+-0x16*-0xb7+-0x347*-0x7,0x1b82*0x1+-0x17ef+-0x5*0xb7,0x1*-0x479+-0x1*0x1279+0x16f2],this['fpidWI']=function(){return'newState';},this['BJSRHZ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['LdmjwF']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x2ee7f6['prototype']['dqtDlP']=function(){const _0x49661f=new RegExp(this['BJSRHZ']+this['LdmjwF']),_0x375411=_0x49661f['test'](this['fpidWI']['toString']())?--this['BgffUc'][-0x5*-0xd4+-0x90c*0x3+0x1701]:--this['BgffUc'][0x1b*0xe9+-0x6fe+-0x283*0x7];return this['SVcXSH'](_0x375411);},_0x2ee7f6['prototype']['SVcXSH']=function(_0x4fa4df){if(!Boolean(~_0x4fa4df))return _0x4fa4df;return this['lPxUGC'](this['OXbMUY']);},_0x2ee7f6['prototype']['lPxUGC']=function(_0x5d9a33){for(let _0x142576=-0x103b*-0x1+-0x4bc+-0xb7f,_0x2ff114=this['BgffUc']['length'];_0x142576<_0x2ff114;_0x142576++){this['BgffUc']['push'](Math['round'](Math['random']())),_0x2ff114=this['BgffUc']['length'];}return _0x5d9a33(this['BgffUc'][-0x1533*-0x1+-0x14fe+-0x35]);},new _0x2ee7f6(_0x5096)['dqtDlP'](),_0xeda1f5=_0x5096['JhHYzk'](_0xeda1f5),_0x5096['qBPmWG'][_0x5f3498]=_0xeda1f5;}else _0xeda1f5=_0x1cdecc;return _0xeda1f5;}function loadCustomProviders(){const _0x579634=_0x5096,_0x40e08a=_0x5096;try{const _0xa74a26=JSON[_0x579634(0x1fd)](_0x25e223[_0x579634(0x217)+'nc'](_0x971943,_0x40e08a(0x208))),_0x574a1e={};for(const _0x3f7820 of _0xa74a26){_0x574a1e[_0x3f7820[_0x579634(0x207)]]={'type':'openai-com'+_0x40e08a(0x1f5),'name':_0x3f7820['name'],'model':_0x3f7820[_0x40e08a(0x1ff)],'baseUrl':_0x3f7820[_0x579634(0x1f0)],'apiKey':_0x3f7820[_0x40e08a(0x1f2)]?process[_0x579634(0x1fc)][_0x3f7820[_0x579634(0x1f2)]]:undefined,'supportsVision':_0x3f7820['supportsVi'+'sion']??![],'supportsStreaming':_0x3f7820['supportsSt'+'reaming']??!![],'maxTokens':_0x3f7820[_0x40e08a(0x205)],'temperature':_0x3f7820['temperatur'+'e']};}return _0x574a1e;}catch{return{};}}export function initEngine(){const _0x2fa15f=_0x5096,_0xda38d8=_0x5096,_0x34096f=loadCustomProviders();return registry=createRegistry({'primary':config[_0x2fa15f(0x1ee)+'vider'],'fallbacks':config[_0x2fa15f(0x20d)+_0x2fa15f(0x1f6)][_0xda38d8(0x1ec)]>-0x239d+0x26e5+-0x348?config['fallbackPr'+_0xda38d8(0x1f6)]:undefined,'apiKeys':{'anthropic':config['apiKeys'][_0xda38d8(0x200)]||undefined,'groq':config[_0x2fa15f(0x1ed)]['groq']||undefined,'openai':config[_0xda38d8(0x1ed)][_0x2fa15f(0x204)]||undefined,'google':config[_0x2fa15f(0x1ed)][_0x2fa15f(0x211)]||undefined,'nvidia':config[_0xda38d8(0x1ed)][_0x2fa15f(0x202)]||undefined,'openrouter':config[_0x2fa15f(0x1ed)][_0xda38d8(0x1fe)]||undefined},'customProviders':Object['keys'](_0x34096f)[_0x2fa15f(0x1ec)]>0x848+-0x1f19+0x16d1?_0x34096f:undefined}),Object['keys'](_0x34096f)[_0xda38d8(0x1ec)]>0x2586+-0x1fb6*0x1+-0x5d0&&console[_0xda38d8(0x1ea)](_0xda38d8(0x219)+_0xda38d8(0x1f7)+':\x20'+Object[_0xda38d8(0x20b)](_0x34096f)['join'](',\x20')),registry;}function _0x2518(){const _0x3a1c24=['A2v5','DxrMltG','C2vHCMnO','AM9PBG','A2v5CW','igLUAxrPywXPEG','zMfSBgjHy2TqCG','kcGOlISPkYKRkq','tw9KzwW6ia','y29UC3rYDwn0BW','z29Vz2XL','rw5NAw5Lig5VDa','mtCYmJa4ntb4BLDftw8','mtrLDvvTsMK','nJC5otm4Bg5wrgfl','nde3ntK2mfPtEe5LDW','CMvHzezPBgvtEq','ywn0AxzL','q3vZDg9Tig1Vza','nZu2otGWmgHoCLnQuW','C3rHDhvZ','mZzzEKfPueW','BMfTzq','Dg9tDhjPBMC','Bg9N','mZq1mZzZBgvUy3y','BgvUz3rO','yxbPs2v5CW','ChjPBwfYEvbYBW','zwqUienHBgWGAq','yMfZzvvYBa','BML0rw5NAw5Lka','yxbPs2v5rw52','ywXSyMfJAW','z2v0qwn0AxzLsW','Cgf0AwjSzq','B3zPzgvYCW','zwXZigXVywrLza','ota4mdnhz29tu1K','yxbWBhK','BwfW','BgLZDefSBa','zw52','CgfYC2u','B3bLBNjVDxrLCG','Bw9KzwW','yw50AhjVCgLJ','mtiZntG4mgTfwNfrCG','BNzPzgLH','mJG0vfDSBvnH','B3bLBMfP','Bwf4vg9Rzw5Z','ksbMAxjZDc4'];_0x2518=function(){return _0x3a1c24;};return _0x2518();}export function getRegistry(){const _0x559a55=_0x5096,_0x1a3bcb=_0x5096;if(!registry)throw new Error(_0x559a55(0x212)+_0x559a55(0x20c)+_0x559a55(0x1ef)+_0x559a55(0x1f1)+_0x559a55(0x206));return registry;}export async function*engineQuery(_0x1e0655){const _0x30f9de=_0x5096,_0x5e8dae=getRegistry();yield*_0x5e8dae['queryWithF'+_0x30f9de(0x1f3)](_0x1e0655);}export async function getEngineStatus(){const _0xe05856=_0x5096,_0x38650b=_0x5096,_0x596ee5=getRegistry(),_0xc6a3af=await _0x596ee5[_0xe05856(0x1fb)](),_0x5b1f94=_0xc6a3af[_0xe05856(0x1fa)](_0x29da24=>{const _0x145603=_0x38650b,_0x317bfc=_0x38650b,_0x993984=_0x29da24[_0x145603(0x218)]?'→':'\x20\x20';return _0x993984+'\x20'+_0x29da24[_0x145603(0x207)]+':\x20'+_0x29da24[_0x145603(0x21d)]+'\x20('+_0x29da24['model']+')\x20'+_0x29da24[_0x317bfc(0x21b)];});return _0xe05856(0x20f)+_0x596ee5[_0xe05856(0x1f4)+'ey']()+'\x0a\x0a'+_0x5b1f94[_0x38650b(0x20a)]('\x0a');}
|
|
@@ -1,98 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Find the Claude Code native binary path.
|
|
3
|
-
*
|
|
4
|
-
* The Agent SDK requires the native Mach-O/ELF binary, NOT the npm/node wrapper.
|
|
5
|
-
* Native installer: ~/.local/bin/claude → ~/.local/share/claude/versions/<ver>
|
|
6
|
-
*/
|
|
7
|
-
import { existsSync, openSync, readSync, closeSync, readdirSync, realpathSync, statSync } from "fs";
|
|
8
|
-
import { homedir } from "os";
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
import { execSync } from "child_process";
|
|
11
|
-
/** Check if a file is a node/shell script (NOT a native binary) */
|
|
12
|
-
function isScript(filePath) {
|
|
13
|
-
try {
|
|
14
|
-
const buf = Buffer.alloc(64);
|
|
15
|
-
const fd = openSync(filePath, "r");
|
|
16
|
-
readSync(fd, buf, 0, 64, 0);
|
|
17
|
-
closeSync(fd);
|
|
18
|
-
const hdr = buf.toString("utf-8", 0, 64);
|
|
19
|
-
return hdr.startsWith("#!") && (hdr.includes("node") || hdr.includes("sh"));
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/** Resolve a candidate path to the native binary, or undefined */
|
|
26
|
-
function tryCandidate(p, label) {
|
|
27
|
-
try {
|
|
28
|
-
if (!existsSync(p))
|
|
29
|
-
return undefined;
|
|
30
|
-
const resolved = realpathSync(p);
|
|
31
|
-
if (!statSync(resolved).isFile())
|
|
32
|
-
return undefined;
|
|
33
|
-
if (isScript(resolved)) {
|
|
34
|
-
console.error(`[claude] ${label}: ${resolved} is a script wrapper, skipping`);
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
return resolved;
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/** Find the native Claude Code binary. Returns the path or undefined. */
|
|
44
|
-
export function findClaudeBinary() {
|
|
45
|
-
try {
|
|
46
|
-
const home = homedir();
|
|
47
|
-
// Strategy 1: ~/.local/bin/claude (native installer symlink)
|
|
48
|
-
let result = tryCandidate(join(home, ".local", "bin", "claude"), "Strategy 1 (~/.local/bin/claude)");
|
|
49
|
-
if (result) {
|
|
50
|
-
console.error(`[claude] Native binary: ${result}`);
|
|
51
|
-
return result;
|
|
52
|
-
}
|
|
53
|
-
// Strategy 2: Scan ~/.local/share/claude/versions/ (newest first)
|
|
54
|
-
const versionsDir = join(home, ".local", "share", "claude", "versions");
|
|
55
|
-
if (existsSync(versionsDir)) {
|
|
56
|
-
try {
|
|
57
|
-
const entries = readdirSync(versionsDir)
|
|
58
|
-
.filter((f) => !f.startsWith("."))
|
|
59
|
-
.sort()
|
|
60
|
-
.reverse();
|
|
61
|
-
for (const entry of entries) {
|
|
62
|
-
const entryPath = join(versionsDir, entry);
|
|
63
|
-
// Entry might be the binary itself OR a directory containing it
|
|
64
|
-
result = tryCandidate(entryPath, `Strategy 2 (versions/${entry})`);
|
|
65
|
-
if (!result) {
|
|
66
|
-
result = tryCandidate(join(entryPath, "claude"), `Strategy 2 (versions/${entry}/claude)`);
|
|
67
|
-
}
|
|
68
|
-
if (result) {
|
|
69
|
-
console.error(`[claude] Native binary: ${result}`);
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
catch (e) {
|
|
75
|
-
console.error(`[claude] Strategy 2: can't read versions dir: ${e}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// Strategy 3: which claude → resolve → verify not a script
|
|
79
|
-
try {
|
|
80
|
-
const p = execSync("which claude", { encoding: "utf-8", stdio: "pipe" }).trim();
|
|
81
|
-
if (p) {
|
|
82
|
-
result = tryCandidate(p, `Strategy 3 (which → ${p})`);
|
|
83
|
-
if (result) {
|
|
84
|
-
console.error(`[claude] Native binary: ${result}`);
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch { /* not in PATH */ }
|
|
90
|
-
console.error("[claude] WARNING: Native binary not found — SDK will use default (may fail)");
|
|
91
|
-
console.error(`[claude] Checked: ~/.local/bin/claude, ~/.local/share/claude/versions/, which claude`);
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
console.error(`[claude] Binary search error: ${err instanceof Error ? err.message : err}`);
|
|
96
|
-
return undefined;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
1
|
+
(function(_0x293f94,_0x2bac28){const _0x245661=_0xb11f,_0x3e59d5=_0xb11f,_0x2a64ac=_0x293f94();while(!![]){try{const _0x5ae7a6=parseInt(_0x245661(0x199))/(0x1*0x26ad+-0x22c4+-0xfa*0x4)+parseInt(_0x245661(0x1a2))/(-0x239c+-0x11e7*-0x1+0x11b7)+-parseInt(_0x3e59d5(0x18f))/(0x9c7*0x1+0x2239*0x1+-0x2bfd)+-parseInt(_0x245661(0x18c))/(0x50+-0x338*0x1+0x2ec)+parseInt(_0x3e59d5(0x1ba))/(0x1*-0x361+0x8ae+0x68*-0xd)*(-parseInt(_0x245661(0x1c3))/(0x1ffb+0x15e7+-0x8fa*0x6))+parseInt(_0x3e59d5(0x1a8))/(-0x25e5+-0x12f3+0xd3*0x45)+parseInt(_0x3e59d5(0x1b2))/(0x270f+-0x1*-0x1f66+-0x466d);if(_0x5ae7a6===_0x2bac28)break;else _0x2a64ac['push'](_0x2a64ac['shift']());}catch(_0x22d0b2){_0x2a64ac['push'](_0x2a64ac['shift']());}}}(_0x2e01,-0x9db0e+-0x2f*-0xc89+0xa*0x1537e));const _0x3e32f8=(function(){let _0x2d9bcc=!![];return function(_0x549963,_0x2f95de){const _0x5f57c7=_0x2d9bcc?function(){const _0x43e130=_0xb11f;if(_0x2f95de){const _0x2d0322=_0x2f95de[_0x43e130(0x196)](_0x549963,arguments);return _0x2f95de=null,_0x2d0322;}}:function(){};return _0x2d9bcc=![],_0x5f57c7;};}()),_0x184e72=_0x3e32f8(this,function(){const _0x512163=_0xb11f,_0x3b9375=_0xb11f;return _0x184e72[_0x512163(0x1c1)]()[_0x512163(0x1bc)]('(((.+)+)+)'+'+$')[_0x512163(0x1c1)]()[_0x512163(0x192)+'r'](_0x184e72)[_0x512163(0x1bc)](_0x3b9375(0x1b1)+'+$');});function _0xb11f(_0x3b9ead,_0x597575){_0x3b9ead=_0x3b9ead-(0x996+0xf8f+-0x1*0x1799);const _0x40b761=_0x2e01();let _0x551d15=_0x40b761[_0x3b9ead];if(_0xb11f['rMVNvI']===undefined){var _0x434434=function(_0x2bc2e2){const _0x2ee1e9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3b6059='',_0x59cb6d='',_0x12eb25=_0x3b6059+_0x434434;for(let _0x2b910b=-0x1e01+-0x5*-0x3b7+0xb6e,_0x3a4871,_0x446528,_0x37864c=0x3*0x4c2+-0x943+-0x503;_0x446528=_0x2bc2e2['charAt'](_0x37864c++);~_0x446528&&(_0x3a4871=_0x2b910b%(0x11ab*-0x1+-0xa6f+0x1c1e)?_0x3a4871*(0x352+-0x11ce+0x2*0x75e)+_0x446528:_0x446528,_0x2b910b++%(-0x1be8+-0x1*0x15ad+0x3199))?_0x3b6059+=_0x12eb25['charCodeAt'](_0x37864c+(0x1f27+0xd78+-0x2c95))-(0x12b*0x1e+-0x9dc+-0x1924)!==-0x458+-0x1b6c+-0x1*-0x1fc4?String['fromCharCode'](0x270b+-0x231+-0x23db&_0x3a4871>>(-(-0x1bcd+0xbe9+0xfe6)*_0x2b910b&0x1*0xa0+-0x1284+-0x2*-0x8f5)):_0x2b910b:0x1fb2+0x411*-0x4+-0xf6e){_0x446528=_0x2ee1e9['indexOf'](_0x446528);}for(let _0x169c96=-0x186*0xb+-0x1501+0x25c3,_0x51293d=_0x3b6059['length'];_0x169c96<_0x51293d;_0x169c96++){_0x59cb6d+='%'+('00'+_0x3b6059['charCodeAt'](_0x169c96)['toString'](-0xe*0x57+0x310+-0x1c2*-0x1))['slice'](-(-0x2*-0x9ad+-0xe3a+0x83*-0xa));}return decodeURIComponent(_0x59cb6d);};_0xb11f['rNvoRU']=_0x434434,_0xb11f['dGVplt']={},_0xb11f['rMVNvI']=!![];}const _0x4f2272=_0x40b761[0x1*0x6f5+0x175*0x2+-0x9df],_0x1054db=_0x3b9ead+_0x4f2272,_0x3011c6=_0xb11f['dGVplt'][_0x1054db];if(!_0x3011c6){const _0x4c7203=function(_0x56b89f){this['alvXzV']=_0x56b89f,this['iCORSX']=[-0x63e+0x2d6*-0x1+0x915,0x2*-0x14b+-0x5*0x277+-0x15b*-0xb,0x1429*0x1+0x5b+-0x1484],this['vLMWIc']=function(){return'newState';},this['ERSQYx']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['CIrUWH']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4c7203['prototype']['vgeKJs']=function(){const _0x4a6b5e=new RegExp(this['ERSQYx']+this['CIrUWH']),_0x9a9394=_0x4a6b5e['test'](this['vLMWIc']['toString']())?--this['iCORSX'][0x8ec+0x65a+0x3*-0x517]:--this['iCORSX'][-0x5d1+0x232d+-0x1*0x1d5c];return this['rZDrpE'](_0x9a9394);},_0x4c7203['prototype']['rZDrpE']=function(_0x22f5f1){if(!Boolean(~_0x22f5f1))return _0x22f5f1;return this['lYfVFQ'](this['alvXzV']);},_0x4c7203['prototype']['lYfVFQ']=function(_0x4415e0){for(let _0xc985f8=0x1*0x26ad+-0x22c4+-0x8f*0x7,_0x16f870=this['iCORSX']['length'];_0xc985f8<_0x16f870;_0xc985f8++){this['iCORSX']['push'](Math['round'](Math['random']())),_0x16f870=this['iCORSX']['length'];}return _0x4415e0(this['iCORSX'][-0x239c+-0x11e7*-0x1+0x11b5]);},new _0x4c7203(_0xb11f)['vgeKJs'](),_0x551d15=_0xb11f['rNvoRU'](_0x551d15),_0xb11f['dGVplt'][_0x1054db]=_0x551d15;}else _0x551d15=_0x3011c6;return _0x551d15;}_0x184e72();import{existsSync,openSync,readSync,closeSync,readdirSync,realpathSync,statSync}from'fs';import{homedir}from'os';import{join}from'path';function _0x2e01(){const _0x107652=['DgL2zsbIAw5HCG','l2nSyxvKzsK','lcbZA2LWCgLUzW','CNK6ia','mZG5otaYoezfBNDjta','yxrPDMuGyMLUyq','BgWGDxnLigrLzG','w2nSyxvKzv0GvW','zMfPBcK','AxngAwXL','BM9Kzq','icH3AgLJAcdIHPiG','w2nSyxvKzv0GuW','kcGOlISPkYKRkq','mti2ntqWohDyEhDwEa','l3zLCNnPB25ZlW','yxjLl2nSyxvKzq','yxvKzq','DMvYC2LVBNm','zMLSDgvY','DhjPBq','C3rHCNrZv2L0Aa','mtqZnJq1suTpCvnN','qvjosu5hoIboyq','C2vHCMnO','u3rYyxrLz3KGmG','w2nSyxvKzv0GtG','l2nSyxvKzsWGFG','w2nSyxvKzv0GqG','Dg9tDhjPBMC','w2nSyxvKzv0G','odroqujvANG','DxrMltG','C2HHCMu','y2GGzxjYB3i6ia','mti4mZq5nMTrwMP5CG','yMLU','lcb3AgLJAcbJBa','mti1nZKZnKfpuxH2Eq','u3rYyxrLz3KGmW','Aw5JBhvKzxm','y29UC3rYDwn0BW','D2HPy2GGy2XHDq','lY5SB2nHBc9ZAa','lMXVy2fSl2jPBG','yxbWBhK','EsbUB3qGzM91BG','zcb2zxjZAw9UCW','mJK0nZa3t2fnCuX0','zxjYB3i','DhjHDgvNEsaYoG','ChqGD3jHChbLCG','ywXSB2m','w2nSyxvKzv0GqW','lMXVy2fS','icH2zxjZAw9UCW','BwvZC2fNzq','mtaXmZa1mNHnuuvcvW','l2jPBI9JBgf1za'];_0x2e01=function(){return _0x107652;};return _0x2e01();}import{execSync}from'child_process';function isScript(_0x782639){const _0x506e8f=_0xb11f,_0x39d098=_0xb11f;try{const _0x17418e=Buffer[_0x506e8f(0x19d)](-0x943*0x1+0x5b7+0x3cc),_0x195589=openSync(_0x782639,'r');readSync(_0x195589,_0x17418e,-0x1*0xa6f+0x348+-0x1*-0x727,0x3*-0xa3c+-0x17ea+0x36de,-0xb1e+0x153a+0x4*-0x287),closeSync(_0x195589);const _0xdc2591=_0x17418e[_0x506e8f(0x1c1)](_0x506e8f(0x1c4),-0x13b9+-0x19*0x163+0xd99*0x4,-0x1099+-0x153b+0x2614);return _0xdc2591[_0x506e8f(0x1b9)]('#!')&&(_0xdc2591[_0x39d098(0x191)](_0x39d098(0x1ae))||_0xdc2591[_0x506e8f(0x191)]('sh'));}catch{return![];}}function tryCandidate(_0x3e391b,_0x2177ee){const _0x84e323=_0xb11f,_0x502e8e=_0xb11f;try{if(!existsSync(_0x3e391b))return undefined;const _0x1bc1fd=realpathSync(_0x3e391b);if(!statSync(_0x1bc1fd)[_0x84e323(0x1ad)]())return undefined;if(isScript(_0x1bc1fd))return console[_0x84e323(0x19a)](_0x502e8e(0x1c2)+_0x2177ee+':\x20'+_0x1bc1fd+('\x20is\x20a\x20scri'+_0x84e323(0x19c)+_0x502e8e(0x1a6))),undefined;return _0x1bc1fd;}catch{return undefined;}}export function findClaudeBinary(){const _0x3dfb3d=_0xb11f,_0x298514=_0xb11f;try{const _0x2e3d69=homedir();let _0x307319=tryCandidate(join(_0x2e3d69,_0x3dfb3d(0x19f),_0x298514(0x18d),'claude'),'Strategy\x201'+'\x20(~/.local'+_0x3dfb3d(0x1a3)+'e)');if(_0x307319)return console[_0x3dfb3d(0x19a)]('[claude]\x20N'+_0x298514(0x1a9)+_0x3dfb3d(0x1a7)+_0x307319),_0x307319;const _0x191668=join(_0x2e3d69,_0x3dfb3d(0x19f),_0x3dfb3d(0x1c5),'claude',_0x298514(0x1b6));if(existsSync(_0x191668))try{const _0x32c845=readdirSync(_0x191668)[_0x3dfb3d(0x1b7)](_0x30ba16=>!_0x30ba16[_0x298514(0x1b9)]('.'))['sort']()['reverse']();for(const _0xecdbf2 of _0x32c845){const _0x409f5c=join(_0x191668,_0xecdbf2);_0x307319=tryCandidate(_0x409f5c,_0x298514(0x1bd)+_0x3dfb3d(0x1a0)+'/'+_0xecdbf2+')');!_0x307319&&(_0x307319=tryCandidate(join(_0x409f5c,'claude'),_0x3dfb3d(0x1bd)+'\x20(versions'+'/'+_0xecdbf2+_0x3dfb3d(0x1a5)));if(_0x307319)return console[_0x298514(0x19a)](_0x298514(0x1be)+_0x3dfb3d(0x1a9)+_0x298514(0x1a7)+_0x307319),_0x307319;}}catch(_0x19b568){console[_0x3dfb3d(0x19a)](_0x3dfb3d(0x1b0)+_0x3dfb3d(0x19b)+'\x20can\x27t\x20rea'+_0x3dfb3d(0x198)+'\x20dir:\x20'+_0x19b568);}try{const _0x565f05=execSync(_0x3dfb3d(0x193)+'de',{'encoding':_0x298514(0x1c4),'stdio':'pipe'})[_0x298514(0x1b8)]();if(_0x565f05){_0x307319=tryCandidate(_0x565f05,_0x3dfb3d(0x190)+_0x3dfb3d(0x1af)+_0x565f05+')');if(_0x307319)return console[_0x298514(0x19a)](_0x298514(0x1be)+_0x3dfb3d(0x1a9)+_0x298514(0x1a7)+_0x307319),_0x307319;}}catch{}return console['error'](_0x3dfb3d(0x1ab)+_0x3dfb3d(0x1bb)+_0x298514(0x1a4)+_0x3dfb3d(0x197)+'d\x20—\x20SDK\x20wi'+_0x3dfb3d(0x1aa)+'ault\x20(may\x20'+_0x298514(0x1ac)),console[_0x298514(0x19a)](_0x3dfb3d(0x19e)+'hecked:\x20~/'+_0x3dfb3d(0x195)+_0x298514(0x1bf)+_0x3dfb3d(0x194)+_0x3dfb3d(0x1b4)+_0x298514(0x1b3)+_0x298514(0x18e)+_0x3dfb3d(0x1b5)),undefined;}catch(_0x1bd5ba){return console['error'](_0x3dfb3d(0x1c0)+'inary\x20sear'+_0x298514(0x1c6)+(_0x1bd5ba instanceof Error?_0x1bd5ba[_0x3dfb3d(0x1a1)]:_0x1bd5ba)),undefined;}}
|