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,203 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disk Cleanup Service — periodic cleanup of transient bot files.
|
|
3
|
-
*
|
|
4
|
-
* Targets files that are SAFE to delete (logs, temp screenshots, browser
|
|
5
|
-
* artifacts, old subagent streams) and leaves critical data alone
|
|
6
|
-
* (memory, assets, workspaces, cron-jobs, .env, session-store).
|
|
7
|
-
*
|
|
8
|
-
* Strategy:
|
|
9
|
-
* - Each path has a max age (days) OR a max size (MB, with rotation)
|
|
10
|
-
* - Defaults are conservative: keep 30 days of artifacts, rotate logs >100MB
|
|
11
|
-
* - All knobs overridable via env (CLEANUP_* vars) and via /cleanup set <key>
|
|
12
|
-
* - Runs once at boot + every 24h thereafter, unref'd so it doesn't
|
|
13
|
-
* prevent shutdown
|
|
14
|
-
*
|
|
15
|
-
* NEVER cleaned:
|
|
16
|
-
* ~/.alvin-bot/memory/ (daily logs, long-term memory)
|
|
17
|
-
* ~/.alvin-bot/assets/ (user-supplied files)
|
|
18
|
-
* ~/.alvin-bot/workspaces/ (user configuration)
|
|
19
|
-
* ~/.alvin-bot/cron-jobs.json (scheduled tasks)
|
|
20
|
-
* ~/.alvin-bot/.env (secrets)
|
|
21
|
-
* ~/.alvin-bot/session-store.json (resume tokens)
|
|
22
|
-
* ~/.alvin-bot/delivery-queue.json
|
|
23
|
-
* ~/.alvin-bot/standing-orders
|
|
24
|
-
* ~/.alvin-bot/auto-update.flag
|
|
25
|
-
*/
|
|
26
|
-
import fs from "fs";
|
|
27
|
-
import path from "path";
|
|
28
|
-
import os from "os";
|
|
29
|
-
import { DATA_DIR } from "../paths.js";
|
|
30
|
-
const DEFAULT_POLICY = {
|
|
31
|
-
logMaxSizeMb: parseInt(process.env.CLEANUP_LOG_MAX_MB || "100", 10),
|
|
32
|
-
screenshotsMaxAgeDays: parseInt(process.env.CLEANUP_SCREENSHOTS_DAYS || "30", 10),
|
|
33
|
-
subagentsMaxAgeDays: parseInt(process.env.CLEANUP_SUBAGENTS_DAYS || "30", 10),
|
|
34
|
-
tmpMaxAgeDays: parseInt(process.env.CLEANUP_TMP_DAYS || "7", 10),
|
|
35
|
-
waMediaMaxAgeDays: parseInt(process.env.CLEANUP_WA_MEDIA_DAYS || "30", 10),
|
|
36
|
-
};
|
|
37
|
-
const CLEANUP_INTERVAL_MS = 24 * 60 * 60 * 1000; // once a day
|
|
38
|
-
let cleanupTimer = null;
|
|
39
|
-
/**
|
|
40
|
-
* Return the current effective policy (env-overridden defaults).
|
|
41
|
-
*/
|
|
42
|
-
export function getCleanupPolicy() {
|
|
43
|
-
return { ...DEFAULT_POLICY };
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Run a cleanup pass once. Safe to call manually (e.g. /cleanup command).
|
|
47
|
-
*/
|
|
48
|
-
export async function runCleanup(policyOverride) {
|
|
49
|
-
const policy = { ...DEFAULT_POLICY, ...policyOverride };
|
|
50
|
-
const result = {
|
|
51
|
-
filesDeleted: 0,
|
|
52
|
-
bytesReclaimed: 0,
|
|
53
|
-
logsRotated: 0,
|
|
54
|
-
errors: [],
|
|
55
|
-
details: [],
|
|
56
|
-
};
|
|
57
|
-
// 1. Rotate large log files (launchd stdout/stderr)
|
|
58
|
-
if (policy.logMaxSizeMb > 0) {
|
|
59
|
-
const logsDir = path.join(DATA_DIR, "logs");
|
|
60
|
-
try {
|
|
61
|
-
if (fs.existsSync(logsDir)) {
|
|
62
|
-
for (const name of fs.readdirSync(logsDir)) {
|
|
63
|
-
if (!name.endsWith(".log"))
|
|
64
|
-
continue;
|
|
65
|
-
const full = path.join(logsDir, name);
|
|
66
|
-
try {
|
|
67
|
-
const st = fs.statSync(full);
|
|
68
|
-
if (st.size > policy.logMaxSizeMb * 1024 * 1024) {
|
|
69
|
-
// Rotate: keep a .old, overwrite current. Launchd will reopen on next write.
|
|
70
|
-
const oldPath = full + ".old";
|
|
71
|
-
try {
|
|
72
|
-
fs.rmSync(oldPath, { force: true });
|
|
73
|
-
}
|
|
74
|
-
catch { }
|
|
75
|
-
fs.renameSync(full, oldPath);
|
|
76
|
-
fs.writeFileSync(full, "");
|
|
77
|
-
result.logsRotated++;
|
|
78
|
-
result.bytesReclaimed += st.size;
|
|
79
|
-
result.details.push({ path: full, action: "rotated", size: st.size });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
result.errors.push(`log-rotate ${full}: ${err.message}`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
result.errors.push(`logs scan: ${err.message}`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// 2. Browser screenshots (bot-owned CDP)
|
|
93
|
-
if (policy.screenshotsMaxAgeDays > 0) {
|
|
94
|
-
const dir = path.join(DATA_DIR, "browser", "screenshots");
|
|
95
|
-
cleanupOldFiles(dir, policy.screenshotsMaxAgeDays, result);
|
|
96
|
-
}
|
|
97
|
-
// 3. Subagent streaming outputs — only delete FINISHED ones (older than N days).
|
|
98
|
-
// We trust that the async-agent-watcher has already marked them done — files
|
|
99
|
-
// older than a few days are either delivered or definitively abandoned.
|
|
100
|
-
if (policy.subagentsMaxAgeDays > 0) {
|
|
101
|
-
const dir = path.join(DATA_DIR, "subagents");
|
|
102
|
-
cleanupOldFiles(dir, policy.subagentsMaxAgeDays, result, [".jsonl", ".err"]);
|
|
103
|
-
}
|
|
104
|
-
// 4. /tmp/alvin-bot/* (media, temp scrapes)
|
|
105
|
-
if (policy.tmpMaxAgeDays > 0) {
|
|
106
|
-
cleanupOldFiles("/tmp/alvin-bot", policy.tmpMaxAgeDays, result);
|
|
107
|
-
}
|
|
108
|
-
// 5. WhatsApp media cache
|
|
109
|
-
if (policy.waMediaMaxAgeDays > 0) {
|
|
110
|
-
const dir = path.join(DATA_DIR, "data", "wa-media");
|
|
111
|
-
cleanupOldFiles(dir, policy.waMediaMaxAgeDays, result);
|
|
112
|
-
}
|
|
113
|
-
// 6. CDP log (/tmp/chrome-cdp.log) — always keep just the latest boot
|
|
114
|
-
const cdpLog = path.join(os.tmpdir(), "chrome-cdp.log");
|
|
115
|
-
try {
|
|
116
|
-
if (fs.existsSync(cdpLog)) {
|
|
117
|
-
const st = fs.statSync(cdpLog);
|
|
118
|
-
const ageDays = (Date.now() - st.mtimeMs) / (24 * 60 * 60 * 1000);
|
|
119
|
-
if (ageDays > 7) {
|
|
120
|
-
fs.unlinkSync(cdpLog);
|
|
121
|
-
result.filesDeleted++;
|
|
122
|
-
result.bytesReclaimed += st.size;
|
|
123
|
-
result.details.push({ path: cdpLog, action: "deleted", size: st.size });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
// Not critical
|
|
129
|
-
}
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Delete files in `dir` older than `maxAgeDays`. Safe if `dir` doesn't exist.
|
|
134
|
-
* Optional extension filter — e.g. [".jsonl", ".err"] restricts to those types.
|
|
135
|
-
*/
|
|
136
|
-
function cleanupOldFiles(dir, maxAgeDays, result, extensions) {
|
|
137
|
-
if (!fs.existsSync(dir))
|
|
138
|
-
return;
|
|
139
|
-
const cutoffMs = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
|
|
140
|
-
try {
|
|
141
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
142
|
-
const full = path.join(dir, entry.name);
|
|
143
|
-
if (!entry.isFile())
|
|
144
|
-
continue;
|
|
145
|
-
if (extensions && !extensions.some((ext) => entry.name.endsWith(ext)))
|
|
146
|
-
continue;
|
|
147
|
-
try {
|
|
148
|
-
const st = fs.statSync(full);
|
|
149
|
-
if (st.mtimeMs < cutoffMs) {
|
|
150
|
-
fs.unlinkSync(full);
|
|
151
|
-
result.filesDeleted++;
|
|
152
|
-
result.bytesReclaimed += st.size;
|
|
153
|
-
result.details.push({ path: full, action: "deleted", size: st.size });
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
result.errors.push(`${full}: ${err.message}`);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
result.errors.push(`scan ${dir}: ${err.message}`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Start the periodic cleanup loop. Runs first pass after 5 minutes (let the
|
|
167
|
-
* bot fully boot and avoid competing with startup I/O), then every 24h.
|
|
168
|
-
*/
|
|
169
|
-
export function startCleanupLoop() {
|
|
170
|
-
if (cleanupTimer)
|
|
171
|
-
return;
|
|
172
|
-
// First run delayed so we don't step on a restart that's still writing logs
|
|
173
|
-
setTimeout(() => {
|
|
174
|
-
void runCleanup().then((r) => {
|
|
175
|
-
if (r.filesDeleted > 0 || r.logsRotated > 0) {
|
|
176
|
-
console.log(`[cleanup] ${r.filesDeleted} files deleted, ${r.logsRotated} logs rotated, ${formatBytes(r.bytesReclaimed)} reclaimed`);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}, 5 * 60 * 1000);
|
|
180
|
-
cleanupTimer = setInterval(() => {
|
|
181
|
-
void runCleanup().then((r) => {
|
|
182
|
-
if (r.filesDeleted > 0 || r.logsRotated > 0) {
|
|
183
|
-
console.log(`[cleanup] ${r.filesDeleted} files deleted, ${r.logsRotated} logs rotated, ${formatBytes(r.bytesReclaimed)} reclaimed`);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}, CLEANUP_INTERVAL_MS);
|
|
187
|
-
cleanupTimer.unref?.();
|
|
188
|
-
}
|
|
189
|
-
export function stopCleanupLoop() {
|
|
190
|
-
if (cleanupTimer) {
|
|
191
|
-
clearInterval(cleanupTimer);
|
|
192
|
-
cleanupTimer = null;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
function formatBytes(n) {
|
|
196
|
-
if (n < 1024)
|
|
197
|
-
return `${n} B`;
|
|
198
|
-
if (n < 1024 * 1024)
|
|
199
|
-
return `${(n / 1024).toFixed(1)} KB`;
|
|
200
|
-
if (n < 1024 * 1024 * 1024)
|
|
201
|
-
return `${(n / 1024 / 1024).toFixed(1)} MB`;
|
|
202
|
-
return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
|
|
203
|
-
}
|
|
1
|
+
const _0x331d03=_0x1c27,_0x9b5785=_0x1c27;(function(_0x2541a8,_0x373e3c){const _0x1144e9=_0x1c27,_0x517754=_0x1c27,_0x48807=_0x2541a8();while(!![]){try{const _0x51f117=-parseInt(_0x1144e9(0x104))/(0x102f+-0x1*-0x1f4b+-0x2f79)*(-parseInt(_0x517754(0xfb))/(0x1*0x1655+0x25eb+-0x1e1f*0x2))+parseInt(_0x517754(0x12f))/(0x21a1+0x1d8f*-0x1+-0x1*0x40f)*(-parseInt(_0x517754(0x12a))/(0xf2*0x4+-0xb*-0x33d+-0x3*0xd21))+-parseInt(_0x1144e9(0x115))/(-0x5*-0xc4+-0xcd8+0x909)+-parseInt(_0x517754(0x11e))/(0x1903+0x13be+-0x2cbb)+-parseInt(_0x1144e9(0x112))/(-0x8e7*0x3+0x859+0x1263)+-parseInt(_0x517754(0x10e))/(-0x9c4+-0x42b+0xdf7)*(parseInt(_0x517754(0x139))/(0x2*0xab5+-0x1b29+0x4*0x172))+parseInt(_0x517754(0x121))/(0x1c76+0x1*0xa81+-0x1*0x26ed);if(_0x51f117===_0x373e3c)break;else _0x48807['push'](_0x48807['shift']());}catch(_0x142105){_0x48807['push'](_0x48807['shift']());}}}(_0x2475,0x8*-0x1015b+-0xbb75e+-0x7066*-0x49));const _0x462985=(function(){let _0x1e5696=!![];return function(_0x25f278,_0x3105f8){const _0x465a04=_0x1e5696?function(){const _0x195040=_0x1c27;if(_0x3105f8){const _0x4b0c08=_0x3105f8[_0x195040(0x119)](_0x25f278,arguments);return _0x3105f8=null,_0x4b0c08;}}:function(){};return _0x1e5696=![],_0x465a04;};}()),_0x1a9313=_0x462985(this,function(){const _0x4226cf=_0x1c27,_0x578940=_0x1c27;return _0x1a9313[_0x4226cf(0x120)]()[_0x578940(0x11d)](_0x4226cf(0x11c)+'+$')[_0x4226cf(0x120)]()['constructo'+'r'](_0x1a9313)['search'](_0x578940(0x11c)+'+$');});_0x1a9313();import _0x3fa65d from'fs';import _0x2e8f41 from'path';import _0x5d6701 from'os';import{DATA_DIR}from'../paths.js';const DEFAULT_POLICY={'logMaxSizeMb':parseInt(process[_0x331d03(0x128)]['CLEANUP_LO'+_0x9b5785(0x124)]||'100',-0xbd4+-0x1aa1+0x267f),'screenshotsMaxAgeDays':parseInt(process[_0x331d03(0x128)]['CLEANUP_SC'+_0x331d03(0x117)+_0x9b5785(0x110)]||'30',0x351+-0x1fd*-0xf+-0x211a),'subagentsMaxAgeDays':parseInt(process['env'][_0x9b5785(0xff)+'BAGENTS_DA'+'YS']||'30',0x1ae+0x2*-0xe9b+0x1b92),'tmpMaxAgeDays':parseInt(process[_0x331d03(0x128)][_0x9b5785(0x103)+_0x331d03(0x13b)]||'7',0x7f5+-0x2*-0x515+-0x1*0x1215),'waMediaMaxAgeDays':parseInt(process[_0x331d03(0x128)][_0x9b5785(0x113)+'_MEDIA_DAY'+'S']||'30',-0x2682+-0xc88*0x1+0x3314)},CLEANUP_INTERVAL_MS=(0x9*0x28d+0x7*0x43a+-0x3473)*(-0x8a7+0x2c*0xb+0x6ff)*(0x26f*0x6+-0xb9*0xb+-0x66b)*(-0xd52+0x20*0x25+0xc9a);let cleanupTimer=null;export function getCleanupPolicy(){return{...DEFAULT_POLICY};}export async function runCleanup(_0x554a0e){const _0x5f40ea=_0x331d03,_0x1d49c4=_0x331d03,_0x20d912={...DEFAULT_POLICY,..._0x554a0e},_0x1f9d69={'filesDeleted':0x0,'bytesReclaimed':0x0,'logsRotated':0x0,'errors':[],'details':[]};if(_0x20d912[_0x5f40ea(0x11f)+'Mb']>0xfca*-0x2+-0xdf0*0x2+0x3b74){const _0xe1f296=_0x2e8f41[_0x1d49c4(0x142)](DATA_DIR,'logs');try{if(_0x3fa65d[_0x5f40ea(0x107)](_0xe1f296))for(const _0x4be62b of _0x3fa65d['readdirSyn'+'c'](_0xe1f296)){if(!_0x4be62b[_0x1d49c4(0xf9)](_0x1d49c4(0x101)))continue;const _0x3a7066=_0x2e8f41[_0x5f40ea(0x142)](_0xe1f296,_0x4be62b);try{const _0x23ef8c=_0x3fa65d[_0x5f40ea(0x130)](_0x3a7066);if(_0x23ef8c['size']>_0x20d912[_0x1d49c4(0x11f)+'Mb']*(-0x1*-0x5f3+0x10fa+0x64f*-0x3)*(0x26f*0x9+0x187c+-0x2a63)){const _0x167ad6=_0x3a7066+_0x1d49c4(0x102);try{_0x3fa65d['rmSync'](_0x167ad6,{'force':!![]});}catch{}_0x3fa65d[_0x1d49c4(0x109)](_0x3a7066,_0x167ad6),_0x3fa65d[_0x5f40ea(0x118)+_0x1d49c4(0x10c)](_0x3a7066,''),_0x1f9d69['logsRotate'+'d']++,_0x1f9d69['bytesRecla'+'imed']+=_0x23ef8c[_0x5f40ea(0x140)],_0x1f9d69[_0x5f40ea(0x131)]['push']({'path':_0x3a7066,'action':_0x1d49c4(0xf7),'size':_0x23ef8c[_0x1d49c4(0x140)]});}}catch(_0x9ad64b){_0x1f9d69[_0x5f40ea(0x132)]['push'](_0x1d49c4(0x129)+'\x20'+_0x3a7066+':\x20'+_0x9ad64b['message']);}}}catch(_0x1f4624){_0x1f9d69[_0x1d49c4(0x132)]['push'](_0x1d49c4(0xfd)+'\x20'+_0x1f4624[_0x5f40ea(0xf8)]);}}if(_0x20d912['screenshot'+_0x1d49c4(0x135)+'s']>-0x15ea+0x1fc5+-0x9db){const _0x54bdb3=_0x2e8f41[_0x5f40ea(0x142)](DATA_DIR,_0x1d49c4(0x126),'screenshot'+'s');cleanupOldFiles(_0x54bdb3,_0x20d912[_0x1d49c4(0x10a)+_0x5f40ea(0x135)+'s'],_0x1f9d69);}if(_0x20d912[_0x5f40ea(0x100)+_0x1d49c4(0x125)]>0x6*0x2b8+-0x17*0x139+0xbcf){const _0x518800=_0x2e8f41[_0x1d49c4(0x142)](DATA_DIR,_0x1d49c4(0x138));cleanupOldFiles(_0x518800,_0x20d912['subagentsM'+_0x1d49c4(0x125)],_0x1f9d69,[_0x5f40ea(0x13a),_0x1d49c4(0x11a)]);}_0x20d912[_0x1d49c4(0x141)+_0x5f40ea(0x13c)]>-0xb04+-0x6ca*0x1+0x11ce&&cleanupOldFiles('/tmp/alvin'+'-bot',_0x20d912[_0x5f40ea(0x141)+_0x5f40ea(0x13c)],_0x1f9d69);if(_0x20d912[_0x1d49c4(0x114)+'AgeDays']>0xb*0x2dd+0xab9+-0x2a38){const _0x3c1d42=_0x2e8f41['join'](DATA_DIR,'data','wa-media');cleanupOldFiles(_0x3c1d42,_0x20d912[_0x1d49c4(0x114)+_0x1d49c4(0x123)],_0x1f9d69);}const _0x5e57d0=_0x2e8f41[_0x5f40ea(0x142)](_0x5d6701['tmpdir'](),'chrome-cdp'+_0x5f40ea(0x101));try{if(_0x3fa65d[_0x1d49c4(0x107)](_0x5e57d0)){const _0x3385a2=_0x3fa65d[_0x1d49c4(0x130)](_0x5e57d0),_0x30c44b=(Date[_0x5f40ea(0x12e)]()-_0x3385a2[_0x1d49c4(0x12b)])/((-0x25fc+0x204e+0x1*0x5c6)*(0x4*-0x4ea+0x132a+0xba)*(0x1ea7+-0x14d*-0x19+-0x3ef0)*(0x3e6+-0x83*0x3f+0x203f));_0x30c44b>-0x13bf+-0x1afb+-0x2ec1*-0x1&&(_0x3fa65d['unlinkSync'](_0x5e57d0),_0x1f9d69[_0x5f40ea(0x143)+'ed']++,_0x1f9d69[_0x1d49c4(0x13f)+_0x1d49c4(0x11b)]+=_0x3385a2[_0x1d49c4(0x140)],_0x1f9d69[_0x1d49c4(0x131)][_0x1d49c4(0x137)]({'path':_0x5e57d0,'action':'deleted','size':_0x3385a2[_0x1d49c4(0x140)]}));}}catch{}return _0x1f9d69;}function cleanupOldFiles(_0xa21d17,_0x27e642,_0x53ece2,_0x12a278){const _0x203e24=_0x331d03,_0x139bb2=_0x9b5785;if(!_0x3fa65d[_0x203e24(0x107)](_0xa21d17))return;const _0x455d0b=Date[_0x203e24(0x12e)]()-_0x27e642*(0x1*0xb95+0xb2e+-0x16ab)*(-0x97*-0x3b+0x11b8+-0x3449)*(0x6*0x3a0+-0x9c0+0xfb*-0xc)*(-0x3*0x26e+-0x23*-0x61+-0x211);try{for(const _0x869f00 of _0x3fa65d[_0x203e24(0x134)+'c'](_0xa21d17,{'withFileTypes':!![]})){const _0x43e67e=_0x2e8f41['join'](_0xa21d17,_0x869f00[_0x203e24(0x10f)]);if(!_0x869f00[_0x203e24(0x13d)]())continue;if(_0x12a278&&!_0x12a278[_0x139bb2(0xfa)](_0x2e5d84=>_0x869f00[_0x139bb2(0x10f)][_0x203e24(0xf9)](_0x2e5d84)))continue;try{const _0x272fff=_0x3fa65d[_0x203e24(0x130)](_0x43e67e);_0x272fff['mtimeMs']<_0x455d0b&&(_0x3fa65d[_0x203e24(0xfc)](_0x43e67e),_0x53ece2[_0x203e24(0x143)+'ed']++,_0x53ece2[_0x203e24(0x13f)+'imed']+=_0x272fff[_0x139bb2(0x140)],_0x53ece2[_0x139bb2(0x131)][_0x203e24(0x137)]({'path':_0x43e67e,'action':_0x139bb2(0x133),'size':_0x272fff[_0x203e24(0x140)]}));}catch(_0x170515){_0x53ece2[_0x203e24(0x132)]['push'](_0x43e67e+':\x20'+_0x170515[_0x203e24(0xf8)]);}}}catch(_0x4ae74a){_0x53ece2[_0x203e24(0x132)][_0x203e24(0x137)](_0x203e24(0x13e)+_0xa21d17+':\x20'+_0x4ae74a[_0x203e24(0xf8)]);}}export function startCleanupLoop(){const _0x5c7039=_0x331d03;if(cleanupTimer)return;setTimeout(()=>{void runCleanup()['then'](_0x2130a2=>{const _0x862420=_0x1c27,_0x1ee914=_0x1c27;(_0x2130a2[_0x862420(0x143)+'ed']>-0x6*0x546+0x2251+-0x2ad||_0x2130a2[_0x862420(0xfe)+'d']>0x260d+-0x840+0x1*-0x1dcd)&&console[_0x1ee914(0x12d)](_0x862420(0x136)+_0x2130a2[_0x1ee914(0x143)+'ed']+(_0x862420(0x10b)+_0x862420(0x122))+_0x2130a2[_0x862420(0xfe)+'d']+(_0x1ee914(0x106)+_0x1ee914(0x105))+formatBytes(_0x2130a2['bytesRecla'+_0x1ee914(0x11b)])+_0x1ee914(0x108));});},(0x8ad*0x2+0x1266+-0x23bb)*(0x2*-0x20+0x1*-0xe2a+-0x32*-0x4b)*(-0x1982+-0x1*-0xfd6+0x6ca*0x2)),cleanupTimer=setInterval(()=>{const _0x571c33=_0x1c27;void runCleanup()[_0x571c33(0x12c)](_0x451f16=>{const _0x334cb1=_0x571c33,_0x485b84=_0x571c33;(_0x451f16['filesDelet'+'ed']>-0x103f+-0x1765+0x27a4||_0x451f16[_0x334cb1(0xfe)+'d']>-0xf78+0x203+0xd75)&&console[_0x334cb1(0x12d)](_0x334cb1(0x136)+_0x451f16[_0x334cb1(0x143)+'ed']+(_0x485b84(0x10b)+'eted,\x20')+_0x451f16[_0x485b84(0xfe)+'d']+(_0x485b84(0x106)+_0x334cb1(0x105))+formatBytes(_0x451f16['bytesRecla'+'imed'])+_0x485b84(0x108));});},CLEANUP_INTERVAL_MS),cleanupTimer[_0x5c7039(0x127)]?.();}export function stopCleanupLoop(){cleanupTimer&&(clearInterval(cleanupTimer),cleanupTimer=null);}function formatBytes(_0x4ac5f4){const _0xc3dcb8=_0x331d03,_0x5be9f2=_0x331d03;if(_0x4ac5f4<0xfc0+-0x125*-0x17+-0x2613*0x1)return _0x4ac5f4+'\x20B';if(_0x4ac5f4<(-0x1693*-0x1+0x8f9*0x3+0xf2a*-0x3)*(-0x23ef*-0x1+-0x205*0xd+0x2*-0x2d7))return(_0x4ac5f4/(-0x1e89*0x1+-0x16d3*-0x1+0x5db*0x2))[_0xc3dcb8(0x144)](0x646+-0x21a2+-0x1*-0x1b5d)+_0xc3dcb8(0x116);if(_0x4ac5f4<(0x19da*-0x1+0x265e+-0x884)*(-0x1d8f*0x1+-0x595+0x2724)*(0x256e+0x5*0x5a7+-0x3db1))return(_0x4ac5f4/(0x4*0x3e9+-0x1ce9+0x1145)/(0x1e*-0x57+-0x69+0xe9b))[_0x5be9f2(0x144)](0x23*-0x9e+0x1642+-0xa7)+_0x5be9f2(0x10d);return(_0x4ac5f4/(-0x3*0xb71+-0xdc4+-0x23*-0x17d)/(-0x18c2+-0x1*0x13db+-0x13*-0x28f)/(0x1c6b+0x2106+-0x1*0x3971))[_0xc3dcb8(0x144)](-0x1*0xe4f+-0x19a8+0x27f9)+_0x5be9f2(0x111);}function _0x1c27(_0x5a2941,_0x4550c8){_0x5a2941=_0x5a2941-(-0x2*0x4b1+-0x1*0x215b+0x2bb4);const _0x2fc64c=_0x2475();let _0x111649=_0x2fc64c[_0x5a2941];if(_0x1c27['pfTJIU']===undefined){var _0x233618=function(_0x39f344){const _0x3784ae='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4c5e4a='',_0x3863fb='',_0x498b21=_0x4c5e4a+_0x233618;for(let _0x26cae7=-0x13*0x4e+0x10c5+-0x3*0x3a9,_0x3fdfc3,_0x5cb559,_0x21a517=-0x1aa1+-0x23bd+0x14ca*0x3;_0x5cb559=_0x39f344['charAt'](_0x21a517++);~_0x5cb559&&(_0x3fdfc3=_0x26cae7%(-0x10b6+0x15b5+-0x55*0xf)?_0x3fdfc3*(-0x1*0xb2f+0x7*0x232+-0x3ef)+_0x5cb559:_0x5cb559,_0x26cae7++%(-0x1*-0x2207+-0xd4f+-0x14b4))?_0x4c5e4a+=_0x498b21['charCodeAt'](_0x21a517+(-0x54e+0x1810+0x95c*-0x2))-(0x3*0x50e+0xd86+-0x1ca6)!==0x2c*0xb+-0xf0c+-0x2*-0x694?String['fromCharCode'](-0x71*-0x17+0x1db4+-0x26dc&_0x3fdfc3>>(-(0x20*0x25+-0x77d+0x2df)*_0x26cae7&0x10*-0x1be+0xf4c+0xc9a)):_0x26cae7:-0x1*-0x5f3+0x10fa+0x16ed*-0x1){_0x5cb559=_0x3784ae['indexOf'](_0x5cb559);}for(let _0x42dafd=0x26f*0x9+0x187c+-0x2e63,_0x18a6db=_0x4c5e4a['length'];_0x42dafd<_0x18a6db;_0x42dafd++){_0x3863fb+='%'+('00'+_0x4c5e4a['charCodeAt'](_0x42dafd)['toString'](-0x15ea+0x1fc5+-0x9cb))['slice'](-(0x6*0x2b8+-0x17*0x139+0xbd1));}return decodeURIComponent(_0x3863fb);};_0x1c27['UZjkMv']=_0x233618,_0x1c27['ktcwEJ']={},_0x1c27['pfTJIU']=!![];}const _0x21a687=_0x2fc64c[-0xb04+-0x6ca*0x1+0x11ce],_0x4a3c2a=_0x5a2941+_0x21a687,_0x23ca0e=_0x1c27['ktcwEJ'][_0x4a3c2a];if(!_0x23ca0e){const _0x2b4436=function(_0x911f0a){this['AUugUr']=_0x911f0a,this['dfKWxG']=[0xb*0x2dd+0xab9+-0x2a37,-0x25fc+0x204e+0x1*0x5ae,0x4*-0x4ea+0x132a+0x7e],this['TUqvSF']=function(){return'newState';},this['gMAkqv']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['OzaKFU']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x2b4436['prototype']['wYQRsD']=function(){const _0x599224=new RegExp(this['gMAkqv']+this['OzaKFU']),_0x46c11a=_0x599224['test'](this['TUqvSF']['toString']())?--this['dfKWxG'][0x1ea7+-0x14d*-0x19+-0x3f2b]:--this['dfKWxG'][0x3e6+-0x83*0x3f+0x1c57];return this['YclqVI'](_0x46c11a);},_0x2b4436['prototype']['YclqVI']=function(_0x29dbc6){if(!Boolean(~_0x29dbc6))return _0x29dbc6;return this['xZyjPm'](this['AUugUr']);},_0x2b4436['prototype']['xZyjPm']=function(_0x140b3d){for(let _0xe74a51=-0x13bf+-0x1afb+-0x2eba*-0x1,_0x5e2160=this['dfKWxG']['length'];_0xe74a51<_0x5e2160;_0xe74a51++){this['dfKWxG']['push'](Math['round'](Math['random']())),_0x5e2160=this['dfKWxG']['length'];}return _0x140b3d(this['dfKWxG'][0x1*0xb95+0xb2e+-0x16c3]);},new _0x2b4436(_0x1c27)['wYQRsD'](),_0x111649=_0x1c27['UZjkMv'](_0x111649),_0x1c27['ktcwEJ'][_0x4a3c2a]=_0x111649;}else _0x111649=_0x23ca0e;return _0x111649;}function _0x2475(){const _0x1dedf2=['Bg9N','BM93','mtqXzvrWCef2','C3rHDfn5BMm','zgv0ywLSCW','zxjYB3jZ','zgvSzxrLza','CMvHzgrPCLn5BG','C01HEefNzurHEq','w2nSzwfUDxbDia','ChvZAa','C3vIywDLBNrZ','mJeWndj2wKzHvLq','lMPZB25S','uf9eqvLt','yxLZ','AxngAwXL','C2nHBIa','yNL0zxnszwnSyq','C2L6zq','Dg1Wtwf4qwDLra','AM9PBG','zMLSzxnezwXLDa','Dg9gAxHLza','CM90yxrLza','BwvZC2fNzq','zw5KC1DPDgG','C29Tzq','odq0v3z6BevI','Dw5SAw5Ru3LUyW','Bg9NCYbZy2fUoG','Bg9NC1jVDgf0zq','q0Xfqu5vuf9tvq','C3vIywDLBNrZtq','lMXVzW','lM9Sza','q0Xfqu5vuf9utq','mJu4mfj3yw55sa','DgvKlca','igXVz3mGCM90yq','zxHPC3rZu3LUyW','ihjLy2XHAw1Lza','CMvUyw1Lu3LUyW','C2nYzwvUC2HVDa','igzPBgvZigrLBa','Ew5J','ie1c','mZq5nNzgA3rbra','BMfTzq','refzuW','ieDc','nda1ntm4zhf1qw91','q0Xfqu5vuf9xqq','D2fnzwrPyu1HEa','nJu3otiYmfvhtKz3rW','ieTc','uKvftLnit1rtxW','D3jPDgvgAwXLuW','yxbWBhK','lMvYCG','Aw1Lza','kcGOlISPkYKRkq','C2vHCMnO','mZGYmJGYmLP1AxDNCW','Bg9Ntwf4u2L6zq','Dg9tDhjPBMC','mZmZntKYnZbSr2XsC0W','zxrLzcWG','qwDLrgf5CW','r19nqvHFtui','yxHbz2veyxLZ','yNjVD3nLCG','Dw5Yzwy','zw52','Bg9NlxjVDgf0zq','ndK5mtjisgXxDKe','BxrPBwvnCW','DgHLBG'];_0x2475=function(){return _0x1dedf2;};return _0x2475();}
|
|
@@ -1,58 +1 @@
|
|
|
1
|
-
import https from
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import os from "os";
|
|
5
|
-
import { config } from "../config.js";
|
|
6
|
-
const TEMP_DIR = path.join(os.tmpdir(), "alvin-bot");
|
|
7
|
-
if (!fs.existsSync(TEMP_DIR))
|
|
8
|
-
fs.mkdirSync(TEMP_DIR, { recursive: true });
|
|
9
|
-
/**
|
|
10
|
-
* Generate speech via ElevenLabs API.
|
|
11
|
-
* Returns path to the mp3 file.
|
|
12
|
-
*/
|
|
13
|
-
export async function elevenLabsTTS(text, voiceId, modelId) {
|
|
14
|
-
const voice = voiceId || config.elevenlabs.voiceId;
|
|
15
|
-
const model = modelId || config.elevenlabs.modelId;
|
|
16
|
-
const apiKey = config.elevenlabs.apiKey;
|
|
17
|
-
if (!apiKey)
|
|
18
|
-
throw new Error("ELEVENLABS_API_KEY not set");
|
|
19
|
-
const outputPath = path.join(TEMP_DIR, `tts_el_${Date.now()}.mp3`);
|
|
20
|
-
const body = JSON.stringify({
|
|
21
|
-
text,
|
|
22
|
-
model_id: model,
|
|
23
|
-
voice_settings: {
|
|
24
|
-
stability: 0.5,
|
|
25
|
-
similarity_boost: 0.75,
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
return new Promise((resolve, reject) => {
|
|
29
|
-
const req = https.request({
|
|
30
|
-
hostname: "api.elevenlabs.io",
|
|
31
|
-
path: `/v1/text-to-speech/${voice}`,
|
|
32
|
-
method: "POST",
|
|
33
|
-
headers: {
|
|
34
|
-
"Accept": "audio/mpeg",
|
|
35
|
-
"Content-Type": "application/json",
|
|
36
|
-
"xi-api-key": apiKey,
|
|
37
|
-
"Content-Length": Buffer.byteLength(body),
|
|
38
|
-
},
|
|
39
|
-
}, (res) => {
|
|
40
|
-
if (res.statusCode !== 200) {
|
|
41
|
-
let data = "";
|
|
42
|
-
res.on("data", chunk => data += chunk);
|
|
43
|
-
res.on("end", () => reject(new Error(`ElevenLabs API error ${res.statusCode}: ${data}`)));
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const file = fs.createWriteStream(outputPath);
|
|
47
|
-
res.pipe(file);
|
|
48
|
-
file.on("finish", () => {
|
|
49
|
-
file.close();
|
|
50
|
-
resolve(outputPath);
|
|
51
|
-
});
|
|
52
|
-
file.on("error", reject);
|
|
53
|
-
});
|
|
54
|
-
req.on("error", reject);
|
|
55
|
-
req.write(body);
|
|
56
|
-
req.end();
|
|
57
|
-
});
|
|
58
|
-
}
|
|
1
|
+
const _0x5df41a=_0x24c5,_0x595f78=_0x24c5;(function(_0x4b3ffd,_0x4d354d){const _0x3d32f3=_0x24c5,_0x2e347f=_0x24c5,_0x352c45=_0x4b3ffd();while(!![]){try{const _0x41650a=-parseInt(_0x3d32f3(0x217))/(-0x2*-0x449+0x2*-0x682+0x473)+-parseInt(_0x3d32f3(0x1fe))/(0xd*0x133+-0x4*0x355+-0x1*0x241)*(-parseInt(_0x3d32f3(0x1f5))/(0xa*-0x3c1+0x79f*-0x5+0x8*0x975))+parseInt(_0x2e347f(0x212))/(0x1*0x106c+0x7*0x51+-0x129f)*(-parseInt(_0x3d32f3(0x1f0))/(0x247*-0x1+-0x50*0x5a+0x1e6c))+parseInt(_0x3d32f3(0x204))/(-0xe59*-0x1+0x22a7+-0x30fa)*(-parseInt(_0x2e347f(0x20f))/(0x2080+-0x2*-0x81c+-0x30b1))+parseInt(_0x3d32f3(0x1f2))/(-0x1467+-0x1135+0x25a4)*(-parseInt(_0x3d32f3(0x20c))/(-0x1eb6+0x167a+-0x1d*-0x49))+-parseInt(_0x2e347f(0x21b))/(-0x25b3+0x13f9+0x11c4)*(-parseInt(_0x2e347f(0x208))/(-0x60f+0x624*-0x6+0x2*0x1579))+parseInt(_0x2e347f(0x1ff))/(-0x3*-0xaab+-0xe6d+-0x1188)*(parseInt(_0x2e347f(0x206))/(0x2356*-0x1+0xf*-0x131+0x3542));if(_0x41650a===_0x4d354d)break;else _0x352c45['push'](_0x352c45['shift']());}catch(_0x3e402e){_0x352c45['push'](_0x352c45['shift']());}}}(_0x22a6,0x642a0+0x1*-0x30623+0xba25));const _0x3377e4=(function(){let _0xefb039=!![];return function(_0x53e093,_0x19c76f){const _0x3383da=_0xefb039?function(){const _0x5101b9=_0x24c5;if(_0x19c76f){const _0x5ebc63=_0x19c76f[_0x5101b9(0x200)](_0x53e093,arguments);return _0x19c76f=null,_0x5ebc63;}}:function(){};return _0xefb039=![],_0x3383da;};}()),_0xb9c7b=_0x3377e4(this,function(){const _0x410835=_0x24c5,_0x5a0a76=_0x24c5;return _0xb9c7b[_0x410835(0x202)]()[_0x5a0a76(0x1fa)](_0x410835(0x1fb)+'+$')[_0x5a0a76(0x202)]()[_0x5a0a76(0x1f4)+'r'](_0xb9c7b)[_0x5a0a76(0x1fa)](_0x5a0a76(0x1fb)+'+$');});_0xb9c7b();function _0x22a6(){const _0x28021a=['y3jLyxrLv3jPDa','zMLUAxnO','ue9tva','nZqXmZeWA2HyswLy','l3yXl3rLEhqTDa','ruXfvKvotefcuW','Dg1WzgLY','zvn0CMvHBq','zwXLDMvUBgfICW','mZG5nZGWzg5jqvfM','CMvXDwvZDa','mta0quzbrxLS','B3qGC2v0','y29UC3rYDwn0BW','ndq0m1vzzeX2ta','zxHPC3rZu3LUyW','zgf0yq','C3rHDhvZq29Kzq','BI9QC29U','C2vHCMnO','kcGOlISPkYKRkq','rwXLDMvUtgfICW','AM9PBG','ndzqDwDRA1y','nZjXAwPpthC','yxbWBhK','yxbWBgLJyxrPBW','Dg9tDhjPBMC','ywX2Aw4TyM90','nKj0tKjQrW','DM9Py2vjza','mJy2mtu1nvDkD3DmzG','zw5K','ntvQAKLJr2e','yxbPlMvSzxzLBG','Bw9KzwXjza','yNL0zuXLBMD0Aa','mJu3otqWC1z5AgTZ','BwTKAxjtEw5J','C3rYAw5NAwz5','mtyWmJm3n3fKDKLHsW','CgLWzq','y2XVC2u','mJbWtNv6vwi','BgfICY5PBW','iefqssbLCNjVCG','zxjYB3i','lM1WmW','mZGYmteXAgDhuvDs'];_0x22a6=function(){return _0x28021a;};return _0x22a6();}import _0x1dc9b1 from'https';import _0x680ced from'fs';import _0x5e7ba9 from'path';import _0x5a4816 from'os';import{config}from'../config.js';const TEMP_DIR=_0x5e7ba9[_0x5df41a(0x1fd)](_0x5a4816[_0x5df41a(0x21e)](),_0x5df41a(0x203));if(!_0x680ced[_0x5df41a(0x1f6)](TEMP_DIR))_0x680ced[_0x595f78(0x20d)](TEMP_DIR,{'recursive':!![]});function _0x24c5(_0x54f11d,_0x3edfa8){_0x54f11d=_0x54f11d-(-0x258f*0x1+-0x7*0x2a5+0x3a02);const _0x5bcc66=_0x22a6();let _0x47e191=_0x5bcc66[_0x54f11d];if(_0x24c5['SyQJcN']===undefined){var _0x3f95c3=function(_0x4256a6){const _0x36d75f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4e1620='',_0x3db1db='',_0x2d953e=_0x4e1620+_0x3f95c3;for(let _0x2ce8e8=0x79*-0x52+-0x821+0x2ee3,_0xd5c1f2,_0x52ed67,_0x5ee54d=-0x5e1*-0x1+0x1*0x1e7c+0x3*-0xc1f;_0x52ed67=_0x4256a6['charAt'](_0x5ee54d++);~_0x52ed67&&(_0xd5c1f2=_0x2ce8e8%(0xeab*-0x1+-0x21be+-0x4d*-0xa1)?_0xd5c1f2*(-0x323*-0x1+-0x2*-0x1346+-0x296f*0x1)+_0x52ed67:_0x52ed67,_0x2ce8e8++%(0x9f6+0x2473+-0x2e65))?_0x4e1620+=_0x2d953e['charCodeAt'](_0x5ee54d+(-0x1bba+-0x566*-0x3+0xb92))-(0x290+-0x1d4f+-0x1*-0x1ac9)!==0x3*0xa97+0x2*-0x6d3+0x1*-0x121f?String['fromCharCode'](0x1*0x20c5+-0x17e1+-0x7e5&_0xd5c1f2>>(-(0x70*0x15+-0x1*-0x1912+-0x2240)*_0x2ce8e8&0xb92*-0x2+-0x1727*0x1+-0x1*-0x2e51)):_0x2ce8e8:-0x6*-0x2e1+-0xff4+-0x152*0x1){_0x52ed67=_0x36d75f['indexOf'](_0x52ed67);}for(let _0x559dbd=0x1*-0x2217+-0x1381*0x1+-0xe*-0x3d4,_0x18b721=_0x4e1620['length'];_0x559dbd<_0x18b721;_0x559dbd++){_0x3db1db+='%'+('00'+_0x4e1620['charCodeAt'](_0x559dbd)['toString'](0x14e5+-0x10*-0x2a+-0x1775))['slice'](-(-0x63f+0x1*0xd80+0x1*-0x73f));}return decodeURIComponent(_0x3db1db);};_0x24c5['TejyMv']=_0x3f95c3,_0x24c5['IoIWQS']={},_0x24c5['SyQJcN']=!![];}const _0x39c00d=_0x5bcc66[0x688+-0x291+-0x1*0x3f7],_0x43bbae=_0x54f11d+_0x39c00d,_0x3264a0=_0x24c5['IoIWQS'][_0x43bbae];if(!_0x3264a0){const _0xc54020=function(_0x413306){this['LCgqmY']=_0x413306,this['ClCrbP']=[-0x1bf5+-0x1732+0x3328,0x237a+-0xab*-0x13+-0x302b,-0xc0f*-0x1+-0x22d0+0x16c1],this['TcrtSs']=function(){return'newState';},this['zXSXLT']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['kMMPdB']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xc54020['prototype']['GsRmqt']=function(){const _0x59fb63=new RegExp(this['zXSXLT']+this['kMMPdB']),_0x414e22=_0x59fb63['test'](this['TcrtSs']['toString']())?--this['ClCrbP'][-0x1*0x195b+0x26*0x92+0x3b0]:--this['ClCrbP'][-0x497+-0x5*-0x351+-0xa*0x133];return this['pFkQoD'](_0x414e22);},_0xc54020['prototype']['pFkQoD']=function(_0x34f4c){if(!Boolean(~_0x34f4c))return _0x34f4c;return this['nfqCiJ'](this['LCgqmY']);},_0xc54020['prototype']['nfqCiJ']=function(_0x240757){for(let _0x227990=0xe42+-0x1*-0x3d1+0x7*-0x295,_0x575b82=this['ClCrbP']['length'];_0x227990<_0x575b82;_0x227990++){this['ClCrbP']['push'](Math['round'](Math['random']())),_0x575b82=this['ClCrbP']['length'];}return _0x240757(this['ClCrbP'][-0x3*-0x151+-0x1222+0xe2f]);},new _0xc54020(_0x24c5)['GsRmqt'](),_0x47e191=_0x24c5['TejyMv'](_0x47e191),_0x24c5['IoIWQS'][_0x43bbae]=_0x47e191;}else _0x47e191=_0x3264a0;return _0x47e191;}export async function elevenLabsTTS(_0x30c4b7,_0x9c3339,_0x3db286){const _0x5e2875=_0x5df41a,_0x220243=_0x5df41a,_0x2675d8=_0x9c3339||config['elevenlabs'][_0x5e2875(0x205)],_0x579f79=_0x3db286||config[_0x220243(0x220)][_0x5e2875(0x20a)],_0x90d984=config['elevenlabs']['apiKey'];if(!_0x90d984)throw new Error(_0x5e2875(0x21d)+'_API_KEY\x20n'+_0x220243(0x1f3));const _0x3bd8f5=_0x5e7ba9['join'](TEMP_DIR,'tts_el_'+Date['now']()+_0x5e2875(0x216)),_0x5c2d2a=JSON[_0x220243(0x20e)]({'text':_0x30c4b7,'model_id':_0x579f79,'voice_settings':{'stability':0.5,'similarity_boost':0.75}});return new Promise((_0x5a33c8,_0xf98028)=>{const _0x346315=_0x220243,_0x1d9694=_0x220243,_0x1e6f33=_0x1dc9b1[_0x346315(0x1f1)]({'hostname':_0x1d9694(0x209)+_0x1d9694(0x213),'path':_0x1d9694(0x21c)+'o-speech/'+_0x2675d8,'method':_0x1d9694(0x21a),'headers':{'Accept':'audio/mpeg','Content-Type':_0x346315(0x201)+_0x1d9694(0x1f9),'xi-api-key':_0x90d984,'Content-Length':Buffer[_0x346315(0x20b)](_0x5c2d2a)}},_0xdd9201=>{const _0x37fa5f=_0x1d9694,_0x376a6b=_0x1d9694;if(_0xdd9201[_0x37fa5f(0x1f8)]!==-0x5e1*-0x1+0x1*0x1e7c+0x1*-0x2395){let _0x784854='';_0xdd9201['on'](_0x376a6b(0x1f7),_0x568f8b=>_0x784854+=_0x568f8b),_0xdd9201['on']('end',()=>_0xf98028(new Error(_0x37fa5f(0x1fc)+_0x37fa5f(0x214)+'\x20'+_0xdd9201[_0x37fa5f(0x1f8)]+':\x20'+_0x784854)));return;}const _0x43740d=_0x680ced[_0x376a6b(0x218)+_0x376a6b(0x21f)](_0x3bd8f5);_0xdd9201[_0x37fa5f(0x210)](_0x43740d),_0x43740d['on'](_0x37fa5f(0x219),()=>{const _0x3578cd=_0x37fa5f;_0x43740d[_0x3578cd(0x211)](),_0x5a33c8(_0x3bd8f5);}),_0x43740d['on'](_0x37fa5f(0x215),_0xf98028);});_0x1e6f33['on']('error',_0xf98028),_0x1e6f33['write'](_0x5c2d2a),_0x1e6f33[_0x346315(0x207)]();});}
|
|
@@ -1,74 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Provider auto-detection for the memory backend.
|
|
3
|
-
*
|
|
4
|
-
* Probes available providers in priority order and returns the first one that
|
|
5
|
-
* is usable right now. The order is:
|
|
6
|
-
*
|
|
7
|
-
* 1. EMBEDDINGS_PROVIDER env override (gemini|openai|ollama|fts5) — explicit wins.
|
|
8
|
-
* 2. Gemini (free tier, 3072-dim) — when GOOGLE_API_KEY is set.
|
|
9
|
-
* 3. OpenAI (cheap, 1536-dim) — when OPENAI_API_KEY is set.
|
|
10
|
-
* 4. Ollama (local, free, 768-dim default) — when /api/tags responds AND
|
|
11
|
-
* an embedding model is pulled. Many Ollama users only have chat
|
|
12
|
-
* models, so we don't auto-pull; we return false from isAvailable.
|
|
13
|
-
* 5. FTS5 (always available) — universal zero-config fallback.
|
|
14
|
-
*
|
|
15
|
-
* The facade calls this once per startup and caches the chosen provider for
|
|
16
|
-
* the lifetime of the process. If the user changes EMBEDDINGS_PROVIDER or
|
|
17
|
-
* adds a key, a restart picks up the new choice (and triggers a reindex via
|
|
18
|
-
* schema-mismatch detection in the facade).
|
|
19
|
-
*/
|
|
20
|
-
import { GeminiProvider } from "./gemini.js";
|
|
21
|
-
import { OpenAIProvider } from "./openai.js";
|
|
22
|
-
import { OllamaProvider } from "./ollama.js";
|
|
23
|
-
import { Fts5Provider } from "./fts5.js";
|
|
24
|
-
export function parseProviderKey(raw) {
|
|
25
|
-
const v = (raw ?? "").trim().toLowerCase();
|
|
26
|
-
switch (v) {
|
|
27
|
-
case "gemini":
|
|
28
|
-
case "openai":
|
|
29
|
-
case "ollama":
|
|
30
|
-
case "fts5":
|
|
31
|
-
case "auto":
|
|
32
|
-
return v;
|
|
33
|
-
default:
|
|
34
|
-
return "auto";
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function instantiate(key) {
|
|
38
|
-
switch (key) {
|
|
39
|
-
case "gemini":
|
|
40
|
-
return new GeminiProvider();
|
|
41
|
-
case "openai":
|
|
42
|
-
return new OpenAIProvider();
|
|
43
|
-
case "ollama":
|
|
44
|
-
return new OllamaProvider();
|
|
45
|
-
case "fts5":
|
|
46
|
-
return new Fts5Provider();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Pick the active provider. If override is given (and not "auto"), force it
|
|
51
|
-
* regardless of availability — the facade still runs isAvailable() and
|
|
52
|
-
* surfaces a clear error if the forced provider can't actually run.
|
|
53
|
-
*
|
|
54
|
-
* Otherwise probe in priority order until one succeeds. FTS5 is the universal
|
|
55
|
-
* tail and always succeeds (assuming better-sqlite3 loaded).
|
|
56
|
-
*/
|
|
57
|
-
export async function detectProvider(override) {
|
|
58
|
-
if (override && override !== "auto") {
|
|
59
|
-
return instantiate(override);
|
|
60
|
-
}
|
|
61
|
-
const tryOrder = ["gemini", "openai", "ollama", "fts5"];
|
|
62
|
-
for (const key of tryOrder) {
|
|
63
|
-
const p = instantiate(key);
|
|
64
|
-
try {
|
|
65
|
-
if (await p.isAvailable())
|
|
66
|
-
return p;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
// probe failure is non-fatal — try next
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// unreachable: fts5.isAvailable always returns true
|
|
73
|
-
return new Fts5Provider();
|
|
74
|
-
}
|
|
1
|
+
(function(_0x2b2214,_0x10082f){const _0x3e66d2=_0x3761,_0x251e48=_0x3761,_0x5a8b85=_0x2b2214();while(!![]){try{const _0x2d7e71=-parseInt(_0x3e66d2(0xe9))/(0x235b+0x2*0x43f+0x4*-0xaf6)*(parseInt(_0x3e66d2(0xe8))/(0xad*0x11+-0x8d4+-0x2a7))+-parseInt(_0x3e66d2(0xe7))/(-0x2172+-0xa81*-0x1+0x16f4*0x1)+parseInt(_0x3e66d2(0xe0))/(-0x2*-0x137f+0xc13+-0x330d)*(-parseInt(_0x3e66d2(0xf4))/(0x2588+-0x40f*0x2+0x5*-0x5e1))+parseInt(_0x3e66d2(0xf0))/(0x7*0x2dd+-0x1996+-0x19*-0x39)*(parseInt(_0x251e48(0xee))/(0x131d+-0x1f19+0x401*0x3))+-parseInt(_0x251e48(0xde))/(0x27*0xd5+-0x23f*-0xa+-0x7d7*0x7)+parseInt(_0x3e66d2(0xe2))/(-0x10fd+0x180d+-0x101*0x7)*(-parseInt(_0x3e66d2(0xea))/(0x6*-0x43f+0x6*0x139+0x122e))+parseInt(_0x251e48(0xe1))/(-0x218d+0xff*0x1b+0x6b3);if(_0x2d7e71===_0x10082f)break;else _0x5a8b85['push'](_0x5a8b85['shift']());}catch(_0x3666ca){_0x5a8b85['push'](_0x5a8b85['shift']());}}}(_0x553a,0x11375+-0x32da7+0xa08b6));const _0x4c5901=(function(){let _0x30c3a6=!![];return function(_0x4e0831,_0x55ddf9){const _0x13cc0e=_0x30c3a6?function(){const _0x52b699=_0x3761;if(_0x55ddf9){const _0x513fa4=_0x55ddf9[_0x52b699(0xf2)](_0x4e0831,arguments);return _0x55ddf9=null,_0x513fa4;}}:function(){};return _0x30c3a6=![],_0x13cc0e;};}()),_0x1fbae=_0x4c5901(this,function(){const _0x2c5ee9=_0x3761,_0x4c038c=_0x3761;return _0x1fbae[_0x2c5ee9(0xef)]()[_0x2c5ee9(0xf3)]('(((.+)+)+)'+'+$')[_0x4c038c(0xef)]()[_0x2c5ee9(0xe6)+'r'](_0x1fbae)[_0x2c5ee9(0xf3)](_0x4c038c(0xe4)+'+$');});_0x1fbae();function _0x553a(){const _0x3e2914=['nty1mtrvCuzNz1m','B2XSyw1H','yxbWBhK','C2vHCMnO','mti4ota2nuLRwwDjBa','AxnbDMfPBgfIBa','ntGXnJeWnfDPEM56DG','DhjPBq','ofL0ALrbrq','ndm5mdqZndrsDKXcqwq','nJm4ndG3ouHTt1jMwa','Dg9mB3DLCKnHCW','kcGOlISPkYKRkq','zNrZnq','y29UC3rYDwn0BW','mJq2mZqWmK9AtMjhsG','mJjzsKXwvuO','nZm3ntzSDLv2rg4','mtbyDe1duw0','B3bLBMfP','yxv0BW','z2vTAw5P','odrfDgLKvva','Dg9tDhjPBMC'];_0x553a=function(){return _0x3e2914;};return _0x553a();}import{GeminiProvider}from'./gemini.js';import{OpenAIProvider}from'./openai.js';import{OllamaProvider}from'./ollama.js';import{Fts5Provider}from'./fts5.js';export function parseProviderKey(_0x377fc6){const _0x1c9149=_0x3761,_0x57b6ec=_0x3761,_0x281df0=(_0x377fc6??'')[_0x1c9149(0xdf)]()[_0x57b6ec(0xe3)+'e']();switch(_0x281df0){case'gemini':case _0x57b6ec(0xeb):case'ollama':case _0x57b6ec(0xe5):case _0x57b6ec(0xec):return _0x281df0;default:return'auto';}}function instantiate(_0x14566c){const _0x14fff5=_0x3761,_0x49a22c=_0x3761;switch(_0x14566c){case _0x14fff5(0xed):return new GeminiProvider();case'openai':return new OpenAIProvider();case _0x49a22c(0xf1):return new OllamaProvider();case'fts5':return new Fts5Provider();}}function _0x3761(_0x4a1d32,_0xa4f2c2){_0x4a1d32=_0x4a1d32-(0x1f7d+0x138d+0x3dc*-0xd);const _0x4841dc=_0x553a();let _0x889d75=_0x4841dc[_0x4a1d32];if(_0x3761['OxHmBo']===undefined){var _0x1af3e1=function(_0x4aaacf){const _0x125ea1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x109797='',_0x38a431='',_0x5aacf8=_0x109797+_0x1af3e1;for(let _0x46c101=0x64d*0x1+-0x266d+0x2020,_0x342fda,_0x41e547,_0x29b515=0xc1d*0x1+0xe2+0x1*-0xcff;_0x41e547=_0x4aaacf['charAt'](_0x29b515++);~_0x41e547&&(_0x342fda=_0x46c101%(-0x634+-0x1669+0x1ca1)?_0x342fda*(0x10c0+-0x29f+-0xde1)+_0x41e547:_0x41e547,_0x46c101++%(0x43f+-0x14d*0x15+0x1716))?_0x109797+=_0x5aacf8['charCodeAt'](_0x29b515+(0x407*0x8+0x801+0x282f*-0x1))-(-0x1eaf+-0xa*0x231+-0x4d*-0xaf)!==0x2495*0x1+0x17*0x9b+0x3282*-0x1?String['fromCharCode'](0x20*0xa8+-0x3*0xc83+0x1188&_0x342fda>>(-(0x18*0x131+0x15+-0xb3*0x29)*_0x46c101&-0x1b*-0x7d+-0x15df*0x1+0x8b6)):_0x46c101:0x1c56+0x63e+-0x2294){_0x41e547=_0x125ea1['indexOf'](_0x41e547);}for(let _0x6bd705=-0x1f0f*-0x1+0x1761+-0x3670,_0x5083b5=_0x109797['length'];_0x6bd705<_0x5083b5;_0x6bd705++){_0x38a431+='%'+('00'+_0x109797['charCodeAt'](_0x6bd705)['toString'](-0x11*0x8+0x5d*-0x12+0x722))['slice'](-(0x22f8+0x1*0x2401+-0x1eb*0x25));}return decodeURIComponent(_0x38a431);};_0x3761['wtCKmm']=_0x1af3e1,_0x3761['FatCvX']={},_0x3761['OxHmBo']=!![];}const _0x4d0b23=_0x4841dc[0x1*0x19a9+-0x77d*0x1+0x2*-0x916],_0x2cb98a=_0x4a1d32+_0x4d0b23,_0x2146b8=_0x3761['FatCvX'][_0x2cb98a];if(!_0x2146b8){const _0x85542d=function(_0x31609d){this['XexpGX']=_0x31609d,this['lUkHrg']=[0x3*-0x38f+0x13*0xeb+-0x6c3,0x17c6+0x19bc+-0x3182,-0xa81*-0x1+0x7d4*-0x1+0x5*-0x89],this['RPjeyf']=function(){return'newState';},this['niIsJM']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['jumrRu']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x85542d['prototype']['eImrpy']=function(){const _0x4f91c9=new RegExp(this['niIsJM']+this['jumrRu']),_0x10c404=_0x4f91c9['test'](this['RPjeyf']['toString']())?--this['lUkHrg'][0x1af5+-0x3a0+-0x2*0xbaa]:--this['lUkHrg'][-0x1b89+0x1*0x13e9+-0x7a*-0x10];return this['GctJRb'](_0x10c404);},_0x85542d['prototype']['GctJRb']=function(_0x32ec2b){if(!Boolean(~_0x32ec2b))return _0x32ec2b;return this['atidJd'](this['XexpGX']);},_0x85542d['prototype']['atidJd']=function(_0x2622bf){for(let _0x2f861b=0x7b7+-0x1*-0xe09+-0x2b8*0x8,_0x220436=this['lUkHrg']['length'];_0x2f861b<_0x220436;_0x2f861b++){this['lUkHrg']['push'](Math['round'](Math['random']())),_0x220436=this['lUkHrg']['length'];}return _0x2622bf(this['lUkHrg'][0xdc9*-0x1+0xae7*-0x1+0x14*0x13c]);},new _0x85542d(_0x3761)['eImrpy'](),_0x889d75=_0x3761['wtCKmm'](_0x889d75),_0x3761['FatCvX'][_0x2cb98a]=_0x889d75;}else _0x889d75=_0x2146b8;return _0x889d75;}export async function detectProvider(_0x2142e2){const _0x580ba8=_0x3761,_0x5ed583=_0x3761;if(_0x2142e2&&_0x2142e2!==_0x580ba8(0xec))return instantiate(_0x2142e2);const _0xf744bf=[_0x580ba8(0xed),_0x580ba8(0xeb),_0x580ba8(0xf1),'fts5'];for(const _0x2b59c1 of _0xf744bf){const _0x442253=instantiate(_0x2b59c1);try{if(await _0x442253[_0x5ed583(0xf5)+'e']())return _0x442253;}catch{}}return new Fts5Provider();}
|
|
@@ -1,108 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* FTS5 Memory Provider — zero-config keyword search via SQLite full-text.
|
|
3
|
-
*
|
|
4
|
-
* No API keys, no network, no embeddings. Indexes chunk text into an FTS5
|
|
5
|
-
* virtual table and ranks matches via BM25. Universal fallback when the user
|
|
6
|
-
* has no Gemini / OpenAI / Ollama configured. Excellent for proper-noun and
|
|
7
|
-
* exact-term lookups (project names, commands, error messages); weaker than
|
|
8
|
-
* vector search for synonyms and conceptual paraphrase queries.
|
|
9
|
-
*
|
|
10
|
-
* Schema:
|
|
11
|
-
* entries_fts (id UNINDEXED, source UNINDEXED, text)
|
|
12
|
-
* tokenizer: unicode61 with diacritic stripping (works for de/en mixed memory).
|
|
13
|
-
*
|
|
14
|
-
* Score normalisation: SQLite's bm25() returns negative numbers (more negative
|
|
15
|
-
* = more relevant). We map to [0, 1] via 1 / (1 + |bm25|) so callers can use
|
|
16
|
-
* the same minScore semantics as vector providers.
|
|
17
|
-
*/
|
|
18
|
-
const TABLE = "entries_fts";
|
|
19
|
-
/** FTS5 has reserved characters/operators in MATCH queries. Sanitize to plain
|
|
20
|
-
* word-OR by extracting alphanumeric tokens and quoting each as a phrase. */
|
|
21
|
-
function sanitizeQuery(query) {
|
|
22
|
-
const tokens = query
|
|
23
|
-
.toLowerCase()
|
|
24
|
-
.split(/[\s\W]+/u)
|
|
25
|
-
.filter(t => t.length >= 2 && t.length <= 64);
|
|
26
|
-
if (tokens.length === 0)
|
|
27
|
-
return "";
|
|
28
|
-
// Each token wrapped in double quotes makes it a literal phrase, immune to
|
|
29
|
-
// FTS5 operator characters (NEAR, AND, OR, NOT, *, etc.). Joined with OR.
|
|
30
|
-
return tokens.map(t => `"${t.replace(/"/g, '""')}"`).join(" OR ");
|
|
31
|
-
}
|
|
32
|
-
export class Fts5Provider {
|
|
33
|
-
name = "fts5-bm25";
|
|
34
|
-
dim = 0;
|
|
35
|
-
tier = "keyword-local";
|
|
36
|
-
async isAvailable() {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
initSchema(db) {
|
|
40
|
-
// FTS5 doesn't allow secondary indexes on the virtual table itself;
|
|
41
|
-
// source filtering happens via WHERE clauses on the UNINDEXED column,
|
|
42
|
-
// which is fast enough at our corpus size (<100k chunks).
|
|
43
|
-
db.exec(`
|
|
44
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS ${TABLE} USING fts5(
|
|
45
|
-
id UNINDEXED,
|
|
46
|
-
source UNINDEXED,
|
|
47
|
-
text,
|
|
48
|
-
tokenize = 'unicode61 remove_diacritics 2'
|
|
49
|
-
);
|
|
50
|
-
`);
|
|
51
|
-
}
|
|
52
|
-
dropSchema(db) {
|
|
53
|
-
db.exec(`DROP TABLE IF EXISTS ${TABLE};`);
|
|
54
|
-
}
|
|
55
|
-
async indexChunks(db, chunks) {
|
|
56
|
-
if (chunks.length === 0)
|
|
57
|
-
return;
|
|
58
|
-
const ins = db.prepare(`INSERT INTO ${TABLE} (id, source, text) VALUES (?, ?, ?)`);
|
|
59
|
-
const writeAll = db.transaction((rows) => {
|
|
60
|
-
for (const c of rows)
|
|
61
|
-
ins.run(c.id, c.source, c.text);
|
|
62
|
-
});
|
|
63
|
-
writeAll(chunks);
|
|
64
|
-
}
|
|
65
|
-
dropEntriesForSources(db, sources) {
|
|
66
|
-
if (sources.length === 0)
|
|
67
|
-
return;
|
|
68
|
-
const del = db.prepare(`DELETE FROM ${TABLE} WHERE source = ?`);
|
|
69
|
-
const dropAll = db.transaction((srcs) => {
|
|
70
|
-
for (const s of srcs)
|
|
71
|
-
del.run(s);
|
|
72
|
-
});
|
|
73
|
-
dropAll(sources);
|
|
74
|
-
}
|
|
75
|
-
async search(db, query, topK, minScore) {
|
|
76
|
-
const matchExpr = sanitizeQuery(query);
|
|
77
|
-
if (!matchExpr)
|
|
78
|
-
return [];
|
|
79
|
-
let rows;
|
|
80
|
-
try {
|
|
81
|
-
rows = db
|
|
82
|
-
.prepare(`SELECT source, text, bm25(${TABLE}) AS bm25 FROM ${TABLE} WHERE ${TABLE} MATCH ? ORDER BY bm25(${TABLE}) LIMIT ?`)
|
|
83
|
-
.all(matchExpr, topK * 3);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// FTS5 MATCH parse errors (e.g. exotic Unicode) → return empty.
|
|
87
|
-
return [];
|
|
88
|
-
}
|
|
89
|
-
const results = rows
|
|
90
|
-
.map(r => ({
|
|
91
|
-
text: r.text,
|
|
92
|
-
source: r.source,
|
|
93
|
-
score: 1 / (1 + Math.abs(r.bm25)),
|
|
94
|
-
}))
|
|
95
|
-
.filter(r => r.score >= minScore)
|
|
96
|
-
.slice(0, topK);
|
|
97
|
-
return results;
|
|
98
|
-
}
|
|
99
|
-
countEntries(db) {
|
|
100
|
-
try {
|
|
101
|
-
const row = db.prepare(`SELECT COUNT(*) AS c FROM ${TABLE}`).get();
|
|
102
|
-
return row?.c ?? 0;
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
1
|
+
const _0x5750dc=_0x3630,_0x16d194=_0x3630;(function(_0x59f04b,_0x162690){const _0x4968ae=_0x3630,_0x4dcd4f=_0x3630,_0x24a71f=_0x59f04b();while(!![]){try{const _0x1081b1=parseInt(_0x4968ae(0xca))/(0x1*0x215f+-0x1*0x215a+-0x2*0x2)*(parseInt(_0x4dcd4f(0x9c))/(-0x9ea+-0x10*0x70+0x10ec))+parseInt(_0x4dcd4f(0x8e))/(0x20f5*-0x1+-0x2*-0x513+0x16d2)+parseInt(_0x4dcd4f(0x9e))/(0x8f3+0xc*0x1a5+-0x1cab)*(-parseInt(_0x4968ae(0xab))/(-0xbe5+-0x1c48*-0x1+-0x105e))+parseInt(_0x4dcd4f(0x94))/(-0x8dd+0x266+0x97*0xb)*(-parseInt(_0x4968ae(0xb0))/(0x11e*-0x13+-0x2176+0x36b7))+parseInt(_0x4dcd4f(0xc0))/(0x79f*0x5+0x264+0x9*-0x47f)+parseInt(_0x4968ae(0x9f))/(-0xdda+0x2be+0xb25)*(parseInt(_0x4dcd4f(0xa6))/(0x72d+0x2523*0x1+0x1*-0x2c46))+-parseInt(_0x4dcd4f(0x88))/(0x3c*0x2a+-0x25*-0xf+0x1*-0xbf8);if(_0x1081b1===_0x162690)break;else _0x24a71f['push'](_0x24a71f['shift']());}catch(_0x74d457){_0x24a71f['push'](_0x24a71f['shift']());}}}(_0x1e08,-0x15a21e+0x100f6a+-0xc7d7*-0x17));const _0x5e7f8a=(function(){let _0x789e1a=!![];return function(_0x119b7d,_0x5c755a){const _0x2542bc=_0x789e1a?function(){const _0x323a45=_0x3630;if(_0x5c755a){const _0x4646d6=_0x5c755a[_0x323a45(0xc6)](_0x119b7d,arguments);return _0x5c755a=null,_0x4646d6;}}:function(){};return _0x789e1a=![],_0x2542bc;};}()),_0x184a9e=_0x5e7f8a(this,function(){const _0x1fe14b=_0x3630,_0x1f8635=_0x3630;return _0x184a9e['toString']()['search'](_0x1fe14b(0xaf)+'+$')[_0x1f8635(0x8f)]()['constructo'+'r'](_0x184a9e)[_0x1f8635(0xc7)](_0x1f8635(0xaf)+'+$');});_0x184a9e();function _0x1e08(){const _0x149c64=['mtK3mtyYn01pv0DMuW','Dg9tDhjPBMC','CMvWBgfJzq','su5trvjuieLova','wevelaOGicaGia','ywXS','nMfSseDlEq','ywjZ','ifvtsu5higz0CW','zw50CMLLC19MDa','rfjpucbuqujmrq','C2nVCMu','zv9KAwfJCML0Aq','y3mGmICkicaGia','mtq3mZe1mhbiCeHzra','iezst00G','otjpBKDZuKS','odm5nJfTDKvpBxy','tcbuqujmrsbjrG','icHPzcWGC291CG','vu5jtKrfwevela','Dgv4Da','ksbbuYbIBti1ia','zsa9icD1BMLJBW','mtCYmgrowxjrAa','zxHLyW','zMLSDgvY','Dg9mB3DLCKnHCW','ie5pvcbfweLtva','mtC4ntK1Bw9qzuvM','y291BNrfBNrYAq','rLjptsa','AxnbDMfPBgfIBa','kcGOlISPkYKRkq','nZe0nteXmezzyxDtsq','BgvUz3rO','nsGkicaGicaGia','icaGDg9Rzw5PEG','CNvU','tLqOkIKGqvmGyW','CMnLid0GpW','DgLLCG','zhjVCfnJAgvTyq','z2v0','C2XPy2u','icaPoWOGicaG','BwfW','u0vmrunuienpvq','DhjHBNnHy3rPBW','ieLgievysvnuuW','nZC3mdKYogHeyuDtDG','C291CMnL','ksbmsu1jvca/','CMnLlcb0zxH0la','qvrfifzjuLrvqq','vKfmvuvticG/la','yxbWBhK','C2vHCMnO','yM0Ynq','zgu2msbYzw1VDG','mxH6uu5pvW','ifDirvjfia','A2v5D29Yzc1SBW','id8Sid8P','ChjLCgfYzq','zgLT','AM9PBG','zxH0laOGicaGia','u0vmrunuihnVDq','revmrvrfiezstW','ie9sia','igjTmJuO','y2fS','mtq0nZy1ntbyz3fzv2m','y2uSihrLEhqPia','Aw5PDfnJAgvTyq','uKrfuIbcwsbIBq','mJuO','cIaGicaGicaGDa'];_0x1e08=function(){return _0x149c64;};return _0x1e08();}const TABLE=_0x5750dc(0x97)+'s';function _0x3630(_0x3bffb4,_0xa424d6){_0x3bffb4=_0x3bffb4-(0xe6+0xa5a+-0x20*0x56);const _0x526f3e=_0x1e08();let _0x49fdd1=_0x526f3e[_0x3bffb4];if(_0x3630['OwNPxL']===undefined){var _0x190aeb=function(_0x427e0a){const _0x17257e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a738a='',_0x4bfa11='',_0x8fb810=_0x1a738a+_0x190aeb;for(let _0x379ce8=0x553+-0x1b96+-0x29*-0x8b,_0x9821df,_0xfeefa,_0x15a711=-0x26de+0x582+-0x4*-0x857;_0xfeefa=_0x427e0a['charAt'](_0x15a711++);~_0xfeefa&&(_0x9821df=_0x379ce8%(0x725*-0x1+-0x11a0+0xf*0x1a7)?_0x9821df*(-0x23d5*-0x1+0x1b73+0x4*-0xfc2)+_0xfeefa:_0xfeefa,_0x379ce8++%(0x2*-0x1e7+-0x1*-0x1d45+-0x517*0x5))?_0x1a738a+=_0x8fb810['charCodeAt'](_0x15a711+(0x1da2+0x1*-0x191b+-0x47d))-(-0x1*0x9f7+0x2*0xe78+-0x1*0x12ef)!==0x79*-0x11+-0x2c0+0xac9?String['fromCharCode'](0x16c3*-0x1+0x903+0xebf&_0x9821df>>(-(-0x271*-0xb+0xdd9+-0x28b2)*_0x379ce8&0xa3a+0x1a54*0x1+-0x2488)):_0x379ce8:0x1e7*-0x14+-0x4*-0x8ea+-0x9*-0x44){_0xfeefa=_0x17257e['indexOf'](_0xfeefa);}for(let _0x3e3367=-0x1*0x359+-0x25fe+0x2957,_0x3bc052=_0x1a738a['length'];_0x3e3367<_0x3bc052;_0x3e3367++){_0x4bfa11+='%'+('00'+_0x1a738a['charCodeAt'](_0x3e3367)['toString'](-0x3*0xaf7+0x1*-0x18a5+0x399a))['slice'](-(0x415+-0xcca*0x2+-0xf*-0x16f));}return decodeURIComponent(_0x4bfa11);};_0x3630['MvpCJZ']=_0x190aeb,_0x3630['lOqprZ']={},_0x3630['OwNPxL']=!![];}const _0x3c6d02=_0x526f3e[0x1d09*0x1+-0x215f+0x456],_0x2117ab=_0x3bffb4+_0x3c6d02,_0x501234=_0x3630['lOqprZ'][_0x2117ab];if(!_0x501234){const _0x42abee=function(_0x2da0d6){this['SZJaeX']=_0x2da0d6,this['mkZnPQ']=[0x267f+0x403*-0x7+-0xa69,-0x9d1+-0x3d*0x97+0x2dcc,0x2*-0xb9b+-0x21*-0x20+0x1316],this['vLUslI']=function(){return'newState';},this['YEBCDl']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['JdGzJP']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x42abee['prototype']['PkzBkT']=function(){const _0x39e8ee=new RegExp(this['YEBCDl']+this['JdGzJP']),_0x5c19bc=_0x39e8ee['test'](this['vLUslI']['toString']())?--this['mkZnPQ'][0x1*0x1762+0x26a0+0xd*-0x4c5]:--this['mkZnPQ'][0x9c0+0x97*0x2+-0xaee];return this['yVGmmy'](_0x5c19bc);},_0x42abee['prototype']['yVGmmy']=function(_0x182d72){if(!Boolean(~_0x182d72))return _0x182d72;return this['gmsFNP'](this['SZJaeX']);},_0x42abee['prototype']['gmsFNP']=function(_0x28a578){for(let _0x5193aa=0x42d*-0x1+0xf4*-0x1+0x521,_0x3e76a9=this['mkZnPQ']['length'];_0x5193aa<_0x3e76a9;_0x5193aa++){this['mkZnPQ']['push'](Math['round'](Math['random']())),_0x3e76a9=this['mkZnPQ']['length'];}return _0x28a578(this['mkZnPQ'][0xb7f*0x1+0x1*-0xfd9+0x45a*0x1]);},new _0x42abee(_0x3630)['PkzBkT'](),_0x49fdd1=_0x3630['MvpCJZ'](_0x49fdd1),_0x3630['lOqprZ'][_0x2117ab]=_0x49fdd1;}else _0x49fdd1=_0x501234;return _0x49fdd1;}function sanitizeQuery(_0x378863){const _0x1ed99d=_0x5750dc,_0x1a749b=_0x5750dc,_0x1f2e6f=_0x378863[_0x1ed99d(0xa9)+'e']()['split'](/[\s\W]+/u)[_0x1ed99d(0xa8)](_0x34abdb=>_0x34abdb[_0x1a749b(0xb1)]>=0x582+-0x1*0x1727+0x11a7&&_0x34abdb[_0x1a749b(0xb1)]<=-0x8d*0x20+0x2*0x14b+0xce*0x13);if(_0x1f2e6f[_0x1a749b(0xb1)]===0x2e2+0x13*-0x135+0x140d)return'';return _0x1f2e6f['map'](_0x107869=>'\x22'+_0x107869[_0x1a749b(0x90)](/"/g,'\x22\x22')+'\x22')[_0x1ed99d(0x81)](_0x1ed99d(0x85));}export class Fts5Provider{['name']='fts5-bm25';[_0x16d194(0x80)]=0x3b*0x7f+0x678+-0x51b*0x7;[_0x16d194(0xb7)]=_0x5750dc(0xcc)+_0x5750dc(0x87);async[_0x16d194(0xae)+'e'](){return!![];}[_0x5750dc(0x8a)](_0x22cb13){const _0x1efbae=_0x5750dc,_0x3be955=_0x5750dc;_0x22cb13[_0x1efbae(0xa7)]('\x0a\x20\x20\x20\x20\x20\x20CRE'+_0x3be955(0xc4)+_0x1efbae(0xa0)+_0x1efbae(0xaa)+'S\x20'+TABLE+(_0x1efbae(0x96)+_0x3be955(0xb2)+'\x20id\x20UNINDE'+_0x1efbae(0x92)+'\x20\x20\x20source\x20'+_0x1efbae(0xa2)+_0x1efbae(0x8d)+_0x1efbae(0x82)+_0x1efbae(0xb3)+_0x3be955(0xa5)+_0x1efbae(0xc9)+_0x3be955(0x9a)+_0x1efbae(0x9b)+_0x1efbae(0xbb)));}[_0x16d194(0xb8)](_0x473bb5){const _0x5520eb=_0x16d194,_0x42275e=_0x16d194;_0x473bb5['exec'](_0x5520eb(0x98)+_0x5520eb(0xbf)+'\x20'+TABLE+';');}async['indexChunk'+'s'](_0xa8c2cb,_0x58d6ce){const _0x40d82e=_0x16d194,_0x7c939e=_0x5750dc;if(_0x58d6ce[_0x40d82e(0xb1)]===0x1da2+0x1*-0x191b+-0x487)return;const _0x1bfec6=_0xa8c2cb[_0x40d82e(0xce)](_0x7c939e(0x91)+'O\x20'+TABLE+(_0x7c939e(0xa1)+_0x7c939e(0x89)+_0x7c939e(0xc5)+_0x7c939e(0xcd))),_0x53200d=_0xa8c2cb[_0x40d82e(0xbe)+'n'](_0x6f4c07=>{const _0x16bf11=_0x40d82e,_0x754246=_0x7c939e;for(const _0x57f411 of _0x6f4c07)_0x1bfec6[_0x16bf11(0xb4)](_0x57f411['id'],_0x57f411[_0x16bf11(0xc1)],_0x57f411[_0x16bf11(0xa3)]);});_0x53200d(_0x58d6ce);}['dropEntrie'+'sForSource'+'s'](_0x5ad4bd,_0x10d8fb){const _0x4076ef=_0x5750dc,_0x290eef=_0x5750dc;if(_0x10d8fb[_0x4076ef(0xb1)]===-0x1*0x9f7+0x2*0xe78+-0x1*0x12f9)return;const _0xd34027=_0x5ad4bd[_0x290eef(0xce)](_0x4076ef(0x84)+'M\x20'+TABLE+('\x20WHERE\x20sou'+_0x290eef(0xb6))),_0x5eac6e=_0x5ad4bd['transactio'+'n'](_0xd69cfb=>{const _0x2c0c51=_0x290eef;for(const _0x113d24 of _0xd69cfb)_0xd34027[_0x2c0c51(0xb4)](_0x113d24);});_0x5eac6e(_0x10d8fb);}async[_0x16d194(0xc7)](_0x484290,_0x5567d8,_0x8e9fde,_0x23b57b){const _0x23e59e=_0x16d194,_0x45a67f=_0x16d194,_0x3c5da9=sanitizeQuery(_0x5567d8);if(!_0x3c5da9)return[];let _0x2c07e7;try{_0x2c07e7=_0x484290[_0x23e59e(0xce)](_0x45a67f(0x83)+_0x23e59e(0xc3)+_0x23e59e(0x86)+TABLE+(_0x23e59e(0xa4)+_0x23e59e(0xad))+TABLE+_0x23e59e(0xcb)+TABLE+('\x20MATCH\x20?\x20O'+_0x45a67f(0x8b)+_0x23e59e(0x8c))+TABLE+_0x23e59e(0xc2))[_0x23e59e(0x93)](_0x3c5da9,_0x8e9fde*(0x79*-0x11+-0x2c0+0xacc));}catch{return[];}const _0x3fd015=_0x2c07e7[_0x23e59e(0xbc)](_0x18dcb1=>({'text':_0x18dcb1['text'],'source':_0x18dcb1[_0x45a67f(0xc1)],'score':(0x16c3*-0x1+0x903+0xdc1)/(-0x271*-0xb+0xdd9+-0x28b3+Math[_0x23e59e(0x95)](_0x18dcb1[_0x45a67f(0xc8)]))}))['filter'](_0x16a3c4=>_0x16a3c4[_0x23e59e(0x99)]>=_0x23b57b)[_0x23e59e(0xba)](0xa3a+0x1a54*0x1+-0x248e,_0x8e9fde);return _0x3fd015;}[_0x5750dc(0xac)+'es'](_0x135c6e){const _0x1a3b93=_0x16d194,_0x3cc09b=_0x16d194;try{const _0x34b995=_0x135c6e[_0x1a3b93(0xce)](_0x1a3b93(0xbd)+_0x1a3b93(0xb5)+_0x1a3b93(0x9d)+TABLE)[_0x3cc09b(0xb9)]();return _0x34b995?.['c']??0x1e7*-0x14+-0x4*-0x8ea+-0x9*-0x44;}catch{return-0x1*0x359+-0x25fe+0x2957;}}}
|
|
@@ -1,65 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Gemini Memory Provider — Google's gemini-embedding-001 (3072-dim).
|
|
3
|
-
*
|
|
4
|
-
* Uses the public Generative Language API. Free tier limits: 100 RPM, 30k TPM,
|
|
5
|
-
* 1500 RPD as of 2026-04. Batches up to 100 texts per request via
|
|
6
|
-
* batchEmbedContents. RETRIEVAL_DOCUMENT for index, RETRIEVAL_QUERY for search.
|
|
7
|
-
*/
|
|
8
|
-
import { config } from "../../config.js";
|
|
9
|
-
import { VectorProviderBase } from "./vector-base.js";
|
|
10
|
-
const MODEL = "gemini-embedding-001";
|
|
11
|
-
const BATCH_SIZE = 100;
|
|
12
|
-
export class GeminiProvider extends VectorProviderBase {
|
|
13
|
-
name = MODEL;
|
|
14
|
-
dim = 3072;
|
|
15
|
-
tier = "vector-cloud";
|
|
16
|
-
async isAvailable() {
|
|
17
|
-
return Boolean(config.apiKeys.google);
|
|
18
|
-
}
|
|
19
|
-
async embed(texts) {
|
|
20
|
-
const apiKey = config.apiKeys.google;
|
|
21
|
-
if (!apiKey)
|
|
22
|
-
throw new Error("GOOGLE_API_KEY not configured");
|
|
23
|
-
const out = [];
|
|
24
|
-
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
|
25
|
-
const batch = texts.slice(i, i + BATCH_SIZE);
|
|
26
|
-
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:batchEmbedContents?key=${apiKey}`, {
|
|
27
|
-
method: "POST",
|
|
28
|
-
headers: { "Content-Type": "application/json" },
|
|
29
|
-
body: JSON.stringify({
|
|
30
|
-
requests: batch.map(text => ({
|
|
31
|
-
model: `models/${MODEL}`,
|
|
32
|
-
content: { parts: [{ text }] },
|
|
33
|
-
taskType: "RETRIEVAL_DOCUMENT",
|
|
34
|
-
})),
|
|
35
|
-
}),
|
|
36
|
-
});
|
|
37
|
-
if (!res.ok) {
|
|
38
|
-
throw new Error(`Gemini embeddings API error: ${res.status} — ${await res.text()}`);
|
|
39
|
-
}
|
|
40
|
-
const data = (await res.json());
|
|
41
|
-
for (const e of data.embeddings)
|
|
42
|
-
out.push(e.values);
|
|
43
|
-
}
|
|
44
|
-
return out;
|
|
45
|
-
}
|
|
46
|
-
async embedQuery(text) {
|
|
47
|
-
const apiKey = config.apiKeys.google;
|
|
48
|
-
if (!apiKey)
|
|
49
|
-
throw new Error("GOOGLE_API_KEY not configured");
|
|
50
|
-
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:embedContent?key=${apiKey}`, {
|
|
51
|
-
method: "POST",
|
|
52
|
-
headers: { "Content-Type": "application/json" },
|
|
53
|
-
body: JSON.stringify({
|
|
54
|
-
model: `models/${MODEL}`,
|
|
55
|
-
content: { parts: [{ text }] },
|
|
56
|
-
taskType: "RETRIEVAL_QUERY",
|
|
57
|
-
}),
|
|
58
|
-
});
|
|
59
|
-
if (!res.ok) {
|
|
60
|
-
throw new Error(`Gemini embeddings API error: ${res.status} — ${await res.text()}`);
|
|
61
|
-
}
|
|
62
|
-
const data = (await res.json());
|
|
63
|
-
return data.embedding.values;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
1
|
+
const _0x239893=_0x4353,_0x417694=_0x4353;(function(_0x106984,_0x42c16f){const _0x559a85=_0x4353,_0x40b037=_0x4353,_0x4ebc6f=_0x106984();while(!![]){try{const _0x29d58c=parseInt(_0x559a85(0x141))/(0x6*0xa1+0x847+0x303*-0x4)*(-parseInt(_0x40b037(0x167))/(0x184*0xf+-0x1cde*0x1+0x624))+-parseInt(_0x559a85(0x16a))/(0x3df*-0x2+-0x2*0x10cf+0x77*0x59)*(parseInt(_0x40b037(0x14d))/(-0x79*0x41+0xc01+-0x1*-0x12bc))+parseInt(_0x559a85(0x156))/(0x1*-0x403+0x67e+-0x3*0xd2)*(-parseInt(_0x559a85(0x15f))/(-0x5*0x551+-0x1bc+-0x5ab*-0x5))+parseInt(_0x40b037(0x140))/(0x1*-0x3dd+-0x19e+0x582)+-parseInt(_0x40b037(0x146))/(-0x1*-0xdf1+0x135b*-0x1+0x572)*(parseInt(_0x40b037(0x168))/(-0x27b+-0xe0+0x2*0x1b2))+-parseInt(_0x40b037(0x14a))/(-0x1541*-0x1+-0x1d17+0x7e0)+parseInt(_0x559a85(0x165))/(-0xae7*-0x3+-0x52e+-0x1b7c)*(parseInt(_0x40b037(0x150))/(0xf94+-0x270e*-0x1+0x2*-0x1b4b));if(_0x29d58c===_0x42c16f)break;else _0x4ebc6f['push'](_0x4ebc6f['shift']());}catch(_0x5ee0ca){_0x4ebc6f['push'](_0x4ebc6f['shift']());}}}(_0x7bc6,0x5*0x1646e+0x2c147*0x1+0x5*-0xef44));function _0x4353(_0x3e5784,_0x4bc11a){_0x3e5784=_0x3e5784-(0x1*-0x205d+0x20dc+0xb5);const _0x16422f=_0x7bc6();let _0x1c8716=_0x16422f[_0x3e5784];if(_0x4353['dwIgat']===undefined){var _0x54ef7c=function(_0x3a799f){const _0x353eb5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ad058='',_0x326e30='',_0x29bac5=_0x2ad058+_0x54ef7c;for(let _0xf3e48e=0x1017+-0xdbe+-0x1*0x259,_0x2d91f8,_0x56a5dc,_0x1d384f=0xa*-0x2e3+-0x1ab+0x1e89;_0x56a5dc=_0x3a799f['charAt'](_0x1d384f++);~_0x56a5dc&&(_0x2d91f8=_0xf3e48e%(0x2*0x737+0xe7d+0x97*-0x31)?_0x2d91f8*(0x3e*0x8c+-0x1788+-0xa20)+_0x56a5dc:_0x56a5dc,_0xf3e48e++%(0x2*0x4df+0x297*-0x5+0x339))?_0x2ad058+=_0x29bac5['charCodeAt'](_0x1d384f+(0x7*-0x125+0x7*0x412+0x1471*-0x1))-(-0xad*-0x1e+0x3cf+-0x180b)!==-0x255+-0x1*0x18f3+0x1b48?String['fromCharCode'](-0x133c*-0x2+0x146*0x1c+-0x4921&_0x2d91f8>>(-(0xfc8+0xbb9*-0x1+-0x11*0x3d)*_0xf3e48e&-0x146*-0x15+0x1dea+-0x38a2)):_0xf3e48e:-0xd*-0x2fb+-0x9b5+0x3b*-0x7e){_0x56a5dc=_0x353eb5['indexOf'](_0x56a5dc);}for(let _0x1fc06f=-0x1757+-0x682+0x1*0x1dd9,_0x3f821c=_0x2ad058['length'];_0x1fc06f<_0x3f821c;_0x1fc06f++){_0x326e30+='%'+('00'+_0x2ad058['charCodeAt'](_0x1fc06f)['toString'](-0xac5+-0x1*-0x1a56+-0xbd*0x15))['slice'](-(-0x1822*-0x1+0xe*0x20e+-0xa*0x54a));}return decodeURIComponent(_0x326e30);};_0x4353['iEHewB']=_0x54ef7c,_0x4353['mJCvkM']={},_0x4353['dwIgat']=!![];}const _0x2de9f7=_0x16422f[-0x1*0x6da+-0x647*0x1+0xd21*0x1],_0x2acb4c=_0x3e5784+_0x2de9f7,_0x379cba=_0x4353['mJCvkM'][_0x2acb4c];if(!_0x379cba){const _0x162bf0=function(_0x2af8aa){this['rDnQpV']=_0x2af8aa,this['xwQfoJ']=[-0x1*0xedb+0x1*0x14ed+-0x611*0x1,-0x1*-0xa55+-0x8e*-0xb+0x1*-0x106f,0x7f5+0x5*0x8b+-0xaac*0x1],this['xTgWyI']=function(){return'newState';},this['Jxejcj']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['MalnZi']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x162bf0['prototype']['xdPkak']=function(){const _0x2db682=new RegExp(this['Jxejcj']+this['MalnZi']),_0x500b4e=_0x2db682['test'](this['xTgWyI']['toString']())?--this['xwQfoJ'][0xe*0xb1+0x1*-0x190f+0x166*0xb]:--this['xwQfoJ'][0x2a1*0x3+-0xc31*0x3+0xd8*0x22];return this['PPCydx'](_0x500b4e);},_0x162bf0['prototype']['PPCydx']=function(_0x36b81f){if(!Boolean(~_0x36b81f))return _0x36b81f;return this['cFtUoa'](this['rDnQpV']);},_0x162bf0['prototype']['cFtUoa']=function(_0x2faf9d){for(let _0x259fde=0x4e7+-0x232e+0x1e47,_0x40b3f9=this['xwQfoJ']['length'];_0x259fde<_0x40b3f9;_0x259fde++){this['xwQfoJ']['push'](Math['round'](Math['random']())),_0x40b3f9=this['xwQfoJ']['length'];}return _0x2faf9d(this['xwQfoJ'][-0x9*-0x1d0+0xddb*0x2+-0x2c06]);},new _0x162bf0(_0x4353)['xdPkak'](),_0x1c8716=_0x4353['iEHewB'](_0x1c8716),_0x4353['mJCvkM'][_0x2acb4c]=_0x1c8716;}else _0x1c8716=_0x379cba;return _0x1c8716;}const _0x2340b8=(function(){let _0x3e3633=!![];return function(_0x35ab45,_0x4659ed){const _0x5965f7=_0x3e3633?function(){const _0x3c22f1=_0x4353;if(_0x4659ed){const _0x2501d3=_0x4659ed[_0x3c22f1(0x148)](_0x35ab45,arguments);return _0x4659ed=null,_0x2501d3;}}:function(){};return _0x3e3633=![],_0x5965f7;};}()),_0x338416=_0x2340b8(this,function(){const _0x2c0ba0=_0x4353,_0x2e50ac=_0x4353;return _0x338416[_0x2c0ba0(0x138)]()[_0x2c0ba0(0x151)]('(((.+)+)+)'+'+$')[_0x2c0ba0(0x138)]()[_0x2e50ac(0x15e)+'r'](_0x338416)[_0x2e50ac(0x151)]('(((.+)+)+)'+'+$');});function _0x7bc6(){const _0x232c2d=['C2vHCMnO','DgLLCG','yxbWBgLJyxrPBW','ANnVBG','oMvTyMvKq29UDa','ndKXme10sMHrva','ChvZAa','yxbPs2v5CW','BMD1ywDLlMDVBW','C3rHDhvZ','B2rLBhmV','Dgv4Da','r2vTAw5PigvTyG','y29UC3rYDwn0BW','mJKYofvIuKPbCa','BI9QC29U','B25MAwD1CMvK','C2XPy2u','uKvuuKLfvKfmxW','C3rYAw5NAwz5','nZa2mdG3oezcD0fkqG','z29Vz2XL','mNrNwNrrCG','ode4ndzbqvzOr0u','zw1Izwq','mtqWnZi3AfLmA3z1','zw1IzwrrDwvYEq','BMfTzq','zwrKAw5NCYbbua','DMfSDwvZ','Dg9tDhjPBMC','DMvJDg9YlwnSBW','re9dvu1ftLq','oMjHDgnOrw1Izq','Bw9KzwXZlW','Ahr0Chm6lY9Nzq','ssbLCNjVCJOG','zenVBNrLBNrZpW','mZmXmtqYmhz2s3Loza','mZK0nJLgCvjuq2S','zw1IzwrKAw5N','z2XLyxbPCY5JBW','r09pr0Xfx0fqsq','Bs92mwjLDgeVBq','mta0ufvXtKXW','AxnbDMfPBgfIBa','yxbWBhK','BMvYyxrPDMvSyq','mZy3mJq3meL5rgDpra','iokaLca','zgLT','mZzXwufZuNy','x0TfwsbUB3qGyW','uvvfuLK','mJrJr2Plsu0'];_0x7bc6=function(){return _0x232c2d;};return _0x7bc6();}_0x338416();import{config}from'../../config.js';import{VectorProviderBase}from'./vector-base.js';const MODEL='gemini-emb'+'edding-001',BATCH_SIZE=-0x3d*0x7+0xd3+0x4*0x4f;export class GeminiProvider extends VectorProviderBase{[_0x239893(0x135)]=MODEL;[_0x239893(0x14c)]=0x17a1+0x4e*0x24+-0x59*0x41;[_0x239893(0x152)]=_0x239893(0x139)+'ud';async[_0x417694(0x147)+'e'](){const _0x52b61b=_0x417694,_0x27c667=_0x417694;return Boolean(config[_0x52b61b(0x158)][_0x27c667(0x166)]);}async[_0x417694(0x169)](_0x25e8cf){const _0x17e54b=_0x239893,_0x3ba4fe=_0x239893,_0x527678=config[_0x17e54b(0x158)]['google'];if(!_0x527678)throw new Error('GOOGLE_API'+_0x3ba4fe(0x14e)+_0x3ba4fe(0x161));const _0x33ffdf=[];for(let _0x3eaec9=0xc7c+0x1238+-0xc*0x28f;_0x3eaec9<_0x25e8cf['length'];_0x3eaec9+=BATCH_SIZE){const _0x595a2d=_0x25e8cf[_0x3ba4fe(0x162)](_0x3eaec9,_0x3eaec9+BATCH_SIZE),_0x3dd044=await fetch('https://ge'+_0x17e54b(0x149)+_0x3ba4fe(0x159)+'gleapis.co'+'m/v1beta/m'+_0x3ba4fe(0x15b)+MODEL+(_0x17e54b(0x13b)+_0x17e54b(0x13f)+'key=')+_0x527678,{'method':'POST','headers':{'Content-Type':_0x17e54b(0x153)+_0x17e54b(0x160)},'body':JSON[_0x17e54b(0x164)]({'requests':_0x595a2d['map'](_0x513513=>({'model':_0x3ba4fe(0x13c)+MODEL,'content':{'parts':[{'text':_0x513513}]},'taskType':_0x17e54b(0x163)+_0x17e54b(0x13a)}))})});if(!_0x3dd044['ok'])throw new Error(_0x3ba4fe(0x15d)+_0x3ba4fe(0x136)+_0x17e54b(0x13e)+_0x3dd044[_0x17e54b(0x15a)]+_0x17e54b(0x14b)+await _0x3dd044[_0x3ba4fe(0x15c)]());const _0x5b12be=await _0x3dd044[_0x17e54b(0x154)]();for(const _0x486eb7 of _0x5b12be['embeddings'])_0x33ffdf[_0x3ba4fe(0x157)](_0x486eb7[_0x3ba4fe(0x137)]);}return _0x33ffdf;}async[_0x417694(0x134)](_0x3455fa){const _0x1032ff=_0x417694,_0x42e808=_0x239893,_0x59036c=config['apiKeys'][_0x1032ff(0x166)];if(!_0x59036c)throw new Error(_0x1032ff(0x144)+_0x1032ff(0x14e)+'onfigured');const _0x150186=await fetch(_0x1032ff(0x13d)+_0x42e808(0x149)+_0x42e808(0x159)+_0x42e808(0x143)+_0x42e808(0x145)+_0x1032ff(0x15b)+MODEL+(_0x42e808(0x155)+'ent?key=')+_0x59036c,{'method':'POST','headers':{'Content-Type':_0x1032ff(0x153)+_0x42e808(0x160)},'body':JSON['stringify']({'model':_0x42e808(0x13c)+MODEL,'content':{'parts':[{'text':_0x3455fa}]},'taskType':_0x1032ff(0x163)+_0x1032ff(0x14f)})});if(!_0x150186['ok'])throw new Error(_0x1032ff(0x15d)+_0x42e808(0x136)+_0x1032ff(0x13e)+_0x150186[_0x1032ff(0x15a)]+'\x20—\x20'+await _0x150186['text']());const _0xd9d554=await _0x150186[_0x42e808(0x154)]();return _0xd9d554[_0x42e808(0x142)][_0x1032ff(0x137)];}}
|