edhindex 1.0.0 → 1.0.2

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 (199) hide show
  1. package/README.md +228 -0
  2. package/dist/cli/commands/config_cmd.d.ts +2 -0
  3. package/dist/cli/commands/config_cmd.d.ts.map +1 -0
  4. package/dist/cli/commands/config_cmd.js +53 -0
  5. package/dist/cli/commands/config_cmd.js.map +1 -0
  6. package/dist/cli/commands/doctor_cmd.d.ts +2 -0
  7. package/dist/cli/commands/doctor_cmd.d.ts.map +1 -0
  8. package/dist/cli/commands/doctor_cmd.js +32 -0
  9. package/dist/cli/commands/doctor_cmd.js.map +1 -0
  10. package/dist/cli/commands/graph.d.ts +2 -0
  11. package/dist/cli/commands/graph.d.ts.map +1 -0
  12. package/dist/cli/commands/graph.js +26 -0
  13. package/dist/cli/commands/graph.js.map +1 -0
  14. package/dist/cli/commands/index_cmd.d.ts +2 -0
  15. package/dist/cli/commands/index_cmd.d.ts.map +1 -0
  16. package/dist/cli/commands/index_cmd.js +110 -0
  17. package/dist/cli/commands/index_cmd.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +2 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +53 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/knowledge-graph.d.ts +8 -0
  23. package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
  24. package/dist/cli/commands/knowledge-graph.js +76 -0
  25. package/dist/cli/commands/knowledge-graph.js.map +1 -0
  26. package/dist/cli/commands/models.d.ts +2 -0
  27. package/dist/cli/commands/models.d.ts.map +1 -0
  28. package/dist/cli/commands/models.js +17 -0
  29. package/dist/cli/commands/models.js.map +1 -0
  30. package/dist/cli/commands/reset.d.ts +2 -0
  31. package/dist/cli/commands/reset.d.ts.map +1 -0
  32. package/dist/cli/commands/reset.js +35 -0
  33. package/dist/cli/commands/reset.js.map +1 -0
  34. package/dist/cli/commands/search.d.ts +2 -0
  35. package/dist/cli/commands/search.d.ts.map +1 -0
  36. package/dist/cli/commands/search.js +40 -0
  37. package/dist/cli/commands/search.js.map +1 -0
  38. package/dist/cli/commands/start.d.ts +2 -0
  39. package/dist/cli/commands/start.d.ts.map +1 -0
  40. package/dist/cli/commands/start.js +265 -0
  41. package/dist/cli/commands/start.js.map +1 -0
  42. package/dist/cli/commands/status.d.ts +2 -0
  43. package/dist/cli/commands/status.d.ts.map +1 -0
  44. package/dist/cli/commands/status.js +47 -0
  45. package/dist/cli/commands/status.js.map +1 -0
  46. package/dist/cli/index.d.ts +3 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +121 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/config/index.d.ts +28 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +65 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/doctor/index.d.ts +8 -0
  55. package/dist/doctor/index.d.ts.map +1 -0
  56. package/dist/doctor/index.js +117 -0
  57. package/dist/doctor/index.js.map +1 -0
  58. package/dist/embeddings/provider.d.ts +9 -0
  59. package/dist/embeddings/provider.d.ts.map +1 -0
  60. package/dist/embeddings/provider.js +2 -0
  61. package/dist/embeddings/provider.js.map +1 -0
  62. package/dist/embeddings/transformers.d.ts +26 -0
  63. package/dist/embeddings/transformers.d.ts.map +1 -0
  64. package/dist/embeddings/transformers.js +120 -0
  65. package/dist/embeddings/transformers.js.map +1 -0
  66. package/dist/graph/build.d.ts +13 -0
  67. package/dist/graph/build.d.ts.map +1 -0
  68. package/dist/graph/build.js +33 -0
  69. package/dist/graph/build.js.map +1 -0
  70. package/dist/graph/builder.d.ts +24 -0
  71. package/dist/graph/builder.d.ts.map +1 -0
  72. package/dist/graph/builder.js +231 -0
  73. package/dist/graph/builder.js.map +1 -0
  74. package/dist/graph/render.d.ts +3 -0
  75. package/dist/graph/render.d.ts.map +1 -0
  76. package/dist/graph/render.js +60 -0
  77. package/dist/graph/render.js.map +1 -0
  78. package/dist/graph/serve.d.ts +6 -0
  79. package/dist/graph/serve.d.ts.map +1 -0
  80. package/dist/graph/serve.js +389 -0
  81. package/dist/graph/serve.js.map +1 -0
  82. package/dist/graph/service.d.ts +29 -0
  83. package/dist/graph/service.d.ts.map +1 -0
  84. package/dist/graph/service.js +73 -0
  85. package/dist/graph/service.js.map +1 -0
  86. package/dist/graph/storage.d.ts +33 -0
  87. package/dist/graph/storage.d.ts.map +1 -0
  88. package/dist/graph/storage.js +164 -0
  89. package/dist/graph/storage.js.map +1 -0
  90. package/dist/graph/svg.d.ts +27 -0
  91. package/dist/graph/svg.d.ts.map +1 -0
  92. package/dist/graph/svg.js +212 -0
  93. package/dist/graph/svg.js.map +1 -0
  94. package/dist/graph/types.d.ts +34 -0
  95. package/dist/graph/types.d.ts.map +1 -0
  96. package/dist/graph/types.js +9 -0
  97. package/dist/graph/types.js.map +1 -0
  98. package/dist/indexer/chunker.d.ts +18 -0
  99. package/dist/indexer/chunker.d.ts.map +1 -0
  100. package/dist/indexer/chunker.js +139 -0
  101. package/dist/indexer/chunker.js.map +1 -0
  102. package/dist/indexer/file-utils.d.ts +17 -0
  103. package/dist/indexer/file-utils.d.ts.map +1 -0
  104. package/dist/indexer/file-utils.js +123 -0
  105. package/dist/indexer/file-utils.js.map +1 -0
  106. package/dist/indexer/ignore.d.ts +5 -0
  107. package/dist/indexer/ignore.d.ts.map +1 -0
  108. package/dist/indexer/ignore.js +96 -0
  109. package/dist/indexer/ignore.js.map +1 -0
  110. package/dist/indexer/incremental.d.ts +16 -0
  111. package/dist/indexer/incremental.d.ts.map +1 -0
  112. package/dist/indexer/incremental.js +55 -0
  113. package/dist/indexer/incremental.js.map +1 -0
  114. package/dist/indexer/indexer.d.ts +36 -0
  115. package/dist/indexer/indexer.d.ts.map +1 -0
  116. package/dist/indexer/indexer.js +121 -0
  117. package/dist/indexer/indexer.js.map +1 -0
  118. package/dist/indexer/parser.d.ts +30 -0
  119. package/dist/indexer/parser.d.ts.map +1 -0
  120. package/dist/indexer/parser.js +225 -0
  121. package/dist/indexer/parser.js.map +1 -0
  122. package/dist/logging.d.ts +15 -0
  123. package/dist/logging.d.ts.map +1 -0
  124. package/dist/logging.js +42 -0
  125. package/dist/logging.js.map +1 -0
  126. package/dist/mcp/server.d.ts +4 -0
  127. package/dist/mcp/server.d.ts.map +1 -0
  128. package/dist/mcp/server.js +226 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/dist/mcp-config.d.ts +4 -0
  131. package/dist/mcp-config.d.ts.map +1 -0
  132. package/dist/mcp-config.js +175 -0
  133. package/dist/mcp-config.js.map +1 -0
  134. package/dist/progress.d.ts +12 -0
  135. package/dist/progress.d.ts.map +1 -0
  136. package/dist/progress.js +16 -0
  137. package/dist/progress.js.map +1 -0
  138. package/dist/retrieval/bm25.d.ts +6 -0
  139. package/dist/retrieval/bm25.d.ts.map +1 -0
  140. package/dist/retrieval/bm25.js +20 -0
  141. package/dist/retrieval/bm25.js.map +1 -0
  142. package/dist/retrieval/reranker.d.ts +11 -0
  143. package/dist/retrieval/reranker.d.ts.map +1 -0
  144. package/dist/retrieval/reranker.js +46 -0
  145. package/dist/retrieval/reranker.js.map +1 -0
  146. package/dist/retrieval/search.d.ts +35 -0
  147. package/dist/retrieval/search.d.ts.map +1 -0
  148. package/dist/retrieval/search.js +95 -0
  149. package/dist/retrieval/search.js.map +1 -0
  150. package/dist/security.d.ts +5 -0
  151. package/dist/security.d.ts.map +1 -0
  152. package/dist/security.js +42 -0
  153. package/dist/security.js.map +1 -0
  154. package/dist/storage/fts.d.ts +30 -0
  155. package/dist/storage/fts.d.ts.map +1 -0
  156. package/dist/storage/fts.js +107 -0
  157. package/dist/storage/fts.js.map +1 -0
  158. package/dist/storage/metadata.d.ts +46 -0
  159. package/dist/storage/metadata.d.ts.map +1 -0
  160. package/dist/storage/metadata.js +133 -0
  161. package/dist/storage/metadata.js.map +1 -0
  162. package/dist/vector/lancedb.d.ts +25 -0
  163. package/dist/vector/lancedb.d.ts.map +1 -0
  164. package/dist/vector/lancedb.js +93 -0
  165. package/dist/vector/lancedb.js.map +1 -0
  166. package/dist/vector/store.d.ts +16 -0
  167. package/dist/vector/store.d.ts.map +1 -0
  168. package/dist/vector/store.js +2 -0
  169. package/dist/vector/store.js.map +1 -0
  170. package/dist/version.d.ts +12 -0
  171. package/dist/version.d.ts.map +1 -0
  172. package/dist/version.js +46 -0
  173. package/dist/version.js.map +1 -0
  174. package/dist/watcher/index.d.ts +15 -0
  175. package/dist/watcher/index.d.ts.map +1 -0
  176. package/dist/watcher/index.js +65 -0
  177. package/dist/watcher/index.js.map +1 -0
  178. package/package.json +35 -4
  179. package/src/cli/commands/graph.ts +30 -0
  180. package/src/cli/commands/init.ts +41 -3
  181. package/src/cli/commands/knowledge-graph.ts +85 -0
  182. package/src/cli/commands/reset.ts +40 -0
  183. package/src/cli/commands/start.ts +54 -21
  184. package/src/cli/index.ts +33 -0
  185. package/src/config/index.ts +13 -0
  186. package/src/graph/build.ts +45 -0
  187. package/src/graph/builder.ts +243 -0
  188. package/src/graph/render.ts +67 -0
  189. package/src/graph/serve.ts +399 -0
  190. package/src/graph/service.ts +84 -0
  191. package/src/graph/storage.ts +181 -0
  192. package/src/graph/svg.ts +241 -0
  193. package/src/graph/types.ts +68 -0
  194. package/src/mcp/server.ts +212 -85
  195. package/src/mcp-config.ts +185 -0
  196. package/src/storage/metadata.ts +9 -1
  197. package/.edhindexignore +0 -66
  198. package/BUILD_BRIEF.md +0 -228
  199. package/tsconfig.json +0 -21
