codevault 1.6.0 → 1.7.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 (301) hide show
  1. package/dist/chunking/file-grouper.d.ts +39 -0
  2. package/dist/chunking/file-grouper.d.ts.map +1 -0
  3. package/dist/chunking/file-grouper.js +164 -0
  4. package/dist/chunking/file-grouper.js.map +1 -0
  5. package/dist/chunking/semantic-chunker.d.ts +37 -0
  6. package/dist/chunking/semantic-chunker.d.ts.map +1 -0
  7. package/dist/chunking/semantic-chunker.js +157 -0
  8. package/dist/chunking/semantic-chunker.js.map +1 -0
  9. package/dist/chunking/token-counter.d.ts +28 -0
  10. package/dist/chunking/token-counter.d.ts.map +1 -0
  11. package/dist/chunking/token-counter.js +178 -0
  12. package/dist/chunking/token-counter.js.map +1 -0
  13. package/dist/cli/commands/ask-cmd.d.ts +3 -0
  14. package/dist/cli/commands/ask-cmd.d.ts.map +1 -0
  15. package/dist/cli/commands/ask-cmd.js +130 -0
  16. package/dist/cli/commands/ask-cmd.js.map +1 -0
  17. package/dist/cli/commands/chat-cmd.d.ts +3 -0
  18. package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
  19. package/dist/cli/commands/chat-cmd.js +194 -0
  20. package/dist/cli/commands/chat-cmd.js.map +1 -0
  21. package/dist/cli/commands/config-cmd.d.ts +3 -0
  22. package/dist/cli/commands/config-cmd.d.ts.map +1 -0
  23. package/dist/cli/commands/config-cmd.js +245 -0
  24. package/dist/cli/commands/config-cmd.js.map +1 -0
  25. package/dist/cli/commands/context.d.ts +3 -0
  26. package/dist/cli/commands/context.d.ts.map +1 -0
  27. package/dist/cli/commands/context.js +98 -0
  28. package/dist/cli/commands/context.js.map +1 -0
  29. package/dist/cli/commands/interactive-config.d.ts +2 -0
  30. package/dist/cli/commands/interactive-config.d.ts.map +1 -0
  31. package/dist/cli/commands/interactive-config.js +274 -0
  32. package/dist/cli/commands/interactive-config.js.map +1 -0
  33. package/dist/cli.d.ts +3 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +401 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/codemap/io.d.ts +6 -0
  38. package/dist/codemap/io.d.ts.map +1 -0
  39. package/dist/codemap/io.js +46 -0
  40. package/dist/codemap/io.js.map +1 -0
  41. package/dist/config/apply-env.d.ts +23 -0
  42. package/dist/config/apply-env.d.ts.map +1 -0
  43. package/dist/config/apply-env.js +89 -0
  44. package/dist/config/apply-env.js.map +1 -0
  45. package/dist/config/constants.d.ts +326 -0
  46. package/dist/config/constants.d.ts.map +1 -0
  47. package/dist/config/constants.js +214 -0
  48. package/dist/config/constants.js.map +1 -0
  49. package/dist/config/loader.d.ts +57 -0
  50. package/dist/config/loader.d.ts.map +1 -0
  51. package/dist/config/loader.js +287 -0
  52. package/dist/config/loader.js.map +1 -0
  53. package/dist/config/resolver.d.ts +30 -0
  54. package/dist/config/resolver.d.ts.map +1 -0
  55. package/dist/config/resolver.js +29 -0
  56. package/dist/config/resolver.js.map +1 -0
  57. package/dist/config/types.d.ts +46 -0
  58. package/dist/config/types.d.ts.map +1 -0
  59. package/dist/config/types.js +2 -0
  60. package/dist/config/types.js.map +1 -0
  61. package/dist/context/packs.d.ts +33 -0
  62. package/dist/context/packs.d.ts.map +1 -0
  63. package/dist/context/packs.js +180 -0
  64. package/dist/context/packs.js.map +1 -0
  65. package/dist/core/IndexerEngine.d.ts +24 -0
  66. package/dist/core/IndexerEngine.d.ts.map +1 -0
  67. package/dist/core/IndexerEngine.js +372 -0
  68. package/dist/core/IndexerEngine.js.map +1 -0
  69. package/dist/core/SearchService.d.ts +25 -0
  70. package/dist/core/SearchService.d.ts.map +1 -0
  71. package/dist/core/SearchService.js +455 -0
  72. package/dist/core/SearchService.js.map +1 -0
  73. package/dist/core/batch-indexer.d.ts +56 -0
  74. package/dist/core/batch-indexer.d.ts.map +1 -0
  75. package/dist/core/batch-indexer.js +192 -0
  76. package/dist/core/batch-indexer.js.map +1 -0
  77. package/dist/core/indexer.d.ts +3 -0
  78. package/dist/core/indexer.d.ts.map +1 -0
  79. package/dist/core/indexer.js +6 -0
  80. package/dist/core/indexer.js.map +1 -0
  81. package/dist/core/indexing/chunk-pipeline.d.ts +39 -0
  82. package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -0
  83. package/dist/core/indexing/chunk-pipeline.js +210 -0
  84. package/dist/core/indexing/chunk-pipeline.js.map +1 -0
  85. package/dist/core/indexing/file-scanner.d.ts +11 -0
  86. package/dist/core/indexing/file-scanner.d.ts.map +1 -0
  87. package/dist/core/indexing/file-scanner.js +49 -0
  88. package/dist/core/indexing/file-scanner.js.map +1 -0
  89. package/dist/core/metadata.d.ts +19 -0
  90. package/dist/core/metadata.d.ts.map +1 -0
  91. package/dist/core/metadata.js +161 -0
  92. package/dist/core/metadata.js.map +1 -0
  93. package/dist/core/search.d.ts +7 -0
  94. package/dist/core/search.d.ts.map +1 -0
  95. package/dist/core/search.js +16 -0
  96. package/dist/core/search.js.map +1 -0
  97. package/dist/core/symbol-extractor.d.ts +3 -0
  98. package/dist/core/symbol-extractor.d.ts.map +1 -0
  99. package/dist/core/symbol-extractor.js +78 -0
  100. package/dist/core/symbol-extractor.js.map +1 -0
  101. package/dist/core/types.d.ts +104 -0
  102. package/dist/core/types.d.ts.map +1 -0
  103. package/dist/core/types.js +2 -0
  104. package/dist/core/types.js.map +1 -0
  105. package/dist/database/db.d.ts +101 -0
  106. package/dist/database/db.d.ts.map +1 -0
  107. package/dist/database/db.js +326 -0
  108. package/dist/database/db.js.map +1 -0
  109. package/dist/indexer/merkle.d.ts +13 -0
  110. package/dist/indexer/merkle.d.ts.map +1 -0
  111. package/dist/indexer/merkle.js +86 -0
  112. package/dist/indexer/merkle.js.map +1 -0
  113. package/dist/indexer/update.d.ts +19 -0
  114. package/dist/indexer/update.d.ts.map +1 -0
  115. package/dist/indexer/update.js +40 -0
  116. package/dist/indexer/update.js.map +1 -0
  117. package/dist/indexer/watch.d.ts +21 -0
  118. package/dist/indexer/watch.d.ts.map +1 -0
  119. package/dist/indexer/watch.js +224 -0
  120. package/dist/indexer/watch.js.map +1 -0
  121. package/dist/languages/rules.d.ts +11 -0
  122. package/dist/languages/rules.d.ts.map +1 -0
  123. package/dist/languages/rules.js +371 -0
  124. package/dist/languages/rules.js.map +1 -0
  125. package/dist/languages/tree-sitter-loader.d.ts +27 -0
  126. package/dist/languages/tree-sitter-loader.d.ts.map +1 -0
  127. package/dist/languages/tree-sitter-loader.js +76 -0
  128. package/dist/languages/tree-sitter-loader.js.map +1 -0
  129. package/dist/mcp/handlers/context.d.ts +15 -0
  130. package/dist/mcp/handlers/context.d.ts.map +1 -0
  131. package/dist/mcp/handlers/context.js +31 -0
  132. package/dist/mcp/handlers/context.js.map +1 -0
  133. package/dist/mcp/handlers/index.d.ts +5 -0
  134. package/dist/mcp/handlers/index.d.ts.map +1 -0
  135. package/dist/mcp/handlers/index.js +5 -0
  136. package/dist/mcp/handlers/index.js.map +1 -0
  137. package/dist/mcp/handlers/project.d.ts +41 -0
  138. package/dist/mcp/handlers/project.d.ts.map +1 -0
  139. package/dist/mcp/handlers/project.js +76 -0
  140. package/dist/mcp/handlers/project.js.map +1 -0
  141. package/dist/mcp/handlers/search.d.ts +27 -0
  142. package/dist/mcp/handlers/search.d.ts.map +1 -0
  143. package/dist/mcp/handlers/search.js +108 -0
  144. package/dist/mcp/handlers/search.js.map +1 -0
  145. package/dist/mcp/handlers/synthesis.d.ts +15 -0
  146. package/dist/mcp/handlers/synthesis.d.ts.map +1 -0
  147. package/dist/mcp/handlers/synthesis.js +58 -0
  148. package/dist/mcp/handlers/synthesis.js.map +1 -0
  149. package/dist/mcp/schemas.d.ts +166 -0
  150. package/dist/mcp/schemas.d.ts.map +1 -0
  151. package/dist/mcp/schemas.js +159 -0
  152. package/dist/mcp/schemas.js.map +1 -0
  153. package/dist/mcp/tools/ask-codebase.d.ts +85 -0
  154. package/dist/mcp/tools/ask-codebase.d.ts.map +1 -0
  155. package/dist/mcp/tools/ask-codebase.js +125 -0
  156. package/dist/mcp/tools/ask-codebase.js.map +1 -0
  157. package/dist/mcp/tools/use-context-pack.d.ts +57 -0
  158. package/dist/mcp/tools/use-context-pack.d.ts.map +1 -0
  159. package/dist/mcp/tools/use-context-pack.js +91 -0
  160. package/dist/mcp/tools/use-context-pack.js.map +1 -0
  161. package/dist/mcp-server.d.ts +13 -0
  162. package/dist/mcp-server.d.ts.map +1 -0
  163. package/dist/mcp-server.js +263 -0
  164. package/dist/mcp-server.js.map +1 -0
  165. package/dist/providers/base.d.ts +39 -0
  166. package/dist/providers/base.d.ts.map +1 -0
  167. package/dist/providers/base.js +198 -0
  168. package/dist/providers/base.js.map +1 -0
  169. package/dist/providers/chat-llm.d.ts +35 -0
  170. package/dist/providers/chat-llm.d.ts.map +1 -0
  171. package/dist/providers/chat-llm.js +98 -0
  172. package/dist/providers/chat-llm.js.map +1 -0
  173. package/dist/providers/index.d.ts +6 -0
  174. package/dist/providers/index.d.ts.map +1 -0
  175. package/dist/providers/index.js +12 -0
  176. package/dist/providers/index.js.map +1 -0
  177. package/dist/providers/openai.d.ts +18 -0
  178. package/dist/providers/openai.d.ts.map +1 -0
  179. package/dist/providers/openai.js +132 -0
  180. package/dist/providers/openai.js.map +1 -0
  181. package/dist/providers/token-counter.d.ts +2 -0
  182. package/dist/providers/token-counter.d.ts.map +1 -0
  183. package/dist/providers/token-counter.js +18 -0
  184. package/dist/providers/token-counter.js.map +1 -0
  185. package/dist/ranking/api-reranker.d.ts +18 -0
  186. package/dist/ranking/api-reranker.d.ts.map +1 -0
  187. package/dist/ranking/api-reranker.js +137 -0
  188. package/dist/ranking/api-reranker.js.map +1 -0
  189. package/dist/ranking/symbol-boost.d.ts +15 -0
  190. package/dist/ranking/symbol-boost.d.ts.map +1 -0
  191. package/dist/ranking/symbol-boost.js +175 -0
  192. package/dist/ranking/symbol-boost.js.map +1 -0
  193. package/dist/search/bm25.d.ts +17 -0
  194. package/dist/search/bm25.d.ts.map +1 -0
  195. package/dist/search/bm25.js +56 -0
  196. package/dist/search/bm25.js.map +1 -0
  197. package/dist/search/hybrid.d.ts +21 -0
  198. package/dist/search/hybrid.d.ts.map +1 -0
  199. package/dist/search/hybrid.js +50 -0
  200. package/dist/search/hybrid.js.map +1 -0
  201. package/dist/search/scope.d.ts +5 -0
  202. package/dist/search/scope.d.ts.map +1 -0
  203. package/dist/search/scope.js +107 -0
  204. package/dist/search/scope.js.map +1 -0
  205. package/dist/storage/encrypted-chunks.d.ts +40 -0
  206. package/dist/storage/encrypted-chunks.d.ts.map +1 -0
  207. package/dist/storage/encrypted-chunks.js +238 -0
  208. package/dist/storage/encrypted-chunks.js.map +1 -0
  209. package/dist/symbols/extract.d.ts +15 -0
  210. package/dist/symbols/extract.d.ts.map +1 -0
  211. package/dist/symbols/extract.js +208 -0
  212. package/dist/symbols/extract.js.map +1 -0
  213. package/dist/symbols/graph.d.ts +3 -0
  214. package/dist/symbols/graph.d.ts.map +1 -0
  215. package/dist/symbols/graph.js +89 -0
  216. package/dist/symbols/graph.js.map +1 -0
  217. package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
  218. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
  219. package/dist/synthesis/conversational-synthesizer.js +289 -0
  220. package/dist/synthesis/conversational-synthesizer.js.map +1 -0
  221. package/dist/synthesis/markdown-formatter.d.ts +13 -0
  222. package/dist/synthesis/markdown-formatter.d.ts.map +1 -0
  223. package/dist/synthesis/markdown-formatter.js +104 -0
  224. package/dist/synthesis/markdown-formatter.js.map +1 -0
  225. package/dist/synthesis/prompt-builder.d.ts +21 -0
  226. package/dist/synthesis/prompt-builder.d.ts.map +1 -0
  227. package/dist/synthesis/prompt-builder.js +129 -0
  228. package/dist/synthesis/prompt-builder.js.map +1 -0
  229. package/dist/synthesis/synthesizer.d.ts +30 -0
  230. package/dist/synthesis/synthesizer.d.ts.map +1 -0
  231. package/dist/synthesis/synthesizer.js +213 -0
  232. package/dist/synthesis/synthesizer.js.map +1 -0
  233. package/dist/tests/rate-limiter.test.d.ts +2 -0
  234. package/dist/tests/rate-limiter.test.d.ts.map +1 -0
  235. package/dist/tests/rate-limiter.test.js +11 -0
  236. package/dist/tests/rate-limiter.test.js.map +1 -0
  237. package/dist/tests/search-normalization.test.d.ts +2 -0
  238. package/dist/tests/search-normalization.test.d.ts.map +1 -0
  239. package/dist/tests/search-normalization.test.js +9 -0
  240. package/dist/tests/search-normalization.test.js.map +1 -0
  241. package/dist/tests/semantic-chunker.test.d.ts +2 -0
  242. package/dist/tests/semantic-chunker.test.d.ts.map +1 -0
  243. package/dist/tests/semantic-chunker.test.js +48 -0
  244. package/dist/tests/semantic-chunker.test.js.map +1 -0
  245. package/dist/tests/simple-lru.test.d.ts +2 -0
  246. package/dist/tests/simple-lru.test.d.ts.map +1 -0
  247. package/dist/tests/simple-lru.test.js +21 -0
  248. package/dist/tests/simple-lru.test.js.map +1 -0
  249. package/dist/tests/symbol-boost.test.d.ts +2 -0
  250. package/dist/tests/symbol-boost.test.d.ts.map +1 -0
  251. package/dist/tests/symbol-boost.test.js +21 -0
  252. package/dist/tests/symbol-boost.test.js.map +1 -0
  253. package/dist/types/ast.d.ts +3 -0
  254. package/dist/types/ast.d.ts.map +1 -0
  255. package/dist/types/ast.js +2 -0
  256. package/dist/types/ast.js.map +1 -0
  257. package/dist/types/codemap.d.ts +58 -0
  258. package/dist/types/codemap.d.ts.map +1 -0
  259. package/dist/types/codemap.js +224 -0
  260. package/dist/types/codemap.js.map +1 -0
  261. package/dist/types/context-pack.d.ts +47 -0
  262. package/dist/types/context-pack.d.ts.map +1 -0
  263. package/dist/types/context-pack.js +44 -0
  264. package/dist/types/context-pack.js.map +1 -0
  265. package/dist/types/search.d.ts +15 -0
  266. package/dist/types/search.d.ts.map +1 -0
  267. package/dist/types/search.js +11 -0
  268. package/dist/types/search.js.map +1 -0
  269. package/dist/utils/cli-ui.d.ts +44 -0
  270. package/dist/utils/cli-ui.d.ts.map +1 -0
  271. package/dist/utils/cli-ui.js +139 -0
  272. package/dist/utils/cli-ui.js.map +1 -0
  273. package/dist/utils/indexer-with-progress.d.ts +10 -0
  274. package/dist/utils/indexer-with-progress.d.ts.map +1 -0
  275. package/dist/utils/indexer-with-progress.js +43 -0
  276. package/dist/utils/indexer-with-progress.js.map +1 -0
  277. package/dist/utils/logger.d.ts +55 -0
  278. package/dist/utils/logger.d.ts.map +1 -0
  279. package/dist/utils/logger.js +121 -0
  280. package/dist/utils/logger.js.map +1 -0
  281. package/dist/utils/mutex.d.ts +63 -0
  282. package/dist/utils/mutex.d.ts.map +1 -0
  283. package/dist/utils/mutex.js +123 -0
  284. package/dist/utils/mutex.js.map +1 -0
  285. package/dist/utils/path-helpers.d.ts +27 -0
  286. package/dist/utils/path-helpers.d.ts.map +1 -0
  287. package/dist/utils/path-helpers.js +55 -0
  288. package/dist/utils/path-helpers.js.map +1 -0
  289. package/dist/utils/rate-limiter.d.ts +34 -0
  290. package/dist/utils/rate-limiter.d.ts.map +1 -0
  291. package/dist/utils/rate-limiter.js +178 -0
  292. package/dist/utils/rate-limiter.js.map +1 -0
  293. package/dist/utils/scan-patterns.d.ts +5 -0
  294. package/dist/utils/scan-patterns.d.ts.map +1 -0
  295. package/dist/utils/scan-patterns.js +29 -0
  296. package/dist/utils/scan-patterns.js.map +1 -0
  297. package/dist/utils/simple-lru.d.ts +10 -0
  298. package/dist/utils/simple-lru.d.ts.map +1 -0
  299. package/dist/utils/simple-lru.js +38 -0
  300. package/dist/utils/simple-lru.js.map +1 -0
  301. package/package.json +3 -2
