edhindex 1.0.0 → 1.0.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 (199) hide show
  1. package/README.md +101 -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 +9 -3
  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,95 @@
1
+ import { searchBM25 } from './bm25.js';
2
+ import { rerankResults } from './reranker.js';
3
+ import { logger } from '../logging.js';
4
+ const BM25_TOP_K = 30;
5
+ const VECTOR_TOP_K = 30;
6
+ export class SearchEngine {
7
+ fts;
8
+ metadata;
9
+ vectors;
10
+ embedder;
11
+ reranker;
12
+ useRerank;
13
+ constructor(fts, metadata, vectors, embedder, reranker, useRerank) {
14
+ this.fts = fts;
15
+ this.metadata = metadata;
16
+ this.vectors = vectors;
17
+ this.embedder = embedder;
18
+ this.reranker = reranker;
19
+ this.useRerank = useRerank;
20
+ }
21
+ async search(opts) {
22
+ const maxResults = opts.maxResults || 10;
23
+ const query = opts.query.trim();
24
+ if (!query)
25
+ return [];
26
+ // Normalize query
27
+ const normalized = query.replace(/\s+/g, ' ').trim();
28
+ // BM25
29
+ const bm25Results = searchBM25(this.fts, normalized, BM25_TOP_K);
30
+ logger.debug(`BM25 returned ${bm25Results.length} results`);
31
+ // Vector search
32
+ let vectorResults = [];
33
+ try {
34
+ const embedding = await this.embedder.embed([normalized]);
35
+ if (embedding.length > 0 && embedding[0].length > 0) {
36
+ vectorResults = await this.vectors.search(embedding[0], VECTOR_TOP_K);
37
+ }
38
+ }
39
+ catch (e) {
40
+ logger.debug('Vector search failed:', e);
41
+ }
42
+ logger.debug(`Vector search returned ${vectorResults.length} results`);
43
+ // Merge and deduplicate
44
+ const seen = new Set();
45
+ const merged = [];
46
+ for (const r of bm25Results) {
47
+ if (!seen.has(r.id)) {
48
+ seen.add(r.id);
49
+ merged.push(r);
50
+ }
51
+ }
52
+ for (const r of vectorResults) {
53
+ if (!seen.has(r.id)) {
54
+ seen.add(r.id);
55
+ merged.push({ id: r.id, score: r.score * 0.8 });
56
+ }
57
+ else {
58
+ const existing = merged.find(m => m.id === r.id);
59
+ if (existing) {
60
+ existing.score = Math.max(existing.score, r.score);
61
+ }
62
+ }
63
+ }
64
+ logger.debug(`Merged ${merged.length} unique results`);
65
+ // Rerank
66
+ const reranked = await rerankResults(normalized, merged, this.metadata, this.reranker, maxResults, this.useRerank);
67
+ // Build final results
68
+ const results = [];
69
+ for (const r of reranked) {
70
+ if (!r.metadata)
71
+ continue;
72
+ let matchType = 'hybrid';
73
+ const inBM25 = bm25Results.some(b => b.id === r.id);
74
+ const inVector = vectorResults.some(v => v.id === r.id);
75
+ if (inBM25 && !inVector)
76
+ matchType = 'keyword';
77
+ else if (!inBM25 && inVector)
78
+ matchType = 'vector';
79
+ results.push({
80
+ id: r.id,
81
+ file: r.metadata.file,
82
+ language: r.metadata.language,
83
+ symbol: r.metadata.symbol,
84
+ kind: r.metadata.kind,
85
+ startLine: r.metadata.start_line,
86
+ endLine: r.metadata.end_line,
87
+ content: r.metadata.imports + '\n' + r.metadata.exports,
88
+ score: r.score,
89
+ matchType,
90
+ });
91
+ }
92
+ return results.slice(0, maxResults);
93
+ }
94
+ }
95
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/retrieval/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function isSubPath(parent: string, child: string): boolean;
2
+ export declare function sanitizePath(root: string, requestedPath: string): string | null;
3
+ export declare function resolveSafePath(root: string, requestedPath: string): string | null;
4
+ export declare function checkSymlinkSafety(root: string, targetPath: string): boolean;
5
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGhE;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS/E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAalF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
@@ -0,0 +1,42 @@
1
+ import { realpathSync } from 'node:fs';
2
+ import { resolve, relative, normalize, sep } from 'node:path';
3
+ export function isSubPath(parent, child) {
4
+ const rel = relative(parent, child);
5
+ return !rel.startsWith('..') && !isAbsolutePath(rel);
6
+ }
7
+ function isAbsolutePath(p) {
8
+ return sep === '/' ? p.startsWith('/') : /^[a-zA-Z]:[/\\]/.test(p);
9
+ }
10
+ export function sanitizePath(root, requestedPath) {
11
+ const resolved = resolve(root, requestedPath);
12
+ const normalized = normalize(resolved);
13
+ if (!isSubPath(root, normalized)) {
14
+ return null;
15
+ }
16
+ return normalized;
17
+ }
18
+ export function resolveSafePath(root, requestedPath) {
19
+ const sanitized = sanitizePath(root, requestedPath);
20
+ if (!sanitized)
21
+ return null;
22
+ try {
23
+ const real = realpathSync(sanitized);
24
+ if (!isSubPath(root, real)) {
25
+ return null;
26
+ }
27
+ return real;
28
+ }
29
+ catch {
30
+ return sanitized;
31
+ }
32
+ }
33
+ export function checkSymlinkSafety(root, targetPath) {
34
+ try {
35
+ const real = realpathSync(targetPath);
36
+ return isSubPath(root, real);
37
+ }
38
+ catch {
39
+ return true;
40
+ }
41
+ }
42
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,KAAa;IACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,aAAqB;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,aAAqB;IACjE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACtC,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface FTSResult {
2
+ id: string;
3
+ rank: number;
4
+ content: string;
5
+ file: string;
6
+ symbol: string;
7
+ kind: string | null;
8
+ start_line: number;
9
+ end_line: number;
10
+ language: string;
11
+ }
12
+ export declare class FTSStore {
13
+ private db;
14
+ private path;
15
+ constructor(indexDir: string);
16
+ private createSchema;
17
+ beginTransaction(): void;
18
+ commit(): void;
19
+ rollback(): void;
20
+ insertChunk(id: string, content: string, file: string, symbol: string, language: string): void;
21
+ deleteChunk(id: string): void;
22
+ deleteChunksForFile(filePath: string): void;
23
+ search(query: string, limit: number): FTSResult[];
24
+ searchWithRank(query: string, limit: number): Array<{
25
+ id: string;
26
+ rank: number;
27
+ }>;
28
+ close(): void;
29
+ }
30
+ //# sourceMappingURL=fts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/storage/fts.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,IAAI,CAAS;gBAET,QAAQ,EAAE,MAAM;IAM5B,OAAO,CAAC,YAAY;IAgBpB,gBAAgB;IAIhB,MAAM;IAIN,QAAQ;IAIR,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAgBvF,WAAW,CAAC,EAAE,EAAE,MAAM;IAItB,mBAAmB,CAAC,QAAQ,EAAE,MAAM;IAIpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IA8BjD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBjF,KAAK;CAGN"}
@@ -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":""}