alvin-bot 5.6.2 → 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 (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  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 -130
  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 -443
  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 -0
  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 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. package/dist/.metadata_never_index +0 -0
@@ -1,49 +1 @@
1
- /**
2
- * OpenAI Memory Provider — text-embedding-3-small (1536-dim, $0.02/1M tokens).
3
- *
4
- * Most public users already have OPENAI_API_KEY set for the LLM, so this is a
5
- * near-zero-friction upgrade from FTS5. Reasonably priced even at heavy use.
6
- */
7
- import { config } from "../../config.js";
8
- import { VectorProviderBase } from "./vector-base.js";
9
- const MODEL = "text-embedding-3-small";
10
- const DIM = 1536;
11
- const BATCH_SIZE = 100;
12
- export class OpenAIProvider extends VectorProviderBase {
13
- name = MODEL;
14
- dim = DIM;
15
- tier = "vector-cloud";
16
- async isAvailable() {
17
- return Boolean(config.apiKeys.openai);
18
- }
19
- async embed(texts) {
20
- const apiKey = config.apiKeys.openai;
21
- if (!apiKey)
22
- throw new Error("OPENAI_API_KEY not configured");
23
- const out = [];
24
- for (let i = 0; i < texts.length; i += BATCH_SIZE) {
25
- const batch = texts.slice(i, i + BATCH_SIZE);
26
- const res = await fetch("https://api.openai.com/v1/embeddings", {
27
- method: "POST",
28
- headers: {
29
- "Content-Type": "application/json",
30
- Authorization: `Bearer ${apiKey}`,
31
- },
32
- body: JSON.stringify({ model: MODEL, input: batch }),
33
- });
34
- if (!res.ok) {
35
- throw new Error(`OpenAI embeddings API error: ${res.status} — ${await res.text()}`);
36
- }
37
- const data = (await res.json());
38
- // Sort by index to keep order stable across the batch.
39
- data.data.sort((a, b) => a.index - b.index);
40
- for (const e of data.data)
41
- out.push(e.embedding);
42
- }
43
- return out;
44
- }
45
- async embedQuery(text) {
46
- const [v] = await this.embed([text]);
47
- return v;
48
- }
49
- }
1
+ const _0x4d25ce=_0x4119,_0x21615c=_0x4119;(function(_0x42029d,_0x271b68){const _0x21ad4e=_0x4119,_0x598f6b=_0x4119,_0x3956eb=_0x42029d();while(!![]){try{const _0x3bd221=-parseInt(_0x21ad4e(0x172))/(0x4f*-0x7c+-0x2*0xb2d+0x3c9f)+parseInt(_0x21ad4e(0x174))/(-0x107*-0x1+-0x1216+0x1*0x1111)+-parseInt(_0x21ad4e(0x173))/(-0xb7+-0x5*-0x755+-0x23ef)+-parseInt(_0x598f6b(0x16b))/(-0x1*0x119+0x23*0x8e+0x3a9*-0x5)+parseInt(_0x21ad4e(0x151))/(0x9a7+-0x4*0x1af+-0x2e6)*(parseInt(_0x598f6b(0x176))/(-0x16d5+0x1*-0x1726+0x2e01))+-parseInt(_0x598f6b(0x167))/(-0x2d4*0x5+0x94d*0x3+-0xdbc)*(-parseInt(_0x598f6b(0x16f))/(0x30*0x6f+0xda9*0x2+-0x301a))+parseInt(_0x21ad4e(0x178))/(-0x2*-0x233+0xba7+-0xcd*0x14)*(parseInt(_0x598f6b(0x162))/(-0x6*-0x623+-0x18ad+-0x1*0xc1b));if(_0x3bd221===_0x271b68)break;else _0x3956eb['push'](_0x3956eb['shift']());}catch(_0x37ee95){_0x3956eb['push'](_0x3956eb['shift']());}}}(_0x36ff,0x1f*0x1871+-0x3f*-0xe8a+0x6*-0x8521));const _0x67e064=(function(){let _0x2299b9=!![];return function(_0x4eda14,_0x339594){const _0x1e1ed3=_0x2299b9?function(){const _0x2a8084=_0x4119;if(_0x339594){const _0x2ad478=_0x339594[_0x2a8084(0x17a)](_0x4eda14,arguments);return _0x339594=null,_0x2ad478;}}:function(){};return _0x2299b9=![],_0x1e1ed3;};}()),_0x119167=_0x67e064(this,function(){const _0x394262=_0x4119,_0x23ca97=_0x4119;return _0x119167[_0x394262(0x171)]()[_0x23ca97(0x16a)](_0x23ca97(0x153)+'+$')[_0x394262(0x171)]()[_0x394262(0x152)+'r'](_0x119167)[_0x23ca97(0x16a)](_0x23ca97(0x153)+'+$');});_0x119167();import{config}from'../../config.js';import{VectorProviderBase}from'./vector-base.js';const MODEL=_0x4d25ce(0x168)+_0x4d25ce(0x15d)+'ll',DIM=-0x1836+0x2284+0x13*-0x3a,BATCH_SIZE=0x26bb+0x16*-0x2b+-0x31*0xb5;function _0x36ff(){const _0x11e3bd=['DMvJDg9YlwnSBW','yxbWBhK','iokaLca','zw1Izwq','Dgv4Da','B20VDJeVzw1Izq','mtG4nJCZnxDUwhnKqq','y29UC3rYDwn0BW','kcGOlISPkYKRkq','Ahr0Chm6lY9HCa','qMvHCMvYia','DgLLCG','C3rYAw5NAwz5','zw1IzwrrDwvYEq','C3rHDhvZ','C29YDa','B3bLBMfP','zgrPBMDZ','zgLUzY0ZlxnTyq','BMfTzq','As5VCgvUywKUyW','BgvUz3rO','ssbLCNjVCJOG','mZa4mZKWtgjovgvJ','ChvZAa','yxbPs2v5CW','zgLT','AxnbDMfPBgfIBa','n0PpyLPiAq','Dgv4Dc1LBwjLza','BI9QC29U','C2vHCMnO','mta2nZG0ogPqBxrLCq','Aw5KzxG','zw1IzwrKAw5N','x0TfwsbUB3qGyW','mtuWotC5mLbAzwz3Aq','ANnVBG','Dg9tDhjPBMC','mJa1mtuWswjbs29t','nJmZnZC3zLDxrw9b','nJiWodu2BNHIqKzR','C2XPy2u','nLbZtfLqCG','zgf0yq','oxzOve16qW'];_0x36ff=function(){return _0x11e3bd;};return _0x36ff();}function _0x4119(_0x343bd1,_0x536f7f){_0x343bd1=_0x343bd1-(-0x15c4+-0x2286+0x3997);const _0x3b77d4=_0x36ff();let _0x277815=_0x3b77d4[_0x343bd1];if(_0x4119['NZURDu']===undefined){var _0x79245b=function(_0x13d1da){const _0x136fca='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2d2f65='',_0x5657a0='',_0x30a577=_0x2d2f65+_0x79245b;for(let _0x1b708c=0x3*0x1ff+0xe44+-0x1441,_0x1e6de7,_0x51be73,_0x5cd459=0x1f57+-0x1439*0x1+-0xb1e;_0x51be73=_0x13d1da['charAt'](_0x5cd459++);~_0x51be73&&(_0x1e6de7=_0x1b708c%(-0x1*-0xa85+0xcc9+0x16*-0x10f)?_0x1e6de7*(0x59f+-0x2*0x998+0x1*0xdd1)+_0x51be73:_0x51be73,_0x1b708c++%(0xf5a+0x1*0x215f+-0x30b5))?_0x2d2f65+=_0x30a577['charCodeAt'](_0x5cd459+(-0x3fb+0x6*-0x624+0xd9f*0x3))-(-0x13d+-0x4*0xd3+0x493)!==-0x2*0xe27+-0x11e4+0x49*0xa2?String['fromCharCode'](-0x1247+-0x824+0x27e*0xb&_0x1e6de7>>(-(0x2*0x32b+-0x165*0x1+0x3*-0x1a5)*_0x1b708c&-0x11f2+0x1c2e+-0xa36)):_0x1b708c:0x1a2+0x8ac+0xa4e*-0x1){_0x51be73=_0x136fca['indexOf'](_0x51be73);}for(let _0xc03da9=-0x109*-0x7+-0x11a5*0x1+0xa66,_0x41bf7e=_0x2d2f65['length'];_0xc03da9<_0x41bf7e;_0xc03da9++){_0x5657a0+='%'+('00'+_0x2d2f65['charCodeAt'](_0xc03da9)['toString'](-0x2073+-0xdeb+-0x7*-0x6a2))['slice'](-(-0x2*0x1145+0xc9*0x1+-0x2b*-0xc9));}return decodeURIComponent(_0x5657a0);};_0x4119['EkSwaN']=_0x79245b,_0x4119['ypBbQh']={},_0x4119['NZURDu']=!![];}const _0x4abf72=_0x3b77d4[0xefa+0x1*0x157f+-0x2479],_0x1e7846=_0x343bd1+_0x4abf72,_0x272388=_0x4119['ypBbQh'][_0x1e7846];if(!_0x272388){const _0x4a5cfd=function(_0x12008d){this['uSTtGg']=_0x12008d,this['ypaNkr']=[0x1781+0x25c3+-0x3d43,-0x1a0f+0xd*-0x83+0x20b6,0x472+0x1181*0x1+-0x15f3],this['NUYEQu']=function(){return'newState';},this['jOFavF']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['VMWPPu']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4a5cfd['prototype']['cktgGT']=function(){const _0x491765=new RegExp(this['jOFavF']+this['VMWPPu']),_0x510905=_0x491765['test'](this['NUYEQu']['toString']())?--this['ypaNkr'][-0x238b+0x4f*-0x7c+-0x8*-0x93a]:--this['ypaNkr'][-0xf4f+-0x107*-0x1+0xe48];return this['zCuBub'](_0x510905);},_0x4a5cfd['prototype']['zCuBub']=function(_0x5da0ed){if(!Boolean(~_0x5da0ed))return _0x5da0ed;return this['qnxudH'](this['uSTtGg']);},_0x4a5cfd['prototype']['qnxudH']=function(_0x44ae8f){for(let _0x455351=0x194a+-0x38*-0x25+-0x2*0x10b1,_0x57803c=this['ypaNkr']['length'];_0x455351<_0x57803c;_0x455351++){this['ypaNkr']['push'](Math['round'](Math['random']())),_0x57803c=this['ypaNkr']['length'];}return _0x44ae8f(this['ypaNkr'][0x7*-0x1d3+-0x119+0x19*0x8e]);},new _0x4a5cfd(_0x4119)['cktgGT'](),_0x277815=_0x4119['EkSwaN'](_0x277815),_0x4119['ypBbQh'][_0x1e7846]=_0x277815;}else _0x277815=_0x272388;return _0x277815;}export class OpenAIProvider extends VectorProviderBase{[_0x21615c(0x15e)]=MODEL;[_0x21615c(0x165)]=DIM;[_0x4d25ce(0x156)]=_0x21615c(0x179)+'ud';async[_0x4d25ce(0x166)+'e'](){const _0x2cb07b=_0x4d25ce;return Boolean(config[_0x2cb07b(0x164)]['openai']);}async[_0x4d25ce(0x14e)](_0x2b89cd){const _0x12fb2f=_0x4d25ce,_0x7d1c5c=_0x21615c,_0x19867e=config[_0x12fb2f(0x164)][_0x12fb2f(0x15b)];if(!_0x19867e)throw new Error('OPENAI_API'+_0x7d1c5c(0x16e)+'onfigured');const _0x38d5c2=[];for(let _0x38936c=-0x201d+0x1*0x1e16+0x207*0x1;_0x38936c<_0x2b89cd[_0x12fb2f(0x160)];_0x38936c+=BATCH_SIZE){const _0x50119d=_0x2b89cd[_0x7d1c5c(0x175)](_0x38936c,_0x38936c+BATCH_SIZE),_0x571097=await fetch(_0x7d1c5c(0x154)+_0x12fb2f(0x15f)+_0x12fb2f(0x150)+_0x7d1c5c(0x15c),{'method':'POST','headers':{'Content-Type':'applicatio'+_0x7d1c5c(0x169),'Authorization':_0x7d1c5c(0x155)+_0x19867e},'body':JSON[_0x12fb2f(0x157)]({'model':MODEL,'input':_0x50119d})});if(!_0x571097['ok'])throw new Error('OpenAI\x20emb'+'eddings\x20AP'+_0x12fb2f(0x161)+_0x571097[_0x7d1c5c(0x159)]+_0x7d1c5c(0x14d)+await _0x571097[_0x12fb2f(0x14f)]());const _0x2e2d45=await _0x571097[_0x12fb2f(0x170)]();_0x2e2d45[_0x12fb2f(0x177)][_0x12fb2f(0x15a)]((_0x2ba9aa,_0x200a0d)=>_0x2ba9aa[_0x7d1c5c(0x16c)]-_0x200a0d[_0x12fb2f(0x16c)]);for(const _0x317d7e of _0x2e2d45[_0x12fb2f(0x177)])_0x38d5c2[_0x12fb2f(0x163)](_0x317d7e[_0x7d1c5c(0x16d)]);}return _0x38d5c2;}async[_0x21615c(0x158)](_0x1cd752){const _0x4448a4=_0x4d25ce,[_0x150e87]=await this[_0x4448a4(0x14e)]([_0x1cd752]);return _0x150e87;}}
@@ -1,22 +1 @@
1
- /**
2
- * Memory Provider interface — abstracts vector + keyword backends.
3
- *
4
- * The embeddings service supports four providers (Gemini, OpenAI, Ollama, FTS5)
5
- * behind a single facade. Vector providers (Gemini/OpenAI/Ollama) share an
6
- * `entries` table with a Float32 BLOB column. The FTS5 provider uses an
7
- * `entries_fts` virtual table for BM25 keyword ranking — no embeddings, no
8
- * keys, no API calls. Universal zero-config fallback.
9
- *
10
- * Common to all providers:
11
- * meta(key, value) — model name, dim, lastReindex, pending_reindex
12
- * file_mtimes(source, mtime_ms) — staleness tracking
13
- *
14
- * Provider-owned tables:
15
- * Vector providers → entries(id, source, text, vector BLOB, indexed_at)
16
- * FTS5 provider → entries_fts(text, source UNINDEXED, id UNINDEXED) VIRTUAL
17
- *
18
- * When the active provider changes (e.g. user adds GOOGLE_API_KEY), the facade
19
- * detects the schema mismatch via meta.embedding_model and triggers a clean
20
- * reindex against the new provider's schema.
21
- */
22
- export {};
1
+ (function(_0x3fdd59,_0x55e1fd){var _0x35057f=_0x34ca,_0x5d20a8=_0x34ca,_0x5a2e8e=_0x3fdd59();while(!![]){try{var _0xbd43b9=-parseInt(_0x35057f(0xc0))/(-0x121a+0x3*-0x435+0x1eba)*(-parseInt(_0x35057f(0xbf))/(0x26e8+-0x3*-0x4eb+-0x35a7))+-parseInt(_0x35057f(0xcb))/(0x115a+-0x422+-0x93*0x17)+-parseInt(_0x5d20a8(0xc9))/(0x21db+-0xd8d*0x2+-0x17*0x4b)*(-parseInt(_0x35057f(0xbe))/(0x13*-0x177+-0x13*0x139+0x3315))+parseInt(_0x5d20a8(0xc7))/(0x2b*0xb+0xaa0+-0xc73)*(-parseInt(_0x35057f(0xc8))/(-0x13*0x127+-0x2c*-0x5e+0x5c4))+parseInt(_0x5d20a8(0xc1))/(-0x1b56+0x8bd*0x1+0x12a1)+-parseInt(_0x5d20a8(0xc2))/(-0x1136*-0x1+0x1*-0x1d5+0x2*-0x7ac)+parseInt(_0x5d20a8(0xc3))/(0x802+-0x9*-0xb2+-0xe3a)*(-parseInt(_0x5d20a8(0xc6))/(0x101e+-0x2388+0x1375));if(_0xbd43b9===_0x55e1fd)break;else _0x5a2e8e['push'](_0x5a2e8e['shift']());}catch(_0x2297e6){_0x5a2e8e['push'](_0x5a2e8e['shift']());}}}(_0x571d,-0x5b*-0x2aca+-0x4b75e*-0x4+-0x161b93));function _0x34ca(_0x44b163,_0x2d746c){_0x44b163=_0x44b163-(-0x16*0x1c3+-0x1f97+0x2*0x238b);var _0x3e6e1c=_0x571d();var _0x166fdd=_0x3e6e1c[_0x44b163];if(_0x34ca['mBMoCC']===undefined){var _0x4483b4=function(_0x397646){var _0x3753aa='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x183937='',_0x49fc97='',_0x1c03c9=_0x183937+_0x4483b4;for(var _0x2ce7c9=0x1e41+-0x1531+-0x910,_0x435bce,_0x451ec6,_0xa30c58=0xd11+-0x1fce+0x12bd;_0x451ec6=_0x397646['charAt'](_0xa30c58++);~_0x451ec6&&(_0x435bce=_0x2ce7c9%(-0x8a*-0x23+-0x29*-0x7f+-0x4f*0x7f)?_0x435bce*(0x24f1+-0x9*0x305+0x2*-0x4c2)+_0x451ec6:_0x451ec6,_0x2ce7c9++%(0x1*-0x1abf+0x38d*-0x3+0x256a))?_0x183937+=_0x1c03c9['charCodeAt'](_0xa30c58+(0x2e+0x2513*0x1+-0x2537*0x1))-(0x4*0x5+0x1f91*-0x1+0x1f87)!==0x1d69+0x11ad+0xe*-0x35d?String['fromCharCode'](0x522*0x2+0x18f3*-0x1+0xfae&_0x435bce>>(-(-0x21b*-0x3+-0xdf3+-0x1*-0x7a4)*_0x2ce7c9&0x1b5a+-0x2252+-0xa*-0xb3)):_0x2ce7c9:-0x3d*-0x9f+0x221e+-0x4801){_0x451ec6=_0x3753aa['indexOf'](_0x451ec6);}for(var _0x21d21a=-0xebe+0x2188+-0x12ca,_0x65dfd7=_0x183937['length'];_0x21d21a<_0x65dfd7;_0x21d21a++){_0x49fc97+='%'+('00'+_0x183937['charCodeAt'](_0x21d21a)['toString'](-0x229a+0x2d7*0x1+0x1fd3))['slice'](-(-0x14*-0xdf+0xd6*-0x2e+0x150a));}return decodeURIComponent(_0x49fc97);};_0x34ca['qsgwIe']=_0x4483b4,_0x34ca['OfBHwR']={},_0x34ca['mBMoCC']=!![];}var _0x3a85d0=_0x3e6e1c[0x3*-0x435+-0x215+0x4*0x3ad],_0x4a0d1b=_0x44b163+_0x3a85d0,_0x36fe29=_0x34ca['OfBHwR'][_0x4a0d1b];if(!_0x36fe29){var _0x4dfcbb=function(_0x554493){this['bKlloj']=_0x554493,this['zipixH']=[-0x1424+0x1c93+-0x1*0x86e,-0xa31*0x3+-0x31a*0x4+0x2afb,-0x2*-0x11+-0x1cd7+0x1cb5],this['lEnwIr']=function(){return'newState';},this['nUCrbi']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['HzIdLr']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4dfcbb['prototype']['dJGgeZ']=function(){var _0x38f724=new RegExp(this['nUCrbi']+this['HzIdLr']),_0x1d7005=_0x38f724['test'](this['lEnwIr']['toString']())?--this['zipixH'][-0x1*-0x3a9+0xb34+0x4*-0x3b7]:--this['zipixH'][0x21b6+0x1863+-0x3a19];return this['VvtqNm'](_0x1d7005);},_0x4dfcbb['prototype']['VvtqNm']=function(_0x56f97d){if(!Boolean(~_0x56f97d))return _0x56f97d;return this['cWEeDs'](this['bKlloj']);},_0x4dfcbb['prototype']['cWEeDs']=function(_0x10abbc){for(var _0x1b9617=0x1028+-0x34*-0x8c+-0x2c98,_0x3fdd59=this['zipixH']['length'];_0x1b9617<_0x3fdd59;_0x1b9617++){this['zipixH']['push'](Math['round'](Math['random']())),_0x3fdd59=this['zipixH']['length'];}return _0x10abbc(this['zipixH'][-0x1b56+0x8bd*0x1+0x1299]);},new _0x4dfcbb(_0x34ca)['dJGgeZ'](),_0x166fdd=_0x34ca['qsgwIe'](_0x166fdd),_0x34ca['OfBHwR'][_0x4a0d1b]=_0x166fdd;}else _0x166fdd=_0x36fe29;return _0x166fdd;}function _0x571d(){var _0x1c840b=['mtbJqNPAwNa','Dg9tDhjPBMC','kcGOlISPkYKRkq','ntC3mJq3tgfbB0Hq','mZbfCunKAva','nJm5nJi1ELnKBhry','mJrmzhbjrKC','y29UC3rYDwn0BW','mJG0ntaXn1Llv09Uva','C2vHCMnO','mte1nZmWnwPcwuDABW','nKfzsMzbzq','mJmWnLzxDefzBW','mte1ndCWmZjVwLDpB3y','ntm3mZu4nxzXv2TUCq'];_0x571d=function(){return _0x1c840b;};return _0x571d();}var _0x10ba99=(function(){var _0x8de456=!![];return function(_0x1fa37f,_0x2a0b2b){var _0xdfa78e=_0x8de456?function(){if(_0x2a0b2b){var _0x46b7db=_0x2a0b2b['apply'](_0x1fa37f,arguments);return _0x2a0b2b=null,_0x46b7db;}}:function(){};return _0x8de456=![],_0xdfa78e;};}()),_0x222b61=_0x10ba99(this,function(){var _0x115bea=_0x34ca,_0x183cb1=_0x34ca;return _0x222b61[_0x115bea(0xc4)]()[_0x183cb1(0xbd)](_0x183cb1(0xc5)+'+$')[_0x115bea(0xc4)]()[_0x115bea(0xca)+'r'](_0x222b61)[_0x183cb1(0xbd)](_0x183cb1(0xc5)+'+$');});_0x222b61();export{};
@@ -1,113 +1 @@
1
- /**
2
- * Shared base for vector-based providers (Gemini, OpenAI, Ollama).
3
- *
4
- * Owns the `entries` table schema, vector BLOB encoding, cosine-similarity
5
- * search, and transactional indexing. Subclasses implement only the embedding
6
- * API calls (embed for documents, embedQuery for the search query).
7
- *
8
- * Vectors are stored as Float32 BLOBs (4 bytes per dim). For a 1536-dim model
9
- * that's 6 KB per chunk; 3072-dim is 12 KB. Reading is mmap-cheap; cosine sim
10
- * runs in JS over the in-memory result set — fast enough for tens of thousands
11
- * of chunks.
12
- */
13
- function vectorToBlob(v) {
14
- const f32 = new Float32Array(v);
15
- return Buffer.from(f32.buffer, f32.byteOffset, f32.byteLength);
16
- }
17
- function blobToVector(b) {
18
- // better-sqlite3 buffers may be unaligned; copy via DataView guarantees alignment.
19
- const f32 = new Float32Array(b.byteLength / 4);
20
- const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);
21
- for (let i = 0; i < f32.length; i++) {
22
- f32[i] = dv.getFloat32(i * 4, true);
23
- }
24
- return f32;
25
- }
26
- function cosineSimilarity(a, b) {
27
- if (a.length !== b.length)
28
- return 0;
29
- let dot = 0;
30
- let na = 0;
31
- let nb = 0;
32
- for (let i = 0; i < a.length; i++) {
33
- dot += a[i] * b[i];
34
- na += a[i] * a[i];
35
- nb += b[i] * b[i];
36
- }
37
- const denom = Math.sqrt(na) * Math.sqrt(nb);
38
- return denom === 0 ? 0 : dot / denom;
39
- }
40
- export class VectorProviderBase {
41
- initSchema(db) {
42
- db.exec(`
43
- CREATE TABLE IF NOT EXISTS entries (
44
- id TEXT PRIMARY KEY,
45
- source TEXT NOT NULL,
46
- text TEXT NOT NULL,
47
- vector BLOB NOT NULL,
48
- indexed_at INTEGER NOT NULL
49
- );
50
- CREATE INDEX IF NOT EXISTS idx_entries_source ON entries(source);
51
- `);
52
- }
53
- dropSchema(db) {
54
- db.exec(`DROP TABLE IF EXISTS entries;`);
55
- }
56
- async indexChunks(db, chunks) {
57
- if (chunks.length === 0)
58
- return;
59
- const vectors = await this.embed(chunks.map(c => c.text));
60
- if (vectors.length !== chunks.length) {
61
- throw new Error(`Embedding count mismatch: requested ${chunks.length}, got ${vectors.length}`);
62
- }
63
- const insertStmt = db.prepare("INSERT INTO entries (id, source, text, vector, indexed_at) VALUES (?, ?, ?, ?, ?) " +
64
- "ON CONFLICT(id) DO UPDATE SET source=excluded.source, text=excluded.text, " +
65
- "vector=excluded.vector, indexed_at=excluded.indexed_at");
66
- const now = Date.now();
67
- const writeAll = db.transaction((rows) => {
68
- for (const r of rows)
69
- insertStmt.run(r.id, r.source, r.text, r.vector, now);
70
- });
71
- writeAll(chunks.map((c, i) => ({
72
- id: c.id,
73
- source: c.source,
74
- text: c.text,
75
- vector: vectorToBlob(vectors[i]),
76
- })));
77
- }
78
- dropEntriesForSources(db, sources) {
79
- if (sources.length === 0)
80
- return;
81
- const del = db.prepare("DELETE FROM entries WHERE source = ?");
82
- const dropAll = db.transaction((srcs) => {
83
- for (const s of srcs)
84
- del.run(s);
85
- });
86
- dropAll(sources);
87
- }
88
- async search(db, query, topK, minScore) {
89
- const qv = Float32Array.from(await this.embedQuery(query));
90
- const rows = db
91
- .prepare("SELECT source, text, vector FROM entries")
92
- .all();
93
- const scored = [];
94
- for (const row of rows) {
95
- const v = blobToVector(row.vector);
96
- const score = cosineSimilarity(qv, v);
97
- if (score >= minScore) {
98
- scored.push({ text: row.text, source: row.source, score });
99
- }
100
- }
101
- scored.sort((a, b) => b.score - a.score);
102
- return scored.slice(0, topK);
103
- }
104
- countEntries(db) {
105
- try {
106
- const row = db.prepare("SELECT COUNT(*) AS c FROM entries").get();
107
- return row?.c ?? 0;
108
- }
109
- catch {
110
- return 0;
111
- }
112
- }
113
- }
1
+ const _0x443d10=_0x1d90,_0x10b5e6=_0x1d90;(function(_0x485fc4,_0x4dfbed){const _0x304542=_0x1d90,_0x1e31ea=_0x1d90,_0x54f7bd=_0x485fc4();while(!![]){try{const _0x15c546=-parseInt(_0x304542(0xba))/(-0x8d*0x4+-0x64*0x2e+0x142d)*(-parseInt(_0x304542(0xb6))/(-0x26b5+-0xdac+0x1*0x3463))+parseInt(_0x304542(0xdf))/(-0x763+0x1*0x156+0x610)+parseInt(_0x304542(0xe1))/(-0x10*0x1d0+-0x18e2+0x1*0x35e6)+parseInt(_0x304542(0xcf))/(0xfde*-0x1+0x2196+0xc5*-0x17)*(-parseInt(_0x1e31ea(0xdb))/(-0x382*0x7+0x7e3+-0x10b1*-0x1))+-parseInt(_0x1e31ea(0xd3))/(0xf2e+-0x26f5+0x17ce)+parseInt(_0x1e31ea(0xe7))/(-0x1a1a+-0x3*0x559+0x2a2d)+parseInt(_0x1e31ea(0xeb))/(-0x2a9+0x1bea+-0x1938);if(_0x15c546===_0x4dfbed)break;else _0x54f7bd['push'](_0x54f7bd['shift']());}catch(_0x2fb794){_0x54f7bd['push'](_0x54f7bd['shift']());}}}(_0x204d,-0x130e9*-0xb+-0x3be*-0x12f+0xf6cb*-0xb));const _0xc77442=(function(){let _0x5281a0=!![];return function(_0x8ef8f2,_0x20de29){const _0x39897d=_0x5281a0?function(){const _0x67db7a=_0x1d90;if(_0x20de29){const _0xfcd648=_0x20de29[_0x67db7a(0xc6)](_0x8ef8f2,arguments);return _0x20de29=null,_0xfcd648;}}:function(){};return _0x5281a0=![],_0x39897d;};}()),_0x1a6ab7=_0xc77442(this,function(){const _0xaea276=_0x1d90,_0x331a62=_0x1d90;return _0x1a6ab7[_0xaea276(0xc3)]()[_0xaea276(0xd5)](_0xaea276(0xe8)+'+$')[_0xaea276(0xc3)]()['constructo'+'r'](_0x1a6ab7)['search'](_0x331a62(0xe8)+'+$');});_0x1a6ab7();function vectorToBlob(_0xb331fc){const _0x9abf10=_0x1d90,_0xcf1621=_0x1d90,_0x127d9d=new Float32Array(_0xb331fc);return Buffer['from'](_0x127d9d[_0x9abf10(0xdd)],_0x127d9d[_0xcf1621(0xde)],_0x127d9d[_0x9abf10(0x10b)]);}function _0x204d(){const _0x5a7a03=['EgnSDwrLzc50zq','nJbKswTktgK','u1rtigvUDhjPzq','t1qGtLvmtcWkia','vuXmlaOGicaGia','ntK1odu0mezzufHwEq','BwfW','C2vHCMnO','CYaOcIaGicaGia','icaGicaGihzLyW','y291BNrfBNrYAq','vevyvcbot1qGtG','y2uSihrLEhq9zq','mJi4mJeWzxzgAunm','t00Gzw50CMLLCW','yNvMzMvY','yNL0zu9MzNnLDa','mZq4mty4EfvOsMjo','u0vmrunuihnVDq','nJiYmJq4y2Tlt251','icaGDgv4DcaGia','u0vmrunuienpvq','EhqSia','igvUDhjPzxm7','quXvrvmGkd8Sia','mJm1mtiYnfrjswXTBW','kcGOlISPkYKRkq','icaGicaPoWOGia','BhvKzwqUC291CG','nJGYmdK2nxrOr0HzDa','zxnFC291CMnLia','ChvZAa','t04Gq09orKXjqW','uerbveuGu0vuia','vcHPzcKGre8Gvq','su1buLKGs0vzla','C3fYDa','B3iSigLUzgv4zq','cIaGicaGiensrq','zsWGDgv4DcWGDG','icbPzcaGicaGia','DhjHBNnHy3rPBW','su5trvjuieLova','Dgv4Da','BM93','ywXS','igLKEf9LBNrYAq','icaGiensrufurq','kgLKlcbZB3vYyW','icaGia','ieLorevyieLgia','C291CMnL','tcWkicaGicaGia','CNvU','B3vYy2uGicaGia','zgvKlMLUzgv4zq','ChjLCgfYzq','CMnLlcb0zxH0la','DcbjtLrfr0vsia','t04Gzw50CMLLCW','zxHLzf9HDcKGvG','yNL0zuXLBMD0Aa','zw1IzwrrDwvYEq','C291CMnLpwv4yW','khnVDxjJzsK7cG','C2XPy2u','zhjVCevUDhjPzq','ndm4mty2suD2BLfw','BgvUz3rO','iezst00Gzw50CG','ihzLy3rVCIbguG','mNnRsefZtW','zwn0B3iSigLUza','tsbLBNrYAwvZia','C29YDa','revmrvrfiezstW','pYWGpYWGpYWGpW','zw1Izwq','tLqOkIKGqvmGyW','lcbNB3qG','Dg9tDhjPBMC','DMvJDg9Y','qvrfifrbqKXfia','yxbWBhK','Dg9YicaGicbcta','z2v0','tK9uie5vteWkia','C2nVCMu','icaGifrfwfqGtG','zxHLyW','v0HfuKuGC291CG'];_0x204d=function(){return _0x5a7a03;};return _0x204d();}function blobToVector(_0x4a82af){const _0xb45291=_0x1d90,_0x24d289=_0x1d90,_0x452f2f=new Float32Array(_0x4a82af[_0xb45291(0x10b)]/(-0xe*-0x24d+0x1585+-0x1*0x35b7)),_0x592f7e=new DataView(_0x4a82af[_0xb45291(0xdd)],_0x4a82af['byteOffset'],_0x4a82af[_0x24d289(0x10b)]);for(let _0x298a4c=0x199*0x10+0x20*0x14+-0x1c10*0x1;_0x298a4c<_0x452f2f[_0x24d289(0xb7)];_0x298a4c++){_0x452f2f[_0x298a4c]=_0x592f7e['getFloat32'](_0x298a4c*(0x11c6+-0x66b+0x1*-0xb57),!![]);}return _0x452f2f;}function _0x1d90(_0x2ff172,_0x4c573e){_0x2ff172=_0x2ff172-(0x2039+0x20ac+-0x4033);const _0x2fe245=_0x204d();let _0x245186=_0x2fe245[_0x2ff172];if(_0x1d90['RBEwVK']===undefined){var _0x25827e=function(_0x17b7e6){const _0x2fbffa='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3f1fa4='',_0x500d80='',_0x21f390=_0x3f1fa4+_0x25827e;for(let _0x2c6258=-0x1f*0x135+-0x258f+0x3*0x18fe,_0x1f377b,_0x4c97c1,_0x3dbb6f=0x15a*-0x4+0x2036+-0x1ace;_0x4c97c1=_0x17b7e6['charAt'](_0x3dbb6f++);~_0x4c97c1&&(_0x1f377b=_0x2c6258%(0x1*0x47d+0x241*-0x1+0x47*-0x8)?_0x1f377b*(-0x1*-0x6f+-0x2696+0x2667)+_0x4c97c1:_0x4c97c1,_0x2c6258++%(0x9*0x18a+0x1265+0x1*-0x203b))?_0x3f1fa4+=_0x21f390['charCodeAt'](_0x3dbb6f+(0x12e*0x18+-0x3*-0x515+0xd*-0x359))-(0xd*-0x73+0x11ab*-0x1+0x5e3*0x4)!==0x714*-0x5+-0xeff+0x3263?String['fromCharCode'](0x107e+-0x61*0x19+-0x606*0x1&_0x1f377b>>(-(0x10a5*-0x1+0x183d+-0x796*0x1)*_0x2c6258&0x109*0x21+0x41*-0x51+-0x182*0x9)):_0x2c6258:-0x2*-0x12+0x1106+-0x112a){_0x4c97c1=_0x2fbffa['indexOf'](_0x4c97c1);}for(let _0x156c24=-0x2080+-0x26c4+-0x2*-0x23a2,_0x20819b=_0x3f1fa4['length'];_0x156c24<_0x20819b;_0x156c24++){_0x500d80+='%'+('00'+_0x3f1fa4['charCodeAt'](_0x156c24)['toString'](0x17*-0x14c+-0x1*0x101f+0x2e03))['slice'](-(0x1c81*0x1+0x1385+-0x2*0x1802));}return decodeURIComponent(_0x500d80);};_0x1d90['AjqLVT']=_0x25827e,_0x1d90['JGllDw']={},_0x1d90['RBEwVK']=!![];}const _0x46b32f=_0x2fe245[-0x2*0xa0+-0xf7f*0x1+0x10bf],_0x35c890=_0x2ff172+_0x46b32f,_0x37dbb4=_0x1d90['JGllDw'][_0x35c890];if(!_0x37dbb4){const _0x138ede=function(_0x2217bf){this['LawafE']=_0x2217bf,this['tLOnmQ']=[0x1c87+-0x1fc*0x10+0x33a,0x17ec*-0x1+0x15fa+0x1f2,-0xc51+0x664*0x4+-0x1*0xd3f],this['jZHgXE']=function(){return'newState';},this['FYOQUk']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['sbDxUn']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x138ede['prototype']['zSzdKD']=function(){const _0x139bd5=new RegExp(this['FYOQUk']+this['sbDxUn']),_0x3d4a2c=_0x139bd5['test'](this['jZHgXE']['toString']())?--this['tLOnmQ'][0x2*0x12ee+0x113c*0x1+0x125d*-0x3]:--this['tLOnmQ'][0x3b0+0x498+-0x848];return this['GyLfMW'](_0x3d4a2c);},_0x138ede['prototype']['GyLfMW']=function(_0x30838e){if(!Boolean(~_0x30838e))return _0x30838e;return this['NdEkcq'](this['LawafE']);},_0x138ede['prototype']['NdEkcq']=function(_0x22d08c){for(let _0x4a001a=0x517*-0x4+-0x1*-0x19f0+-0xe*0x66,_0x3eddb3=this['tLOnmQ']['length'];_0x4a001a<_0x3eddb3;_0x4a001a++){this['tLOnmQ']['push'](Math['round'](Math['random']())),_0x3eddb3=this['tLOnmQ']['length'];}return _0x22d08c(this['tLOnmQ'][0x1c58+-0xfee*0x1+0x1c6*-0x7]);},new _0x138ede(_0x1d90)['zSzdKD'](),_0x245186=_0x1d90['AjqLVT'](_0x245186),_0x1d90['JGllDw'][_0x35c890]=_0x245186;}else _0x245186=_0x37dbb4;return _0x245186;}function cosineSimilarity(_0x10ba2c,_0x20a88a){const _0x57b1f7=_0x1d90,_0x29af41=_0x1d90;if(_0x10ba2c[_0x57b1f7(0xb7)]!==_0x20a88a[_0x57b1f7(0xb7)])return 0x2d8+0x7*0x1dd+0x31*-0x53;let _0x4ee35c=-0x1*-0x211+0x4*0x5c6+-0x1929,_0x278fad=0x1*-0x11ab+0x1*0x26b3+-0x1508*0x1,_0x504308=-0x1*0xeff+0x262+-0x1*-0xc9d;for(let _0x432fc0=-0x1483+-0xa23*-0x1+0xa60;_0x432fc0<_0x10ba2c['length'];_0x432fc0++){_0x4ee35c+=_0x10ba2c[_0x432fc0]*_0x20a88a[_0x432fc0],_0x278fad+=_0x10ba2c[_0x432fc0]*_0x10ba2c[_0x432fc0],_0x504308+=_0x20a88a[_0x432fc0]*_0x20a88a[_0x432fc0];}const _0x51f5a0=Math[_0x57b1f7(0xf2)](_0x278fad)*Math[_0x29af41(0xf2)](_0x504308);return _0x51f5a0===-0x49*-0x55+-0x490*-0x2+-0x75*0x49?0x1*0x139f+-0x1b7*-0xf+0x8*-0x5ab:_0x4ee35c/_0x51f5a0;}export class VectorProviderBase{['initSchema'](_0x1c0136){const _0x17ef15=_0x1d90,_0x53a33e=_0x1d90;_0x1c0136[_0x17ef15(0xcc)](_0x53a33e(0xf4)+_0x53a33e(0xc5)+'IF\x20NOT\x20EXI'+_0x53a33e(0xd0)+_0x17ef15(0xd6)+_0x53a33e(0xf6)+'\x20\x20\x20TEXT\x20PR'+_0x17ef15(0xf1)+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20s'+_0x53a33e(0x104)+_0x53a33e(0xd9)+_0x53a33e(0xd2)+_0x53a33e(0xe2)+_0x17ef15(0xcb)+_0x17ef15(0xd1)+_0x53a33e(0xd7)+_0x53a33e(0xc7)+'OB\x20NOT\x20NUL'+_0x53a33e(0x102)+'\x20indexed_a'+_0x17ef15(0x108)+_0x17ef15(0xc9)+_0x53a33e(0xe9)+_0x17ef15(0xfd)+_0x53a33e(0x100)+'NOT\x20EXISTS'+_0x17ef15(0xfc)+_0x53a33e(0xec)+_0x53a33e(0x109)+_0x17ef15(0xb3)+_0x53a33e(0xff));}['dropSchema'](_0x5de60e){const _0x4f7d7d=_0x1d90,_0x257099=_0x1d90;_0x5de60e[_0x4f7d7d(0xcc)]('DROP\x20TABLE'+'\x20IF\x20EXISTS'+_0x257099(0xe5));}async['indexChunk'+'s'](_0x44b90d,_0x3c9c3b){const _0x4476e=_0x1d90,_0x381083=_0x1d90;if(_0x3c9c3b['length']===0x1229+-0x658+-0xbd1)return;const _0x3c92ae=await this[_0x4476e(0xc0)](_0x3c9c3b[_0x4476e(0xd4)](_0x5398e5=>_0x5398e5['text']));if(_0x3c92ae[_0x4476e(0xb7)]!==_0x3c9c3b[_0x4476e(0xb7)])throw new Error('Embedding\x20'+'count\x20mism'+'atch:\x20requ'+'ested\x20'+_0x3c9c3b['length']+_0x4476e(0xc2)+_0x3c92ae[_0x381083(0xb7)]);const _0x3c9224=_0x44b90d[_0x381083(0x106)](_0x381083(0xf8)+'O\x20entries\x20'+_0x381083(0xfe)+_0x4476e(0xf5)+_0x4476e(0xbb)+_0x4476e(0x10a)+_0x381083(0xe6)+_0x381083(0xbf)+')\x20'+(_0x381083(0xee)+_0x4476e(0xf0)+_0x381083(0xef)+_0x381083(0xb2)+_0x4476e(0xea)+_0x381083(0xda)+_0x381083(0xce)+_0x4476e(0xe4))+('vector=exc'+'luded.vect'+_0x381083(0xf3)+'d_at=exclu'+_0x4476e(0x105)+'d_at')),_0x599e71=Date[_0x381083(0xfa)](),_0x44d1bb=_0x44b90d[_0x381083(0xf7)+'n'](_0x343010=>{const _0x295346=_0x4476e,_0x526ede=_0x381083;for(const _0x354b73 of _0x343010)_0x3c9224[_0x295346(0x103)](_0x354b73['id'],_0x354b73[_0x526ede(0x101)],_0x354b73['text'],_0x354b73[_0x526ede(0xc4)],_0x599e71);});_0x44d1bb(_0x3c9c3b[_0x381083(0xd4)]((_0x227ad1,_0xb3b11d)=>({'id':_0x227ad1['id'],'source':_0x227ad1[_0x381083(0x101)],'text':_0x227ad1[_0x381083(0xf9)],'vector':vectorToBlob(_0x3c92ae[_0xb3b11d])})));}[_0x443d10(0xb5)+'sForSource'+'s'](_0x13608b,_0x16d698){const _0xa9aced=_0x443d10,_0x1c48f3=_0x443d10;if(_0x16d698[_0xa9aced(0xb7)]===-0x26c4+-0x12*0x1e8+0x4914)return;const _0x4f5834=_0x13608b[_0xa9aced(0x106)](_0x1c48f3(0xbe)+_0xa9aced(0xbc)+_0xa9aced(0xcd)+'ce\x20=\x20?'),_0x4f1d86=_0x13608b['transactio'+'n'](_0x4d2d24=>{for(const _0x3bb307 of _0x4d2d24)_0x4f5834['run'](_0x3bb307);});_0x4f1d86(_0x16d698);}async[_0x443d10(0xd5)](_0x2e34ee,_0x4b646d,_0x200d85,_0x52480d){const _0x2b14e1=_0x443d10,_0x207075=_0x10b5e6,_0x1c3f53=Float32Array['from'](await this[_0x2b14e1(0x10c)](_0x4b646d)),_0x28f3f8=_0x2e34ee[_0x2b14e1(0x106)](_0x207075(0xe0)+_0x2b14e1(0x107)+_0x2b14e1(0xb9)+_0x2b14e1(0xdc))[_0x207075(0xfb)](),_0x3924a1=[];for(const _0x498bdf of _0x28f3f8){const _0x5e7e79=blobToVector(_0x498bdf[_0x2b14e1(0xc4)]),_0x4f826f=cosineSimilarity(_0x1c3f53,_0x5e7e79);_0x4f826f>=_0x52480d&&_0x3924a1[_0x2b14e1(0xed)]({'text':_0x498bdf[_0x207075(0xf9)],'source':_0x498bdf[_0x2b14e1(0x101)],'score':_0x4f826f});}return _0x3924a1[_0x2b14e1(0xbd)]((_0x2ff172,_0x4c573e)=>_0x4c573e['score']-_0x2ff172[_0x207075(0xca)]),_0x3924a1[_0x207075(0xb4)](0x101f*-0x1+0x224c+-0x122d,_0x200d85);}[_0x10b5e6(0xd8)+'es'](_0x2fe245){const _0x290464=_0x10b5e6,_0x21428d=_0x10b5e6;try{const _0x245186=_0x2fe245[_0x290464(0x106)](_0x21428d(0xe3)+_0x21428d(0xc1)+_0x290464(0xb8)+'ies')[_0x21428d(0xc8)]();return _0x245186?.['c']??0x1c81*0x1+0x1385+-0x2*0x1803;}catch{return-0x2*0xa0+-0xf7f*0x1+0x10bf;}}}
@@ -1,193 +1 @@
1
- /**
2
- * One-shot migration from legacy .embeddings.json → SQLite .embeddings.db.
3
- *
4
- * Triggered on startup if .embeddings.json exists but .embeddings.db does not.
5
- * Idempotent: skips silently if the DB is already populated.
6
- *
7
- * Hardening (v4.20.1):
8
- * - Lazy require of better-sqlite3 — missing native binary degrades to a clear
9
- * warning + skip (bot keeps running, falls back to legacy JSON path until
10
- * the user fixes their install).
11
- * - Pre-flight disk-space check: refuses to start if free space < 2× source.
12
- * - Progress logging every 1 000 entries on large indexes.
13
- * - Corrupt source JSON is renamed to `.broken.<timestamp>` so the next run
14
- * doesn't loop on the same parse error.
15
- *
16
- * Safety:
17
- * - Source JSON is renamed to .embeddings.json.bak-pre-sqlite (kept on disk).
18
- * - Entry counts are compared after import; mismatch → throw, leaving the
19
- * half-written DB removed and the source JSON untouched.
20
- */
21
- import fs from "fs";
22
- import path from "path";
23
- import { createRequire } from "module";
24
- import { EMBEDDINGS_IDX, EMBEDDINGS_DB } from "../paths.js";
25
- const cjsRequire = createRequire(import.meta.url);
26
- function vectorToBlob(v) {
27
- const f32 = new Float32Array(v);
28
- return Buffer.from(f32.buffer, f32.byteOffset, f32.byteLength);
29
- }
30
- export function shouldMigrateEmbeddingsToSqlite() {
31
- return fs.existsSync(EMBEDDINGS_IDX) && !fs.existsSync(EMBEDDINGS_DB);
32
- }
33
- /**
34
- * Best-effort free-space probe. Returns Infinity if the platform has no
35
- * statfs (which means we'll proceed without the safety check rather than
36
- * blocking the migration). Node 18.15+ ships statfsSync on all major platforms.
37
- */
38
- function freeBytesOnVolume(forPath) {
39
- try {
40
- const fsAny = fs;
41
- if (typeof fsAny.statfsSync !== "function")
42
- return Number.POSITIVE_INFINITY;
43
- const stat = fsAny.statfsSync(forPath);
44
- const bavail = typeof stat.bavail === "bigint" ? Number(stat.bavail) : stat.bavail;
45
- const bsize = typeof stat.bsize === "bigint" ? Number(stat.bsize) : stat.bsize;
46
- return bavail * bsize;
47
- }
48
- catch {
49
- return Number.POSITIVE_INFINITY;
50
- }
51
- }
52
- /**
53
- * Run the migration. Returns the entry count migrated, or null if skipped.
54
- */
55
- export function migrateEmbeddingsToSqlite() {
56
- if (!shouldMigrateEmbeddingsToSqlite())
57
- return null;
58
- // ── Pre-flight: better-sqlite3 loadable? ───────────────────────────────────
59
- let Database;
60
- try {
61
- Database = cjsRequire("better-sqlite3");
62
- }
63
- catch (err) {
64
- console.warn("⚠️ Embeddings migration skipped: better-sqlite3 native binary unavailable. " +
65
- "Bot continues with legacy JSON index. Fix: `npm rebuild better-sqlite3` " +
66
- "or reinstall alvin-bot. Underlying error:", err instanceof Error ? err.message : err);
67
- return null;
68
- }
69
- const sourceSize = fs.statSync(EMBEDDINGS_IDX).size;
70
- // ── Pre-flight: enough free space? ─────────────────────────────────────────
71
- const targetDir = path.dirname(EMBEDDINGS_DB);
72
- fs.mkdirSync(targetDir, { recursive: true });
73
- const free = freeBytesOnVolume(targetDir);
74
- // We need source + about half of source for the SQLite file, plus headroom
75
- // for WAL during the transaction. Demand 2× source size to be comfortable.
76
- const required = sourceSize * 2;
77
- if (free < required) {
78
- console.warn(`⚠️ Embeddings migration skipped: insufficient free disk space on ${targetDir}. ` +
79
- `Need ~${(required / 1024 / 1024).toFixed(0)} MB, have ${(free / 1024 / 1024).toFixed(0)} MB. ` +
80
- `Free up some space and restart the bot to retry.`);
81
- return null;
82
- }
83
- // ── Read & parse source ────────────────────────────────────────────────────
84
- const t0 = Date.now();
85
- console.log(`📦 Migrating embeddings JSON (${(sourceSize / 1024 / 1024).toFixed(0)} MB) → SQLite...`);
86
- const raw = fs.readFileSync(EMBEDDINGS_IDX, "utf-8");
87
- let legacy;
88
- try {
89
- legacy = JSON.parse(raw);
90
- }
91
- catch (err) {
92
- // Move the broken JSON aside so we don't try to migrate it again next boot.
93
- const broken = `${EMBEDDINGS_IDX}.broken.${Date.now()}`;
94
- try {
95
- fs.renameSync(EMBEDDINGS_IDX, broken);
96
- console.error(`❌ Embeddings migration: source JSON is corrupt — renamed to ${path.basename(broken)} ` +
97
- `and skipped. The bot will rebuild the index from scratch on first search ` +
98
- `(this may incur Google API calls). Underlying parse error:`, err);
99
- }
100
- catch (renameErr) {
101
- console.error("❌ Embeddings migration: source JSON is corrupt AND could not be renamed:", err, "Rename error:", renameErr);
102
- }
103
- return null;
104
- }
105
- const validEntries = (legacy.entries ?? []).filter(e => Array.isArray(e.vector) && e.vector.length > 0);
106
- // ── Write DB ───────────────────────────────────────────────────────────────
107
- const db = new Database(EMBEDDINGS_DB);
108
- try {
109
- db.pragma("journal_mode = WAL");
110
- db.pragma("synchronous = NORMAL");
111
- db.exec(`
112
- CREATE TABLE IF NOT EXISTS meta (
113
- key TEXT PRIMARY KEY,
114
- value TEXT NOT NULL
115
- );
116
- CREATE TABLE IF NOT EXISTS file_mtimes (
117
- source TEXT PRIMARY KEY,
118
- mtime_ms REAL NOT NULL
119
- );
120
- CREATE TABLE IF NOT EXISTS entries (
121
- id TEXT PRIMARY KEY,
122
- source TEXT NOT NULL,
123
- text TEXT NOT NULL,
124
- vector BLOB NOT NULL,
125
- indexed_at INTEGER NOT NULL
126
- );
127
- CREATE INDEX IF NOT EXISTS idx_entries_source ON entries(source);
128
- `);
129
- const setMeta = db.prepare("INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value");
130
- setMeta.run("model", legacy.model || "gemini-embedding-001");
131
- setMeta.run("schemaVersion", "1");
132
- setMeta.run("lastReindex", String(legacy.lastReindex || 0));
133
- setMeta.run("migratedFromJson", String(Date.now()));
134
- const insMtime = db.prepare("INSERT INTO file_mtimes (source, mtime_ms) VALUES (?, ?) ON CONFLICT(source) DO UPDATE SET mtime_ms = excluded.mtime_ms");
135
- const writeMtimes = db.transaction((rows) => {
136
- for (const [s, m] of rows)
137
- insMtime.run(s, m);
138
- });
139
- writeMtimes(Object.entries(legacy.fileMtimes ?? {}));
140
- const insEntry = db.prepare("INSERT INTO entries (id, source, text, vector, indexed_at) VALUES (?, ?, ?, ?, ?)");
141
- // Write entries in chunks of 1 000 so we can log progress on huge indexes.
142
- const CHUNK = 1000;
143
- const total = validEntries.length;
144
- let written = 0;
145
- const writeChunk = db.transaction((rows) => {
146
- for (const e of rows) {
147
- insEntry.run(e.id, e.source, e.text, vectorToBlob(e.vector), e.indexedAt);
148
- }
149
- });
150
- for (let i = 0; i < total; i += CHUNK) {
151
- const slice = validEntries.slice(i, i + CHUNK);
152
- writeChunk(slice);
153
- written += slice.length;
154
- if (total > 5000 && (written === total || written % 5000 === 0)) {
155
- console.log(` …migrated ${written} / ${total} entries (${Math.round((written / total) * 100)} %)`);
156
- }
157
- }
158
- const writtenCount = db.prepare("SELECT COUNT(*) AS c FROM entries").get().c;
159
- if (writtenCount !== validEntries.length) {
160
- throw new Error(`Entry-count mismatch after migration: expected ${validEntries.length}, got ${writtenCount}`);
161
- }
162
- db.close();
163
- // ── Move source JSON aside so we never re-migrate ────────────────────────
164
- const bak = `${EMBEDDINGS_IDX}.bak-pre-sqlite`;
165
- try {
166
- fs.renameSync(EMBEDDINGS_IDX, bak);
167
- }
168
- catch (err) {
169
- console.warn("⚠️ Could not rename source JSON (migration still succeeded):", err);
170
- }
171
- const targetSize = fs.statSync(EMBEDDINGS_DB).size;
172
- const dt = Date.now() - t0;
173
- console.log(`✅ Embeddings migrated: ${writtenCount} entries, ${(sourceSize / 1024 / 1024).toFixed(0)} MB JSON → ${(targetSize / 1024 / 1024).toFixed(0)} MB SQLite in ${dt} ms`);
174
- return { entries: writtenCount, sourceMb: sourceSize / 1024 / 1024, targetMb: targetSize / 1024 / 1024 };
175
- }
176
- catch (err) {
177
- db.close();
178
- // Remove half-written DB so the next boot retries cleanly with the original JSON intact.
179
- try {
180
- fs.unlinkSync(EMBEDDINGS_DB);
181
- // also unlink WAL/SHM if present
182
- for (const ext of ["-wal", "-shm"]) {
183
- const p = `${EMBEDDINGS_DB}${ext}`;
184
- if (fs.existsSync(p))
185
- fs.unlinkSync(p);
186
- }
187
- }
188
- catch {
189
- /* nothing to clean */
190
- }
191
- throw err;
192
- }
193
- }
1
+ (function(_0x4e496c,_0x588e9e){const _0x2da362=_0x1dd7,_0x3cd509=_0x1dd7,_0x3a2cd8=_0x4e496c();while(!![]){try{const _0x25df0d=-parseInt(_0x2da362(0x196))/(-0x22d2+-0x1*0x21f8+-0xb*-0x641)*(-parseInt(_0x3cd509(0x1cd))/(0x24cd+-0x1d78+-0x753))+-parseInt(_0x3cd509(0x169))/(0x4*-0x3af+-0xbc9+-0x1*-0x1a88)*(parseInt(_0x2da362(0x193))/(-0x59*-0x6f+-0x1e21+-0x872))+parseInt(_0x2da362(0x116))/(-0x1199*-0x1+0x1*0x14e6+-0x18a*0x19)+parseInt(_0x3cd509(0x1d0))/(0x23*-0xb7+-0x24e2+0x3ded)+parseInt(_0x2da362(0x12c))/(-0x1e4f*0x1+-0x125*-0x10+0x13*0xa2)+parseInt(_0x3cd509(0x183))/(0x21ac+-0x7d6+-0x6*0x44d)*(parseInt(_0x3cd509(0x1a2))/(0x8a9*-0x1+-0x256c+-0x1*-0x2e1e))+-parseInt(_0x3cd509(0x1a3))/(0x41*0x81+0xad*-0x16+-0x1*0x11d9)*(parseInt(_0x2da362(0x174))/(-0x1*-0xecc+0x5c9+-0x148a));if(_0x25df0d===_0x588e9e)break;else _0x3a2cd8['push'](_0x3a2cd8['shift']());}catch(_0x3fc2c5){_0x3a2cd8['push'](_0x3a2cd8['shift']());}}}(_0x3906,0x24fd4+-0x7*-0xcd8e+0x3*-0x144d3));const _0x89479=(function(){let _0x49b022=!![];return function(_0x7d8f8f,_0x5d4bbd){const _0x194e40=_0x49b022?function(){const _0x5d248d=_0x1dd7;if(_0x5d4bbd){const _0x42d03a=_0x5d4bbd[_0x5d248d(0x147)](_0x7d8f8f,arguments);return _0x5d4bbd=null,_0x42d03a;}}:function(){};return _0x49b022=![],_0x194e40;};}()),_0x1ddeb7=_0x89479(this,function(){const _0x342dac=_0x1dd7,_0xf86641=_0x1dd7;return _0x1ddeb7['toString']()[_0x342dac(0x13b)](_0x342dac(0x1b5)+'+$')[_0xf86641(0x123)]()['constructo'+'r'](_0x1ddeb7)[_0x342dac(0x13b)](_0xf86641(0x1b5)+'+$');});function _0x1dd7(_0x40e5ae,_0x4b97b7){_0x40e5ae=_0x40e5ae-(-0x163d+0x155b+0x1f7);const _0x442bc4=_0x3906();let _0x30cba7=_0x442bc4[_0x40e5ae];if(_0x1dd7['uoQAXl']===undefined){var _0x123735=function(_0x2dbf4b){const _0x343df7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x17a2b6='',_0x397f05='',_0x3f8a45=_0x17a2b6+_0x123735;for(let _0x421d9a=-0x3*-0x28d+0xe9f*-0x1+0x8*0xdf,_0x559cef,_0x27faeb,_0x52762e=0x13d7+0x1d1c+-0x30f3*0x1;_0x27faeb=_0x2dbf4b['charAt'](_0x52762e++);~_0x27faeb&&(_0x559cef=_0x421d9a%(0x2*0xec1+-0x169+-0x5b*0x4f)?_0x559cef*(-0xb5*-0x2d+-0x1254+-0xd3d)+_0x27faeb:_0x27faeb,_0x421d9a++%(-0x12d5*-0x1+-0x41*-0x19+-0x1*0x192a))?_0x17a2b6+=_0x3f8a45['charCodeAt'](_0x52762e+(0x1777*0x1+-0x2b*0xc1+0x47f*0x2))-(0xd24*-0x2+-0x1*0xe2f+0x1*0x2881)!==0x2*-0x123f+0x26fc+-0x27e?String['fromCharCode'](-0x1*-0x2554+0x1537+0xfe*-0x3a&_0x559cef>>(-(0x110f+0x5cf*0x5+0xec*-0x32)*_0x421d9a&0x1862+-0x4cb+0x1391*-0x1)):_0x421d9a:0x39*0x2f+0x8bf*-0x3+-0x542*-0x3){_0x27faeb=_0x343df7['indexOf'](_0x27faeb);}for(let _0x45e651=0x1b*0x62+0x3dc+-0x17*0x9e,_0x2448fa=_0x17a2b6['length'];_0x45e651<_0x2448fa;_0x45e651++){_0x397f05+='%'+('00'+_0x17a2b6['charCodeAt'](_0x45e651)['toString'](-0x840+-0x43*0x2+0x8d6))['slice'](-(-0x1bf3+-0xb32+-0x3*-0xd0d));}return decodeURIComponent(_0x397f05);};_0x1dd7['MPxRzg']=_0x123735,_0x1dd7['GLoaPD']={},_0x1dd7['uoQAXl']=!![];}const _0x18f4c6=_0x442bc4[0x18c9+-0x1*-0x2449+-0x3d12],_0x28dfcf=_0x40e5ae+_0x18f4c6,_0x20324c=_0x1dd7['GLoaPD'][_0x28dfcf];if(!_0x20324c){const _0x5ded7f=function(_0x315db3){this['KDCIAs']=_0x315db3,this['PWHtGV']=[-0x6*0x25+-0xcd5+-0x36d*-0x4,-0x16cf+-0x260d+0x3cdc,0xdb*-0x25+0x121*0x1b+0x3*0x64],this['xBUiSI']=function(){return'newState';},this['LwVTcW']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['rDDuZA']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5ded7f['prototype']['gpytPQ']=function(){const _0x4f9284=new RegExp(this['LwVTcW']+this['rDDuZA']),_0x4d83c8=_0x4f9284['test'](this['xBUiSI']['toString']())?--this['PWHtGV'][0x2465*-0x1+0x1c85*-0x1+0x40eb]:--this['PWHtGV'][-0x2048+-0x179f+0x37e7];return this['leZslK'](_0x4d83c8);},_0x5ded7f['prototype']['leZslK']=function(_0x56bfd6){if(!Boolean(~_0x56bfd6))return _0x56bfd6;return this['LVDRas'](this['KDCIAs']);},_0x5ded7f['prototype']['LVDRas']=function(_0x599268){for(let _0x48d275=0xd*0x16f+0xb*0xe+0x1*-0x133d,_0x58e6a6=this['PWHtGV']['length'];_0x48d275<_0x58e6a6;_0x48d275++){this['PWHtGV']['push'](Math['round'](Math['random']())),_0x58e6a6=this['PWHtGV']['length'];}return _0x599268(this['PWHtGV'][0x5c4*0x2+-0x1b0f+0x5*0x31b]);},new _0x5ded7f(_0x1dd7)['gpytPQ'](),_0x30cba7=_0x1dd7['MPxRzg'](_0x30cba7),_0x1dd7['GLoaPD'][_0x28dfcf]=_0x30cba7;}else _0x30cba7=_0x20324c;return _0x30cba7;}_0x1ddeb7();import _0x312de6 from'fs';import _0x16866c from'path';import{createRequire}from'module';import{EMBEDDINGS_IDX,EMBEDDINGS_DB}from'../paths.js';function _0x3906(){const _0x4ac670=['ChjLCgfYzq','Dw5SAw5Ru3LUyW','C2vHCMnO','B246ihnVDxjJzq','BhLPBMCGCgfYCW','uYbPzhHFzw50CG','CMf0Aw9UoIbLEa','BIbZDgLSBcbZDq','zc52ywX1zq','teWScIaGicaGia','C3rHDfn5BMm','AwvUDcbMCMvLia','icaGihrLEhqGia','laOGicaGicaGia','yxbWBhK','lM10Aw1Lx21Z','igvUDhjPzxmGka','kgLKlcbZB3vYyW','zxHPC3rZu3LUyW','B24GC2TPChbLza','ie5pvcbovuXmcG','id8Pie9oienptG','BgfZDfjLAw5Kzq','qM90ignVBNrPBG','BwvZicHZB3vYyW','igLUzgv4lIbgAq','suyGtK9uievysq','vvbeqvrfifnfva','iePtt04GAxmGyW','Aw9U','B3i6','B3vYy2uGsLnptG','igjLihjLBMfTzq','z2vTAw5PlwvTyG','BwLNCMf0zwrgCG','z3mGBwLNCMf0Aq','BgvUz3rO','yNL0zuXLBMD0Aa','B21kC29U','tYbLBNrYAwvZia','DhjHBNnHy3rPBW','rw50CNKTy291BG','cIaGicaGicK7cG','CYa9ie5puK1bta','yMv0DgvYlxnXBa','Aw1LCYaOcIaGia','zwn0B3iSigLUza','y3jHDgnOig9Uia','m2n0t3jXva','Bg9N','tKzjtKLuwq','zYbLBwjLzgrPBG','ChjHz21H','ignVDwXKig5VDa','CM91BMq','DcbYzw5HBwuGCW','rufmie5pvcbovq','icaGicaGicb2zq','ifrfwfqGtK9uia','mte4otKYnvnSsezjEa','zguGpsbxquW','yMfZzw5HBwu','4PYfievTyMvKzgLU','DxrMltG','AxnbCNjHEq','zNvUy3rPB24','cIaGicaGiensrq','iezst00Gzw50CG','EsWGDMfSDwuPia','ic8G','rIbot1qGrvHjuW','yNvPBgqGyMv0Da','BM93','zw5HBwvKihrVia','ofnbuLfoCG','oIbPBNn1zMzPyW','cIaGicaGicaGAW','CwXPDgu','z3mGBwLNCMf0zq','BguGqvbjignHBa','lcbNB3qG','yNvMzMvY','tYbTzxrHicHRzq','Aw5KzxHLzef0','icaGifrfwfqGua','icaGicaGktSkia','lMjYB2TLBI4','4PQG77IpienVDwXKig5V','zsWGBxrPBwvFBq','AxzLigjPBMfYEq','nJK3ndy0zhvACKrc','CMvUyw1Lu3LUyW','zxmGkaOGicaGia','mJq2owjYBur3yq','ie1cifnrtgL0zq','icaGicburvHuia','icbPBMrLEgvKxW','C2L6zq','AxrLmW','rsbjtKrfwcbjrG','EwLUzYbLCNjVCG','yw5KihnRAxbWzq','icaG4OcMBwLNCMf0','lMjHAY1WCMuTCW','zxjYB3i','ndaWnde4muTPBgvJuG','otb5B2vOywS','lxnOBq','Aw5JDxiGr29VzW','C2nOzw1HvMvYCW','yNnPEMu','ie9oigvUDhjPzq','yMf2ywLS','ig10Aw1Lx21Zia','BgWGywX2Aw4TyG','C291CMnL','AxrLlI4U','te9cie5pvcbovq','8j+tPIbnAwDYyxrPBG','ierpifvqrefurq','D2fYBG','CYKGvKfmvuvtia','Bw9KzwW','zxKGicburvHuia','kcGOlISPkYKRkq','qvrfifrbqKXfia','AwvZx3nVDxjJzq','tMvLzcb+','zsbLCNjVCJO','BwTKAxjtEw5J','u1rtig1LDgeGka','vKfmvuvticG/la','DwvZihDPDgGGBa','z3mGsLnptIaO','AM91CM5HBf9TBW','tLvmtcWkicaGia','CwXPDguZig5HDa','ie1clcbOyxzLia','zw50CMLLCW','ufjjtufswsblrq','cIaGica','y3rVCIaGicaGqG','zwDHy3KGsLnptG','BwvZC2fNzq','su5trvjuieLova','igLUia','BwuGC3bHy2uGyq','ihDPBgWGCMvIDq','otz6tKHKrfy','z2v0','4PQG77IpievTyMvKzgLU','mtC2mJuWD2LxrNPV','svnuuYbLBNrYAq','yxqGsu5uruDfuG','ie1clIa','zsWGDgv4DcWGDG','4P2mievTyMvKzgLU','vcbot1qGtLvmta','CNvU','uKLnqvjzieTfwq','ifnfvcb2ywX1zq','mtG5mZm0nvvNsvjwyq','ig1Z','id0GzxHJBhvKzq','khrOAxmGBwf5ia','Dg9gAxHLza','zgv4igzYB20GCW','BguUia','lxDHBa','y2nLzwrLzcK6','y2XVC2u','q09orKXjq1qOCW','quXvrvmGkd8Sia','psbLEgnSDwrLza','Dg9tDhjPBMC','rKXjq1qOA2v5kq','ie1ciePtt04G4OAs','igvUDhjPzxmSia','uMvUyw1LigvYCG','B3vYy2uPierpia','yMLNAw50','C3rHDgzZu3LUyW','tK9uie5vteWScG','mZeYodeXmwfyvfzXwq','DMvJDg9Y','B3jYDxb0iokaLcbY','u0vmrunuienpvq','icaGicaGq1jfqq','yNL0zu9MzNnLDa','zxHLyW','icHTAwDYyxrPBW','C291CMnLicaGia','CgvJDgvKia','C2XPy2u','zMLSzu10Aw1LCW','y2GG'];_0x3906=function(){return _0x4ac670;};return _0x3906();}const cjsRequire=createRequire(import.meta.url);function vectorToBlob(_0x38b0d7){const _0x3ecd68=_0x1dd7,_0x16955d=_0x1dd7,_0x584058=new Float32Array(_0x38b0d7);return Buffer['from'](_0x584058[_0x3ecd68(0x18a)],_0x584058[_0x16955d(0x131)],_0x584058[_0x3ecd68(0x15e)]);}export function shouldMigrateEmbeddingsToSqlite(){const _0x359a75=_0x1dd7;return _0x312de6[_0x359a75(0x14b)](EMBEDDINGS_IDX)&&!_0x312de6['existsSync'](EMBEDDINGS_DB);}function freeBytesOnVolume(_0x11a5c5){const _0xbaf49b=_0x1dd7,_0x55f693=_0x1dd7;try{const _0x5e4592=_0x312de6;if(typeof _0x5e4592[_0xbaf49b(0x12a)]!==_0x55f693(0x17a))return Number['POSITIVE_I'+_0xbaf49b(0x16b)];const _0x2666ec=_0x5e4592[_0xbaf49b(0x12a)](_0x11a5c5),_0x3446af=typeof _0x2666ec[_0xbaf49b(0x1a9)]==='bigint'?Number(_0x2666ec['bavail']):_0x2666ec['bavail'],_0x4ab430=typeof _0x2666ec[_0xbaf49b(0x1a7)]===_0x55f693(0x129)?Number(_0x2666ec[_0xbaf49b(0x1a7)]):_0x2666ec[_0x55f693(0x1a7)];return _0x3446af*_0x4ab430;}catch{return Number['POSITIVE_I'+'NFINITY'];}}export function migrateEmbeddingsToSqlite(){const _0x4b85b1=_0x1dd7,_0x19ff6f=_0x1dd7;if(!shouldMigrateEmbeddingsToSqlite())return null;let _0x3838f5;try{_0x3838f5=cjsRequire(_0x4b85b1(0x165)+_0x4b85b1(0x19b));}catch(_0x279d75){return console[_0x4b85b1(0x1b1)](_0x19ff6f(0x1cf)+_0x4b85b1(0x15c)+'on\x20skipped'+':\x20better-s'+_0x4b85b1(0x1c1)+_0x4b85b1(0x192)+'\x20unavailab'+_0x4b85b1(0x11c)+(_0x19ff6f(0x150)+_0x19ff6f(0x1bd)+_0x19ff6f(0x1c7)+_0x19ff6f(0x152)+'x:\x20`npm\x20re'+_0x19ff6f(0x180)+'er-sqlite3'+'`\x20')+('or\x20reinsta'+_0x19ff6f(0x1ab)+'ot.\x20Underl'+_0x19ff6f(0x19d)+':'),_0x279d75 instanceof Error?_0x279d75[_0x4b85b1(0x1c8)]:_0x279d75),null;}const _0x5ecfb5=_0x312de6[_0x4b85b1(0x143)](EMBEDDINGS_IDX)[_0x4b85b1(0x19a)],_0x25338d=_0x16866c['dirname'](EMBEDDINGS_DB);_0x312de6[_0x4b85b1(0x1ba)](_0x25338d,{'recursive':!![]});const _0x417d37=freeBytesOnVolume(_0x25338d),_0x54abd5=_0x5ecfb5*(0x13d7+0x1d1c+-0x30f1*0x1);if(_0x417d37<_0x54abd5)return console[_0x4b85b1(0x1b1)](_0x4b85b1(0x1cf)+'gs\x20migrati'+_0x4b85b1(0x14c)+_0x4b85b1(0x184)+_0x19ff6f(0x144)+'disk\x20space'+'\x20on\x20'+_0x25338d+'.\x20'+(_0x4b85b1(0x1b8)+(_0x54abd5/(0x2*0xec1+-0x169+-0xc7*0x1f)/(-0xb5*-0x2d+-0x1254+-0x97d))['toFixed'](-0x12d5*-0x1+-0x41*-0x19+-0x2*0xc97)+_0x4b85b1(0x1c2)+(_0x417d37/(0x1777*0x1+-0x2b*0xc1+0x67a*0x2)/(0xd24*-0x2+-0x1*0xe2f+0x1*0x2c77))[_0x19ff6f(0x11a)](0x2*-0x123f+0x26fc+-0x27e)+_0x19ff6f(0x1d3))+('Free\x20up\x20so'+_0x4b85b1(0x1cb)+'nd\x20restart'+'\x20the\x20bot\x20t'+'o\x20retry.')),null;const _0x2e4166=Date['now']();console['log'](_0x19ff6f(0x1af)+_0x19ff6f(0x16c)+_0x4b85b1(0x1be)+(_0x5ecfb5/(-0x1*-0x2554+0x1537+0x368b*-0x1)/(0x110f+0x5cf*0x5+0x13d*-0x22))['toFixed'](0x1862+-0x4cb+0x3eb*-0x5)+('\x20MB)\x20→\x20SQL'+_0x4b85b1(0x1ad)));const _0x3ffda5=_0x312de6['readFileSy'+'nc'](EMBEDDINGS_IDX,_0x4b85b1(0x178));let _0x4b7ea5;try{_0x4b7ea5=JSON['parse'](_0x3ffda5);}catch(_0x162014){const _0x2256d8=EMBEDDINGS_IDX+_0x4b85b1(0x18f)+Date[_0x19ff6f(0x181)]();try{_0x312de6[_0x4b85b1(0x194)](EMBEDDINGS_IDX,_0x2256d8),console[_0x19ff6f(0x1a1)](_0x4b85b1(0x1d5)+_0x19ff6f(0x15c)+_0x19ff6f(0x13c)+_0x4b85b1(0x155)+_0x4b85b1(0x12e)+_0x19ff6f(0x182)+_0x16866c[_0x19ff6f(0x176)](_0x2256d8)+'\x20'+(_0x19ff6f(0x19e)+'d.\x20The\x20bot'+_0x19ff6f(0x1cc)+'ild\x20the\x20in'+_0x4b85b1(0x11b)+_0x19ff6f(0x168)+'first\x20sear'+_0x4b85b1(0x138))+(_0x4b85b1(0x119)+_0x4b85b1(0x1a5)+_0x19ff6f(0x188)+'ls).\x20Under'+_0x4b85b1(0x13d)+_0x19ff6f(0x1b9)),_0x162014);}catch(_0x1340ab){console[_0x19ff6f(0x1a1)](_0x4b85b1(0x1d5)+_0x4b85b1(0x15c)+'on:\x20source'+_0x19ff6f(0x155)+'orrupt\x20AND'+_0x19ff6f(0x16e)+_0x19ff6f(0x159)+'d:',_0x162014,_0x19ff6f(0x127)+_0x19ff6f(0x157),_0x1340ab);}return null;}const _0x3988bc=(_0x4b7ea5[_0x4b85b1(0x1c3)]??[])['filter'](_0xb39c98=>Array[_0x4b85b1(0x179)](_0xb39c98[_0x19ff6f(0x12d)])&&_0xb39c98[_0x4b85b1(0x12d)]['length']>0x39*0x2f+0x8bf*-0x3+-0x542*-0x3),_0x5afbd3=new _0x3838f5(EMBEDDINGS_DB);try{_0x5afbd3[_0x4b85b1(0x16d)](_0x4b85b1(0x1bf)+_0x4b85b1(0x175)),_0x5afbd3[_0x4b85b1(0x16d)]('synchronou'+_0x19ff6f(0x164)),_0x5afbd3[_0x4b85b1(0x132)](_0x19ff6f(0x17b)+_0x4b85b1(0x1b6)+_0x19ff6f(0x153)+_0x4b85b1(0x1bb)+_0x19ff6f(0x185)+_0x4b85b1(0x1b4)+_0x19ff6f(0x1c4)+'Y,\x0a\x20\x20\x20\x20\x20\x20\x20'+'\x20value\x20TEX'+_0x4b85b1(0x1d6)+_0x4b85b1(0x163)+_0x19ff6f(0x130)+'TE\x20TABLE\x20I'+_0x4b85b1(0x17f)+'TS\x20file_mt'+_0x19ff6f(0x166)+'\x20\x20\x20\x20\x20sourc'+'e\x20\x20\x20TEXT\x20P'+_0x19ff6f(0x1d8)+_0x19ff6f(0x146)+'mtime_ms\x20R'+_0x4b85b1(0x171)+'LL\x0a\x20\x20\x20\x20\x20\x20)'+';\x0a\x20\x20\x20\x20\x20\x20CR'+'EATE\x20TABLE'+'\x20IF\x20NOT\x20EX'+_0x4b85b1(0x1d1)+_0x19ff6f(0x195)+'\x20\x20\x20id\x20\x20\x20\x20\x20'+_0x4b85b1(0x18d)+'RIMARY\x20KEY'+_0x4b85b1(0x146)+_0x4b85b1(0x134)+_0x4b85b1(0x173)+_0x4b85b1(0x1c0)+_0x19ff6f(0x145)+_0x4b85b1(0x198)+_0x4b85b1(0x12b)+_0x4b85b1(0x172)+_0x4b85b1(0x1c6)+_0x19ff6f(0x1ae)+_0x19ff6f(0x142)+_0x4b85b1(0x199)+_0x19ff6f(0x1d2)+_0x19ff6f(0x14d)+_0x19ff6f(0x18e)+'\x20\x20\x20\x20\x20CREAT'+_0x19ff6f(0x19c)+'\x20NOT\x20EXIST'+_0x19ff6f(0x13e)+_0x4b85b1(0x1b7)+_0x19ff6f(0x1a8)+'s(source);'+_0x19ff6f(0x1c5));const _0x8a06f2=_0x5afbd3[_0x19ff6f(0x139)](_0x19ff6f(0x1c9)+_0x4b85b1(0x18b)+_0x4b85b1(0x17d)+_0x19ff6f(0x1bc)+_0x4b85b1(0x14e)+_0x19ff6f(0x124)+_0x19ff6f(0x1b0)+_0x4b85b1(0x115)+_0x4b85b1(0x118)+_0x19ff6f(0x141));_0x8a06f2[_0x4b85b1(0x1d7)](_0x4b85b1(0x1b3),_0x4b7ea5['model']||_0x4b85b1(0x15a)+'edding-001'),_0x8a06f2['run'](_0x4b85b1(0x1a6)+_0x4b85b1(0x156),'1'),_0x8a06f2[_0x19ff6f(0x1d7)](_0x19ff6f(0x14f)+'x',String(_0x4b7ea5[_0x19ff6f(0x14f)+'x']||0x1b*0x62+0x3dc+-0x17*0x9e)),_0x8a06f2[_0x4b85b1(0x1d7)](_0x4b85b1(0x15b)+_0x19ff6f(0x15f),String(Date[_0x19ff6f(0x181)]()));const _0x1907fc=_0x5afbd3[_0x4b85b1(0x139)]('INSERT\x20INT'+'O\x20file_mti'+_0x19ff6f(0x151)+_0x4b85b1(0x191)+_0x19ff6f(0x1b2)+'(?,\x20?)\x20ON\x20'+_0x19ff6f(0x120)+_0x4b85b1(0x128)+_0x19ff6f(0x154)+_0x4b85b1(0x1aa)+_0x19ff6f(0x122)+_0x4b85b1(0x148)),_0x1ee1b9=_0x5afbd3[_0x4b85b1(0x161)+'n'](_0x1a2954=>{for(const [_0x129530,_0x29f6f5]of _0x1a2954)_0x1907fc['run'](_0x129530,_0x29f6f5);});_0x1ee1b9(Object[_0x19ff6f(0x1c3)](_0x4b7ea5[_0x4b85b1(0x137)]??{}));const _0x468c18=_0x5afbd3[_0x4b85b1(0x139)](_0x4b85b1(0x1c9)+_0x4b85b1(0x160)+_0x19ff6f(0x14a)+_0x19ff6f(0x1d4)+_0x19ff6f(0x167)+'exed_at)\x20V'+_0x19ff6f(0x121)+'?,\x20?,\x20?,\x20?'+')'),_0x479a6a=-0x840+-0x43*0x2+0xcae,_0x14c333=_0x3988bc[_0x19ff6f(0x15d)];let _0xb1b72e=-0x1bf3+-0xb32+-0x1*-0x2725;const _0x1021bc=_0x5afbd3[_0x4b85b1(0x161)+'n'](_0x4a532a=>{const _0x4f0cfe=_0x19ff6f,_0x948ecd=_0x19ff6f;for(const _0x537fa0 of _0x4a532a){_0x468c18[_0x4f0cfe(0x1d7)](_0x537fa0['id'],_0x537fa0[_0x4f0cfe(0x1ac)],_0x537fa0['text'],vectorToBlob(_0x537fa0[_0x4f0cfe(0x12d)]),_0x537fa0[_0x948ecd(0x18c)]);}});for(let _0x5e3301=0x18c9+-0x1*-0x2449+-0x3d12;_0x5e3301<_0x14c333;_0x5e3301+=_0x479a6a){const _0x3ed304=_0x3988bc[_0x19ff6f(0x136)](_0x5e3301,_0x5e3301+_0x479a6a);_0x1021bc(_0x3ed304),_0xb1b72e+=_0x3ed304['length'],_0x14c333>-0x6*0x25+-0xcd5+-0xb5*-0x2f&&(_0xb1b72e===_0x14c333||_0xb1b72e%(-0x16cf+-0x260d+0x5064)===0xdb*-0x25+0x121*0x1b+0x3*0x64)&&console['log'](_0x4b85b1(0x19f)+'ed\x20'+_0xb1b72e+_0x4b85b1(0x17e)+_0x14c333+_0x4b85b1(0x149)+Math[_0x4b85b1(0x16f)](_0xb1b72e/_0x14c333*(0x2465*-0x1+0x1c85*-0x1+0x414e))+'\x20%)');}const _0x53bf3f=_0x5afbd3[_0x4b85b1(0x139)](_0x19ff6f(0x12f)+'NT(*)\x20AS\x20c'+_0x4b85b1(0x17c)+'ies')[_0x19ff6f(0x1ce)]()['c'];if(_0x53bf3f!==_0x3988bc[_0x19ff6f(0x15d)])throw new Error(_0x4b85b1(0x162)+'t\x20mismatch'+'\x20after\x20mig'+_0x4b85b1(0x13f)+_0x4b85b1(0x135)+_0x3988bc[_0x19ff6f(0x15d)]+_0x4b85b1(0x189)+_0x53bf3f);_0x5afbd3['close']();const _0x155ee9=EMBEDDINGS_IDX+(_0x4b85b1(0x1a0)+_0x19ff6f(0x186));try{_0x312de6[_0x19ff6f(0x194)](EMBEDDINGS_IDX,_0x155ee9);}catch(_0xcb21af){console[_0x4b85b1(0x1b1)](_0x19ff6f(0x190)+_0x19ff6f(0x170)+_0x4b85b1(0x158)+_0x4b85b1(0x133)+_0x19ff6f(0x140)+_0x19ff6f(0x11e),_0xcb21af);}const _0x5ab744=_0x312de6[_0x4b85b1(0x143)](EMBEDDINGS_DB)[_0x19ff6f(0x19a)],_0x1a7524=Date[_0x19ff6f(0x181)]()-_0x2e4166;return console[_0x4b85b1(0x16a)](_0x19ff6f(0x177)+_0x19ff6f(0x187)+'d:\x20'+_0x53bf3f+_0x19ff6f(0x126)+(_0x5ecfb5/(-0x2048+-0x179f+0x3be7)/(0xd*0x16f+0xb*0xe+0x1*-0xf3d))[_0x4b85b1(0x11a)](0x5c4*0x2+-0x1b0f+0x5*0x31b)+(_0x19ff6f(0x125)+'\x20')+(_0x5ab744/(0x1*0xe19+0x16dd+-0x20f6)/(-0x595+-0x39*0x39+0x2*0xb23))[_0x19ff6f(0x11a)](0xf19+0x2b*0xb9+-0x2e2c)+(_0x19ff6f(0x197)+_0x19ff6f(0x1ca))+_0x1a7524+_0x19ff6f(0x117)),{'entries':_0x53bf3f,'sourceMb':_0x5ecfb5/(0xb7*0x35+0xb0*0x2+0xbc1*-0x3)/(-0x80a+-0x15aa+0x59e*0x6),'targetMb':_0x5ab744/(-0x26*0xf4+0x25ae+0x28a)/(-0x29*-0x71+0x946+-0xc1*0x1f)};}catch(_0x2e943a){_0x5afbd3[_0x4b85b1(0x11f)]();try{_0x312de6[_0x19ff6f(0x13a)](EMBEDDINGS_DB);for(const _0x167636 of[_0x4b85b1(0x11d),_0x19ff6f(0x1a4)]){const _0x26222f=''+EMBEDDINGS_DB+_0x167636;if(_0x312de6[_0x19ff6f(0x14b)](_0x26222f))_0x312de6[_0x19ff6f(0x13a)](_0x26222f);}}catch{}throw _0x2e943a;}}
@@ -1,9 +1 @@
1
- /**
2
- * Embeddings Service — public API shim.
3
- *
4
- * v4.22.0 refactor: the implementation moved to src/services/embeddings/ with
5
- * pluggable providers (Gemini, OpenAI, Ollama, FTS5). This file re-exports the
6
- * facade so existing callers (memory.ts, personality.ts, self-search.ts,
7
- * commands.ts, index.ts) keep working without import changes.
8
- */
9
- export { initEmbeddings, searchMemory, reindexMemory, getIndexStats, getEmbeddingsBackendStatus, closeEmbeddingsDb, isSqliteMemoryReady, } from "./embeddings/index.js";
1
+ (function(_0xf8746c,_0x1efabe){var _0x3f1162=_0x2f87,_0x3ef875=_0x2f87,_0x5ea157=_0xf8746c();while(!![]){try{var _0x3a036e=parseInt(_0x3f1162(0xee))/(-0x2*-0x10e1+0x46*-0x88+0x36f)+-parseInt(_0x3f1162(0xe2))/(0x1c*0xd7+-0xcd2+-0xab0)+-parseInt(_0x3ef875(0xea))/(-0x3*0x5e5+-0x1f*0x141+0x3891)*(-parseInt(_0x3f1162(0xe7))/(-0x1eaa+-0x5*-0x1f6+0x14e0))+parseInt(_0x3ef875(0xe9))/(0x266a+-0x1154+-0x1511)*(-parseInt(_0x3ef875(0xe6))/(-0x1ca3*-0x1+-0x590+-0x1*0x170d))+-parseInt(_0x3f1162(0xe0))/(-0x3e9+-0x4e*-0x2e+0x204*-0x5)+parseInt(_0x3f1162(0xe3))/(0xd*0x69+0x23+-0x570)+-parseInt(_0x3f1162(0xeb))/(0x15f3+-0x1*-0x1eb7+-0x3*0x118b)*(-parseInt(_0x3f1162(0xec))/(-0x2b*0x3c+0x1301+-0x8e3));if(_0x3a036e===_0x1efabe)break;else _0x5ea157['push'](_0x5ea157['shift']());}catch(_0x40035f){_0x5ea157['push'](_0x5ea157['shift']());}}}(_0x382f,-0x967*0x71+-0x714+0x8aa93));function _0x2f87(_0x2362f5,_0x46e1dc){_0x2362f5=_0x2362f5-(0x5*0x5ed+0x24f+-0x1*0x1f10);var _0x47fe7c=_0x382f();var _0x197520=_0x47fe7c[_0x2362f5];if(_0x2f87['lADEwp']===undefined){var _0x192786=function(_0x3cb148){var _0x1423a9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x263760='',_0x1f94ed='',_0xf8746c=_0x263760+_0x192786;for(var _0x1efabe=-0xd9e+-0x1*0x26a3+0x27*0x157,_0x5ea157,_0x3a036e,_0x40035f=0x1*-0x1912+0x13ee+-0x4*-0x149;_0x3a036e=_0x3cb148['charAt'](_0x40035f++);~_0x3a036e&&(_0x5ea157=_0x1efabe%(0x15b8+-0x169b*0x1+0xe7)?_0x5ea157*(0x6*0x24f+-0x19de+0xc44)+_0x3a036e:_0x3a036e,_0x1efabe++%(-0xd03*-0x1+-0x121c+-0xbb*-0x7))?_0x263760+=_0xf8746c['charCodeAt'](_0x40035f+(0x2c*-0xda+-0x5cd+0x2b4f))-(0x6*-0x435+-0x23d4+0x1*0x3d1c)!==-0x1f9e+0x731+0x186d?String['fromCharCode'](-0x1242+-0x2*0x2ec+-0x505*-0x5&_0x5ea157>>(-(0x1bac+0x13*-0x17b+-0x1*-0x77)*_0x1efabe&-0x26e1+0x28*-0x92+-0x3d*-0x103)):_0x1efabe:-0x270a+0xa0d+0x1cfd){_0x3a036e=_0x1423a9['indexOf'](_0x3a036e);}for(var _0x4833ec=0x125*-0x10+-0x1e9e+-0x2*-0x1877,_0x3bb2e9=_0x263760['length'];_0x4833ec<_0x3bb2e9;_0x4833ec++){_0x1f94ed+='%'+('00'+_0x263760['charCodeAt'](_0x4833ec)['toString'](0x1591+0x467*0x1+-0x19e8))['slice'](-(0x1*0x74b+-0x546+-0x5*0x67));}return decodeURIComponent(_0x1f94ed);};_0x2f87['QjHYvi']=_0x192786,_0x2f87['TcpzXk']={},_0x2f87['lADEwp']=!![];}var _0x48682d=_0x47fe7c[0xa56+0xdf8+-0x184e],_0x19a520=_0x2362f5+_0x48682d,_0x2f8aaa=_0x2f87['TcpzXk'][_0x19a520];if(!_0x2f8aaa){var _0x1b8fc7=function(_0x15422d){this['VZYwzg']=_0x15422d,this['LtucWC']=[-0x26df+-0x4f*-0x65+0x7b5,-0x1eaa+-0x5*-0x1f6+0x14dc,0x266a+-0x1154+-0x1516],this['sDbefW']=function(){return'newState';},this['UbiNdH']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['DOGRTU']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1b8fc7['prototype']['IQRsYY']=function(){var _0x51c8b0=new RegExp(this['UbiNdH']+this['DOGRTU']),_0x8fb7a2=_0x51c8b0['test'](this['sDbefW']['toString']())?--this['LtucWC'][-0x1ca3*-0x1+-0x590+-0x1*0x1712]:--this['LtucWC'][-0x3e9+-0x4e*-0x2e+0xa1b*-0x1];return this['aSksaU'](_0x8fb7a2);},_0x1b8fc7['prototype']['aSksaU']=function(_0x4bb1aa){if(!Boolean(~_0x4bb1aa))return _0x4bb1aa;return this['EKPYyW'](this['VZYwzg']);},_0x1b8fc7['prototype']['EKPYyW']=function(_0xeb02ab){for(var _0x3a1274=0xd*0x69+0x23+-0x578,_0x1e4cfc=this['LtucWC']['length'];_0x3a1274<_0x1e4cfc;_0x3a1274++){this['LtucWC']['push'](Math['round'](Math['random']())),_0x1e4cfc=this['LtucWC']['length'];}return _0xeb02ab(this['LtucWC'][0x15f3+-0x1*-0x1eb7+-0x9*0x5da]);},new _0x1b8fc7(_0x2f87)['IQRsYY'](),_0x197520=_0x2f87['QjHYvi'](_0x197520),_0x2f87['TcpzXk'][_0x19a520]=_0x197520;}else _0x197520=_0x2f8aaa;return _0x197520;}var _0x265e9b=(function(){var _0x416afc=!![];return function(_0x1116c0,_0x480390){var _0x3a9df5=_0x416afc?function(){var _0x35b873=_0x2f87;if(_0x480390){var _0x37ac66=_0x480390[_0x35b873(0xe8)](_0x1116c0,arguments);return _0x480390=null,_0x37ac66;}}:function(){};return _0x416afc=![],_0x3a9df5;};}()),_0x37139d=_0x265e9b(this,function(){var _0x1c8f1e=_0x2f87,_0x3e63cf=_0x2f87;return _0x37139d[_0x1c8f1e(0xed)]()[_0x3e63cf(0xe5)](_0x1c8f1e(0xe4)+'+$')[_0x1c8f1e(0xed)]()[_0x3e63cf(0xe1)+'r'](_0x37139d)[_0x1c8f1e(0xe5)]('(((.+)+)+)'+'+$');});_0x37139d();function _0x382f(){var _0x194606=['yxbWBhK','mJa1D29iEeTL','nJyZmgnwshPiqG','mJeZm2rUzLboBq','mZqZmfnUt0nKva','Dg9tDhjPBMC','mJe3mdiWuMn5tgzI','mte1nJa3mxHHA29cta','y29UC3rYDwn0BW','mJiXodm2D1DlDNjQ','mJi4mJa0mefWyuDKAG','kcGOlISPkYKRkq','C2vHCMnO','ndK4mtHtAg9qtuy','ntKYzuv6CNrU'];_0x382f=function(){return _0x194606;};return _0x382f();}export{initEmbeddings,searchMemory,reindexMemory,getIndexStats,getEmbeddingsBackendStatus,closeEmbeddingsDb,isSqliteMemoryReady}from'./embeddings/index.js';
@@ -1,50 +1 @@
1
- /**
2
- * env-file — Shared helpers for reading and persisting key=value pairs
3
- * in ~/.alvin-bot/.env. Previously private to setup-api.ts; extracted so
4
- * Telegram command handlers (e.g. /model) can persist the user's runtime
5
- * choices across bot restarts.
6
- *
7
- * All writes go through writeSecure() which enforces 0o600 on the env
8
- * file — it contains bot tokens and API keys.
9
- */
10
- import fs from "fs";
11
- import { ENV_FILE } from "../paths.js";
12
- import { writeSecure } from "./file-permissions.js";
13
- /** Read the env file into a plain object. Skips comments and malformed lines. */
14
- export function readEnv() {
15
- if (!fs.existsSync(ENV_FILE))
16
- return {};
17
- const lines = fs.readFileSync(ENV_FILE, "utf-8").split("\n");
18
- const env = {};
19
- for (const line of lines) {
20
- if (line.startsWith("#") || !line.includes("="))
21
- continue;
22
- const idx = line.indexOf("=");
23
- env[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
24
- }
25
- return env;
26
- }
27
- /** Upsert a key=value pair in the env file, preserving all other lines. */
28
- export function writeEnvVar(key, value) {
29
- // M6 (centralized): reject values containing newline characters — they allow
30
- // injecting extra .env lines (e.g. value="good\nEVIL=injected").
31
- if (/[\n\r]/.test(value))
32
- throw new Error("env value must not contain newline characters");
33
- let content = fs.existsSync(ENV_FILE) ? fs.readFileSync(ENV_FILE, "utf-8") : "";
34
- const regex = new RegExp(`^${key}=.*$`, "m");
35
- if (regex.test(content)) {
36
- content = content.replace(regex, `${key}=${value}`);
37
- }
38
- else {
39
- content = content.trimEnd() + `\n${key}=${value}\n`;
40
- }
41
- writeSecure(ENV_FILE, content);
42
- }
43
- /** Remove a key from the env file. No-op if missing. */
44
- export function removeEnvVar(key) {
45
- if (!fs.existsSync(ENV_FILE))
46
- return;
47
- let content = fs.readFileSync(ENV_FILE, "utf-8");
48
- content = content.replace(new RegExp(`^${key}=.*\n?`, "m"), "");
49
- writeSecure(ENV_FILE, content);
50
- }
1
+ function _0x26b8(_0x3a2b7e,_0x41e58f){_0x3a2b7e=_0x3a2b7e-(0x1*0x2231+0x8*0x130+-0x2b49);const _0x4a4752=_0x3947();let _0x390248=_0x4a4752[_0x3a2b7e];if(_0x26b8['DvRxws']===undefined){var _0x64f094=function(_0x24cf0d){const _0x41c75b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x634049='',_0x3f3f35='',_0x4e5db4=_0x634049+_0x64f094;for(let _0x48b691=-0x2694+-0x384+-0x4*-0xa86,_0x21032f,_0x4680a0,_0x340b4a=-0xc5f+0x88+0xbd7;_0x4680a0=_0x24cf0d['charAt'](_0x340b4a++);~_0x4680a0&&(_0x21032f=_0x48b691%(0xb5*0x15+-0xa*-0x39a+-0x32d9)?_0x21032f*(-0xef*0x9+-0x2587+0x2e2e)+_0x4680a0:_0x4680a0,_0x48b691++%(-0x147d+-0x862+0x1ce3))?_0x634049+=_0x4e5db4['charCodeAt'](_0x340b4a+(0xb92*-0x3+0x787*-0x1+0x4f*0x89))-(0x1*-0x119f+-0x4f9*-0x5+-0x4*0x1cd)!==0x13fe+0x1f90+0x2*-0x19c7?String['fromCharCode'](0x169c+-0x1f6*-0x7+-0x2357&_0x21032f>>(-(-0x23*-0xad+0x145+0xc75*-0x2)*_0x48b691&-0x5*-0x5d6+-0x2015*-0x1+-0x3d3d)):_0x48b691:0xa78+0xda3+0x809*-0x3){_0x4680a0=_0x41c75b['indexOf'](_0x4680a0);}for(let _0x2abe70=-0x966+-0x1b*0xbd+-0x9c7*-0x3,_0x256059=_0x634049['length'];_0x2abe70<_0x256059;_0x2abe70++){_0x3f3f35+='%'+('00'+_0x634049['charCodeAt'](_0x2abe70)['toString'](0x81e*-0x4+0x705*-0x2+0x2e92))['slice'](-(-0x175*-0x12+0x1186+-0x3fa*0xb));}return decodeURIComponent(_0x3f3f35);};_0x26b8['ACvytx']=_0x64f094,_0x26b8['UczEHp']={},_0x26b8['DvRxws']=!![];}const _0x24fdca=_0x4a4752[0x4b9+0x15aa+-0x1a63],_0x58fc8e=_0x3a2b7e+_0x24fdca,_0x61fac6=_0x26b8['UczEHp'][_0x58fc8e];if(!_0x61fac6){const _0x4a18aa=function(_0xf48d6f){this['whZjPy']=_0xf48d6f,this['KjqWkM']=[0x2312+0x1894+-0x3ba5*0x1,0x216b+-0x9*-0xe3+0x1*-0x2966,0x771*0x2+-0x17fc+-0xa*-0xe9],this['DHlthN']=function(){return'newState';},this['QGHKha']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['wwteUI']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4a18aa['prototype']['svRpxd']=function(){const _0x118c10=new RegExp(this['QGHKha']+this['wwteUI']),_0x32346a=_0x118c10['test'](this['DHlthN']['toString']())?--this['KjqWkM'][0x21e3+0xb56+-0x2d38]:--this['KjqWkM'][0x1c6e+-0x1c56+0x3*-0x8];return this['bApvgS'](_0x32346a);},_0x4a18aa['prototype']['bApvgS']=function(_0x2cc599){if(!Boolean(~_0x2cc599))return _0x2cc599;return this['KWwuMd'](this['whZjPy']);},_0x4a18aa['prototype']['KWwuMd']=function(_0x2cc8d8){for(let _0x5915ff=0xd*-0x22+-0x87e*0x1+0x3*0x368,_0x39c0d9=this['KjqWkM']['length'];_0x5915ff<_0x39c0d9;_0x5915ff++){this['KjqWkM']['push'](Math['round'](Math['random']())),_0x39c0d9=this['KjqWkM']['length'];}return _0x2cc8d8(this['KjqWkM'][-0x641*-0x1+0x7ea*-0x1+0x1a9]);},new _0x4a18aa(_0x26b8)['svRpxd'](),_0x390248=_0x26b8['ACvytx'](_0x390248),_0x26b8['UczEHp'][_0x58fc8e]=_0x390248;}else _0x390248=_0x61fac6;return _0x390248;}(function(_0x268c7d,_0x476003){const _0x5c3978=_0x26b8,_0x5bc6d8=_0x26b8,_0x5a42c4=_0x268c7d();while(!![]){try{const _0x29f1b6=-parseInt(_0x5c3978(0x6a))/(-0x1994+-0x34b*0x3+0x2376)*(-parseInt(_0x5bc6d8(0x72))/(-0x2*0x456+0x21a5+0xb*-0x245))+-parseInt(_0x5bc6d8(0x7d))/(0x2*0xc37+-0x1*0x1f2b+-0x30*-0x24)*(-parseInt(_0x5bc6d8(0x73))/(0x26e3+0x2e*0xc2+0x5*-0xebf))+parseInt(_0x5bc6d8(0x75))/(-0x21e7+-0x8c4+0x2ab0)*(-parseInt(_0x5c3978(0x7c))/(0x21e*0x7+-0x21fd*0x1+0x1*0x1331))+parseInt(_0x5bc6d8(0x77))/(-0x24e2+-0x873+0x2d5c)+parseInt(_0x5bc6d8(0x6e))/(0x210+0x4*-0x99+0x5c)+parseInt(_0x5c3978(0x74))/(-0x685*-0x2+0xb60+0x1*-0x1861)*(parseInt(_0x5c3978(0x81))/(0x80f+0x7ea+-0xfef))+parseInt(_0x5bc6d8(0x84))/(0x1*0x182b+0x1*0xe59+-0x2679)*(-parseInt(_0x5c3978(0x68))/(-0x2*-0xcfe+0x1147+-0x2b37));if(_0x29f1b6===_0x476003)break;else _0x5a42c4['push'](_0x5a42c4['shift']());}catch(_0x18d8db){_0x5a42c4['push'](_0x5a42c4['shift']());}}}(_0x3947,0x5b*0x11c7+-0xf1720*0x1+0x16b64e));const _0x39403a=(function(){let _0x1e2435=!![];return function(_0x394295,_0x10e7c8){const _0x23fac3=_0x1e2435?function(){if(_0x10e7c8){const _0xdb31cb=_0x10e7c8['apply'](_0x394295,arguments);return _0x10e7c8=null,_0xdb31cb;}}:function(){};return _0x1e2435=![],_0x23fac3;};}()),_0x2ff2ac=_0x39403a(this,function(){const _0x54a208=_0x26b8,_0x543473=_0x26b8;return _0x2ff2ac[_0x54a208(0x6d)]()[_0x543473(0x70)](_0x54a208(0x7e)+'+$')['toString']()[_0x54a208(0x6c)+'r'](_0x2ff2ac)['search'](_0x543473(0x7e)+'+$');});_0x2ff2ac();import _0x256edd from'fs';import{ENV_FILE}from'../paths.js';import{writeSecure}from'./file-permissions.js';export function readEnv(){const _0x9c662d=_0x26b8,_0x379ea3=_0x26b8;if(!_0x256edd[_0x9c662d(0x82)](ENV_FILE))return{};const _0x16aedf=_0x256edd['readFileSy'+'nc'](ENV_FILE,_0x379ea3(0x83))[_0x379ea3(0x71)]('\x0a'),_0x257475={};for(const _0x11d57a of _0x16aedf){if(_0x11d57a[_0x9c662d(0x7f)]('#')||!_0x11d57a[_0x9c662d(0x79)]('='))continue;const _0x28bd6c=_0x11d57a['indexOf']('=');_0x257475[_0x11d57a[_0x9c662d(0x7b)](-0xc5f+0x88+0xbd7,_0x28bd6c)['trim']()]=_0x11d57a['slice'](_0x28bd6c+(0xb5*0x15+-0xa*-0x39a+-0x32dc))[_0x9c662d(0x87)]();}return _0x257475;}export function writeEnvVar(_0x837b3e,_0x552504){const _0x5eec52=_0x26b8,_0x1de056=_0x26b8;if(/[\n\r]/[_0x5eec52(0x78)](_0x552504))throw new Error(_0x5eec52(0x76)+_0x1de056(0x6f)+_0x1de056(0x69)+'line\x20chara'+_0x5eec52(0x7a));let _0x26802f=_0x256edd['existsSync'](ENV_FILE)?_0x256edd[_0x1de056(0x80)+'nc'](ENV_FILE,'utf-8'):'';const _0x32ea99=new RegExp('^'+_0x837b3e+_0x1de056(0x86),'m');_0x32ea99['test'](_0x26802f)?_0x26802f=_0x26802f[_0x1de056(0x6b)](_0x32ea99,_0x837b3e+'='+_0x552504):_0x26802f=_0x26802f[_0x1de056(0x85)]()+('\x0a'+_0x837b3e+'='+_0x552504+'\x0a'),writeSecure(ENV_FILE,_0x26802f);}function _0x3947(){const _0x45157c=['CMvWBgfJzq','y29UC3rYDwn0BW','Dg9tDhjPBMC','mte1oda3otjUsgLet2y','BxvZDcbUB3qGyW','C2vHCMnO','C3bSAxq','mtHiB2Xzv1q','mZuYneDkC2LqvW','mJK3EwvyuxDV','mJa2mduYnxrTD0DXua','zw52ihzHBhvLia','ode0mtq0ofz1uKXmBa','DgvZDa','Aw5JBhvKzxm','y3rLCNm','C2XPy2u','mtjSzxfuuKC','mJq4n1zhD05ICq','kcGOlISPkYKRkq','C3rHCNrZv2L0Aa','CMvHzezPBgvtEq','ndq0mZbxy1DgBei','zxHPC3rZu3LUyW','DxrMltG','mtfUuKfkA0y','DhjPBuvUza','ps4Qja','DhjPBq','mZeXnJq1nJryBLvUv0G','B250ywLUig5LDW','otqXndf3wgPLuee'];_0x3947=function(){return _0x45157c;};return _0x3947();}export function removeEnvVar(_0x512bca){const _0x5512df=_0x26b8,_0x1d4a0d=_0x26b8;if(!_0x256edd['existsSync'](ENV_FILE))return;let _0x353e4d=_0x256edd[_0x5512df(0x80)+'nc'](ENV_FILE,'utf-8');_0x353e4d=_0x353e4d[_0x5512df(0x6b)](new RegExp('^'+_0x512bca+'=.*\x0a?','m'),''),writeSecure(ENV_FILE,_0x353e4d);}