@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.
- package/README.md +154 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ast-chunking.d.ts +40 -0
- package/dist/ast-chunking.d.ts.map +1 -0
- package/dist/ast-chunking.js +88 -0
- package/dist/ast-chunking.js.map +1 -0
- package/dist/ast-chunking.test.d.ts +5 -0
- package/dist/ast-chunking.test.d.ts.map +1 -0
- package/dist/ast-chunking.test.js +173 -0
- package/dist/ast-chunking.test.js.map +1 -0
- package/dist/code-tokenizer.d.ts +62 -0
- package/dist/code-tokenizer.d.ts.map +1 -0
- package/dist/code-tokenizer.js +129 -0
- package/dist/code-tokenizer.js.map +1 -0
- package/dist/code-tokenizer.test.d.ts +5 -0
- package/dist/code-tokenizer.test.d.ts.map +1 -0
- package/dist/code-tokenizer.test.js +96 -0
- package/dist/code-tokenizer.test.js.map +1 -0
- package/dist/db/client-pg.d.ts +16 -0
- package/dist/db/client-pg.d.ts.map +1 -0
- package/dist/db/client-pg.js +38 -0
- package/dist/db/client-pg.js.map +1 -0
- package/dist/db/client.d.ts +36 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +81 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrations-pg.d.ts +6 -0
- package/dist/db/migrations-pg.d.ts.map +1 -0
- package/dist/db/migrations-pg.js +88 -0
- package/dist/db/migrations-pg.js.map +1 -0
- package/dist/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +164 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/schema-pg.d.ts +611 -0
- package/dist/db/schema-pg.d.ts.map +1 -0
- package/dist/db/schema-pg.js +66 -0
- package/dist/db/schema-pg.js.map +1 -0
- package/dist/db/schema.d.ts +630 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +85 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/embeddings.d.ts +92 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +275 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/embeddings.test.d.ts +5 -0
- package/dist/embeddings.test.d.ts.map +1 -0
- package/dist/embeddings.test.js +255 -0
- package/dist/embeddings.test.js.map +1 -0
- package/dist/hybrid-search.d.ts +47 -0
- package/dist/hybrid-search.d.ts.map +1 -0
- package/dist/hybrid-search.js +215 -0
- package/dist/hybrid-search.js.map +1 -0
- package/dist/hybrid-search.test.d.ts +5 -0
- package/dist/hybrid-search.test.d.ts.map +1 -0
- package/dist/hybrid-search.test.js +252 -0
- package/dist/hybrid-search.test.js.map +1 -0
- package/dist/incremental-tfidf.d.ts +77 -0
- package/dist/incremental-tfidf.d.ts.map +1 -0
- package/dist/incremental-tfidf.js +248 -0
- package/dist/incremental-tfidf.js.map +1 -0
- package/dist/incremental-tfidf.test.d.ts +5 -0
- package/dist/incremental-tfidf.test.d.ts.map +1 -0
- package/dist/incremental-tfidf.test.js +276 -0
- package/dist/incremental-tfidf.test.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +205 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +1331 -0
- package/dist/indexer.js.map +1 -0
- package/dist/indexer.test.d.ts +12 -0
- package/dist/indexer.test.d.ts.map +1 -0
- package/dist/indexer.test.js +471 -0
- package/dist/indexer.test.js.map +1 -0
- package/dist/language-config.d.ts +54 -0
- package/dist/language-config.d.ts.map +1 -0
- package/dist/language-config.js +75 -0
- package/dist/language-config.js.map +1 -0
- package/dist/search-cache.d.ts +63 -0
- package/dist/search-cache.d.ts.map +1 -0
- package/dist/search-cache.js +118 -0
- package/dist/search-cache.js.map +1 -0
- package/dist/search-cache.test.d.ts +5 -0
- package/dist/search-cache.test.d.ts.map +1 -0
- package/dist/search-cache.test.js +194 -0
- package/dist/search-cache.test.js.map +1 -0
- package/dist/storage-factory.d.ts +11 -0
- package/dist/storage-factory.d.ts.map +1 -0
- package/dist/storage-factory.js +17 -0
- package/dist/storage-factory.js.map +1 -0
- package/dist/storage-persistent-pg.d.ts +75 -0
- package/dist/storage-persistent-pg.d.ts.map +1 -0
- package/dist/storage-persistent-pg.js +579 -0
- package/dist/storage-persistent-pg.js.map +1 -0
- package/dist/storage-persistent-pg.test.d.ts +7 -0
- package/dist/storage-persistent-pg.test.d.ts.map +1 -0
- package/dist/storage-persistent-pg.test.js +90 -0
- package/dist/storage-persistent-pg.test.js.map +1 -0
- package/dist/storage-persistent-types.d.ts +110 -0
- package/dist/storage-persistent-types.d.ts.map +1 -0
- package/dist/storage-persistent-types.js +5 -0
- package/dist/storage-persistent-types.js.map +1 -0
- package/dist/storage-persistent.d.ts +231 -0
- package/dist/storage-persistent.d.ts.map +1 -0
- package/dist/storage-persistent.js +897 -0
- package/dist/storage-persistent.js.map +1 -0
- package/dist/storage-persistent.test.d.ts +5 -0
- package/dist/storage-persistent.test.d.ts.map +1 -0
- package/dist/storage-persistent.test.js +325 -0
- package/dist/storage-persistent.test.js.map +1 -0
- package/dist/storage.d.ts +63 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +67 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.test.d.ts +5 -0
- package/dist/storage.test.d.ts.map +1 -0
- package/dist/storage.test.js +157 -0
- package/dist/storage.test.js.map +1 -0
- package/dist/tfidf.d.ts +97 -0
- package/dist/tfidf.d.ts.map +1 -0
- package/dist/tfidf.js +308 -0
- package/dist/tfidf.js.map +1 -0
- package/dist/tfidf.test.d.ts +5 -0
- package/dist/tfidf.test.d.ts.map +1 -0
- package/dist/tfidf.test.js +181 -0
- package/dist/tfidf.test.js.map +1 -0
- package/dist/utils.d.ts +61 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +264 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +5 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +94 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vector-storage.d.ts +120 -0
- package/dist/vector-storage.d.ts.map +1 -0
- package/dist/vector-storage.js +264 -0
- package/dist/vector-storage.js.map +1 -0
- package/dist/vector-storage.test.d.ts +5 -0
- package/dist/vector-storage.test.d.ts.map +1 -0
- package/dist/vector-storage.test.js +345 -0
- package/dist/vector-storage.test.js.map +1 -0
- 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":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EACN,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAElB,qBAAqB,EACrB,eAAe,GACf,MAAM,iBAAiB,CAAA;AAExB,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,SAAS,GAAG,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACzD,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/E,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACtD,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAEtD,iCAAiC;QACjC,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,SAAS,GAAG,IAAI,CAAA;gBAChB,MAAK;YACN,CAAC;QACF,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,IAAI,QAA2B,CAAA;IAE/B,UAAU,CAAC,GAAG,EAAE;QACf,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;QAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QACjF,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC;IACF,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAClE,oBAAoB;QACpB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAEjC,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAE5C,cAAc;QACd,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,WAAW,CAAA;QACzC,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,qCAAqC;QAC1E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QAElE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,YAAY,CAAA;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;QAEtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAE9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAElE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAExC,8EAA8E;QAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACxB,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACtB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,WAAW;QAC9B,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QAChF,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAClB,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QAEvC,yDAAyD;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACrB,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QAEvC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA,CAAC,sBAAsB;QAC7C,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QAEvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAExC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,CAAC,gCAAgC;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAExC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,eAAe,GAAsB;YAC1C,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,GAAG;YACf,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACnC,CAAC;YACD,kBAAkB,EAAE,KAAK,IAAI,EAAE;gBAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACnC,CAAC;SACD,CAAA;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAE5D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,CAAC,iCAAiC;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,eAAe,GAAsB;YAC1C,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,GAAG;YACf,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACnC,CAAC;YACD,kBAAkB,EAAE,KAAK,IAAI,EAAE;gBAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACnC,CAAC;SACD,CAAA;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAE5D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QACxE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAExC,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,CAAC,CAAA;QAE7E,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAE3D,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/D,8BAA8B;QAC9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAEjE,uCAAuC;QACvC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/D,+DAA+D;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-search.test.d.ts","sourceRoot":"","sources":["../src/hybrid-search.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|