@mcampa/claude-context-core 0.1.3

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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/context.d.ts +276 -0
  5. package/dist/context.d.ts.map +1 -0
  6. package/dist/context.js +1080 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/embedding/base-embedding.d.ts +51 -0
  9. package/dist/embedding/base-embedding.d.ts.map +1 -0
  10. package/dist/embedding/base-embedding.js +36 -0
  11. package/dist/embedding/base-embedding.js.map +1 -0
  12. package/dist/embedding/gemini-embedding.d.ts +53 -0
  13. package/dist/embedding/gemini-embedding.d.ts.map +1 -0
  14. package/dist/embedding/gemini-embedding.js +152 -0
  15. package/dist/embedding/gemini-embedding.js.map +1 -0
  16. package/dist/embedding/index.d.ts +6 -0
  17. package/dist/embedding/index.d.ts.map +1 -0
  18. package/dist/embedding/index.js +24 -0
  19. package/dist/embedding/index.js.map +1 -0
  20. package/dist/embedding/ollama-embedding.d.ts +55 -0
  21. package/dist/embedding/ollama-embedding.d.ts.map +1 -0
  22. package/dist/embedding/ollama-embedding.js +192 -0
  23. package/dist/embedding/ollama-embedding.js.map +1 -0
  24. package/dist/embedding/openai-embedding.d.ts +36 -0
  25. package/dist/embedding/openai-embedding.d.ts.map +1 -0
  26. package/dist/embedding/openai-embedding.js +159 -0
  27. package/dist/embedding/openai-embedding.js.map +1 -0
  28. package/dist/embedding/voyageai-embedding.d.ts +44 -0
  29. package/dist/embedding/voyageai-embedding.d.ts.map +1 -0
  30. package/dist/embedding/voyageai-embedding.js +227 -0
  31. package/dist/embedding/voyageai-embedding.js.map +1 -0
  32. package/dist/index.d.ts +8 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +24 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/splitter/ast-splitter.d.ts +22 -0
  37. package/dist/splitter/ast-splitter.d.ts.map +1 -0
  38. package/dist/splitter/ast-splitter.js +234 -0
  39. package/dist/splitter/ast-splitter.js.map +1 -0
  40. package/dist/splitter/index.d.ts +41 -0
  41. package/dist/splitter/index.d.ts.map +1 -0
  42. package/dist/splitter/index.js +27 -0
  43. package/dist/splitter/index.js.map +1 -0
  44. package/dist/splitter/langchain-splitter.d.ts +13 -0
  45. package/dist/splitter/langchain-splitter.d.ts.map +1 -0
  46. package/dist/splitter/langchain-splitter.js +118 -0
  47. package/dist/splitter/langchain-splitter.js.map +1 -0
  48. package/dist/sync/merkle.d.ts +26 -0
  49. package/dist/sync/merkle.d.ts.map +1 -0
  50. package/dist/sync/merkle.js +112 -0
  51. package/dist/sync/merkle.js.map +1 -0
  52. package/dist/sync/synchronizer.d.ts +30 -0
  53. package/dist/sync/synchronizer.d.ts.map +1 -0
  54. package/dist/sync/synchronizer.js +339 -0
  55. package/dist/sync/synchronizer.js.map +1 -0
  56. package/dist/types.d.ts +14 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +3 -0
  59. package/dist/types.js.map +1 -0
  60. package/dist/utils/env-manager.d.ts +19 -0
  61. package/dist/utils/env-manager.d.ts.map +1 -0
  62. package/dist/utils/env-manager.js +125 -0
  63. package/dist/utils/env-manager.js.map +1 -0
  64. package/dist/utils/git.d.ts +11 -0
  65. package/dist/utils/git.d.ts.map +1 -0
  66. package/dist/utils/git.js +46 -0
  67. package/dist/utils/git.js.map +1 -0
  68. package/dist/utils/index.d.ts +2 -0
  69. package/dist/utils/index.d.ts.map +1 -0
  70. package/dist/utils/index.js +7 -0
  71. package/dist/utils/index.js.map +1 -0
  72. package/dist/vectordb/index.d.ts +5 -0
  73. package/dist/vectordb/index.d.ts.map +1 -0
  74. package/dist/vectordb/index.js +14 -0
  75. package/dist/vectordb/index.js.map +1 -0
  76. package/dist/vectordb/milvus-restful-vectordb.d.ts +75 -0
  77. package/dist/vectordb/milvus-restful-vectordb.d.ts.map +1 -0
  78. package/dist/vectordb/milvus-restful-vectordb.js +703 -0
  79. package/dist/vectordb/milvus-restful-vectordb.js.map +1 -0
  80. package/dist/vectordb/milvus-vectordb.d.ts +60 -0
  81. package/dist/vectordb/milvus-vectordb.d.ts.map +1 -0
  82. package/dist/vectordb/milvus-vectordb.js +638 -0
  83. package/dist/vectordb/milvus-vectordb.js.map +1 -0
  84. package/dist/vectordb/types.d.ts +120 -0
  85. package/dist/vectordb/types.d.ts.map +1 -0
  86. package/dist/vectordb/types.js +9 -0
  87. package/dist/vectordb/types.js.map +1 -0
  88. package/dist/vectordb/zilliz-utils.d.ts +135 -0
  89. package/dist/vectordb/zilliz-utils.d.ts.map +1 -0
  90. package/dist/vectordb/zilliz-utils.js +192 -0
  91. package/dist/vectordb/zilliz-utils.js.map +1 -0
  92. package/package.json +58 -0
