@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,252 @@
1
+ /**
2
+ * Hybrid Search Tests
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
7
+ import { createMockProvider } from './embeddings.js';
8
+ import { hybridSearch, keywordSearch, semanticSearch } from './hybrid-search.js';
9
+ import { CodebaseIndexer } from './indexer.js';
10
+ import { MemoryStorage } from './storage.js';
11
+ describe('Hybrid Search', () => {
12
+ let tempDir;
13
+ let indexer;
14
+ let embeddingProvider;
15
+ beforeEach(async () => {
16
+ // Create temporary test directory
17
+ tempDir = `/tmp/hybrid-search-test-${Date.now()}`;
18
+ fs.mkdirSync(tempDir, { recursive: true });
19
+ // Create test files
20
+ const testFiles = [
21
+ {
22
+ name: 'auth.ts',
23
+ content: `
24
+ export function authenticate(username: string, password: string) {
25
+ // User authentication logic
26
+ return validateCredentials(username, password);
27
+ }
28
+
29
+ export function validateCredentials(user: string, pass: string): boolean {
30
+ // Check user credentials
31
+ return true;
32
+ }
33
+ `,
34
+ },
35
+ {
36
+ name: 'database.ts',
37
+ content: `
38
+ export class DatabaseConnection {
39
+ connect() {
40
+ // Database connection logic
41
+ }
42
+
43
+ query(sql: string) {
44
+ // Execute SQL query
45
+ }
46
+ }
47
+ `,
48
+ },
49
+ {
50
+ name: 'api.ts',
51
+ content: `
52
+ export function handleRequest(req: Request) {
53
+ // API request handler
54
+ return processRequest(req);
55
+ }
56
+
57
+ export function processRequest(request: Request) {
58
+ // Process API request
59
+ return { success: true };
60
+ }
61
+ `,
62
+ },
63
+ ];
64
+ for (const file of testFiles) {
65
+ const filePath = path.join(tempDir, file.name);
66
+ fs.writeFileSync(filePath, file.content);
67
+ }
68
+ // Initialize embedding provider
69
+ embeddingProvider = createMockProvider(128);
70
+ // Initialize indexer with embeddings
71
+ indexer = new CodebaseIndexer({
72
+ codebaseRoot: tempDir,
73
+ storage: new MemoryStorage(),
74
+ embeddingProvider,
75
+ });
76
+ // Index the codebase
77
+ await indexer.index();
78
+ });
79
+ afterEach(() => {
80
+ // Clean up temp directory
81
+ if (fs.existsSync(tempDir)) {
82
+ fs.rmSync(tempDir, { recursive: true, force: true });
83
+ }
84
+ });
85
+ describe('hybridSearch', () => {
86
+ it('should combine vector and TF-IDF results', async () => {
87
+ const results = await hybridSearch('authentication', indexer, {
88
+ limit: 5,
89
+ vectorWeight: 0.7,
90
+ });
91
+ expect(results.length).toBeGreaterThan(0);
92
+ expect(results.length).toBeLessThanOrEqual(5);
93
+ // Should have at least one result with hybrid method
94
+ const hasHybrid = results.some((r) => r.method === 'hybrid');
95
+ const hasVector = results.some((r) => r.method === 'vector');
96
+ const hasTfidf = results.some((r) => r.method === 'tfidf');
97
+ // At least one of these should be true
98
+ expect(hasHybrid || hasVector || hasTfidf).toBe(true);
99
+ // All results should have valid scores
100
+ expect(results.every((r) => r.score >= 0)).toBe(true);
101
+ // Results should be sorted by score
102
+ for (let i = 1; i < results.length; i++) {
103
+ expect(results[i - 1].score).toBeGreaterThanOrEqual(results[i].score);
104
+ }
105
+ });
106
+ it('should respect limit parameter', async () => {
107
+ const results = await hybridSearch('function', indexer, { limit: 2 });
108
+ expect(results.length).toBeLessThanOrEqual(2);
109
+ });
110
+ it('should filter by minimum score', async () => {
111
+ const results = await hybridSearch('authentication', indexer, {
112
+ minScore: 0.5,
113
+ });
114
+ expect(results.every((r) => r.score >= 0.5)).toBe(true);
115
+ });
116
+ it('should include content when requested', async () => {
117
+ const results = await hybridSearch('database', indexer, {
118
+ includeContent: true,
119
+ limit: 1,
120
+ });
121
+ if (results.length > 0) {
122
+ expect(results[0].content).toBeDefined();
123
+ expect(typeof results[0].content).toBe('string');
124
+ }
125
+ });
126
+ it('should adjust scores based on vector weight', async () => {
127
+ const highVectorWeight = await hybridSearch('authentication', indexer, {
128
+ vectorWeight: 0.9,
129
+ limit: 5,
130
+ });
131
+ const lowVectorWeight = await hybridSearch('authentication', indexer, {
132
+ vectorWeight: 0.1,
133
+ limit: 5,
134
+ });
135
+ // Both should return results
136
+ expect(highVectorWeight.length).toBeGreaterThan(0);
137
+ expect(lowVectorWeight.length).toBeGreaterThan(0);
138
+ // Scores might differ based on weighting
139
+ // (This is a soft check as exact scores depend on the mock provider)
140
+ });
141
+ it('should fallback to TF-IDF when vector search unavailable', async () => {
142
+ // Create indexer without embeddings
143
+ const simpleIndexer = new CodebaseIndexer({
144
+ codebaseRoot: tempDir,
145
+ storage: new MemoryStorage(),
146
+ });
147
+ await simpleIndexer.index();
148
+ const results = await hybridSearch('authentication', simpleIndexer);
149
+ expect(results.length).toBeGreaterThan(0);
150
+ expect(results.every((r) => r.method === 'tfidf')).toBe(true);
151
+ });
152
+ it('should handle empty query', async () => {
153
+ const results = await hybridSearch('', indexer);
154
+ // Empty query should still return results (all docs with low scores)
155
+ expect(Array.isArray(results)).toBe(true);
156
+ });
157
+ it('should handle query with no matches', async () => {
158
+ const results = await hybridSearch('zzznonexistenttermzzz', indexer);
159
+ // Should return empty or very low-scored results
160
+ expect(Array.isArray(results)).toBe(true);
161
+ });
162
+ });
163
+ describe('semanticSearch', () => {
164
+ // FIXME: Skipping due to HNSW initialization timing issues with small datasets
165
+ it.skip('should use vector search only (weight = 1.0)', async () => {
166
+ const results = await semanticSearch('authentication', indexer, {
167
+ limit: 5,
168
+ minScore: 0, // Allow all results for small test dataset
169
+ });
170
+ expect(results.length).toBeGreaterThan(0);
171
+ // All results should be from vector search
172
+ expect(results.every((r) => r.method === 'vector' || r.method === 'hybrid')).toBe(true);
173
+ });
174
+ it('should return relevant semantic matches', async () => {
175
+ const results = await semanticSearch('user login credentials', indexer);
176
+ // Should find auth.ts which has related content
177
+ expect(results.length).toBeGreaterThan(0);
178
+ // At least one result should have reasonable similarity
179
+ expect(results.some((r) => r.score > 0)).toBe(true);
180
+ });
181
+ });
182
+ describe('keywordSearch', () => {
183
+ it('should use TF-IDF search only (weight = 0.0)', async () => {
184
+ const results = await keywordSearch('authenticate', indexer, { limit: 5 });
185
+ expect(results.length).toBeGreaterThan(0);
186
+ // All results should be from TF-IDF search
187
+ expect(results.every((r) => r.method === 'tfidf')).toBe(true);
188
+ });
189
+ it('should return keyword matches', async () => {
190
+ const results = await keywordSearch('authenticate', indexer);
191
+ expect(results.length).toBeGreaterThan(0);
192
+ // Should have matched terms
193
+ expect(results.some((r) => r.matchedTerms && r.matchedTerms.length > 0)).toBe(true);
194
+ });
195
+ it('should match exact keywords', async () => {
196
+ const results = await keywordSearch('DatabaseConnection', indexer);
197
+ expect(results.length).toBeGreaterThan(0);
198
+ // Should find database.ts
199
+ expect(results.some((r) => r.path.includes('database.ts'))).toBe(true);
200
+ });
201
+ });
202
+ describe('comparison', () => {
203
+ // FIXME: Skipping due to HNSW initialization timing issues with small datasets
204
+ it.skip('hybrid vs semantic vs keyword should return different results', async () => {
205
+ const query = 'authentication';
206
+ const hybridResults = await hybridSearch(query, indexer, {
207
+ vectorWeight: 0.7,
208
+ limit: 5,
209
+ minScore: 0,
210
+ });
211
+ const semanticResults = await semanticSearch(query, indexer, {
212
+ limit: 5,
213
+ minScore: 0, // Allow all results for small test dataset
214
+ });
215
+ const keywordResults = await keywordSearch(query, indexer, { limit: 5 });
216
+ // All should return some results
217
+ expect(hybridResults.length).toBeGreaterThan(0);
218
+ expect(semanticResults.length).toBeGreaterThan(0);
219
+ expect(keywordResults.length).toBeGreaterThan(0);
220
+ // Methods should be different
221
+ const _hybridMethods = new Set(hybridResults.map((r) => r.method));
222
+ const semanticMethods = new Set(semanticResults.map((r) => r.method));
223
+ const keywordMethods = new Set(keywordResults.map((r) => r.method));
224
+ expect(semanticMethods.has('vector') || semanticMethods.has('hybrid')).toBe(true);
225
+ expect(keywordMethods.has('tfidf')).toBe(true);
226
+ });
227
+ });
228
+ describe('result quality', () => {
229
+ it('should return results with all expected fields', async () => {
230
+ const results = await hybridSearch('function', indexer, {
231
+ includeContent: true,
232
+ limit: 1,
233
+ });
234
+ if (results.length > 0) {
235
+ const result = results[0];
236
+ expect(result.path).toBeDefined();
237
+ expect(typeof result.path).toBe('string');
238
+ expect(result.score).toBeDefined();
239
+ expect(typeof result.score).toBe('number');
240
+ expect(result.method).toBeDefined();
241
+ expect(['vector', 'tfidf', 'hybrid']).toContain(result.method);
242
+ }
243
+ });
244
+ it('should have normalized scores', async () => {
245
+ const results = await hybridSearch('authentication', indexer, { limit: 10 });
246
+ expect(results.length).toBeGreaterThan(0);
247
+ // Scores should be in reasonable range (0 to ~2 after normalization + weighting)
248
+ expect(results.every((r) => r.score >= 0 && r.score <= 10)).toBe(true);
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=hybrid-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.test.js","sourceRoot":"","sources":["../src/hybrid-search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Incremental TF-IDF Index Manager
3
+ * Efficiently updates TF-IDF vectors without full rebuild
4
+ */
5
+ import type { DocumentVector } from './tfidf.js';
6
+ export interface IncrementalUpdate {
7
+ type: 'add' | 'update' | 'delete';
8
+ uri: string;
9
+ oldDocument?: DocumentVector;
10
+ newContent?: string;
11
+ }
12
+ export interface IncrementalStats {
13
+ totalDocuments: number;
14
+ affectedDocuments: number;
15
+ affectedTerms: number;
16
+ updateTime: number;
17
+ }
18
+ /**
19
+ * Incremental TF-IDF Index Manager
20
+ *
21
+ * ALGORITHM:
22
+ * 1. Track document frequency (df) for each term
23
+ * 2. When document changes:
24
+ * - Update df for affected terms
25
+ * - Recalculate IDF for affected terms
26
+ * - Update TF-IDF only for affected documents
27
+ * 3. Avoid full rebuild unless necessary
28
+ */
29
+ export declare class IncrementalTFIDF {
30
+ private documents;
31
+ private idf;
32
+ private documentFrequency;
33
+ private totalDocuments;
34
+ constructor(initialDocuments?: DocumentVector[], initialIdf?: Map<string, number>);
35
+ /**
36
+ * Apply multiple updates efficiently
37
+ */
38
+ applyUpdates(updates: IncrementalUpdate[]): Promise<IncrementalStats>;
39
+ /**
40
+ * Add a new document
41
+ */
42
+ private addDocumentInternal;
43
+ /**
44
+ * Update an existing document
45
+ */
46
+ private updateDocumentInternal;
47
+ /**
48
+ * Delete a document
49
+ */
50
+ private deleteDocumentInternal;
51
+ /**
52
+ * Extract terms from content (async - uses StarCoder2)
53
+ */
54
+ private extractTerms;
55
+ /**
56
+ * Calculate TF for a document
57
+ */
58
+ private calculateTF;
59
+ /**
60
+ * Recalculate TF-IDF for a document
61
+ */
62
+ private recalculateDocumentTFIDF;
63
+ /**
64
+ * Get current index state
65
+ */
66
+ getIndex(): {
67
+ documents: DocumentVector[];
68
+ idf: Map<string, number>;
69
+ totalDocuments: number;
70
+ };
71
+ /**
72
+ * Check if full rebuild is recommended
73
+ * Returns true if changes are too extensive for incremental update
74
+ */
75
+ shouldFullRebuild(updates: IncrementalUpdate[]): Promise<boolean>;
76
+ }
77
+ //# sourceMappingURL=incremental-tfidf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-tfidf.d.ts","sourceRoot":"","sources":["../src/incremental-tfidf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAQ;gBAG7B,gBAAgB,GAAE,cAAc,EAAO,EACvC,UAAU,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa;IAmB5C;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwE3E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;YACW,YAAY;IAW1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,QAAQ,IAAI;QACX,SAAS,EAAE,cAAc,EAAE,CAAA;QAC3B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;KACtB;IAQD;;;OAGG;IACG,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA8BvE"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Incremental TF-IDF Index Manager
3
+ * Efficiently updates TF-IDF vectors without full rebuild
4
+ */
5
+ import { tokenize } from './tfidf.js'; // async tokenize using StarCoder2
6
+ /**
7
+ * Incremental TF-IDF Index Manager
8
+ *
9
+ * ALGORITHM:
10
+ * 1. Track document frequency (df) for each term
11
+ * 2. When document changes:
12
+ * - Update df for affected terms
13
+ * - Recalculate IDF for affected terms
14
+ * - Update TF-IDF only for affected documents
15
+ * 3. Avoid full rebuild unless necessary
16
+ */
17
+ export class IncrementalTFIDF {
18
+ documents;
19
+ idf;
20
+ documentFrequency;
21
+ totalDocuments;
22
+ constructor(initialDocuments = [], initialIdf = new Map()) {
23
+ this.documents = new Map();
24
+ this.idf = new Map(initialIdf);
25
+ this.documentFrequency = new Map();
26
+ this.totalDocuments = initialDocuments.length;
27
+ // Initialize from existing index
28
+ for (const doc of initialDocuments) {
29
+ this.documents.set(doc.uri, doc);
30
+ // Calculate document frequency from existing documents
31
+ for (const term of doc.rawTerms.keys()) {
32
+ const df = this.documentFrequency.get(term) || 0;
33
+ this.documentFrequency.set(term, df + 1);
34
+ }
35
+ }
36
+ }
37
+ /**
38
+ * Apply multiple updates efficiently
39
+ */
40
+ async applyUpdates(updates) {
41
+ const startTime = Date.now();
42
+ const affectedTerms = new Set();
43
+ const affectedDocuments = new Set();
44
+ // Phase 1: Process all changes and collect affected terms
45
+ for (const update of updates) {
46
+ switch (update.type) {
47
+ case 'add':
48
+ if (update.newContent) {
49
+ const terms = await this.extractTerms(update.newContent);
50
+ this.addDocumentInternal(update.uri, terms, affectedTerms);
51
+ affectedDocuments.add(update.uri);
52
+ }
53
+ break;
54
+ case 'update':
55
+ if (update.oldDocument && update.newContent) {
56
+ const oldTerms = update.oldDocument.rawTerms;
57
+ const newTerms = await this.extractTerms(update.newContent);
58
+ this.updateDocumentInternal(update.uri, oldTerms, newTerms, affectedTerms);
59
+ affectedDocuments.add(update.uri);
60
+ }
61
+ break;
62
+ case 'delete':
63
+ if (update.oldDocument) {
64
+ this.deleteDocumentInternal(update.uri, update.oldDocument.rawTerms, affectedTerms);
65
+ affectedDocuments.delete(update.uri);
66
+ }
67
+ break;
68
+ }
69
+ }
70
+ // Phase 2: Recalculate IDF for affected terms using smoothed formula
71
+ // Smoothed IDF: log((N+1)/(df+1)) + 1 ensures no term gets IDF=0
72
+ for (const term of affectedTerms) {
73
+ const df = this.documentFrequency.get(term) || 0;
74
+ if (df > 0) {
75
+ this.idf.set(term, Math.log((this.totalDocuments + 1) / (df + 1)) + 1);
76
+ }
77
+ else {
78
+ this.idf.delete(term);
79
+ this.documentFrequency.delete(term);
80
+ }
81
+ }
82
+ // Phase 3: Update TF-IDF for all documents containing affected terms
83
+ for (const doc of this.documents.values()) {
84
+ let needsUpdate = false;
85
+ // Check if this document contains any affected terms
86
+ for (const term of doc.rawTerms.keys()) {
87
+ if (affectedTerms.has(term)) {
88
+ needsUpdate = true;
89
+ break;
90
+ }
91
+ }
92
+ if (needsUpdate) {
93
+ this.recalculateDocumentTFIDF(doc);
94
+ affectedDocuments.add(doc.uri);
95
+ }
96
+ }
97
+ return {
98
+ totalDocuments: this.totalDocuments,
99
+ affectedDocuments: affectedDocuments.size,
100
+ affectedTerms: affectedTerms.size,
101
+ updateTime: Date.now() - startTime,
102
+ };
103
+ }
104
+ /**
105
+ * Add a new document
106
+ */
107
+ addDocumentInternal(uri, terms, affectedTerms) {
108
+ this.totalDocuments++;
109
+ // Update document frequency
110
+ for (const term of terms.keys()) {
111
+ const df = this.documentFrequency.get(term) || 0;
112
+ this.documentFrequency.set(term, df + 1);
113
+ affectedTerms.add(term);
114
+ }
115
+ // Create document vector (TF-IDF will be calculated later)
116
+ const doc = {
117
+ uri,
118
+ terms: new Map(),
119
+ rawTerms: terms,
120
+ magnitude: 0,
121
+ };
122
+ this.documents.set(uri, doc);
123
+ }
124
+ /**
125
+ * Update an existing document
126
+ */
127
+ updateDocumentInternal(uri, oldTerms, newTerms, affectedTerms) {
128
+ // Collect all affected terms (old + new)
129
+ for (const term of oldTerms.keys()) {
130
+ affectedTerms.add(term);
131
+ }
132
+ for (const term of newTerms.keys()) {
133
+ affectedTerms.add(term);
134
+ }
135
+ // Update document frequency
136
+ // Remove old terms
137
+ for (const term of oldTerms.keys()) {
138
+ const df = this.documentFrequency.get(term) || 0;
139
+ this.documentFrequency.set(term, Math.max(0, df - 1));
140
+ }
141
+ // Add new terms
142
+ for (const term of newTerms.keys()) {
143
+ const df = this.documentFrequency.get(term) || 0;
144
+ this.documentFrequency.set(term, df + 1);
145
+ }
146
+ // Update document
147
+ const doc = this.documents.get(uri);
148
+ if (doc) {
149
+ doc.rawTerms = newTerms;
150
+ doc.terms.clear();
151
+ doc.magnitude = 0;
152
+ }
153
+ }
154
+ /**
155
+ * Delete a document
156
+ */
157
+ deleteDocumentInternal(uri, terms, affectedTerms) {
158
+ this.totalDocuments--;
159
+ // Update document frequency
160
+ for (const term of terms.keys()) {
161
+ const df = this.documentFrequency.get(term) || 0;
162
+ this.documentFrequency.set(term, Math.max(0, df - 1));
163
+ affectedTerms.add(term);
164
+ }
165
+ this.documents.delete(uri);
166
+ }
167
+ /**
168
+ * Extract terms from content (async - uses StarCoder2)
169
+ */
170
+ async extractTerms(content) {
171
+ const tokens = await tokenize(content);
172
+ const frequencies = new Map();
173
+ for (const token of tokens) {
174
+ frequencies.set(token, (frequencies.get(token) || 0) + 1);
175
+ }
176
+ return frequencies;
177
+ }
178
+ /**
179
+ * Calculate TF for a document
180
+ */
181
+ calculateTF(termFrequency) {
182
+ const totalTerms = Array.from(termFrequency.values()).reduce((sum, freq) => sum + freq, 0);
183
+ const tf = new Map();
184
+ for (const [term, freq] of termFrequency.entries()) {
185
+ tf.set(term, freq / totalTerms);
186
+ }
187
+ return tf;
188
+ }
189
+ /**
190
+ * Recalculate TF-IDF for a document
191
+ */
192
+ recalculateDocumentTFIDF(doc) {
193
+ const tf = this.calculateTF(doc.rawTerms);
194
+ doc.terms.clear();
195
+ // Calculate TF-IDF for each term
196
+ for (const [term, tfScore] of tf.entries()) {
197
+ const idfScore = this.idf.get(term) || 0;
198
+ doc.terms.set(term, tfScore * idfScore);
199
+ }
200
+ // Recalculate magnitude
201
+ let sumSquares = 0;
202
+ for (const tfidf of doc.terms.values()) {
203
+ sumSquares += tfidf * tfidf;
204
+ }
205
+ doc.magnitude = Math.sqrt(sumSquares);
206
+ }
207
+ /**
208
+ * Get current index state
209
+ */
210
+ getIndex() {
211
+ return {
212
+ documents: Array.from(this.documents.values()),
213
+ idf: new Map(this.idf),
214
+ totalDocuments: this.totalDocuments,
215
+ };
216
+ }
217
+ /**
218
+ * Check if full rebuild is recommended
219
+ * Returns true if changes are too extensive for incremental update
220
+ */
221
+ async shouldFullRebuild(updates) {
222
+ const changeRatio = updates.length / Math.max(this.totalDocuments, 1);
223
+ // If >20% of documents changed, recommend full rebuild
224
+ if (changeRatio > 0.2) {
225
+ return true;
226
+ }
227
+ // Count new unique terms
228
+ const newTerms = new Set();
229
+ for (const update of updates) {
230
+ if (update.type === 'add' || update.type === 'update') {
231
+ if (update.newContent) {
232
+ const tokens = await tokenize(update.newContent);
233
+ for (const token of tokens) {
234
+ if (!this.documentFrequency.has(token)) {
235
+ newTerms.add(token);
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ // If too many new terms, recommend full rebuild
242
+ if (newTerms.size > 1000) {
243
+ return true;
244
+ }
245
+ return false;
246
+ }
247
+ }
248
+ //# sourceMappingURL=incremental-tfidf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-tfidf.js","sourceRoot":"","sources":["../src/incremental-tfidf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Incremental TF-IDF implementation (StarCoder2 tokenizer)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=incremental-tfidf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-tfidf.test.d.ts","sourceRoot":"","sources":["../src/incremental-tfidf.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}