@pleaseai/context-please-core 0.1.0

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