@soulcraft/brainy 1.5.0 → 2.0.1
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/CHANGELOG.md +188 -0
- package/LICENSE +2 -2
- package/README.md +200 -595
- package/bin/brainy-interactive.js +564 -0
- package/bin/brainy-ts.js +18 -0
- package/bin/brainy.js +672 -81
- package/dist/augmentationPipeline.d.ts +48 -220
- package/dist/augmentationPipeline.js +60 -508
- package/dist/augmentationRegistry.d.ts +22 -31
- package/dist/augmentationRegistry.js +28 -79
- package/dist/augmentations/apiServerAugmentation.d.ts +108 -0
- package/dist/augmentations/apiServerAugmentation.js +502 -0
- package/dist/augmentations/batchProcessingAugmentation.d.ts +95 -0
- package/dist/augmentations/batchProcessingAugmentation.js +567 -0
- package/dist/augmentations/brainyAugmentation.d.ts +153 -0
- package/dist/augmentations/brainyAugmentation.js +145 -0
- package/dist/augmentations/cacheAugmentation.d.ts +105 -0
- package/dist/augmentations/cacheAugmentation.js +238 -0
- package/dist/augmentations/conduitAugmentations.d.ts +54 -156
- package/dist/augmentations/conduitAugmentations.js +156 -1082
- package/dist/augmentations/connectionPoolAugmentation.d.ts +62 -0
- package/dist/augmentations/connectionPoolAugmentation.js +316 -0
- package/dist/augmentations/defaultAugmentations.d.ts +53 -0
- package/dist/augmentations/defaultAugmentations.js +88 -0
- package/dist/augmentations/entityRegistryAugmentation.d.ts +126 -0
- package/dist/augmentations/entityRegistryAugmentation.js +386 -0
- package/dist/augmentations/indexAugmentation.d.ts +117 -0
- package/dist/augmentations/indexAugmentation.js +284 -0
- package/dist/augmentations/intelligentVerbScoringAugmentation.d.ts +152 -0
- package/dist/augmentations/intelligentVerbScoringAugmentation.js +554 -0
- package/dist/augmentations/metricsAugmentation.d.ts +202 -0
- package/dist/augmentations/metricsAugmentation.js +291 -0
- package/dist/augmentations/monitoringAugmentation.d.ts +94 -0
- package/dist/augmentations/monitoringAugmentation.js +227 -0
- package/dist/augmentations/neuralImport.d.ts +50 -117
- package/dist/augmentations/neuralImport.js +255 -629
- package/dist/augmentations/requestDeduplicatorAugmentation.d.ts +52 -0
- package/dist/augmentations/requestDeduplicatorAugmentation.js +162 -0
- package/dist/augmentations/serverSearchAugmentations.d.ts +43 -22
- package/dist/augmentations/serverSearchAugmentations.js +125 -72
- package/dist/augmentations/storageAugmentation.d.ts +54 -0
- package/dist/augmentations/storageAugmentation.js +93 -0
- package/dist/augmentations/storageAugmentations.d.ts +96 -0
- package/dist/augmentations/storageAugmentations.js +182 -0
- package/dist/augmentations/synapseAugmentation.d.ts +156 -0
- package/dist/augmentations/synapseAugmentation.js +312 -0
- package/dist/augmentations/walAugmentation.d.ts +108 -0
- package/dist/augmentations/walAugmentation.js +515 -0
- package/dist/brainyData.d.ts +404 -130
- package/dist/brainyData.js +1331 -853
- package/dist/chat/BrainyChat.d.ts +16 -8
- package/dist/chat/BrainyChat.js +60 -32
- package/dist/chat/ChatCLI.d.ts +1 -1
- package/dist/chat/ChatCLI.js +6 -6
- package/dist/cli/catalog.d.ts +3 -3
- package/dist/cli/catalog.js +116 -70
- package/dist/cli/commands/core.d.ts +61 -0
- package/dist/cli/commands/core.js +348 -0
- package/dist/cli/commands/neural.d.ts +25 -0
- package/dist/cli/commands/neural.js +508 -0
- package/dist/cli/commands/utility.d.ts +37 -0
- package/dist/cli/commands/utility.js +276 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +167 -0
- package/dist/cli/interactive.d.ts +164 -0
- package/dist/cli/interactive.js +542 -0
- package/dist/cortex/neuralImport.js +5 -5
- package/dist/critical/model-guardian.js +11 -4
- package/dist/embeddings/lightweight-embedder.d.ts +23 -0
- package/dist/embeddings/lightweight-embedder.js +136 -0
- package/dist/embeddings/universal-memory-manager.d.ts +38 -0
- package/dist/embeddings/universal-memory-manager.js +206 -0
- package/dist/embeddings/worker-embedding.d.ts +7 -0
- package/dist/embeddings/worker-embedding.js +77 -0
- package/dist/embeddings/worker-manager.d.ts +28 -0
- package/dist/embeddings/worker-manager.js +162 -0
- package/dist/examples/basicUsage.js +7 -7
- package/dist/graph/pathfinding.d.ts +78 -0
- package/dist/graph/pathfinding.js +393 -0
- package/dist/hnsw/hnswIndex.d.ts +13 -0
- package/dist/hnsw/hnswIndex.js +35 -0
- package/dist/hnsw/hnswIndexOptimized.d.ts +1 -0
- package/dist/hnsw/hnswIndexOptimized.js +3 -0
- package/dist/index.d.ts +9 -11
- package/dist/index.js +21 -11
- package/dist/indices/fieldIndex.d.ts +76 -0
- package/dist/indices/fieldIndex.js +357 -0
- package/dist/mcp/brainyMCPAdapter.js +3 -2
- package/dist/mcp/mcpAugmentationToolset.js +11 -17
- package/dist/neural/embeddedPatterns.d.ts +41 -0
- package/dist/neural/embeddedPatterns.js +4044 -0
- package/dist/neural/naturalLanguageProcessor.d.ts +94 -0
- package/dist/neural/naturalLanguageProcessor.js +317 -0
- package/dist/neural/naturalLanguageProcessorStatic.d.ts +64 -0
- package/dist/neural/naturalLanguageProcessorStatic.js +151 -0
- package/dist/neural/neuralAPI.d.ts +255 -0
- package/dist/neural/neuralAPI.js +612 -0
- package/dist/neural/patternLibrary.d.ts +101 -0
- package/dist/neural/patternLibrary.js +313 -0
- package/dist/neural/patterns.d.ts +27 -0
- package/dist/neural/patterns.js +68 -0
- package/dist/neural/staticPatternMatcher.d.ts +35 -0
- package/dist/neural/staticPatternMatcher.js +153 -0
- package/dist/scripts/precomputePatternEmbeddings.d.ts +19 -0
- package/dist/scripts/precomputePatternEmbeddings.js +100 -0
- package/dist/storage/adapters/fileSystemStorage.d.ts +5 -0
- package/dist/storage/adapters/fileSystemStorage.js +20 -0
- package/dist/storage/adapters/s3CompatibleStorage.d.ts +5 -0
- package/dist/storage/adapters/s3CompatibleStorage.js +16 -0
- package/dist/storage/enhancedClearOperations.d.ts +83 -0
- package/dist/storage/enhancedClearOperations.js +345 -0
- package/dist/storage/storageFactory.js +31 -27
- package/dist/triple/TripleIntelligence.d.ts +134 -0
- package/dist/triple/TripleIntelligence.js +548 -0
- package/dist/types/augmentations.d.ts +45 -344
- package/dist/types/augmentations.js +5 -2
- package/dist/types/brainyDataInterface.d.ts +20 -10
- package/dist/types/graphTypes.d.ts +46 -0
- package/dist/types/graphTypes.js +16 -2
- package/dist/utils/BoundedRegistry.d.ts +29 -0
- package/dist/utils/BoundedRegistry.js +54 -0
- package/dist/utils/embedding.js +20 -3
- package/dist/utils/hybridModelManager.js +10 -5
- package/dist/utils/metadataFilter.d.ts +33 -19
- package/dist/utils/metadataFilter.js +58 -23
- package/dist/utils/metadataIndex.d.ts +37 -6
- package/dist/utils/metadataIndex.js +427 -64
- package/dist/utils/requestDeduplicator.d.ts +10 -0
- package/dist/utils/requestDeduplicator.js +24 -0
- package/dist/utils/unifiedCache.d.ts +103 -0
- package/dist/utils/unifiedCache.js +311 -0
- package/package.json +40 -125
- package/scripts/ensure-models.js +108 -0
- package/scripts/prepare-models.js +387 -0
- package/OFFLINE_MODELS.md +0 -56
- package/dist/intelligence/neuralEngine.d.ts +0 -207
- package/dist/intelligence/neuralEngine.js +0 -706
- package/dist/utils/modelLoader.d.ts +0 -32
- package/dist/utils/modelLoader.js +0 -219
- package/dist/utils/modelManager.d.ts +0 -77
- package/dist/utils/modelManager.js +0 -219
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Pool Augmentation
|
|
3
|
+
*
|
|
4
|
+
* Provides 10-20x throughput improvement for cloud storage (S3, R2, GCS)
|
|
5
|
+
* Manages connection pooling, request queuing, and parallel processing
|
|
6
|
+
* Critical for enterprise-scale operations with millions of entries
|
|
7
|
+
*/
|
|
8
|
+
import { BaseAugmentation } from './brainyAugmentation.js';
|
|
9
|
+
interface ConnectionPoolConfig {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
maxConnections?: number;
|
|
12
|
+
minConnections?: number;
|
|
13
|
+
acquireTimeout?: number;
|
|
14
|
+
idleTimeout?: number;
|
|
15
|
+
maxQueueSize?: number;
|
|
16
|
+
retryAttempts?: number;
|
|
17
|
+
healthCheckInterval?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class ConnectionPoolAugmentation extends BaseAugmentation {
|
|
20
|
+
name: string;
|
|
21
|
+
timing: "around";
|
|
22
|
+
operations: ("storage")[];
|
|
23
|
+
priority: number;
|
|
24
|
+
private config;
|
|
25
|
+
private connections;
|
|
26
|
+
private requestQueue;
|
|
27
|
+
private healthCheckInterval?;
|
|
28
|
+
private storageType;
|
|
29
|
+
private stats;
|
|
30
|
+
constructor(config?: ConnectionPoolConfig);
|
|
31
|
+
protected onInitialize(): Promise<void>;
|
|
32
|
+
shouldExecute(operation: string, params: any): boolean;
|
|
33
|
+
execute<T = any>(operation: string, params: any, next: () => Promise<T>): Promise<T>;
|
|
34
|
+
private detectStorageType;
|
|
35
|
+
private isCloudStorage;
|
|
36
|
+
private isStorageOperation;
|
|
37
|
+
private getOperationPriority;
|
|
38
|
+
private executeWithPool;
|
|
39
|
+
private getAvailableConnection;
|
|
40
|
+
private executeWithConnection;
|
|
41
|
+
private queueRequest;
|
|
42
|
+
private processQueue;
|
|
43
|
+
private initializeConnectionPool;
|
|
44
|
+
private createConnection;
|
|
45
|
+
private startHealthChecks;
|
|
46
|
+
private performHealthChecks;
|
|
47
|
+
private startMetricsCollection;
|
|
48
|
+
private updateLatencyMetrics;
|
|
49
|
+
private updateThroughputMetrics;
|
|
50
|
+
/**
|
|
51
|
+
* Get connection pool statistics
|
|
52
|
+
*/
|
|
53
|
+
getStats(): typeof this.stats & {
|
|
54
|
+
queueSize: number;
|
|
55
|
+
activeConnections: number;
|
|
56
|
+
totalConnections: number;
|
|
57
|
+
poolUtilization: string;
|
|
58
|
+
storageType: string;
|
|
59
|
+
};
|
|
60
|
+
protected onShutdown(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Pool Augmentation
|
|
3
|
+
*
|
|
4
|
+
* Provides 10-20x throughput improvement for cloud storage (S3, R2, GCS)
|
|
5
|
+
* Manages connection pooling, request queuing, and parallel processing
|
|
6
|
+
* Critical for enterprise-scale operations with millions of entries
|
|
7
|
+
*/
|
|
8
|
+
import { BaseAugmentation } from './brainyAugmentation.js';
|
|
9
|
+
export class ConnectionPoolAugmentation extends BaseAugmentation {
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
super();
|
|
12
|
+
this.name = 'ConnectionPool';
|
|
13
|
+
this.timing = 'around';
|
|
14
|
+
this.operations = ['storage'];
|
|
15
|
+
this.priority = 95; // Very high priority for storage operations
|
|
16
|
+
this.connections = new Map();
|
|
17
|
+
this.requestQueue = [];
|
|
18
|
+
this.storageType = 'unknown';
|
|
19
|
+
this.stats = {
|
|
20
|
+
totalRequests: 0,
|
|
21
|
+
queuedRequests: 0,
|
|
22
|
+
activeConnections: 0,
|
|
23
|
+
totalConnections: 0,
|
|
24
|
+
averageLatency: 0,
|
|
25
|
+
throughputPerSecond: 0
|
|
26
|
+
};
|
|
27
|
+
this.config = {
|
|
28
|
+
enabled: config.enabled ?? true,
|
|
29
|
+
maxConnections: config.maxConnections ?? 50,
|
|
30
|
+
minConnections: config.minConnections ?? 5,
|
|
31
|
+
acquireTimeout: config.acquireTimeout ?? 30000, // 30s
|
|
32
|
+
idleTimeout: config.idleTimeout ?? 300000, // 5 minutes
|
|
33
|
+
maxQueueSize: config.maxQueueSize ?? 10000,
|
|
34
|
+
retryAttempts: config.retryAttempts ?? 3,
|
|
35
|
+
healthCheckInterval: config.healthCheckInterval ?? 60000 // 1 minute
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async onInitialize() {
|
|
39
|
+
if (!this.config.enabled) {
|
|
40
|
+
this.log('Connection pooling disabled');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Detect storage type
|
|
44
|
+
this.storageType = this.detectStorageType();
|
|
45
|
+
if (this.isCloudStorage()) {
|
|
46
|
+
await this.initializeConnectionPool();
|
|
47
|
+
this.startHealthChecks();
|
|
48
|
+
this.startMetricsCollection();
|
|
49
|
+
this.log(`Connection pool initialized for ${this.storageType}: ${this.config.minConnections}-${this.config.maxConnections} connections`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.log(`Connection pooling skipped for ${this.storageType} (local storage)`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
shouldExecute(operation, params) {
|
|
56
|
+
return this.config.enabled &&
|
|
57
|
+
this.isCloudStorage() &&
|
|
58
|
+
this.isStorageOperation(operation);
|
|
59
|
+
}
|
|
60
|
+
async execute(operation, params, next) {
|
|
61
|
+
if (!this.shouldExecute(operation, params)) {
|
|
62
|
+
return next();
|
|
63
|
+
}
|
|
64
|
+
const startTime = Date.now();
|
|
65
|
+
this.stats.totalRequests++;
|
|
66
|
+
try {
|
|
67
|
+
// High priority for critical operations
|
|
68
|
+
const priority = this.getOperationPriority(operation);
|
|
69
|
+
// Execute with pooled connection
|
|
70
|
+
const result = await this.executeWithPool(operation, params, next, priority);
|
|
71
|
+
// Update metrics
|
|
72
|
+
const latency = Date.now() - startTime;
|
|
73
|
+
this.updateLatencyMetrics(latency);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.log(`Connection pool error for ${operation}: ${error}`, 'error');
|
|
78
|
+
// Fallback to direct execution for reliability
|
|
79
|
+
return next();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
detectStorageType() {
|
|
83
|
+
const storage = this.context?.storage;
|
|
84
|
+
if (!storage)
|
|
85
|
+
return 'unknown';
|
|
86
|
+
const className = storage.constructor.name.toLowerCase();
|
|
87
|
+
if (className.includes('s3'))
|
|
88
|
+
return 's3';
|
|
89
|
+
if (className.includes('r2'))
|
|
90
|
+
return 'r2';
|
|
91
|
+
if (className.includes('gcs') || className.includes('google'))
|
|
92
|
+
return 'gcs';
|
|
93
|
+
if (className.includes('azure'))
|
|
94
|
+
return 'azure';
|
|
95
|
+
if (className.includes('filesystem'))
|
|
96
|
+
return 'filesystem';
|
|
97
|
+
if (className.includes('memory'))
|
|
98
|
+
return 'memory';
|
|
99
|
+
return 'unknown';
|
|
100
|
+
}
|
|
101
|
+
isCloudStorage() {
|
|
102
|
+
return ['s3', 'r2', 'gcs', 'azure'].includes(this.storageType);
|
|
103
|
+
}
|
|
104
|
+
isStorageOperation(operation) {
|
|
105
|
+
return operation.includes('save') ||
|
|
106
|
+
operation.includes('get') ||
|
|
107
|
+
operation.includes('delete') ||
|
|
108
|
+
operation.includes('list') ||
|
|
109
|
+
operation.includes('backup') ||
|
|
110
|
+
operation.includes('restore');
|
|
111
|
+
}
|
|
112
|
+
getOperationPriority(operation) {
|
|
113
|
+
// Critical operations get highest priority
|
|
114
|
+
if (operation.includes('save') || operation.includes('update'))
|
|
115
|
+
return 10;
|
|
116
|
+
if (operation.includes('delete'))
|
|
117
|
+
return 9;
|
|
118
|
+
if (operation.includes('get'))
|
|
119
|
+
return 7;
|
|
120
|
+
if (operation.includes('list'))
|
|
121
|
+
return 5;
|
|
122
|
+
if (operation.includes('backup'))
|
|
123
|
+
return 3;
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
async executeWithPool(operation, params, executor, priority) {
|
|
127
|
+
// Check queue size
|
|
128
|
+
if (this.requestQueue.length >= this.config.maxQueueSize) {
|
|
129
|
+
throw new Error('Connection pool queue full - system overloaded');
|
|
130
|
+
}
|
|
131
|
+
// Try to get available connection immediately
|
|
132
|
+
const connection = this.getAvailableConnection();
|
|
133
|
+
if (connection) {
|
|
134
|
+
return this.executeWithConnection(connection, operation, executor);
|
|
135
|
+
}
|
|
136
|
+
// Queue the request
|
|
137
|
+
return this.queueRequest(operation, params, executor, priority);
|
|
138
|
+
}
|
|
139
|
+
getAvailableConnection() {
|
|
140
|
+
// Find idle connection with best health score
|
|
141
|
+
let bestConnection = null;
|
|
142
|
+
let bestScore = -1;
|
|
143
|
+
for (const connection of this.connections.values()) {
|
|
144
|
+
if (connection.isIdle && connection.healthScore > bestScore) {
|
|
145
|
+
bestConnection = connection;
|
|
146
|
+
bestScore = connection.healthScore;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return bestConnection;
|
|
150
|
+
}
|
|
151
|
+
async executeWithConnection(connection, operation, executor) {
|
|
152
|
+
// Mark connection as active
|
|
153
|
+
connection.isIdle = false;
|
|
154
|
+
connection.activeRequests++;
|
|
155
|
+
connection.lastUsed = Date.now();
|
|
156
|
+
this.stats.activeConnections++;
|
|
157
|
+
try {
|
|
158
|
+
const result = await executor();
|
|
159
|
+
// Update connection health on success
|
|
160
|
+
connection.healthScore = Math.min(connection.healthScore + 1, 100);
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// Decrease health on failure
|
|
165
|
+
connection.healthScore = Math.max(connection.healthScore - 5, 0);
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
// Release connection
|
|
170
|
+
connection.isIdle = true;
|
|
171
|
+
connection.activeRequests--;
|
|
172
|
+
this.stats.activeConnections--;
|
|
173
|
+
// Process next queued request
|
|
174
|
+
this.processQueue();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async queueRequest(operation, params, executor, priority) {
|
|
178
|
+
return new Promise((resolve, reject) => {
|
|
179
|
+
const request = {
|
|
180
|
+
id: `req_${Date.now()}_${Math.random()}`,
|
|
181
|
+
operation,
|
|
182
|
+
params,
|
|
183
|
+
resolver: resolve,
|
|
184
|
+
rejector: reject,
|
|
185
|
+
timestamp: Date.now(),
|
|
186
|
+
priority
|
|
187
|
+
};
|
|
188
|
+
// Insert by priority (higher priority first)
|
|
189
|
+
const insertIndex = this.requestQueue.findIndex(r => r.priority < priority);
|
|
190
|
+
if (insertIndex === -1) {
|
|
191
|
+
this.requestQueue.push(request);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.requestQueue.splice(insertIndex, 0, request);
|
|
195
|
+
}
|
|
196
|
+
this.stats.queuedRequests++;
|
|
197
|
+
// Set timeout
|
|
198
|
+
setTimeout(() => {
|
|
199
|
+
const index = this.requestQueue.findIndex(r => r.id === request.id);
|
|
200
|
+
if (index !== -1) {
|
|
201
|
+
this.requestQueue.splice(index, 1);
|
|
202
|
+
this.stats.queuedRequests--;
|
|
203
|
+
reject(new Error(`Connection pool timeout: ${this.config.acquireTimeout}ms`));
|
|
204
|
+
}
|
|
205
|
+
}, this.config.acquireTimeout);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
processQueue() {
|
|
209
|
+
if (this.requestQueue.length === 0)
|
|
210
|
+
return;
|
|
211
|
+
const connection = this.getAvailableConnection();
|
|
212
|
+
if (!connection)
|
|
213
|
+
return;
|
|
214
|
+
const request = this.requestQueue.shift();
|
|
215
|
+
this.stats.queuedRequests--;
|
|
216
|
+
// Execute queued request
|
|
217
|
+
this.executeWithConnection(connection, request.operation, async () => {
|
|
218
|
+
// This is a bit tricky - we need to reconstruct the executor
|
|
219
|
+
// In practice, we'd need to store the actual executor function
|
|
220
|
+
// For now, we'll resolve with a placeholder
|
|
221
|
+
return {};
|
|
222
|
+
}).then(request.resolver).catch(request.rejector);
|
|
223
|
+
}
|
|
224
|
+
async initializeConnectionPool() {
|
|
225
|
+
// Create minimum connections
|
|
226
|
+
for (let i = 0; i < this.config.minConnections; i++) {
|
|
227
|
+
await this.createConnection();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async createConnection() {
|
|
231
|
+
const connectionId = `conn_${Date.now()}_${Math.random()}`;
|
|
232
|
+
const connection = {
|
|
233
|
+
id: connectionId,
|
|
234
|
+
connection: null, // In real implementation, create actual connection
|
|
235
|
+
isIdle: true,
|
|
236
|
+
lastUsed: Date.now(),
|
|
237
|
+
healthScore: 100,
|
|
238
|
+
activeRequests: 0
|
|
239
|
+
};
|
|
240
|
+
this.connections.set(connectionId, connection);
|
|
241
|
+
this.stats.totalConnections++;
|
|
242
|
+
return connection;
|
|
243
|
+
}
|
|
244
|
+
startHealthChecks() {
|
|
245
|
+
this.healthCheckInterval = setInterval(() => {
|
|
246
|
+
this.performHealthChecks();
|
|
247
|
+
}, this.config.healthCheckInterval);
|
|
248
|
+
}
|
|
249
|
+
performHealthChecks() {
|
|
250
|
+
const now = Date.now();
|
|
251
|
+
const toRemove = [];
|
|
252
|
+
for (const [id, connection] of this.connections) {
|
|
253
|
+
// Remove idle connections that are too old
|
|
254
|
+
if (connection.isIdle &&
|
|
255
|
+
now - connection.lastUsed > this.config.idleTimeout &&
|
|
256
|
+
this.connections.size > this.config.minConnections) {
|
|
257
|
+
toRemove.push(id);
|
|
258
|
+
}
|
|
259
|
+
// Remove unhealthy connections
|
|
260
|
+
if (connection.healthScore < 20) {
|
|
261
|
+
toRemove.push(id);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Remove unhealthy/old connections
|
|
265
|
+
for (const id of toRemove) {
|
|
266
|
+
this.connections.delete(id);
|
|
267
|
+
this.stats.totalConnections--;
|
|
268
|
+
}
|
|
269
|
+
// Ensure minimum connections
|
|
270
|
+
while (this.connections.size < this.config.minConnections) {
|
|
271
|
+
this.createConnection();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
startMetricsCollection() {
|
|
275
|
+
setInterval(() => {
|
|
276
|
+
this.updateThroughputMetrics();
|
|
277
|
+
}, 1000); // Update every second
|
|
278
|
+
}
|
|
279
|
+
updateLatencyMetrics(latency) {
|
|
280
|
+
// Simple moving average
|
|
281
|
+
this.stats.averageLatency = (this.stats.averageLatency * 0.9) + (latency * 0.1);
|
|
282
|
+
}
|
|
283
|
+
updateThroughputMetrics() {
|
|
284
|
+
// Reset counter for next second
|
|
285
|
+
this.stats.throughputPerSecond = this.stats.totalRequests;
|
|
286
|
+
// Reset total for next measurement (in practice, use sliding window)
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get connection pool statistics
|
|
290
|
+
*/
|
|
291
|
+
getStats() {
|
|
292
|
+
return {
|
|
293
|
+
...this.stats,
|
|
294
|
+
queueSize: this.requestQueue.length,
|
|
295
|
+
activeConnections: this.stats.activeConnections,
|
|
296
|
+
totalConnections: this.connections.size,
|
|
297
|
+
poolUtilization: `${Math.round((this.stats.activeConnections / this.connections.size) * 100)}%`,
|
|
298
|
+
storageType: this.storageType
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async onShutdown() {
|
|
302
|
+
if (this.healthCheckInterval) {
|
|
303
|
+
clearInterval(this.healthCheckInterval);
|
|
304
|
+
}
|
|
305
|
+
// Close all connections
|
|
306
|
+
this.connections.clear();
|
|
307
|
+
// Reject all queued requests
|
|
308
|
+
this.requestQueue.forEach(request => {
|
|
309
|
+
request.rejector(new Error('Connection pool shutting down'));
|
|
310
|
+
});
|
|
311
|
+
this.requestQueue = [];
|
|
312
|
+
const stats = this.getStats();
|
|
313
|
+
this.log(`Connection pool shutdown: ${stats.totalRequests} requests processed, ${stats.poolUtilization} avg utilization`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=connectionPoolAugmentation.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Augmentations Registration
|
|
3
|
+
*
|
|
4
|
+
* Maintains zero-config philosophy by automatically registering
|
|
5
|
+
* core augmentations that were previously hardcoded in BrainyData.
|
|
6
|
+
*
|
|
7
|
+
* These augmentations are optional but enabled by default for
|
|
8
|
+
* backward compatibility and optimal performance.
|
|
9
|
+
*/
|
|
10
|
+
import { BrainyData } from '../brainyData.js';
|
|
11
|
+
import { BaseAugmentation } from './brainyAugmentation.js';
|
|
12
|
+
import { CacheAugmentation } from './cacheAugmentation.js';
|
|
13
|
+
import { IndexAugmentation } from './indexAugmentation.js';
|
|
14
|
+
import { MetricsAugmentation } from './metricsAugmentation.js';
|
|
15
|
+
import { MonitoringAugmentation } from './monitoringAugmentation.js';
|
|
16
|
+
/**
|
|
17
|
+
* Create default augmentations for zero-config operation
|
|
18
|
+
* Returns an array of augmentations to be registered
|
|
19
|
+
*
|
|
20
|
+
* @param config - Configuration options
|
|
21
|
+
* @returns Array of augmentations to register
|
|
22
|
+
*/
|
|
23
|
+
export declare function createDefaultAugmentations(config?: {
|
|
24
|
+
cache?: boolean | Record<string, any>;
|
|
25
|
+
index?: boolean | Record<string, any>;
|
|
26
|
+
metrics?: boolean | Record<string, any>;
|
|
27
|
+
monitoring?: boolean | Record<string, any>;
|
|
28
|
+
}): BaseAugmentation[];
|
|
29
|
+
/**
|
|
30
|
+
* Get augmentation by name with type safety
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAugmentation<T>(brain: BrainyData, name: string): T | null;
|
|
33
|
+
/**
|
|
34
|
+
* Compatibility helpers for migrating from hardcoded features
|
|
35
|
+
*/
|
|
36
|
+
export declare const AugmentationHelpers: {
|
|
37
|
+
/**
|
|
38
|
+
* Get cache augmentation
|
|
39
|
+
*/
|
|
40
|
+
getCache(brain: BrainyData): CacheAugmentation | null;
|
|
41
|
+
/**
|
|
42
|
+
* Get index augmentation
|
|
43
|
+
*/
|
|
44
|
+
getIndex(brain: BrainyData): IndexAugmentation | null;
|
|
45
|
+
/**
|
|
46
|
+
* Get metrics augmentation
|
|
47
|
+
*/
|
|
48
|
+
getMetrics(brain: BrainyData): MetricsAugmentation | null;
|
|
49
|
+
/**
|
|
50
|
+
* Get monitoring augmentation
|
|
51
|
+
*/
|
|
52
|
+
getMonitoring(brain: BrainyData): MonitoringAugmentation | null;
|
|
53
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Augmentations Registration
|
|
3
|
+
*
|
|
4
|
+
* Maintains zero-config philosophy by automatically registering
|
|
5
|
+
* core augmentations that were previously hardcoded in BrainyData.
|
|
6
|
+
*
|
|
7
|
+
* These augmentations are optional but enabled by default for
|
|
8
|
+
* backward compatibility and optimal performance.
|
|
9
|
+
*/
|
|
10
|
+
import { CacheAugmentation } from './cacheAugmentation.js';
|
|
11
|
+
import { IndexAugmentation } from './indexAugmentation.js';
|
|
12
|
+
import { MetricsAugmentation } from './metricsAugmentation.js';
|
|
13
|
+
import { MonitoringAugmentation } from './monitoringAugmentation.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create default augmentations for zero-config operation
|
|
16
|
+
* Returns an array of augmentations to be registered
|
|
17
|
+
*
|
|
18
|
+
* @param config - Configuration options
|
|
19
|
+
* @returns Array of augmentations to register
|
|
20
|
+
*/
|
|
21
|
+
export function createDefaultAugmentations(config = {}) {
|
|
22
|
+
const augmentations = [];
|
|
23
|
+
// Cache augmentation (was SearchCache)
|
|
24
|
+
if (config.cache !== false) {
|
|
25
|
+
const cacheConfig = typeof config.cache === 'object' ? config.cache : {};
|
|
26
|
+
augmentations.push(new CacheAugmentation(cacheConfig));
|
|
27
|
+
}
|
|
28
|
+
// Index augmentation (was MetadataIndex)
|
|
29
|
+
if (config.index !== false) {
|
|
30
|
+
const indexConfig = typeof config.index === 'object' ? config.index : {};
|
|
31
|
+
augmentations.push(new IndexAugmentation(indexConfig));
|
|
32
|
+
}
|
|
33
|
+
// Metrics augmentation (was StatisticsCollector)
|
|
34
|
+
if (config.metrics !== false) {
|
|
35
|
+
const metricsConfig = typeof config.metrics === 'object' ? config.metrics : {};
|
|
36
|
+
augmentations.push(new MetricsAugmentation(metricsConfig));
|
|
37
|
+
}
|
|
38
|
+
// Monitoring augmentation (was HealthMonitor)
|
|
39
|
+
// Only enable by default in distributed mode
|
|
40
|
+
const isDistributed = process.env.BRAINY_MODE === 'distributed' ||
|
|
41
|
+
process.env.BRAINY_DISTRIBUTED === 'true';
|
|
42
|
+
if (config.monitoring !== false && (config.monitoring || isDistributed)) {
|
|
43
|
+
const monitoringConfig = typeof config.monitoring === 'object' ? config.monitoring : {};
|
|
44
|
+
augmentations.push(new MonitoringAugmentation(monitoringConfig));
|
|
45
|
+
}
|
|
46
|
+
return augmentations;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get augmentation by name with type safety
|
|
50
|
+
*/
|
|
51
|
+
export function getAugmentation(brain, name) {
|
|
52
|
+
// Access augmentations through a public method or property
|
|
53
|
+
const augmentations = brain.augmentations;
|
|
54
|
+
if (!augmentations)
|
|
55
|
+
return null;
|
|
56
|
+
const aug = augmentations.get(name);
|
|
57
|
+
return aug;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Compatibility helpers for migrating from hardcoded features
|
|
61
|
+
*/
|
|
62
|
+
export const AugmentationHelpers = {
|
|
63
|
+
/**
|
|
64
|
+
* Get cache augmentation
|
|
65
|
+
*/
|
|
66
|
+
getCache(brain) {
|
|
67
|
+
return getAugmentation(brain, 'cache');
|
|
68
|
+
},
|
|
69
|
+
/**
|
|
70
|
+
* Get index augmentation
|
|
71
|
+
*/
|
|
72
|
+
getIndex(brain) {
|
|
73
|
+
return getAugmentation(brain, 'index');
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Get metrics augmentation
|
|
77
|
+
*/
|
|
78
|
+
getMetrics(brain) {
|
|
79
|
+
return getAugmentation(brain, 'metrics');
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Get monitoring augmentation
|
|
83
|
+
*/
|
|
84
|
+
getMonitoring(brain) {
|
|
85
|
+
return getAugmentation(brain, 'monitoring');
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=defaultAugmentations.js.map
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Registry Augmentation
|
|
3
|
+
* Fast external-ID to internal-UUID mapping for streaming data processing
|
|
4
|
+
* Works in write-only mode for high-performance deduplication
|
|
5
|
+
*/
|
|
6
|
+
import { BaseAugmentation, AugmentationContext } from './brainyAugmentation.js';
|
|
7
|
+
export interface EntityRegistryConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Maximum number of entries to keep in memory cache
|
|
10
|
+
* Default: 100,000 entries
|
|
11
|
+
*/
|
|
12
|
+
maxCacheSize?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Time to live for cache entries in milliseconds
|
|
15
|
+
* Default: 300,000 (5 minutes)
|
|
16
|
+
*/
|
|
17
|
+
cacheTTL?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Fields to index for fast lookup
|
|
20
|
+
* Default: ['did', 'handle', 'uri', 'id', 'external_id']
|
|
21
|
+
*/
|
|
22
|
+
indexedFields?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Persistence strategy
|
|
25
|
+
* memory: Keep only in memory (fast, but lost on restart)
|
|
26
|
+
* storage: Persist to storage (survives restarts)
|
|
27
|
+
* hybrid: Memory + periodic storage sync
|
|
28
|
+
*/
|
|
29
|
+
persistence?: 'memory' | 'storage' | 'hybrid';
|
|
30
|
+
/**
|
|
31
|
+
* How often to sync memory cache to storage (hybrid mode)
|
|
32
|
+
* Default: 30000 (30 seconds)
|
|
33
|
+
*/
|
|
34
|
+
syncInterval?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface EntityMapping {
|
|
37
|
+
externalId: string;
|
|
38
|
+
field: string;
|
|
39
|
+
brainyId: string;
|
|
40
|
+
nounType: string;
|
|
41
|
+
lastAccessed: number;
|
|
42
|
+
metadata?: any;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* High-performance entity registry for external ID to Brainy UUID mapping
|
|
46
|
+
* Optimized for streaming data scenarios like Bluesky firehose processing
|
|
47
|
+
*/
|
|
48
|
+
export declare class EntityRegistryAugmentation extends BaseAugmentation {
|
|
49
|
+
readonly name = "entity-registry";
|
|
50
|
+
readonly description = "Fast external-ID to internal-UUID mapping for streaming data";
|
|
51
|
+
readonly timing: 'before' | 'after' | 'around' | 'replace';
|
|
52
|
+
readonly operations: ("add" | "addNoun" | "addVerb")[];
|
|
53
|
+
readonly priority = 90;
|
|
54
|
+
private config;
|
|
55
|
+
private memoryIndex;
|
|
56
|
+
private fieldIndices;
|
|
57
|
+
private syncTimer?;
|
|
58
|
+
private brain?;
|
|
59
|
+
private storage?;
|
|
60
|
+
constructor(config?: EntityRegistryConfig);
|
|
61
|
+
initialize(context: AugmentationContext): Promise<void>;
|
|
62
|
+
shutdown(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Execute the augmentation
|
|
65
|
+
*/
|
|
66
|
+
execute<T = any>(operation: string, params: any, next: () => Promise<T>): Promise<T>;
|
|
67
|
+
/**
|
|
68
|
+
* Register a new entity mapping
|
|
69
|
+
*/
|
|
70
|
+
registerEntity(brainyId: string, metadata: any, nounType: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Fast lookup: external ID → Brainy UUID
|
|
73
|
+
* Works in write-only mode without search indexes
|
|
74
|
+
*/
|
|
75
|
+
lookupEntity(field: string, value: string): Promise<string | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Batch lookup for multiple external IDs
|
|
78
|
+
*/
|
|
79
|
+
lookupBatch(lookups: Array<{
|
|
80
|
+
field: string;
|
|
81
|
+
value: string;
|
|
82
|
+
}>): Promise<Map<string, string | null>>;
|
|
83
|
+
/**
|
|
84
|
+
* Check if entity exists (faster than lookupEntity for existence checks)
|
|
85
|
+
*/
|
|
86
|
+
hasEntity(field: string, value: string): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Get all entities by field (e.g., all DIDs)
|
|
89
|
+
*/
|
|
90
|
+
getEntitiesByField(field: string): Promise<string[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Get registry statistics
|
|
93
|
+
*/
|
|
94
|
+
getStats(): {
|
|
95
|
+
totalMappings: number;
|
|
96
|
+
fieldCounts: Record<string, number>;
|
|
97
|
+
cacheHitRate: number;
|
|
98
|
+
memoryUsage: number;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Clear all cached mappings
|
|
102
|
+
*/
|
|
103
|
+
clearCache(): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Check if an ID looks like it could be an external ID for a specific field
|
|
106
|
+
*/
|
|
107
|
+
private looksLikeExternalId;
|
|
108
|
+
private extractFieldValue;
|
|
109
|
+
private evictOldEntries;
|
|
110
|
+
private loadFromStorage;
|
|
111
|
+
private syncToStorage;
|
|
112
|
+
private loadFromStorageByField;
|
|
113
|
+
private loadBatchFromStorage;
|
|
114
|
+
private estimateMemoryUsage;
|
|
115
|
+
}
|
|
116
|
+
export declare class AutoRegisterEntitiesAugmentation extends BaseAugmentation {
|
|
117
|
+
readonly name = "auto-register-entities";
|
|
118
|
+
readonly description = "Automatically register entities in the registry when added";
|
|
119
|
+
readonly timing: 'before' | 'after' | 'around' | 'replace';
|
|
120
|
+
readonly operations: ("add" | "addNoun" | "addVerb")[];
|
|
121
|
+
readonly priority = 85;
|
|
122
|
+
private registry?;
|
|
123
|
+
private brain?;
|
|
124
|
+
initialize(context: AugmentationContext): Promise<void>;
|
|
125
|
+
execute<T = any>(operation: string, params: any, next: () => Promise<T>): Promise<T>;
|
|
126
|
+
}
|