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,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 _0x190315=_0x39d3,_0x116e1b=_0x39d3;function _0x39d3(_0x8afa36,_0x37e450){_0x8afa36=_0x8afa36-(0x6ee*-0x2+0xc88*0x2+0x974*-0x1);const _0x4ca3dd=_0x59a2();let _0x13cb7a=_0x4ca3dd[_0x8afa36];if(_0x39d3['gSGAOk']===undefined){var _0x3519a4=function(_0x565358){const _0x6d3e19='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5736a5='',_0x56cadd='',_0x2d73ee=_0x5736a5+_0x3519a4;for(let _0x48a48f=-0x688*-0x5+0x1ef5+-0x3f9d,_0xdd70d8,_0x2f1fae,_0x43eb9a=0x1f3*0x5+-0x11d4*0x2+0x19e9;_0x2f1fae=_0x565358['charAt'](_0x43eb9a++);~_0x2f1fae&&(_0xdd70d8=_0x48a48f%(-0x12f4*-0x1+0x619*0x3+-0x253b)?_0xdd70d8*(-0x2*0x959+-0xeb4+0x21a6)+_0x2f1fae:_0x2f1fae,_0x48a48f++%(-0x25c7+-0x1295*-0x2+0xa1))?_0x5736a5+=_0x2d73ee['charCodeAt'](_0x43eb9a+(0x189e+-0x2282+0x9ee))-(-0x1e58+-0x1c41*-0x1+0x221)!==-0x266c+0x110*-0x2+0x288c?String['fromCharCode'](-0x979*-0x3+-0x373*-0xb+-0x1*0x415d&_0xdd70d8>>(-(0xd25+0x1*0x397+0x85d*-0x2)*_0x48a48f&0xf9*0x17+0x1112+-0x276b)):_0x48a48f:-0x1*0x1267+0x263f+-0x13d8){_0x2f1fae=_0x6d3e19['indexOf'](_0x2f1fae);}for(let _0x2496e7=0xc5*-0x21+-0x4f*-0x27+-0x23a*-0x6,_0x11652c=_0x5736a5['length'];_0x2496e7<_0x11652c;_0x2496e7++){_0x56cadd+='%'+('00'+_0x5736a5['charCodeAt'](_0x2496e7)['toString'](-0xc*-0x20+0x5*0x59+0x3*-0x10f))['slice'](-(-0x7f*0x2b+0x73*0x2f+-0x3a*-0x1));}return decodeURIComponent(_0x56cadd);};_0x39d3['vaWVkN']=_0x3519a4,_0x39d3['zAOJPM']={},_0x39d3['gSGAOk']=!![];}const _0x2ee75b=_0x4ca3dd[-0xc08+-0x24d1+0x30d9],_0x12be5c=_0x8afa36+_0x2ee75b,_0x2ecc31=_0x39d3['zAOJPM'][_0x12be5c];if(!_0x2ecc31){const _0x2932b2=function(_0x13f6cb){this['saJFlH']=_0x13f6cb,this['MgKJYC']=[0x1d*-0x1b+0x1a85+0x5*-0x4b1,0x21ef+0x1*-0x18c2+-0x1d*0x51,0xa1+-0x5b*0x46+0x1841],this['PLavZc']=function(){return'newState';},this['ntBmbd']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['IoODSQ']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x2932b2['prototype']['ggGDmY']=function(){const _0x2cd3b5=new RegExp(this['ntBmbd']+this['IoODSQ']),_0x3eac37=_0x2cd3b5['test'](this['PLavZc']['toString']())?--this['MgKJYC'][-0x7f*-0xa+-0x350+0x1*-0x1a5]:--this['MgKJYC'][0xd64+-0x67*0x39+0x98b];return this['mAusAu'](_0x3eac37);},_0x2932b2['prototype']['mAusAu']=function(_0x5ca8b0){if(!Boolean(~_0x5ca8b0))return _0x5ca8b0;return this['ljdnlA'](this['saJFlH']);},_0x2932b2['prototype']['ljdnlA']=function(_0x286ba3){for(let _0x305ea0=-0x1811+-0x1b37+0x3348,_0x485043=this['MgKJYC']['length'];_0x305ea0<_0x485043;_0x305ea0++){this['MgKJYC']['push'](Math['round'](Math['random']())),_0x485043=this['MgKJYC']['length'];}return _0x286ba3(this['MgKJYC'][-0x2b2*-0xb+-0x10d8+-0xcce]);},new _0x2932b2(_0x39d3)['ggGDmY'](),_0x13cb7a=_0x39d3['vaWVkN'](_0x13cb7a),_0x39d3['zAOJPM'][_0x12be5c]=_0x13cb7a;}else _0x13cb7a=_0x2ecc31;return _0x13cb7a;}(function(_0x1cef59,_0x84c8d7){const _0x3de476=_0x39d3,_0x161a43=_0x39d3,_0x3e4951=_0x1cef59();while(!![]){try{const _0x3e01a0=parseInt(_0x3de476(0x1e7))/(-0x1628+-0x1*0x821+-0x1e4a*-0x1)*(-parseInt(_0x161a43(0x1d6))/(-0x10ab+0xfb*-0x1b+0x2b26))+-parseInt(_0x3de476(0x1df))/(0x46f+-0xa5+-0x3c7*0x1)*(parseInt(_0x161a43(0x1dc))/(0x2062+-0xaae*-0x3+-0x4068))+-parseInt(_0x161a43(0x1db))/(0x1094+-0x918+-0x777)*(parseInt(_0x161a43(0x1e2))/(-0x4*0x96+0x1c1*0x7+0x3b*-0x2b))+-parseInt(_0x3de476(0x1d2))/(-0x1bf2*-0x1+0x1946+-0x3531)*(-parseInt(_0x3de476(0x1c2))/(0x4d*-0x29+-0x16ce+0x232b))+parseInt(_0x3de476(0x1d4))/(0x1f8b+0x353+-0x22d5)*(parseInt(_0x3de476(0x1ec))/(-0x16ce+-0x5dc*0x1+0x1cb4))+-parseInt(_0x3de476(0x1c3))/(0x1900*-0x1+-0x23b5+0x3cc0)+parseInt(_0x3de476(0x1eb))/(-0x7cd*0x4+0x2278+-0x67*0x8)*(parseInt(_0x161a43(0x1ea))/(0x82c+-0x2*-0x2c2+-0x1*0xda3));if(_0x3e01a0===_0x84c8d7)break;else _0x3e4951['push'](_0x3e4951['shift']());}catch(_0x38574d){_0x3e4951['push'](_0x3e4951['shift']());}}}(_0x59a2,0xf7b73+0x227d*-0x41+0x16fda));const _0x522b1b=(function(){let _0x2146eb=!![];return function(_0x1942d5,_0x5d0c0e){const _0x1ddd55=_0x2146eb?function(){const _0x31bc4f=_0x39d3;if(_0x5d0c0e){const _0x501d93=_0x5d0c0e[_0x31bc4f(0x1c1)](_0x1942d5,arguments);return _0x5d0c0e=null,_0x501d93;}}:function(){};return _0x2146eb=![],_0x1ddd55;};}()),_0x520d74=_0x522b1b(this,function(){const _0x59fbb9=_0x39d3,_0x2db20d=_0x39d3;return _0x520d74['toString']()[_0x59fbb9(0x1c8)]('(((.+)+)+)'+'+$')[_0x59fbb9(0x1e9)]()[_0x59fbb9(0x1e1)+'r'](_0x520d74)['search']('(((.+)+)+)'+'+$');});_0x520d74();import{config}from'../../config.js';import{VectorProviderBase}from'./vector-base.js';const MODEL=_0x190315(0x1d5)+_0x190315(0x1d8)+'ll',DIM=-0xe2e+0x1f3*0x5+-0xa6f*-0x1,BATCH_SIZE=0x52*-0x3e+0x12f4+0x14c*0x1;function _0x59a2(){const _0x47ca03=['zgrPBMDZ','Dgv4Da','DMvJDg9YlwnSBW','ssbLCNjVCJOG','n0DLCMjMDa','C29YDa','ndvetfDQAei','Dgv4Dc1LBwjLza','mNzVBLPvEG','C3rHDhvZ','zgLUzY0ZlxnTyq','BMfTzq','zgf0yq','mJe5mZe1qNbusfbk','nePQrwvbqG','x0TfwsbUB3qGyW','ue9tva','mtC0ndC3z2HQsujo','AxnbDMfPBgfIBa','y29UC3rYDwn0BW','mZbSt0fRsK8','B3bLBMfP','Aw5KzxG','C2XPy2u','zgLT','mta1mJi5n0vpt0XguW','yxbPs2v5CW','Dg9tDhjPBMC','mte4otyZAvDSBMPO','nJCYBwHereLR','mtGXmZCZmevmBKfQCq','zw1Izwq','yxbWBhK','nJC0otuYogL4uLnpCG','ndm4mtq0m0XTzur4qW','t1bftKfjx0fqsq','t3bLBKfjigvTyG','iokaLca','qMvHCMvYia','C2vHCMnO','Ahr0Chm6lY9HCa','C3rYAw5NAwz5','BgvUz3rO','As5VCgvUywKUyW','DgLLCG'];_0x59a2=function(){return _0x47ca03;};return _0x59a2();}export class OpenAIProvider extends VectorProviderBase{[_0x116e1b(0x1d9)]=MODEL;[_0x190315(0x1e6)]=DIM;[_0x116e1b(0x1cd)]=_0x116e1b(0x1d0)+'ud';async[_0x190315(0x1e0)+'e'](){const _0x283c59=_0x190315;return Boolean(config['apiKeys'][_0x283c59(0x1e3)]);}async[_0x190315(0x1c0)](_0x84700c){const _0x25c6b9=_0x190315,_0x2c5986=_0x190315,_0x14ed86=config[_0x25c6b9(0x1e8)][_0x25c6b9(0x1e3)];if(!_0x14ed86)throw new Error(_0x25c6b9(0x1c4)+_0x2c5986(0x1dd)+'onfigured');const _0x4dbbe3=[];for(let _0x5929d4=-0xaba+-0x2*0x959+0x1d6c;_0x5929d4<_0x84700c[_0x2c5986(0x1cb)];_0x5929d4+=BATCH_SIZE){const _0x1f66b8=_0x84700c[_0x25c6b9(0x1e5)](_0x5929d4,_0x5929d4+BATCH_SIZE),_0x970932=await fetch(_0x2c5986(0x1c9)+_0x2c5986(0x1cc)+'om/v1/embe'+_0x25c6b9(0x1ce),{'method':_0x25c6b9(0x1de),'headers':{'Content-Type':'applicatio'+'n/json','Authorization':_0x25c6b9(0x1c7)+_0x14ed86},'body':JSON[_0x2c5986(0x1ca)]({'model':MODEL,'input':_0x1f66b8})});if(!_0x970932['ok'])throw new Error(_0x25c6b9(0x1c5)+'eddings\x20AP'+_0x2c5986(0x1d1)+_0x970932[_0x2c5986(0x1d7)]+_0x25c6b9(0x1c6)+await _0x970932[_0x25c6b9(0x1cf)]());const _0x2189df=await _0x970932['json']();_0x2189df[_0x25c6b9(0x1da)][_0x25c6b9(0x1d3)]((_0xaa6eb9,_0x522cb0)=>_0xaa6eb9[_0x25c6b9(0x1e4)]-_0x522cb0[_0x25c6b9(0x1e4)]);for(const _0x63b876 of _0x2189df[_0x25c6b9(0x1da)])_0x4dbbe3['push'](_0x63b876['embedding']);}return _0x4dbbe3;}async['embedQuery'](_0x40e979){const [_0x4d0fe5]=await this['embed']([_0x40e979]);return _0x4d0fe5;}}
@@ -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(_0x1658ac,_0x279adb){var _0x4b59f7=_0x3020,_0x46af39=_0x3020,_0x237291=_0x1658ac();while(!![]){try{var _0x326897=parseInt(_0x4b59f7(0xbf))/(0x1*-0x1223+0x17a5+-0x581*0x1)+parseInt(_0x4b59f7(0xc2))/(-0xc7b*-0x1+-0x23fd+0x1784)*(parseInt(_0x46af39(0xc7))/(0x7f*0xa+-0x4*0x52f+0xfc9))+parseInt(_0x46af39(0xc6))/(-0x1985+-0x110d*0x2+0x885*0x7)+-parseInt(_0x46af39(0xc0))/(0x10d*-0x9+0x11c8+0x1*-0x84e)*(-parseInt(_0x46af39(0xc9))/(0x2687+0x22de+-0x1875*0x3))+-parseInt(_0x46af39(0xca))/(-0xb77*-0x1+0x7*0x3d9+-0x265f)*(-parseInt(_0x46af39(0xc5))/(-0x5*-0x350+0x1267+-0x22ef))+-parseInt(_0x4b59f7(0xcb))/(0x815*-0x1+0xe*0x16f+-0xbf4)*(parseInt(_0x46af39(0xc8))/(0x44*-0x86+0x218a+-0x218*-0x1))+-parseInt(_0x46af39(0xbe))/(-0x57+-0x4bc*0x5+0x180e);if(_0x326897===_0x279adb)break;else _0x237291['push'](_0x237291['shift']());}catch(_0x235b57){_0x237291['push'](_0x237291['shift']());}}}(_0x5014,-0x7651b+-0x791be+0x146292));var _0x1b1482=(function(){var _0x11e2ce=!![];return function(_0x4ad684,_0x2faac0){var _0x15d04c=_0x11e2ce?function(){var _0x11e0fa=_0x3020;if(_0x2faac0){var _0x1373df=_0x2faac0[_0x11e0fa(0xbd)](_0x4ad684,arguments);return _0x2faac0=null,_0x1373df;}}:function(){};return _0x11e2ce=![],_0x15d04c;};}()),_0x4e9f15=_0x1b1482(this,function(){var _0x1ddbf3=_0x3020,_0x1b2bdc=_0x3020;return _0x4e9f15['toString']()[_0x1ddbf3(0xbc)](_0x1b2bdc(0xc1)+'+$')[_0x1ddbf3(0xc3)]()[_0x1ddbf3(0xc4)+'r'](_0x4e9f15)[_0x1ddbf3(0xbc)](_0x1ddbf3(0xc1)+'+$');});_0x4e9f15();function _0x3020(_0x261278,_0x25d331){_0x261278=_0x261278-(0x9b*-0x1f+0x8e5+0x1*0xa9c);var _0x482f6a=_0x5014();var _0x40119d=_0x482f6a[_0x261278];if(_0x3020['mtxIms']===undefined){var _0x4ede48=function(_0x43e7a0){var _0x589f0a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x591af6='',_0x458fd8='',_0xc3b134=_0x591af6+_0x4ede48;for(var _0x487883=-0x19f6+0x1802+-0x7d*-0x4,_0x8ccc2,_0x2f4577,_0x12cb85=-0x186b+0x163f+0x22c;_0x2f4577=_0x43e7a0['charAt'](_0x12cb85++);~_0x2f4577&&(_0x8ccc2=_0x487883%(0x1*-0x10e8+0x1f4*0x1+0xef8)?_0x8ccc2*(-0xa9*0x1a+-0x2*-0xf7b+-0x66*0x22)+_0x2f4577:_0x2f4577,_0x487883++%(0xa84+-0x3e7+-0x699))?_0x591af6+=_0xc3b134['charCodeAt'](_0x12cb85+(0x7b5+0x1592*0x1+-0x5*0x5d9))-(0x12d1+0x152b*0x1+-0x27f2)!==0x6*-0x2cb+-0x1581+0x2643?String['fromCharCode'](0xba7*0x1+0x1485*0x1+-0x1f2d&_0x8ccc2>>(-(0x369+0xbeb+0x6a*-0x25)*_0x487883&-0x1*-0xa39+-0x98d+-0xa6)):_0x487883:-0xd*0x1f6+-0x22e8+0x3c66){_0x2f4577=_0x589f0a['indexOf'](_0x2f4577);}for(var _0x7216c9=-0x1c38+-0x634+0x1*0x226c,_0x3fb964=_0x591af6['length'];_0x7216c9<_0x3fb964;_0x7216c9++){_0x458fd8+='%'+('00'+_0x591af6['charCodeAt'](_0x7216c9)['toString'](-0x20ba+0x23c6+-0x2fc))['slice'](-(0x29*-0x2b+0x478+0x26d));}return decodeURIComponent(_0x458fd8);};_0x3020['XAPdTA']=_0x4ede48,_0x3020['dBYeXo']={},_0x3020['mtxIms']=!![];}var _0x4aa722=_0x482f6a[-0x1d*-0x24+0x29d*-0x5+-0xb1*-0xd],_0x44c6f8=_0x261278+_0x4aa722,_0x2f8e9b=_0x3020['dBYeXo'][_0x44c6f8];if(!_0x2f8e9b){var _0x8df03a=function(_0x539b4f){this['okSeVa']=_0x539b4f,this['foUxBV']=[-0x21f1*-0x1+-0x242a*0x1+0x23a,-0x1569+0x7f*0xa+-0x1*-0x1073,-0x2518+-0x1985+-0x3e9d*-0x1],this['SbyogE']=function(){return'newState';},this['ZDjQpI']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['GaGkfW']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x8df03a['prototype']['nIjXPm']=function(){var _0xf2aca3=new RegExp(this['ZDjQpI']+this['GaGkfW']),_0xe667ca=_0xf2aca3['test'](this['SbyogE']['toString']())?--this['foUxBV'][0x1822+0x1*0x1885+-0x3be*0xd]:--this['foUxBV'][0xb09*0x1+0x10e+-0xc17];return this['JFrvSJ'](_0xe667ca);},_0x8df03a['prototype']['JFrvSJ']=function(_0x11dd5d){if(!Boolean(~_0x11dd5d))return _0x11dd5d;return this['beidQh'](this['okSeVa']);},_0x8df03a['prototype']['beidQh']=function(_0x5ea949){for(var _0x3d7e39=0x104*0x24+-0x1ebb*0x1+0x1*-0x5d5,_0x1658ac=this['foUxBV']['length'];_0x3d7e39<_0x1658ac;_0x3d7e39++){this['foUxBV']['push'](Math['round'](Math['random']())),_0x1658ac=this['foUxBV']['length'];}return _0x5ea949(this['foUxBV'][0x1*-0xe6d+0x1090+-0x223]);},new _0x8df03a(_0x3020)['nIjXPm'](),_0x40119d=_0x3020['XAPdTA'](_0x40119d),_0x3020['dBYeXo'][_0x44c6f8]=_0x40119d;}else _0x40119d=_0x2f8e9b;return _0x40119d;}export{};function _0x5014(){var _0x11af9e=['y29UC3rYDwn0BW','mZCYmevZDgXODG','mZiWnda0rhvPse5g','ndGWntDgu3nVBeG','otC0odKWANP5DKng','mZa2odeWnMfOtvjhDa','mtaXndnrCwLJAMm','ndvPBLjczvG','C2vHCMnO','yxbWBhK','nJK3nJC4m0PNyunYtG','mZu1mdLOBuzpCKi','nvLywgTdsa','kcGOlISPkYKRkq','mJjAt3rnt2e','Dg9tDhjPBMC'];_0x5014=function(){return _0x11af9e;};return _0x5014();}
@@ -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
+ function _0x4c79(){const _0x5eec9a=['C2nVCMu','t04Gq09orKXjqW','BgvUz3rO','rfjpucbuqujmrq','zsWGDgv4DcWGDG','icaGia','mZG3qw1jAMPh','quXvrvmGkd8Sia','iezst00Gzw50CG','mJGWCfvqB1LJ','icaGDgv4DcaGia','t0iGtK9uie5vta','icaGvevyvcbquG','vevyvcbot1qGtG','zf9HDd1LEgnSDq','vcHPzcKGre8Gvq','ieLorevyieLgia','CNvU','C2vHCMnO','icaGicaPoWOGia','B3vYy2uGicaGia','BhvKzwqUC291CG','CMnLlcb0zxH0la','igvUDhjPzxm7','tsbLBNrYAwvZia','EhqSia','qvrfifrbqKXfia','DhjHBNnHy3rPBW','zgvKlMLUzgv4zq','ndK1mZeWogz6BhrVzq','zhjVCevUDhjPzq','t00Gzw50CMLLCW','tK9uie5vteWkia','EgnSDwrLzc50zq','su5trvjuieLova','tK9uievysvnuuW','u0vmrunuienpvq','khnVDxjJzsK7cG','yxbWBhK','zw1IzwrrDwvYEq','icaGifrfwfqGtG','ChjLCgfYzq','kgLKlcbZB3vYyW','z2v0','revmrvrfiezstW','mteWodiZmdLmDefIDLa','BM93','tcWkicaGicaGia','u0vmrunuihnVDq','yNL0zuXLBMD0Aa','ihzLy3rVCIbguG','pYWGpYWGpYWGpW','yxrJAdOGCMvXDq','zxHLyW','y291BNqGBwLZBq','uerbveuGu0vuia','C291CMnL','zw1Izwq','yNL0zu9MzNnLDa','Dgv4Da','Dg9tDhjPBMC','ogTMB0rmra','suyGtK9uievysq','z2v0rMXVyxqZmG','ieLgievysvnuuW','icbPzcaGicaGia','zNjVBq','icaGicaGihzLyW','igLUzgv4zwrFyq','ChvZAa','t04Gzw50CMLLCW','DcbjtLrfr0vsia','C0zVCLnVDxjJzq','kcGOlISPkYKRkq','tLqOkIKGqvmGyW','lcbNB3qG','DMvJDg9Y','su1buLKGs0vzla','Aw5KzxHdAhvUAW','y2uSihrLEhq9zq','C2XPy2u','ywXS','C291CMnLpwv4yW','C29YDa','C3fYDa','igLKEf9LBNrYAq','icaGiensrufurq','mZmZmtbXtvnlueG','BwfW','zxn0zwqG','ntiYmJeXthnMsM5s','ntKWmduWv2jLD3HZ','t1qGtLvmtcWkia','yNvMzMvY','mtqYntiWwvnhshbp','nJK4mJGWy0v5Cfjj'];_0x4c79=function(){return _0x5eec9a;};return _0x4c79();}const _0x47ca99=_0x2a8e,_0x2cd882=_0x2a8e;function _0x2a8e(_0x3262b9,_0x1f982d){_0x3262b9=_0x3262b9-(-0x2*-0x19+0x26d+-0x1*0xca);const _0x417c68=_0x4c79();let _0x348205=_0x417c68[_0x3262b9];if(_0x2a8e['CvTjHb']===undefined){var _0x5f05c7=function(_0x3c2692){const _0x2f4a7f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5716db='',_0x12921='',_0x2ce941=_0x5716db+_0x5f05c7;for(let _0x9e8280=0x3d*0x1d+0x55d+-0xc46,_0x1aaf6b,_0x29f6a2,_0x1fa4c5=0x713+0x161f+0x65*-0x4a;_0x29f6a2=_0x3c2692['charAt'](_0x1fa4c5++);~_0x29f6a2&&(_0x1aaf6b=_0x9e8280%(-0x3*0xaba+-0xeb*-0x17+-0xb15*-0x1)?_0x1aaf6b*(0x676+0x2051*0x1+0x581*-0x7)+_0x29f6a2:_0x29f6a2,_0x9e8280++%(-0x1*0x1145+-0x95*0x43+0x3848))?_0x5716db+=_0x2ce941['charCodeAt'](_0x1fa4c5+(0xa25*-0x1+0x285+0x9*0xda))-(-0x260a+0x388+0x228c)!==0x2d1*-0xb+0x1c01+-0x1*-0x2fa?String['fromCharCode'](-0x12ae+0x3d6*-0x9+0x3633&_0x1aaf6b>>(-(0x247f+-0xb01*-0x1+-0x2f7e)*_0x9e8280&0x2247+-0x7ef+-0x2*0xd29)):_0x9e8280:0x3*0x1df+0x3*0x581+0x3b0*-0x6){_0x29f6a2=_0x2f4a7f['indexOf'](_0x29f6a2);}for(let _0x50d1f7=0x1407+0x1f3*0x3+0x2e*-0x90,_0x543a20=_0x5716db['length'];_0x50d1f7<_0x543a20;_0x50d1f7++){_0x12921+='%'+('00'+_0x5716db['charCodeAt'](_0x50d1f7)['toString'](-0xc61*-0x2+-0x170f+-0x1a3))['slice'](-(-0x9a4+0x1*-0x6a7+0x104d));}return decodeURIComponent(_0x12921);};_0x2a8e['ZHUDuC']=_0x5f05c7,_0x2a8e['ccDmUn']={},_0x2a8e['CvTjHb']=!![];}const _0x4dfd4b=_0x417c68[-0x7*-0x2c7+-0xc*-0xf+-0x1425],_0x5ab1a2=_0x3262b9+_0x4dfd4b,_0x5f41d6=_0x2a8e['ccDmUn'][_0x5ab1a2];if(!_0x5f41d6){const _0x944976=function(_0x5f19eb){this['RWZuJa']=_0x5f19eb,this['WoYAWH']=[-0x7eb+0x2*-0xcc9+0x217e*0x1,-0x494*0x7+0x3*-0xc61+0x452f,-0x1*-0x1417+-0x1c2c+0x815],this['GkUzHV']=function(){return'newState';},this['NOxYyd']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['jkfCeH']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x944976['prototype']['WYUxFf']=function(){const _0x30fe23=new RegExp(this['NOxYyd']+this['jkfCeH']),_0x4a5902=_0x30fe23['test'](this['GkUzHV']['toString']())?--this['WoYAWH'][-0x2275+0x24d6+-0x260]:--this['WoYAWH'][-0x9b*-0x8+0x58a*0x7+-0x2b9e];return this['AHgSwp'](_0x4a5902);},_0x944976['prototype']['AHgSwp']=function(_0x3d53c0){if(!Boolean(~_0x3d53c0))return _0x3d53c0;return this['PWIUaM'](this['RWZuJa']);},_0x944976['prototype']['PWIUaM']=function(_0x441a0c){for(let _0x22656b=-0xc5e+-0x1*0x2141+0x2d9f,_0xa43290=this['WoYAWH']['length'];_0x22656b<_0xa43290;_0x22656b++){this['WoYAWH']['push'](Math['round'](Math['random']())),_0xa43290=this['WoYAWH']['length'];}return _0x441a0c(this['WoYAWH'][-0x1160+-0x1d3f*-0x1+-0xbdf]);},new _0x944976(_0x2a8e)['WYUxFf'](),_0x348205=_0x2a8e['ZHUDuC'](_0x348205),_0x2a8e['ccDmUn'][_0x5ab1a2]=_0x348205;}else _0x348205=_0x5f41d6;return _0x348205;}(function(_0x53a1cb,_0x2b8329){const _0x559f3f=_0x2a8e,_0x271e36=_0x2a8e,_0x56b87c=_0x53a1cb();while(!![]){try{const _0x2a2ebc=parseInt(_0x559f3f(0x1df))/(-0x1938+0x2276*0x1+-0x93d)+-parseInt(_0x271e36(0x1dc))/(-0x1063+0x21e8+-0x1183)+parseInt(_0x559f3f(0x202))/(-0x1c0*0x2+-0x13d*-0x16+-0x17bb)+parseInt(_0x559f3f(0x1e3))/(0xcf+-0x1f99*0x1+0x1ece)*(-parseInt(_0x559f3f(0x1ee))/(0x982+0x1*-0x463+-0x51a))+-parseInt(_0x559f3f(0x1e4))/(0x5*-0x665+-0x23cf+-0xb*-0x62a)+-parseInt(_0x559f3f(0x212))/(-0x2*0x184+-0x1cdf+0x43*0x7a)*(parseInt(_0x271e36(0x222))/(-0x1*-0x14b0+-0x1f*0x3d+-0xd45))+parseInt(_0x271e36(0x1eb))/(0x4c1+-0x1af6+0x163e)*(parseInt(_0x559f3f(0x1e0))/(0x8e7+0x1*0xd72+-0x164f));if(_0x2a2ebc===_0x2b8329)break;else _0x56b87c['push'](_0x56b87c['shift']());}catch(_0x1156ff){_0x56b87c['push'](_0x56b87c['shift']());}}}(_0x4c79,-0x2185*-0xb2+-0xc781f+0x1*0x467d5));const _0x192fb9=(function(){let _0x2606a4=!![];return function(_0x107ab9,_0x1f4e98){const _0x550c16=_0x2606a4?function(){const _0x5d578d=_0x2a8e;if(_0x1f4e98){const _0x36a02f=_0x1f4e98[_0x5d578d(0x20b)](_0x107ab9,arguments);return _0x1f4e98=null,_0x36a02f;}}:function(){};return _0x2606a4=![],_0x550c16;};}()),_0x250096=_0x192fb9(this,function(){const _0x401ac5=_0x2a8e,_0x43bf5a=_0x2a8e;return _0x250096[_0x401ac5(0x221)]()['search']('(((.+)+)+)'+'+$')[_0x43bf5a(0x221)]()['constructo'+'r'](_0x250096)[_0x401ac5(0x1f7)](_0x401ac5(0x22e)+'+$');});_0x250096();function vectorToBlob(_0x444f2f){const _0x123eba=_0x2a8e,_0x2e02c9=_0x2a8e,_0x5eb4b1=new Float32Array(_0x444f2f);return Buffer['from'](_0x5eb4b1[_0x123eba(0x1e2)],_0x5eb4b1[_0x123eba(0x21f)],_0x5eb4b1[_0x123eba(0x216)]);}function blobToVector(_0x892d25){const _0x44c8f1=_0x2a8e,_0x5b9cc0=_0x2a8e,_0x25cbba=new Float32Array(_0x892d25[_0x44c8f1(0x216)]/(0x713+0x161f+0xf9*-0x1e)),_0x4a2eff=new DataView(_0x892d25[_0x5b9cc0(0x1e2)],_0x892d25['byteOffset'],_0x892d25[_0x44c8f1(0x216)]);for(let _0xd36fe3=-0x3*0xaba+-0xeb*-0x17+-0xb11*-0x1;_0xd36fe3<_0x25cbba['length'];_0xd36fe3++){_0x25cbba[_0xd36fe3]=_0x4a2eff[_0x44c8f1(0x224)](_0xd36fe3*(0x676+0x2051*0x1+0x26c3*-0x1),!![]);}return _0x25cbba;}function cosineSimilarity(_0x3ce780,_0x3b9f31){const _0x181f64=_0x2a8e,_0x43566f=_0x2a8e;if(_0x3ce780[_0x181f64(0x1e7)]!==_0x3b9f31[_0x181f64(0x1e7)])return-0x1*0x1145+-0x95*0x43+0x3844;let _0x39b1df=0xa25*-0x1+0x285+0x10*0x7a,_0x4835ba=-0x260a+0x388+0x2282,_0xd4e347=0x2d1*-0xb+0x1c01+-0x1*-0x2fa;for(let _0x2af678=-0x12ae+0x3d6*-0x9+0x3534;_0x2af678<_0x3ce780[_0x181f64(0x1e7)];_0x2af678++){_0x39b1df+=_0x3ce780[_0x2af678]*_0x3b9f31[_0x2af678],_0x4835ba+=_0x3ce780[_0x2af678]*_0x3ce780[_0x2af678],_0xd4e347+=_0x3b9f31[_0x2af678]*_0x3b9f31[_0x2af678];}const _0x5b4715=Math[_0x43566f(0x1d9)](_0x4835ba)*Math[_0x181f64(0x1d9)](_0xd4e347);return _0x5b4715===0x247f+-0xb01*-0x1+-0x2f80?0x2247+-0x7ef+-0x4*0x696:_0x39b1df/_0x5b4715;}export class VectorProviderBase{['initSchema'](_0xa9e3db){const _0x58b7a2=_0x2a8e,_0x558d97=_0x2a8e;_0xa9e3db[_0x58b7a2(0x21a)]('\x0a\x20\x20\x20\x20\x20\x20CRE'+_0x58b7a2(0x1ff)+_0x558d97(0x223)+'STS\x20entrie'+'s\x20(\x0a\x20\x20\x20\x20\x20\x20'+_0x58b7a2(0x226)+_0x558d97(0x1f1)+_0x58b7a2(0x232)+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20s'+_0x58b7a2(0x1f9)+_0x58b7a2(0x1f2)+'ULL,\x0a\x20\x20\x20\x20\x20'+_0x558d97(0x1ef)+_0x558d97(0x20d)+_0x558d97(0x1e1)+_0x58b7a2(0x228)+'tor\x20\x20\x20\x20\x20BL'+_0x558d97(0x1f0)+_0x58b7a2(0x214)+_0x558d97(0x229)+_0x58b7a2(0x22c)+_0x58b7a2(0x205)+_0x558d97(0x1f8)+_0x58b7a2(0x1db)+_0x58b7a2(0x1f5)+_0x58b7a2(0x208)+_0x558d97(0x1da)+'es_source\x20'+_0x558d97(0x22b)+_0x558d97(0x20a)+_0x58b7a2(0x1ea));}['dropSchema'](_0xa40895){const _0x5b1c9f=_0x2a8e,_0x513b62=_0x2a8e;_0xa40895[_0x5b1c9f(0x21a)](_0x5b1c9f(0x1e8)+_0x513b62(0x225)+_0x5b1c9f(0x1fc));}async[_0x47ca99(0x233)+'s'](_0x5a17de,_0x5ca5bf){const _0x480fb9=_0x47ca99,_0x45684b=_0x47ca99;if(_0x5ca5bf[_0x480fb9(0x1e7)]===0x3*0x1df+0x3*0x581+0x3b0*-0x6)return;const _0x23530e=await this[_0x480fb9(0x21e)](_0x5ca5bf[_0x45684b(0x1dd)](_0x5f031a=>_0x5f031a[_0x480fb9(0x220)]));if(_0x23530e[_0x45684b(0x1e7)]!==_0x5ca5bf[_0x480fb9(0x1e7)])throw new Error('Embedding\x20'+_0x45684b(0x21b)+_0x45684b(0x219)+_0x480fb9(0x1de)+_0x5ca5bf['length']+_0x480fb9(0x230)+_0x23530e[_0x480fb9(0x1e7)]);const _0x188eda=_0x5a17de[_0x45684b(0x20e)](_0x480fb9(0x207)+'O\x20entries\x20'+_0x45684b(0x20f)+_0x480fb9(0x1e9)+'ector,\x20ind'+'exed_at)\x20V'+_0x480fb9(0x1ec)+_0x45684b(0x218)+')\x20'+(_0x45684b(0x1e6)+_0x480fb9(0x1f4)+_0x45684b(0x21c)+_0x480fb9(0x1d7)+_0x480fb9(0x1fa)+_0x480fb9(0x234)+_0x480fb9(0x206)+_0x480fb9(0x1fe))+('vector=exc'+'luded.vect'+'or,\x20indexe'+_0x45684b(0x1f3)+_0x480fb9(0x201)+'d_at')),_0x2aa50c=Date[_0x480fb9(0x213)](),_0x359a47=_0x5a17de[_0x45684b(0x200)+'n'](_0x3e9aa4=>{const _0x3a8164=_0x480fb9,_0x30bcb3=_0x45684b;for(const _0xd6386a of _0x3e9aa4)_0x188eda[_0x3a8164(0x1f6)](_0xd6386a['id'],_0xd6386a[_0x30bcb3(0x21d)],_0xd6386a[_0x30bcb3(0x220)],_0xd6386a['vector'],_0x2aa50c);});_0x359a47(_0x5ca5bf['map']((_0x39fe91,_0x4dd01a)=>({'id':_0x39fe91['id'],'source':_0x39fe91[_0x45684b(0x21d)],'text':_0x39fe91[_0x480fb9(0x220)],'vector':vectorToBlob(_0x23530e[_0x4dd01a])})));}[_0x47ca99(0x203)+_0x47ca99(0x22d)+'s'](_0x2d85ea,_0x20980f){const _0x51d69f=_0x47ca99,_0x175664=_0x2cd882;if(_0x20980f[_0x51d69f(0x1e7)]===0x1407+0x1f3*0x3+0x2e*-0x90)return;const _0x7195da=_0x2d85ea[_0x175664(0x20e)](_0x51d69f(0x211)+_0x51d69f(0x1fd)+'WHERE\x20sour'+'ce\x20=\x20?'),_0x2f9d64=_0x2d85ea[_0x51d69f(0x200)+'n'](_0x589e10=>{const _0x33e861=_0x175664;for(const _0x2cc07f of _0x589e10)_0x7195da[_0x33e861(0x1f6)](_0x2cc07f);});_0x2f9d64(_0x20980f);}async[_0x2cd882(0x1f7)](_0xec5c6c,_0x1a7be8,_0x536258,_0x154dbe){const _0x52b377=_0x47ca99,_0x587b60=_0x47ca99,_0x4ed531=Float32Array[_0x52b377(0x227)](await this[_0x52b377(0x20c)](_0x1a7be8)),_0x14a5d1=_0xec5c6c[_0x587b60(0x20e)](_0x587b60(0x215)+_0x587b60(0x1fb)+_0x587b60(0x217)+_0x52b377(0x204))[_0x52b377(0x1d6)](),_0x10422e=[];for(const _0x3262b9 of _0x14a5d1){const _0x1f982d=blobToVector(_0x3262b9[_0x587b60(0x231)]),_0x417c68=cosineSimilarity(_0x4ed531,_0x1f982d);_0x417c68>=_0x154dbe&&_0x10422e[_0x587b60(0x22a)]({'text':_0x3262b9[_0x587b60(0x220)],'source':_0x3262b9[_0x52b377(0x21d)],'score':_0x417c68});}return _0x10422e[_0x52b377(0x1d8)]((_0x348205,_0x5f05c7)=>_0x5f05c7[_0x52b377(0x1e5)]-_0x348205[_0x587b60(0x1e5)]),_0x10422e[_0x52b377(0x1d5)](-0xc61*-0x2+-0x170f+-0x1b3,_0x536258);}['countEntri'+'es'](_0x4dfd4b){const _0x286cdf=_0x47ca99,_0x57bbfa=_0x47ca99;try{const _0x5ab1a2=_0x4dfd4b[_0x286cdf(0x20e)](_0x57bbfa(0x209)+_0x57bbfa(0x22f)+_0x57bbfa(0x1ed)+'ies')[_0x57bbfa(0x210)]();return _0x5ab1a2?.['c']??-0x9a4+0x1*-0x6a7+0x104b;}catch{return-0x7*-0x2c7+-0xc*-0xf+-0x1425;}}}
@@ -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(_0x2fdc80,_0x5a062d){const _0x48bb8b=_0xf515,_0xad9917=_0xf515,_0x26f3a4=_0x2fdc80();while(!![]){try{const _0x25030b=parseInt(_0x48bb8b(0x142))/(0x1c35+-0x1eb6+0x282)+parseInt(_0x48bb8b(0x150))/(-0x1eac+0x135*-0x6+0x25ec)+parseInt(_0x48bb8b(0x139))/(-0x1192+-0xe*0x1d9+-0x2b73*-0x1)*(-parseInt(_0x48bb8b(0x11d))/(-0x319*-0x1+0x3*0x5d2+-0x148b))+parseInt(_0x48bb8b(0x17d))/(-0xe6d+-0x5*-0x44+0x2*0x68f)+parseInt(_0xad9917(0x143))/(0x1*-0x922+0x116f*-0x1+0x1a97)+parseInt(_0xad9917(0xfd))/(-0x24d1+0x1162+0x1376)*(-parseInt(_0xad9917(0x10b))/(-0x1ea8+0xdcd*-0x1+0x2c7d))+parseInt(_0x48bb8b(0xfa))/(-0x22e4+-0x14de+0x37cb)*(-parseInt(_0x48bb8b(0x17b))/(0x1*0x8f9+-0x16c3+0x49c*0x3));if(_0x25030b===_0x5a062d)break;else _0x26f3a4['push'](_0x26f3a4['shift']());}catch(_0x37162d){_0x26f3a4['push'](_0x26f3a4['shift']());}}}(_0x98f2,-0x153875*-0x1+-0x78f7*0x2d+-0x5e75b*-0x2));const _0x5a869b=(function(){let _0x31bab7=!![];return function(_0xe7b774,_0x5bfcf1){const _0x4c9f1f=_0x31bab7?function(){const _0x9f2c4f=_0xf515;if(_0x5bfcf1){const _0x3f7af1=_0x5bfcf1[_0x9f2c4f(0x193)](_0xe7b774,arguments);return _0x5bfcf1=null,_0x3f7af1;}}:function(){};return _0x31bab7=![],_0x4c9f1f;};}()),_0x246538=_0x5a869b(this,function(){const _0x177bd1=_0xf515,_0x3570d8=_0xf515;return _0x246538[_0x177bd1(0xea)]()[_0x3570d8(0x164)](_0x177bd1(0x117)+'+$')[_0x177bd1(0xea)]()['constructo'+'r'](_0x246538)[_0x177bd1(0x164)](_0x177bd1(0x117)+'+$');});_0x246538();import _0x70db66 from'fs';import _0x1fb0c4 from'path';import{createRequire}from'module';import{EMBEDDINGS_IDX,EMBEDDINGS_DB}from'../paths.js';const cjsRequire=createRequire(import.meta.url);function vectorToBlob(_0x4befb2){const _0x2894d2=_0xf515,_0x5a1771=_0xf515,_0xe954fb=new Float32Array(_0x4befb2);return Buffer[_0x2894d2(0x115)](_0xe954fb[_0x2894d2(0x158)],_0xe954fb[_0x5a1771(0x194)],_0xe954fb[_0x2894d2(0x126)]);}function _0x98f2(){const _0x3a1b19=['DhjHBNnHy3rPBW','mJuZndyZmKHxsxjtEG','BhLPBMCGCgfYCW','zMLSDgvY','icaGicaGicb2zq','BwvZicHZB3vYyW','u0vmrunuienpvq','rNjLzsb1CcbZBW','vvbeqvrfifnfva','yNvMzMvY','B3i6','ie9oigvUDhjPzq','veuGvefcteuGsq','C2XPy2u','cIaGicaGicK7cG','lcbNB3qG','zMLYC3qGC2vHCG','BgvUz3rO','CYKGvKfmvuvtia','lMjHAY1WCMuTCW','CgfYC2u','C2vHCMnO','B24GC2TPChbLza','zw50CMLLCW','CgvJDgvKia','AxrLlI4U','z2vTAw5PlwvTyG','ufjjtufswsblrq','ie5pvcbovuXmcG','yMf2ywLS','icaGifrfwfqGua','CNvU','AwvUDcbMCMvLia','zxKGicburvHuia','uKLnqvjzieTfwq','C3LUy2HYB25VDq','CYa9ie5puK1bta','zgv4igzYB20GCW','B3vYy2uGsLnptG','teWkicaGicaGkq','z2v0','ie5pvcbfweLtva','AxnbCNjHEq','zYbLBwjLzgrPBG','nJeWrfrlt1Ls','zsaGifrfwfqGua','nZq0nZy0nuPHwgXXqG','icuP','CMf0Aw9UoIbLEa','teWScIaGicaGia','C291CMnL','BguGqvbjignHBa','Bg9N','zMLSzu10Aw1LCW','B3iGCMvPBNn0yq','BM93','z3mGBwLNCMf0Aq','ierpifvqrefurq','BgWGywX2Aw4TyG','uMvUyw1LigvYCG','igvUDhjPzxmSia','y2XVC2u','BguUia','oIbIzxr0zxiTCW','yMLNAw50','Dw5SAw5Ru3LUyW','icaGicaGq1jfqq','id0GzxHJBhvKzq','yxbWBhK','yNL0zu9MzNnLDa','wsWkicaGicaGia','yNnPEMu','zwqG','tYbTzxrHicHRzq','BwTKAxjtEw5J','EsWGDMfSDwuPia','BwLNCMf0zwrgCG','z3mGBwLNCMf0zq','B3jYDxb0iefora','yw5KihnRAxbWzq','igLUzgv4lIbgAq','Aw5KzxHLzef0','ChjHz21H','zc4GvgHLigjVDa','BhmPlIbvBMrLCG','u1rtig1LDgeGka','CM91BMq','BwuGC3bHy2uGyq','ie1cifnrtgL0zq','kgLKlcbZB3vYyW','z3mGsLnptIaO','Dgv4Da','DxrMltG','oWOGicaGicbduG','rufursbuqujmrq','4P2mievTyMvKzgLU','ie1cksdIHPiGu1fm','iePtt04GAxmGyW','4PQG77IpievTyMvKzgLU','lxnOBq','y2nLzwrLzcK6','igvUDhjPzxmGka','iezst00Gzw50CG','Dg9tDhjPBMC','yNvPBgqGyMv0Da','DcbYzw5HBwuGCW','zc52ywX1zq','zwDHy3KGsLnptG','zsbLCNjVCJO','C3rHDfn5BMm','yxqGsu5uruDfuG','icaGicburvHuia','CwXPDgu','8j+tPIbnAwDYyxrPBG','AwvZx3nVDxjJzq','D2fYBG','zxmGkaOGicaGia','zgLYBMfTzq','cIaGica','mZqWnJy4BhjLB1fH','BgfZDfjLAw5Kzq','AM91CM5HBf9TBW','nJqWodvUuwHPBvy','zwn0B3iSigLUza','lxDHBa','zdOG','su5trvjuieLova','zxjYB3i','y3jHDgnOig9Uia','DwvZihDPDgGGBa','icaG4OcMBwLNCMf0','zxHLyW','zguGpsbxquW','rufmie5pvcbovq','B246ihnVDxjJzq','kd8Sid8Pie9oia','mtaXnNf2zMjwqW','ihDPBgWGCMvIDq','C2L6zq','ieLgie5pvcbfwa','rKXjq1qOA2v5kq','tMvLzcb+','icaGicaGktSkia','B3qUifvUzgvYBa','id8Pie9oienptG','tKzjtKLuwq','zNjVBq','icbPBMrLEgvKxW','kcGOlISPkYKRkq','CMvHzezPBgvtEq','vcbot1qGtLvmta','zxHPC3rZu3LUyW','y3rVCIaGicaGqG','AxrLmW','mJe1mLvouw5gyq','4PYfievTyMvKzgLU','rsbjtKrfwcbjrG','Aw1LCYaOcIaGia','vfmGzMLSzv9TDa','AwvZ','BxrPBwvFBxmGuG','te9cie5pvcbovq','CwXPDguZig5HDa','yNL0zuXLBMD0Aa','zwrKAw5NltaWmq','Dg9gAxHLza','qM90ignVBNrPBG','icaGicbduKvbva','B21kC29U','zxHLzf9HDcKGvG','C291CMnLicaGia','ie1clIa','tK9uie5vteWScG','icaGAwqGicaGia','Bw9KzwW','Aw5JDxiGr29VzW','igjLihjLBMfTzq','khrOAxmGBwf5ia','cIaGicaGicaGAW','zsWGBxrPBwvFBq','ie1ciePtt04G4OAs','zw5HBwvKihrVia','mJe5runRv2Ts','icaGihrLEhqGia','uYbPzhHFzw50CG','ue9tsvrjvKvFsq','pYWGpYWGpYWGpW','DMvJDg9Y','BwvZC2fNzq','yMv0DgvYlxnXBa','EwLUzYbLCNjVCG','mtm3mZm5nMjQswjmDq','oteWmtG4ANfjwfDf','ChjLCgfYzq','AwXKihrOzsbPBG','B3vYy2uPierpia','ignVDwXKig5VDa','yMfZzw5HBwu','zgLZAYbZCgfJzq','B3jYDxb0iokaLcbY','C3rHDgzZu3LUyW','rw50CNKTy291BG','ihvUyxzHAwXHyG','lM10Aw1Lx21Z'];_0x98f2=function(){return _0x3a1b19;};return _0x98f2();}export function shouldMigrateEmbeddingsToSqlite(){const _0x427497=_0xf515,_0x47be94=_0xf515;return _0x70db66[_0x427497(0x11a)](EMBEDDINGS_IDX)&&!_0x70db66[_0x47be94(0x11a)](EMBEDDINGS_DB);}function freeBytesOnVolume(_0x1b4106){const _0x1a2f91=_0xf515,_0x2bafdd=_0xf515;try{const _0xbde985=_0x70db66;if(typeof _0xbde985[_0x1a2f91(0x14b)]!=='function')return Number[_0x1a2f91(0x13c)+_0x2bafdd(0x114)];const _0x6ef54a=_0xbde985['statfsSync'](_0x1b4106),_0x35bea6=typeof _0x6ef54a[_0x1a2f91(0x16c)]===_0x1a2f91(0x18f)?Number(_0x6ef54a[_0x2bafdd(0x16c)]):_0x6ef54a[_0x2bafdd(0x16c)],_0x3adb12=typeof _0x6ef54a[_0x2bafdd(0x196)]===_0x1a2f91(0x18f)?Number(_0x6ef54a[_0x2bafdd(0x196)]):_0x6ef54a[_0x2bafdd(0x196)];return _0x35bea6*_0x3adb12;}catch{return Number[_0x1a2f91(0x13c)+_0x2bafdd(0x114)];}}function _0xf515(_0x31adb3,_0x251e9b){_0x31adb3=_0x31adb3-(-0x5*-0x7c2+-0x3ee*0x1+-0x2209);const _0x2dd204=_0x98f2();let _0x39261a=_0x2dd204[_0x31adb3];if(_0xf515['IKpoTU']===undefined){var _0x8483f5=function(_0xd75217){const _0x23b198='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x25c827='',_0xe1cb38='',_0x5c2900=_0x25c827+_0x8483f5;for(let _0x192f1b=-0x2*0x12f1+-0x1fc4+0x45a6,_0x121e67,_0x589466,_0x26cfd7=-0xe5e+0x19d6+0xb78*-0x1;_0x589466=_0xd75217['charAt'](_0x26cfd7++);~_0x589466&&(_0x121e67=_0x192f1b%(0xd89+0x165f+-0x11f2*0x2)?_0x121e67*(0x1*-0x223e+-0x5a4+-0xb*-0x3a6)+_0x589466:_0x589466,_0x192f1b++%(-0x145a+0x10f5*-0x2+-0x608*-0x9))?_0x25c827+=_0x5c2900['charCodeAt'](_0x26cfd7+(-0xad7+0x1301*-0x1+-0x6*-0x4fb))-(0x26a7*-0x1+-0x2ff*0x3+0x2fae)!==-0x18c8+-0x755*0x4+0xd87*0x4?String['fromCharCode'](0x1*0x25fb+0x257+-0x1*0x2753&_0x121e67>>(-(-0x22f3+-0x1692+0x1*0x3987)*_0x192f1b&0x863*-0x3+-0x1*0x2681+0x3fb0)):_0x192f1b:0x1*0xf7f+0x2554+-0x34d3){_0x589466=_0x23b198['indexOf'](_0x589466);}for(let _0x4232c0=0xf33+-0x1e99+0xf66,_0xffa9e4=_0x25c827['length'];_0x4232c0<_0xffa9e4;_0x4232c0++){_0xe1cb38+='%'+('00'+_0x25c827['charCodeAt'](_0x4232c0)['toString'](-0x27*-0xa8+-0x269e+-0x2*-0x68b))['slice'](-(0xd*-0x263+0x1beb*0x1+0x31e));}return decodeURIComponent(_0xe1cb38);};_0xf515['CcnPwi']=_0x8483f5,_0xf515['wRSibq']={},_0xf515['IKpoTU']=!![];}const _0x4c0091=_0x2dd204[-0x29*0x97+-0x22b5+-0x3ae4*-0x1],_0x444283=_0x31adb3+_0x4c0091,_0x17ee24=_0xf515['wRSibq'][_0x444283];if(!_0x17ee24){const _0x32acc0=function(_0x427c60){this['OafQOf']=_0x427c60,this['KnWnZO']=[-0x48b*-0x1+0x17cc+0xba*-0x27,-0x1dae+0x1*-0x4eb+0x2299,0x24b4+0x10*0x16c+0xedd*-0x4],this['NVwcvH']=function(){return'newState';},this['lCintU']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['ZuzFRF']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x32acc0['prototype']['gTLAME']=function(){const _0x1a2c61=new RegExp(this['lCintU']+this['ZuzFRF']),_0x42d583=_0x1a2c61['test'](this['NVwcvH']['toString']())?--this['KnWnZO'][0x2317*0x1+-0x219e*-0x1+-0x44b4]:--this['KnWnZO'][-0xe*0x83+-0x407*-0x3+-0x4eb*0x1];return this['UFIitN'](_0x42d583);},_0x32acc0['prototype']['UFIitN']=function(_0x2ce8b2){if(!Boolean(~_0x2ce8b2))return _0x2ce8b2;return this['Jtskua'](this['OafQOf']);},_0x32acc0['prototype']['Jtskua']=function(_0xdcd7be){for(let _0x5a849b=0x1489+0xaac+-0x1f35,_0x2aa33b=this['KnWnZO']['length'];_0x5a849b<_0x2aa33b;_0x5a849b++){this['KnWnZO']['push'](Math['round'](Math['random']())),_0x2aa33b=this['KnWnZO']['length'];}return _0xdcd7be(this['KnWnZO'][-0x9bd*-0x3+-0x1*-0x413+0x2*-0x10a5]);},new _0x32acc0(_0xf515)['gTLAME'](),_0x39261a=_0xf515['CcnPwi'](_0x39261a),_0xf515['wRSibq'][_0x444283]=_0x39261a;}else _0x39261a=_0x17ee24;return _0x39261a;}export function migrateEmbeddingsToSqlite(){const _0x47777a=_0xf515,_0x4dc358=_0xf515;if(!shouldMigrateEmbeddingsToSqlite())return null;let _0x35c1c1;try{_0x35c1c1=cjsRequire(_0x47777a(0x140)+_0x47777a(0x11c));}catch(_0x2840fb){return console['warn'](_0x47777a(0xe5)+_0x4dc358(0x187)+_0x47777a(0x165)+_0x47777a(0x18e)+_0x47777a(0x125)+'ive\x20binary'+_0x47777a(0x14d)+_0x47777a(0x18d)+(_0x47777a(0x129)+_0x47777a(0x104)+_0x47777a(0xee)+_0x4dc358(0xd3)+'x:\x20`npm\x20re'+_0x4dc358(0xeb)+'er-sqlite3'+'`\x20')+(_0x47777a(0x185)+_0x47777a(0x189)+_0x4dc358(0x112)+_0x47777a(0x141)+':'),_0x2840fb instanceof Error?_0x2840fb[_0x47777a(0x13f)]:_0x2840fb),null;}const _0x33f89f=_0x70db66[_0x4dc358(0xf0)](EMBEDDINGS_IDX)[_0x4dc358(0x10d)],_0x47ad9e=_0x1fb0c4[_0x47777a(0xf8)](EMBEDDINGS_DB);_0x70db66[_0x4dc358(0x199)](_0x47ad9e,{'recursive':!![]});const _0x475ad1=freeBytesOnVolume(_0x47ad9e),_0x119bb2=_0x33f89f*(-0xe5e+0x19d6+0x5bb*-0x2);if(_0x475ad1<_0x119bb2)return console[_0x47777a(0xf6)](_0x47777a(0xe5)+'gs\x20migrati'+_0x47777a(0x165)+':\x20insuffic'+_0x47777a(0x16f)+_0x4dc358(0x149)+'\x20on\x20'+_0x47ad9e+'.\x20'+(_0x47777a(0x110)+(_0x119bb2/(0xd89+0x165f+-0xff4*0x2)/(0x1*-0x223e+-0x5a4+-0x29*-0x112))['toFixed'](-0x145a+0x10f5*-0x2+-0x25c*-0x17)+'\x20MB,\x20have\x20'+(_0x475ad1/(-0xad7+0x1301*-0x1+-0x3*-0xb48)/(0x26a7*-0x1+-0x2ff*0x3+0x33a4))['toFixed'](-0x18c8+-0x755*0x4+0xd87*0x4)+_0x47777a(0x12e))+(_0x47777a(0x156)+_0x47777a(0xda)+'nd\x20restart'+'\x20the\x20bot\x20t'+'o\x20retry.')),null;const _0x3895db=Date[_0x47777a(0x186)]();console['log'](_0x4dc358(0xf4)+_0x47777a(0x17a)+_0x47777a(0xdd)+(_0x33f89f/(0x1*0x25fb+0x257+-0x2*0x1229)/(-0x22f3+-0x1692+0x1*0x3d85))[_0x47777a(0x128)](0x863*-0x3+-0x1*0x2681+0x3faa)+(_0x4dc358(0xe3)+_0x4dc358(0x168)));const _0x576bbc=_0x70db66[_0x47777a(0x118)+'nc'](EMBEDDINGS_IDX,_0x4dc358(0xdf));let _0x1b04d1;try{_0x1b04d1=JSON[_0x47777a(0x163)](_0x576bbc);}catch(_0x11ba60){const _0x8b44ca=EMBEDDINGS_IDX+'.broken.'+Date[_0x4dc358(0x186)]();try{_0x70db66['renameSync'](EMBEDDINGS_IDX,_0x8b44ca),console[_0x47777a(0x102)](_0x4dc358(0xe2)+'gs\x20migrati'+_0x47777a(0x109)+'\x20JSON\x20is\x20c'+_0x4dc358(0x14a)+_0x47777a(0x138)+_0x1fb0c4[_0x4dc358(0x148)](_0x8b44ca)+'\x20'+(_0x4dc358(0x19e)+_0x47777a(0xd6)+_0x47777a(0x10c)+_0x4dc358(0x145)+_0x4dc358(0x174)+_0x4dc358(0x103)+_0x4dc358(0x15f)+'ch\x20')+(_0x47777a(0x134)+_0x4dc358(0x132)+_0x47777a(0x182)+_0x47777a(0xd7)+_0x4dc358(0x151)+_0x47777a(0xef)),_0x11ba60);}catch(_0x38db4b){console[_0x4dc358(0x102)](_0x4dc358(0xe2)+_0x47777a(0x187)+_0x47777a(0x109)+_0x47777a(0xe4)+_0x4dc358(0x19d)+_0x4dc358(0x147)+_0x47777a(0x133)+'d:',_0x11ba60,_0x4dc358(0x18a)+_0x47777a(0x159),_0x38db4b);}return null;}const _0x4cd5c7=(_0x1b04d1[_0x47777a(0x166)]??[])[_0x47777a(0x152)](_0x3b2178=>Array[_0x4dc358(0x179)](_0x3b2178[_0x47777a(0x13e)])&&_0x3b2178[_0x47777a(0x13e)][_0x4dc358(0x160)]>0x1*0xf7f+0x2554+-0x34d3),_0x5e0880=new _0x35c1c1(EMBEDDINGS_DB);try{_0x5e0880[_0x4dc358(0xd5)](_0x47777a(0xfc)+_0x4dc358(0x107)),_0x5e0880[_0x47777a(0xd5)](_0x4dc358(0x172)+_0x47777a(0x173)),_0x5e0880[_0x47777a(0x106)]('\x0a\x20\x20\x20\x20\x20\x20CRE'+'ATE\x20TABLE\x20'+'IF\x20NOT\x20EXI'+_0x4dc358(0xd8)+_0x4dc358(0x135)+_0x4dc358(0x170)+_0x4dc358(0x16a)+_0x4dc358(0x195)+'\x20value\x20TEX'+_0x4dc358(0x119)+_0x47777a(0x15d)+_0x47777a(0x191)+_0x4dc358(0x15b)+'F\x20NOT\x20EXIS'+_0x4dc358(0x121)+_0x4dc358(0x120)+'\x20\x20\x20\x20\x20sourc'+_0x47777a(0x17c)+_0x4dc358(0x171)+',\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+_0x4dc358(0x123)+_0x47777a(0x108)+_0x47777a(0x176)+_0x4dc358(0xe0)+_0x4dc358(0xe1)+_0x4dc358(0x10e)+'ISTS\x20entri'+_0x47777a(0xf7)+_0x47777a(0x130)+_0x4dc358(0x16d)+_0x4dc358(0x171)+',\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+_0x47777a(0x12d)+'\x20TEXT\x20NOT\x20'+'NULL,\x0a\x20\x20\x20\x20'+_0x47777a(0x13a)+_0x4dc358(0xf2)+_0x47777a(0x12f)+_0x4dc358(0x153)+_0x4dc358(0x11b)+_0x47777a(0x124)+_0x4dc358(0x180)+_0x4dc358(0x116)+_0x4dc358(0xf1)+_0x4dc358(0x16b)+_0x47777a(0x111)+_0x4dc358(0x12a)+_0x47777a(0x11f)+_0x47777a(0x178)+_0x47777a(0x13b)+_0x4dc358(0xf5)+_0x4dc358(0x15a)+'s(source);'+_0x4dc358(0xf9));const _0x222f9c=_0x5e0880['prepare'](_0x47777a(0x101)+_0x47777a(0x198)+_0x47777a(0x19a)+'VALUES\x20(?,'+_0x4dc358(0x113)+_0x47777a(0x10f)+_0x4dc358(0x188)+'\x20SET\x20value'+_0x47777a(0x192)+_0x47777a(0xed));_0x222f9c['run'](_0x4dc358(0x131),_0x1b04d1[_0x47777a(0x131)]||_0x47777a(0x169)+_0x4dc358(0x127)),_0x222f9c[_0x47777a(0x16e)]('schemaVers'+'ion','1'),_0x222f9c[_0x47777a(0x16e)](_0x47777a(0xfb)+'x',String(_0x1b04d1[_0x4dc358(0xfb)+'x']||0xf33+-0x1e99+0xf66)),_0x222f9c[_0x47777a(0x16e)](_0x47777a(0x19b)+_0x4dc358(0x12b),String(Date[_0x47777a(0x186)]()));const _0xedc803=_0x5e0880[_0x47777a(0x144)](_0x4dc358(0x101)+'O\x20file_mti'+_0x4dc358(0x154)+_0x47777a(0x136)+_0x4dc358(0x161)+_0x47777a(0x10a)+'CONFLICT(s'+_0x4dc358(0x146)+_0x4dc358(0x157)+'\x20mtime_ms\x20'+'=\x20excluded'+_0x47777a(0x14e)),_0x494a2c=_0x5e0880[_0x4dc358(0x14f)+'n'](_0xd5594=>{const _0x1d7db2=_0x47777a;for(const [_0x36f8b7,_0x3c30ec]of _0xd5594)_0xedc803[_0x1d7db2(0x16e)](_0x36f8b7,_0x3c30ec);});_0x494a2c(Object[_0x4dc358(0x166)](_0x1b04d1[_0x47777a(0x184)]??{}));const _0x553eb1=_0x5e0880[_0x47777a(0x144)](_0x4dc358(0x101)+'O\x20entries\x20'+_0x4dc358(0xdc)+'e,\x20text,\x20v'+_0x47777a(0xfe)+_0x47777a(0x12c)+'ALUES\x20(?,\x20'+_0x47777a(0x13d)+')'),_0xecbea2=-0x27*-0xa8+-0x269e+-0x1*-0x10ee,_0x561e0d=_0x4cd5c7[_0x4dc358(0x160)];let _0x251a99=0xd*-0x263+0x1beb*0x1+0x31c;const _0x3a2106=_0x5e0880[_0x47777a(0x14f)+'n'](_0x25d0ba=>{const _0x5857eb=_0x4dc358,_0x332d4c=_0x4dc358;for(const _0xa54626 of _0x25d0ba){_0x553eb1[_0x5857eb(0x16e)](_0xa54626['id'],_0xa54626[_0x5857eb(0x181)],_0xa54626[_0x332d4c(0xde)],vectorToBlob(_0xa54626[_0x5857eb(0x13e)]),_0xa54626[_0x332d4c(0xd4)]);}});for(let _0x5760ce=-0x29*0x97+-0x22b5+-0x3ae4*-0x1;_0x5760ce<_0x561e0d;_0x5760ce+=_0xecbea2){const _0x17dc0c=_0x4cd5c7[_0x4dc358(0x15c)](_0x5760ce,_0x5760ce+_0xecbea2);_0x3a2106(_0x17dc0c),_0x251a99+=_0x17dc0c[_0x47777a(0x160)],_0x561e0d>-0x48b*-0x1+0x17cc+0x37*-0x29&&(_0x251a99===_0x561e0d||_0x251a99%(-0x1dae+0x1*-0x4eb+0x3621)===0x24b4+0x10*0x16c+0xedd*-0x4)&&console[_0x4dc358(0x183)](_0x47777a(0x105)+_0x4dc358(0x197)+_0x251a99+'\x20/\x20'+_0x561e0d+_0x4dc358(0xe8)+Math[_0x47777a(0xd9)](_0x251a99/_0x561e0d*(0x2317*0x1+-0x219e*-0x1+-0x4451))+_0x47777a(0x17e));}const _0x47453e=_0x5e0880['prepare'](_0x4dc358(0x155)+'NT(*)\x20AS\x20c'+_0x47777a(0xe9)+_0x47777a(0x122))[_0x4dc358(0x177)]()['c'];if(_0x47453e!==_0x4cd5c7[_0x47777a(0x160)])throw new Error(_0x47777a(0x14c)+'t\x20mismatch'+'\x20after\x20mig'+_0x47777a(0x17f)+_0x4dc358(0x167)+_0x4cd5c7[_0x4dc358(0x160)]+_0x4dc358(0x15e)+_0x47453e);_0x5e0880[_0x47777a(0x18c)]();const _0x45f783=EMBEDDINGS_IDX+(_0x47777a(0x162)+_0x4dc358(0xf3));try{_0x70db66['renameSync'](EMBEDDINGS_IDX,_0x45f783);}catch(_0x313b9b){console['warn']('⚠️\x20Could\x20no'+_0x4dc358(0xec)+_0x47777a(0x175)+'\x20(migratio'+'n\x20still\x20su'+_0x47777a(0xe7),_0x313b9b);}const _0x82280f=_0x70db66[_0x47777a(0xf0)](EMBEDDINGS_DB)[_0x47777a(0x10d)],_0x4ecbf7=Date[_0x4dc358(0x186)]()-_0x3895db;return console[_0x4dc358(0x183)](_0x4dc358(0x11e)+_0x4dc358(0x19c)+_0x47777a(0x100)+_0x47453e+_0x4dc358(0x18b)+(_0x33f89f/(-0xe*0x83+-0x407*-0x3+-0xeb*0x1)/(0x1489+0xaac+-0x1b35))[_0x47777a(0x128)](-0x9bd*-0x3+-0x1*-0x413+0x2*-0x10a5)+(_0x47777a(0x137)+'\x20')+(_0x82280f/(0x1a1+-0x632*0x6+-0x278b*-0x1)/(-0x1377+-0x1c0c+0x3383))['toFixed'](0x2470+-0x5*0x3b0+-0xc0*0x18)+(_0x4dc358(0xdb)+'\x20in\x20')+_0x4ecbf7+'\x20ms'),{'entries':_0x47453e,'sourceMb':_0x33f89f/(0x272+-0x1*-0xf67+-0xdd9)/(-0x2270+-0x423*0x1+0x4bb*0x9),'targetMb':_0x82280f/(-0xd*0xa3+0x1d27+0x1b0*-0xa)/(-0x1517+-0x66*0xd+-0x7b*-0x3f)};}catch(_0x3146d9){_0x5e0880[_0x4dc358(0x18c)]();try{_0x70db66[_0x47777a(0x190)](EMBEDDINGS_DB);for(const _0x31f524 of[_0x4dc358(0xff),_0x4dc358(0xe6)]){const _0x2fdb25=''+EMBEDDINGS_DB+_0x31f524;if(_0x70db66['existsSync'](_0x2fdb25))_0x70db66['unlinkSync'](_0x2fdb25);}}catch{}throw _0x3146d9;}}
@@ -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(_0x21cbee,_0x119cdc){var _0x2a1bd3=_0x475a,_0x49b687=_0x475a,_0x12b43c=_0x21cbee();while(!![]){try{var _0x57b113=-parseInt(_0x2a1bd3(0x133))/(0x901+-0x1*0x491+0x5*-0xe3)+parseInt(_0x2a1bd3(0x131))/(-0x15*0x7f+0x1c3a+-0x11cd)*(parseInt(_0x49b687(0x12e))/(-0x14b*0x1+0x19e0+0x172*-0x11))+parseInt(_0x2a1bd3(0x12d))/(0x1924*-0x1+-0x1*-0x2095+-0x76d)*(parseInt(_0x49b687(0x12f))/(-0x2*-0xa81+-0x685*-0x2+-0x2207))+-parseInt(_0x2a1bd3(0x137))/(-0x9d1+-0x1c57*-0x1+-0x4a*0x40)*(-parseInt(_0x49b687(0x13b))/(-0x7ab+0x606+0xd6*0x2))+-parseInt(_0x49b687(0x130))/(-0xd7f+0x1a67+-0xce0)*(-parseInt(_0x2a1bd3(0x135))/(0xba3+-0x19a0+-0xa*-0x167))+-parseInt(_0x49b687(0x13a))/(0x17b*0x15+-0x9c4+-0x1*0x1549)*(-parseInt(_0x49b687(0x136))/(0x5d*-0x51+-0x1101+-0x1*-0x2e79))+parseInt(_0x49b687(0x12b))/(-0xbe7+-0x1*-0x2275+-0x1682*0x1)*(-parseInt(_0x49b687(0x132))/(-0x1*0x1bb6+-0x26+0x1be9));if(_0x57b113===_0x119cdc)break;else _0x12b43c['push'](_0x12b43c['shift']());}catch(_0x94f9a8){_0x12b43c['push'](_0x12b43c['shift']());}}}(_0x27e6,-0x3*-0x1e911+0xc97e2+-0x86251));var _0x518699=(function(){var _0x1574e8=!![];return function(_0x4b05de,_0x51a951){var _0x920100=_0x1574e8?function(){var _0x3b3a1d=_0x475a;if(_0x51a951){var _0x4f1901=_0x51a951[_0x3b3a1d(0x134)](_0x4b05de,arguments);return _0x51a951=null,_0x4f1901;}}:function(){};return _0x1574e8=![],_0x920100;};}()),_0x4db846=_0x518699(this,function(){var _0x209b40=_0x475a,_0x13185b=_0x475a;return _0x4db846[_0x209b40(0x138)]()[_0x13185b(0x139)]('(((.+)+)+)'+'+$')[_0x13185b(0x138)]()[_0x13185b(0x12c)+'r'](_0x4db846)[_0x13185b(0x139)](_0x209b40(0x12a)+'+$');});_0x4db846();function _0x475a(_0x3709b8,_0x2af414){_0x3709b8=_0x3709b8-(-0x162d+0x19b*0x5+0xf50);var _0x2227a5=_0x27e6();var _0x4124ab=_0x2227a5[_0x3709b8];if(_0x475a['MLKiuK']===undefined){var _0x537ec5=function(_0x26523c){var _0x1dedb9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x3de42f='',_0x106a08='',_0x1cd84f=_0x3de42f+_0x537ec5;for(var _0x1aa548=-0x236b+0x20ca+0x2a1*0x1,_0x550225,_0x1b1ea2,_0x55a23a=0x185*0x17+-0x157e+0x5*-0x2b1;_0x1b1ea2=_0x26523c['charAt'](_0x55a23a++);~_0x1b1ea2&&(_0x550225=_0x1aa548%(0x1*-0xe76+0x1*0x443+0xa37)?_0x550225*(0x5b*0x6c+-0xa0*-0x4+-0x9*0x484)+_0x1b1ea2:_0x1b1ea2,_0x1aa548++%(0x5*0x6c4+0xf*-0x110+-0xd*0x160))?_0x3de42f+=_0x1cd84f['charCodeAt'](_0x55a23a+(-0x1114+0x1d*0x13f+-0x1305))-(-0x3e4+0x1*0xe2a+0x5*-0x20c)!==-0x734+0x1b29+-0x1*0x13f5?String['fromCharCode'](0xf67+-0x1e8f+0x1027&_0x550225>>(-(0x39+-0x179f+0x1c*0xd6)*_0x1aa548&-0x12c4+0xd23+0x1*0x5a7)):_0x1aa548:0x61*-0x8+0x4af*-0x7+0x23d1){_0x1b1ea2=_0x1dedb9['indexOf'](_0x1b1ea2);}for(var _0x23c4c1=-0xcbb*0x1+0x5eb*-0x4+0x2467,_0x330ca7=_0x3de42f['length'];_0x23c4c1<_0x330ca7;_0x23c4c1++){_0x106a08+='%'+('00'+_0x3de42f['charCodeAt'](_0x23c4c1)['toString'](-0xfa9+0x3*0x647+0x2*-0x18e))['slice'](-(-0x8*0x43+0x1000*0x2+-0x1de6));}return decodeURIComponent(_0x106a08);};_0x475a['QhhnsF']=_0x537ec5,_0x475a['DYeUkh']={},_0x475a['MLKiuK']=!![];}var _0x1f3749=_0x2227a5[-0x11*-0x7f+0x4*-0x8c7+0x1aad],_0x4fe978=_0x3709b8+_0x1f3749,_0x2f1d2b=_0x475a['DYeUkh'][_0x4fe978];if(!_0x2f1d2b){var _0x4d3624=function(_0x227f19){this['QHhqlZ']=_0x227f19,this['IcxmFJ']=[0x233d+-0x5*-0x688+-0x43e4,0x3*0x8cb+-0x1a7+0x279*-0xa,-0x133e+-0x215+0x1*0x1553],this['QzKsLK']=function(){return'newState';},this['PhmFWN']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['QJEHPI']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4d3624['prototype']['sPsHTH']=function(){var _0x43e0b8=new RegExp(this['PhmFWN']+this['QJEHPI']),_0x1f1a20=_0x43e0b8['test'](this['QzKsLK']['toString']())?--this['IcxmFJ'][0x103*-0x15+-0x14ad+0x1*0x29ed]:--this['IcxmFJ'][0x2383+0xf7f+0x2*-0x1981];return this['MqBvHE'](_0x1f1a20);},_0x4d3624['prototype']['MqBvHE']=function(_0xbc589c){if(!Boolean(~_0xbc589c))return _0xbc589c;return this['JyjcaQ'](this['QHhqlZ']);},_0x4d3624['prototype']['JyjcaQ']=function(_0x1aef16){for(var _0x31ffe0=-0xe5*-0x2+-0xe92+0xcc8,_0x490ecb=this['IcxmFJ']['length'];_0x31ffe0<_0x490ecb;_0x31ffe0++){this['IcxmFJ']['push'](Math['round'](Math['random']())),_0x490ecb=this['IcxmFJ']['length'];}return _0x1aef16(this['IcxmFJ'][-0x1c57*-0x1+-0x185*0x8+-0x102f]);},new _0x4d3624(_0x475a)['sPsHTH'](),_0x4124ab=_0x475a['QhhnsF'](_0x4124ab),_0x475a['DYeUkh'][_0x4fe978]=_0x4124ab;}else _0x4124ab=_0x2f1d2b;return _0x4124ab;}function _0x27e6(){var _0x625992=['C2vHCMnO','nJmXmhbnBKTltG','n25ItKn4zq','kcGOlISPkYKRkq','mtmYv3Lgy1DW','y29UC3rYDwn0BW','mJbtDMHvEuS','ndi2mZG3B1bcquD2','nJC5odG1zNz1BKfR','mZq0u1byvxPY','mM1rswj4sG','mtCXmtC2mLjeCfHwAW','ndGYmJGXteDrDw9z','yxbWBhK','mJq0mdCXA0LLtvDX','otqYn0D5vLjUtq','mZe5ntqYEgTcsM5j','Dg9tDhjPBMC'];_0x27e6=function(){return _0x625992;};return _0x27e6();}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(_0x1dcce9,_0x4d070a){const _0x158198=_0x1956,_0x5ce96a=_0x1956,_0x225141=_0x1dcce9();while(!![]){try{const _0x4207b2=-parseInt(_0x158198(0x92))/(0x474+-0x21d9*0x1+0xeb3*0x2)*(parseInt(_0x5ce96a(0xa0))/(-0x2*0x79f+0x1*0xbc6+0x2*0x1bd))+-parseInt(_0x5ce96a(0x9f))/(0xbca+0x1*0x1a46+-0x260d)+parseInt(_0x5ce96a(0x8a))/(0x1b66+-0x1*0x1b83+0x21)*(parseInt(_0x5ce96a(0x91))/(0x1*-0x1721+-0x1*-0x1e6a+0x174*-0x5))+parseInt(_0x158198(0x8d))/(-0x45*-0x71+-0x687+0x5a*-0x44)+parseInt(_0x5ce96a(0x9d))/(0x2558+0x1772+0x131*-0x33)+-parseInt(_0x158198(0x90))/(0x1960+-0x3*-0x89c+-0x332c)+-parseInt(_0x158198(0xa1))/(-0x250b+0x536+0xfef*0x2)*(-parseInt(_0x5ce96a(0x97))/(-0x7ae*-0x1+-0xded+-0x649*-0x1));if(_0x4207b2===_0x4d070a)break;else _0x225141['push'](_0x225141['shift']());}catch(_0x40a2eb){_0x225141['push'](_0x225141['shift']());}}}(_0x5d62,0x31186*-0x4+0x65adb*-0x2+0x1facde));const _0xb51320=(function(){let _0x427afa=!![];return function(_0x22af7e,_0x21af68){const _0x2ea79f=_0x427afa?function(){const _0x25bea9=_0x1956;if(_0x21af68){const _0x302c3b=_0x21af68[_0x25bea9(0x96)](_0x22af7e,arguments);return _0x21af68=null,_0x302c3b;}}:function(){};return _0x427afa=![],_0x2ea79f;};}()),_0x185113=_0xb51320(this,function(){const _0x37665c=_0x1956,_0x4ac392=_0x1956;return _0x185113['toString']()[_0x37665c(0x8b)]('(((.+)+)+)'+'+$')[_0x37665c(0x95)]()['constructo'+'r'](_0x185113)[_0x37665c(0x8b)]('(((.+)+)+)'+'+$');});function _0x1956(_0x5d43f2,_0x4c4e2b){_0x5d43f2=_0x5d43f2-(-0xa*0x167+0x1a24+-0x2*0x5cb);const _0x17f0c7=_0x5d62();let _0xd2820f=_0x17f0c7[_0x5d43f2];if(_0x1956['ywTHQF']===undefined){var _0x586481=function(_0x2d8bf0){const _0x3a3c7c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2a809f='',_0xacb39e='',_0x27a18a=_0x2a809f+_0x586481;for(let _0x360c43=-0x1*-0x126d+-0xe0*0x2+0x58f*-0x3,_0x13b428,_0x29c971,_0x463903=-0x182b+-0x5*-0x24d+0xcaa;_0x29c971=_0x2d8bf0['charAt'](_0x463903++);~_0x29c971&&(_0x13b428=_0x360c43%(-0x2242+-0x1*0x25f5+0x29*0x1c3)?_0x13b428*(-0xaa7+-0xb79*0x1+0x1660)+_0x29c971:_0x29c971,_0x360c43++%(0x1ab5+-0x7a*-0x2+0x937*-0x3))?_0x2a809f+=_0x27a18a['charCodeAt'](_0x463903+(-0x1614+-0x9ad+0x1*0x1fcb))-(-0x1*-0x2a2+-0x24e2+0x72*0x4d)!==-0x127+-0x24b*0xf+-0x1c7*-0x14?String['fromCharCode'](-0x1*0x23cd+0x195b*-0x1+0x3e27&_0x13b428>>(-(-0x1822+-0xe5e+0x2682)*_0x360c43&0x31c+0x1b9*0xa+-0x410*0x5)):_0x360c43:0x1*-0xa0c+0x21d+0x7ef){_0x29c971=_0x3a3c7c['indexOf'](_0x29c971);}for(let _0x4eb8d0=0x1*0x1435+-0xa*0x24f+0x2e1,_0x390fa9=_0x2a809f['length'];_0x4eb8d0<_0x390fa9;_0x4eb8d0++){_0xacb39e+='%'+('00'+_0x2a809f['charCodeAt'](_0x4eb8d0)['toString'](-0x1682+0xdc4+0x7*0x142))['slice'](-(0x50*-0x32+-0x1*-0x1b2f+-0x1*0xb8d));}return decodeURIComponent(_0xacb39e);};_0x1956['UqJgmh']=_0x586481,_0x1956['RjhDub']={},_0x1956['ywTHQF']=!![];}const _0x502a31=_0x17f0c7[0x3da*0x4+0x7b*-0xf+-0x833],_0x4ea89b=_0x5d43f2+_0x502a31,_0x4f3664=_0x1956['RjhDub'][_0x4ea89b];if(!_0x4f3664){const _0x1eb0e9=function(_0x34c8a0){this['VprDMs']=_0x34c8a0,this['jwXyqS']=[0x1*-0x395+0x1*0xb5a+-0x7c4,-0x1818+0x6e3*0x5+-0xa57,0xbc6+0x2*0xa58+0x3*-0xad2],this['NpPkdn']=function(){return'newState';},this['cgJcvo']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['YIchkM']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1eb0e9['prototype']['PhIJbO']=function(){const _0x6fa190=new RegExp(this['cgJcvo']+this['YIchkM']),_0xcd07b9=_0x6fa190['test'](this['NpPkdn']['toString']())?--this['jwXyqS'][0xbca+0x1*0x1a46+-0x260f]:--this['jwXyqS'][0x1b66+-0x1*0x1b83+0x1d];return this['uZkAqv'](_0xcd07b9);},_0x1eb0e9['prototype']['uZkAqv']=function(_0x483f63){if(!Boolean(~_0x483f63))return _0x483f63;return this['JtdsHm'](this['VprDMs']);},_0x1eb0e9['prototype']['JtdsHm']=function(_0x165a93){for(let _0x3f654c=0x1*-0x1721+-0x1*-0x1e6a+0x749*-0x1,_0x268ae1=this['jwXyqS']['length'];_0x3f654c<_0x268ae1;_0x3f654c++){this['jwXyqS']['push'](Math['round'](Math['random']())),_0x268ae1=this['jwXyqS']['length'];}return _0x165a93(this['jwXyqS'][-0x45*-0x71+-0x687+0x3fd*-0x6]);},new _0x1eb0e9(_0x1956)['PhIJbO'](),_0xd2820f=_0x1956['UqJgmh'](_0xd2820f),_0x1956['RjhDub'][_0x4ea89b]=_0xd2820f;}else _0xd2820f=_0x4f3664;return _0xd2820f;}function _0x5d62(){const _0x38626e=['y3rLCNm','DxrMltG','zxHPC3rZu3LUyW','ndeZnZu2CM5cr3bt','ps4QcJ8','mJe4ndy0mNbVq0X3ta','mti5otHzwMHQCxy','mte3mJC5odflDKjwvfe','DgvZDa','B250ywLUig5LDW','C3bSAxq','C2XPy2u','mZi2mfvzy3rcwa','C2vHCMnO','CMvWBgfJzq','mtaYndm2oeveCMfSsG','Aw5JBhvKzxm','C3rHCNrZv2L0Aa','nJyYndy4ofvorxLlCq','mZK5mer3CK5Rra','mJLwz2nQsNK','CMvHzezPBgvtEq','zw52ihzHBhvLia','Dg9tDhjPBMC','yxbWBhK','mtbLEeHzrLC','BgLUzsbJAgfYyq','DhjPBq'];_0x5d62=function(){return _0x38626e;};return _0x5d62();}_0x185113();import _0x37de59 from'fs';import{ENV_FILE}from'../paths.js';import{writeSecure}from'./file-permissions.js';export function readEnv(){const _0x48e6c1=_0x1956,_0x4d4bb6=_0x1956;if(!_0x37de59[_0x48e6c1(0x9c)](ENV_FILE))return{};const _0x3a7e8e=_0x37de59[_0x4d4bb6(0x93)+'nc'](ENV_FILE,_0x4d4bb6(0x9b))[_0x48e6c1(0x88)]('\x0a'),_0x20ff54={};for(const _0x5048a9 of _0x3a7e8e){if(_0x5048a9[_0x48e6c1(0x8f)]('#')||!_0x5048a9[_0x4d4bb6(0x8e)]('='))continue;const _0x30d9f4=_0x5048a9['indexOf']('=');_0x20ff54[_0x5048a9[_0x4d4bb6(0x89)](0x207e+-0x3b*-0x7b+-0x5*0xc2b,_0x30d9f4)[_0x48e6c1(0x99)]()]=_0x5048a9[_0x48e6c1(0x89)](_0x30d9f4+(-0x1670+-0x2242+-0x1*-0x38b3))[_0x4d4bb6(0x99)]();}return _0x20ff54;}export function writeEnvVar(_0x3b393e,_0x4b38c4){const _0x52522e=_0x1956,_0x2a2c5d=_0x1956;if(/[\n\r]/[_0x52522e(0xa2)](_0x4b38c4))throw new Error(_0x52522e(0x94)+'must\x20not\x20c'+_0x2a2c5d(0xa3)+_0x2a2c5d(0x98)+_0x52522e(0x9a));let _0xad6c51=_0x37de59['existsSync'](ENV_FILE)?_0x37de59[_0x52522e(0x93)+'nc'](ENV_FILE,_0x52522e(0x9b)):'';const _0x32c096=new RegExp('^'+_0x3b393e+'=.*$','m');_0x32c096['test'](_0xad6c51)?_0xad6c51=_0xad6c51[_0x2a2c5d(0x8c)](_0x32c096,_0x3b393e+'='+_0x4b38c4):_0xad6c51=_0xad6c51['trimEnd']()+('\x0a'+_0x3b393e+'='+_0x4b38c4+'\x0a'),writeSecure(ENV_FILE,_0xad6c51);}export function removeEnvVar(_0x58258c){const _0x549459=_0x1956,_0x1d6bf1=_0x1956;if(!_0x37de59[_0x549459(0x9c)](ENV_FILE))return;let _0x14be0d=_0x37de59[_0x549459(0x93)+'nc'](ENV_FILE,_0x549459(0x9b));_0x14be0d=_0x14be0d[_0x1d6bf1(0x8c)](new RegExp('^'+_0x58258c+_0x1d6bf1(0x9e),'m'),''),writeSecure(ENV_FILE,_0x14be0d);}