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.
Files changed (137) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -31
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -174
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -583
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -86
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1902
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. 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');}