@soulcraft/brainy 0.41.0 → 0.44.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 (205) hide show
  1. package/README.md +605 -194
  2. package/dist/augmentationFactory.d.ts.map +1 -0
  3. package/dist/augmentationFactory.js +342 -0
  4. package/dist/augmentationFactory.js.map +1 -0
  5. package/dist/augmentationPipeline.d.ts.map +1 -0
  6. package/dist/augmentationPipeline.js +472 -0
  7. package/dist/augmentationPipeline.js.map +1 -0
  8. package/dist/augmentationRegistry.d.ts.map +1 -0
  9. package/dist/augmentationRegistry.js +105 -0
  10. package/dist/augmentationRegistry.js.map +1 -0
  11. package/dist/augmentationRegistryLoader.d.ts.map +1 -0
  12. package/dist/augmentationRegistryLoader.js +213 -0
  13. package/dist/augmentationRegistryLoader.js.map +1 -0
  14. package/dist/augmentations/conduitAugmentations.js +1158 -0
  15. package/dist/augmentations/conduitAugmentations.js.map +1 -0
  16. package/dist/augmentations/memoryAugmentations.d.ts +2 -0
  17. package/dist/augmentations/memoryAugmentations.d.ts.map +1 -1
  18. package/dist/augmentations/memoryAugmentations.js +270 -0
  19. package/dist/augmentations/memoryAugmentations.js.map +1 -0
  20. package/dist/augmentations/serverSearchAugmentations.js +531 -0
  21. package/dist/augmentations/serverSearchAugmentations.js.map +1 -0
  22. package/dist/brainyData.d.ts.map +1 -0
  23. package/dist/brainyData.js +3999 -0
  24. package/dist/brainyData.js.map +1 -0
  25. package/dist/browserFramework.d.ts +15 -0
  26. package/dist/browserFramework.d.ts.map +1 -0
  27. package/dist/browserFramework.js +31 -0
  28. package/dist/browserFramework.js.map +1 -0
  29. package/dist/coreTypes.d.ts.map +1 -0
  30. package/dist/coreTypes.js +5 -0
  31. package/dist/coreTypes.js.map +1 -0
  32. package/dist/demo.d.ts +106 -0
  33. package/dist/demo.d.ts.map +1 -0
  34. package/dist/demo.js +201 -0
  35. package/dist/demo.js.map +1 -0
  36. package/dist/distributed/configManager.d.ts.map +1 -0
  37. package/dist/distributed/configManager.js +322 -0
  38. package/dist/distributed/configManager.js.map +1 -0
  39. package/dist/distributed/domainDetector.d.ts.map +1 -0
  40. package/dist/distributed/domainDetector.js +307 -0
  41. package/dist/distributed/domainDetector.js.map +1 -0
  42. package/dist/distributed/hashPartitioner.d.ts.map +1 -0
  43. package/dist/distributed/hashPartitioner.js +146 -0
  44. package/dist/distributed/hashPartitioner.js.map +1 -0
  45. package/dist/distributed/healthMonitor.d.ts.map +1 -0
  46. package/dist/distributed/healthMonitor.js +244 -0
  47. package/dist/distributed/healthMonitor.js.map +1 -0
  48. package/dist/distributed/index.d.ts.map +1 -0
  49. package/dist/distributed/index.js +9 -0
  50. package/dist/distributed/index.js.map +1 -0
  51. package/dist/distributed/operationalModes.d.ts.map +1 -0
  52. package/dist/distributed/operationalModes.js +201 -0
  53. package/dist/distributed/operationalModes.js.map +1 -0
  54. package/dist/errors/brainyError.d.ts.map +1 -0
  55. package/dist/errors/brainyError.js +113 -0
  56. package/dist/errors/brainyError.js.map +1 -0
  57. package/dist/examples/basicUsage.js +118 -0
  58. package/dist/examples/basicUsage.js.map +1 -0
  59. package/dist/hnsw/distributedSearch.js +452 -0
  60. package/dist/hnsw/distributedSearch.js.map +1 -0
  61. package/dist/hnsw/hnswIndex.js +602 -0
  62. package/dist/hnsw/hnswIndex.js.map +1 -0
  63. package/dist/hnsw/hnswIndexOptimized.js +471 -0
  64. package/dist/hnsw/hnswIndexOptimized.js.map +1 -0
  65. package/dist/hnsw/optimizedHNSWIndex.js +313 -0
  66. package/dist/hnsw/optimizedHNSWIndex.js.map +1 -0
  67. package/dist/hnsw/partitionedHNSWIndex.js +304 -0
  68. package/dist/hnsw/partitionedHNSWIndex.js.map +1 -0
  69. package/dist/hnsw/scaledHNSWSystem.js +559 -0
  70. package/dist/hnsw/scaledHNSWSystem.js.map +1 -0
  71. package/dist/index.d.ts +3 -2
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +81 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/mcp/brainyMCPAdapter.js +142 -0
  76. package/dist/mcp/brainyMCPAdapter.js.map +1 -0
  77. package/dist/mcp/brainyMCPService.js +248 -0
  78. package/dist/mcp/brainyMCPService.js.map +1 -0
  79. package/dist/mcp/index.js +17 -0
  80. package/dist/mcp/index.js.map +1 -0
  81. package/dist/mcp/mcpAugmentationToolset.js +180 -0
  82. package/dist/mcp/mcpAugmentationToolset.js.map +1 -0
  83. package/dist/pipeline.d.ts.map +1 -0
  84. package/dist/pipeline.js +590 -0
  85. package/dist/pipeline.js.map +1 -0
  86. package/dist/sequentialPipeline.d.ts.map +1 -0
  87. package/dist/sequentialPipeline.js +417 -0
  88. package/dist/sequentialPipeline.js.map +1 -0
  89. package/dist/setup.d.ts.map +1 -0
  90. package/dist/setup.js +46 -0
  91. package/dist/setup.js.map +1 -0
  92. package/dist/storage/adapters/baseStorageAdapter.js +349 -0
  93. package/dist/storage/adapters/baseStorageAdapter.js.map +1 -0
  94. package/dist/storage/adapters/batchS3Operations.js +287 -0
  95. package/dist/storage/adapters/batchS3Operations.js.map +1 -0
  96. package/dist/storage/adapters/fileSystemStorage.js +846 -0
  97. package/dist/storage/adapters/fileSystemStorage.js.map +1 -0
  98. package/dist/storage/adapters/memoryStorage.js +532 -0
  99. package/dist/storage/adapters/memoryStorage.js.map +1 -0
  100. package/dist/storage/adapters/opfsStorage.d.ts.map +1 -1
  101. package/dist/storage/adapters/opfsStorage.js +1118 -0
  102. package/dist/storage/adapters/opfsStorage.js.map +1 -0
  103. package/dist/storage/adapters/optimizedS3Search.js +248 -0
  104. package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
  105. package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
  106. package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
  107. package/dist/storage/baseStorage.js +603 -0
  108. package/dist/storage/baseStorage.js.map +1 -0
  109. package/dist/storage/cacheManager.js +1306 -0
  110. package/dist/storage/cacheManager.js.map +1 -0
  111. package/dist/storage/enhancedCacheManager.js +520 -0
  112. package/dist/storage/enhancedCacheManager.js.map +1 -0
  113. package/dist/storage/readOnlyOptimizations.js +425 -0
  114. package/dist/storage/readOnlyOptimizations.js.map +1 -0
  115. package/dist/storage/storageFactory.d.ts +0 -1
  116. package/dist/storage/storageFactory.d.ts.map +1 -1
  117. package/dist/storage/storageFactory.js +227 -0
  118. package/dist/storage/storageFactory.js.map +1 -0
  119. package/dist/types/augmentations.js +16 -0
  120. package/dist/types/augmentations.js.map +1 -0
  121. package/dist/types/brainyDataInterface.js +8 -0
  122. package/dist/types/brainyDataInterface.js.map +1 -0
  123. package/dist/types/distributedTypes.js +6 -0
  124. package/dist/types/distributedTypes.js.map +1 -0
  125. package/dist/types/fileSystemTypes.js +8 -0
  126. package/dist/types/fileSystemTypes.js.map +1 -0
  127. package/dist/types/graphTypes.js +247 -0
  128. package/dist/types/graphTypes.js.map +1 -0
  129. package/dist/types/mcpTypes.js +22 -0
  130. package/dist/types/mcpTypes.js.map +1 -0
  131. package/dist/types/paginationTypes.js +5 -0
  132. package/dist/types/paginationTypes.js.map +1 -0
  133. package/dist/types/pipelineTypes.js +7 -0
  134. package/dist/types/pipelineTypes.js.map +1 -0
  135. package/dist/types/tensorflowTypes.js +6 -0
  136. package/dist/types/tensorflowTypes.js.map +1 -0
  137. package/dist/unified.d.ts.map +1 -0
  138. package/dist/unified.js +52 -128251
  139. package/dist/unified.js.map +1 -0
  140. package/dist/utils/autoConfiguration.js +341 -0
  141. package/dist/utils/autoConfiguration.js.map +1 -0
  142. package/dist/utils/cacheAutoConfig.js +261 -0
  143. package/dist/utils/cacheAutoConfig.js.map +1 -0
  144. package/dist/utils/crypto.js +45 -0
  145. package/dist/utils/crypto.js.map +1 -0
  146. package/dist/utils/distance.js +239 -0
  147. package/dist/utils/distance.js.map +1 -0
  148. package/dist/utils/embedding.d.ts.map +1 -1
  149. package/dist/utils/embedding.js +702 -0
  150. package/dist/utils/embedding.js.map +1 -0
  151. package/dist/utils/environment.js +75 -0
  152. package/dist/utils/environment.js.map +1 -0
  153. package/dist/utils/fieldNameTracking.js +90 -0
  154. package/dist/utils/fieldNameTracking.js.map +1 -0
  155. package/dist/utils/index.d.ts +1 -0
  156. package/dist/utils/index.d.ts.map +1 -1
  157. package/dist/utils/index.js +8 -0
  158. package/dist/utils/index.js.map +1 -0
  159. package/dist/utils/jsonProcessing.js +179 -0
  160. package/dist/utils/jsonProcessing.js.map +1 -0
  161. package/dist/utils/logger.js +129 -0
  162. package/dist/utils/logger.js.map +1 -0
  163. package/dist/utils/operationUtils.js +126 -0
  164. package/dist/utils/operationUtils.js.map +1 -0
  165. package/dist/utils/robustModelLoader.d.ts +14 -0
  166. package/dist/utils/robustModelLoader.d.ts.map +1 -1
  167. package/dist/utils/robustModelLoader.js +537 -0
  168. package/dist/utils/robustModelLoader.js.map +1 -0
  169. package/dist/utils/searchCache.js +248 -0
  170. package/dist/utils/searchCache.js.map +1 -0
  171. package/dist/utils/statistics.js +25 -0
  172. package/dist/utils/statistics.js.map +1 -0
  173. package/dist/utils/statisticsCollector.js +224 -0
  174. package/dist/utils/statisticsCollector.js.map +1 -0
  175. package/dist/utils/textEncoding.js +309 -0
  176. package/dist/utils/textEncoding.js.map +1 -0
  177. package/dist/utils/typeUtils.js +40 -0
  178. package/dist/utils/typeUtils.js.map +1 -0
  179. package/dist/utils/version.d.ts +15 -3
  180. package/dist/utils/version.d.ts.map +1 -1
  181. package/dist/utils/version.js +24 -0
  182. package/dist/utils/version.js.map +1 -0
  183. package/dist/utils/workerUtils.js +458 -0
  184. package/dist/utils/workerUtils.js.map +1 -0
  185. package/dist/worker.d.ts.map +1 -0
  186. package/dist/worker.js +54 -0
  187. package/dist/worker.js.map +1 -0
  188. package/package.json +30 -29
  189. package/dist/brainy.js +0 -90220
  190. package/dist/brainy.min.js +0 -12511
  191. package/dist/patched-platform-node.d.ts +0 -17
  192. package/dist/statistics/statisticsManager.d.ts +0 -121
  193. package/dist/storage/fileSystemStorage.d.ts +0 -73
  194. package/dist/storage/fileSystemStorage.d.ts.map +0 -1
  195. package/dist/storage/opfsStorage.d.ts +0 -236
  196. package/dist/storage/opfsStorage.d.ts.map +0 -1
  197. package/dist/storage/s3CompatibleStorage.d.ts +0 -157
  198. package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
  199. package/dist/testing/prettyReporter.d.ts +0 -23
  200. package/dist/testing/prettySummaryReporter.d.ts +0 -22
  201. package/dist/unified.min.js +0 -16153
  202. package/dist/utils/environmentDetection.d.ts +0 -47
  203. package/dist/utils/environmentDetection.d.ts.map +0 -1
  204. package/dist/utils/tensorflowUtils.d.ts +0 -17
  205. package/dist/utils/tensorflowUtils.d.ts.map +0 -1
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Base Storage Adapter
3
+ * Provides common functionality for all storage adapters, including statistics tracking
4
+ */
5
+ import { extractFieldNamesFromJson, mapToStandardField } from '../../utils/fieldNameTracking.js';
6
+ /**
7
+ * Base class for storage adapters that implements statistics tracking
8
+ */
9
+ export class BaseStorageAdapter {
10
+ constructor() {
11
+ // Statistics cache
12
+ this.statisticsCache = null;
13
+ // Batch update timer ID
14
+ this.statisticsBatchUpdateTimerId = null;
15
+ // Flag to indicate if statistics have been modified since last save
16
+ this.statisticsModified = false;
17
+ // Time of last statistics flush to storage
18
+ this.lastStatisticsFlushTime = 0;
19
+ // Minimum time between statistics flushes (5 seconds)
20
+ this.MIN_FLUSH_INTERVAL_MS = 5000;
21
+ // Maximum time to wait before flushing statistics (30 seconds)
22
+ this.MAX_FLUSH_DELAY_MS = 30000;
23
+ }
24
+ /**
25
+ * Save statistics data
26
+ * @param statistics The statistics data to save
27
+ */
28
+ async saveStatistics(statistics) {
29
+ // Update the cache with a deep copy to avoid reference issues
30
+ this.statisticsCache = {
31
+ nounCount: { ...statistics.nounCount },
32
+ verbCount: { ...statistics.verbCount },
33
+ metadataCount: { ...statistics.metadataCount },
34
+ hnswIndexSize: statistics.hnswIndexSize,
35
+ lastUpdated: statistics.lastUpdated
36
+ };
37
+ // Schedule a batch update instead of saving immediately
38
+ this.scheduleBatchUpdate();
39
+ }
40
+ /**
41
+ * Get statistics data
42
+ * @returns Promise that resolves to the statistics data
43
+ */
44
+ async getStatistics() {
45
+ // If we have cached statistics, return a deep copy
46
+ if (this.statisticsCache) {
47
+ return {
48
+ nounCount: { ...this.statisticsCache.nounCount },
49
+ verbCount: { ...this.statisticsCache.verbCount },
50
+ metadataCount: { ...this.statisticsCache.metadataCount },
51
+ hnswIndexSize: this.statisticsCache.hnswIndexSize,
52
+ lastUpdated: this.statisticsCache.lastUpdated
53
+ };
54
+ }
55
+ // Otherwise, get from storage
56
+ const statistics = await this.getStatisticsData();
57
+ // If we found statistics, update the cache
58
+ if (statistics) {
59
+ // Update the cache with a deep copy
60
+ this.statisticsCache = {
61
+ nounCount: { ...statistics.nounCount },
62
+ verbCount: { ...statistics.verbCount },
63
+ metadataCount: { ...statistics.metadataCount },
64
+ hnswIndexSize: statistics.hnswIndexSize,
65
+ lastUpdated: statistics.lastUpdated
66
+ };
67
+ }
68
+ return statistics;
69
+ }
70
+ /**
71
+ * Schedule a batch update of statistics
72
+ */
73
+ scheduleBatchUpdate() {
74
+ // Mark statistics as modified
75
+ this.statisticsModified = true;
76
+ // If a timer is already set, don't set another one
77
+ if (this.statisticsBatchUpdateTimerId !== null) {
78
+ return;
79
+ }
80
+ // Calculate time since last flush
81
+ const now = Date.now();
82
+ const timeSinceLastFlush = now - this.lastStatisticsFlushTime;
83
+ // If we've recently flushed, wait longer before the next flush
84
+ const delayMs = timeSinceLastFlush < this.MIN_FLUSH_INTERVAL_MS
85
+ ? this.MAX_FLUSH_DELAY_MS
86
+ : this.MIN_FLUSH_INTERVAL_MS;
87
+ // Schedule the batch update
88
+ this.statisticsBatchUpdateTimerId = setTimeout(() => {
89
+ this.flushStatistics();
90
+ }, delayMs);
91
+ }
92
+ /**
93
+ * Flush statistics to storage
94
+ */
95
+ async flushStatistics() {
96
+ // Clear the timer
97
+ if (this.statisticsBatchUpdateTimerId !== null) {
98
+ clearTimeout(this.statisticsBatchUpdateTimerId);
99
+ this.statisticsBatchUpdateTimerId = null;
100
+ }
101
+ // If statistics haven't been modified, no need to flush
102
+ if (!this.statisticsModified || !this.statisticsCache) {
103
+ return;
104
+ }
105
+ try {
106
+ // Save the statistics to storage
107
+ await this.saveStatisticsData(this.statisticsCache);
108
+ // Update the last flush time
109
+ this.lastStatisticsFlushTime = Date.now();
110
+ // Reset the modified flag
111
+ this.statisticsModified = false;
112
+ }
113
+ catch (error) {
114
+ console.error('Failed to flush statistics data:', error);
115
+ // Mark as still modified so we'll try again later
116
+ this.statisticsModified = true;
117
+ // Don't throw the error to avoid disrupting the application
118
+ }
119
+ }
120
+ /**
121
+ * Increment a statistic counter
122
+ * @param type The type of statistic to increment ('noun', 'verb', 'metadata')
123
+ * @param service The service that inserted the data
124
+ * @param amount The amount to increment by (default: 1)
125
+ */
126
+ async incrementStatistic(type, service, amount = 1) {
127
+ // Get current statistics from cache or storage
128
+ let statistics = this.statisticsCache;
129
+ if (!statistics) {
130
+ statistics = await this.getStatisticsData();
131
+ if (!statistics) {
132
+ statistics = this.createDefaultStatistics();
133
+ }
134
+ // Update the cache
135
+ this.statisticsCache = {
136
+ nounCount: { ...statistics.nounCount },
137
+ verbCount: { ...statistics.verbCount },
138
+ metadataCount: { ...statistics.metadataCount },
139
+ hnswIndexSize: statistics.hnswIndexSize,
140
+ lastUpdated: statistics.lastUpdated
141
+ };
142
+ }
143
+ // Increment the appropriate counter
144
+ const counterMap = {
145
+ noun: this.statisticsCache.nounCount,
146
+ verb: this.statisticsCache.verbCount,
147
+ metadata: this.statisticsCache.metadataCount
148
+ };
149
+ const counter = counterMap[type];
150
+ counter[service] = (counter[service] || 0) + amount;
151
+ // Update timestamp
152
+ this.statisticsCache.lastUpdated = new Date().toISOString();
153
+ // Schedule a batch update instead of saving immediately
154
+ this.scheduleBatchUpdate();
155
+ }
156
+ /**
157
+ * Decrement a statistic counter
158
+ * @param type The type of statistic to decrement ('noun', 'verb', 'metadata')
159
+ * @param service The service that inserted the data
160
+ * @param amount The amount to decrement by (default: 1)
161
+ */
162
+ async decrementStatistic(type, service, amount = 1) {
163
+ // Get current statistics from cache or storage
164
+ let statistics = this.statisticsCache;
165
+ if (!statistics) {
166
+ statistics = await this.getStatisticsData();
167
+ if (!statistics) {
168
+ statistics = this.createDefaultStatistics();
169
+ }
170
+ // Update the cache
171
+ this.statisticsCache = {
172
+ nounCount: { ...statistics.nounCount },
173
+ verbCount: { ...statistics.verbCount },
174
+ metadataCount: { ...statistics.metadataCount },
175
+ hnswIndexSize: statistics.hnswIndexSize,
176
+ lastUpdated: statistics.lastUpdated
177
+ };
178
+ }
179
+ // Decrement the appropriate counter
180
+ const counterMap = {
181
+ noun: this.statisticsCache.nounCount,
182
+ verb: this.statisticsCache.verbCount,
183
+ metadata: this.statisticsCache.metadataCount
184
+ };
185
+ const counter = counterMap[type];
186
+ counter[service] = Math.max(0, (counter[service] || 0) - amount);
187
+ // Update timestamp
188
+ this.statisticsCache.lastUpdated = new Date().toISOString();
189
+ // Schedule a batch update instead of saving immediately
190
+ this.scheduleBatchUpdate();
191
+ }
192
+ /**
193
+ * Update the HNSW index size statistic
194
+ * @param size The new size of the HNSW index
195
+ */
196
+ async updateHnswIndexSize(size) {
197
+ // Get current statistics from cache or storage
198
+ let statistics = this.statisticsCache;
199
+ if (!statistics) {
200
+ statistics = await this.getStatisticsData();
201
+ if (!statistics) {
202
+ statistics = this.createDefaultStatistics();
203
+ }
204
+ // Update the cache
205
+ this.statisticsCache = {
206
+ nounCount: { ...statistics.nounCount },
207
+ verbCount: { ...statistics.verbCount },
208
+ metadataCount: { ...statistics.metadataCount },
209
+ hnswIndexSize: statistics.hnswIndexSize,
210
+ lastUpdated: statistics.lastUpdated
211
+ };
212
+ }
213
+ // Update HNSW index size
214
+ this.statisticsCache.hnswIndexSize = size;
215
+ // Update timestamp
216
+ this.statisticsCache.lastUpdated = new Date().toISOString();
217
+ // Schedule a batch update instead of saving immediately
218
+ this.scheduleBatchUpdate();
219
+ }
220
+ /**
221
+ * Force an immediate flush of statistics to storage
222
+ * This ensures that any pending statistics updates are written to persistent storage
223
+ */
224
+ async flushStatisticsToStorage() {
225
+ // If there are no statistics in cache or they haven't been modified, nothing to flush
226
+ if (!this.statisticsCache || !this.statisticsModified) {
227
+ return;
228
+ }
229
+ // Call the protected flushStatistics method to immediately write to storage
230
+ await this.flushStatistics();
231
+ }
232
+ /**
233
+ * Track field names from a JSON document
234
+ * @param jsonDocument The JSON document to extract field names from
235
+ * @param service The service that inserted the data
236
+ */
237
+ async trackFieldNames(jsonDocument, service) {
238
+ // Skip if not a JSON object
239
+ if (typeof jsonDocument !== 'object' || jsonDocument === null || Array.isArray(jsonDocument)) {
240
+ return;
241
+ }
242
+ // Get current statistics from cache or storage
243
+ let statistics = this.statisticsCache;
244
+ if (!statistics) {
245
+ statistics = await this.getStatisticsData();
246
+ if (!statistics) {
247
+ statistics = this.createDefaultStatistics();
248
+ }
249
+ // Update the cache
250
+ this.statisticsCache = {
251
+ ...statistics,
252
+ nounCount: { ...statistics.nounCount },
253
+ verbCount: { ...statistics.verbCount },
254
+ metadataCount: { ...statistics.metadataCount },
255
+ fieldNames: { ...statistics.fieldNames },
256
+ standardFieldMappings: { ...statistics.standardFieldMappings }
257
+ };
258
+ }
259
+ // Ensure fieldNames exists
260
+ if (!this.statisticsCache.fieldNames) {
261
+ this.statisticsCache.fieldNames = {};
262
+ }
263
+ // Ensure standardFieldMappings exists
264
+ if (!this.statisticsCache.standardFieldMappings) {
265
+ this.statisticsCache.standardFieldMappings = {};
266
+ }
267
+ // Extract field names from the JSON document
268
+ const fieldNames = extractFieldNamesFromJson(jsonDocument);
269
+ // Initialize service entry if it doesn't exist
270
+ if (!this.statisticsCache.fieldNames[service]) {
271
+ this.statisticsCache.fieldNames[service] = [];
272
+ }
273
+ // Add new field names to the service's list
274
+ for (const fieldName of fieldNames) {
275
+ if (!this.statisticsCache.fieldNames[service].includes(fieldName)) {
276
+ this.statisticsCache.fieldNames[service].push(fieldName);
277
+ }
278
+ // Map to standard field if possible
279
+ const standardField = mapToStandardField(fieldName);
280
+ if (standardField) {
281
+ // Initialize standard field entry if it doesn't exist
282
+ if (!this.statisticsCache.standardFieldMappings[standardField]) {
283
+ this.statisticsCache.standardFieldMappings[standardField] = {};
284
+ }
285
+ // Initialize service entry if it doesn't exist
286
+ if (!this.statisticsCache.standardFieldMappings[standardField][service]) {
287
+ this.statisticsCache.standardFieldMappings[standardField][service] = [];
288
+ }
289
+ // Add field name to standard field mapping if not already there
290
+ if (!this.statisticsCache.standardFieldMappings[standardField][service].includes(fieldName)) {
291
+ this.statisticsCache.standardFieldMappings[standardField][service].push(fieldName);
292
+ }
293
+ }
294
+ }
295
+ // Update timestamp
296
+ this.statisticsCache.lastUpdated = new Date().toISOString();
297
+ // Schedule a batch update
298
+ this.statisticsModified = true;
299
+ this.scheduleBatchUpdate();
300
+ }
301
+ /**
302
+ * Get available field names by service
303
+ * @returns Record of field names by service
304
+ */
305
+ async getAvailableFieldNames() {
306
+ // Get current statistics from cache or storage
307
+ let statistics = this.statisticsCache;
308
+ if (!statistics) {
309
+ statistics = await this.getStatisticsData();
310
+ if (!statistics) {
311
+ return {};
312
+ }
313
+ }
314
+ // Return field names by service
315
+ return statistics.fieldNames || {};
316
+ }
317
+ /**
318
+ * Get standard field mappings
319
+ * @returns Record of standard field mappings
320
+ */
321
+ async getStandardFieldMappings() {
322
+ // Get current statistics from cache or storage
323
+ let statistics = this.statisticsCache;
324
+ if (!statistics) {
325
+ statistics = await this.getStatisticsData();
326
+ if (!statistics) {
327
+ return {};
328
+ }
329
+ }
330
+ // Return standard field mappings
331
+ return statistics.standardFieldMappings || {};
332
+ }
333
+ /**
334
+ * Create default statistics data
335
+ * @returns Default statistics data
336
+ */
337
+ createDefaultStatistics() {
338
+ return {
339
+ nounCount: {},
340
+ verbCount: {},
341
+ metadataCount: {},
342
+ hnswIndexSize: 0,
343
+ fieldNames: {},
344
+ standardFieldMappings: {},
345
+ lastUpdated: new Date().toISOString()
346
+ };
347
+ }
348
+ }
349
+ //# sourceMappingURL=baseStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseStorageAdapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/baseStorageAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Enhanced Batch S3 Operations for High-Performance Vector Retrieval
3
+ * Implements optimized batch operations to reduce S3 API calls and latency
4
+ */
5
+ /**
6
+ * High-performance batch operations for S3-compatible storage
7
+ * Optimizes retrieval patterns for HNSW search operations
8
+ */
9
+ export class BatchS3Operations {
10
+ constructor(s3Client, bucketName, options = {}) {
11
+ this.s3Client = s3Client;
12
+ this.bucketName = bucketName;
13
+ this.options = {
14
+ maxConcurrency: 50, // AWS S3 rate limit friendly
15
+ prefetchSize: 100,
16
+ useS3Select: false,
17
+ compressionEnabled: false,
18
+ ...options
19
+ };
20
+ }
21
+ /**
22
+ * Batch retrieve HNSW nodes with intelligent prefetching
23
+ */
24
+ async batchGetNodes(nodeIds, prefix = 'nodes/') {
25
+ const startTime = Date.now();
26
+ const result = {
27
+ items: new Map(),
28
+ errors: new Map(),
29
+ statistics: {
30
+ totalRequested: nodeIds.length,
31
+ totalRetrieved: 0,
32
+ totalErrors: 0,
33
+ duration: 0,
34
+ apiCalls: 0
35
+ }
36
+ };
37
+ if (nodeIds.length === 0) {
38
+ result.statistics.duration = Date.now() - startTime;
39
+ return result;
40
+ }
41
+ // Use different strategies based on request size
42
+ if (nodeIds.length <= 10) {
43
+ // Small batch - use parallel GetObject
44
+ await this.parallelGetObjects(nodeIds, prefix, result);
45
+ }
46
+ else if (nodeIds.length <= 1000) {
47
+ // Medium batch - use chunked parallel with prefetching
48
+ await this.chunkedParallelGet(nodeIds, prefix, result);
49
+ }
50
+ else {
51
+ // Large batch - use S3 list-based approach with filtering
52
+ await this.listBasedBatchGet(nodeIds, prefix, result);
53
+ }
54
+ result.statistics.duration = Date.now() - startTime;
55
+ return result;
56
+ }
57
+ /**
58
+ * Parallel GetObject operations for small batches
59
+ */
60
+ async parallelGetObjects(ids, prefix, result) {
61
+ const { GetObjectCommand } = await import('@aws-sdk/client-s3');
62
+ const semaphore = new Semaphore(this.options.maxConcurrency);
63
+ const promises = ids.map(async (id) => {
64
+ await semaphore.acquire();
65
+ try {
66
+ result.statistics.apiCalls++;
67
+ const response = await this.s3Client.send(new GetObjectCommand({
68
+ Bucket: this.bucketName,
69
+ Key: `${prefix}${id}.json`
70
+ }));
71
+ if (response.Body) {
72
+ const content = await response.Body.transformToString();
73
+ const item = this.parseStoredObject(content);
74
+ if (item) {
75
+ result.items.set(id, item);
76
+ result.statistics.totalRetrieved++;
77
+ }
78
+ }
79
+ }
80
+ catch (error) {
81
+ result.errors.set(id, error);
82
+ result.statistics.totalErrors++;
83
+ }
84
+ finally {
85
+ semaphore.release();
86
+ }
87
+ });
88
+ await Promise.all(promises);
89
+ }
90
+ /**
91
+ * Chunked parallel retrieval with intelligent batching
92
+ */
93
+ async chunkedParallelGet(ids, prefix, result) {
94
+ const chunkSize = Math.min(50, Math.ceil(ids.length / 10));
95
+ const chunks = this.chunkArray(ids, chunkSize);
96
+ // Process chunks with controlled concurrency
97
+ const semaphore = new Semaphore(Math.min(5, chunks.length));
98
+ const chunkPromises = chunks.map(async (chunk) => {
99
+ await semaphore.acquire();
100
+ try {
101
+ await this.parallelGetObjects(chunk, prefix, result);
102
+ }
103
+ finally {
104
+ semaphore.release();
105
+ }
106
+ });
107
+ await Promise.all(chunkPromises);
108
+ }
109
+ /**
110
+ * List-based batch retrieval for large datasets
111
+ * Uses S3 ListObjects to reduce API calls
112
+ */
113
+ async listBasedBatchGet(ids, prefix, result) {
114
+ const { ListObjectsV2Command, GetObjectCommand } = await import('@aws-sdk/client-s3');
115
+ // Create a set for O(1) lookup
116
+ const idSet = new Set(ids);
117
+ // List objects with the prefix
118
+ let continuationToken;
119
+ const maxKeys = 1000;
120
+ do {
121
+ result.statistics.apiCalls++;
122
+ const listResponse = await this.s3Client.send(new ListObjectsV2Command({
123
+ Bucket: this.bucketName,
124
+ Prefix: prefix,
125
+ MaxKeys: maxKeys,
126
+ ContinuationToken: continuationToken
127
+ }));
128
+ if (listResponse.Contents) {
129
+ // Filter objects that match our requested IDs
130
+ const matchingObjects = listResponse.Contents.filter((obj) => {
131
+ if (!obj.Key)
132
+ return false;
133
+ const id = obj.Key.replace(prefix, '').replace('.json', '');
134
+ return idSet.has(id);
135
+ });
136
+ // Batch retrieve matching objects
137
+ const semaphore = new Semaphore(this.options.maxConcurrency);
138
+ const retrievalPromises = matchingObjects.map(async (obj) => {
139
+ if (!obj.Key)
140
+ return;
141
+ await semaphore.acquire();
142
+ try {
143
+ result.statistics.apiCalls++;
144
+ const response = await this.s3Client.send(new GetObjectCommand({
145
+ Bucket: this.bucketName,
146
+ Key: obj.Key
147
+ }));
148
+ if (response.Body) {
149
+ const content = await response.Body.transformToString();
150
+ const item = this.parseStoredObject(content);
151
+ if (item) {
152
+ const id = obj.Key.replace(prefix, '').replace('.json', '');
153
+ result.items.set(id, item);
154
+ result.statistics.totalRetrieved++;
155
+ }
156
+ }
157
+ }
158
+ catch (error) {
159
+ const id = obj.Key.replace(prefix, '').replace('.json', '');
160
+ result.errors.set(id, error);
161
+ result.statistics.totalErrors++;
162
+ }
163
+ finally {
164
+ semaphore.release();
165
+ }
166
+ });
167
+ await Promise.all(retrievalPromises);
168
+ }
169
+ continuationToken = listResponse.NextContinuationToken;
170
+ } while (continuationToken && result.items.size < ids.length);
171
+ }
172
+ /**
173
+ * Intelligent prefetch based on HNSW graph connectivity
174
+ */
175
+ async prefetchConnectedNodes(currentNodeIds, connectionMap, prefix = 'nodes/') {
176
+ // Analyze connection patterns to predict next nodes
177
+ const predictedNodes = new Set();
178
+ for (const nodeId of currentNodeIds) {
179
+ const connections = connectionMap.get(nodeId);
180
+ if (connections) {
181
+ // Add immediate neighbors
182
+ connections.forEach(connId => predictedNodes.add(connId));
183
+ // Add second-degree neighbors (limited)
184
+ let count = 0;
185
+ for (const connId of connections) {
186
+ if (count >= 5)
187
+ break; // Limit prefetch scope
188
+ const secondDegree = connectionMap.get(connId);
189
+ if (secondDegree) {
190
+ secondDegree.forEach(id => {
191
+ if (count < 20) {
192
+ predictedNodes.add(id);
193
+ count++;
194
+ }
195
+ });
196
+ }
197
+ }
198
+ }
199
+ }
200
+ // Remove nodes we already have
201
+ const nodesToPrefetch = Array.from(predictedNodes).filter(id => !currentNodeIds.includes(id));
202
+ return this.batchGetNodes(nodesToPrefetch.slice(0, this.options.prefetchSize), prefix);
203
+ }
204
+ /**
205
+ * S3 Select-based retrieval for filtered queries
206
+ */
207
+ async selectiveRetrieve(prefix, filter) {
208
+ // This would use S3 Select to filter objects server-side
209
+ // Reducing data transfer for large-scale operations
210
+ const startTime = Date.now();
211
+ const result = {
212
+ items: new Map(),
213
+ errors: new Map(),
214
+ statistics: {
215
+ totalRequested: 0,
216
+ totalRetrieved: 0,
217
+ totalErrors: 0,
218
+ duration: 0,
219
+ apiCalls: 0
220
+ }
221
+ };
222
+ // S3 Select implementation would go here
223
+ // For now, fall back to list-based approach
224
+ console.warn('S3 Select not implemented, falling back to list-based retrieval');
225
+ result.statistics.duration = Date.now() - startTime;
226
+ return result;
227
+ }
228
+ /**
229
+ * Parse stored object from JSON string
230
+ */
231
+ parseStoredObject(content) {
232
+ try {
233
+ const parsed = JSON.parse(content);
234
+ // Reconstruct HNSW node structure
235
+ if (parsed.connections && typeof parsed.connections === 'object') {
236
+ const connections = new Map();
237
+ for (const [level, nodeIds] of Object.entries(parsed.connections)) {
238
+ connections.set(Number(level), new Set(nodeIds));
239
+ }
240
+ parsed.connections = connections;
241
+ }
242
+ return parsed;
243
+ }
244
+ catch (error) {
245
+ console.error('Failed to parse stored object:', error);
246
+ return null;
247
+ }
248
+ }
249
+ /**
250
+ * Utility function to chunk arrays
251
+ */
252
+ chunkArray(array, chunkSize) {
253
+ const chunks = [];
254
+ for (let i = 0; i < array.length; i += chunkSize) {
255
+ chunks.push(array.slice(i, i + chunkSize));
256
+ }
257
+ return chunks;
258
+ }
259
+ }
260
+ /**
261
+ * Simple semaphore implementation for concurrency control
262
+ */
263
+ class Semaphore {
264
+ constructor(permits) {
265
+ this.waiting = [];
266
+ this.permits = permits;
267
+ }
268
+ async acquire() {
269
+ if (this.permits > 0) {
270
+ this.permits--;
271
+ return Promise.resolve();
272
+ }
273
+ return new Promise((resolve) => {
274
+ this.waiting.push(resolve);
275
+ });
276
+ }
277
+ release() {
278
+ if (this.waiting.length > 0) {
279
+ const resolve = this.waiting.shift();
280
+ resolve();
281
+ }
282
+ else {
283
+ this.permits++;
284
+ }
285
+ }
286
+ }
287
+ //# sourceMappingURL=batchS3Operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchS3Operations.js","sourceRoot":"","sources":["../../../src/storage/adapters/batchS3Operations.ts"],"names":[],"mappings":"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"}