@@ -0,0 +1,107 @@
1
+ import Database from 'better-sqlite3';
2
+ import { join } from 'node:path';
3
+ export class FTSStore {
4
+ db;
5
+ path;
6
+ constructor(indexDir) {
7
+ this.path = join(indexDir, 'fts.db');
8
+ this.db = new Database(this.path);
9
+ this.createSchema();
10
+ }
11
+ createSchema() {
12
+ this.db.exec(`
13
+ CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
14
+ content,
15
+ file UNINDEXED,
16
+ symbol,
17
+ language UNINDEXED,
18
+ content_id UNINDEXED,
19
+ tokenize='porter unicode61'
20
+ );
21
+
22
+ PRAGMA journal_mode = WAL;
23
+ PRAGMA synchronous = NORMAL;
24
+ `);
25
+ }
26
+ beginTransaction() {
27
+ this.db.exec('BEGIN TRANSACTION');
28
+ }
29
+ commit() {
30
+ this.db.exec('COMMIT');
31
+ }
32
+ rollback() {
33
+ this.db.exec('ROLLBACK');
34
+ }
35
+ insertChunk(id, content, file, symbol, language) {
36
+ try {
37
+ this.db.prepare(`
38
+ INSERT INTO chunks_fts (content, file, symbol, language, content_id)
39
+ VALUES (?, ?, ?, ?, ?)
40
+ `).run(content, file, symbol, language, id);
41
+ }
42
+ catch (e) {
43
+ if (e?.message?.includes('already exists')) {
44
+ this.db.prepare(`
45
+ UPDATE chunks_fts SET content = ?, file = ?, symbol = ?, language = ?
46
+ WHERE content_id = ?
47
+ `).run(content, file, symbol, language, id);
48
+ }
49
+ }
50
+ }
51
+ deleteChunk(id) {
52
+ this.db.prepare('DELETE FROM chunks_fts WHERE content_id = ?').run(id);
53
+ }
54
+ deleteChunksForFile(filePath) {
55
+ this.db.prepare('DELETE FROM chunks_fts WHERE file = ?').run(filePath);
56
+ }
57
+ search(query, limit) {
58
+ const cleaned = query.replace(/[^\w\s]/g, ' ').trim();
59
+ if (!cleaned)
60
+ return [];
61
+ try {
62
+ const results = this.db.prepare(`
63
+ SELECT
64
+ content_id as id,
65
+ rank,
66
+ content,
67
+ file,
68
+ symbol,
69
+ language
70
+ FROM chunks_fts
71
+ WHERE chunks_fts MATCH ?
72
+ ORDER BY rank
73
+ LIMIT ?
74
+ `).all(cleaned, limit);
75
+ return results.map(r => ({
76
+ ...r,
77
+ kind: null,
78
+ start_line: 0,
79
+ end_line: 0,
80
+ }));
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ }
86
+ searchWithRank(query, limit) {
87
+ const cleaned = query.replace(/[^\w\s]/g, ' ').trim();
88
+ if (!cleaned)
89
+ return [];
90
+ try {
91
+ return this.db.prepare(`
92
+ SELECT content_id as id, rank
93
+ FROM chunks_fts
94
+ WHERE chunks_fts MATCH ?
95
+ ORDER BY rank
96
+ LIMIT ?
97
+ `).all(cleaned, limit);
98
+ }
99
+ catch {
100
+ return [];
101
+ }
102
+ }
103
+ close() {
104
+ this.db.close();
105
+ }
106
+ }
107
+ //# sourceMappingURL=fts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/storage/fts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export interface ChunkMetadata {
2
+ id: string;
3
+ file: string;
4
+ language: string;
5
+ symbol: string;
6
+ kind: string | null;
7
+ parent: string | null;
8
+ hash: string;
9
+ git_commit: string | null;
10
+ start_line: number;
11
+ end_line: number;
12
+ imports: string;
13
+ exports: string;
14
+ embedding_model: string;
15
+ last_indexed: string;
16
+ checksum: string;
17
+ }
18
+ export declare class MetadataStore {
19
+ private db;
20
+ private path;
21
+ constructor(indexDir: string);
22
+ private createSchema;
23
+ beginTransaction(): void;
24
+ commit(): void;
25
+ rollback(): void;
26
+ getAllFilesWithImports(): {
27
+ file: string;
28
+ language: string;
29
+ imports: string;
30
+ exports: string;
31
+ chunkCount: number;
32
+ }[];
33
+ upsertChunk(chunk: ChunkMetadata): void;
34
+ deleteChunks(chunkIds: string[]): void;
35
+ deleteChunksForFile(filePath: string): void;
36
+ getChunk(id: string): ChunkMetadata | undefined;
37
+ getAllChunkHashes(): Map<string, string>;
38
+ getAllFileHashes(): Map<string, string>;
39
+ upsertFileHash(path: string, hash: string): void;
40
+ deleteFileHash(path: string): void;
41
+ getChunksForFile(file: string): ChunkMetadata[];
42
+ getChunkCount(): number;
43
+ getFileCount(): number;
44
+ close(): void;
45
+ }
46
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/storage/metadata.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,IAAI,CAAS;gBAET,QAAQ,EAAE,MAAM;IAU5B,OAAO,CAAC,YAAY;IAqCpB,gBAAgB;IAIhB,MAAM;IAIN,QAAQ;IAIR,sBAAsB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE;IAQpH,WAAW,CAAC,KAAK,EAAE,aAAa;IAYhC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE;IAQ/B,mBAAmB,CAAC,QAAQ,EAAE,MAAM;IAIpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI/C,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IASxC,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IASvC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAQzC,cAAc,CAAC,IAAI,EAAE,MAAM;IAI3B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAI/C,aAAa,IAAI,MAAM;IAKvB,YAAY,IAAI,MAAM;IAKtB,KAAK;CAGN"}
@@ -0,0 +1,133 @@
1
+ import Database from 'better-sqlite3';
2
+ import { join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ export class MetadataStore {
5
+ db;
6
+ path;
7
+ constructor(indexDir) {
8
+ this.path = join(indexDir, 'metadata.db');
9
+ const exists = existsSync(this.path);
10
+ this.db = new Database(this.path);
11
+ if (!exists) {
12
+ this.createSchema();
13
+ }
14
+ }
15
+ createSchema() {
16
+ this.db.exec(`
17
+ CREATE TABLE IF NOT EXISTS chunks (
18
+ id TEXT PRIMARY KEY,
19
+ file TEXT NOT NULL,
20
+ language TEXT NOT NULL,
21
+ symbol TEXT NOT NULL DEFAULT '',
22
+ kind TEXT,
23
+ parent TEXT,
24
+ hash TEXT NOT NULL,
25
+ git_commit TEXT,
26
+ start_line INTEGER NOT NULL,
27
+ end_line INTEGER NOT NULL,
28
+ imports TEXT DEFAULT '',
29
+ exports TEXT DEFAULT '',
30
+ embedding_model TEXT NOT NULL DEFAULT '',
31
+ last_indexed TEXT NOT NULL,
32
+ checksum TEXT NOT NULL
33
+ );
34
+
35
+ CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file);
36
+ CREATE INDEX IF NOT EXISTS idx_chunks_language ON chunks(language);
37
+ CREATE INDEX IF NOT EXISTS idx_chunks_symbol ON chunks(symbol);
38
+ CREATE INDEX IF NOT EXISTS idx_chunks_kind ON chunks(kind);
39
+ CREATE INDEX IF NOT EXISTS idx_chunks_hash ON chunks(hash);
40
+
41
+ CREATE TABLE IF NOT EXISTS file_hashes (
42
+ path TEXT PRIMARY KEY,
43
+ hash TEXT NOT NULL,
44
+ last_indexed TEXT NOT NULL
45
+ );
46
+
47
+ PRAGMA journal_mode = WAL;
48
+ PRAGMA synchronous = NORMAL;
49
+ `);
50
+ }
51
+ beginTransaction() {
52
+ this.db.exec('BEGIN TRANSACTION');
53
+ }
54
+ commit() {
55
+ this.db.exec('COMMIT');
56
+ }
57
+ rollback() {
58
+ this.db.exec('ROLLBACK');
59
+ }
60
+ getAllFilesWithImports() {
61
+ return this.db.prepare(`
62
+ SELECT c.file, c.language, c.imports, c.exports, COUNT(*) as chunkCount
63
+ FROM chunks c
64
+ GROUP BY c.file
65
+ `).all();
66
+ }
67
+ upsertChunk(chunk) {
68
+ const stmt = this.db.prepare(`
69
+ INSERT OR REPLACE INTO chunks
70
+ (id, file, language, symbol, kind, parent, hash, git_commit,
71
+ start_line, end_line, imports, exports, embedding_model, last_indexed, checksum)
72
+ VALUES
73
+ (@id, @file, @language, @symbol, @kind, @parent, @hash, @git_commit,
74
+ @start_line, @end_line, @imports, @exports, @embedding_model, @last_indexed, @checksum)
75
+ `);
76
+ stmt.run(chunk);
77
+ }
78
+ deleteChunks(chunkIds) {
79
+ if (chunkIds.length === 0)
80
+ return;
81
+ const stmt = this.db.prepare('DELETE FROM chunks WHERE id = ?');
82
+ for (const id of chunkIds) {
83
+ stmt.run(id);
84
+ }
85
+ }
86
+ deleteChunksForFile(filePath) {
87
+ this.db.prepare('DELETE FROM chunks WHERE file = ?').run(filePath);
88
+ }
89
+ getChunk(id) {
90
+ return this.db.prepare('SELECT * FROM chunks WHERE id = ?').get(id);
91
+ }
92
+ getAllChunkHashes() {
93
+ const rows = this.db.prepare('SELECT id, hash FROM chunks').all();
94
+ const map = new Map();
95
+ for (const row of rows) {
96
+ map.set(row.id, row.hash);
97
+ }
98
+ return map;
99
+ }
100
+ getAllFileHashes() {
101
+ const rows = this.db.prepare('SELECT path, hash FROM file_hashes').all();
102
+ const map = new Map();
103
+ for (const row of rows) {
104
+ map.set(row.path, row.hash);
105
+ }
106
+ return map;
107
+ }
108
+ upsertFileHash(path, hash) {
109
+ const stmt = this.db.prepare(`
110
+ INSERT OR REPLACE INTO file_hashes (path, hash, last_indexed)
111
+ VALUES (?, ?, ?)
112
+ `);
113
+ stmt.run(path, hash, new Date().toISOString());
114
+ }
115
+ deleteFileHash(path) {
116
+ this.db.prepare('DELETE FROM file_hashes WHERE path = ?').run(path);
117
+ }
118
+ getChunksForFile(file) {
119
+ return this.db.prepare('SELECT * FROM chunks WHERE file = ?').all(file);
120
+ }
121
+ getChunkCount() {
122
+ const row = this.db.prepare('SELECT COUNT(*) as count FROM chunks').get();
123
+ return row.count;
124
+ }
125
+ getFileCount() {
126
+ const row = this.db.prepare('SELECT COUNT(DISTINCT file) as count FROM chunks').get();
127
+ return row.count;
128
+ }
129
+ close() {
130
+ this.db.close();
131
+ }
132
+ }
133
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/storage/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { VectorStore } from './store.js';
2
+ export declare class LanceDBStore implements VectorStore {
3
+ private db;
4
+ private table;
5
+ private uri;
6
+ private dims;
7
+ private tableName;
8
+ private initialized;
9
+ constructor(indexDir: string, dimensions: number);
10
+ init(): Promise<void>;
11
+ insert(vectors: Array<{
12
+ id: string;
13
+ values: number[];
14
+ metadata: Record<string, any>;
15
+ }>): Promise<void>;
16
+ delete(ids: string[]): Promise<void>;
17
+ search(query: number[], topK: number): Promise<Array<{
18
+ id: string;
19
+ score: number;
20
+ }>>;
21
+ compact(): Promise<void>;
22
+ count(): Promise<number>;
23
+ close(): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=lancedb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lancedb.d.ts","sourceRoot":"","sources":["../../src/vector/lancedb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,qBAAa,YAAa,YAAW,WAAW;IAC9C,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAK1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkBpF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IASxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -0,0 +1,93 @@
1
+ import { logger } from '../logging.js';
2
+ export class LanceDBStore {
3
+ db = null;
4
+ table = null;
5
+ uri;
6
+ dims;
7
+ tableName = 'chunks';
8
+ initialized = false;
9
+ constructor(indexDir, dimensions) {
10
+ this.uri = indexDir;
11
+ this.dims = dimensions;
12
+ }
13
+ async init() {
14
+ if (this.initialized)
15
+ return;
16
+ const mod = await import('@lancedb/lancedb');
17
+ this.db = await mod.connect(this.uri);
18
+ const tableNames = await this.db.tableNames();
19
+ if (tableNames.includes(this.tableName)) {
20
+ this.table = await this.db.openTable(this.tableName);
21
+ }
22
+ else {
23
+ this.table = await this.db.createTable(this.tableName, [
24
+ { id: '', vector: new Array(this.dims).fill(0), metadata: {} },
25
+ ]);
26
+ }
27
+ this.initialized = true;
28
+ }
29
+ async insert(vectors) {
30
+ await this.init();
31
+ const data = vectors.map(v => ({
32
+ id: v.id,
33
+ vector: v.values,
34
+ metadata: { ...v.metadata, text: v.metadata.text || '' },
35
+ }));
36
+ await this.table.add(data);
37
+ }
38
+ async delete(ids) {
39
+ await this.init();
40
+ for (const id of ids) {
41
+ try {
42
+ await this.table.delete(`id = '${id.replace(/'/g, "''")}'`);
43
+ }
44
+ catch (e) {
45
+ logger.debug(`Failed to delete vector ${id}:`, e);
46
+ }
47
+ }
48
+ }
49
+ async search(query, topK) {
50
+ await this.init();
51
+ try {
52
+ const results = await this.table
53
+ .vectorSearch(query)
54
+ .limit(topK)
55
+ .toArray();
56
+ return results.map((r) => ({
57
+ id: r.id,
58
+ score: r._distance !== undefined ? 1 / (1 + r._distance) : 1,
59
+ }));
60
+ }
61
+ catch (e) {
62
+ logger.debug('Vector search failed:', e);
63
+ return [];
64
+ }
65
+ }
66
+ async compact() {
67
+ await this.init();
68
+ try {
69
+ await this.table.compact();
70
+ }
71
+ catch (e) {
72
+ logger.debug('Compact failed:', e);
73
+ }
74
+ }
75
+ async count() {
76
+ await this.init();
77
+ try {
78
+ return await this.table.countRows();
79
+ }
80
+ catch {
81
+ return 0;
82
+ }
83
+ }
84
+ async close() {
85
+ if (this.db) {
86
+ try {
87
+ await this.db.close();
88
+ }
89
+ catch { /* ignore */ }
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=lancedb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lancedb.js","sourceRoot":"","sources":["../../src/vector/lancedb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface VectorStore {
2
+ insert(vectors: Array<{
3
+ id: string;
4
+ values: number[];
5
+ metadata: Record<string, any>;
6
+ }>): Promise<void>;
7
+ delete(ids: string[]): Promise<void>;
8
+ search(query: number[], topK: number): Promise<Array<{
9
+ id: string;
10
+ score: number;
11
+ }>>;
12
+ compact(): Promise<void>;
13
+ count(): Promise<number>;
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/vector/store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export interface IndexVersion {
2
+ schema: number;
3
+ embeddingModel: string;
4
+ chunkStrategy: number;
5
+ createdAt: string;
6
+ lastIndexed: string;
7
+ }
8
+ export declare function getExpectedVersion(embeddingModelName: string): IndexVersion;
9
+ export declare function loadVersion(indexDir: string): IndexVersion | null;
10
+ export declare function saveVersion(indexDir: string, version: IndexVersion): void;
11
+ export declare function needsRebuild(existing: IndexVersion | null, embeddingModel: string): boolean;
12
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,GAAG,YAAY,CAQ3E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUjE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,QAMlE;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,GAAG,IAAI,EAC7B,cAAc,EAAE,MAAM,GACrB,OAAO,CAMT"}
@@ -0,0 +1,46 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { logger } from './logging.js';
4
+ const CURRENT_SCHEMA = 1;
5
+ const CURRENT_CHUNK_STRATEGY = 1;
6
+ export function getExpectedVersion(embeddingModelName) {
7
+ return {
8
+ schema: CURRENT_SCHEMA,
9
+ embeddingModel: embeddingModelName,
10
+ chunkStrategy: CURRENT_CHUNK_STRATEGY,
11
+ createdAt: new Date().toISOString(),
12
+ lastIndexed: new Date().toISOString(),
13
+ };
14
+ }
15
+ export function loadVersion(indexDir) {
16
+ const path = join(indexDir, 'version.json');
17
+ if (!existsSync(path))
18
+ return null;
19
+ try {
20
+ const raw = readFileSync(path, 'utf-8');
21
+ return JSON.parse(raw);
22
+ }
23
+ catch (e) {
24
+ logger.debug('Failed to load version.json:', e);
25
+ return null;
26
+ }
27
+ }
28
+ export function saveVersion(indexDir, version) {
29
+ const path = join(indexDir, 'version.json');
30
+ if (!existsSync(indexDir)) {
31
+ mkdirSync(indexDir, { recursive: true });
32
+ }
33
+ writeFileSync(path, JSON.stringify(version, null, 2), 'utf-8');
34
+ }
35
+ export function needsRebuild(existing, embeddingModel) {
36
+ if (!existing)
37
+ return true;
38
+ if (existing.schema !== CURRENT_SCHEMA)
39
+ return true;
40
+ if (existing.embeddingModel !== embeddingModel)
41
+ return true;
42
+ if (existing.chunkStrategy !== CURRENT_CHUNK_STRATEGY)
43
+ return true;
44
+ return false;
45
+ }
46
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAUtC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,UAAU,kBAAkB,CAAC,kBAA0B;IAC3D,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,sBAAsB;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAqB;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAA6B,EAC7B,cAAsB;IAEtB,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,QAAQ,CAAC,cAAc,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAC5D,IAAI,QAAQ,CAAC,aAAa,KAAK,sBAAsB;QAAE,OAAO,IAAI,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ type ChangeHandler = (filePath: string) => Promise<void>;
2
+ export declare class FileWatcher {
3
+ private watcher;
4
+ private rootPath;
5
+ private onFileChange;
6
+ private timeoutId;
7
+ private pending;
8
+ private debounceMs;
9
+ constructor(rootPath: string, onChange: ChangeHandler, debounceMs?: number);
10
+ start(): Promise<void>;
11
+ private queueChange;
12
+ stop(): Promise<void>;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAIA,KAAK,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAS;gBAEf,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,SAAM;IAMjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,OAAO,CAAC,WAAW;IAwBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
@@ -0,0 +1,65 @@
1
+ import { relative } from 'node:path';
2
+ import { logger } from '../logging.js';
3
+ export class FileWatcher {
4
+ watcher = null;
5
+ rootPath;
6
+ onFileChange;
7
+ timeoutId = null;
8
+ pending = new Set();
9
+ debounceMs;
10
+ constructor(rootPath, onChange, debounceMs = 300) {
11
+ this.rootPath = rootPath;
12
+ this.onFileChange = onChange;
13
+ this.debounceMs = debounceMs;
14
+ }
15
+ async start() {
16
+ const chokidar = await import('chokidar');
17
+ const { createIgnoreRules } = await import('../indexer/ignore.js');
18
+ const ignore = createIgnoreRules(this.rootPath);
19
+ this.watcher = chokidar.watch(this.rootPath, {
20
+ ignored: (path) => {
21
+ const rel = relative(this.rootPath, path).replace(/\\/g, '/');
22
+ return ignore.isIgnored(rel);
23
+ },
24
+ persistent: true,
25
+ ignoreInitial: true,
26
+ depth: 99,
27
+ });
28
+ this.watcher.on('change', (path) => this.queueChange(path));
29
+ this.watcher.on('add', (path) => this.queueChange(path));
30
+ this.watcher.on('unlink', (path) => this.queueChange(path));
31
+ logger.info('File watcher started');
32
+ }
33
+ queueChange(filePath) {
34
+ const rel = relative(this.rootPath, filePath).replace(/\\/g, '/');
35
+ this.pending.add(rel);
36
+ if (this.timeoutId) {
37
+ clearTimeout(this.timeoutId);
38
+ }
39
+ this.timeoutId = setTimeout(async () => {
40
+ const batch = Array.from(this.pending);
41
+ this.pending.clear();
42
+ this.timeoutId = null;
43
+ for (const file of batch) {
44
+ try {
45
+ logger.debug(`File changed: ${file}`);
46
+ await this.onFileChange(file);
47
+ }
48
+ catch (e) {
49
+ logger.debug(`Failed to handle file change ${file}:`, e);
50
+ }
51
+ }
52
+ }, this.debounceMs);
53
+ }
54
+ async stop() {
55
+ if (this.timeoutId) {
56
+ clearTimeout(this.timeoutId);
57
+ this.timeoutId = null;
58
+ }
59
+ if (this.watcher) {
60
+ await this.watcher.close();
61
+ this.watcher = null;
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvC,MAAM,OAAO,WAAW;IACd,OAAO,GAAQ,IAAI,CAAC;IACpB,QAAQ,CAAS;IACjB,YAAY,CAAgB;IAC5B,SAAS,GAAQ,IAAI,CAAC;IACtB,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5B,UAAU,CAAS;IAE3B,YAAY,QAAgB,EAAE,QAAuB,EAAE,UAAU,GAAG,GAAG;QACrE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3C,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC9D,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAEO,WAAW,CAAC,QAAgB;QAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;oBACtC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}