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,74 +1 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import { execSync } from "child_process";
|
|
3
|
-
import dotenv from "dotenv";
|
|
4
|
-
import { DATA_DIR, ENV_FILE } from "../paths.js";
|
|
5
|
-
export function runAudit() {
|
|
6
|
-
const checks = [];
|
|
7
|
-
// `alvin-bot audit` runs in its own process (outside the main bot) and
|
|
8
|
-
// does NOT go through src/config.ts, so process.env is empty by default.
|
|
9
|
-
// We must load the .env ourselves or ALLOWED_USERS/WEB_PASSWORD checks
|
|
10
|
-
// will always report as "not set" — which silently contradicts the bot's
|
|
11
|
-
// actual runtime state (a bug up to v4.4.5).
|
|
12
|
-
if (fs.existsSync(ENV_FILE)) {
|
|
13
|
-
dotenv.config({ path: ENV_FILE });
|
|
14
|
-
}
|
|
15
|
-
// 1. .env file permissions
|
|
16
|
-
const envFile = ENV_FILE;
|
|
17
|
-
if (fs.existsSync(envFile)) {
|
|
18
|
-
const stat = fs.statSync(envFile);
|
|
19
|
-
const mode = (stat.mode & 0o777).toString(8);
|
|
20
|
-
checks.push(mode === "600"
|
|
21
|
-
? { name: ".env permissions", status: "PASS", message: `Mode ${mode} (secure)` }
|
|
22
|
-
: { name: ".env permissions", status: "WARN", message: `Mode ${mode} — should be 600. Run: chmod 600 ${envFile}` });
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
checks.push({ name: ".env file", status: "WARN", message: "No .env file found" });
|
|
26
|
-
}
|
|
27
|
-
// 2. Check for secrets in git
|
|
28
|
-
try {
|
|
29
|
-
const gitOutput = execSync("git diff HEAD --cached --diff-filter=ACM -- . | grep -iE '(api.key|token|password|secret)\\s*=' || true", { cwd: DATA_DIR, stdio: "pipe" }).toString();
|
|
30
|
-
checks.push(gitOutput.trim()
|
|
31
|
-
? { name: "Secrets in git", status: "FAIL", message: `Possible secrets in staged files:\n${gitOutput.trim()}` }
|
|
32
|
-
: { name: "Secrets in git", status: "PASS", message: "No secrets detected in staged files" });
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
checks.push({ name: "Secrets in git", status: "PASS", message: "Not a git repo or no staged changes" });
|
|
36
|
-
}
|
|
37
|
-
// 3. ALLOWED_USERS set
|
|
38
|
-
const allowedUsers = process.env.ALLOWED_USERS || "";
|
|
39
|
-
checks.push(allowedUsers
|
|
40
|
-
? { name: "ALLOWED_USERS", status: "PASS", message: `${allowedUsers.split(",").length} user(s) configured` }
|
|
41
|
-
: { name: "ALLOWED_USERS", status: "WARN", message: "Not set — anyone can message the bot" });
|
|
42
|
-
// 4. WEB_PASSWORD
|
|
43
|
-
const webPassword = process.env.WEB_PASSWORD || "";
|
|
44
|
-
checks.push(webPassword
|
|
45
|
-
? { name: "WEB_PASSWORD", status: "PASS", message: "Set" }
|
|
46
|
-
: { name: "WEB_PASSWORD", status: "WARN", message: "Not set — Web UI is unprotected" });
|
|
47
|
-
// 5. WEBHOOK_TOKEN
|
|
48
|
-
if (process.env.WEBHOOK_ENABLED === "true") {
|
|
49
|
-
checks.push(process.env.WEBHOOK_TOKEN
|
|
50
|
-
? { name: "WEBHOOK_TOKEN", status: "PASS", message: "Set" }
|
|
51
|
-
: { name: "WEBHOOK_TOKEN", status: "FAIL", message: "Webhooks enabled but no token set — anyone can trigger!" });
|
|
52
|
-
}
|
|
53
|
-
// 6. Data dir permissions
|
|
54
|
-
if (fs.existsSync(DATA_DIR)) {
|
|
55
|
-
const stat = fs.statSync(DATA_DIR);
|
|
56
|
-
const mode = (stat.mode & 0o777).toString(8);
|
|
57
|
-
checks.push(parseInt(mode, 8) <= 0o755
|
|
58
|
-
? { name: "Data dir permissions", status: "PASS", message: `${DATA_DIR} mode ${mode}` }
|
|
59
|
-
: { name: "Data dir permissions", status: "WARN", message: `${DATA_DIR} mode ${mode} — consider restricting` });
|
|
60
|
-
}
|
|
61
|
-
return checks;
|
|
62
|
-
}
|
|
63
|
-
export function formatAuditReport(checks) {
|
|
64
|
-
const icons = { PASS: "✅", WARN: "⚠️", FAIL: "❌" };
|
|
65
|
-
let report = "Security Audit Report\n" + "=".repeat(40) + "\n\n";
|
|
66
|
-
for (const c of checks) {
|
|
67
|
-
report += `${icons[c.status]} ${c.name}: ${c.message}\n`;
|
|
68
|
-
}
|
|
69
|
-
const fails = checks.filter(c => c.status === "FAIL").length;
|
|
70
|
-
const warns = checks.filter(c => c.status === "WARN").length;
|
|
71
|
-
report += `\n${"=".repeat(40)}\n`;
|
|
72
|
-
report += `${checks.length} checks: ${checks.length - fails - warns} passed, ${warns} warnings, ${fails} failures\n`;
|
|
73
|
-
return report;
|
|
74
|
-
}
|
|
1
|
+
(function(_0x451415,_0x362e3e){const _0x126c16=_0x38fd,_0xbd882a=_0x38fd,_0x47735c=_0x451415();while(!![]){try{const _0x363db3=-parseInt(_0x126c16(0x134))/(-0x2f+-0x1b95+0x1bc5)+-parseInt(_0x126c16(0x101))/(0xdc1+0xb5d+0x1*-0x191c)+-parseInt(_0xbd882a(0x128))/(0x54a+-0x14bd+0x7bb*0x2)*(-parseInt(_0x126c16(0x116))/(-0x355+0x11d+0x23c))+-parseInt(_0x126c16(0x140))/(0x1*-0x6c5+-0x136b*-0x2+-0x200c)*(parseInt(_0xbd882a(0x131))/(-0x26c4*0x1+0xdef+0x18db))+-parseInt(_0x126c16(0x102))/(0x34*0x92+-0x14ca+-0x8d7)*(parseInt(_0x126c16(0xfd))/(-0xa90+0xd*-0x1dd+0x22d1))+-parseInt(_0xbd882a(0x124))/(0x48*0x3f+0xee7*0x1+-0x2096*0x1)*(parseInt(_0x126c16(0x10f))/(0x359+-0x21f*-0x1+0x56e*-0x1))+parseInt(_0x126c16(0x113))/(0x51d*-0x1+0xd*0x215+-0x47*0x4f)*(parseInt(_0x126c16(0x115))/(0x1052+0xd92*-0x2+0x1a*0x6b));if(_0x363db3===_0x362e3e)break;else _0x47735c['push'](_0x47735c['shift']());}catch(_0x3eaac6){_0x47735c['push'](_0x47735c['shift']());}}}(_0x3b10,-0x33cae+0xcf19+0x21*0x2345));const _0x5c1de5=(function(){let _0x25f346=!![];return function(_0xfa9877,_0x57b3e0){const _0x4e05b4=_0x25f346?function(){const _0x47c524=_0x38fd;if(_0x57b3e0){const _0x5d0021=_0x57b3e0[_0x47c524(0x118)](_0xfa9877,arguments);return _0x57b3e0=null,_0x5d0021;}}:function(){};return _0x25f346=![],_0x4e05b4;};}()),_0x17f23e=_0x5c1de5(this,function(){const _0x558d9c=_0x38fd,_0x36fbd1=_0x38fd;return _0x17f23e['toString']()[_0x558d9c(0x11c)](_0x36fbd1(0x119)+'+$')['toString']()[_0x558d9c(0x144)+'r'](_0x17f23e)[_0x36fbd1(0x11c)]('(((.+)+)+)'+'+$');});function _0x38fd(_0x366f99,_0x129d21){_0x366f99=_0x366f99-(-0x243e+0x24f2+0x2*0x21);const _0x114d1d=_0x3b10();let _0x2fbba7=_0x114d1d[_0x366f99];if(_0x38fd['ssfkij']===undefined){var _0x157eec=function(_0x14141b){const _0x1e20a3='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x580c6c='',_0x41daab='',_0x1871fa=_0x580c6c+_0x157eec;for(let _0x373920=-0x79f*-0x1+0x1047+-0x17e6,_0x1e71d4,_0x1c867e,_0x3db3b1=0x2231*-0x1+0x1*-0x2166+-0x533*-0xd;_0x1c867e=_0x14141b['charAt'](_0x3db3b1++);~_0x1c867e&&(_0x1e71d4=_0x373920%(0x191a+0x12aa+0x46*-0xa0)?_0x1e71d4*(0x398+-0x1*0x79a+-0xda*-0x5)+_0x1c867e:_0x1c867e,_0x373920++%(-0xe1c+-0x11*0x189+0x1*0x2839))?_0x580c6c+=_0x1871fa['charCodeAt'](_0x3db3b1+(-0x8e9*0x1+0xdd2+0x1*-0x4df))-(-0x1383*-0x2+-0x8fe+-0x1dfe)!==-0x34e+0x2412*0x1+-0xc*0x2bb?String['fromCharCode'](0x1d23+-0x19*0x9b+-0xd01&_0x1e71d4>>(-(-0x19f2+0xa2f+0x16f*0xb)*_0x373920&0x21*0x120+0x10df+0x35f9*-0x1)):_0x373920:0x3*0x792+0x1560+0x156*-0x21){_0x1c867e=_0x1e20a3['indexOf'](_0x1c867e);}for(let _0x3a9654=-0xc75*-0x1+0xb7d+-0x17f2,_0x4720a3=_0x580c6c['length'];_0x3a9654<_0x4720a3;_0x3a9654++){_0x41daab+='%'+('00'+_0x580c6c['charCodeAt'](_0x3a9654)['toString'](-0x3b2+0x11da+-0xe18))['slice'](-(-0x1*0x2399+-0x61*0x3+-0x1*-0x24be));}return decodeURIComponent(_0x41daab);};_0x38fd['XXgThw']=_0x157eec,_0x38fd['AqakPI']={},_0x38fd['ssfkij']=!![];}const _0x5e6a9b=_0x114d1d[0x41*0xb+-0x17ae+0x14e3],_0x3c461d=_0x366f99+_0x5e6a9b,_0x296886=_0x38fd['AqakPI'][_0x3c461d];if(!_0x296886){const _0x121994=function(_0x113fb4){this['lnsVMW']=_0x113fb4,this['dGcOsW']=[0x16db+-0x197f+-0x2a5*-0x1,0x14d7+0x1805+-0x2cdc,0x290+0x1d4d+-0xa9f*0x3],this['QKhmTb']=function(){return'newState';},this['GQVUwF']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['eqAIFE']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x121994['prototype']['ekwpwI']=function(){const _0x127b5c=new RegExp(this['GQVUwF']+this['eqAIFE']),_0x1b36af=_0x127b5c['test'](this['QKhmTb']['toString']())?--this['dGcOsW'][0xf43+-0x8f9*-0x3+0x2a2d*-0x1]:--this['dGcOsW'][-0x4a*-0x49+0x3ea+-0x1*0x1904];return this['RHLGzx'](_0x1b36af);},_0x121994['prototype']['RHLGzx']=function(_0xfd9945){if(!Boolean(~_0xfd9945))return _0xfd9945;return this['bXvxAm'](this['lnsVMW']);},_0x121994['prototype']['bXvxAm']=function(_0x1b2c2e){for(let _0x2f7751=-0x10b*-0x5+-0x1e63*-0x1+-0x6*0x5ef,_0xe05acd=this['dGcOsW']['length'];_0x2f7751<_0xe05acd;_0x2f7751++){this['dGcOsW']['push'](Math['round'](Math['random']())),_0xe05acd=this['dGcOsW']['length'];}return _0x1b2c2e(this['dGcOsW'][-0x1a18+-0x573*-0x5+-0x127]);},new _0x121994(_0x38fd)['ekwpwI'](),_0x2fbba7=_0x38fd['XXgThw'](_0x2fbba7),_0x38fd['AqakPI'][_0x3c461d]=_0x2fbba7;}else _0x2fbba7=_0x296886;return _0x2fbba7;}_0x17f23e();import _0x10053c from'fs';import{execSync}from'child_process';import _0x3c1e28 from'dotenv';import{DATA_DIR,ENV_FILE}from'../paths.js';function _0x3b10(){const _0x27ee3f=['u2v0','zMLSDgvY','igzHAwX1CMvZcG','mdaG','mZuWD2TIv0PU','zxm6cG','tw9Kzsa','u2vJDxjPDhKGqq','ndmZmdm3yNfHsezn','zw52','mJa0AMPRB2LH','nta3ntaWAKTsB1bT','zw58CgfZC3DVCG','yxbWBhK','kcGOlISPkYKRkq','v0vcse9ps19ftG','CMvWzwf0','C2vHCMnO','lMvUDIbWzxjTAq','ig1LC3nHz2uGDa','BJOGy2HTB2qGnG','qujmruq','C3rHDfn5BMm','ig1VzguG','C2v0iokaLcbHBNLV','mZGZmZfRAKfSwKC','CIbYzxn0CMLJDa','ic0Tic4GFcbNCG','ihn0ywDLzcbJAa','m2TcvgXZtq','rKfjta','iokaLcbJB25ZAwrL','quXmt1Dfrf9vuW','ignOzwnRCZOG','DhjPBq','igDPDa','ueftuW','yw5Nzxm','otmWz0H6rfvt','v2vIAg9VA3mGzq','zxaGlwLficCOyq','mJCWotyZBgzqAMjT','CYO9jYb8Fcb0CG','C3rHz2vKigzPBa','zxjTAxnZAw9UCW','v0fstG','BgvUz3rO','rvjt','rufeic0Ty2fJAa','zwnYzxrZigLUia','ChvZAa','Aw4GC3rHz2vKia','CMvWBYbVCIbUBW','ndeZnvzAt0nlAW','BMuGy2fUihrYAq','Dg9tDhjPBMC','tM90ihnLDcdIGjqG','y29UC3rYDwn0BW','z2L0igrPzMyGsa','CgKUA2v5FhrVAW','tM8GC2vJCMv0CW','ihbHC3nLzcWG','DwrPDcbszxbVCG','lMvUDIbMAwXL','BguGzM91BMq','u2vJCMv0CYbPBG','s0vo','v0vcx1bbu1nxtW','icHZzwn1CMuP','v2vIifvjigLZia','zxHPC3rZu3LUyW','ug9ZC2LIBguGCW','zhXZzwnYzxqPxa','mJC2mdbtyLrKB0q','Bw9Kzq','C3nPB25Z','C3rHDhvZ','nti1mZHyAu5qDNm','mty4AvzLsxDP','ihDHCM5PBMDZla','iokaLcbZAg91BgqG','BwvZC2fNzq','v0vcse9ps19utW','z2DLCIe','Aw5N','ig5VihrVA2vUia','Dw5WCM90zwn0zq'];_0x3b10=function(){return _0x27ee3f;};return _0x3b10();}export function runAudit(){const _0x4866f7=_0x38fd,_0x2a3e66=_0x38fd,_0x444832=[];_0x10053c['existsSync'](ENV_FILE)&&_0x3c1e28['config']({'path':ENV_FILE});const _0x4c4c61=ENV_FILE;if(_0x10053c[_0x4866f7(0xfa)](_0x4c4c61)){const _0x3e5ec3=_0x10053c[_0x2a3e66(0x121)](_0x4c4c61),_0x56c5b1=(_0x3e5ec3[_0x2a3e66(0xfe)]&0x591*-0x6+0x1*0x247d+-0x118)[_0x2a3e66(0x142)](0x191a+0x12aa+0x12*-0x26e);_0x444832[_0x2a3e66(0x13d)](_0x56c5b1==='600'?{'name':'.env\x20permi'+_0x2a3e66(0xff),'status':_0x4866f7(0x12f),'message':_0x4866f7(0x111)+_0x56c5b1+_0x4866f7(0xf8)}:{'name':_0x4866f7(0x11d)+_0x4866f7(0xff),'status':_0x4866f7(0x138),'message':_0x2a3e66(0x111)+_0x56c5b1+(_0x2a3e66(0x104)+'be\x20600.\x20Ru'+_0x2a3e66(0x11f)+_0x4866f7(0x10e))+_0x4c4c61});}else _0x444832[_0x4866f7(0x13d)]({'name':_0x2a3e66(0x14a),'status':_0x4866f7(0x138),'message':'No\x20.env\x20fi'+_0x2a3e66(0x14b)});try{const _0x4b683e=execSync(_0x4866f7(0x145)+_0x4866f7(0x13b)+'ed\x20--diff-'+'filter=ACM'+_0x2a3e66(0x126)+_0x2a3e66(0x133)+_0x2a3e66(0x146)+_0x4866f7(0x117)+_0x2a3e66(0xfc)+_0x4866f7(0x135)+'ue',{'cwd':DATA_DIR,'stdio':'pipe'})[_0x4866f7(0x142)]();_0x444832[_0x2a3e66(0x13d)](_0x4b683e[_0x2a3e66(0x12d)]()?{'name':_0x4866f7(0x14c)+_0x2a3e66(0x12e),'status':_0x2a3e66(0x129),'message':_0x4866f7(0xfb)+_0x4866f7(0x13c)+_0x4866f7(0x136)+_0x2a3e66(0x110)+_0x4b683e[_0x4866f7(0x12d)]()}:{'name':_0x4866f7(0x14c)+'\x20git','status':_0x2a3e66(0x12f),'message':_0x4866f7(0x147)+'\x20detected\x20'+_0x2a3e66(0x13e)+'files'});}catch{_0x444832[_0x4866f7(0x13d)]({'name':_0x2a3e66(0x14c)+_0x4866f7(0x12e),'status':_0x2a3e66(0x12f),'message':'Not\x20a\x20git\x20'+_0x4866f7(0x13f)+_0x2a3e66(0x127)+_0x4866f7(0x130)});}const _0x3ebe60=process[_0x2a3e66(0x114)][_0x2a3e66(0x12b)+'ERS']||'';_0x444832[_0x2a3e66(0x13d)](_0x3ebe60?{'name':'ALLOWED_US'+_0x2a3e66(0x13a),'status':_0x4866f7(0x12f),'message':_0x3ebe60['split'](',')[_0x2a3e66(0x139)]+('\x20user(s)\x20c'+'onfigured')}:{'name':_0x4866f7(0x12b)+_0x2a3e66(0x13a),'status':'WARN','message':_0x4866f7(0x143)+'anyone\x20can'+_0x2a3e66(0x11e)+'he\x20bot'});const _0x1cd610=process[_0x2a3e66(0x114)][_0x4866f7(0xf7)+'RD']||'';_0x444832['push'](_0x1cd610?{'name':_0x2a3e66(0xf7)+'RD','status':_0x2a3e66(0x12f),'message':_0x2a3e66(0x10b)}:{'name':_0x2a3e66(0xf7)+'RD','status':_0x2a3e66(0x138),'message':_0x2a3e66(0x143)+_0x2a3e66(0xf9)+_0x2a3e66(0x10a)+'d'});process[_0x2a3e66(0x114)][_0x4866f7(0x11a)+_0x4866f7(0x120)]==='true'&&_0x444832['push'](process[_0x2a3e66(0x114)][_0x2a3e66(0x106)+'KEN']?{'name':_0x2a3e66(0x106)+_0x2a3e66(0xf6),'status':_0x4866f7(0x12f),'message':_0x4866f7(0x10b)}:{'name':_0x4866f7(0x106)+_0x4866f7(0xf6),'status':_0x4866f7(0x129),'message':_0x2a3e66(0x132)+'nabled\x20but'+_0x4866f7(0x109)+_0x4866f7(0x123)+_0x4866f7(0x141)+_0x2a3e66(0x107)});if(_0x10053c[_0x4866f7(0xfa)](DATA_DIR)){const _0x49c6a0=_0x10053c[_0x2a3e66(0x121)](DATA_DIR),_0x40af41=(_0x49c6a0[_0x2a3e66(0xfe)]&0x398+-0x1*0x79a+-0x35*-0x1d)[_0x4866f7(0x142)](-0xe1c+-0x11*0x189+0x1*0x283d);_0x444832[_0x2a3e66(0x13d)](parseInt(_0x40af41,-0x8e9*0x1+0xdd2+0x1*-0x4e1)<=-0x1383*-0x2+-0x8fe+-0x1c1b?{'name':'Data\x20dir\x20p'+_0x2a3e66(0x137),'status':_0x2a3e66(0x12f),'message':DATA_DIR+'\x20mode\x20'+_0x40af41}:{'name':'Data\x20dir\x20p'+_0x2a3e66(0x137),'status':_0x4866f7(0x138),'message':DATA_DIR+_0x2a3e66(0x122)+_0x40af41+(_0x2a3e66(0x12a)+_0x4866f7(0x125)+_0x4866f7(0x108))});}return _0x444832;}export function formatAuditReport(_0x34f3bc){const _0x33e56b=_0x38fd,_0x5ae4de=_0x38fd,_0xae7ce5={'PASS':'✅','WARN':'⚠️','FAIL':'❌'};let _0x3b7103=_0x33e56b(0x112)+_0x33e56b(0x149)+'t\x0a'+'='[_0x33e56b(0x11b)](-0x34e+0x2412*0x1+-0x4*0x827)+'\x0a\x0a';for(const _0x3db5ea of _0x34f3bc){_0x3b7103+=_0xae7ce5[_0x3db5ea['status']]+'\x20'+_0x3db5ea['name']+':\x20'+_0x3db5ea[_0x5ae4de(0x105)]+'\x0a';}const _0x4f173c=_0x34f3bc[_0x5ae4de(0x10c)](_0x466e38=>_0x466e38[_0x5ae4de(0x100)]==='FAIL')['length'],_0x3ee426=_0x34f3bc[_0x33e56b(0x10c)](_0x6f9605=>_0x6f9605[_0x33e56b(0x100)]===_0x5ae4de(0x138))[_0x33e56b(0x139)];return _0x3b7103+='\x0a'+'='['repeat'](0x1d23+-0x19*0x9b+-0xdd8)+'\x0a',_0x3b7103+=_0x34f3bc[_0x5ae4de(0x139)]+_0x5ae4de(0x12c)+(_0x34f3bc[_0x5ae4de(0x139)]-_0x4f173c-_0x3ee426)+_0x33e56b(0x148)+_0x3ee426+(_0x33e56b(0x103)+'\x20')+_0x4f173c+_0x33e56b(0x10d),_0x3b7103;}
|
|
@@ -1,272 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI-driven Self-Diagnosis (Self-Preservation Phase 2, feature 3I).
|
|
3
|
-
*
|
|
4
|
-
* Trigger model — IMPORTANT:
|
|
5
|
-
*
|
|
6
|
-
* 3I does NOT run at watchdog-brake time. The bot is mid-exit then;
|
|
7
|
-
* spawning a fresh process just to make one AI call would be heavy
|
|
8
|
-
* and racy. Instead, 3I runs at the next successful bot start:
|
|
9
|
-
* it scans ~/.alvin-bot/diagnostics/ for forensic bundles that don't
|
|
10
|
-
* yet have a sidecar .analysis.md file, runs AI analysis on each,
|
|
11
|
-
* writes the sidecar, and delivers a Telegram summary via 1D.
|
|
12
|
-
*
|
|
13
|
-
* User-visible consequence: when the bot recovers from a brake, the
|
|
14
|
-
* first thing it does after Pre-Flight is analyze why it crashed —
|
|
15
|
-
* the operator gets the diagnosis on their phone within ~30 s of
|
|
16
|
-
* the bot coming back up.
|
|
17
|
-
*
|
|
18
|
-
* Provider-agnostic — uses the active Provider's query() async generator,
|
|
19
|
-
* works for claude-sdk / codex-cli / groq / gemini / openai / offline-gemma4.
|
|
20
|
-
* The prompt is deliberately tight (~250 tokens base + bundle content,
|
|
21
|
-
* truncated to ~12 KB) so even small-context models can handle it.
|
|
22
|
-
*
|
|
23
|
-
* Output shape — we force a structured plain-text response (no JSON;
|
|
24
|
-
* JSON parsing reliability is unever across providers, especially with
|
|
25
|
-
* smaller models). The 5-line format is hard to mess up:
|
|
26
|
-
*
|
|
27
|
-
* HYPOTHESIS: ...
|
|
28
|
-
* ROOT_CAUSE_CATEGORY: ...
|
|
29
|
-
* REMEDIATION: ...
|
|
30
|
-
* CONFIDENCE: HIGH|MEDIUM|LOW
|
|
31
|
-
* EXPLANATION: ...
|
|
32
|
-
*
|
|
33
|
-
* Privacy: forensic bundles are already curated by 2F to exclude
|
|
34
|
-
* secrets (BOT_TOKEN, API keys); only whitelisted non-secret env vars
|
|
35
|
-
* are included. So the AI request contains: bot version, logs, env
|
|
36
|
-
* keys (non-secret), tool inventory, disk state. No tokens leave the
|
|
37
|
-
* machine.
|
|
38
|
-
*
|
|
39
|
-
* Auto-remediation policy (v1, intentionally conservative):
|
|
40
|
-
* - We NEVER auto-apply any remediation. The AI's REMEDIATION line
|
|
41
|
-
* is shown to the operator as a suggestion only.
|
|
42
|
-
* - Operator runs it manually if it looks right.
|
|
43
|
-
* - This will likely relax in a future release once we build
|
|
44
|
-
* confidence in the AI's track record per remediation category.
|
|
45
|
-
*
|
|
46
|
-
* Opt-out:
|
|
47
|
-
* ALVIN_DISABLE_SELF_DIAGNOSIS=true → skip 3I specifically
|
|
48
|
-
* ALVIN_DISABLE_SELF_PRESERVATION=true → skip ALL Phase-1/2
|
|
49
|
-
*/
|
|
50
|
-
import { existsSync, readFileSync, writeFileSync, readdirSync } from "fs";
|
|
51
|
-
import { join } from "path";
|
|
52
|
-
import { homedir } from "os";
|
|
53
|
-
import { emitCritical } from "./critical-notify.js";
|
|
54
|
-
const PROMPT_TEMPLATE = `You are an SRE assistant. An Alvin Bot instance hit a critical failure.
|
|
55
|
-
Below is the forensic dump. Read it, then respond in EXACTLY this 5-line format —
|
|
56
|
-
no markdown, no commentary, no extra lines:
|
|
57
|
-
|
|
58
|
-
HYPOTHESIS: <one short sentence: what likely went wrong>
|
|
59
|
-
ROOT_CAUSE_CATEGORY: <pick ONE: config-error | resource-exhaustion | external-failure | code-bug | environment-conflict | unknown>
|
|
60
|
-
REMEDIATION: <one shell command the operator can run, OR "no automated action available">
|
|
61
|
-
CONFIDENCE: <HIGH | MEDIUM | LOW>
|
|
62
|
-
EXPLANATION: <2-4 sentences explaining your reasoning, plain text>
|
|
63
|
-
|
|
64
|
-
--- FORENSIC DUMP ---
|
|
65
|
-
{BUNDLE_CONTENT}
|
|
66
|
-
--- END OF DUMP ---`;
|
|
67
|
-
function isDisabled() {
|
|
68
|
-
return (process.env.ALVIN_DISABLE_SELF_DIAGNOSIS === "true" ||
|
|
69
|
-
process.env.ALVIN_DISABLE_SELF_PRESERVATION === "true");
|
|
70
|
-
}
|
|
71
|
-
function parseAIResponse(text) {
|
|
72
|
-
const get = (key) => {
|
|
73
|
-
// ^KEY: ... up to next \n^KEY:|end. Multiline-safe.
|
|
74
|
-
const re = new RegExp(`^${key}:\\s*([\\s\\S]*?)(?=^(?:HYPOTHESIS|ROOT_CAUSE_CATEGORY|REMEDIATION|CONFIDENCE|EXPLANATION):|$)`, "m");
|
|
75
|
-
const m = text.match(re);
|
|
76
|
-
return m ? m[1].trim() : "";
|
|
77
|
-
};
|
|
78
|
-
const conf = get("CONFIDENCE").split(/\s+/)[0]?.toUpperCase() || "";
|
|
79
|
-
return {
|
|
80
|
-
hypothesis: get("HYPOTHESIS") || "(no hypothesis returned)",
|
|
81
|
-
rootCauseCategory: get("ROOT_CAUSE_CATEGORY") || "unknown",
|
|
82
|
-
remediation: get("REMEDIATION") || "(no remediation)",
|
|
83
|
-
confidence: (["HIGH", "MEDIUM", "LOW"].includes(conf) ? conf : "UNKNOWN"),
|
|
84
|
-
explanation: get("EXPLANATION") || "(no explanation)",
|
|
85
|
-
raw: text,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Truncate the forensic bundle to fit within small-context windows.
|
|
90
|
-
* Keep the first 2 KB (event detail, process state, env) and last 8 KB
|
|
91
|
-
* (recent logs, where the actual error usually surfaces).
|
|
92
|
-
*/
|
|
93
|
-
function truncateBundle(text, maxChars = 12_000) {
|
|
94
|
-
if (text.length <= maxChars)
|
|
95
|
-
return text;
|
|
96
|
-
const head = text.slice(0, 2000);
|
|
97
|
-
const tail = text.slice(-(maxChars - 2000 - 50));
|
|
98
|
-
return `${head}\n\n[... ${text.length - maxChars} chars elided ...]\n\n${tail}`;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Run AI analysis on a single forensic bundle. Returns null on opt-out,
|
|
102
|
-
* unparseable response, or provider failure. Side-effects: writes
|
|
103
|
-
* `<bundlePath>.analysis.md` sidecar with the formatted result.
|
|
104
|
-
*/
|
|
105
|
-
export async function analyzeBundle(bundlePath, registry, opts = {}) {
|
|
106
|
-
if (isDisabled())
|
|
107
|
-
return null;
|
|
108
|
-
if (!existsSync(bundlePath))
|
|
109
|
-
return null;
|
|
110
|
-
let provider, activeKey = "(unknown)";
|
|
111
|
-
try {
|
|
112
|
-
provider = registry.getActive();
|
|
113
|
-
activeKey = registry.getActiveKey();
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
if (!provider)
|
|
119
|
-
return null;
|
|
120
|
-
const t0 = Date.now();
|
|
121
|
-
const bundleRaw = readFileSync(bundlePath, "utf-8");
|
|
122
|
-
const bundleClipped = truncateBundle(bundleRaw);
|
|
123
|
-
const prompt = PROMPT_TEMPLATE.replace("{BUNDLE_CONTENT}", bundleClipped);
|
|
124
|
-
// Hard timeout — protects against a hung provider call wedging
|
|
125
|
-
// the bot startup forever. Stream may be aborted mid-flight.
|
|
126
|
-
const timeoutMs = opts.timeoutMs ?? 120_000;
|
|
127
|
-
const abortController = new AbortController();
|
|
128
|
-
const timer = setTimeout(() => abortController.abort(), timeoutMs);
|
|
129
|
-
let fullText = "";
|
|
130
|
-
try {
|
|
131
|
-
for await (const chunk of provider.query({
|
|
132
|
-
prompt,
|
|
133
|
-
systemPrompt: "You are a precise SRE assistant. Reply ONLY in the requested format.",
|
|
134
|
-
abortSignal: abortController.signal,
|
|
135
|
-
})) {
|
|
136
|
-
if (chunk.type === "text") {
|
|
137
|
-
if (chunk.delta)
|
|
138
|
-
fullText += chunk.delta;
|
|
139
|
-
else if (chunk.text)
|
|
140
|
-
fullText = chunk.text;
|
|
141
|
-
}
|
|
142
|
-
else if (chunk.type === "error") {
|
|
143
|
-
clearTimeout(timer);
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
else if (chunk.type === "done") {
|
|
147
|
-
if (chunk.text)
|
|
148
|
-
fullText = chunk.text;
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
clearTimeout(timer);
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
clearTimeout(timer);
|
|
158
|
-
if (!fullText.trim())
|
|
159
|
-
return null;
|
|
160
|
-
const parsed = parseAIResponse(fullText);
|
|
161
|
-
const result = {
|
|
162
|
-
...parsed,
|
|
163
|
-
durationMs: Date.now() - t0,
|
|
164
|
-
provider: activeKey,
|
|
165
|
-
};
|
|
166
|
-
// Write sidecar — overwrites if user re-runs analysis
|
|
167
|
-
try {
|
|
168
|
-
const sidecarPath = bundlePath.replace(/\.md$/, ".analysis.md");
|
|
169
|
-
writeFileSync(sidecarPath, formatAnalysis(result, bundlePath), { mode: 0o600 });
|
|
170
|
-
}
|
|
171
|
-
catch {
|
|
172
|
-
// Sidecar write failed — non-fatal, we still return the result
|
|
173
|
-
}
|
|
174
|
-
return result;
|
|
175
|
-
}
|
|
176
|
-
function formatAnalysis(r, bundlePath) {
|
|
177
|
-
return [
|
|
178
|
-
`# AI Self-Diagnosis`,
|
|
179
|
-
``,
|
|
180
|
-
`**Bundle:** \`${bundlePath}\``,
|
|
181
|
-
`**Generated:** ${new Date().toISOString()}`,
|
|
182
|
-
`**Provider:** ${r.provider}`,
|
|
183
|
-
`**Duration:** ${r.durationMs} ms`,
|
|
184
|
-
``,
|
|
185
|
-
`## Hypothesis`,
|
|
186
|
-
r.hypothesis,
|
|
187
|
-
``,
|
|
188
|
-
`## Root Cause Category`,
|
|
189
|
-
`\`${r.rootCauseCategory}\``,
|
|
190
|
-
``,
|
|
191
|
-
`## Suggested Remediation`,
|
|
192
|
-
`\`\`\`bash`,
|
|
193
|
-
r.remediation,
|
|
194
|
-
`\`\`\``,
|
|
195
|
-
`> **Note:** the bot does NOT auto-apply this. Run it yourself only if it makes sense.`,
|
|
196
|
-
``,
|
|
197
|
-
`## Confidence`,
|
|
198
|
-
`**${r.confidence}**`,
|
|
199
|
-
``,
|
|
200
|
-
`## Explanation`,
|
|
201
|
-
r.explanation,
|
|
202
|
-
``,
|
|
203
|
-
`---`,
|
|
204
|
-
``,
|
|
205
|
-
`### Raw AI response`,
|
|
206
|
-
`\`\`\``,
|
|
207
|
-
r.raw,
|
|
208
|
-
`\`\`\``,
|
|
209
|
-
``,
|
|
210
|
-
].join("\n");
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Find diagnostic bundles in ~/.alvin-bot/diagnostics/ that do NOT yet
|
|
214
|
-
* have a sidecar .analysis.md. Used by the startup scanner.
|
|
215
|
-
*/
|
|
216
|
-
function findUnanalyzedBundles() {
|
|
217
|
-
const dir = join(homedir(), ".alvin-bot", "diagnostics");
|
|
218
|
-
if (!existsSync(dir))
|
|
219
|
-
return [];
|
|
220
|
-
try {
|
|
221
|
-
return readdirSync(dir)
|
|
222
|
-
.filter((f) => f.endsWith(".md") && !f.endsWith(".analysis.md"))
|
|
223
|
-
.filter((f) => !existsSync(join(dir, f.replace(/\.md$/, ".analysis.md"))))
|
|
224
|
-
.map((f) => join(dir, f));
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
return [];
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Scan for unanalyzed bundles and run AI analysis on each. Designed
|
|
232
|
-
* to be called once at bot startup, in the background (non-blocking).
|
|
233
|
-
*
|
|
234
|
-
* Delivers one Telegram DM per analyzed bundle via the 1D channel,
|
|
235
|
-
* with the structured findings. Auto-deduplicates: a bundle with an
|
|
236
|
-
* existing sidecar is skipped.
|
|
237
|
-
*/
|
|
238
|
-
export async function runStartupAnalyzer(registry) {
|
|
239
|
-
if (isDisabled())
|
|
240
|
-
return;
|
|
241
|
-
if (!registry)
|
|
242
|
-
return;
|
|
243
|
-
const bundles = findUnanalyzedBundles();
|
|
244
|
-
if (bundles.length === 0)
|
|
245
|
-
return;
|
|
246
|
-
// Process oldest first (FIFO so the operator sees them in order)
|
|
247
|
-
bundles.sort();
|
|
248
|
-
console.log(`🧠 Self-diagnosis: ${bundles.length} unanalyzed bundle(s) found — analyzing...`);
|
|
249
|
-
for (const bundlePath of bundles) {
|
|
250
|
-
try {
|
|
251
|
-
const result = await analyzeBundle(bundlePath, registry);
|
|
252
|
-
if (!result) {
|
|
253
|
-
console.warn(` ⚠ ${bundlePath}: analysis returned no result (provider error or opt-out)`);
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
console.log(` ✓ ${bundlePath.split("/").pop()} → ${result.rootCauseCategory} (${result.confidence}, ${result.durationMs}ms via ${result.provider})`);
|
|
257
|
-
// Deliver via 1D — severity warn (informational), not critical
|
|
258
|
-
emitCritical({
|
|
259
|
-
category: "custom",
|
|
260
|
-
severity: "warn",
|
|
261
|
-
title: `AI diagnosis ready — ${result.rootCauseCategory} (${result.confidence} confidence)`,
|
|
262
|
-
detail: `Hypothesis: ${result.hypothesis}\n\n` +
|
|
263
|
-
`Explanation: ${result.explanation}\n\n` +
|
|
264
|
-
`Full analysis: ${bundlePath.replace(/\.md$/, ".analysis.md")}`,
|
|
265
|
-
suggestedAction: result.remediation,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
catch (err) {
|
|
269
|
-
console.warn(` ⚠ ${bundlePath}: analyzer threw — ${err instanceof Error ? err.message : String(err)}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
1
|
+
const _0x3d0bce=_0x334c,_0x383fcb=_0x334c;(function(_0x399bd0,_0x50daca){const _0x21600=_0x334c,_0x430bfa=_0x334c,_0x2e9b00=_0x399bd0();while(!![]){try{const _0x4ad774=-parseInt(_0x21600(0x1c9))/(-0x1*-0x4d5+0xac4+0x1f3*-0x8)*(parseInt(_0x21600(0x1b3))/(0x623+-0x97*0x1+0x58a*-0x1))+-parseInt(_0x21600(0x1e8))/(0x1*0x1df2+-0x19ed+0x36*-0x13)*(parseInt(_0x21600(0x1cf))/(0x6e*0x4a+-0x1372+0xc56*-0x1))+-parseInt(_0x21600(0x19e))/(-0x9cc+0x4*-0x703+0x25dd)+parseInt(_0x430bfa(0x1bf))/(-0x1cf*-0xf+-0x131+-0x19ea)*(-parseInt(_0x430bfa(0x1f1))/(0xdd3+0x1b8b+-0x2957))+parseInt(_0x21600(0x16c))/(0x2061+-0x1*0x21+-0x2038)*(parseInt(_0x430bfa(0x1f2))/(-0xf1*-0x14+0x13c9+-0x2694))+-parseInt(_0x430bfa(0x1f3))/(-0x1*0x172d+0x1d7*-0xf+-0x4*-0xcb4)+parseInt(_0x21600(0x1a6))/(-0x1e38+-0x12fd+0x1*0x3140);if(_0x4ad774===_0x50daca)break;else _0x2e9b00['push'](_0x2e9b00['shift']());}catch(_0x1666e8){_0x2e9b00['push'](_0x2e9b00['shift']());}}}(_0x3590,-0x1*-0x39f29+0x3*0x5096+0x1fd9*0x1));const _0x53dfae=(function(){let _0xd5237c=!![];return function(_0x1b7135,_0x3875ac){const _0x36267c=_0xd5237c?function(){const _0x3c0aec=_0x334c;if(_0x3875ac){const _0x47cf5a=_0x3875ac[_0x3c0aec(0x1aa)](_0x1b7135,arguments);return _0x3875ac=null,_0x47cf5a;}}:function(){};return _0xd5237c=![],_0x36267c;};}()),_0x3c01ce=_0x53dfae(this,function(){const _0x37d009=_0x334c,_0x38df73=_0x334c;return _0x3c01ce[_0x37d009(0x18d)]()[_0x38df73(0x1b8)](_0x38df73(0x1a8)+'+$')['toString']()['constructo'+'r'](_0x3c01ce)[_0x37d009(0x1b8)]('(((.+)+)+)'+'+$');});_0x3c01ce();import{existsSync,readFileSync,writeFileSync,readdirSync}from'fs';import{join}from'path';import{homedir}from'os';import{emitCritical}from'./critical-notify.js';const PROMPT_TEMPLATE='You\x20are\x20an'+_0x3d0bce(0x1b4)+_0x3d0bce(0x1c4)+_0x383fcb(0x1e1)+_0x3d0bce(0x20d)+_0x383fcb(0x1b0)+'al\x20failure'+'.\x0aBelow\x20is'+_0x383fcb(0x1fb)+_0x3d0bce(0x201)+_0x383fcb(0x1ce)+_0x3d0bce(0x198)+'d\x20in\x20EXACT'+_0x383fcb(0x1b2)+_0x383fcb(0x1ac)+_0x383fcb(0x183)+_0x3d0bce(0x1b5)+_0x383fcb(0x219)+_0x3d0bce(0x1ec)+_0x3d0bce(0x173)+_0x3d0bce(0x18a)+'\x20<one\x20shor'+_0x383fcb(0x1ed)+_0x383fcb(0x172)+'ely\x20went\x20w'+_0x3d0bce(0x215)+_0x383fcb(0x21a)+_0x383fcb(0x1d7)+_0x3d0bce(0x188)+_0x3d0bce(0x197)+_0x383fcb(0x1c5)+_0x383fcb(0x1d2)+_0x383fcb(0x1d8)+_0x383fcb(0x168)+_0x383fcb(0x194)+_0x3d0bce(0x16a)+_0x383fcb(0x17d)+_0x3d0bce(0x19f)+'known>\x0aREM'+_0x3d0bce(0x193)+_0x383fcb(0x202)+_0x3d0bce(0x1d4)+_0x3d0bce(0x1a3)+_0x3d0bce(0x18c)+_0x3d0bce(0x1e0)+'tomated\x20ac'+_0x3d0bce(0x204)+_0x383fcb(0x1df)+_0x3d0bce(0x180)+_0x383fcb(0x1ba)+'IUM\x20|\x20LOW>'+'\x0aEXPLANATI'+_0x383fcb(0x174)+_0x383fcb(0x192)+_0x3d0bce(0x1f5)+'your\x20reaso'+_0x383fcb(0x21b)+'n\x20text>\x0a\x0a-'+_0x383fcb(0x1fa)+_0x3d0bce(0x161)+'\x0a{BUNDLE_C'+_0x383fcb(0x1a0)+_0x383fcb(0x19d)+_0x383fcb(0x179);function isDisabled(){const _0xfb577f=_0x3d0bce,_0x37ea10=_0x3d0bce;return process[_0xfb577f(0x164)][_0x37ea10(0x1e6)+_0xfb577f(0x200)+_0x37ea10(0x1e9)]===_0xfb577f(0x1d1)||process[_0xfb577f(0x164)][_0xfb577f(0x1e6)+_0xfb577f(0x1f4)+_0xfb577f(0x1d0)+'N']==='true';}function parseAIResponse(_0x3f579c){const _0xbbc629=_0x3d0bce,_0x67a0c5=_0x383fcb,_0x1f502d=_0x37a796=>{const _0x52e62a=_0x334c,_0x3f7cd9=_0x334c,_0x5a5484=new RegExp('^'+_0x37a796+(':\x5cs*([\x5cs\x5cS'+']*?)(?=^(?'+':HYPOTHESI'+'S|ROOT_CAU'+_0x52e62a(0x1db)+_0x3f7cd9(0x186)+_0x52e62a(0x1ad)+'ENCE|EXPLA'+_0x3f7cd9(0x1ca)+')'),'m'),_0x536a46=_0x3f579c['match'](_0x5a5484);return _0x536a46?_0x536a46[-0x179*-0xb+0x3*-0xa42+0xe94][_0x3f7cd9(0x17b)]():'';},_0xf8c4b0=_0x1f502d(_0xbbc629(0x1b6))[_0xbbc629(0x216)](/\s+/)[-0x373*0xb+0x67*-0x1d+0xfe*0x32]?.['toUpperCas'+'e']()||'';return{'hypothesis':_0x1f502d(_0x67a0c5(0x184))||_0x67a0c5(0x163)+_0x67a0c5(0x1de)+_0xbbc629(0x1ef),'rootCauseCategory':_0x1f502d(_0x67a0c5(0x20c)+'_CATEGORY')||_0xbbc629(0x20e),'remediation':_0x1f502d(_0x67a0c5(0x17e)+'N')||_0x67a0c5(0x199)+_0xbbc629(0x209),'confidence':[_0xbbc629(0x1a7),_0x67a0c5(0x1eb),'LOW'][_0x67a0c5(0x1b7)](_0xf8c4b0)?_0xf8c4b0:_0x67a0c5(0x18b),'explanation':_0x1f502d('EXPLANATIO'+'N')||_0x67a0c5(0x189)+_0xbbc629(0x209),'raw':_0x3f579c};}function truncateBundle(_0xb4bc6b,_0x577d37=0x4c70+0x65*-0x49+0xc3*-0x1){const _0x207b60=_0x3d0bce,_0x26cc27=_0x383fcb;if(_0xb4bc6b[_0x207b60(0x20f)]<=_0x577d37)return _0xb4bc6b;const _0x295e6a=_0xb4bc6b['slice'](0x255a*0x1+0x1d77*-0x1+-0x7e3,-0x177e+-0x565*-0x5+0x1*0x455),_0x22b2e9=_0xb4bc6b[_0x26cc27(0x1ab)](-(_0x577d37-(0x2555+-0x52*-0x2+-0x1e29)-(-0x25fa+0x53*0x2f+0x16ef)));return _0x295e6a+_0x26cc27(0x1cd)+(_0xb4bc6b['length']-_0x577d37)+('\x20chars\x20eli'+_0x207b60(0x1a4))+_0x22b2e9;}export async function analyzeBundle(_0x389386,_0x1ce4cc,_0x5b0338={}){const _0x5ca947=_0x3d0bce,_0x11eb72=_0x383fcb;if(isDisabled())return null;if(!existsSync(_0x389386))return null;let _0x233db8,_0x427318=_0x5ca947(0x1fc);try{_0x233db8=_0x1ce4cc[_0x5ca947(0x1fe)](),_0x427318=_0x1ce4cc[_0x5ca947(0x1c3)+'ey']();}catch{return null;}if(!_0x233db8)return null;const _0x308d06=Date[_0x5ca947(0x191)](),_0x39e0f6=readFileSync(_0x389386,_0x11eb72(0x1f7)),_0x48472f=truncateBundle(_0x39e0f6),_0x3686c6=PROMPT_TEMPLATE['replace']('{BUNDLE_CO'+_0x5ca947(0x1bd),_0x48472f),_0x3fc7a1=_0x5b0338[_0x11eb72(0x1bc)]??0x1*-0x2dc8b+0x1*0x16af1+0x1*0x3465a,_0x453dda=new AbortController(),_0x59bd5c=setTimeout(()=>_0x453dda[_0x11eb72(0x1d9)](),_0x3fc7a1);let _0x38b212='';try{for await(const _0x10dd6c of _0x233db8[_0x5ca947(0x217)]({'prompt':_0x3686c6,'systemPrompt':_0x11eb72(0x177)+_0x5ca947(0x207)+_0x11eb72(0x19a)+_0x11eb72(0x175)+_0x5ca947(0x20a)+'\x20requested'+_0x5ca947(0x1ff),'abortSignal':_0x453dda[_0x5ca947(0x1bb)]})){if(_0x10dd6c[_0x5ca947(0x1c0)]==='text'){if(_0x10dd6c[_0x5ca947(0x214)])_0x38b212+=_0x10dd6c[_0x11eb72(0x214)];else{if(_0x10dd6c[_0x5ca947(0x1f8)])_0x38b212=_0x10dd6c[_0x11eb72(0x1f8)];}}else{if(_0x10dd6c[_0x5ca947(0x1c0)]===_0x5ca947(0x16e))return clearTimeout(_0x59bd5c),null;else{if(_0x10dd6c[_0x11eb72(0x1c0)]===_0x11eb72(0x1be)){if(_0x10dd6c[_0x5ca947(0x1f8)])_0x38b212=_0x10dd6c[_0x11eb72(0x1f8)];break;}}}}}catch{return clearTimeout(_0x59bd5c),null;}clearTimeout(_0x59bd5c);if(!_0x38b212[_0x5ca947(0x17b)]())return null;const _0x503567=parseAIResponse(_0x38b212),_0x5f555a={..._0x503567,'durationMs':Date[_0x11eb72(0x191)]()-_0x308d06,'provider':_0x427318};try{const _0x13c50a=_0x389386[_0x11eb72(0x170)](/\.md$/,_0x11eb72(0x187)+'md');writeFileSync(_0x13c50a,formatAnalysis(_0x5f555a,_0x389386),{'mode':0x180});}catch{}return _0x5f555a;}function _0x334c(_0x3e6f8b,_0x1b9714){_0x3e6f8b=_0x3e6f8b-(0x105+0xb2d*-0x1+0x1*0xb89);const _0x3b877e=_0x3590();let _0x4d4bd0=_0x3b877e[_0x3e6f8b];if(_0x334c['NeVIUJ']===undefined){var _0x5a1cf0=function(_0x277ba5){const _0x3cb7cc='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x477c0b='',_0x46f615='',_0x9da60d=_0x477c0b+_0x5a1cf0;for(let _0x5be764=0x1d5a+0xb5*-0x9+-0x16fd,_0x35567e,_0x51f55c,_0x677ef9=-0x179*-0xb+0x3*-0xa42+0xe93;_0x51f55c=_0x277ba5['charAt'](_0x677ef9++);~_0x51f55c&&(_0x35567e=_0x5be764%(-0x373*0xb+0x67*-0x1d+0x31a*0x10)?_0x35567e*(0x1fda+0xc0*-0x10+0x139a*-0x1)+_0x51f55c:_0x51f55c,_0x5be764++%(0x255a*0x1+0x1d77*-0x1+-0x7df))?_0x477c0b+=_0x9da60d['charCodeAt'](_0x677ef9+(-0x177e+-0x565*-0x5+0x1*-0x371))-(0x2555+-0x52*-0x2+-0x25ef)!==-0x25fa+0x53*0x2f+0x16bd?String['fromCharCode'](0x2*-0xf43+0x1*0xf20+0x1*0x1065&_0x35567e>>(-(0x2304+0x1*0x6e5+0x1*-0x29e7)*_0x5be764&0x4*-0x70a+0x1f*-0x89+0x2cc5)):_0x5be764:0x2ed*-0x9+0x687+-0x5*-0x3f6){_0x51f55c=_0x3cb7cc['indexOf'](_0x51f55c);}for(let _0x1d7bb3=-0xaa5+-0x4*-0x1d2+0x1*0x35d,_0x420500=_0x477c0b['length'];_0x1d7bb3<_0x420500;_0x1d7bb3++){_0x46f615+='%'+('00'+_0x477c0b['charCodeAt'](_0x1d7bb3)['toString'](0x1*0x859+0x1426*0x1+0xfb*-0x1d))['slice'](-(0x2709+-0x1941+-0x2*0x6e3));}return decodeURIComponent(_0x46f615);};_0x334c['TMaCIm']=_0x5a1cf0,_0x334c['MrEEso']={},_0x334c['NeVIUJ']=!![];}const _0x1c3f00=_0x3b877e[0x37+0x4*-0x37e+0xdc1],_0x52137e=_0x3e6f8b+_0x1c3f00,_0x27da8b=_0x334c['MrEEso'][_0x52137e];if(!_0x27da8b){const _0xee320d=function(_0x4962d4){this['KBAgog']=_0x4962d4,this['zyUKnk']=[-0x21c5+0x720+0x1aa6,-0x1*0x2659+-0x3*0x7bb+-0x1ec5*-0x2,0x76*-0x27+-0x636*-0x4+-0x6de],this['EnxWpn']=function(){return'newState';},this['ivIvXF']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['ubFmHF']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xee320d['prototype']['fbJmYx']=function(){const _0x365608=new RegExp(this['ivIvXF']+this['ubFmHF']),_0x4a7cb1=_0x365608['test'](this['EnxWpn']['toString']())?--this['zyUKnk'][0x29b+0x1*0x10df+-0x1379]:--this['zyUKnk'][0x1a49*-0x1+-0xe3d+0x2886];return this['kgrVnp'](_0x4a7cb1);},_0xee320d['prototype']['kgrVnp']=function(_0x50081b){if(!Boolean(~_0x50081b))return _0x50081b;return this['hzuXzP'](this['KBAgog']);},_0xee320d['prototype']['hzuXzP']=function(_0x2f6b2b){for(let _0x26205f=-0x29c*0xd+0x23*-0x23+-0x1b*-0x16f,_0x1057c2=this['zyUKnk']['length'];_0x26205f<_0x1057c2;_0x26205f++){this['zyUKnk']['push'](Math['round'](Math['random']())),_0x1057c2=this['zyUKnk']['length'];}return _0x2f6b2b(this['zyUKnk'][0x3a5*0x2+0x14a9+-0x1bf3]);},new _0xee320d(_0x334c)['fbJmYx'](),_0x4d4bd0=_0x334c['TMaCIm'](_0x4d4bd0),_0x334c['MrEEso'][_0x52137e]=_0x4d4bd0;}else _0x4d4bd0=_0x27da8b;return _0x4d4bd0;}function formatAnalysis(_0x28945c,_0x5916ef){const _0x15ad58=_0x383fcb,_0x346fa9=_0x383fcb;return['#\x20AI\x20Self-'+'Diagnosis','',_0x15ad58(0x178)+_0x346fa9(0x213)+_0x5916ef+'`',_0x346fa9(0x1f9)+_0x346fa9(0x18f)+new Date()[_0x15ad58(0x210)+'g'](),_0x346fa9(0x1b9)+_0x346fa9(0x176)+_0x28945c[_0x15ad58(0x1e4)],_0x346fa9(0x20b)+_0x15ad58(0x176)+_0x28945c[_0x346fa9(0x195)]+_0x15ad58(0x16f),'',_0x346fa9(0x1d6)+_0x346fa9(0x1cc),_0x28945c[_0x346fa9(0x171)],'',_0x346fa9(0x19b)+_0x346fa9(0x206)+'ry','`'+_0x28945c[_0x346fa9(0x1dd)+'ategory']+'`','',_0x15ad58(0x18e)+_0x346fa9(0x16d)+_0x15ad58(0x190),_0x15ad58(0x162),_0x28945c[_0x15ad58(0x208)+'n'],_0x15ad58(0x1a5),_0x346fa9(0x166)+_0x346fa9(0x1da)+_0x15ad58(0x1a2)+_0x346fa9(0x1e5)+'this.\x20Run\x20'+_0x15ad58(0x1c1)+'f\x20only\x20if\x20'+'it\x20makes\x20s'+_0x15ad58(0x1fd),'',_0x346fa9(0x1a9)+'nce','**'+_0x28945c['confidence']+'**','',_0x346fa9(0x218)+'tion',_0x28945c[_0x15ad58(0x165)+'n'],'','---','','###\x20Raw\x20AI'+_0x346fa9(0x211),_0x346fa9(0x1a5),_0x28945c[_0x15ad58(0x1cb)],_0x346fa9(0x1a5),'']['join']('\x0a');}function findUnanalyzedBundles(){const _0x1440c9=_0x3d0bce,_0x3460a2=_0x383fcb,_0x28601c=join(homedir(),_0x1440c9(0x17f),_0x3460a2(0x17c)+'s');if(!existsSync(_0x28601c))return[];try{return readdirSync(_0x28601c)['filter'](_0x2ff3b9=>_0x2ff3b9[_0x1440c9(0x205)]('.md')&&!_0x2ff3b9[_0x3460a2(0x205)](_0x1440c9(0x187)+'md'))[_0x3460a2(0x1e2)](_0x1ea43a=>!existsSync(join(_0x28601c,_0x1ea43a[_0x1440c9(0x170)](/\.md$/,'.analysis.'+'md'))))[_0x3460a2(0x1af)](_0x2f62ac=>join(_0x28601c,_0x2f62ac));}catch{return[];}}function _0x3590(){const _0x117fca=['zs1LEgHHDxn0Aq','icaG4PYtia','ignVBw1HBMqGDa','y3vZDg9T','iYmGshLWB3rOzq','ruDpuLK6idXWAq','B24GFcbLEhrLCG','ywjVCNq','kIb0AguGyM90ia','u0vFq0furuDpuG','ihrOCMv3iokaLca','CM9VDenHDxnLqW','zxnPCYbYzxr1CG','ywjSzsi+cKnptG','ie9sicjUBYbHDq','BhzPBIbcB3qGAq','zMLSDgvY','icaG4PQGia','ChjVDMLKzxi','DxrVlwfWCgX5ia','quXwsu5FreLtqq','ignVBMzPzgvUyW','mJm0odfKD1fPwK4','sufhtK9tsvm','rNvSBcbHBMfSEq','tuvesvvn','lcbUBYbLEhrYyq','DcbZzw50zw5Jzq','khbYB3zPzgvYia','BMvKkq','z25VC2LZoIa','ntmZne1nzLLeuW','mJqZmti2t1j6DwL1','mtm4otC5mhjPAw9zDq','qKXfx1nftezFua','EhbSywLUAw5Nia','Bg9N','DxrMltG','Dgv4Da','kIPhzw5LCMf0zq','ls0GrK9sru5tsq','ihrOzsbMB3jLBG','khvUA25VD24P','zw5Zzs4','z2v0qwn0AxzL','igzVCM1HDc4','qKXfx1nftezFra','C2LJigr1BxaUia','pg9UzsbZAgvSBa','8j+NOcbtzwXMlwrPyq','DgLVBIbHDMfPBa','zw5KC1DPDgG','DxnLienHDgvNBW','ChjLy2LZzsbtuG','CMvTzwrPyxrPBW','yxrPB24P','tKXzigLUihrOzq','kIPeDxjHDgLVBG','uK9pvf9dqvvtrq','BNn0yw5JzsbOAq','Dw5RBM93BG','BgvUz3rO','Dg9ju09tDhjPBG','ihjLC3bVBNnL','BxmGDMLHia','kIbG','zgvSDge','CM9UzZ4kuK9pva','C3bSAxq','CxvLCNK','iYmGrxHWBgfUyq','y29TBwvUDgfYEq','x0nbvvnfx0nbva','BMLUzYWGCgXHAq','qYbevu1qic0Tlq','ygbGyMfZAa','kg5VigH5Cg90Aa','zw52','zxHWBgfUyxrPBW','pIaQkK5VDgu6kG','C29YDa','BMfSlwzHAwX1CG','BwvZC2fNzq','DwCGFcbLBNzPCG','y29UzMLKzw5Jzq','otzKCuPPt0q','zwqGuMvTzwrPyq','zxjYB3i','ig1Z','CMvWBgfJzq','AhLWB3rOzxnPCW','oIb3Agf0igXPAW','igXPBMvZoGOksa','t046idWYltqGCW','Dc4GuMvWBhKGtW','oIOQia','ww91igfYzsbHia','kIPcDw5KBgu6kG','vu1qic0Tlq','D2fYBG','DhjPBq','zgLHz25VC3rPyW','B25Tzw50lwnVBG','uKvnrurjqvrjtW','lMfSDMLUlwjVDa','rKLeru5drtOGpa','ihvUyw5HBhL6zq','Cg9W','DcdIGjqkBM8GBwfY','sfLqt1rirvnjuW','oIbHBMfSExPLCG','wxXsru1freLbva','lMfUywX5C2LZlG','y2SGt05foIbJBW','kg5Vigv4CgXHBG','wvbpveHfu0LtoG','vu5ltK9xtG','CIbJyw4GCNvUla','Dg9tDhjPBMC','iYmGu3vNz2vZDa','zdOQkIa','DgLVBG','BM93','zw50zw5JzxmGzq','rurjqvrjt046ia','zsb8ignVzguTyG','zhvYyxrPB25nCW','AxmGCMvHzhKG4Ocu','BMzPzY1LCNjVCG','AgvUihjLC3bVBG','kg5VihjLBwvKAq','rsbHC3nPC3rHBG','iYmGuM9VDcbdyq','C2LZoIa','lsbftKqGt0yGra','mZaXnZqZmgPSy3bhuq','zMXPy3qGFcb1BG','t05uru5uFqOTlq','iokgKIa','zg9LCYbot1qGyq','AguGB3bLCMf0BW','zgvKic4UlL0kcG','ygbG','mtKWmdmWmZLoB3fwruS','seLhsa','kcGOlISPkYKRkq','iYmGq29UzMLKzq','yxbWBhK','C2XPy2u','BgLUzsbMB3jTyq','su9oFenptKzjra','quKGzgLHz25VCW','BwfW','DcbHignYAxrPyW','shLWB3rOzxnPCW','tfKGDgHPCYa1lq','ntq2mMLXu1z0DG','ifnsrsbHC3nPCW','A2rVD24Sig5Via','q09orKLeru5drq','Aw5JBhvKzxm','C2vHCMnO','kIPqCM92AwrLCG','seLhscb8ie1fra','C2LNBMfS','DgLTzw91De1Z','tLrftLr9','zg9Uzq','mJG3nfHWu3z2sa','DhLWzq','AxqGEw91CNnLBa','ChqTB3v0kq','z2v0qwn0AxzLsW','DgfUDc4Gqw4Gqq','ihWGCMvZB3vYyW','zcbIDw5KBguOCW','yw5HBhL6Aw5NlG','rxHWBgfUyxrPBW','mJe2qKXHuufN','tKfusu9oktP8ja','CMf3','C2LZ','cGPBlI4Uia','uMvHzcbPDcWGDa','mJrjB0vovLq','uKvtrvjwqvrjtW','Dhj1zq'];_0x3590=function(){return _0x117fca;};return _0x3590();}export async function runStartupAnalyzer(_0x4b77d3){const _0x19b13d=_0x383fcb,_0x2d27a4=_0x383fcb;if(isDisabled())return;if(!_0x4b77d3)return;const _0x38e745=findUnanalyzedBundles();if(_0x38e745[_0x19b13d(0x20f)]===0x2304+0x1*0x6e5+0x1*-0x29e9)return;_0x38e745[_0x19b13d(0x167)](),console[_0x2d27a4(0x1f6)](_0x19b13d(0x203)+_0x2d27a4(0x1f0)+_0x38e745[_0x19b13d(0x20f)]+(_0x2d27a4(0x181)+_0x19b13d(0x1c6)+')\x20found\x20—\x20'+_0x19b13d(0x1c7)+'..'));for(const _0xc4ed72 of _0x38e745){try{const _0x678ae3=await analyzeBundle(_0xc4ed72,_0x4b77d3);if(!_0x678ae3){console['warn'](_0x2d27a4(0x1e3)+_0xc4ed72+(':\x20analysis'+'\x20returned\x20'+'no\x20result\x20'+_0x19b13d(0x1ee)+'error\x20or\x20o'+_0x2d27a4(0x1c2)));continue;}console[_0x2d27a4(0x1f6)](_0x2d27a4(0x1d3)+_0xc4ed72[_0x2d27a4(0x216)]('/')[_0x19b13d(0x182)]()+_0x19b13d(0x1a1)+_0x678ae3['rootCauseC'+'ategory']+'\x20('+_0x678ae3[_0x19b13d(0x16b)]+',\x20'+_0x678ae3[_0x19b13d(0x195)]+_0x2d27a4(0x212)+_0x678ae3[_0x2d27a4(0x1e4)]+')'),emitCritical({'category':_0x2d27a4(0x1d5),'severity':_0x2d27a4(0x17a),'title':_0x19b13d(0x1ae)+_0x2d27a4(0x196)+'\x20'+_0x678ae3['rootCauseC'+'ategory']+'\x20('+_0x678ae3[_0x19b13d(0x16b)]+(_0x19b13d(0x1e7)+'e)'),'detail':_0x19b13d(0x1b1)+':\x20'+_0x678ae3[_0x2d27a4(0x171)]+'\x0a\x0a'+(_0x2d27a4(0x1c8)+'n:\x20'+_0x678ae3[_0x2d27a4(0x165)+'n']+'\x0a\x0a')+(_0x2d27a4(0x1ea)+_0x19b13d(0x19c)+_0xc4ed72[_0x19b13d(0x170)](/\.md$/,_0x19b13d(0x187)+'md')),'suggestedAction':_0x678ae3['remediatio'+'n']});}catch(_0x3862aa){console[_0x2d27a4(0x17a)]('\x20\x20\x20⚠\x20'+_0xc4ed72+(_0x2d27a4(0x185)+_0x2d27a4(0x1dc))+(_0x3862aa instanceof Error?_0x3862aa[_0x2d27a4(0x169)]:String(_0x3862aa)));}}}
|
|
@@ -1,129 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Self-Search — Unified search across all of Alvin-Bot's knowledge.
|
|
3
|
-
*
|
|
4
|
-
* Combines three search strategies:
|
|
5
|
-
* 1. Semantic (embeddings) — finds memories AND assets by meaning
|
|
6
|
-
* 2. Capability (skills) — finds matching skills by keyword triggers
|
|
7
|
-
* 3. Keyword fallback — finds assets by filename/category match
|
|
8
|
-
*
|
|
9
|
-
* Used by:
|
|
10
|
-
* - CLI: `alvin-bot search "query"` (for SDK agents to call via Bash)
|
|
11
|
-
* - Internal: personality.ts for prompt enrichment
|
|
12
|
-
*/
|
|
13
|
-
import { searchMemory } from "./embeddings.js";
|
|
14
|
-
import { matchSkills } from "./skills.js";
|
|
15
|
-
import { loadAssetIndex } from "./asset-index.js";
|
|
16
|
-
// ── Search Strategies ───────────────────────────────────
|
|
17
|
-
/**
|
|
18
|
-
* Semantic search via embeddings (memories + assets).
|
|
19
|
-
* Results from asset sources get type "asset", others get "memory".
|
|
20
|
-
*/
|
|
21
|
-
async function searchSemantic(query, topK, minScore) {
|
|
22
|
-
try {
|
|
23
|
-
const results = await searchMemory(query, topK, minScore);
|
|
24
|
-
const index = loadAssetIndex();
|
|
25
|
-
// Build a lookup map for absolute paths
|
|
26
|
-
const assetPathMap = new Map();
|
|
27
|
-
for (const a of index.assets) {
|
|
28
|
-
assetPathMap.set(`assets/${a.path}`, a.absolutePath);
|
|
29
|
-
}
|
|
30
|
-
return results.map(r => {
|
|
31
|
-
const isAsset = r.source.startsWith("assets/");
|
|
32
|
-
return {
|
|
33
|
-
type: isAsset ? "asset" : "memory",
|
|
34
|
-
text: r.text.length > 200 ? r.text.slice(0, 200) + "..." : r.text,
|
|
35
|
-
source: r.source,
|
|
36
|
-
score: r.score,
|
|
37
|
-
absolutePath: isAsset ? assetPathMap.get(r.source) : undefined,
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
// Embeddings unavailable — return empty (keyword fallback will catch)
|
|
43
|
-
return [];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Capability search — match skills by their trigger keywords.
|
|
48
|
-
*/
|
|
49
|
-
function searchCapabilities(query) {
|
|
50
|
-
const matched = matchSkills(query, 3);
|
|
51
|
-
return matched.map(s => ({
|
|
52
|
-
type: "capability",
|
|
53
|
-
text: `Skill: ${s.name} — ${s.description}`,
|
|
54
|
-
source: `skills/${s.id}`,
|
|
55
|
-
score: 0.5,
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Keyword fallback — match assets by filename, category, or description.
|
|
60
|
-
* Used when embeddings are unavailable or as a supplement.
|
|
61
|
-
*/
|
|
62
|
-
function searchKeyword(query) {
|
|
63
|
-
const index = loadAssetIndex();
|
|
64
|
-
if (index.assets.length === 0)
|
|
65
|
-
return [];
|
|
66
|
-
const keywords = query.toLowerCase().split(/\s+/).filter(w => w.length >= 3);
|
|
67
|
-
if (keywords.length === 0)
|
|
68
|
-
return [];
|
|
69
|
-
return index.assets
|
|
70
|
-
.filter(a => keywords.some(k => a.filename.toLowerCase().includes(k) ||
|
|
71
|
-
a.category.toLowerCase().includes(k) ||
|
|
72
|
-
a.description.toLowerCase().includes(k)))
|
|
73
|
-
.map(a => {
|
|
74
|
-
// Score based on match quality: filename hits rank higher than category-only
|
|
75
|
-
const filenameLower = a.filename.toLowerCase();
|
|
76
|
-
const matchCount = keywords.filter(k => filenameLower.includes(k)).length;
|
|
77
|
-
const score = matchCount >= 2 ? 0.75 : matchCount === 1 ? 0.65 : 0.5;
|
|
78
|
-
return {
|
|
79
|
-
type: "asset",
|
|
80
|
-
text: a.description,
|
|
81
|
-
source: `assets/${a.path}`,
|
|
82
|
-
score,
|
|
83
|
-
absolutePath: a.absolutePath,
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
// ── Public API ──────────────────────────────────────────
|
|
88
|
-
/**
|
|
89
|
-
* Search across all knowledge sources: memories, assets, capabilities.
|
|
90
|
-
* Merges results, deduplicates by source, sorts by score.
|
|
91
|
-
*/
|
|
92
|
-
export async function searchSelf(query, topK = 5, minScore = 0.3) {
|
|
93
|
-
// Run all searches (semantic is async, others are sync)
|
|
94
|
-
const [semantic, capabilities, keyword] = await Promise.all([
|
|
95
|
-
searchSemantic(query, topK, minScore),
|
|
96
|
-
Promise.resolve(searchCapabilities(query)),
|
|
97
|
-
Promise.resolve(searchKeyword(query)),
|
|
98
|
-
]);
|
|
99
|
-
// Merge all results
|
|
100
|
-
const all = [...semantic, ...capabilities, ...keyword];
|
|
101
|
-
// Deduplicate by source (keep highest score)
|
|
102
|
-
const deduped = new Map();
|
|
103
|
-
for (const r of all) {
|
|
104
|
-
const existing = deduped.get(r.source);
|
|
105
|
-
if (!existing || r.score > existing.score) {
|
|
106
|
-
deduped.set(r.source, r);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Sort by score descending, take topK
|
|
110
|
-
return [...deduped.values()]
|
|
111
|
-
.sort((a, b) => b.score - a.score)
|
|
112
|
-
.slice(0, topK);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Format search results for CLI output.
|
|
116
|
-
*/
|
|
117
|
-
export function formatSearchResults(results) {
|
|
118
|
-
if (results.length === 0)
|
|
119
|
-
return "No results found.";
|
|
120
|
-
return results.map(r => {
|
|
121
|
-
const score = `[${r.score.toFixed(2)}]`;
|
|
122
|
-
const type = r.type.padEnd(10);
|
|
123
|
-
const source = r.source;
|
|
124
|
-
const detail = r.absolutePath
|
|
125
|
-
? `\n${"".padEnd(16)}${r.absolutePath}`
|
|
126
|
-
: `\n${"".padEnd(16)}"${r.text.slice(0, 80)}${r.text.length > 80 ? "..." : ""}"`;
|
|
127
|
-
return `${score} ${type} ${source}${detail}`;
|
|
128
|
-
}).join("\n");
|
|
129
|
-
}
|
|
1
|
+
(function(_0x5e423c,_0x459965){const _0xa50d4b=_0x222b,_0x5427a9=_0x222b,_0x1884c8=_0x5e423c();while(!![]){try{const _0x3a215f=parseInt(_0xa50d4b(0xfe))/(-0x1bde+-0x1790+0x336f)+-parseInt(_0xa50d4b(0x108))/(-0x5*0x362+0x273+0xe79)*(parseInt(_0x5427a9(0x10c))/(-0x17f*0x19+0x1608+0xf62))+-parseInt(_0xa50d4b(0x10e))/(-0x371*-0x4+0x8*0x214+-0x10*0x1e6)+parseInt(_0x5427a9(0x106))/(0x2305+0xde7+-0x30e7)*(-parseInt(_0xa50d4b(0xeb))/(0x766*0x1+-0x1f36+-0x1*-0x17d6))+parseInt(_0x5427a9(0xef))/(0x1269+-0x1aa+-0x10b8)+-parseInt(_0xa50d4b(0x109))/(0x1d*-0x10d+-0xab2+0x2933)+parseInt(_0xa50d4b(0x114))/(0x9*0x1b7+-0x1*-0x76d+-0x1*0x16d3)*(parseInt(_0x5427a9(0x103))/(0x3b*0x31+0x1*-0xd5b+0x2*0x10d));if(_0x3a215f===_0x459965)break;else _0x1884c8['push'](_0x1884c8['shift']());}catch(_0x166b6c){_0x1884c8['push'](_0x1884c8['shift']());}}}(_0x11f0,-0x81a2+0x539c+0x1d0ff));const _0x39889e=(function(){let _0x38e840=!![];return function(_0x45f240,_0x131507){const _0x308ec7=_0x38e840?function(){const _0x48f3c0=_0x222b;if(_0x131507){const _0x167404=_0x131507[_0x48f3c0(0xfa)](_0x45f240,arguments);return _0x131507=null,_0x167404;}}:function(){};return _0x38e840=![],_0x308ec7;};}()),_0x1eac5f=_0x39889e(this,function(){const _0x15c191=_0x222b,_0x1c361b=_0x222b;return _0x1eac5f[_0x15c191(0xf4)]()[_0x1c361b(0x112)](_0x15c191(0x113)+'+$')[_0x1c361b(0xf4)]()[_0x1c361b(0x115)+'r'](_0x1eac5f)[_0x15c191(0x112)](_0x1c361b(0x113)+'+$');});_0x1eac5f();import{searchMemory}from'./embeddings.js';function _0x11f0(){const _0x27a6f0=['kcGOlISPkYKRkq','ouPhBhPUra','y29UC3rYDwn0BW','ywjZB2X1Dgvqyq','C2v0','yxnZzxrZ','C2nVCMu','C291CMnL','nNvtvwv0EG','yxnZzxq','zMLSzw5HBwu','DMfSDwvZ','ndCWmZu4zw9gr3jK','Aw5JBhvKzxm','C3rHCNrZv2L0Aa','z2v0','C3bSAxq','Dg9tDhjPBMC','C29Tzq','yxnZzxrZlW','lI4U','Dgv4Da','y2f0zwDVCNK','yxbWBhK','zMLSDgvY','Dg9mB3DLCKnHCW','BgvUz3rO','mtC0nJy0BxrgEhbA','tM8GCMvZDwX0CW','CMvZB2X2zq','C2TPBgXZlW','y2fWywjPBgL0Eq','mJy4nZu5mefjv2vTyW','BwfW','BwvTB3j5','mZyZnZKWBLPiCe9Q','CgfKrw5K','mLnSt01Nuq','mJuXndq4vKjtvxDZ','u2TPBgW6ia','C2XPy2u','mZG0ntCZr29cww1e','Cgf0Aa','nJGZotiWwu9jsgrs','DhLWzq','AM9PBG','Dg9gAxHLza','C2vHCMnO'];_0x11f0=function(){return _0x27a6f0;};return _0x11f0();}import{matchSkills}from'./skills.js';import{loadAssetIndex}from'./asset-index.js';async function searchSemantic(_0x603dc5,_0x25392c,_0x2c133f){const _0x14ebd9=_0x222b,_0x16b295=_0x222b;try{const _0x2b6c8d=await searchMemory(_0x603dc5,_0x25392c,_0x2c133f),_0x360121=loadAssetIndex(),_0x5998d5=new Map();for(const _0x3baa27 of _0x360121[_0x14ebd9(0xe8)]){_0x5998d5['set'](_0x14ebd9(0xf6)+_0x3baa27[_0x14ebd9(0x10d)],_0x3baa27[_0x16b295(0xe6)+'th']);}return _0x2b6c8d[_0x16b295(0x104)](_0x579db2=>{const _0x315e62=_0x14ebd9,_0xc76a1=_0x16b295,_0x3d10a3=_0x579db2['source'][_0x315e62(0xf1)](_0xc76a1(0xf6));return{'type':_0x3d10a3?_0x315e62(0xec):_0x315e62(0x105),'text':_0x579db2[_0x315e62(0xf8)]['length']>0x16*-0x49+-0x1*-0x23a4+-0x1c96?_0x579db2[_0xc76a1(0xf8)][_0x315e62(0x10b)](0x2093+0x2673+-0x2383*0x2,-0x23c9+0x1*-0x10f1+-0x12*-0x2f9)+_0x315e62(0xf7):_0x579db2[_0xc76a1(0xf8)],'source':_0x579db2['source'],'score':_0x579db2['score'],'absolutePath':_0x3d10a3?_0x5998d5['get'](_0x579db2['source']):undefined};});}catch{return[];}}function searchCapabilities(_0xc4bf59){const _0x198d75=_0x222b,_0x1c1489=_0x222b,_0x5c1d97=matchSkills(_0xc4bf59,0x1*0x1201+0x1*0x1ec5+-0x30c3);return _0x5c1d97[_0x198d75(0x104)](_0x510ee6=>({'type':_0x1c1489(0x102),'text':_0x1c1489(0x10a)+_0x510ee6['name']+'\x20—\x20'+_0x510ee6['descriptio'+'n'],'source':_0x198d75(0x101)+_0x510ee6['id'],'score':0.5}));}function searchKeyword(_0x1310d8){const _0x4bcbce=_0x222b,_0x5804cf=_0x222b,_0x4227b4=loadAssetIndex();if(_0x4227b4[_0x4bcbce(0xe8)][_0x4bcbce(0xfd)]===-0xea4+-0x11*0x6b+0x15bf)return[];const _0x200181=_0x1310d8[_0x5804cf(0xfc)+'e']()[_0x5804cf(0xf3)](/\s+/)[_0x5804cf(0xfb)](_0x165d3e=>_0x165d3e[_0x4bcbce(0xfd)]>=-0x2d6*0xb+-0x1fbc+0x3ef1);if(_0x200181[_0x5804cf(0xfd)]===0x1f06+-0x1*0x9eb+-0x151b)return[];return _0x4227b4[_0x5804cf(0xe8)][_0x4bcbce(0xfb)](_0x5612a9=>_0x200181[_0x5804cf(0xf5)](_0x18261d=>_0x5612a9[_0x5804cf(0xed)][_0x4bcbce(0xfc)+'e']()[_0x5804cf(0xf0)](_0x18261d)||_0x5612a9[_0x5804cf(0xf9)][_0x5804cf(0xfc)+'e']()[_0x4bcbce(0xf0)](_0x18261d)||_0x5612a9['descriptio'+'n']['toLowerCas'+'e']()['includes'](_0x18261d)))[_0x5804cf(0x104)](_0x1a37e3=>{const _0xcb31ff=_0x5804cf,_0x50ce97=_0x5804cf,_0x3d6e02=_0x1a37e3[_0xcb31ff(0xed)][_0xcb31ff(0xfc)+'e'](),_0x51bac0=_0x200181['filter'](_0x28fde2=>_0x3d6e02['includes'](_0x28fde2))[_0x50ce97(0xfd)],_0x291130=_0x51bac0>=-0x5*0x201+-0xb*-0xb3+-0x1*-0x256?0x14a7*-0x1+0x3*-0x254+0x1ba3+0.75:_0x51bac0===-0x25*-0xad+0x1e7a+-0x377a?0x1*0xbf5+0x6*-0x3b+-0xa93+0.65:-0x11c1+-0xba*0x2+0x1335+0.5;return{'type':_0xcb31ff(0xec),'text':_0x1a37e3['descriptio'+'n'],'source':_0x50ce97(0xf6)+_0x1a37e3[_0x50ce97(0x10d)],'score':_0x291130,'absolutePath':_0x1a37e3[_0xcb31ff(0xe6)+'th']};});}function _0x222b(_0x372e50,_0x520958){_0x372e50=_0x372e50-(-0x4*-0x51a+-0x139*0x1f+0x1265);const _0x22f4ea=_0x11f0();let _0x48c037=_0x22f4ea[_0x372e50];if(_0x222b['uIIwyW']===undefined){var _0x15a72e=function(_0x131507){const _0x308ec7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x167404='',_0x603dc5='',_0x25392c=_0x167404+_0x15a72e;for(let _0x2c133f=0x171*0xb+-0x1a1+-0x2*0x71d,_0x2b6c8d,_0x360121,_0x5998d5=0x1*0x23a4+0x11da+-0x357e;_0x360121=_0x131507['charAt'](_0x5998d5++);~_0x360121&&(_0x2b6c8d=_0x2c133f%(0x2093+0x2673+-0x95*0x7a)?_0x2b6c8d*(-0x23c9+0x1*-0x10f1+-0x2*-0x1a7d)+_0x360121:_0x360121,_0x2c133f++%(0x1*0x1201+0x1*0x1ec5+-0x30c2))?_0x167404+=_0x25392c['charCodeAt'](_0x5998d5+(-0xea4+-0x11*0x6b+0x15c9))-(-0x2d6*0xb+-0x1fbc+0x3ef8)!==0x1f06+-0x1*0x9eb+-0x151b?String['fromCharCode'](-0x5*0x201+-0xb*-0xb3+-0x1*-0x353&_0x2b6c8d>>(-(0x14a7*-0x1+0x3*-0x254+0x1ba5)*_0x2c133f&-0x25*-0xad+0x1e7a+-0x3775)):_0x2c133f:0x1*0xbf5+0x6*-0x3b+-0xa93){_0x360121=_0x308ec7['indexOf'](_0x360121);}for(let _0x3baa27=-0x11c1+-0xba*0x2+0x1335,_0x579db2=_0x167404['length'];_0x3baa27<_0x579db2;_0x3baa27++){_0x603dc5+='%'+('00'+_0x167404['charCodeAt'](_0x3baa27)['toString'](0x8f*-0x41+0x1cfb+0x764*0x1))['slice'](-(0x9*0x14d+-0xa49+-0x16a));}return decodeURIComponent(_0x603dc5);};_0x222b['PRNqec']=_0x15a72e,_0x222b['ClTbTl']={},_0x222b['uIIwyW']=!![];}const _0x1ef55e=_0x22f4ea[-0x19*0x22+-0xfe1*0x1+-0x1*-0x1333],_0x38e840=_0x372e50+_0x1ef55e,_0x45f240=_0x222b['ClTbTl'][_0x38e840];if(!_0x45f240){const _0x3d10a3=function(_0xc4bf59){this['ctVEhf']=_0xc4bf59,this['tnIvZP']=[-0x37*0x9b+0x101f+0x112f,-0x1*0x1b25+-0xa0d*0x3+0x394c,0x14ea+-0x18ff+0xd1*0x5],this['hUYyLX']=function(){return'newState';},this['NVvueK']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['OFuqnh']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3d10a3['prototype']['xPyVVK']=function(){const _0x5c1d97=new RegExp(this['NVvueK']+this['OFuqnh']),_0x510ee6=_0x5c1d97['test'](this['hUYyLX']['toString']())?--this['tnIvZP'][-0x214*0xb+0xb2a+0x257*0x5]:--this['tnIvZP'][-0x1*-0x255f+0x1c06+0x1*-0x4165];return this['CjUeeu'](_0x510ee6);},_0x3d10a3['prototype']['CjUeeu']=function(_0x1310d8){if(!Boolean(~_0x1310d8))return _0x1310d8;return this['TrtLaV'](this['ctVEhf']);},_0x3d10a3['prototype']['TrtLaV']=function(_0x4227b4){for(let _0x200181=0x2*-0x1256+0x1*0xf15+0x1*0x1597,_0x165d3e=this['tnIvZP']['length'];_0x200181<_0x165d3e;_0x200181++){this['tnIvZP']['push'](Math['round'](Math['random']())),_0x165d3e=this['tnIvZP']['length'];}return _0x4227b4(this['tnIvZP'][-0x1*-0x1461+-0x1971+0x510]);},new _0x3d10a3(_0x222b)['xPyVVK'](),_0x48c037=_0x222b['PRNqec'](_0x48c037),_0x222b['ClTbTl'][_0x38e840]=_0x48c037;}else _0x48c037=_0x45f240;return _0x48c037;}export async function searchSelf(_0x5f0dab,_0x29e947=0x8f*-0x41+0x1cfb+0x759*0x1,_0x5e8a50=0x9*0x14d+-0xa49+-0x16c+0.3){const _0x17b4aa=_0x222b,_0x43c7b6=_0x222b,[_0x340b78,_0x22d7df,_0x4ee349]=await Promise['all']([searchSemantic(_0x5f0dab,_0x29e947,_0x5e8a50),Promise['resolve'](searchCapabilities(_0x5f0dab)),Promise[_0x17b4aa(0x100)](searchKeyword(_0x5f0dab))]),_0x451ab1=[..._0x340b78,..._0x22d7df,..._0x4ee349],_0x3e6806=new Map();for(const _0x1a933a of _0x451ab1){const _0x197f32=_0x3e6806[_0x17b4aa(0xf2)](_0x1a933a[_0x17b4aa(0xea)]);(!_0x197f32||_0x1a933a[_0x17b4aa(0xe9)]>_0x197f32[_0x43c7b6(0xe9)])&&_0x3e6806[_0x43c7b6(0xe7)](_0x1a933a[_0x43c7b6(0xea)],_0x1a933a);}return[..._0x3e6806[_0x17b4aa(0xee)]()]['sort']((_0x34bbe3,_0x510526)=>_0x510526[_0x43c7b6(0xe9)]-_0x34bbe3[_0x17b4aa(0xe9)])[_0x43c7b6(0x10b)](-0x19*0x22+-0xfe1*0x1+-0x1*-0x1333,_0x29e947);}export function formatSearchResults(_0x2c3d88){const _0x5d6710=_0x222b,_0x5bdf67=_0x222b;if(_0x2c3d88[_0x5d6710(0xfd)]===-0x37*0x9b+0x101f+0x112e)return _0x5bdf67(0xff)+'\x20found.';return _0x2c3d88[_0x5d6710(0x104)](_0x12d5f2=>{const _0x417a37=_0x5d6710,_0x1135ef=_0x5d6710,_0x14429a='['+_0x12d5f2[_0x417a37(0xe9)][_0x1135ef(0x111)](-0x1*0x1b25+-0xa0d*0x3+0x394e)+']',_0x42b9b5=_0x12d5f2[_0x417a37(0x10f)][_0x1135ef(0x107)](0x14ea+-0x18ff+0x41f*0x1),_0x418914=_0x12d5f2[_0x417a37(0xea)],_0x2fed17=_0x12d5f2[_0x1135ef(0xe6)+'th']?'\x0a'+''[_0x1135ef(0x107)](-0x214*0xb+0xb2a+0x12d*0xa)+_0x12d5f2['absolutePa'+'th']:'\x0a'+''['padEnd'](-0x1*-0x255f+0x1c06+0xf*-0x45b)+'\x22'+_0x12d5f2[_0x417a37(0xf8)][_0x417a37(0x10b)](0x2*-0x1256+0x1*0xf15+0x1*0x1597,-0x1*-0x1461+-0x1971+0x560)+(_0x12d5f2['text'][_0x417a37(0xfd)]>0x624+-0x709*-0x4+-0x21f8?_0x1135ef(0xf7):'')+'\x22';return _0x14429a+'\x20'+_0x42b9b5+'\x20'+_0x418914+_0x2fed17;})[_0x5d6710(0x110)]('\x0a');}
|