@@ -0,0 +1,638 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MilvusVectorDatabase = void 0;
4
+ const milvus2_sdk_node_1 = require("@zilliz/milvus2-sdk-node");
5
+ const zilliz_utils_1 = require("./zilliz-utils");
6
+ class MilvusVectorDatabase {
7
+ constructor(config) {
8
+ this.client = null;
9
+ this.config = config;
10
+ // Start initialization asynchronously without waiting
11
+ this.initializationPromise = this.initialize();
12
+ }
13
+ async initialize() {
14
+ const resolvedAddress = await this.resolveAddress();
15
+ await this.initializeClient(resolvedAddress);
16
+ }
17
+ async initializeClient(address) {
18
+ const milvusConfig = this.config;
19
+ console.log('🔌 Connecting to vector database at: ', address);
20
+ this.client = new milvus2_sdk_node_1.MilvusClient({
21
+ address: address,
22
+ username: milvusConfig.username,
23
+ password: milvusConfig.password,
24
+ token: milvusConfig.token,
25
+ ssl: milvusConfig.ssl || false,
26
+ });
27
+ }
28
+ /**
29
+ * Resolve address from config or token
30
+ * Common logic for both gRPC and REST implementations
31
+ */
32
+ async resolveAddress() {
33
+ let finalConfig = { ...this.config };
34
+ // If address is not provided, get it using token
35
+ if (!finalConfig.address && finalConfig.token) {
36
+ finalConfig.address = await zilliz_utils_1.ClusterManager.getAddressFromToken(finalConfig.token);
37
+ }
38
+ if (!finalConfig.address) {
39
+ throw new Error('Address is required and could not be resolved from token');
40
+ }
41
+ return finalConfig.address;
42
+ }
43
+ /**
44
+ * Ensure initialization is complete before method execution
45
+ */
46
+ async ensureInitialized() {
47
+ await this.initializationPromise;
48
+ if (!this.client) {
49
+ throw new Error('Client not initialized');
50
+ }
51
+ }
52
+ /**
53
+ * Ensure collection is loaded before search/query operations
54
+ */
55
+ async ensureLoaded(collectionName) {
56
+ if (!this.client) {
57
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
58
+ }
59
+ try {
60
+ // Check if collection is loaded
61
+ const result = await this.client.getLoadState({
62
+ collection_name: collectionName
63
+ });
64
+ if (result.state !== milvus2_sdk_node_1.LoadState.LoadStateLoaded) {
65
+ console.log(`[MilvusDB] 🔄 Loading collection '${collectionName}' to memory...`);
66
+ await this.client.loadCollection({
67
+ collection_name: collectionName,
68
+ });
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error(`[MilvusDB] ❌ Failed to ensure collection '${collectionName}' is loaded:`, error);
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * Wait for an index to be ready before proceeding
78
+ * Polls index build progress with exponential backoff up to 60 seconds
79
+ */
80
+ async waitForIndexReady(collectionName, fieldName, maxWaitTime = 60000, // 60 seconds
81
+ initialInterval = 500, // 500ms
82
+ maxInterval = 5000, // 5 seconds
83
+ backoffMultiplier = 1.5) {
84
+ if (!this.client) {
85
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
86
+ }
87
+ let interval = initialInterval;
88
+ const startTime = Date.now();
89
+ console.log(`[MilvusDB] ⏳ Waiting for index on field '${fieldName}' in collection '${collectionName}' to be ready...`);
90
+ while (Date.now() - startTime < maxWaitTime) {
91
+ try {
92
+ const indexBuildProgress = await this.client.getIndexBuildProgress({
93
+ collection_name: collectionName,
94
+ field_name: fieldName
95
+ });
96
+ // Debug logging to understand the progress
97
+ console.log(`[MilvusDB] 📊 Index build progress for '${fieldName}': indexed_rows=${indexBuildProgress.indexed_rows}, total_rows=${indexBuildProgress.total_rows}`);
98
+ console.log(`[MilvusDB] 📊 Full response:`, JSON.stringify(indexBuildProgress));
99
+ // Check if index building is complete
100
+ if (indexBuildProgress.indexed_rows === indexBuildProgress.total_rows) {
101
+ console.log(`[MilvusDB] ✅ Index on field '${fieldName}' is ready! (${indexBuildProgress.indexed_rows}/${indexBuildProgress.total_rows} rows indexed)`);
102
+ return;
103
+ }
104
+ // Check for error status
105
+ if (indexBuildProgress.status && indexBuildProgress.status.error_code !== 'Success') {
106
+ // Handle known issue with older Milvus versions where sparse vector index progress returns incorrect error
107
+ if (indexBuildProgress.status.reason && indexBuildProgress.status.reason.includes('index duplicates[indexName=]')) {
108
+ console.log(`[MilvusDB] ⚠️ Index progress check returned known older Milvus issue: ${indexBuildProgress.status.reason}`);
109
+ console.log(`[MilvusDB] ⚠️ This is a known issue with older Milvus versions - treating as index ready`);
110
+ return; // Treat as ready since this is a false error
111
+ }
112
+ throw new Error(`Index creation failed for field '${fieldName}' in collection '${collectionName}': ${indexBuildProgress.status.reason}`);
113
+ }
114
+ console.log(`[MilvusDB] 📊 Index building in progress: ${indexBuildProgress.indexed_rows}/${indexBuildProgress.total_rows} rows indexed`);
115
+ // Wait with exponential backoff
116
+ await new Promise(resolve => setTimeout(resolve, interval));
117
+ interval = Math.min(interval * backoffMultiplier, maxInterval);
118
+ }
119
+ catch (error) {
120
+ console.error(`[MilvusDB] ❌ Error checking index build progress for field '${fieldName}':`, error);
121
+ throw error;
122
+ }
123
+ }
124
+ throw new Error(`Timeout waiting for index on field '${fieldName}' in collection '${collectionName}' to be ready after ${maxWaitTime}ms`);
125
+ }
126
+ /**
127
+ * Load collection with retry logic and exponential backoff
128
+ * Retries up to 5 times with exponential backoff
129
+ */
130
+ async loadCollectionWithRetry(collectionName, maxRetries = 5, initialInterval = 1000, // 1 second
131
+ backoffMultiplier = 2) {
132
+ if (!this.client) {
133
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
134
+ }
135
+ let attempt = 1;
136
+ let interval = initialInterval;
137
+ while (attempt <= maxRetries) {
138
+ try {
139
+ console.log(`[MilvusDB] 🔄 Loading collection '${collectionName}' to memory (attempt ${attempt}/${maxRetries})...`);
140
+ await this.client.loadCollection({
141
+ collection_name: collectionName,
142
+ });
143
+ console.log(`[MilvusDB] ✅ Collection '${collectionName}' loaded successfully!`);
144
+ return;
145
+ }
146
+ catch (error) {
147
+ console.error(`[MilvusDB] ❌ Failed to load collection '${collectionName}' on attempt ${attempt}:`, error);
148
+ if (attempt === maxRetries) {
149
+ throw new Error(`Failed to load collection '${collectionName}' after ${maxRetries} attempts: ${error}`);
150
+ }
151
+ // Wait with exponential backoff before retry
152
+ console.log(`[MilvusDB] ⏳ Retrying collection load in ${interval}ms...`);
153
+ await new Promise(resolve => setTimeout(resolve, interval));
154
+ interval *= backoffMultiplier;
155
+ attempt++;
156
+ }
157
+ }
158
+ }
159
+ async createCollection(collectionName, dimension, description) {
160
+ await this.ensureInitialized();
161
+ console.log('Beginning collection creation:', collectionName);
162
+ console.log('Collection dimension:', dimension);
163
+ const schema = [
164
+ {
165
+ name: 'id',
166
+ description: 'Document ID',
167
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
168
+ max_length: 512,
169
+ is_primary_key: true,
170
+ },
171
+ {
172
+ name: 'vector',
173
+ description: 'Embedding vector',
174
+ data_type: milvus2_sdk_node_1.DataType.FloatVector,
175
+ dim: dimension,
176
+ },
177
+ {
178
+ name: 'content',
179
+ description: 'Document content',
180
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
181
+ max_length: 65535,
182
+ },
183
+ {
184
+ name: 'relativePath',
185
+ description: 'Relative path to the codebase',
186
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
187
+ max_length: 1024,
188
+ },
189
+ {
190
+ name: 'startLine',
191
+ description: 'Start line number of the chunk',
192
+ data_type: milvus2_sdk_node_1.DataType.Int64,
193
+ },
194
+ {
195
+ name: 'endLine',
196
+ description: 'End line number of the chunk',
197
+ data_type: milvus2_sdk_node_1.DataType.Int64,
198
+ },
199
+ {
200
+ name: 'fileExtension',
201
+ description: 'File extension',
202
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
203
+ max_length: 32,
204
+ },
205
+ {
206
+ name: 'metadata',
207
+ description: 'Additional document metadata as JSON string',
208
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
209
+ max_length: 65535,
210
+ },
211
+ ];
212
+ const createCollectionParams = {
213
+ collection_name: collectionName,
214
+ description: description || `Claude Context collection: ${collectionName}`,
215
+ fields: schema,
216
+ };
217
+ if (!this.client) {
218
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
219
+ }
220
+ await this.client.createCollection(createCollectionParams);
221
+ // Create index
222
+ const indexParams = {
223
+ collection_name: collectionName,
224
+ field_name: 'vector',
225
+ index_name: 'vector_index',
226
+ index_type: 'AUTOINDEX',
227
+ metric_type: milvus2_sdk_node_1.MetricType.COSINE,
228
+ };
229
+ console.log(`[MilvusDB] 🔧 Creating index for field 'vector' in collection '${collectionName}'...`);
230
+ await this.client.createIndex(indexParams);
231
+ // Wait for index to be ready before loading collection
232
+ await this.waitForIndexReady(collectionName, 'vector');
233
+ // Load collection to memory with retry logic
234
+ await this.loadCollectionWithRetry(collectionName);
235
+ // Verify collection is created correctly
236
+ await this.client.describeCollection({
237
+ collection_name: collectionName,
238
+ });
239
+ }
240
+ async dropCollection(collectionName) {
241
+ await this.ensureInitialized();
242
+ if (!this.client) {
243
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
244
+ }
245
+ await this.client.dropCollection({
246
+ collection_name: collectionName,
247
+ });
248
+ }
249
+ async hasCollection(collectionName) {
250
+ await this.ensureInitialized();
251
+ if (!this.client) {
252
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
253
+ }
254
+ const result = await this.client.hasCollection({
255
+ collection_name: collectionName,
256
+ });
257
+ return Boolean(result.value);
258
+ }
259
+ async listCollections() {
260
+ await this.ensureInitialized();
261
+ if (!this.client) {
262
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
263
+ }
264
+ const result = await this.client.showCollections();
265
+ // Handle the response format - cast to any to avoid type errors
266
+ const collections = result.collection_names || result.collections || [];
267
+ return Array.isArray(collections) ? collections : [];
268
+ }
269
+ async insert(collectionName, documents) {
270
+ await this.ensureInitialized();
271
+ await this.ensureLoaded(collectionName);
272
+ if (!this.client) {
273
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
274
+ }
275
+ console.log('Inserting documents into collection:', collectionName);
276
+ const data = documents.map(doc => ({
277
+ id: doc.id,
278
+ vector: doc.vector,
279
+ content: doc.content,
280
+ relativePath: doc.relativePath,
281
+ startLine: doc.startLine,
282
+ endLine: doc.endLine,
283
+ fileExtension: doc.fileExtension,
284
+ metadata: JSON.stringify(doc.metadata),
285
+ }));
286
+ await this.client.insert({
287
+ collection_name: collectionName,
288
+ data: data,
289
+ });
290
+ }
291
+ async search(collectionName, queryVector, options) {
292
+ await this.ensureInitialized();
293
+ await this.ensureLoaded(collectionName);
294
+ if (!this.client) {
295
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
296
+ }
297
+ const searchParams = {
298
+ collection_name: collectionName,
299
+ data: [queryVector],
300
+ limit: options?.topK || 10,
301
+ output_fields: ['id', 'content', 'relativePath', 'startLine', 'endLine', 'fileExtension', 'metadata'],
302
+ };
303
+ // Apply boolean expression filter if provided (e.g., fileExtension in [".ts",".py"])
304
+ if (options?.filterExpr && options.filterExpr.trim().length > 0) {
305
+ searchParams.expr = options.filterExpr;
306
+ }
307
+ const searchResult = await this.client.search(searchParams);
308
+ if (!searchResult.results || searchResult.results.length === 0) {
309
+ return [];
310
+ }
311
+ return searchResult.results.map((result) => ({
312
+ document: {
313
+ id: result.id,
314
+ vector: queryVector,
315
+ content: result.content,
316
+ relativePath: result.relativePath,
317
+ startLine: result.startLine,
318
+ endLine: result.endLine,
319
+ fileExtension: result.fileExtension,
320
+ metadata: JSON.parse(result.metadata || '{}'),
321
+ },
322
+ score: result.score,
323
+ }));
324
+ }
325
+ async delete(collectionName, ids) {
326
+ await this.ensureInitialized();
327
+ await this.ensureLoaded(collectionName);
328
+ if (!this.client) {
329
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
330
+ }
331
+ await this.client.delete({
332
+ collection_name: collectionName,
333
+ filter: `id in [${ids.map(id => `"${id}"`).join(', ')}]`,
334
+ });
335
+ }
336
+ async query(collectionName, filter, outputFields, limit) {
337
+ await this.ensureInitialized();
338
+ await this.ensureLoaded(collectionName);
339
+ if (!this.client) {
340
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
341
+ }
342
+ try {
343
+ const queryParams = {
344
+ collection_name: collectionName,
345
+ filter: filter,
346
+ output_fields: outputFields,
347
+ };
348
+ // Add limit if provided, or default for empty filter expressions
349
+ if (limit !== undefined) {
350
+ queryParams.limit = limit;
351
+ }
352
+ else if (filter === '' || filter.trim() === '') {
353
+ // Milvus requires limit when using empty expressions
354
+ queryParams.limit = 16384; // Default limit for empty filters
355
+ }
356
+ const result = await this.client.query(queryParams);
357
+ if (result.status.error_code !== 'Success') {
358
+ throw new Error(`Failed to query Milvus: ${result.status.reason}`);
359
+ }
360
+ return result.data || [];
361
+ }
362
+ catch (error) {
363
+ console.error(`[MilvusDB] ❌ Failed to query collection '${collectionName}':`, error);
364
+ throw error;
365
+ }
366
+ }
367
+ async createHybridCollection(collectionName, dimension, description) {
368
+ await this.ensureInitialized();
369
+ console.log('Beginning hybrid collection creation:', collectionName);
370
+ console.log('Collection dimension:', dimension);
371
+ const schema = [
372
+ {
373
+ name: 'id',
374
+ description: 'Document ID',
375
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
376
+ max_length: 512,
377
+ is_primary_key: true,
378
+ },
379
+ {
380
+ name: 'content',
381
+ description: 'Full text content for BM25 and storage',
382
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
383
+ max_length: 65535,
384
+ enable_analyzer: true,
385
+ },
386
+ {
387
+ name: 'vector',
388
+ description: 'Dense vector embedding',
389
+ data_type: milvus2_sdk_node_1.DataType.FloatVector,
390
+ dim: dimension,
391
+ },
392
+ {
393
+ name: 'sparse_vector',
394
+ description: 'Sparse vector embedding from BM25',
395
+ data_type: milvus2_sdk_node_1.DataType.SparseFloatVector,
396
+ },
397
+ {
398
+ name: 'relativePath',
399
+ description: 'Relative path to the codebase',
400
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
401
+ max_length: 1024,
402
+ },
403
+ {
404
+ name: 'startLine',
405
+ description: 'Start line number of the chunk',
406
+ data_type: milvus2_sdk_node_1.DataType.Int64,
407
+ },
408
+ {
409
+ name: 'endLine',
410
+ description: 'End line number of the chunk',
411
+ data_type: milvus2_sdk_node_1.DataType.Int64,
412
+ },
413
+ {
414
+ name: 'fileExtension',
415
+ description: 'File extension',
416
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
417
+ max_length: 32,
418
+ },
419
+ {
420
+ name: 'metadata',
421
+ description: 'Additional document metadata as JSON string',
422
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
423
+ max_length: 65535,
424
+ },
425
+ ];
426
+ // Add BM25 function
427
+ const functions = [
428
+ {
429
+ name: "content_bm25_emb",
430
+ description: "content bm25 function",
431
+ type: milvus2_sdk_node_1.FunctionType.BM25,
432
+ input_field_names: ["content"],
433
+ output_field_names: ["sparse_vector"],
434
+ params: {},
435
+ },
436
+ ];
437
+ const createCollectionParams = {
438
+ collection_name: collectionName,
439
+ description: description || `Hybrid code context collection: ${collectionName}`,
440
+ fields: schema,
441
+ functions: functions,
442
+ };
443
+ if (!this.client) {
444
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
445
+ }
446
+ await this.client.createCollection(createCollectionParams);
447
+ // Create indexes for both vector fields
448
+ // Index for dense vector
449
+ const denseIndexParams = {
450
+ collection_name: collectionName,
451
+ field_name: 'vector',
452
+ index_name: 'vector_index',
453
+ index_type: 'AUTOINDEX',
454
+ metric_type: milvus2_sdk_node_1.MetricType.COSINE,
455
+ };
456
+ console.log(`[MilvusDB] 🔧 Creating dense vector index for field 'vector' in collection '${collectionName}'...`);
457
+ await this.client.createIndex(denseIndexParams);
458
+ // Wait for dense vector index to be ready
459
+ await this.waitForIndexReady(collectionName, 'vector');
460
+ // Index for sparse vector
461
+ const sparseIndexParams = {
462
+ collection_name: collectionName,
463
+ field_name: 'sparse_vector',
464
+ index_name: 'sparse_vector_index',
465
+ index_type: 'SPARSE_INVERTED_INDEX',
466
+ metric_type: milvus2_sdk_node_1.MetricType.BM25,
467
+ };
468
+ console.log(`[MilvusDB] 🔧 Creating sparse vector index for field 'sparse_vector' in collection '${collectionName}'...`);
469
+ await this.client.createIndex(sparseIndexParams);
470
+ // Wait for sparse vector index to be ready
471
+ await this.waitForIndexReady(collectionName, 'sparse_vector');
472
+ // Load collection to memory with retry logic
473
+ await this.loadCollectionWithRetry(collectionName);
474
+ // Verify collection is created correctly
475
+ await this.client.describeCollection({
476
+ collection_name: collectionName,
477
+ });
478
+ }
479
+ async insertHybrid(collectionName, documents) {
480
+ await this.ensureInitialized();
481
+ await this.ensureLoaded(collectionName);
482
+ if (!this.client) {
483
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
484
+ }
485
+ const data = documents.map(doc => ({
486
+ id: doc.id,
487
+ content: doc.content,
488
+ vector: doc.vector,
489
+ relativePath: doc.relativePath,
490
+ startLine: doc.startLine,
491
+ endLine: doc.endLine,
492
+ fileExtension: doc.fileExtension,
493
+ metadata: JSON.stringify(doc.metadata),
494
+ }));
495
+ await this.client.insert({
496
+ collection_name: collectionName,
497
+ data: data,
498
+ });
499
+ }
500
+ async hybridSearch(collectionName, searchRequests, options) {
501
+ await this.ensureInitialized();
502
+ await this.ensureLoaded(collectionName);
503
+ if (!this.client) {
504
+ throw new Error('MilvusClient is not initialized after ensureInitialized().');
505
+ }
506
+ try {
507
+ // Generate OpenAI embedding for the first search request (dense)
508
+ console.log(`[MilvusDB] 🔍 Preparing hybrid search for collection: ${collectionName}`);
509
+ // Prepare search requests in the correct Milvus format
510
+ const search_param_1 = {
511
+ data: Array.isArray(searchRequests[0].data) ? searchRequests[0].data : [searchRequests[0].data],
512
+ anns_field: searchRequests[0].anns_field, // "vector"
513
+ param: searchRequests[0].param, // {"nprobe": 10}
514
+ limit: searchRequests[0].limit
515
+ };
516
+ const search_param_2 = {
517
+ data: searchRequests[1].data, // query text for sparse search
518
+ anns_field: searchRequests[1].anns_field, // "sparse_vector"
519
+ param: searchRequests[1].param, // {"drop_ratio_search": 0.2}
520
+ limit: searchRequests[1].limit
521
+ };
522
+ // Set rerank strategy to RRF (100) by default
523
+ const rerank_strategy = {
524
+ strategy: "rrf",
525
+ params: {
526
+ k: 100
527
+ }
528
+ };
529
+ console.log(`[MilvusDB] 🔍 Dense search params:`, JSON.stringify({
530
+ anns_field: search_param_1.anns_field,
531
+ param: search_param_1.param,
532
+ limit: search_param_1.limit,
533
+ data_length: Array.isArray(search_param_1.data[0]) ? search_param_1.data[0].length : 'N/A'
534
+ }, null, 2));
535
+ console.log(`[MilvusDB] 🔍 Sparse search params:`, JSON.stringify({
536
+ anns_field: search_param_2.anns_field,
537
+ param: search_param_2.param,
538
+ limit: search_param_2.limit,
539
+ query_text: typeof search_param_2.data === 'string' ? search_param_2.data.substring(0, 50) + '...' : 'N/A'
540
+ }, null, 2));
541
+ console.log(`[MilvusDB] 🔍 Rerank strategy:`, JSON.stringify(rerank_strategy, null, 2));
542
+ // Execute hybrid search using the correct client.search format
543
+ const searchParams = {
544
+ collection_name: collectionName,
545
+ data: [search_param_1, search_param_2],
546
+ limit: options?.limit || searchRequests[0]?.limit || 10,
547
+ rerank: rerank_strategy,
548
+ output_fields: ['id', 'content', 'relativePath', 'startLine', 'endLine', 'fileExtension', 'metadata'],
549
+ };
550
+ if (options?.filterExpr && options.filterExpr.trim().length > 0) {
551
+ searchParams.expr = options.filterExpr;
552
+ }
553
+ console.log(`[MilvusDB] 🔍 Complete search request:`, JSON.stringify({
554
+ collection_name: searchParams.collection_name,
555
+ data_count: searchParams.data.length,
556
+ limit: searchParams.limit,
557
+ rerank: searchParams.rerank,
558
+ output_fields: searchParams.output_fields,
559
+ expr: searchParams.expr
560
+ }, null, 2));
561
+ const searchResult = await this.client.search(searchParams);
562
+ console.log(`[MilvusDB] 🔍 Search executed, processing results...`);
563
+ if (!searchResult.results || searchResult.results.length === 0) {
564
+ console.log(`[MilvusDB] ⚠️ No results returned from Milvus search`);
565
+ return [];
566
+ }
567
+ console.log(`[MilvusDB] ✅ Found ${searchResult.results.length} results from hybrid search`);
568
+ // Transform results to HybridSearchResult format
569
+ return searchResult.results.map((result) => ({
570
+ document: {
571
+ id: result.id,
572
+ content: result.content,
573
+ vector: [],
574
+ sparse_vector: [],
575
+ relativePath: result.relativePath,
576
+ startLine: result.startLine,
577
+ endLine: result.endLine,
578
+ fileExtension: result.fileExtension,
579
+ metadata: JSON.parse(result.metadata || '{}'),
580
+ },
581
+ score: result.score,
582
+ }));
583
+ }
584
+ catch (error) {
585
+ console.error(`[MilvusDB] ❌ Failed to perform hybrid search on collection '${collectionName}':`, error);
586
+ throw error;
587
+ }
588
+ }
589
+ /**
590
+ * Wrapper method to handle collection creation with limit detection for gRPC client
591
+ * Returns true if collection can be created, false if limit exceeded
592
+ */
593
+ async checkCollectionLimit() {
594
+ if (!this.client) {
595
+ throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
596
+ }
597
+ const collectionName = `dummy_collection_${Date.now()}`;
598
+ const createCollectionParams = {
599
+ collection_name: collectionName,
600
+ description: 'Test collection for limit check',
601
+ fields: [
602
+ {
603
+ name: 'id',
604
+ data_type: milvus2_sdk_node_1.DataType.VarChar,
605
+ max_length: 512,
606
+ is_primary_key: true,
607
+ },
608
+ {
609
+ name: 'vector',
610
+ data_type: milvus2_sdk_node_1.DataType.FloatVector,
611
+ dim: 128,
612
+ }
613
+ ]
614
+ };
615
+ try {
616
+ await this.client.createCollection(createCollectionParams);
617
+ // Immediately drop the collection after successful creation
618
+ if (await this.client.hasCollection({ collection_name: collectionName })) {
619
+ await this.client.dropCollection({
620
+ collection_name: collectionName,
621
+ });
622
+ }
623
+ return true;
624
+ }
625
+ catch (error) {
626
+ // Check if the error message contains the collection limit exceeded pattern
627
+ const errorMessage = error.message || error.toString() || '';
628
+ if (/exceeded the limit number of collections/i.test(errorMessage)) {
629
+ // Return false for collection limit exceeded
630
+ return false;
631
+ }
632
+ // Re-throw other errors as-is
633
+ throw error;
634
+ }
635
+ }
636
+ }
637
+ exports.MilvusVectorDatabase = MilvusVectorDatabase;
638
+ //# sourceMappingURL=milvus-vectordb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milvus-vectordb.js","sourceRoot":"","sources":["../../src/vectordb/milvus-vectordb.ts"],"names":[],"mappings":"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"}