@matperez/coderag 0.1.24

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 (147) hide show
  1. package/README.md +154 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/ast-chunking.d.ts +40 -0
  4. package/dist/ast-chunking.d.ts.map +1 -0
  5. package/dist/ast-chunking.js +88 -0
  6. package/dist/ast-chunking.js.map +1 -0
  7. package/dist/ast-chunking.test.d.ts +5 -0
  8. package/dist/ast-chunking.test.d.ts.map +1 -0
  9. package/dist/ast-chunking.test.js +173 -0
  10. package/dist/ast-chunking.test.js.map +1 -0
  11. package/dist/code-tokenizer.d.ts +62 -0
  12. package/dist/code-tokenizer.d.ts.map +1 -0
  13. package/dist/code-tokenizer.js +129 -0
  14. package/dist/code-tokenizer.js.map +1 -0
  15. package/dist/code-tokenizer.test.d.ts +5 -0
  16. package/dist/code-tokenizer.test.d.ts.map +1 -0
  17. package/dist/code-tokenizer.test.js +96 -0
  18. package/dist/code-tokenizer.test.js.map +1 -0
  19. package/dist/db/client-pg.d.ts +16 -0
  20. package/dist/db/client-pg.d.ts.map +1 -0
  21. package/dist/db/client-pg.js +38 -0
  22. package/dist/db/client-pg.js.map +1 -0
  23. package/dist/db/client.d.ts +36 -0
  24. package/dist/db/client.d.ts.map +1 -0
  25. package/dist/db/client.js +81 -0
  26. package/dist/db/client.js.map +1 -0
  27. package/dist/db/migrations-pg.d.ts +6 -0
  28. package/dist/db/migrations-pg.d.ts.map +1 -0
  29. package/dist/db/migrations-pg.js +88 -0
  30. package/dist/db/migrations-pg.js.map +1 -0
  31. package/dist/db/migrations.d.ts +9 -0
  32. package/dist/db/migrations.d.ts.map +1 -0
  33. package/dist/db/migrations.js +164 -0
  34. package/dist/db/migrations.js.map +1 -0
  35. package/dist/db/schema-pg.d.ts +611 -0
  36. package/dist/db/schema-pg.d.ts.map +1 -0
  37. package/dist/db/schema-pg.js +66 -0
  38. package/dist/db/schema-pg.js.map +1 -0
  39. package/dist/db/schema.d.ts +630 -0
  40. package/dist/db/schema.d.ts.map +1 -0
  41. package/dist/db/schema.js +85 -0
  42. package/dist/db/schema.js.map +1 -0
  43. package/dist/embeddings.d.ts +92 -0
  44. package/dist/embeddings.d.ts.map +1 -0
  45. package/dist/embeddings.js +275 -0
  46. package/dist/embeddings.js.map +1 -0
  47. package/dist/embeddings.test.d.ts +5 -0
  48. package/dist/embeddings.test.d.ts.map +1 -0
  49. package/dist/embeddings.test.js +255 -0
  50. package/dist/embeddings.test.js.map +1 -0
  51. package/dist/hybrid-search.d.ts +47 -0
  52. package/dist/hybrid-search.d.ts.map +1 -0
  53. package/dist/hybrid-search.js +215 -0
  54. package/dist/hybrid-search.js.map +1 -0
  55. package/dist/hybrid-search.test.d.ts +5 -0
  56. package/dist/hybrid-search.test.d.ts.map +1 -0
  57. package/dist/hybrid-search.test.js +252 -0
  58. package/dist/hybrid-search.test.js.map +1 -0
  59. package/dist/incremental-tfidf.d.ts +77 -0
  60. package/dist/incremental-tfidf.d.ts.map +1 -0
  61. package/dist/incremental-tfidf.js +248 -0
  62. package/dist/incremental-tfidf.js.map +1 -0
  63. package/dist/incremental-tfidf.test.d.ts +5 -0
  64. package/dist/incremental-tfidf.test.d.ts.map +1 -0
  65. package/dist/incremental-tfidf.test.js +276 -0
  66. package/dist/incremental-tfidf.test.js.map +1 -0
  67. package/dist/index.d.ts +18 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +19 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/indexer.d.ts +205 -0
  72. package/dist/indexer.d.ts.map +1 -0
  73. package/dist/indexer.js +1331 -0
  74. package/dist/indexer.js.map +1 -0
  75. package/dist/indexer.test.d.ts +12 -0
  76. package/dist/indexer.test.d.ts.map +1 -0
  77. package/dist/indexer.test.js +471 -0
  78. package/dist/indexer.test.js.map +1 -0
  79. package/dist/language-config.d.ts +54 -0
  80. package/dist/language-config.d.ts.map +1 -0
  81. package/dist/language-config.js +75 -0
  82. package/dist/language-config.js.map +1 -0
  83. package/dist/search-cache.d.ts +63 -0
  84. package/dist/search-cache.d.ts.map +1 -0
  85. package/dist/search-cache.js +118 -0
  86. package/dist/search-cache.js.map +1 -0
  87. package/dist/search-cache.test.d.ts +5 -0
  88. package/dist/search-cache.test.d.ts.map +1 -0
  89. package/dist/search-cache.test.js +194 -0
  90. package/dist/search-cache.test.js.map +1 -0
  91. package/dist/storage-factory.d.ts +11 -0
  92. package/dist/storage-factory.d.ts.map +1 -0
  93. package/dist/storage-factory.js +17 -0
  94. package/dist/storage-factory.js.map +1 -0
  95. package/dist/storage-persistent-pg.d.ts +75 -0
  96. package/dist/storage-persistent-pg.d.ts.map +1 -0
  97. package/dist/storage-persistent-pg.js +579 -0
  98. package/dist/storage-persistent-pg.js.map +1 -0
  99. package/dist/storage-persistent-pg.test.d.ts +7 -0
  100. package/dist/storage-persistent-pg.test.d.ts.map +1 -0
  101. package/dist/storage-persistent-pg.test.js +90 -0
  102. package/dist/storage-persistent-pg.test.js.map +1 -0
  103. package/dist/storage-persistent-types.d.ts +110 -0
  104. package/dist/storage-persistent-types.d.ts.map +1 -0
  105. package/dist/storage-persistent-types.js +5 -0
  106. package/dist/storage-persistent-types.js.map +1 -0
  107. package/dist/storage-persistent.d.ts +231 -0
  108. package/dist/storage-persistent.d.ts.map +1 -0
  109. package/dist/storage-persistent.js +897 -0
  110. package/dist/storage-persistent.js.map +1 -0
  111. package/dist/storage-persistent.test.d.ts +5 -0
  112. package/dist/storage-persistent.test.d.ts.map +1 -0
  113. package/dist/storage-persistent.test.js +325 -0
  114. package/dist/storage-persistent.test.js.map +1 -0
  115. package/dist/storage.d.ts +63 -0
  116. package/dist/storage.d.ts.map +1 -0
  117. package/dist/storage.js +67 -0
  118. package/dist/storage.js.map +1 -0
  119. package/dist/storage.test.d.ts +5 -0
  120. package/dist/storage.test.d.ts.map +1 -0
  121. package/dist/storage.test.js +157 -0
  122. package/dist/storage.test.js.map +1 -0
  123. package/dist/tfidf.d.ts +97 -0
  124. package/dist/tfidf.d.ts.map +1 -0
  125. package/dist/tfidf.js +308 -0
  126. package/dist/tfidf.js.map +1 -0
  127. package/dist/tfidf.test.d.ts +5 -0
  128. package/dist/tfidf.test.d.ts.map +1 -0
  129. package/dist/tfidf.test.js +181 -0
  130. package/dist/tfidf.test.js.map +1 -0
  131. package/dist/utils.d.ts +61 -0
  132. package/dist/utils.d.ts.map +1 -0
  133. package/dist/utils.js +264 -0
  134. package/dist/utils.js.map +1 -0
  135. package/dist/utils.test.d.ts +5 -0
  136. package/dist/utils.test.d.ts.map +1 -0
  137. package/dist/utils.test.js +94 -0
  138. package/dist/utils.test.js.map +1 -0
  139. package/dist/vector-storage.d.ts +120 -0
  140. package/dist/vector-storage.d.ts.map +1 -0
  141. package/dist/vector-storage.js +264 -0
  142. package/dist/vector-storage.js.map +1 -0
  143. package/dist/vector-storage.test.d.ts +5 -0
  144. package/dist/vector-storage.test.d.ts.map +1 -0
  145. package/dist/vector-storage.test.js +345 -0
  146. package/dist/vector-storage.test.js.map +1 -0
  147. package/package.json +85 -0
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Tests for Embedding utilities
3
+ */
4
+ import { beforeEach, describe, expect, it } from 'vitest';
5
+ import { chunkText, composeProviders, cosineSimilarity, createDefaultConfig, createMockProvider, generateMockEmbedding, normalizeVector, } from './embeddings.js';
6
+ describe('generateMockEmbedding', () => {
7
+ it('should generate embedding of correct dimensions', () => {
8
+ const embedding = generateMockEmbedding('test text', 128);
9
+ expect(embedding).toHaveLength(128);
10
+ });
11
+ it('should generate normalized vectors (magnitude = 1)', () => {
12
+ const embedding = generateMockEmbedding('test', 512);
13
+ const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
14
+ expect(magnitude).toBeCloseTo(1, 10);
15
+ });
16
+ it('should be deterministic for same input', () => {
17
+ const embedding1 = generateMockEmbedding('hello world', 256);
18
+ const embedding2 = generateMockEmbedding('hello world', 256);
19
+ for (let i = 0; i < embedding1.length; i++) {
20
+ expect(embedding1[i]).toBe(embedding2[i]);
21
+ }
22
+ });
23
+ it('should generate different embeddings for different text', () => {
24
+ const embedding1 = generateMockEmbedding('hello', 256);
25
+ const embedding2 = generateMockEmbedding('world', 256);
26
+ // Embeddings should be different
27
+ let different = false;
28
+ for (let i = 0; i < embedding1.length; i++) {
29
+ if (embedding1[i] !== embedding2[i]) {
30
+ different = true;
31
+ break;
32
+ }
33
+ }
34
+ expect(different).toBe(true);
35
+ });
36
+ });
37
+ describe('createMockProvider', () => {
38
+ let provider;
39
+ beforeEach(() => {
40
+ provider = createMockProvider(128);
41
+ });
42
+ it('should create provider with correct config', () => {
43
+ expect(provider.name).toBe('mock');
44
+ expect(provider.model).toBe('mock');
45
+ expect(provider.dimensions).toBe(128);
46
+ });
47
+ it('should generate single embedding', async () => {
48
+ const embedding = await provider.generateEmbedding('test text');
49
+ expect(embedding).toHaveLength(128);
50
+ });
51
+ it('should generate multiple embeddings', async () => {
52
+ const embeddings = await provider.generateEmbeddings(['text1', 'text2', 'text3']);
53
+ expect(embeddings).toHaveLength(3);
54
+ expect(embeddings[0]).toHaveLength(128);
55
+ expect(embeddings[1]).toHaveLength(128);
56
+ expect(embeddings[2]).toHaveLength(128);
57
+ });
58
+ it('should generate consistent embeddings', async () => {
59
+ const embedding1 = await provider.generateEmbedding('hello');
60
+ const embedding2 = await provider.generateEmbedding('hello');
61
+ for (let i = 0; i < embedding1.length; i++) {
62
+ expect(embedding1[i]).toBe(embedding2[i]);
63
+ }
64
+ });
65
+ });
66
+ describe('createDefaultConfig', () => {
67
+ it('should create config with mock provider when no API key', () => {
68
+ // Save original env
69
+ const originalKey = process.env.OPENAI_API_KEY;
70
+ delete process.env.OPENAI_API_KEY;
71
+ const config = createDefaultConfig();
72
+ expect(config.provider).toBe('mock');
73
+ expect(config.dimensions).toBeGreaterThan(0);
74
+ // Restore env
75
+ if (originalKey) {
76
+ process.env.OPENAI_API_KEY = originalKey;
77
+ }
78
+ });
79
+ it('should use default model and dimensions', () => {
80
+ const config = createDefaultConfig();
81
+ expect(config.model).toBe('text-embedding-3-small');
82
+ expect(config.dimensions).toBe(1536); // Default for text-embedding-3-small
83
+ expect(config.batchSize).toBe(10);
84
+ });
85
+ });
86
+ describe('chunkText', () => {
87
+ it('should chunk text into pieces', () => {
88
+ const text = 'a'.repeat(2500);
89
+ const chunks = chunkText(text, { maxChunkSize: 1000, overlap: 0 });
90
+ expect(chunks.length).toBe(3);
91
+ expect(chunks[0].length).toBe(1000);
92
+ expect(chunks[1].length).toBe(1000);
93
+ expect(chunks[2].length).toBe(500);
94
+ });
95
+ it('should handle text shorter than chunk size', () => {
96
+ const text = 'short text';
97
+ const chunks = chunkText(text, { maxChunkSize: 1000 });
98
+ expect(chunks.length).toBe(1);
99
+ expect(chunks[0]).toBe(text);
100
+ });
101
+ it('should use default chunk size', () => {
102
+ const text = 'a'.repeat(1500);
103
+ const chunks = chunkText(text);
104
+ expect(chunks.length).toBeGreaterThan(1);
105
+ });
106
+ it('should create overlapping chunks', () => {
107
+ const text = 'a'.repeat(250);
108
+ const chunks = chunkText(text, { maxChunkSize: 100, overlap: 20 });
109
+ expect(chunks.length).toBeGreaterThan(2);
110
+ // Check overlap (last 20 chars of chunk[0] should match first 20 of chunk[1])
111
+ const chunk0End = chunks[0].slice(-20);
112
+ const chunk1Start = chunks[1].slice(0, 20);
113
+ expect(chunk0End).toBe(chunk1Start);
114
+ });
115
+ it('should handle empty text', () => {
116
+ const chunks = chunkText('');
117
+ expect(chunks.length).toBe(0);
118
+ });
119
+ });
120
+ describe('cosineSimilarity', () => {
121
+ it('should calculate similarity of identical vectors as 1', () => {
122
+ const vec = [1, 2, 3, 4];
123
+ const similarity = cosineSimilarity(vec, vec);
124
+ expect(similarity).toBeCloseTo(1, 10);
125
+ });
126
+ it('should calculate similarity of orthogonal vectors as 0', () => {
127
+ const vec1 = [1, 0];
128
+ const vec2 = [0, 1];
129
+ const similarity = cosineSimilarity(vec1, vec2);
130
+ expect(similarity).toBeCloseTo(0, 10);
131
+ });
132
+ it('should calculate similarity of opposite vectors as -1', () => {
133
+ const vec1 = [1, 2, 3];
134
+ const vec2 = [-1, -2, -3];
135
+ const similarity = cosineSimilarity(vec1, vec2);
136
+ expect(similarity).toBeCloseTo(-1, 10);
137
+ });
138
+ it('should handle similar vectors', () => {
139
+ const vec1 = [1, 2, 3];
140
+ const vec2 = [1, 2, 4];
141
+ const similarity = cosineSimilarity(vec1, vec2);
142
+ expect(similarity).toBeGreaterThan(0.9);
143
+ expect(similarity).toBeLessThan(1);
144
+ });
145
+ it('should handle zero vectors', () => {
146
+ const vec1 = [0, 0, 0];
147
+ const vec2 = [1, 2, 3];
148
+ const similarity = cosineSimilarity(vec1, vec2);
149
+ expect(similarity).toBe(0);
150
+ });
151
+ it('should throw error for mismatched dimensions', () => {
152
+ const vec1 = [1, 2, 3];
153
+ const vec2 = [1, 2];
154
+ expect(() => cosineSimilarity(vec1, vec2)).toThrow();
155
+ });
156
+ it('should be symmetric', () => {
157
+ const vec1 = [1, 2, 3];
158
+ const vec2 = [4, 5, 6];
159
+ const sim1 = cosineSimilarity(vec1, vec2);
160
+ const sim2 = cosineSimilarity(vec2, vec1);
161
+ expect(sim1).toBeCloseTo(sim2, 10);
162
+ });
163
+ });
164
+ describe('normalizeVector', () => {
165
+ it('should normalize vector to unit length', () => {
166
+ const vec = [3, 4]; // Length 5
167
+ const normalized = normalizeVector(vec);
168
+ const magnitude = Math.sqrt(normalized.reduce((sum, val) => sum + val * val, 0));
169
+ expect(magnitude).toBeCloseTo(1, 10);
170
+ });
171
+ it('should maintain direction', () => {
172
+ const vec = [3, 4];
173
+ const normalized = normalizeVector(vec);
174
+ // Direction should be maintained (ratios should be same)
175
+ expect(normalized[0] / normalized[1]).toBeCloseTo(vec[0] / vec[1], 10);
176
+ });
177
+ it('should handle zero vector', () => {
178
+ const vec = [0, 0, 0];
179
+ const normalized = normalizeVector(vec);
180
+ expect(normalized).toEqual(vec);
181
+ });
182
+ it('should handle already normalized vector', () => {
183
+ const vec = [0.6, 0.8]; // Already unit length
184
+ const normalized = normalizeVector(vec);
185
+ expect(normalized[0]).toBeCloseTo(0.6, 10);
186
+ expect(normalized[1]).toBeCloseTo(0.8, 10);
187
+ });
188
+ });
189
+ describe('composeProviders', () => {
190
+ it('should use primary provider when available', async () => {
191
+ const primary = createMockProvider(128);
192
+ const fallback = createMockProvider(256);
193
+ const composed = composeProviders(primary, fallback);
194
+ const embedding = await composed.generateEmbedding('test');
195
+ expect(embedding).toHaveLength(128); // Should use primary dimensions
196
+ });
197
+ it('should have combined name', () => {
198
+ const primary = createMockProvider(128);
199
+ const fallback = createMockProvider(256);
200
+ const composed = composeProviders(primary, fallback);
201
+ expect(composed.name).toBe('mock+mock');
202
+ });
203
+ it('should fallback when primary fails', async () => {
204
+ const failingProvider = {
205
+ name: 'failing',
206
+ model: 'test',
207
+ dimensions: 128,
208
+ generateEmbedding: async () => {
209
+ throw new Error('Provider failed');
210
+ },
211
+ generateEmbeddings: async () => {
212
+ throw new Error('Provider failed');
213
+ },
214
+ };
215
+ const fallback = createMockProvider(256);
216
+ const composed = composeProviders(failingProvider, fallback);
217
+ const embedding = await composed.generateEmbedding('test');
218
+ expect(embedding).toHaveLength(256); // Should use fallback dimensions
219
+ });
220
+ it('should fallback for batch generation', async () => {
221
+ const failingProvider = {
222
+ name: 'failing',
223
+ model: 'test',
224
+ dimensions: 128,
225
+ generateEmbedding: async () => {
226
+ throw new Error('Provider failed');
227
+ },
228
+ generateEmbeddings: async () => {
229
+ throw new Error('Provider failed');
230
+ },
231
+ };
232
+ const fallback = createMockProvider(256);
233
+ const composed = composeProviders(failingProvider, fallback);
234
+ const embeddings = await composed.generateEmbeddings(['test1', 'test2']);
235
+ expect(embeddings).toHaveLength(2);
236
+ expect(embeddings[0]).toHaveLength(256);
237
+ });
238
+ });
239
+ describe('integration: similarity search', () => {
240
+ it('should find similar texts', async () => {
241
+ const provider = createMockProvider(256);
242
+ const texts = ['apple fruit', 'banana fruit', 'car vehicle', 'truck vehicle'];
243
+ const embeddings = await provider.generateEmbeddings(texts);
244
+ // Similarity between fruits
245
+ const fruitSim = cosineSimilarity(embeddings[0], embeddings[1]);
246
+ // Similarity between vehicles
247
+ const vehicleSim = cosineSimilarity(embeddings[2], embeddings[3]);
248
+ // Similarity between fruit and vehicle
249
+ const crossSim = cosineSimilarity(embeddings[0], embeddings[2]);
250
+ // Fruits should be more similar to each other than to vehicles
251
+ expect(fruitSim).toBeGreaterThan(crossSim);
252
+ expect(vehicleSim).toBeGreaterThan(crossSim);
253
+ });
254
+ });
255
+ //# sourceMappingURL=embeddings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.test.js","sourceRoot":"","sources":["../src/embeddings.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Hybrid Search - Combines Vector and TF-IDF Search
3
+ */
4
+ import type { CodebaseIndexer } from './indexer.js';
5
+ /**
6
+ * Hybrid Search Options
7
+ */
8
+ export interface HybridSearchOptions {
9
+ readonly limit?: number;
10
+ readonly minScore?: number;
11
+ readonly vectorWeight?: number;
12
+ readonly includeContent?: boolean;
13
+ readonly fileExtensions?: string[];
14
+ readonly pathFilter?: string;
15
+ readonly excludePaths?: string[];
16
+ }
17
+ /**
18
+ * Hybrid Search Result
19
+ */
20
+ export interface HybridSearchResult {
21
+ readonly path: string;
22
+ readonly score: number;
23
+ readonly method: 'vector' | 'tfidf' | 'hybrid';
24
+ readonly matchedTerms?: string[];
25
+ readonly similarity?: number;
26
+ readonly content?: string;
27
+ readonly chunkType?: string;
28
+ readonly startLine?: number;
29
+ readonly endLine?: number;
30
+ readonly language?: string;
31
+ }
32
+ /**
33
+ * Hybrid search combining vector and TF-IDF
34
+ * Returns weighted combination of both approaches
35
+ */
36
+ export declare function hybridSearch(query: string, indexer: CodebaseIndexer, options?: HybridSearchOptions): Promise<HybridSearchResult[]>;
37
+ /**
38
+ * Semantic search (vector only)
39
+ * Convenience method for pure semantic search
40
+ */
41
+ export declare function semanticSearch(query: string, indexer: CodebaseIndexer, options?: Omit<HybridSearchOptions, 'vectorWeight'>): Promise<HybridSearchResult[]>;
42
+ /**
43
+ * Keyword search (TF-IDF only)
44
+ * Convenience method for pure keyword search
45
+ */
46
+ export declare function keywordSearch(query: string, indexer: CodebaseIndexer, options?: Omit<HybridSearchOptions, 'vectorWeight'>): Promise<HybridSearchResult[]>;
47
+ //# sourceMappingURL=hybrid-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,cAAc,CAAA;AAGjE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAEzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAqH/B;AAsGD;;;GAGG;AACH,wBAAsB,cAAc,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAM,GACrD,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAM,GACrD,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/B"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Hybrid Search - Combines Vector and TF-IDF Search
3
+ */
4
+ /**
5
+ * Hybrid search combining vector and TF-IDF
6
+ * Returns weighted combination of both approaches
7
+ */
8
+ export async function hybridSearch(query, indexer, options = {}) {
9
+ const { limit = 10, minScore = 0.01, vectorWeight = 0.7, includeContent = false } = options;
10
+ const vectorStorage = indexer.getVectorStorage();
11
+ const embeddingProvider = indexer.getEmbeddingProvider();
12
+ // Try hybrid search if vector search is available
13
+ if (vectorStorage && embeddingProvider) {
14
+ try {
15
+ // Pure vector search (skip TF-IDF)
16
+ if (vectorWeight >= 0.99) {
17
+ console.error('[INFO] Using vector search only');
18
+ const queryEmbedding = await embeddingProvider.generateEmbedding(query);
19
+ const vectorResults = await vectorStorage.search(queryEmbedding, {
20
+ k: limit,
21
+ minScore: minScore,
22
+ });
23
+ return vectorResults.map((r) => {
24
+ // Handle both chunk:// and file:// formats
25
+ const id = r.doc.id;
26
+ let path;
27
+ let startLine;
28
+ let endLine;
29
+ if (id.startsWith('chunk://')) {
30
+ // chunk://path:startLine-endLine
31
+ const match = id.match(/^chunk:\/\/(.+):(\d+)-(\d+)$/);
32
+ if (match) {
33
+ path = match[1];
34
+ startLine = parseInt(match[2], 10);
35
+ endLine = parseInt(match[3], 10);
36
+ }
37
+ else {
38
+ path = id.replace('chunk://', '');
39
+ }
40
+ }
41
+ else {
42
+ path = id.replace('file://', '');
43
+ }
44
+ // Extract metadata with type safety
45
+ const meta = r.doc.metadata;
46
+ const metaStartLine = typeof meta.startLine === 'number' ? meta.startLine : undefined;
47
+ const metaEndLine = typeof meta.endLine === 'number' ? meta.endLine : undefined;
48
+ return {
49
+ path,
50
+ score: r.similarity,
51
+ method: 'vector',
52
+ similarity: r.similarity,
53
+ content: meta.content,
54
+ language: meta.language,
55
+ chunkType: typeof meta.chunkType === 'string' ? meta.chunkType : undefined,
56
+ startLine: startLine ?? metaStartLine,
57
+ endLine: endLine ?? metaEndLine,
58
+ };
59
+ });
60
+ }
61
+ // Pure TF-IDF search (skip vector)
62
+ if (vectorWeight <= 0.01) {
63
+ console.error('[INFO] Using TF-IDF search only');
64
+ const results = await indexer.search(query, { limit, includeContent });
65
+ return results.map((r) => ({
66
+ path: r.path,
67
+ score: r.score,
68
+ method: 'tfidf',
69
+ matchedTerms: r.matchedTerms,
70
+ content: r.snippet,
71
+ language: r.language,
72
+ chunkType: r.chunkType,
73
+ startLine: r.startLine,
74
+ endLine: r.endLine,
75
+ }));
76
+ }
77
+ // Hybrid search
78
+ console.error('[INFO] Using hybrid search (vector + TF-IDF)');
79
+ // 1. Vector search
80
+ const queryEmbedding = await embeddingProvider.generateEmbedding(query);
81
+ const vectorResults = await vectorStorage.search(queryEmbedding, {
82
+ k: limit * 2, // Get more for merging
83
+ minScore: 0, // Get all results for merging
84
+ });
85
+ // 2. TF-IDF search
86
+ const tfidfResults = await indexer.search(query, {
87
+ limit: limit * 2,
88
+ includeContent,
89
+ });
90
+ // 3. Merge results
91
+ const merged = mergeSearchResults(vectorResults, tfidfResults, vectorWeight);
92
+ // 4. Filter and limit
93
+ return merged.filter((r) => r.score >= minScore).slice(0, limit);
94
+ }
95
+ catch (error) {
96
+ console.error('[WARN] Hybrid search failed, falling back to TF-IDF:', error);
97
+ }
98
+ }
99
+ // Fallback to TF-IDF only
100
+ console.error('[INFO] Using TF-IDF search only');
101
+ const results = await indexer.search(query, { limit, includeContent });
102
+ return results.map((r) => ({
103
+ path: r.path,
104
+ score: r.score,
105
+ method: 'tfidf',
106
+ matchedTerms: r.matchedTerms,
107
+ content: r.snippet,
108
+ language: r.language,
109
+ chunkType: r.chunkType,
110
+ startLine: r.startLine,
111
+ endLine: r.endLine,
112
+ }));
113
+ }
114
+ /**
115
+ * Merge vector and TF-IDF results with weighted scoring
116
+ * Now handles chunk-level results
117
+ */
118
+ function mergeSearchResults(vectorResults, tfidfResults, vectorWeight) {
119
+ const resultMap = new Map();
120
+ // Normalize scores to 0-1 range
121
+ const maxVectorScore = Math.max(...vectorResults.map((r) => r.similarity), 0.01);
122
+ const maxTfidfScore = Math.max(...tfidfResults.map((r) => r.score), 0.01);
123
+ // Helper to create a unique key for chunks
124
+ const getChunkKey = (path, startLine, endLine) => startLine && endLine ? `${path}:${startLine}-${endLine}` : path;
125
+ // Add vector results
126
+ for (const result of vectorResults) {
127
+ // Handle both chunk:// and file:// formats
128
+ const id = result.doc.id;
129
+ let path;
130
+ let startLine;
131
+ let endLine;
132
+ if (id.startsWith('chunk://')) {
133
+ const match = id.match(/^chunk:\/\/(.+):(\d+)-(\d+)$/);
134
+ if (match) {
135
+ path = match[1];
136
+ startLine = parseInt(match[2], 10);
137
+ endLine = parseInt(match[3], 10);
138
+ }
139
+ else {
140
+ path = id.replace('chunk://', '');
141
+ }
142
+ }
143
+ else {
144
+ path = id.replace('file://', '');
145
+ }
146
+ // Extract metadata with type safety
147
+ const meta = result.doc.metadata;
148
+ const metaStartLine = typeof meta.startLine === 'number' ? meta.startLine : undefined;
149
+ const metaEndLine = typeof meta.endLine === 'number' ? meta.endLine : undefined;
150
+ const normalizedScore = result.similarity / maxVectorScore;
151
+ const key = getChunkKey(path, startLine, endLine);
152
+ resultMap.set(key, {
153
+ path,
154
+ score: normalizedScore * vectorWeight,
155
+ method: 'vector',
156
+ similarity: result.similarity,
157
+ content: meta.content,
158
+ language: meta.language,
159
+ chunkType: typeof meta.chunkType === 'string' ? meta.chunkType : undefined,
160
+ startLine: startLine ?? metaStartLine,
161
+ endLine: endLine ?? metaEndLine,
162
+ });
163
+ }
164
+ // Add/merge TF-IDF results
165
+ for (const result of tfidfResults) {
166
+ const normalizedScore = result.score / maxTfidfScore;
167
+ const key = getChunkKey(result.path, result.startLine, result.endLine);
168
+ const existing = resultMap.get(key);
169
+ if (existing) {
170
+ // Combine scores (weighted sum) - create new object
171
+ resultMap.set(key, {
172
+ path: result.path,
173
+ score: existing.score + normalizedScore * (1 - vectorWeight),
174
+ method: 'hybrid',
175
+ matchedTerms: result.matchedTerms,
176
+ similarity: existing.similarity,
177
+ content: result.snippet || existing.content,
178
+ language: result.language || existing.language,
179
+ chunkType: result.chunkType || existing.chunkType,
180
+ startLine: result.startLine ?? existing.startLine,
181
+ endLine: result.endLine ?? existing.endLine,
182
+ });
183
+ }
184
+ else {
185
+ resultMap.set(key, {
186
+ path: result.path,
187
+ score: normalizedScore * (1 - vectorWeight),
188
+ method: 'tfidf',
189
+ matchedTerms: result.matchedTerms,
190
+ content: result.snippet,
191
+ language: result.language,
192
+ chunkType: result.chunkType,
193
+ startLine: result.startLine,
194
+ endLine: result.endLine,
195
+ });
196
+ }
197
+ }
198
+ // Sort by combined score
199
+ return Array.from(resultMap.values()).sort((a, b) => b.score - a.score);
200
+ }
201
+ /**
202
+ * Semantic search (vector only)
203
+ * Convenience method for pure semantic search
204
+ */
205
+ export async function semanticSearch(query, indexer, options = {}) {
206
+ return hybridSearch(query, indexer, { ...options, vectorWeight: 1.0 });
207
+ }
208
+ /**
209
+ * Keyword search (TF-IDF only)
210
+ * Convenience method for pure keyword search
211
+ */
212
+ export async function keywordSearch(query, indexer, options = {}) {
213
+ return hybridSearch(query, indexer, { ...options, vectorWeight: 0.0 });
214
+ }
215
+ //# sourceMappingURL=hybrid-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Hybrid Search Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=hybrid-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.test.d.ts","sourceRoot":"","sources":["../src/hybrid-search.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}