@@ -0,0 +1,326 @@
1
+ import Database from 'better-sqlite3';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { log } from '../utils/logger.js';
5
+ export class CodeVaultDatabase {
6
+ db;
7
+ insertChunkStmt;
8
+ getChunksStmt;
9
+ deleteChunksStmt = null;
10
+ constructor(dbPath) {
11
+ this.db = new Database(dbPath);
12
+ // Enable WAL mode for better concurrency
13
+ this.db.pragma('journal_mode = WAL');
14
+ // Optimize for performance
15
+ this.db.pragma('synchronous = NORMAL');
16
+ this.db.pragma('cache_size = -64000'); // 64MB cache
17
+ this.db.pragma('temp_store = MEMORY');
18
+ this.db.pragma('mmap_size = 30000000000'); // 30GB mmap
19
+ // Check if tables exist and create if needed
20
+ this.ensureTablesExist();
21
+ }
22
+ /**
23
+ * Ensure database tables exist and prepare statements
24
+ */
25
+ ensureTablesExist() {
26
+ // Create tables if they don't exist
27
+ this.db.exec(`
28
+ CREATE TABLE IF NOT EXISTS code_chunks (
29
+ id TEXT PRIMARY KEY,
30
+ file_path TEXT NOT NULL,
31
+ symbol TEXT NOT NULL,
32
+ sha TEXT NOT NULL,
33
+ lang TEXT NOT NULL,
34
+ chunk_type TEXT DEFAULT 'function',
35
+ embedding BLOB,
36
+ embedding_provider TEXT,
37
+ embedding_dimensions INTEGER,
38
+ codevault_tags TEXT,
39
+ codevault_intent TEXT,
40
+ codevault_description TEXT,
41
+ doc_comments TEXT,
42
+ variables_used TEXT,
43
+ context_info TEXT,
44
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
45
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
46
+ )
47
+ `);
48
+ // Prepare statements after tables exist
49
+ this.insertChunkStmt = this.db.prepare(`
50
+ INSERT OR REPLACE INTO code_chunks
51
+ (id, file_path, symbol, sha, lang, chunk_type, embedding, embedding_provider, embedding_dimensions,
52
+ codevault_tags, codevault_intent, codevault_description, doc_comments, variables_used, context_info, updated_at)
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
54
+ `);
55
+ this.getChunksStmt = this.db.prepare(`
56
+ SELECT id, file_path, symbol, sha, lang, chunk_type, embedding,
57
+ codevault_tags, codevault_intent, codevault_description,
58
+ embedding_provider, embedding_dimensions
59
+ FROM code_chunks
60
+ WHERE embedding_provider = ? AND embedding_dimensions = ?
61
+ ORDER BY created_at DESC
62
+ `);
63
+ }
64
+ async initialize(dimensions) {
65
+ this.db.exec(`
66
+ CREATE TABLE IF NOT EXISTS intention_cache (
67
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
68
+ query_normalized TEXT NOT NULL,
69
+ original_query TEXT NOT NULL,
70
+ target_sha TEXT NOT NULL,
71
+ confidence REAL DEFAULT 1.0,
72
+ usage_count INTEGER DEFAULT 1,
73
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
74
+ last_used DATETIME DEFAULT CURRENT_TIMESTAMP
75
+ )
76
+ `);
77
+ this.db.exec(`
78
+ CREATE TABLE IF NOT EXISTS query_patterns (
79
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
80
+ pattern TEXT NOT NULL UNIQUE,
81
+ frequency INTEGER DEFAULT 1,
82
+ typical_results TEXT,
83
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
84
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
85
+ )
86
+ `);
87
+ const indexes = [
88
+ 'CREATE INDEX IF NOT EXISTS idx_file_path ON code_chunks(file_path)',
89
+ 'CREATE INDEX IF NOT EXISTS idx_symbol ON code_chunks(symbol)',
90
+ 'CREATE INDEX IF NOT EXISTS idx_lang ON code_chunks(lang)',
91
+ 'CREATE INDEX IF NOT EXISTS idx_provider ON code_chunks(embedding_provider)',
92
+ 'CREATE INDEX IF NOT EXISTS idx_chunk_type ON code_chunks(chunk_type)',
93
+ 'CREATE INDEX IF NOT EXISTS idx_codevault_tags ON code_chunks(codevault_tags)',
94
+ 'CREATE INDEX IF NOT EXISTS idx_codevault_intent ON code_chunks(codevault_intent)',
95
+ 'CREATE INDEX IF NOT EXISTS idx_lang_provider ON code_chunks(lang, embedding_provider, embedding_dimensions)',
96
+ 'CREATE INDEX IF NOT EXISTS idx_query_normalized ON intention_cache(query_normalized)',
97
+ 'CREATE INDEX IF NOT EXISTS idx_target_sha ON intention_cache(target_sha)',
98
+ 'CREATE INDEX IF NOT EXISTS idx_usage_count ON intention_cache(usage_count DESC)',
99
+ 'CREATE INDEX IF NOT EXISTS idx_pattern_frequency ON query_patterns(frequency DESC)'
100
+ ];
101
+ for (const sql of indexes) {
102
+ this.db.exec(sql);
103
+ }
104
+ }
105
+ insertChunk(params) {
106
+ try {
107
+ this.insertChunkStmt.run(params.id, params.file_path, params.symbol, params.sha, params.lang, params.chunk_type, Buffer.from(JSON.stringify(params.embedding)), params.embedding_provider, params.embedding_dimensions, JSON.stringify(params.codevault_tags), params.codevault_intent, params.codevault_description, params.doc_comments, JSON.stringify(params.variables_used), JSON.stringify(params.context_info));
108
+ }
109
+ catch (error) {
110
+ log.error('Failed to insert chunk', error, { chunkId: params.id });
111
+ throw error;
112
+ }
113
+ }
114
+ async deleteChunks(chunkIds) {
115
+ if (!Array.isArray(chunkIds) || chunkIds.length === 0) {
116
+ return;
117
+ }
118
+ try {
119
+ const placeholders = chunkIds.map(() => '?').join(', ');
120
+ if (!this.deleteChunksStmt) {
121
+ this.deleteChunksStmt = this.db.prepare(`DELETE FROM code_chunks WHERE id IN (${placeholders})`);
122
+ }
123
+ this.deleteChunksStmt.run(...chunkIds);
124
+ }
125
+ catch (error) {
126
+ log.error('Failed to delete chunks', error, { count: chunkIds.length });
127
+ throw error;
128
+ }
129
+ }
130
+ async getChunks(providerName, dimensions) {
131
+ try {
132
+ return this.getChunksStmt.all(providerName, dimensions);
133
+ }
134
+ catch (error) {
135
+ log.error('Failed to get chunks', error, { provider: providerName, dimensions });
136
+ throw error;
137
+ }
138
+ }
139
+ async getExistingDimensions() {
140
+ try {
141
+ const stmt = this.db.prepare(`
142
+ SELECT DISTINCT embedding_provider, embedding_dimensions
143
+ FROM code_chunks
144
+ LIMIT 10
145
+ `);
146
+ return stmt.all();
147
+ }
148
+ catch (error) {
149
+ log.error('Failed to get existing dimensions', error);
150
+ throw error;
151
+ }
152
+ }
153
+ async recordIntention(normalizedQuery, originalQuery, targetSha, confidence) {
154
+ try {
155
+ const existing = this.db.prepare(`
156
+ SELECT id, usage_count FROM intention_cache
157
+ WHERE query_normalized = ? AND target_sha = ?
158
+ `).get(normalizedQuery, targetSha);
159
+ if (existing) {
160
+ this.db.prepare(`
161
+ UPDATE intention_cache
162
+ SET usage_count = usage_count + 1,
163
+ confidence = ?,
164
+ last_used = CURRENT_TIMESTAMP
165
+ WHERE id = ?
166
+ `).run(confidence, existing.id);
167
+ }
168
+ else {
169
+ this.db.prepare(`
170
+ INSERT INTO intention_cache
171
+ (query_normalized, original_query, target_sha, confidence)
172
+ VALUES (?, ?, ?, ?)
173
+ `).run(normalizedQuery, originalQuery, targetSha, confidence);
174
+ }
175
+ }
176
+ catch (error) {
177
+ log.error('Failed to record intention', error, { query: normalizedQuery });
178
+ throw error;
179
+ }
180
+ }
181
+ async searchByIntention(normalizedQuery) {
182
+ try {
183
+ return this.db.prepare(`
184
+ SELECT
185
+ i.target_sha,
186
+ i.confidence,
187
+ i.usage_count,
188
+ i.original_query,
189
+ c.file_path,
190
+ c.symbol,
191
+ c.lang,
192
+ c.chunk_type
193
+ FROM intention_cache i
194
+ LEFT JOIN code_chunks c ON i.target_sha = c.sha
195
+ WHERE i.query_normalized = ?
196
+ ORDER BY i.confidence DESC, i.usage_count DESC
197
+ LIMIT 1
198
+ `).get(normalizedQuery);
199
+ }
200
+ catch (error) {
201
+ log.error('Failed to search by intention', error, { query: normalizedQuery });
202
+ return null;
203
+ }
204
+ }
205
+ async recordQueryPattern(pattern) {
206
+ try {
207
+ const existing = this.db.prepare(`
208
+ SELECT id, frequency FROM query_patterns WHERE pattern = ?
209
+ `).get(pattern);
210
+ if (existing) {
211
+ this.db.prepare(`
212
+ UPDATE query_patterns
213
+ SET frequency = frequency + 1, updated_at = CURRENT_TIMESTAMP
214
+ WHERE id = ?
215
+ `).run(existing.id);
216
+ }
217
+ else {
218
+ this.db.prepare(`
219
+ INSERT INTO query_patterns (pattern) VALUES (?)
220
+ `).run(pattern);
221
+ }
222
+ }
223
+ catch (error) {
224
+ log.error('Failed to record query pattern', error, { pattern });
225
+ throw error;
226
+ }
227
+ }
228
+ async getOverviewChunks(limit) {
229
+ try {
230
+ return this.db.prepare(`
231
+ SELECT id, file_path, symbol, sha, lang
232
+ FROM code_chunks
233
+ ORDER BY file_path, symbol
234
+ LIMIT ?
235
+ `).all(limit);
236
+ }
237
+ catch (error) {
238
+ log.error('Failed to get overview chunks', error, { limit });
239
+ throw error;
240
+ }
241
+ }
242
+ /**
243
+ * Begin a database transaction
244
+ */
245
+ async beginTransaction() {
246
+ this.db.prepare('BEGIN TRANSACTION').run();
247
+ }
248
+ /**
249
+ * Commit the current transaction
250
+ */
251
+ async commit() {
252
+ this.db.prepare('COMMIT').run();
253
+ }
254
+ /**
255
+ * Rollback the current transaction
256
+ */
257
+ async rollback() {
258
+ this.db.prepare('ROLLBACK').run();
259
+ }
260
+ /**
261
+ * Execute a function within a transaction
262
+ * Automatically commits on success and rolls back on error
263
+ *
264
+ * Note: better-sqlite3 transactions MUST be synchronous
265
+ * If you need async operations, use beginTransaction/commit/rollback manually
266
+ */
267
+ async transaction(fn) {
268
+ try {
269
+ // Start transaction
270
+ this.db.prepare('BEGIN TRANSACTION').run();
271
+ // Execute function (can be async)
272
+ const result = await fn();
273
+ // Commit if successful
274
+ this.db.prepare('COMMIT').run();
275
+ return result;
276
+ }
277
+ catch (error) {
278
+ // Rollback on error
279
+ try {
280
+ this.db.prepare('ROLLBACK').run();
281
+ }
282
+ catch (rollbackError) {
283
+ log.error('Failed to rollback transaction', rollbackError);
284
+ }
285
+ log.error('Transaction failed and was rolled back', error);
286
+ throw error;
287
+ }
288
+ }
289
+ /**
290
+ * Close the database connection
291
+ * IMPORTANT: Always call this when done to avoid resource leaks
292
+ */
293
+ close() {
294
+ try {
295
+ this.db.close();
296
+ log.debug('Database connection closed');
297
+ }
298
+ catch (error) {
299
+ log.error('Failed to close database', error);
300
+ }
301
+ }
302
+ /**
303
+ * Get database statistics for monitoring
304
+ */
305
+ getStats() {
306
+ return {
307
+ isOpen: this.db.open,
308
+ inTransaction: this.db.inTransaction,
309
+ readonly: this.db.readonly,
310
+ memory: this.db.memory,
311
+ };
312
+ }
313
+ }
314
+ export async function initDatabase(dimensions, basePath = '.') {
315
+ const dbPath = path.join(path.resolve(basePath), '.codevault', 'codevault.db');
316
+ const dbDir = path.dirname(dbPath);
317
+ if (!fs.existsSync(dbDir)) {
318
+ fs.mkdirSync(dbDir, { recursive: true });
319
+ }
320
+ const db = new CodeVaultDatabase(dbPath);
321
+ await db.initialize(dimensions);
322
+ db.close();
323
+ }
324
+ // Export as Database for backward compatibility
325
+ export { CodeVaultDatabase as Database };
326
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function computeFastHash(input: string | Buffer): Promise<string>;
2
+ export interface MerkleEntry {
3
+ shaFile: string;
4
+ chunkShas: string[];
5
+ }
6
+ export type MerkleTree = Record<string, MerkleEntry>;
7
+ export declare function loadMerkle(basePath?: string): MerkleTree;
8
+ export declare function saveMerkle(basePath?: string, merkle?: MerkleTree): void;
9
+ export declare function toPosixPath(relativePath: string | null): string | null;
10
+ export declare function normalizeToProjectPath(basePath?: string, filePath?: string): string | null;
11
+ export declare function removeMerkleEntry(merkle: MerkleTree, relativePath: string): boolean;
12
+ export declare function cloneMerkle(merkle: MerkleTree): MerkleTree;
13
+ //# sourceMappingURL=merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../src/indexer/merkle.ts"],"names":[],"mappings":"AAuBA,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa7E;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAErD,wBAAgB,UAAU,CAAC,QAAQ,SAAM,GAAG,UAAU,CAcrD;AAED,wBAAgB,UAAU,CAAC,QAAQ,SAAM,EAAE,MAAM,GAAE,UAAe,GAAG,IAAI,CAOxE;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKtE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,SAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcvF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAWnF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE1D"}
@@ -0,0 +1,86 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import xxhashFactory from 'xxhash-wasm';
4
+ const MERKLE_DIR = '.codevault';
5
+ const MERKLE_FILENAME = 'merkle.json';
6
+ let hasherPromise = null;
7
+ async function getHasher() {
8
+ if (!hasherPromise) {
9
+ hasherPromise = xxhashFactory().then(factory => factory.h64);
10
+ }
11
+ return hasherPromise;
12
+ }
13
+ function ensureObject(value) {
14
+ if (!value || typeof value !== 'object') {
15
+ return {};
16
+ }
17
+ return value;
18
+ }
19
+ export async function computeFastHash(input) {
20
+ const hasher = await getHasher();
21
+ let normalized;
22
+ if (typeof input === 'string') {
23
+ normalized = input;
24
+ }
25
+ else if (Buffer.isBuffer(input)) {
26
+ normalized = input.toString('utf8');
27
+ }
28
+ else {
29
+ normalized = String(input ?? '');
30
+ }
31
+ const result = hasher(normalized);
32
+ return typeof result === 'bigint' ? result.toString() : String(result);
33
+ }
34
+ export function loadMerkle(basePath = '.') {
35
+ const absolute = path.resolve(basePath);
36
+ const merklePath = path.join(absolute, MERKLE_DIR, MERKLE_FILENAME);
37
+ if (!fs.existsSync(merklePath)) {
38
+ return {};
39
+ }
40
+ try {
41
+ const data = fs.readFileSync(merklePath, 'utf8');
42
+ return ensureObject(JSON.parse(data));
43
+ }
44
+ catch (error) {
45
+ return {};
46
+ }
47
+ }
48
+ export function saveMerkle(basePath = '.', merkle = {}) {
49
+ const absolute = path.resolve(basePath);
50
+ const dirPath = path.join(absolute, MERKLE_DIR);
51
+ const merklePath = path.join(dirPath, MERKLE_FILENAME);
52
+ fs.mkdirSync(dirPath, { recursive: true });
53
+ fs.writeFileSync(merklePath, JSON.stringify(merkle, null, 2));
54
+ }
55
+ export function toPosixPath(relativePath) {
56
+ if (typeof relativePath !== 'string') {
57
+ return null;
58
+ }
59
+ return relativePath.split(path.sep).join('/');
60
+ }
61
+ export function normalizeToProjectPath(basePath = '.', filePath) {
62
+ if (typeof filePath !== 'string' || filePath.length === 0) {
63
+ return null;
64
+ }
65
+ const absoluteBase = path.resolve(basePath);
66
+ const absoluteFile = path.isAbsolute(filePath) ? filePath : path.join(absoluteBase, filePath);
67
+ const relative = path.relative(absoluteBase, absoluteFile);
68
+ if (!relative || relative.startsWith('..')) {
69
+ return null;
70
+ }
71
+ return toPosixPath(relative);
72
+ }
73
+ export function removeMerkleEntry(merkle, relativePath) {
74
+ if (!merkle || typeof merkle !== 'object') {
75
+ return false;
76
+ }
77
+ if (Object.prototype.hasOwnProperty.call(merkle, relativePath)) {
78
+ delete merkle[relativePath];
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ export function cloneMerkle(merkle) {
84
+ return JSON.parse(JSON.stringify(ensureObject(merkle)));
85
+ }
86
+ //# sourceMappingURL=merkle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.js","sourceRoot":"","sources":["../../src/indexer/merkle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { EmbeddingProvider } from '../providers/base.js';
2
+ export interface UpdateIndexOptions {
3
+ repoPath?: string;
4
+ provider?: string;
5
+ changedFiles?: string[];
6
+ deletedFiles?: string[];
7
+ onProgress?: ((event: any) => void) | null;
8
+ embeddingProvider?: EmbeddingProvider | null;
9
+ encrypt?: string;
10
+ }
11
+ export interface UpdateIndexResult {
12
+ success: boolean;
13
+ processedChunks: number;
14
+ totalChunks: number;
15
+ provider: string;
16
+ errors: any[];
17
+ }
18
+ export declare function updateIndex({ repoPath, provider, changedFiles, deletedFiles, onProgress, embeddingProvider, encrypt }?: UpdateIndexOptions): Promise<UpdateIndexResult>;
19
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/indexer/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAmB9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,EAChC,QAAc,EACd,QAAiB,EACjB,YAAiB,EACjB,YAAiB,EACjB,UAAiB,EACjB,iBAAwB,EACxB,OAAmB,EACpB,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwBtD"}
@@ -0,0 +1,40 @@
1
+ import path from 'path';
2
+ import { normalizeToProjectPath } from './merkle.js';
3
+ import { indexProject } from '../core/indexer.js';
4
+ function normalizeList(basePath, values = []) {
5
+ const normalized = new Set();
6
+ if (!Array.isArray(values)) {
7
+ return [];
8
+ }
9
+ for (const value of values) {
10
+ const relative = normalizeToProjectPath(basePath, value);
11
+ if (relative) {
12
+ normalized.add(relative);
13
+ }
14
+ }
15
+ return Array.from(normalized);
16
+ }
17
+ export async function updateIndex({ repoPath = '.', provider = 'auto', changedFiles = [], deletedFiles = [], onProgress = null, embeddingProvider = null, encrypt = undefined } = {}) {
18
+ const root = path.resolve(repoPath);
19
+ const normalizedChanged = normalizeList(root, changedFiles);
20
+ const normalizedDeleted = normalizeList(root, deletedFiles);
21
+ if (normalizedChanged.length === 0 && normalizedDeleted.length === 0) {
22
+ return {
23
+ success: true,
24
+ processedChunks: 0,
25
+ totalChunks: 0,
26
+ provider,
27
+ errors: []
28
+ };
29
+ }
30
+ return indexProject({
31
+ repoPath: root,
32
+ provider,
33
+ onProgress,
34
+ changedFiles: normalizedChanged,
35
+ deletedFiles: normalizedDeleted,
36
+ embeddingProviderOverride: embeddingProvider,
37
+ encryptMode: encrypt
38
+ });
39
+ }
40
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/indexer/update.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,SAAS,aAAa,CAAC,QAAgB,EAAE,SAAmB,EAAE;IAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAoBD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,MAAM,EACjB,YAAY,GAAG,EAAE,EACjB,YAAY,GAAG,EAAE,EACjB,UAAU,GAAG,IAAI,EACjB,iBAAiB,GAAG,IAAI,EACxB,OAAO,GAAG,SAAS,KACG,EAAE;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;YACd,QAAQ;YACR,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,QAAQ,EAAE,IAAI;QACd,QAAQ;QACR,UAAU;QACV,YAAY,EAAE,iBAAiB;QAC/B,YAAY,EAAE,iBAAiB;QAC/B,yBAAyB,EAAE,iBAAiB;QAC5C,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import chokidar from 'chokidar';
2
+ interface WatchOptions {
3
+ repoPath?: string;
4
+ provider?: string;
5
+ debounceMs?: number;
6
+ onBatch?: ((event: {
7
+ changed: string[];
8
+ deleted: string[];
9
+ }) => void) | null;
10
+ logger?: Console;
11
+ encrypt?: string;
12
+ }
13
+ interface WatchController {
14
+ watcher: ReturnType<typeof chokidar.watch>;
15
+ ready: Promise<void>;
16
+ close: () => Promise<void>;
17
+ flush: () => Promise<void>;
18
+ }
19
+ export declare function startWatch({ repoPath, provider, debounceMs, onBatch, logger, encrypt }?: WatchOptions): WatchController;
20
+ export {};
21
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/indexer/watch.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAoBhC,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAc,EACd,QAAiB,EACjB,UAAgC,EAChC,OAAc,EACd,MAAgB,EAChB,OAAmB,EACpB,GAAE,YAAiB,GAAG,eAAe,CAyOrC"}