@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
package/dist/demo.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo-specific entry point for browser environments
|
|
3
|
+
* This excludes all Node.js-specific functionality to avoid import issues
|
|
4
|
+
*/
|
|
5
|
+
// Import only browser-compatible modules
|
|
6
|
+
import { MemoryStorage } from './storage/adapters/memoryStorage.js';
|
|
7
|
+
import { UniversalSentenceEncoder } from './utils/embedding.js';
|
|
8
|
+
import { cosineDistance } from './utils/distance.js';
|
|
9
|
+
/**
|
|
10
|
+
* Simplified BrainyData class for demo purposes
|
|
11
|
+
* Only includes browser-compatible functionality
|
|
12
|
+
*/
|
|
13
|
+
export class DemoBrainyData {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.embedder = null;
|
|
16
|
+
this.initialized = false;
|
|
17
|
+
this.vectors = new Map();
|
|
18
|
+
this.metadata = new Map();
|
|
19
|
+
this.verbs = new Map();
|
|
20
|
+
// Always use memory storage for demo simplicity
|
|
21
|
+
this.storage = new MemoryStorage();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the database
|
|
25
|
+
*/
|
|
26
|
+
async init() {
|
|
27
|
+
if (this.initialized)
|
|
28
|
+
return;
|
|
29
|
+
try {
|
|
30
|
+
await this.storage.init();
|
|
31
|
+
// Initialize the embedder
|
|
32
|
+
this.embedder = new UniversalSentenceEncoder({ verbose: false });
|
|
33
|
+
await this.embedder.init();
|
|
34
|
+
this.initialized = true;
|
|
35
|
+
console.log('✅ Demo BrainyData initialized successfully');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('Failed to initialize demo BrainyData:', error);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Add a document to the database
|
|
44
|
+
*/
|
|
45
|
+
async add(text, metadata = {}) {
|
|
46
|
+
if (!this.initialized || !this.embedder) {
|
|
47
|
+
throw new Error('Database not initialized');
|
|
48
|
+
}
|
|
49
|
+
const id = this.generateId();
|
|
50
|
+
try {
|
|
51
|
+
// Generate embedding
|
|
52
|
+
const vector = await this.embedder.embed(text);
|
|
53
|
+
// Store data
|
|
54
|
+
this.vectors.set(id, vector);
|
|
55
|
+
this.metadata.set(id, { text, ...metadata, timestamp: Date.now() });
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error('Failed to add document:', error);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Search for similar documents
|
|
65
|
+
*/
|
|
66
|
+
async searchText(query, limit = 10) {
|
|
67
|
+
if (!this.initialized || !this.embedder) {
|
|
68
|
+
throw new Error('Database not initialized');
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
// Generate query embedding
|
|
72
|
+
const queryVector = await this.embedder.embed(query);
|
|
73
|
+
// Calculate similarities
|
|
74
|
+
const results = [];
|
|
75
|
+
for (const [id, vector] of this.vectors.entries()) {
|
|
76
|
+
const score = 1 - cosineDistance(queryVector, vector); // Convert distance to similarity
|
|
77
|
+
const metadata = this.metadata.get(id);
|
|
78
|
+
results.push({
|
|
79
|
+
id,
|
|
80
|
+
score,
|
|
81
|
+
metadata,
|
|
82
|
+
text: metadata?.text
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Sort by score (highest first) and limit
|
|
86
|
+
return results
|
|
87
|
+
.sort((a, b) => b.score - a.score)
|
|
88
|
+
.slice(0, limit);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('Search failed:', error);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Add a relationship between two documents
|
|
97
|
+
*/
|
|
98
|
+
async addVerb(sourceId, targetId, verb, metadata = {}) {
|
|
99
|
+
const verbId = this.generateId();
|
|
100
|
+
const verbData = {
|
|
101
|
+
id: verbId,
|
|
102
|
+
source: sourceId,
|
|
103
|
+
target: targetId,
|
|
104
|
+
verb,
|
|
105
|
+
metadata,
|
|
106
|
+
timestamp: Date.now()
|
|
107
|
+
};
|
|
108
|
+
if (!this.verbs.has(sourceId)) {
|
|
109
|
+
this.verbs.set(sourceId, []);
|
|
110
|
+
}
|
|
111
|
+
this.verbs.get(sourceId).push(verbData);
|
|
112
|
+
return verbId;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get relationships from a source document
|
|
116
|
+
*/
|
|
117
|
+
async getVerbsBySource(sourceId) {
|
|
118
|
+
return this.verbs.get(sourceId) || [];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get a document by ID
|
|
122
|
+
*/
|
|
123
|
+
async get(id) {
|
|
124
|
+
const metadata = this.metadata.get(id);
|
|
125
|
+
const vector = this.vectors.get(id);
|
|
126
|
+
if (!metadata || !vector)
|
|
127
|
+
return null;
|
|
128
|
+
return {
|
|
129
|
+
id,
|
|
130
|
+
vector,
|
|
131
|
+
...metadata
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Delete a document
|
|
136
|
+
*/
|
|
137
|
+
async delete(id) {
|
|
138
|
+
const deleted = this.vectors.delete(id) && this.metadata.delete(id);
|
|
139
|
+
this.verbs.delete(id);
|
|
140
|
+
return deleted;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Update document metadata
|
|
144
|
+
*/
|
|
145
|
+
async updateMetadata(id, newMetadata) {
|
|
146
|
+
const metadata = this.metadata.get(id);
|
|
147
|
+
if (!metadata)
|
|
148
|
+
return false;
|
|
149
|
+
this.metadata.set(id, { ...metadata, ...newMetadata });
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the number of documents
|
|
154
|
+
*/
|
|
155
|
+
size() {
|
|
156
|
+
return this.vectors.size;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate a random ID
|
|
160
|
+
*/
|
|
161
|
+
generateId() {
|
|
162
|
+
return 'id-' + Math.random().toString(36).substr(2, 9) + '-' + Date.now();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get storage info
|
|
166
|
+
*/
|
|
167
|
+
getStorage() {
|
|
168
|
+
return this.storage;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Export noun and verb types for compatibility
|
|
172
|
+
export const NounType = {
|
|
173
|
+
Person: 'Person',
|
|
174
|
+
Organization: 'Organization',
|
|
175
|
+
Location: 'Location',
|
|
176
|
+
Thing: 'Thing',
|
|
177
|
+
Concept: 'Concept',
|
|
178
|
+
Event: 'Event',
|
|
179
|
+
Document: 'Document',
|
|
180
|
+
Media: 'Media',
|
|
181
|
+
File: 'File',
|
|
182
|
+
Message: 'Message',
|
|
183
|
+
Content: 'Content'
|
|
184
|
+
};
|
|
185
|
+
export const VerbType = {
|
|
186
|
+
RelatedTo: 'related_to',
|
|
187
|
+
Contains: 'contains',
|
|
188
|
+
PartOf: 'part_of',
|
|
189
|
+
LocatedAt: 'located_at',
|
|
190
|
+
References: 'references',
|
|
191
|
+
Owns: 'owns',
|
|
192
|
+
CreatedBy: 'created_by',
|
|
193
|
+
BelongsTo: 'belongs_to',
|
|
194
|
+
Likes: 'likes',
|
|
195
|
+
Follows: 'follows'
|
|
196
|
+
};
|
|
197
|
+
// Export the main class as BrainyData for compatibility
|
|
198
|
+
export { DemoBrainyData as BrainyData };
|
|
199
|
+
// Default export
|
|
200
|
+
export default DemoBrainyData;
|
|
201
|
+
//# sourceMappingURL=demo.js.map
|
package/dist/demo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configManager.d.ts","sourceRoot":"","sources":["../../src/distributed/configManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,gBAAgB,CAAC,CAAgB;IACzC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,cAAc,CAAC,CAAgC;gBAGrD,OAAO,EAAE,cAAc,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;IAwB1D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBzC;;OAEG;YACW,kBAAkB;IAkChC;;;OAGG;YACW,aAAa;IAwB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;YACW,UAAU;IAWxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;YACW,eAAe;IAmD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;YACW,UAAU;IAYxB;;OAEG;IACH,SAAS,IAAI,YAAY,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,IAAI,YAAY;IAOvB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAIjE;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE;IAWtD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAe/B"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Configuration Manager
|
|
3
|
+
* Manages shared configuration in S3 for distributed Brainy instances
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
export class DistributedConfigManager {
|
|
7
|
+
constructor(storage, distributedConfig, brainyMode) {
|
|
8
|
+
this.config = null;
|
|
9
|
+
this.lastConfigVersion = 0;
|
|
10
|
+
this.storage = storage;
|
|
11
|
+
this.instanceId = distributedConfig?.instanceId || `instance-${uuidv4()}`;
|
|
12
|
+
this.configPath = distributedConfig?.configPath || '_brainy/config.json';
|
|
13
|
+
this.heartbeatInterval = distributedConfig?.heartbeatInterval || 30000;
|
|
14
|
+
this.configCheckInterval = distributedConfig?.configCheckInterval || 10000;
|
|
15
|
+
this.instanceTimeout = distributedConfig?.instanceTimeout || 60000;
|
|
16
|
+
// Set role from distributed config if provided
|
|
17
|
+
if (distributedConfig?.role) {
|
|
18
|
+
this.role = distributedConfig.role;
|
|
19
|
+
}
|
|
20
|
+
// Infer role from Brainy's read/write mode if not explicitly set
|
|
21
|
+
else if (brainyMode) {
|
|
22
|
+
if (brainyMode.writeOnly) {
|
|
23
|
+
this.role = 'writer';
|
|
24
|
+
}
|
|
25
|
+
else if (brainyMode.readOnly) {
|
|
26
|
+
this.role = 'reader';
|
|
27
|
+
}
|
|
28
|
+
// If neither readOnly nor writeOnly, role must be explicitly set
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the distributed configuration
|
|
33
|
+
*/
|
|
34
|
+
async initialize() {
|
|
35
|
+
// Load or create configuration
|
|
36
|
+
this.config = await this.loadOrCreateConfig();
|
|
37
|
+
// Determine role if not explicitly set
|
|
38
|
+
if (!this.role) {
|
|
39
|
+
this.role = await this.determineRole();
|
|
40
|
+
}
|
|
41
|
+
// Register this instance
|
|
42
|
+
await this.registerInstance();
|
|
43
|
+
// Start heartbeat and config watching
|
|
44
|
+
this.startHeartbeat();
|
|
45
|
+
this.startConfigWatch();
|
|
46
|
+
return this.config;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load existing config or create new one
|
|
50
|
+
*/
|
|
51
|
+
async loadOrCreateConfig() {
|
|
52
|
+
try {
|
|
53
|
+
// Use metadata storage with a special ID for config
|
|
54
|
+
const configData = await this.storage.getMetadata('_distributed_config');
|
|
55
|
+
if (configData) {
|
|
56
|
+
this.lastConfigVersion = configData.version;
|
|
57
|
+
return configData;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Config doesn't exist yet
|
|
62
|
+
}
|
|
63
|
+
// Create default config
|
|
64
|
+
const newConfig = {
|
|
65
|
+
version: 1,
|
|
66
|
+
updated: new Date().toISOString(),
|
|
67
|
+
settings: {
|
|
68
|
+
partitionStrategy: 'hash',
|
|
69
|
+
partitionCount: 100,
|
|
70
|
+
embeddingModel: 'text-embedding-ada-002',
|
|
71
|
+
dimensions: 1536,
|
|
72
|
+
distanceMetric: 'cosine',
|
|
73
|
+
hnswParams: {
|
|
74
|
+
M: 16,
|
|
75
|
+
efConstruction: 200
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
instances: {}
|
|
79
|
+
};
|
|
80
|
+
await this.saveConfig(newConfig);
|
|
81
|
+
return newConfig;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Determine role based on configuration
|
|
85
|
+
* IMPORTANT: Role must be explicitly set - no automatic assignment based on order
|
|
86
|
+
*/
|
|
87
|
+
async determineRole() {
|
|
88
|
+
// Check environment variable first
|
|
89
|
+
if (process.env.BRAINY_ROLE) {
|
|
90
|
+
const role = process.env.BRAINY_ROLE.toLowerCase();
|
|
91
|
+
if (role === 'writer' || role === 'reader' || role === 'hybrid') {
|
|
92
|
+
return role;
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Invalid BRAINY_ROLE: ${process.env.BRAINY_ROLE}. Must be 'writer', 'reader', or 'hybrid'`);
|
|
95
|
+
}
|
|
96
|
+
// Check if explicitly passed in distributed config
|
|
97
|
+
if (this.role) {
|
|
98
|
+
return this.role;
|
|
99
|
+
}
|
|
100
|
+
// DO NOT auto-assign roles based on deployment order or existing instances
|
|
101
|
+
// This is dangerous and can lead to data corruption or loss
|
|
102
|
+
throw new Error('Distributed mode requires explicit role configuration. ' +
|
|
103
|
+
'Set BRAINY_ROLE environment variable or pass role in distributed config. ' +
|
|
104
|
+
'Valid roles: "writer", "reader", "hybrid"');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if an instance is still alive
|
|
108
|
+
*/
|
|
109
|
+
isInstanceAlive(instance) {
|
|
110
|
+
const lastSeen = new Date(instance.lastHeartbeat).getTime();
|
|
111
|
+
const now = Date.now();
|
|
112
|
+
return (now - lastSeen) < this.instanceTimeout;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Register this instance in the shared config
|
|
116
|
+
*/
|
|
117
|
+
async registerInstance() {
|
|
118
|
+
if (!this.config)
|
|
119
|
+
return;
|
|
120
|
+
// Role must be set by this point
|
|
121
|
+
if (!this.role) {
|
|
122
|
+
throw new Error('Cannot register instance without a role');
|
|
123
|
+
}
|
|
124
|
+
const instanceInfo = {
|
|
125
|
+
role: this.role,
|
|
126
|
+
status: 'active',
|
|
127
|
+
lastHeartbeat: new Date().toISOString(),
|
|
128
|
+
metrics: {
|
|
129
|
+
memoryUsage: process.memoryUsage().heapUsed
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
// Add endpoint if available
|
|
133
|
+
if (process.env.SERVICE_ENDPOINT) {
|
|
134
|
+
instanceInfo.endpoint = process.env.SERVICE_ENDPOINT;
|
|
135
|
+
}
|
|
136
|
+
this.config.instances[this.instanceId] = instanceInfo;
|
|
137
|
+
await this.saveConfig(this.config);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Save configuration with version increment
|
|
141
|
+
*/
|
|
142
|
+
async saveConfig(config) {
|
|
143
|
+
config.version++;
|
|
144
|
+
config.updated = new Date().toISOString();
|
|
145
|
+
this.lastConfigVersion = config.version;
|
|
146
|
+
// Use metadata storage with a special ID for config
|
|
147
|
+
await this.storage.saveMetadata('_distributed_config', config);
|
|
148
|
+
this.config = config;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Start heartbeat to keep instance alive in config
|
|
152
|
+
*/
|
|
153
|
+
startHeartbeat() {
|
|
154
|
+
this.heartbeatTimer = setInterval(async () => {
|
|
155
|
+
await this.updateHeartbeat();
|
|
156
|
+
}, this.heartbeatInterval);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Update heartbeat and clean stale instances
|
|
160
|
+
*/
|
|
161
|
+
async updateHeartbeat() {
|
|
162
|
+
if (!this.config)
|
|
163
|
+
return;
|
|
164
|
+
// Reload config to get latest state
|
|
165
|
+
try {
|
|
166
|
+
const latestConfig = await this.loadConfig();
|
|
167
|
+
if (latestConfig) {
|
|
168
|
+
this.config = latestConfig;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('Failed to reload config:', error);
|
|
173
|
+
}
|
|
174
|
+
// Update our heartbeat
|
|
175
|
+
if (this.config.instances[this.instanceId]) {
|
|
176
|
+
this.config.instances[this.instanceId].lastHeartbeat = new Date().toISOString();
|
|
177
|
+
this.config.instances[this.instanceId].status = 'active';
|
|
178
|
+
// Update metrics if available
|
|
179
|
+
this.config.instances[this.instanceId].metrics = {
|
|
180
|
+
memoryUsage: process.memoryUsage().heapUsed
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// Re-register if we were removed
|
|
185
|
+
await this.registerInstance();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Clean up stale instances
|
|
189
|
+
const now = Date.now();
|
|
190
|
+
let hasChanges = false;
|
|
191
|
+
for (const [id, instance] of Object.entries(this.config.instances)) {
|
|
192
|
+
if (id === this.instanceId)
|
|
193
|
+
continue;
|
|
194
|
+
const lastSeen = new Date(instance.lastHeartbeat).getTime();
|
|
195
|
+
if (now - lastSeen > this.instanceTimeout) {
|
|
196
|
+
delete this.config.instances[id];
|
|
197
|
+
hasChanges = true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Save if there were changes
|
|
201
|
+
if (hasChanges) {
|
|
202
|
+
await this.saveConfig(this.config);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Just update our heartbeat without version increment
|
|
206
|
+
await this.storage.saveMetadata('_distributed_config', this.config);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Start watching for config changes
|
|
211
|
+
*/
|
|
212
|
+
startConfigWatch() {
|
|
213
|
+
this.configWatchTimer = setInterval(async () => {
|
|
214
|
+
await this.checkForConfigUpdates();
|
|
215
|
+
}, this.configCheckInterval);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Check for configuration updates
|
|
219
|
+
*/
|
|
220
|
+
async checkForConfigUpdates() {
|
|
221
|
+
try {
|
|
222
|
+
const latestConfig = await this.loadConfig();
|
|
223
|
+
if (!latestConfig)
|
|
224
|
+
return;
|
|
225
|
+
if (latestConfig.version > this.lastConfigVersion) {
|
|
226
|
+
this.config = latestConfig;
|
|
227
|
+
this.lastConfigVersion = latestConfig.version;
|
|
228
|
+
// Notify listeners of config update
|
|
229
|
+
if (this.onConfigUpdate) {
|
|
230
|
+
this.onConfigUpdate(latestConfig);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error('Failed to check config updates:', error);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Load configuration from storage
|
|
240
|
+
*/
|
|
241
|
+
async loadConfig() {
|
|
242
|
+
try {
|
|
243
|
+
const configData = await this.storage.getMetadata('_distributed_config');
|
|
244
|
+
if (configData) {
|
|
245
|
+
return configData;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error('Failed to load config:', error);
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get current configuration
|
|
255
|
+
*/
|
|
256
|
+
getConfig() {
|
|
257
|
+
return this.config;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get instance role
|
|
261
|
+
*/
|
|
262
|
+
getRole() {
|
|
263
|
+
if (!this.role) {
|
|
264
|
+
throw new Error('Role not initialized');
|
|
265
|
+
}
|
|
266
|
+
return this.role;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get instance ID
|
|
270
|
+
*/
|
|
271
|
+
getInstanceId() {
|
|
272
|
+
return this.instanceId;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Set config update callback
|
|
276
|
+
*/
|
|
277
|
+
setOnConfigUpdate(callback) {
|
|
278
|
+
this.onConfigUpdate = callback;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get all active instances of a specific role
|
|
282
|
+
*/
|
|
283
|
+
getInstancesByRole(role) {
|
|
284
|
+
if (!this.config)
|
|
285
|
+
return [];
|
|
286
|
+
return Object.entries(this.config.instances)
|
|
287
|
+
.filter(([_, instance]) => instance.role === role &&
|
|
288
|
+
this.isInstanceAlive(instance))
|
|
289
|
+
.map(([_, instance]) => instance);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Update instance metrics
|
|
293
|
+
*/
|
|
294
|
+
async updateMetrics(metrics) {
|
|
295
|
+
if (!this.config || !this.config.instances[this.instanceId])
|
|
296
|
+
return;
|
|
297
|
+
this.config.instances[this.instanceId].metrics = {
|
|
298
|
+
...this.config.instances[this.instanceId].metrics,
|
|
299
|
+
...metrics
|
|
300
|
+
};
|
|
301
|
+
// Don't increment version for metric updates
|
|
302
|
+
await this.storage.saveMetadata('_distributed_config', this.config);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Cleanup resources
|
|
306
|
+
*/
|
|
307
|
+
async cleanup() {
|
|
308
|
+
// Stop timers
|
|
309
|
+
if (this.heartbeatTimer) {
|
|
310
|
+
clearInterval(this.heartbeatTimer);
|
|
311
|
+
}
|
|
312
|
+
if (this.configWatchTimer) {
|
|
313
|
+
clearInterval(this.configWatchTimer);
|
|
314
|
+
}
|
|
315
|
+
// Mark instance as inactive
|
|
316
|
+
if (this.config && this.config.instances[this.instanceId]) {
|
|
317
|
+
this.config.instances[this.instanceId].status = 'inactive';
|
|
318
|
+
await this.saveConfig(this.config);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=configManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../src/distributed/configManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainDetector.d.ts","sourceRoot":"","sources":["../../src/distributed/domainDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAiDrB;IAED,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,WAAW,CAAiC;IAEpD;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,cAAc;IAqDvC;;OAEG;IACH,OAAO,CAAC,YAAY;IAkCpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgD7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAM9C;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;;OAGG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,oBAAoB,IAAI,MAAM,EAAE;CASjC"}
|