alvin-bot 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. 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(_0x5da422,_0x4df6fd){const _0x1e0ea7=_0x3804,_0xeb4904=_0x3804,_0x1f45ca=_0x5da422();while(!![]){try{const _0x23104c=parseInt(_0x1e0ea7(0x181))/(-0x10d1+-0x1e73+0x1*0x2f45)+-parseInt(_0x1e0ea7(0x19f))/(-0x191a+-0x56+0x1*0x1972)+parseInt(_0xeb4904(0x17f))/(-0x18d*-0x3+-0x1*0xaf1+0x64d)+parseInt(_0xeb4904(0x1ae))/(0xa7f+0x136f+0x223*-0xe)*(parseInt(_0x1e0ea7(0x176))/(-0x1*0xffb+-0xd5*-0x19+0x1*-0x4cd))+-parseInt(_0xeb4904(0x1c3))/(0x9de+-0x602+-0x3d6)+parseInt(_0x1e0ea7(0x18f))/(0x889+0x1166+-0x19e8)+parseInt(_0xeb4904(0x18b))/(0x1fc6+0x1c8a+-0x3c48);if(_0x23104c===_0x4df6fd)break;else _0x1f45ca['push'](_0x1f45ca['shift']());}catch(_0x3f73ab){_0x1f45ca['push'](_0x1f45ca['shift']());}}}(_0x9448,0x142e45+0x88ce5+0x38*-0x5076));const _0x118fc1=(function(){let _0x3ad3cd=!![];return function(_0x209303,_0x236872){const _0x262817=_0x3ad3cd?function(){if(_0x236872){const _0xd3f084=_0x236872['apply'](_0x209303,arguments);return _0x236872=null,_0xd3f084;}}:function(){};return _0x3ad3cd=![],_0x262817;};}()),_0x189029=_0x118fc1(this,function(){const _0x3dee74=_0x3804,_0x2e1ca5=_0x3804;return _0x189029[_0x3dee74(0x192)]()[_0x2e1ca5(0x1af)](_0x2e1ca5(0x172)+'+$')[_0x3dee74(0x192)]()[_0x3dee74(0x19e)+'r'](_0x189029)[_0x3dee74(0x1af)](_0x2e1ca5(0x172)+'+$');});_0x189029();import _0x9bf853 from'fs';import{execSync}from'child_process';import _0x23eb05 from'dotenv';function _0x3804(_0x450215,_0x1f85c6){_0x450215=_0x450215-(-0x12a+-0x1eec+0x2186);const _0x3edeaa=_0x9448();let _0x1b294e=_0x3edeaa[_0x450215];if(_0x3804['InIRlA']===undefined){var _0xa86639=function(_0x456752){const _0x110cf0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2f47e2='',_0x20f972='',_0x152b44=_0x2f47e2+_0xa86639;for(let _0x524e29=0x1f7b*-0x1+0x6d3+0x18a8,_0x2fcef9,_0x355df6,_0x22551e=-0x1*0x4bb+0x1181+0xf*-0xda;_0x355df6=_0x456752['charAt'](_0x22551e++);~_0x355df6&&(_0x2fcef9=_0x524e29%(-0x1de3*-0x1+0x2*0x2b3+0x1*-0x2345)?_0x2fcef9*(0x1*0x36e+-0x7bb+-0x1*-0x48d)+_0x355df6:_0x355df6,_0x524e29++%(0x1f5b+-0x84c+0x11*-0x15b))?_0x2f47e2+=_0x152b44['charCodeAt'](_0x22551e+(-0x1f6b+-0x19ab+0x8*0x724))-(0x236f+-0x12e3+-0x1*0x1082)!==-0x2*-0x51a+-0x1cf5+0x12c1?String['fromCharCode'](-0x23*-0x39+0x2*-0xac+-0x574&_0x2fcef9>>(-(-0x87f+-0x1f*0x3+0x8de)*_0x524e29&-0x9a5+0x920+0x8b)):_0x524e29:-0x1c38+0x1c*0x44+-0x23*-0x98){_0x355df6=_0x110cf0['indexOf'](_0x355df6);}for(let _0x4f6ac4=-0x5c8*-0x1+0x2ec*0x7+0x92*-0x2e,_0xf494c6=_0x2f47e2['length'];_0x4f6ac4<_0xf494c6;_0x4f6ac4++){_0x20f972+='%'+('00'+_0x2f47e2['charCodeAt'](_0x4f6ac4)['toString'](0x320+0x1*-0xa0f+0x6ff))['slice'](-(0x100c+-0x3e*-0x8+-0x11fa));}return decodeURIComponent(_0x20f972);};_0x3804['iNSAyu']=_0xa86639,_0x3804['JiYYuL']={},_0x3804['InIRlA']=!![];}const _0x1fb0f2=_0x3edeaa[-0x322*0x4+0x1c84+-0xffc],_0x1bad8a=_0x450215+_0x1fb0f2,_0x469130=_0x3804['JiYYuL'][_0x1bad8a];if(!_0x469130){const _0x3c6463=function(_0x26b63c){this['zFIhCy']=_0x26b63c,this['QwEINL']=[0x17*0x59+-0x3b*-0x72+-0x66*0x56,0x15*0x2+0xcf1*0x1+-0xd1b,0x1eef+-0x3bf+-0x3a*0x78],this['MowEOX']=function(){return'newState';},this['qwEHAv']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['BYfRhg']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3c6463['prototype']['TzQmSE']=function(){const _0x1e9c29=new RegExp(this['qwEHAv']+this['BYfRhg']),_0x3c7fd7=_0x1e9c29['test'](this['MowEOX']['toString']())?--this['QwEINL'][0x15db+-0x1025*-0x1+0x47*-0x89]:--this['QwEINL'][0x1e67+-0x51*0x5a+-0x1ed*0x1];return this['rFPolB'](_0x3c7fd7);},_0x3c6463['prototype']['rFPolB']=function(_0x476856){if(!Boolean(~_0x476856))return _0x476856;return this['RKaSyz'](this['zFIhCy']);},_0x3c6463['prototype']['RKaSyz']=function(_0x2cdf24){for(let _0x20d97a=-0x1489+0x6d2+0xdb7,_0x340b79=this['QwEINL']['length'];_0x20d97a<_0x340b79;_0x20d97a++){this['QwEINL']['push'](Math['round'](Math['random']())),_0x340b79=this['QwEINL']['length'];}return _0x2cdf24(this['QwEINL'][0x19e3+-0x758+-0x128b]);},new _0x3c6463(_0x3804)['TzQmSE'](),_0x1b294e=_0x3804['iNSAyu'](_0x1b294e),_0x3804['JiYYuL'][_0x1bad8a]=_0x1b294e;}else _0x1b294e=_0x469130;return _0x1b294e;}import{DATA_DIR,ENV_FILE}from'../paths.js';export function runAudit(){const _0x1760b2=_0x3804,_0x124f1b=_0x3804,_0x38c40e=[];_0x9bf853[_0x1760b2(0x1a0)](ENV_FILE)&&_0x23eb05[_0x124f1b(0x174)]({'path':ENV_FILE});const _0x102f6c=ENV_FILE;if(_0x9bf853[_0x124f1b(0x1a0)](_0x102f6c)){const _0x3a847e=_0x9bf853[_0x1760b2(0x1bb)](_0x102f6c),_0x1e0413=(_0x3a847e[_0x1760b2(0x1b1)]&0x1e20+0x6*-0x146+0x1*-0x147d)[_0x1760b2(0x192)](0x3d*0x6d+0x3*-0xcf9+-0x2*-0x67d);_0x38c40e[_0x1760b2(0x193)](_0x1e0413==='600'?{'name':_0x124f1b(0x1c1)+'ssions','status':_0x1760b2(0x1a8),'message':'Mode\x20'+_0x1e0413+_0x1760b2(0x17c)}:{'name':'.env\x20permi'+_0x1760b2(0x1ab),'status':_0x1760b2(0x1b9),'message':_0x124f1b(0x17e)+_0x1e0413+(_0x1760b2(0x184)+'be\x20600.\x20Ru'+_0x124f1b(0x17d)+_0x124f1b(0x196))+_0x102f6c});}else _0x38c40e[_0x124f1b(0x193)]({'name':_0x124f1b(0x186),'status':'WARN','message':_0x1760b2(0x1c2)+_0x1760b2(0x191)});try{const _0x36be62=execSync(_0x124f1b(0x1a3)+_0x1760b2(0x190)+_0x124f1b(0x1b5)+_0x124f1b(0x19b)+_0x1760b2(0x19a)+_0x1760b2(0x171)+_0x124f1b(0x1c0)+_0x124f1b(0x19c)+'d|secret)\x5c'+_0x124f1b(0x1bd)+'ue',{'cwd':DATA_DIR,'stdio':'pipe'})['toString']();_0x38c40e[_0x1760b2(0x193)](_0x36be62[_0x124f1b(0x18e)]()?{'name':'Secrets\x20in'+_0x1760b2(0x1be),'status':_0x124f1b(0x1bc),'message':_0x124f1b(0x1b7)+'ecrets\x20in\x20'+_0x1760b2(0x1b0)+_0x124f1b(0x1c4)+_0x36be62['trim']()}:{'name':_0x124f1b(0x177)+_0x1760b2(0x1be),'status':_0x124f1b(0x1a8),'message':_0x1760b2(0x182)+_0x1760b2(0x195)+_0x1760b2(0x178)+'files'});}catch{_0x38c40e[_0x124f1b(0x193)]({'name':'Secrets\x20in'+_0x1760b2(0x1be),'status':_0x1760b2(0x1a8),'message':'Not\x20a\x20git\x20'+_0x1760b2(0x170)+'\x20staged\x20ch'+_0x124f1b(0x17b)});}const _0x47f749=process['env'][_0x124f1b(0x187)+_0x124f1b(0x173)]||'';_0x38c40e[_0x1760b2(0x193)](_0x47f749?{'name':'ALLOWED_US'+'ERS','status':'PASS','message':_0x47f749['split'](',')['length']+(_0x124f1b(0x18d)+_0x124f1b(0x1b3))}:{'name':_0x124f1b(0x187)+_0x1760b2(0x173),'status':_0x124f1b(0x1b9),'message':_0x1760b2(0x1ad)+_0x1760b2(0x198)+_0x124f1b(0x1bf)+_0x124f1b(0x1b8)});const _0x42cd8b=process[_0x1760b2(0x1a7)][_0x1760b2(0x188)+'RD']||'';_0x38c40e['push'](_0x42cd8b?{'name':_0x1760b2(0x188)+'RD','status':_0x1760b2(0x1a8),'message':'Set'}:{'name':_0x1760b2(0x188)+'RD','status':_0x1760b2(0x1b9),'message':_0x1760b2(0x1ad)+_0x1760b2(0x1a4)+_0x1760b2(0x180)+'d'});process[_0x124f1b(0x1a7)][_0x124f1b(0x185)+_0x1760b2(0x17a)]==='true'&&_0x38c40e[_0x1760b2(0x193)](process['env']['WEBHOOK_TO'+_0x1760b2(0x1a1)]?{'name':'WEBHOOK_TO'+_0x1760b2(0x1a1),'status':_0x124f1b(0x1a8),'message':_0x1760b2(0x179)}:{'name':_0x124f1b(0x1ac)+'KEN','status':_0x124f1b(0x1bc),'message':_0x1760b2(0x18c)+_0x1760b2(0x1ba)+_0x1760b2(0x1a9)+'set\x20—\x20anyo'+_0x124f1b(0x1b4)+'gger!'});if(_0x9bf853[_0x124f1b(0x1a0)](DATA_DIR)){const _0x48a660=_0x9bf853['statSync'](DATA_DIR),_0x406f1a=(_0x48a660['mode']&0x100f+-0x1*-0x1bd+-0x1*0xfcd)[_0x1760b2(0x192)](0xb*-0x1f7+-0xc8f+0x2234);_0x38c40e[_0x124f1b(0x193)](parseInt(_0x406f1a,0x14*-0x109+-0x5*0x11b+0x1a43)<=-0x238e+-0x169*-0x3+-0x1c*-0x130?{'name':_0x124f1b(0x1b6)+_0x124f1b(0x1a2),'status':_0x124f1b(0x1a8),'message':DATA_DIR+_0x124f1b(0x1a6)+_0x406f1a}:{'name':_0x1760b2(0x1b6)+_0x124f1b(0x1a2),'status':'WARN','message':DATA_DIR+'\x20mode\x20'+_0x406f1a+(_0x124f1b(0x18a)+'r\x20restrict'+_0x1760b2(0x189))});}return _0x38c40e;}export function formatAuditReport(_0x152f57){const _0x3c0663=_0x3804,_0x394ef0=_0x3804,_0x56dce8={'PASS':'✅','WARN':'⚠️','FAIL':'❌'};let _0x588cd1='Security\x20A'+_0x3c0663(0x1b2)+'t\x0a'+'='[_0x3c0663(0x19d)](-0x1*0x150+-0x10*0x12+0x2*0x14c)+'\x0a\x0a';for(const _0x338079 of _0x152f57){_0x588cd1+=_0x56dce8[_0x338079[_0x3c0663(0x197)]]+'\x20'+_0x338079[_0x394ef0(0x175)]+':\x20'+_0x338079[_0x394ef0(0x1a5)]+'\x0a';}const _0x4d0dc5=_0x152f57['filter'](_0x236912=>_0x236912[_0x394ef0(0x197)]===_0x394ef0(0x1bc))[_0x3c0663(0x194)],_0x4ef99d=_0x152f57[_0x3c0663(0x199)](_0x2b442b=>_0x2b442b[_0x3c0663(0x197)]===_0x394ef0(0x1b9))['length'];return _0x588cd1+='\x0a'+'='[_0x394ef0(0x19d)](-0x258a+-0x87f+-0x1d9*-0x19)+'\x0a',_0x588cd1+=_0x152f57[_0x3c0663(0x194)]+_0x3c0663(0x1aa)+(_0x152f57[_0x3c0663(0x194)]-_0x4d0dc5-_0x4ef99d)+'\x20passed,\x20'+_0x4ef99d+('\x20warnings,'+'\x20')+_0x4d0dc5+_0x3c0663(0x183),_0x588cd1;}function _0x9448(){const _0x4cb820=['mtK1oti4rLjitvrV','tM8GC2vJCMv0CW','igzHAwX1CMvZcG','iokaLcbZAg91BgqG','v0vcse9ps19ftG','lMvUDIbMAwXL','quXmt1Dfrf9vuW','v0vcx1bbu1nxtW','Aw5N','iokaLcbJB25ZAwrL','otG4nZiZmNf2B0XYsq','v2vIAg9VA3mGzq','ihvZzxiOCYKGyW','DhjPBq','nJC1nZy5nuvYyxbsDG','rufeic0Ty2fJAa','BguGzM91BMq','Dg9tDhjPBMC','ChvZAa','BgvUz3rO','igrLDgvJDgvKia','mdaG','C3rHDhvZ','yw55B25LignHBG','zMLSDgvY','ic0Tic4GFcbNCG','zMLSDgvYpufdtq','zw58CgfZC3DVCG','CMvWzwf0','y29UC3rYDwn0BW','mJuXmtu1mKXTquLqvG','zxHPC3rZu3LUyW','s0vo','zxjTAxnZAw9UCW','z2L0igrPzMyGsa','v2vIifvjigLZia','BwvZC2fNzq','ig1VzguG','zw52','ueftuW','ig5VihrVA2vUia','ignOzwnRCZOG','C3nPB25Z','v0vcse9ps19utW','tM90ihnLDcdIGjqG','mJa2ogjAB09lBa','C2vHCMnO','C3rHz2vKigzPBa','Bw9Kzq','DwrPDcbszxbVCG','B25MAwD1CMvK','BMuGy2fUihrYAq','zwqGls1KAwzMlq','rgf0ysbKAxiGCa','ug9ZC2LIBguGCW','AguGyM90','v0fstG','BMfIBgvKigj1Da','C3rHDfn5BMm','rKfjta','CYO9jYb8Fcb0CG','igDPDa','ig1LC3nHz2uGDa','CgKUA2v5FhrVAW','lMvUDIbWzxjTAq','tM8GlMvUDIbMAq','nJuWmJaWogroBLLLBq','zxm6cG','CMvWBYbVCIbUBW','zxaGlwLficCOyq','kcGOlISPkYKRkq','rvjt','y29UzMLN','BMfTzq','nZaWt2LjsLvO','u2vJCMv0CYbPBG','Aw4GC3rHz2vKia','u2v0','qujmruq','yw5Nzxm','icHZzwn1CMuP','BJOGy2HTB2qGnG','tw9Kzsa','mtC5nZG0m0fqCvv4Dq','Dw5WCM90zwn0zq'];_0x9448=function(){return _0x4cb820;};return _0x9448();}
@@ -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 _0x9b7963=_0x268d,_0x1baece=_0x268d;(function(_0x4c51a0,_0x153396){const _0xdb0a7a=_0x268d,_0x372b31=_0x268d,_0x3b3fbb=_0x4c51a0();while(!![]){try{const _0x8181f8=parseInt(_0xdb0a7a(0xc7))/(0xa1*0x9+0xa*0x21e+-0x1ad4)*(parseInt(_0xdb0a7a(0xdf))/(0x2*-0xc26+0xc*-0x12f+0x1*0x2682))+parseInt(_0x372b31(0xfb))/(0xd13*-0x1+-0x7*0x1d2+0x19d4)+parseInt(_0xdb0a7a(0x12c))/(0x1743+-0x11bb+0x4*-0x161)*(-parseInt(_0x372b31(0xc3))/(-0x513+-0x1ba0+0x2*0x105c))+parseInt(_0xdb0a7a(0x10f))/(-0x147*0xd+-0x807+-0x8*-0x315)+-parseInt(_0xdb0a7a(0x106))/(0xdc3+0x3*-0x429+-0x141)*(parseInt(_0x372b31(0xb0))/(-0x12*0xa1+-0x2027+0x637*0x7))+-parseInt(_0xdb0a7a(0xc6))/(-0x996+0x2e*-0x7+0xae1)*(parseInt(_0xdb0a7a(0x125))/(0xbce+0x17*-0x133+0xfd1))+parseInt(_0x372b31(0xc4))/(0x67*0x12+-0x1953*-0x1+0x2086*-0x1);if(_0x8181f8===_0x153396)break;else _0x3b3fbb['push'](_0x3b3fbb['shift']());}catch(_0x3e8ef3){_0x3b3fbb['push'](_0x3b3fbb['shift']());}}}(_0x4d91,-0x1*0xccc36+0x7ddeb+-0x5*-0x2fe01));const _0x4f6f71=(function(){let _0x4803db=!![];return function(_0x8e0761,_0x14395e){const _0x1d5c09=_0x4803db?function(){if(_0x14395e){const _0x1178cc=_0x14395e['apply'](_0x8e0761,arguments);return _0x14395e=null,_0x1178cc;}}:function(){};return _0x4803db=![],_0x1d5c09;};}()),_0x36d806=_0x4f6f71(this,function(){const _0x4973d8=_0x268d,_0x3137ff=_0x268d;return _0x36d806['toString']()[_0x4973d8(0x10a)](_0x4973d8(0xae)+'+$')[_0x4973d8(0xe7)]()[_0x4973d8(0xbe)+'r'](_0x36d806)[_0x4973d8(0x10a)]('(((.+)+)+)'+'+$');});_0x36d806();import{existsSync,readFileSync,writeFileSync,readdirSync}from'fs';import{join}from'path';import{homedir}from'os';import{emitCritical}from'./critical-notify.js';const PROMPT_TEMPLATE=_0x9b7963(0xde)+_0x1baece(0xda)+_0x1baece(0xb4)+'lvin\x20Bot\x20i'+_0x9b7963(0x122)+_0x1baece(0xe8)+'al\x20failure'+'.\x0aBelow\x20is'+_0x9b7963(0x104)+'sic\x20dump.\x20'+_0x9b7963(0xab)+'hen\x20respon'+'d\x20in\x20EXACT'+_0x1baece(0xec)+_0x9b7963(0xe2)+'t\x20—\x0ano\x20mar'+'kdown,\x20no\x20'+'commentary'+_0x1baece(0xb2)+_0x1baece(0x14e)+_0x9b7963(0xaf)+_0x9b7963(0x149)+_0x9b7963(0xed)+_0x1baece(0x10d)+'ely\x20went\x20w'+'rong>\x0aROOT'+_0x1baece(0xe4)+_0x1baece(0x10c)+_0x9b7963(0x124)+_0x1baece(0xc9)+_0x1baece(0xbb)+_0x1baece(0x119)+'on\x20|\x20exter'+_0x1baece(0x150)+'e\x20|\x20code-b'+_0x1baece(0xd6)+_0x9b7963(0xe0)+_0x9b7963(0x143)+_0x1baece(0x129)+_0x1baece(0xbf)+_0x9b7963(0x135)+_0x1baece(0xf0)+'he\x20operato'+_0x1baece(0xf4)+_0x1baece(0x13c)+_0x1baece(0x144)+_0x9b7963(0x105)+'able\x22>\x0aCON'+_0x1baece(0x12f)+_0x1baece(0x12d)+'IUM\x20|\x20LOW>'+_0x1baece(0x13d)+_0x1baece(0x11c)+_0x1baece(0xd5)+_0x9b7963(0xe5)+'your\x20reaso'+'ning,\x20plai'+_0x1baece(0xf6)+_0x1baece(0xf1)+_0x9b7963(0xb9)+_0x9b7963(0x138)+'ONTENT}\x0a--'+_0x1baece(0xaa)+'UMP\x20---';function isDisabled(){const _0x1987d5=_0x1baece,_0x173a4b=_0x1baece;return process[_0x1987d5(0xf2)][_0x1987d5(0xa6)+'BLE_SELF_D'+_0x173a4b(0x100)]===_0x173a4b(0xfd)||process[_0x173a4b(0xf2)][_0x1987d5(0xa6)+_0x1987d5(0x111)+_0x173a4b(0x108)+'N']===_0x1987d5(0xfd);}function parseAIResponse(_0x51ae2b){const _0x337563=_0x9b7963,_0x5ab1ee=_0x1baece,_0x509001=_0x3a92a5=>{const _0x103be3=_0x268d,_0x48dedb=_0x268d,_0x43fd94=new RegExp('^'+_0x3a92a5+(':\x5cs*([\x5cs\x5cS'+_0x103be3(0x11a)+_0x48dedb(0x121)+_0x48dedb(0xc2)+_0x103be3(0xff)+_0x103be3(0x13e)+'ION|CONFID'+_0x48dedb(0xa5)+_0x48dedb(0xdb)+')'),'m'),_0x3fca6b=_0x51ae2b[_0x103be3(0xf7)](_0x43fd94);return _0x3fca6b?_0x3fca6b[0x172*0x11+0x2b8+-0x1b49][_0x48dedb(0xad)]():'';},_0x25946c=_0x509001(_0x337563(0x10e))[_0x5ab1ee(0xc5)](/\s+/)[-0x6d*0x2+-0x10c9+0x12d*0xf]?.[_0x5ab1ee(0x151)+'e']()||'';return{'hypothesis':_0x509001(_0x337563(0xc1))||'(no\x20hypoth'+_0x337563(0xef)+'ned)','rootCauseCategory':_0x509001('ROOT_CAUSE'+'_CATEGORY')||'unknown','remediation':_0x509001(_0x337563(0x132)+'N')||_0x337563(0x136)+_0x337563(0xdc),'confidence':[_0x5ab1ee(0xba),_0x5ab1ee(0x146),_0x5ab1ee(0xe6)]['includes'](_0x25946c)?_0x25946c:_0x337563(0xa7),'explanation':_0x509001('EXPLANATIO'+'N')||_0x337563(0xb8)+_0x5ab1ee(0xdc),'raw':_0x51ae2b};}function truncateBundle(_0x1e721d,_0x52b782=-0x10fa+0x392f+0x1*0x6ab){const _0xfa1a5a=_0x9b7963,_0x5796f7=_0x9b7963;if(_0x1e721d[_0xfa1a5a(0x101)]<=_0x52b782)return _0x1e721d;const _0x15389e=_0x1e721d[_0xfa1a5a(0xd9)](0x945+0x261a+-0x2f5f*0x1,-0x1fec+0x86a+0x1f52),_0x2e027b=_0x1e721d[_0xfa1a5a(0xd9)](-(_0x52b782-(0x1c56+-0xcf2+0x794*-0x1)-(0xfe7+-0x1c49+0xc94)));return _0x15389e+_0xfa1a5a(0xb1)+(_0x1e721d[_0x5796f7(0x101)]-_0x52b782)+('\x20chars\x20eli'+_0xfa1a5a(0xfe))+_0x2e027b;}function _0x268d(_0x3dbca6,_0x47b96d){_0x3dbca6=_0x3dbca6-(-0xb54+-0x1aa+0xda3*0x1);const _0x5d60d0=_0x4d91();let _0x8b6086=_0x5d60d0[_0x3dbca6];if(_0x268d['qsayxk']===undefined){var _0x34a76e=function(_0x3c03ed){const _0x1bd436='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x480922='',_0x426858='',_0xcdf40a=_0x480922+_0x34a76e;for(let _0x4d3e26=0x1*-0x77c+0x10*0x14+0x63c,_0x4810a1,_0x53ca1c,_0x303b69=0x172*0x11+0x2b8+-0x1b4a;_0x53ca1c=_0x3c03ed['charAt'](_0x303b69++);~_0x53ca1c&&(_0x4810a1=_0x4d3e26%(-0x6d*0x2+-0x10c9+0x11a7*0x1)?_0x4810a1*(-0x713+0x17d4+0x1*-0x1081)+_0x53ca1c:_0x53ca1c,_0x4d3e26++%(0x945+0x261a+-0x2f5b*0x1))?_0x480922+=_0xcdf40a['charCodeAt'](_0x303b69+(-0x1fec+0x86a+0x178c))-(0x1c56+-0xcf2+0xf5a*-0x1)!==0xfe7+-0x1c49+0xc62?String['fromCharCode'](-0x98d+-0x1578+-0x1*-0x2004&_0x4810a1>>(-(-0x666+0x23f1+0x1d89*-0x1)*_0x4d3e26&0x13ee+-0x1fcd+0xbe5)):_0x4d3e26:0x1bda+0x23*0xc5+-0x33*0x113){_0x53ca1c=_0x1bd436['indexOf'](_0x53ca1c);}for(let _0x3e9a3e=0x1cb3+-0x15af+0x4*-0x1c1,_0x121dab=_0x480922['length'];_0x3e9a3e<_0x121dab;_0x3e9a3e++){_0x426858+='%'+('00'+_0x480922['charCodeAt'](_0x3e9a3e)['toString'](0x62a+-0x1f7d+-0x1963*-0x1))['slice'](-(0xc56+0x2185+0x1*-0x2dd9));}return decodeURIComponent(_0x426858);};_0x268d['GfXLNP']=_0x34a76e,_0x268d['xxzjvL']={},_0x268d['qsayxk']=!![];}const _0xc51908=_0x5d60d0[-0x77d+0xbf3+0x476*-0x1],_0x50091a=_0x3dbca6+_0xc51908,_0x4e98e9=_0x268d['xxzjvL'][_0x50091a];if(!_0x4e98e9){const _0x311647=function(_0x10d7f5){this['arNBBm']=_0x10d7f5,this['KhjWli']=[0x1*0x1ead+-0x376*-0x6+0x4*-0xcdc,0x15a6+-0x235a*-0x1+-0x3900,0x1883+0x2*0xa85+-0x2d8d],this['LCsfTJ']=function(){return'newState';},this['NrJjtj']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['TdcbRG']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x311647['prototype']['GlSIJt']=function(){const _0xa820dd=new RegExp(this['NrJjtj']+this['TdcbRG']),_0x9d934f=_0xa820dd['test'](this['LCsfTJ']['toString']())?--this['KhjWli'][-0x1*-0x10f2+-0x57e+-0x1*0xb73]:--this['KhjWli'][0xca1+-0x2129+0x1488];return this['eRjwck'](_0x9d934f);},_0x311647['prototype']['eRjwck']=function(_0x3916e3){if(!Boolean(~_0x3916e3))return _0x3916e3;return this['aJuMFs'](this['arNBBm']);},_0x311647['prototype']['aJuMFs']=function(_0x2f2a32){for(let _0x5427df=-0x485+-0x233b+0x27c0,_0x3e3bcc=this['KhjWli']['length'];_0x5427df<_0x3e3bcc;_0x5427df++){this['KhjWli']['push'](Math['round'](Math['random']())),_0x3e3bcc=this['KhjWli']['length'];}return _0x2f2a32(this['KhjWli'][-0x1867+0x239+0x162e]);},new _0x311647(_0x268d)['GlSIJt'](),_0x8b6086=_0x268d['GfXLNP'](_0x8b6086),_0x268d['xxzjvL'][_0x50091a]=_0x8b6086;}else _0x8b6086=_0x4e98e9;return _0x8b6086;}export async function analyzeBundle(_0x194112,_0x39dd1a,_0x4782e2={}){const _0x205160=_0x9b7963,_0x130317=_0x1baece;if(isDisabled())return null;if(!existsSync(_0x194112))return null;let _0x3735f6,_0x9411d3=_0x205160(0xb3);try{_0x3735f6=_0x39dd1a[_0x130317(0xf5)](),_0x9411d3=_0x39dd1a[_0x130317(0x154)+'ey']();}catch{return null;}if(!_0x3735f6)return null;const _0xba3ff7=Date[_0x205160(0x134)](),_0x2b0e6f=readFileSync(_0x194112,'utf-8'),_0x3ef1ac=truncateBundle(_0x2b0e6f),_0x420861=PROMPT_TEMPLATE[_0x205160(0x10b)](_0x205160(0x14a)+_0x205160(0xe3),_0x3ef1ac),_0x3ebed8=_0x4782e2[_0x205160(0x102)]??-0xe535+-0x2032f+-0x1*-0x4bd24,_0x589970=new AbortController(),_0x1b087a=setTimeout(()=>_0x589970[_0x130317(0x152)](),_0x3ebed8);let _0x2984b7='';try{for await(const _0x268bf8 of _0x3735f6[_0x205160(0xd0)]({'prompt':_0x420861,'systemPrompt':'You\x20are\x20a\x20'+_0x130317(0x147)+_0x205160(0x109)+'t.\x20Reply\x20O'+_0x205160(0x113)+_0x130317(0xd7)+_0x205160(0xe9),'abortSignal':_0x589970[_0x130317(0x14d)]})){if(_0x268bf8[_0x130317(0x12b)]===_0x205160(0x148)){if(_0x268bf8[_0x205160(0x12a)])_0x2984b7+=_0x268bf8[_0x205160(0x12a)];else{if(_0x268bf8['text'])_0x2984b7=_0x268bf8[_0x130317(0x148)];}}else{if(_0x268bf8[_0x205160(0x12b)]===_0x205160(0x116))return clearTimeout(_0x1b087a),null;else{if(_0x268bf8['type']===_0x130317(0x130)){if(_0x268bf8[_0x205160(0x148)])_0x2984b7=_0x268bf8[_0x130317(0x148)];break;}}}}}catch{return clearTimeout(_0x1b087a),null;}clearTimeout(_0x1b087a);if(!_0x2984b7['trim']())return null;const _0x4aaeaf=parseAIResponse(_0x2984b7),_0x30cbec={..._0x4aaeaf,'durationMs':Date[_0x130317(0x134)]()-_0xba3ff7,'provider':_0x9411d3};try{const _0x3e45cc=_0x194112[_0x205160(0x10b)](/\.md$/,_0x205160(0xee)+'md');writeFileSync(_0x3e45cc,formatAnalysis(_0x30cbec,_0x194112),{'mode':0x180});}catch{}return _0x30cbec;}function formatAnalysis(_0x10301c,_0x548d0d){const _0xb9da40=_0x9b7963,_0x434ffe=_0x1baece;return[_0xb9da40(0x14f)+'Diagnosis','','**Bundle:*'+_0xb9da40(0x118)+_0x548d0d+'`',_0xb9da40(0x14c)+_0xb9da40(0x137)+new Date()[_0x434ffe(0x12e)+'g'](),'**Provider'+':**\x20'+_0x10301c[_0xb9da40(0x110)],_0x434ffe(0xbc)+_0xb9da40(0x153)+_0x10301c['durationMs']+'\x20ms','',_0x434ffe(0x139)+_0xb9da40(0x11e),_0x10301c[_0xb9da40(0x123)],'',_0xb9da40(0x11f)+_0x434ffe(0x103)+'ry','`'+_0x10301c['rootCauseC'+_0x434ffe(0xeb)]+'`','',_0xb9da40(0x13b)+_0xb9da40(0x13a)+'tion',_0xb9da40(0x156),_0x10301c[_0x434ffe(0xb7)+'n'],'```','>\x20**Note:*'+_0x434ffe(0x120)+_0xb9da40(0x112)+_0xb9da40(0x145)+_0xb9da40(0x107)+_0xb9da40(0xd1)+'f\x20only\x20if\x20'+_0x434ffe(0x133)+'ense.','',_0xb9da40(0xca)+'nce','**'+_0x10301c[_0xb9da40(0x128)]+'**','',_0x434ffe(0xc8)+_0x434ffe(0xcc),_0x10301c[_0x434ffe(0x127)+'n'],'',_0xb9da40(0xd3),'',_0xb9da40(0x131)+_0x434ffe(0x155),_0x434ffe(0xf3),_0x10301c[_0x434ffe(0xf8)],'```',''][_0x434ffe(0xd8)]('\x0a');}function findUnanalyzedBundles(){const _0x4bf295=_0x1baece,_0x444d63=_0x9b7963,_0x5ea734=join(homedir(),'.alvin-bot',_0x4bf295(0xcb)+'s');if(!existsSync(_0x5ea734))return[];try{return readdirSync(_0x5ea734)[_0x4bf295(0xcf)](_0x594d26=>_0x594d26[_0x4bf295(0xea)](_0x4bf295(0xa8))&&!_0x594d26[_0x4bf295(0xea)](_0x4bf295(0xee)+'md'))[_0x4bf295(0xcf)](_0x552176=>!existsSync(join(_0x5ea734,_0x552176[_0x4bf295(0x10b)](/\.md$/,_0x444d63(0xee)+'md'))))['map'](_0x49085e=>join(_0x5ea734,_0x49085e));}catch{return[];}}export async function runStartupAnalyzer(_0x37c7dd){const _0x12b2ba=_0x9b7963,_0x5bd7f4=_0x9b7963;if(isDisabled())return;if(!_0x37c7dd)return;const _0x39516f=findUnanalyzedBundles();if(_0x39516f[_0x12b2ba(0x101)]===-0x666+0x23f1+0x1d8b*-0x1)return;_0x39516f['sort'](),console['log'](_0x5bd7f4(0x13f)+_0x12b2ba(0xfc)+_0x39516f['length']+(_0x5bd7f4(0x142)+_0x12b2ba(0xd4)+_0x5bd7f4(0xcd)+_0x5bd7f4(0xfa)+'..'));for(const _0x4a9471 of _0x39516f){try{const _0x130f7d=await analyzeBundle(_0x4a9471,_0x37c7dd);if(!_0x130f7d){console[_0x12b2ba(0x114)](_0x5bd7f4(0x157)+_0x4a9471+(_0x5bd7f4(0xa9)+_0x5bd7f4(0xce)+'no\x20result\x20'+_0x5bd7f4(0xb6)+_0x12b2ba(0xdd)+'pt-out)'));continue;}console['log'](_0x12b2ba(0xac)+_0x4a9471[_0x12b2ba(0xc5)]('/')['pop']()+'\x20→\x20'+_0x130f7d[_0x12b2ba(0x140)+_0x5bd7f4(0xeb)]+'\x20('+_0x130f7d[_0x12b2ba(0x128)]+',\x20'+_0x130f7d[_0x12b2ba(0xc0)]+_0x12b2ba(0x126)+_0x130f7d[_0x5bd7f4(0x110)]+')'),emitCritical({'category':_0x12b2ba(0x11d),'severity':_0x12b2ba(0x114),'title':_0x12b2ba(0x115)+_0x5bd7f4(0xe1)+'\x20'+_0x130f7d[_0x12b2ba(0x140)+'ategory']+'\x20('+_0x130f7d['confidence']+(_0x5bd7f4(0x11b)+'e)'),'detail':_0x5bd7f4(0xf9)+':\x20'+_0x130f7d[_0x12b2ba(0x123)]+'\x0a\x0a'+(_0x5bd7f4(0xb5)+_0x5bd7f4(0x14b)+_0x130f7d[_0x5bd7f4(0x127)+'n']+'\x0a\x0a')+(_0x5bd7f4(0x141)+_0x5bd7f4(0x117)+_0x4a9471['replace'](/\.md$/,'.analysis.'+'md')),'suggestedAction':_0x130f7d['remediatio'+'n']});}catch(_0x4a71c2){console[_0x5bd7f4(0x114)]('\x20\x20\x20⚠\x20'+_0x4a9471+(_0x5bd7f4(0xd2)+'\x20threw\x20—\x20')+(_0x4a71c2 instanceof Error?_0x4a71c2[_0x5bd7f4(0xbd)]:String(_0x4a71c2)));}}}function _0x4d91(){const _0x4b9d93=['kIPhzw5LCMf0zq','C2LNBMfS','igXPBMvZoGOksa','iYbbssbtzwXMlq','BMfSlwzHAwX1CG','Dg9vChbLCKnHCW','ywjVCNq','oIOQia','z2v0qwn0AxzLsW','ihjLC3bVBNnL','ygbGyMfZAa','icaG4PQGia','ru5drxXfwfbmqq','quXwsu5FreLtqq','vu5ltK9xtG','lM1K','oIbHBMfSExnPCW','lsbftKqGt0yGra','uMvHzcbPDcWGDa','icaG4PYtia','DhjPBq','kcGOlISPkYKRkq','wvbpveHfu0LtoG','mtaZndi2mtzusgLJvgu','cGPBlI4Uia','lcbUBYbLEhrYyq','khvUA25VD24P','DgfUDc4Gqw4Gqq','rxHWBgfUyxrPBW','khbYB3zPzgvYia','CMvTzwrPyxrPBW','kg5Vigv4CgXHBG','qYbevu1qic0Tlq','seLhsa','ihWGCMvZB3vYyW','kIPeDxjHDgLVBG','BwvZC2fNzq','y29UC3rYDwn0BW','rurjqvrjt046ia','zhvYyxrPB25nCW','sfLqt1rirvnjuW','u3Xst09ux0nbvq','mtuXnJe1uuDWtKTO','mte0odC4nJfZBNPVCeS','C3bSAxq','owP1q2rOBG','otm0mvj2swrKBG','iYmGrxHWBgfUyq','BMzPzY1LCNjVCG','iYmGq29UzMLKzq','zgLHz25VC3rPyW','DgLVBG','ksbMB3vUzcdIGjqG','ihjLDhvYBMvKia','zMLSDgvY','CxvLCNK','AxqGEw91CNnLBa','oIbHBMfSExPLCG','ls0T','zcbIDw5KBguOCW','zw50zw5JzxmGzq','DwCGFcbLBNzPCG','ihjLCxvLC3rLza','AM9PBG','C2XPy2u','ifnsrsbHC3nPCW','tKfusu9oktP8ja','yxrPB24P','zxjYB3iGB3iGBW','ww91igfYzsbHBG','mtu2EhDJBNPR','B25Tzw50lwnVBG','AxmGCMvHzhKG4Ocu','BgLUzsbMB3jTyq','tLrftLr9','x0nbvvnfx0nbva','EhbSywLUAw5Nia','te9x','Dg9tDhjPBMC','DcbHignYAxrPyW','igzVCM1HDc4','zw5KC1DPDgG','yxrLz29YEq','tfKGDgHPCYa1lq','DcbZzw50zw5Jzq','lMfUywX5C2LZlG','zxnPCYbYzxr1CG','ignVBw1HBMqGDa','ls0GrK9sru5tsq','zw52','ygbG','CIbJyw4GCNvUla','z2v0qwn0AxzL','BIb0zxH0pGOklq','Bwf0y2G','CMf3','shLWB3rOzxnPCW','yw5HBhL6Aw5NlG','mZu2ote3mMPcz2PIsa','z25VC2LZoIa','Dhj1zq','zgvKic4UlL0kcG','u0vFq0furuDpuG','sufhtK9tsvm','BgvUz3rO','DgLTzw91De1Z','DxnLienHDgvNBW','ihrOzsbMB3jLBG','DgLVBIbHDMfPBa','n0fQzMzgEG','DgHPCY4GuNvUia','uKvtrvjwqvrjtW','rsbHC3nPC3rHBG','C2vHCMnO','CMvWBgfJzq','ruDpuLK6idXWAq','oIb3Agf0igXPAW','q09orKLeru5drq','mtC0nZC3nLfovefjAG','ChjVDMLKzxi','qKXfx1nftezFua','zg9LCYbot1qGyq','tKXzigLUihrOzq','D2fYBG','quKGzgLHz25VCW','zxjYB3i','C2LZoIa','kIbG','zs1LEgHHDxn0Aq','xsO/ksG/pv4OpW','ignVBMzPzgvUyW','t046idWYltqGCW','y3vZDg9T','C2LZ','iYmGuM9VDcbdyq','kIb0AguGyM90ia','oKHzue9usevtsq','BNn0yw5JzsbOAq','AhLWB3rOzxnPCW','y2SGt05foIbJBW','mtGXoduZmgLeAvnOsq','BxmGDMLHia','zxHWBgfUyxrPBW','y29UzMLKzw5Jzq','A25VD24+cLjftq','zgvSDge','DhLWzq','mtq4tMrLq2Ds','seLhscb8ie1fra','Dg9ju09tDhjPBG','rKLeru5drtOGpa','zg9Uzq','iYmJifjHDYbbsq','uKvnrurjqvrjtW','AxqGBwfRzxmGCW','BM93','pg9UzsbZAgvSBa','kg5VihjLBwvKAq','zdOQkIa','cNTcvu5etevFqW','iYmGshLWB3rOzq','zwqGuMvTzwrPyq','iYmGu3vNz2vZDa','ie9sicjUBYbHDq','cKvyueXbtKfusq','wxXsru1freLbva','8j+NOcbtzwXMlwrPyq','CM9VDenHDxnLqW','rNvSBcbHBMfSEq','ihvUyw5HBhL6zq','zMXPy3qGFcb1BG','Dg9TyxrLzcbHyW','DxrVlwfWCgX5ia','tuvesvvn','ChjLy2LZzsbtuG','Dgv4Da','idXVBMuGC2HVCG','E0jvtKrmrv9dtW','BJOG'];_0x4d91=function(){return _0x4b9d93;};return _0x4d91();}
@@ -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 _0x52d5(_0x50dd38,_0x2c77ae){_0x50dd38=_0x50dd38-(0x179a+-0x1002+-0x6f1);const _0x2cd127=_0x5be8();let _0x51d3f2=_0x2cd127[_0x50dd38];if(_0x52d5['PrLOBb']===undefined){var _0x5e0e2a=function(_0x2cba70){const _0x5995d9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3949ff='',_0x181af2='',_0x4a72bd=_0x3949ff+_0x5e0e2a;for(let _0x3d0822=0x243b+-0x22d5*0x1+0xb3*-0x2,_0xce8d58,_0x5c8dc7,_0x43f5=-0x1ea1*0x1+-0x1*0x773+0x2614;_0x5c8dc7=_0x2cba70['charAt'](_0x43f5++);~_0x5c8dc7&&(_0xce8d58=_0x3d0822%(0x2*0x7d3+-0x4*-0x91d+-0x3416)?_0xce8d58*(-0x2*0xbdb+-0x59f*0x1+0x1*0x1d95)+_0x5c8dc7:_0x5c8dc7,_0x3d0822++%(-0x37*-0x61+-0x12db+-0x1f8))?_0x3949ff+=_0x4a72bd['charCodeAt'](_0x43f5+(-0x5*-0x37a+0xd97+0x1eef*-0x1))-(0x5b2+0x6e6+-0xc8e)!==-0x1362+0x1073+0x2ef?String['fromCharCode'](-0x2536+0xd45+-0x850*-0x3&_0xce8d58>>(-(-0x2408+0x10d5+-0x21*-0x95)*_0x3d0822&-0x1a7e+-0x1*-0xbed+0xe97)):_0x3d0822:0x10a6+-0xa2*-0x21+0x2588*-0x1){_0x5c8dc7=_0x5995d9['indexOf'](_0x5c8dc7);}for(let _0x5c9843=0x1*0x13d2+0x1d34+-0x3106,_0x2e9a93=_0x3949ff['length'];_0x5c9843<_0x2e9a93;_0x5c9843++){_0x181af2+='%'+('00'+_0x3949ff['charCodeAt'](_0x5c9843)['toString'](0x11df*-0x1+0xc46+0x5a9))['slice'](-(0x1*-0x1b65+-0x139c+-0x2f03*-0x1));}return decodeURIComponent(_0x181af2);};_0x52d5['GFsBgs']=_0x5e0e2a,_0x52d5['JvxboW']={},_0x52d5['PrLOBb']=!![];}const _0x5d64eb=_0x2cd127[-0x17bb+0x1*-0x443+0x1bfe],_0x2c5ae9=_0x50dd38+_0x5d64eb,_0x1ecf26=_0x52d5['JvxboW'][_0x2c5ae9];if(!_0x1ecf26){const _0x3b2430=function(_0x58c107){this['PZUtse']=_0x58c107,this['twNXby']=[-0x1*0xe57+-0x1*-0x714+0x26c*0x3,-0x61*-0x31+-0x19d4+0x743,0x2ad*-0xb+-0x1367+0x30d6],this['BkkXIV']=function(){return'newState';},this['RjFXnt']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['XTNeri']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3b2430['prototype']['PqdfZu']=function(){const _0xdcc9dc=new RegExp(this['RjFXnt']+this['XTNeri']),_0x758fd3=_0xdcc9dc['test'](this['BkkXIV']['toString']())?--this['twNXby'][-0x2653*-0x1+0x153c+-0xf2*0x3f]:--this['twNXby'][-0x1*0x2611+0x1738+0xb5*0x15];return this['kodpiE'](_0x758fd3);},_0x3b2430['prototype']['kodpiE']=function(_0x14c643){if(!Boolean(~_0x14c643))return _0x14c643;return this['CRRFYU'](this['PZUtse']);},_0x3b2430['prototype']['CRRFYU']=function(_0x140f99){for(let _0x46acef=0x1c50+-0x1*0x9eb+-0x1265,_0x2d6121=this['twNXby']['length'];_0x46acef<_0x2d6121;_0x46acef++){this['twNXby']['push'](Math['round'](Math['random']())),_0x2d6121=this['twNXby']['length'];}return _0x140f99(this['twNXby'][0x2654+-0x19a+0x125d*-0x2]);},new _0x3b2430(_0x52d5)['PqdfZu'](),_0x51d3f2=_0x52d5['GFsBgs'](_0x51d3f2),_0x52d5['JvxboW'][_0x2c5ae9]=_0x51d3f2;}else _0x51d3f2=_0x1ecf26;return _0x51d3f2;}(function(_0x425e68,_0x30b025){const _0x27a18a=_0x52d5,_0x32765b=_0x52d5,_0x505e30=_0x425e68();while(!![]){try{const _0xbb28ef=parseInt(_0x27a18a(0xd6))/(-0x3d0*0x7+0xd57+-0x6ad*-0x2)*(parseInt(_0x32765b(0xd0))/(-0x91b+0x10c1+0x4*-0x1e9))+-parseInt(_0x32765b(0xc6))/(0x2184+0x27b+0xbc*-0x31)+-parseInt(_0x32765b(0xc9))/(0x1675+0x104*-0x16+-0x19)*(-parseInt(_0x32765b(0xae))/(-0x549+-0xb98+0x10e6))+-parseInt(_0x32765b(0xb1))/(0x23d1+-0x16a4+-0x25*0x5b)+parseInt(_0x32765b(0xbd))/(-0x1*-0xee1+-0xea7+-0x33)*(parseInt(_0x32765b(0xa7))/(0x1a*0x8+0x6*0x13c+-0x830))+parseInt(_0x32765b(0xc2))/(0x718+0x1ce5+-0x11fa*0x2)*(parseInt(_0x32765b(0xb6))/(-0x947*0x3+-0x2152*-0x1+-0x1*0x573))+parseInt(_0x27a18a(0xc1))/(-0x1*0xf9a+-0xc*0x2e+0x11cd)*(-parseInt(_0x32765b(0xca))/(0x1aaa+0xedb+-0x1*0x2979));if(_0xbb28ef===_0x30b025)break;else _0x505e30['push'](_0x505e30['shift']());}catch(_0x25b877){_0x505e30['push'](_0x505e30['shift']());}}}(_0x5be8,-0x1*-0xee2f5+-0xe6f55+-0x4a6ca*-0x2));const _0x1ea52d=(function(){let _0x1ecf26=!![];return function(_0x2cba70,_0x5995d9){const _0x3949ff=_0x1ecf26?function(){const _0x409f35=_0x52d5;if(_0x5995d9){const _0x181af2=_0x5995d9[_0x409f35(0xc3)](_0x2cba70,arguments);return _0x5995d9=null,_0x181af2;}}:function(){};return _0x1ecf26=![],_0x3949ff;};}()),_0x2ad5c9=_0x1ea52d(this,function(){const _0x586b72=_0x52d5,_0x4e6116=_0x52d5;return _0x2ad5c9[_0x586b72(0xcc)]()['search'](_0x586b72(0xa8)+'+$')['toString']()[_0x4e6116(0xd5)+'r'](_0x2ad5c9)['search'](_0x586b72(0xa8)+'+$');});_0x2ad5c9();import{searchMemory}from'./embeddings.js';import{matchSkills}from'./skills.js';import{loadAssetIndex}from'./asset-index.js';async function searchSemantic(_0x4a72bd,_0x3d0822,_0xce8d58){const _0x272f6f=_0x52d5,_0x286c67=_0x52d5;try{const _0x5c8dc7=await searchMemory(_0x4a72bd,_0x3d0822,_0xce8d58),_0x43f5=loadAssetIndex(),_0x5c9843=new Map();for(const _0x2e9a93 of _0x43f5['assets']){_0x5c9843[_0x272f6f(0xb4)]('assets/'+_0x2e9a93[_0x272f6f(0xcd)],_0x2e9a93[_0x272f6f(0xd8)+'th']);}return _0x5c8dc7[_0x286c67(0xaa)](_0x3b2430=>{const _0xf399bf=_0x286c67,_0x109905=_0x272f6f,_0x58c107=_0x3b2430[_0xf399bf(0xb7)][_0x109905(0xb0)](_0x109905(0xc4));return{'type':_0x58c107?_0x109905(0xc0):'memory','text':_0x3b2430[_0xf399bf(0xbc)][_0xf399bf(0xc5)]>-0x773+-0x11*-0x184+-0x1189?_0x3b2430[_0xf399bf(0xbc)][_0x109905(0xcf)](0x2*0x7d3+-0x4*-0x91d+-0x341a,-0x2*0xbdb+-0x59f*0x1+0x1*0x1e1d)+'...':_0x3b2430[_0x109905(0xbc)],'source':_0x3b2430[_0x109905(0xb7)],'score':_0x3b2430[_0xf399bf(0xaf)],'absolutePath':_0x58c107?_0x5c9843['get'](_0x3b2430[_0x109905(0xb7)]):undefined};});}catch{return[];}}function searchCapabilities(_0xdcc9dc){const _0x4ed910=_0x52d5,_0x1ef923=_0x52d5,_0x758fd3=matchSkills(_0xdcc9dc,-0x37*-0x61+-0x12db+-0x1f9);return _0x758fd3[_0x4ed910(0xaa)](_0x14c643=>({'type':'capability','text':_0x4ed910(0xb9)+_0x14c643[_0x4ed910(0xbf)]+_0x1ef923(0xd1)+_0x14c643['descriptio'+'n'],'source':_0x4ed910(0xba)+_0x14c643['id'],'score':0.5}));}function searchKeyword(_0x140f99){const _0x5216d9=_0x52d5,_0x579e2a=_0x52d5,_0x46acef=loadAssetIndex();if(_0x46acef['assets'][_0x5216d9(0xc5)]===-0x5*-0x37a+0xd97+0x1ef9*-0x1)return[];const _0x2d6121=_0x140f99[_0x579e2a(0xce)+'e']()[_0x579e2a(0xb8)](/\s+/)[_0x5216d9(0xb3)](_0x2b5d03=>_0x2b5d03[_0x579e2a(0xc5)]>=0x5b2+0x6e6+-0xc95);if(_0x2d6121[_0x579e2a(0xc5)]===-0x1362+0x1073+0x2ef)return[];return _0x46acef['assets'][_0x5216d9(0xb3)](_0x31d31b=>_0x2d6121[_0x579e2a(0xd3)](_0x2dd5a0=>_0x31d31b['filename'][_0x5216d9(0xce)+'e']()[_0x5216d9(0xc8)](_0x2dd5a0)||_0x31d31b[_0x579e2a(0xab)][_0x5216d9(0xce)+'e']()['includes'](_0x2dd5a0)||_0x31d31b[_0x5216d9(0xb5)+'n'][_0x5216d9(0xce)+'e']()[_0x5216d9(0xc8)](_0x2dd5a0)))[_0x579e2a(0xaa)](_0x7d2583=>{const _0x187546=_0x579e2a,_0x49e7f3=_0x579e2a,_0x2bd04d=_0x7d2583[_0x187546(0xd2)][_0x187546(0xce)+'e'](),_0x5b3250=_0x2d6121[_0x187546(0xb3)](_0x22ec35=>_0x2bd04d[_0x49e7f3(0xc8)](_0x22ec35))[_0x187546(0xc5)],_0x198da6=_0x5b3250>=-0x2536+0xd45+-0x17f3*-0x1?-0x2408+0x10d5+-0x5*-0x3d7+0.75:_0x5b3250===-0x1a7e+-0x1*-0xbed+0xe92?0x10a6+-0xa2*-0x21+0x2588*-0x1+0.65:0x1*0x13d2+0x1d34+-0x3106+0.5;return{'type':_0x49e7f3(0xc0),'text':_0x7d2583[_0x49e7f3(0xb5)+'n'],'source':_0x49e7f3(0xc4)+_0x7d2583[_0x187546(0xcd)],'score':_0x198da6,'absolutePath':_0x7d2583[_0x49e7f3(0xd8)+'th']};});}function _0x5be8(){const _0x4f34f1=['zMLSzw5HBwu','C29Tzq','lI4U','y29UC3rYDwn0BW','mZi4rvveBgXt','Dg9gAxHLza','ywjZB2X1Dgvqyq','ody2nty4mfDgu214AW','kcGOlISPkYKRkq','CgfKrw5K','BwfW','y2f0zwDVCNK','tM8GCMvZDwX0CW','DhLWzq','ndCWzxDvqxDK','C2nVCMu','C3rHCNrZv2L0Aa','ntqZnte5nLLYt3bwqq','z2v0','zMLSDgvY','C2v0','zgvZy3jPChrPBW','ndyYmdm4mg5ks2H3qW','C291CMnL','C3bSAxq','u2TPBgW6ia','C2TPBgXZlW','C29YDa','Dgv4Da','n2v5DKXnDa','ywXS','BMfTzq','yxnZzxq','odH6u3HRvMW','mtHtqxPWDLy','yxbWBhK','yxnZzxrZlW','BgvUz3rO','mty2mdq1mMnizvbvwG','DMfSDwvZ','Aw5JBhvKzxm','nde4ndHWzfbowNu','mtuXote3nLfXq3Lewa','CMvZB2X2zq','Dg9tDhjPBMC','Cgf0Aa','Dg9mB3DLCKnHCW','C2XPy2u','nZm2u2vAq2D5','iokaLca'];_0x5be8=function(){return _0x4f34f1;};return _0x5be8();}export async function searchSelf(_0x30b9bc,_0x5749df=0x11df*-0x1+0xc46+0x59e,_0x46bc06=0x1*-0x1b65+-0x139c+-0x2f01*-0x1+0.3){const _0x143b92=_0x52d5,_0x56c8ce=_0x52d5,[_0xc27e73,_0x1eccd6,_0x1ce3c]=await Promise[_0x143b92(0xbe)]([searchSemantic(_0x30b9bc,_0x5749df,_0x46bc06),Promise['resolve'](searchCapabilities(_0x30b9bc)),Promise[_0x143b92(0xcb)](searchKeyword(_0x30b9bc))]),_0x4bd339=[..._0xc27e73,..._0x1eccd6,..._0x1ce3c],_0x297dff=new Map();for(const _0x4bb750 of _0x4bd339){const _0x322f31=_0x297dff[_0x143b92(0xb2)](_0x4bb750['source']);(!_0x322f31||_0x4bb750[_0x56c8ce(0xaf)]>_0x322f31[_0x56c8ce(0xaf)])&&_0x297dff[_0x56c8ce(0xb4)](_0x4bb750[_0x56c8ce(0xb7)],_0x4bb750);}return[..._0x297dff[_0x143b92(0xc7)]()][_0x143b92(0xbb)]((_0x424b59,_0x2bb113)=>_0x2bb113['score']-_0x424b59[_0x143b92(0xaf)])[_0x143b92(0xcf)](-0x17bb+0x1*-0x443+0x1bfe,_0x5749df);}export function formatSearchResults(_0x3fc928){const _0x225319=_0x52d5,_0x59dd5c=_0x52d5;if(_0x3fc928[_0x225319(0xc5)]===-0x1*0xe57+-0x1*-0x714+0x743*0x1)return _0x59dd5c(0xac)+'\x20found.';return _0x3fc928[_0x225319(0xaa)](_0x3345ea=>{const _0x5e096b=_0x225319,_0x379e1b=_0x59dd5c,_0x304d7e='['+_0x3345ea[_0x5e096b(0xaf)][_0x5e096b(0xd7)](-0x61*-0x31+-0x19d4+0x745)+']',_0x59e6dc=_0x3345ea[_0x5e096b(0xad)][_0x5e096b(0xa9)](0x2ad*-0xb+-0x1367+0x30e0),_0x8e0043=_0x3345ea[_0x5e096b(0xb7)],_0x468ce8=_0x3345ea[_0x379e1b(0xd8)+'th']?'\x0a'+''[_0x5e096b(0xa9)](-0x2653*-0x1+0x153c+-0x13d5*0x3)+_0x3345ea[_0x379e1b(0xd8)+'th']:'\x0a'+''[_0x379e1b(0xa9)](-0x1*0x2611+0x1738+0x15b*0xb)+'\x22'+_0x3345ea[_0x5e096b(0xbc)][_0x379e1b(0xcf)](0x1c50+-0x1*0x9eb+-0x1265,0x2654+-0x19a+0x1235*-0x2)+(_0x3345ea[_0x379e1b(0xbc)][_0x5e096b(0xc5)]>0x1b2e+0x24cc*-0x1+-0x1*-0x9ee?_0x5e096b(0xd4):'')+'\x22';return _0x304d7e+'\x20'+_0x59e6dc+'\x20'+_0x8e0043+_0x468ce8;})['join']('\x0a');}