@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.
- package/README.md +605 -194
- package/dist/augmentationFactory.d.ts.map +1 -0
- package/dist/augmentationFactory.js +342 -0
- package/dist/augmentationFactory.js.map +1 -0
- package/dist/augmentationPipeline.d.ts.map +1 -0
- package/dist/augmentationPipeline.js +472 -0
- package/dist/augmentationPipeline.js.map +1 -0
- package/dist/augmentationRegistry.d.ts.map +1 -0
- package/dist/augmentationRegistry.js +105 -0
- package/dist/augmentationRegistry.js.map +1 -0
- package/dist/augmentationRegistryLoader.d.ts.map +1 -0
- package/dist/augmentationRegistryLoader.js +213 -0
- package/dist/augmentationRegistryLoader.js.map +1 -0
- package/dist/augmentations/conduitAugmentations.js +1158 -0
- package/dist/augmentations/conduitAugmentations.js.map +1 -0
- package/dist/augmentations/memoryAugmentations.d.ts +2 -0
- package/dist/augmentations/memoryAugmentations.d.ts.map +1 -1
- package/dist/augmentations/memoryAugmentations.js +270 -0
- package/dist/augmentations/memoryAugmentations.js.map +1 -0
- package/dist/augmentations/serverSearchAugmentations.js +531 -0
- package/dist/augmentations/serverSearchAugmentations.js.map +1 -0
- package/dist/brainyData.d.ts.map +1 -0
- package/dist/brainyData.js +3999 -0
- package/dist/brainyData.js.map +1 -0
- package/dist/browserFramework.d.ts +15 -0
- package/dist/browserFramework.d.ts.map +1 -0
- package/dist/browserFramework.js +31 -0
- package/dist/browserFramework.js.map +1 -0
- package/dist/coreTypes.d.ts.map +1 -0
- package/dist/coreTypes.js +5 -0
- package/dist/coreTypes.js.map +1 -0
- package/dist/demo.d.ts +106 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +201 -0
- package/dist/demo.js.map +1 -0
- package/dist/distributed/configManager.d.ts.map +1 -0
- package/dist/distributed/configManager.js +322 -0
- package/dist/distributed/configManager.js.map +1 -0
- package/dist/distributed/domainDetector.d.ts.map +1 -0
- package/dist/distributed/domainDetector.js +307 -0
- package/dist/distributed/domainDetector.js.map +1 -0
- package/dist/distributed/hashPartitioner.d.ts.map +1 -0
- package/dist/distributed/hashPartitioner.js +146 -0
- package/dist/distributed/hashPartitioner.js.map +1 -0
- package/dist/distributed/healthMonitor.d.ts.map +1 -0
- package/dist/distributed/healthMonitor.js +244 -0
- package/dist/distributed/healthMonitor.js.map +1 -0
- package/dist/distributed/index.d.ts.map +1 -0
- package/dist/distributed/index.js +9 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/distributed/operationalModes.d.ts.map +1 -0
- package/dist/distributed/operationalModes.js +201 -0
- package/dist/distributed/operationalModes.js.map +1 -0
- package/dist/errors/brainyError.d.ts.map +1 -0
- package/dist/errors/brainyError.js +113 -0
- package/dist/errors/brainyError.js.map +1 -0
- package/dist/examples/basicUsage.js +118 -0
- package/dist/examples/basicUsage.js.map +1 -0
- package/dist/hnsw/distributedSearch.js +452 -0
- package/dist/hnsw/distributedSearch.js.map +1 -0
- package/dist/hnsw/hnswIndex.js +602 -0
- package/dist/hnsw/hnswIndex.js.map +1 -0
- package/dist/hnsw/hnswIndexOptimized.js +471 -0
- package/dist/hnsw/hnswIndexOptimized.js.map +1 -0
- package/dist/hnsw/optimizedHNSWIndex.js +313 -0
- package/dist/hnsw/optimizedHNSWIndex.js.map +1 -0
- package/dist/hnsw/partitionedHNSWIndex.js +304 -0
- package/dist/hnsw/partitionedHNSWIndex.js.map +1 -0
- package/dist/hnsw/scaledHNSWSystem.js +559 -0
- package/dist/hnsw/scaledHNSWSystem.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/brainyMCPAdapter.js +142 -0
- package/dist/mcp/brainyMCPAdapter.js.map +1 -0
- package/dist/mcp/brainyMCPService.js +248 -0
- package/dist/mcp/brainyMCPService.js.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcpAugmentationToolset.js +180 -0
- package/dist/mcp/mcpAugmentationToolset.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +590 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/sequentialPipeline.d.ts.map +1 -0
- package/dist/sequentialPipeline.js +417 -0
- package/dist/sequentialPipeline.js.map +1 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +46 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage/adapters/baseStorageAdapter.js +349 -0
- package/dist/storage/adapters/baseStorageAdapter.js.map +1 -0
- package/dist/storage/adapters/batchS3Operations.js +287 -0
- package/dist/storage/adapters/batchS3Operations.js.map +1 -0
- package/dist/storage/adapters/fileSystemStorage.js +846 -0
- package/dist/storage/adapters/fileSystemStorage.js.map +1 -0
- package/dist/storage/adapters/memoryStorage.js +532 -0
- package/dist/storage/adapters/memoryStorage.js.map +1 -0
- package/dist/storage/adapters/opfsStorage.d.ts.map +1 -1
- package/dist/storage/adapters/opfsStorage.js +1118 -0
- package/dist/storage/adapters/opfsStorage.js.map +1 -0
- package/dist/storage/adapters/optimizedS3Search.js +248 -0
- package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
- package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
- package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
- package/dist/storage/baseStorage.js +603 -0
- package/dist/storage/baseStorage.js.map +1 -0
- package/dist/storage/cacheManager.js +1306 -0
- package/dist/storage/cacheManager.js.map +1 -0
- package/dist/storage/enhancedCacheManager.js +520 -0
- package/dist/storage/enhancedCacheManager.js.map +1 -0
- package/dist/storage/readOnlyOptimizations.js +425 -0
- package/dist/storage/readOnlyOptimizations.js.map +1 -0
- package/dist/storage/storageFactory.d.ts +0 -1
- package/dist/storage/storageFactory.d.ts.map +1 -1
- package/dist/storage/storageFactory.js +227 -0
- package/dist/storage/storageFactory.js.map +1 -0
- package/dist/types/augmentations.js +16 -0
- package/dist/types/augmentations.js.map +1 -0
- package/dist/types/brainyDataInterface.js +8 -0
- package/dist/types/brainyDataInterface.js.map +1 -0
- package/dist/types/distributedTypes.js +6 -0
- package/dist/types/distributedTypes.js.map +1 -0
- package/dist/types/fileSystemTypes.js +8 -0
- package/dist/types/fileSystemTypes.js.map +1 -0
- package/dist/types/graphTypes.js +247 -0
- package/dist/types/graphTypes.js.map +1 -0
- package/dist/types/mcpTypes.js +22 -0
- package/dist/types/mcpTypes.js.map +1 -0
- package/dist/types/paginationTypes.js +5 -0
- package/dist/types/paginationTypes.js.map +1 -0
- package/dist/types/pipelineTypes.js +7 -0
- package/dist/types/pipelineTypes.js.map +1 -0
- package/dist/types/tensorflowTypes.js +6 -0
- package/dist/types/tensorflowTypes.js.map +1 -0
- package/dist/unified.d.ts.map +1 -0
- package/dist/unified.js +52 -128251
- package/dist/unified.js.map +1 -0
- package/dist/utils/autoConfiguration.js +341 -0
- package/dist/utils/autoConfiguration.js.map +1 -0
- package/dist/utils/cacheAutoConfig.js +261 -0
- package/dist/utils/cacheAutoConfig.js.map +1 -0
- package/dist/utils/crypto.js +45 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/distance.js +239 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/utils/embedding.d.ts.map +1 -1
- package/dist/utils/embedding.js +702 -0
- package/dist/utils/embedding.js.map +1 -0
- package/dist/utils/environment.js +75 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/fieldNameTracking.js +90 -0
- package/dist/utils/fieldNameTracking.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jsonProcessing.js +179 -0
- package/dist/utils/jsonProcessing.js.map +1 -0
- package/dist/utils/logger.js +129 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operationUtils.js +126 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/robustModelLoader.d.ts +14 -0
- package/dist/utils/robustModelLoader.d.ts.map +1 -1
- package/dist/utils/robustModelLoader.js +537 -0
- package/dist/utils/robustModelLoader.js.map +1 -0
- package/dist/utils/searchCache.js +248 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/statistics.js +25 -0
- package/dist/utils/statistics.js.map +1 -0
- package/dist/utils/statisticsCollector.js +224 -0
- package/dist/utils/statisticsCollector.js.map +1 -0
- package/dist/utils/textEncoding.js +309 -0
- package/dist/utils/textEncoding.js.map +1 -0
- package/dist/utils/typeUtils.js +40 -0
- package/dist/utils/typeUtils.js.map +1 -0
- package/dist/utils/version.d.ts +15 -3
- package/dist/utils/version.d.ts.map +1 -1
- package/dist/utils/version.js +24 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/utils/workerUtils.js +458 -0
- package/dist/utils/workerUtils.js.map +1 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +54 -0
- package/dist/worker.js.map +1 -0
- package/package.json +30 -29
- package/dist/brainy.js +0 -90220
- package/dist/brainy.min.js +0 -12511
- package/dist/patched-platform-node.d.ts +0 -17
- package/dist/statistics/statisticsManager.d.ts +0 -121
- package/dist/storage/fileSystemStorage.d.ts +0 -73
- package/dist/storage/fileSystemStorage.d.ts.map +0 -1
- package/dist/storage/opfsStorage.d.ts +0 -236
- package/dist/storage/opfsStorage.d.ts.map +0 -1
- package/dist/storage/s3CompatibleStorage.d.ts +0 -157
- package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
- package/dist/testing/prettyReporter.d.ts +0 -23
- package/dist/testing/prettySummaryReporter.d.ts +0 -22
- package/dist/unified.min.js +0 -16153
- package/dist/utils/environmentDetection.d.ts +0 -47
- package/dist/utils/environmentDetection.d.ts.map +0 -1
- package/dist/utils/tensorflowUtils.d.ts +0 -17
- 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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"}
|