@soulcraft/brainy 0.43.0 → 0.45.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/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/brainyData.d.ts.map +1 -0
- package/dist/brainyData.js +3999 -0
- package/dist/brainyData.js.map +1 -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.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/index.d.ts.map +1 -0
- package/dist/index.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/unified.d.ts.map +1 -0
- package/dist/unified.js.map +1 -0
- package/dist/utils/robustModelLoader.js +60 -25
- package/dist/utils/robustModelLoader.js.map +1 -1
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +54 -0
- package/dist/worker.js.map +1 -0
- package/package.json +8 -12
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequential Augmentation Pipeline
|
|
3
|
+
*
|
|
4
|
+
* This module provides a pipeline for executing augmentations in a specific sequence:
|
|
5
|
+
* ISense -> IMemory -> ICognition -> IConduit -> IActivation -> IPerception
|
|
6
|
+
*
|
|
7
|
+
* It supports high-performance streaming data from WebSockets without blocking.
|
|
8
|
+
* Optimized for Node.js 23.11+ using native WebStreams API.
|
|
9
|
+
*/
|
|
10
|
+
import { AugmentationType } from './types/augmentations.js';
|
|
11
|
+
import { BrainyData } from './brainyData.js';
|
|
12
|
+
import { augmentationPipeline } from './augmentationPipeline.js';
|
|
13
|
+
// Use the browser's built-in WebStreams API or Node.js native WebStreams API
|
|
14
|
+
// This approach ensures compatibility with both environments
|
|
15
|
+
let TransformStream, ReadableStream, WritableStream;
|
|
16
|
+
// Function to initialize the stream classes
|
|
17
|
+
const initializeStreamClasses = () => {
|
|
18
|
+
// Try to use the browser's built-in WebStreams API first
|
|
19
|
+
if (typeof globalThis.TransformStream !== 'undefined' &&
|
|
20
|
+
typeof globalThis.ReadableStream !== 'undefined' &&
|
|
21
|
+
typeof globalThis.WritableStream !== 'undefined') {
|
|
22
|
+
TransformStream = globalThis.TransformStream;
|
|
23
|
+
ReadableStream = globalThis.ReadableStream;
|
|
24
|
+
WritableStream = globalThis.WritableStream;
|
|
25
|
+
return Promise.resolve();
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// In Node.js environment, try to import from node:stream/web
|
|
29
|
+
// This will be executed in Node.js but not in browsers
|
|
30
|
+
return import('node:stream/web')
|
|
31
|
+
.then(streamWebModule => {
|
|
32
|
+
TransformStream = streamWebModule.TransformStream;
|
|
33
|
+
ReadableStream = streamWebModule.ReadableStream;
|
|
34
|
+
WritableStream = streamWebModule.WritableStream;
|
|
35
|
+
})
|
|
36
|
+
.catch(error => {
|
|
37
|
+
console.error('Failed to import WebStreams API:', error);
|
|
38
|
+
// Provide fallback implementations or throw a more helpful error
|
|
39
|
+
throw new Error('WebStreams API is not available in this environment. Please use a modern browser or Node.js 18+.');
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// Initialize immediately but don't block module execution
|
|
44
|
+
const streamClassesPromise = initializeStreamClasses();
|
|
45
|
+
/**
|
|
46
|
+
* Default pipeline options
|
|
47
|
+
*/
|
|
48
|
+
const DEFAULT_SEQUENTIAL_PIPELINE_OPTIONS = {
|
|
49
|
+
timeout: 30000,
|
|
50
|
+
stopOnError: false
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* SequentialPipeline class
|
|
54
|
+
*
|
|
55
|
+
* Executes augmentations in a specific sequence:
|
|
56
|
+
* ISense -> IMemory -> ICognition -> IConduit -> IActivation -> IPerception
|
|
57
|
+
*/
|
|
58
|
+
export class SequentialPipeline {
|
|
59
|
+
/**
|
|
60
|
+
* Create a new sequential pipeline
|
|
61
|
+
*
|
|
62
|
+
* @param options Options for the pipeline
|
|
63
|
+
*/
|
|
64
|
+
constructor(options = {}) {
|
|
65
|
+
this.brainyData = options.brainyData || new BrainyData();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Ensure stream classes are initialized
|
|
69
|
+
* @private
|
|
70
|
+
*/
|
|
71
|
+
async ensureStreamClassesInitialized() {
|
|
72
|
+
await streamClassesPromise;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the pipeline
|
|
76
|
+
*
|
|
77
|
+
* @returns A promise that resolves when initialization is complete
|
|
78
|
+
*/
|
|
79
|
+
async initialize() {
|
|
80
|
+
// Initialize stream classes and BrainyData in parallel
|
|
81
|
+
await Promise.all([
|
|
82
|
+
this.ensureStreamClassesInitialized(),
|
|
83
|
+
this.brainyData.init()
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Process data through the sequential pipeline
|
|
88
|
+
*
|
|
89
|
+
* @param rawData The raw data to process
|
|
90
|
+
* @param dataType The type of data (e.g., 'text', 'image', 'audio')
|
|
91
|
+
* @param options Options for pipeline execution
|
|
92
|
+
* @returns A promise that resolves with the pipeline result
|
|
93
|
+
*/
|
|
94
|
+
async processData(rawData, dataType, options = {}) {
|
|
95
|
+
const opts = { ...DEFAULT_SEQUENTIAL_PIPELINE_OPTIONS, ...options };
|
|
96
|
+
const result = {
|
|
97
|
+
success: true,
|
|
98
|
+
data: null,
|
|
99
|
+
stageResults: {}
|
|
100
|
+
};
|
|
101
|
+
try {
|
|
102
|
+
// Step 1: Process raw data with ISense augmentations
|
|
103
|
+
const senseResults = await augmentationPipeline.executeSensePipeline('processRawData', [rawData, dataType], { timeout: opts.timeout, stopOnError: opts.stopOnError });
|
|
104
|
+
// Get the first successful result
|
|
105
|
+
let senseResult = null;
|
|
106
|
+
for (const resultPromise of senseResults) {
|
|
107
|
+
const res = await resultPromise;
|
|
108
|
+
if (res.success) {
|
|
109
|
+
senseResult = res;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!senseResult || !senseResult.success) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
data: null,
|
|
117
|
+
error: 'Failed to process raw data with ISense augmentations',
|
|
118
|
+
stageResults: { sense: senseResult || { success: false, data: null, error: 'No sense augmentations available' } }
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
result.stageResults.sense = senseResult;
|
|
122
|
+
// Step 2: Store data in BrainyData using IMemory augmentations
|
|
123
|
+
const memoryAugmentations = augmentationPipeline.getAugmentationsByType(AugmentationType.MEMORY);
|
|
124
|
+
if (memoryAugmentations.length === 0) {
|
|
125
|
+
return {
|
|
126
|
+
success: false,
|
|
127
|
+
data: null,
|
|
128
|
+
error: 'No memory augmentations available',
|
|
129
|
+
stageResults: result.stageResults
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// Use the first available memory augmentation
|
|
133
|
+
const memoryAugmentation = memoryAugmentations[0];
|
|
134
|
+
// Generate a key for the data
|
|
135
|
+
const dataKey = `data_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
|
|
136
|
+
// Store the data
|
|
137
|
+
const memoryResult = await memoryAugmentation.storeData(dataKey, {
|
|
138
|
+
rawData,
|
|
139
|
+
dataType,
|
|
140
|
+
nouns: senseResult.data.nouns,
|
|
141
|
+
verbs: senseResult.data.verbs,
|
|
142
|
+
timestamp: Date.now()
|
|
143
|
+
});
|
|
144
|
+
if (!memoryResult.success) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
data: null,
|
|
148
|
+
error: `Failed to store data: ${memoryResult.error}`,
|
|
149
|
+
stageResults: { ...result.stageResults, memory: memoryResult }
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
result.stageResults.memory = memoryResult;
|
|
153
|
+
// Step 3: Trigger ICognition augmentations to analyze the data
|
|
154
|
+
const cognitionResults = await augmentationPipeline.executeCognitionPipeline('reason', [`Analyze data with key ${dataKey}`, { dataKey }], { timeout: opts.timeout, stopOnError: opts.stopOnError });
|
|
155
|
+
// Get the first successful result
|
|
156
|
+
let cognitionResult = null;
|
|
157
|
+
for (const resultPromise of cognitionResults) {
|
|
158
|
+
const res = await resultPromise;
|
|
159
|
+
if (res.success) {
|
|
160
|
+
cognitionResult = res;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (cognitionResult) {
|
|
165
|
+
result.stageResults.cognition = cognitionResult;
|
|
166
|
+
}
|
|
167
|
+
// Step 4: Send notifications to IConduit augmentations
|
|
168
|
+
const conduitResults = await augmentationPipeline.executeConduitPipeline('writeData', [{ dataKey, nouns: senseResult.data.nouns, verbs: senseResult.data.verbs }], { timeout: opts.timeout, stopOnError: opts.stopOnError });
|
|
169
|
+
// Get the first successful result
|
|
170
|
+
let conduitResult = null;
|
|
171
|
+
for (const resultPromise of conduitResults) {
|
|
172
|
+
const res = await resultPromise;
|
|
173
|
+
if (res.success) {
|
|
174
|
+
conduitResult = res;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (conduitResult) {
|
|
179
|
+
result.stageResults.conduit = conduitResult;
|
|
180
|
+
}
|
|
181
|
+
// Step 5: Send notifications to IActivation augmentations
|
|
182
|
+
const activationResults = await augmentationPipeline.executeActivationPipeline('triggerAction', ['dataProcessed', { dataKey }], { timeout: opts.timeout, stopOnError: opts.stopOnError });
|
|
183
|
+
// Get the first successful result
|
|
184
|
+
let activationResult = null;
|
|
185
|
+
for (const resultPromise of activationResults) {
|
|
186
|
+
const res = await resultPromise;
|
|
187
|
+
if (res.success) {
|
|
188
|
+
activationResult = res;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (activationResult) {
|
|
193
|
+
result.stageResults.activation = activationResult;
|
|
194
|
+
}
|
|
195
|
+
// Step 6: Send notifications to IPerception augmentations
|
|
196
|
+
const perceptionResults = await augmentationPipeline.executePerceptionPipeline('interpret', [senseResult.data.nouns, senseResult.data.verbs, { dataKey }], { timeout: opts.timeout, stopOnError: opts.stopOnError });
|
|
197
|
+
// Get the first successful result
|
|
198
|
+
let perceptionResult = null;
|
|
199
|
+
for (const resultPromise of perceptionResults) {
|
|
200
|
+
const res = await resultPromise;
|
|
201
|
+
if (res.success) {
|
|
202
|
+
perceptionResult = res;
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (perceptionResult) {
|
|
207
|
+
result.stageResults.perception = perceptionResult;
|
|
208
|
+
result.data = perceptionResult.data;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// If no perception result, use the cognition result as the final data
|
|
212
|
+
result.data = cognitionResult ? cognitionResult.data : { dataKey };
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
return {
|
|
218
|
+
success: false,
|
|
219
|
+
data: null,
|
|
220
|
+
error: `Pipeline execution failed: ${error}`,
|
|
221
|
+
stageResults: result.stageResults
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Process WebSocket data through the sequential pipeline
|
|
227
|
+
*
|
|
228
|
+
* @param connection The WebSocket connection
|
|
229
|
+
* @param dataType The type of data (e.g., 'text', 'image', 'audio')
|
|
230
|
+
* @param options Options for pipeline execution
|
|
231
|
+
* @returns A function to handle incoming WebSocket messages
|
|
232
|
+
*/
|
|
233
|
+
async createWebSocketHandler(connection, dataType, options = {}) {
|
|
234
|
+
// Ensure stream classes are initialized
|
|
235
|
+
await this.ensureStreamClassesInitialized();
|
|
236
|
+
// Create a transform stream for processing data
|
|
237
|
+
const transformStream = new TransformStream({
|
|
238
|
+
transform: async (chunk, controller) => {
|
|
239
|
+
try {
|
|
240
|
+
const data = typeof chunk === 'string' ? chunk : JSON.stringify(chunk);
|
|
241
|
+
const result = await this.processData(data, dataType, options);
|
|
242
|
+
if (result.success) {
|
|
243
|
+
controller.enqueue(result);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.warn('Pipeline processing failed:', result.error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error('Error in transform stream:', error);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
// Create a writable stream that will be the sink for our data
|
|
255
|
+
const writableStream = new WritableStream({
|
|
256
|
+
write: async (result) => {
|
|
257
|
+
// Handle the processed result if needed
|
|
258
|
+
if (connection.send && typeof connection.send === 'function') {
|
|
259
|
+
try {
|
|
260
|
+
// Only send back results if the connection supports it
|
|
261
|
+
await connection.send(JSON.stringify(result));
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
console.error('Error sending result back to WebSocket:', error);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
// Connect the transform stream to the writable stream
|
|
270
|
+
transformStream.readable.pipeTo(writableStream).catch((error) => {
|
|
271
|
+
console.error('Error in pipeline stream:', error);
|
|
272
|
+
});
|
|
273
|
+
// Return a function that writes to the transform stream
|
|
274
|
+
return (data) => {
|
|
275
|
+
try {
|
|
276
|
+
// Write to the transform stream's writable side
|
|
277
|
+
const writer = transformStream.writable.getWriter();
|
|
278
|
+
writer.write(data).catch((error) => {
|
|
279
|
+
console.error('Error writing to stream:', error);
|
|
280
|
+
}).finally(() => {
|
|
281
|
+
writer.releaseLock();
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
console.error('Error getting writer for transform stream:', error);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Set up a WebSocket connection to process data through the pipeline
|
|
291
|
+
*
|
|
292
|
+
* @param url The WebSocket URL to connect to
|
|
293
|
+
* @param dataType The type of data (e.g., 'text', 'image', 'audio')
|
|
294
|
+
* @param options Options for pipeline execution
|
|
295
|
+
* @returns A promise that resolves with the WebSocket connection and associated streams
|
|
296
|
+
*/
|
|
297
|
+
async setupWebSocketPipeline(url, dataType, options = {}) {
|
|
298
|
+
// Ensure stream classes are initialized
|
|
299
|
+
await this.ensureStreamClassesInitialized();
|
|
300
|
+
// Get WebSocket-supporting augmentations
|
|
301
|
+
const webSocketAugmentations = augmentationPipeline.getWebSocketAugmentations();
|
|
302
|
+
if (webSocketAugmentations.length === 0) {
|
|
303
|
+
throw new Error('No WebSocket-supporting augmentations available');
|
|
304
|
+
}
|
|
305
|
+
// Use the first available WebSocket augmentation
|
|
306
|
+
const webSocketAugmentation = webSocketAugmentations[0];
|
|
307
|
+
// Connect to the WebSocket
|
|
308
|
+
const connection = await webSocketAugmentation.connectWebSocket(url);
|
|
309
|
+
// Create a readable stream from the WebSocket messages
|
|
310
|
+
const readableStream = new ReadableStream({
|
|
311
|
+
start: (controller) => {
|
|
312
|
+
// Define a message handler that writes to the stream
|
|
313
|
+
const messageHandler = (event) => {
|
|
314
|
+
try {
|
|
315
|
+
const data = typeof event.data === 'string'
|
|
316
|
+
? event.data
|
|
317
|
+
: event.data instanceof Blob
|
|
318
|
+
? new Promise(resolve => {
|
|
319
|
+
const reader = new FileReader();
|
|
320
|
+
reader.onload = () => resolve(reader.result);
|
|
321
|
+
reader.readAsText(event.data);
|
|
322
|
+
})
|
|
323
|
+
: JSON.stringify(event.data);
|
|
324
|
+
// Handle both string data and promises
|
|
325
|
+
if (data instanceof Promise) {
|
|
326
|
+
data.then(resolvedData => {
|
|
327
|
+
controller.enqueue(resolvedData);
|
|
328
|
+
}).catch((error) => {
|
|
329
|
+
console.error('Error processing blob data:', error);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
controller.enqueue(data);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.error('Error processing WebSocket message:', error);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
// Create a wrapper function that adapts the event-based handler to the data-based callback
|
|
341
|
+
const messageHandlerWrapper = (data) => {
|
|
342
|
+
messageHandler({ data });
|
|
343
|
+
};
|
|
344
|
+
// Store both handlers for later cleanup
|
|
345
|
+
connection._streamMessageHandler = messageHandler;
|
|
346
|
+
connection._messageHandlerWrapper = messageHandlerWrapper;
|
|
347
|
+
webSocketAugmentation.onWebSocketMessage(connection.connectionId, messageHandlerWrapper).catch((error) => {
|
|
348
|
+
console.error('Error registering WebSocket message handler:', error);
|
|
349
|
+
controller.error(error);
|
|
350
|
+
});
|
|
351
|
+
},
|
|
352
|
+
cancel: () => {
|
|
353
|
+
// Clean up the message handler when the stream is cancelled
|
|
354
|
+
if (connection._messageHandlerWrapper) {
|
|
355
|
+
webSocketAugmentation.offWebSocketMessage(connection.connectionId, connection._messageHandlerWrapper).catch((error) => {
|
|
356
|
+
console.error('Error removing WebSocket message handler:', error);
|
|
357
|
+
});
|
|
358
|
+
delete connection._streamMessageHandler;
|
|
359
|
+
delete connection._messageHandlerWrapper;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
// Create a handler for processing the data
|
|
364
|
+
const handlerPromise = this.createWebSocketHandler(connection, dataType, options);
|
|
365
|
+
// Create a writable stream that sends data to the WebSocket
|
|
366
|
+
const writableStream = new WritableStream({
|
|
367
|
+
write: async (chunk) => {
|
|
368
|
+
if (connection.send && typeof connection.send === 'function') {
|
|
369
|
+
try {
|
|
370
|
+
const data = typeof chunk === 'string' ? chunk : JSON.stringify(chunk);
|
|
371
|
+
await connection.send(data);
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
console.error('Error sending data to WebSocket:', error);
|
|
375
|
+
throw error;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
throw new Error('WebSocket connection does not support sending data');
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
close: () => {
|
|
383
|
+
// Close the WebSocket connection when the stream is closed
|
|
384
|
+
if (connection.close && typeof connection.close === 'function') {
|
|
385
|
+
connection.close().catch((error) => {
|
|
386
|
+
console.error('Error closing WebSocket connection:', error);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
// Pipe the readable stream through our processing pipeline
|
|
392
|
+
readableStream
|
|
393
|
+
.pipeThrough(new TransformStream({
|
|
394
|
+
transform: async (chunk, controller) => {
|
|
395
|
+
// Process each chunk through our handler
|
|
396
|
+
const handler = await handlerPromise;
|
|
397
|
+
handler(chunk);
|
|
398
|
+
// Pass through the original data
|
|
399
|
+
controller.enqueue(chunk);
|
|
400
|
+
}
|
|
401
|
+
}))
|
|
402
|
+
.pipeTo(new WritableStream({
|
|
403
|
+
write: () => { },
|
|
404
|
+
abort: (error) => {
|
|
405
|
+
console.error('Error in WebSocket pipeline:', error);
|
|
406
|
+
}
|
|
407
|
+
}));
|
|
408
|
+
// Attach the streams to the connection object for convenience
|
|
409
|
+
const enhancedConnection = connection;
|
|
410
|
+
enhancedConnection.readableStream = readableStream;
|
|
411
|
+
enhancedConnection.writableStream = writableStream;
|
|
412
|
+
return enhancedConnection;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Create and export a default instance of the sequential pipeline
|
|
416
|
+
export const sequentialPipeline = new SequentialPipeline();
|
|
417
|
+
//# sourceMappingURL=sequentialPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequentialPipeline.js","sourceRoot":"","sources":["../src/sequentialPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRITICAL: This file is imported for its side effects to patch the environment
|
|
3
|
+
* for TensorFlow.js before any other library code runs.
|
|
4
|
+
*
|
|
5
|
+
* It ensures that by the time TensorFlow.js is imported by any other
|
|
6
|
+
* module, the necessary compatibility fixes for the current Node.js
|
|
7
|
+
* environment are already in place.
|
|
8
|
+
*
|
|
9
|
+
* This file MUST be imported as the first import in unified.ts to prevent
|
|
10
|
+
* race conditions with TensorFlow.js initialization. Failure to do so will
|
|
11
|
+
* result in errors like "TextEncoder is not a constructor" when the package
|
|
12
|
+
* is used in Node.js environments.
|
|
13
|
+
*
|
|
14
|
+
* The package.json file marks this file as having side effects to prevent
|
|
15
|
+
* tree-shaking by bundlers, ensuring the patch is always applied.
|
|
16
|
+
*/
|
|
17
|
+
// Get the appropriate global object for the current environment
|
|
18
|
+
const globalObj = (() => {
|
|
19
|
+
if (typeof globalThis !== 'undefined')
|
|
20
|
+
return globalThis;
|
|
21
|
+
if (typeof global !== 'undefined')
|
|
22
|
+
return global;
|
|
23
|
+
if (typeof self !== 'undefined')
|
|
24
|
+
return self;
|
|
25
|
+
return null; // No global object available
|
|
26
|
+
})();
|
|
27
|
+
// Define TextEncoder and TextDecoder globally to make sure they're available
|
|
28
|
+
// Now works across all environments: Node.js, serverless, and other server environments
|
|
29
|
+
if (globalObj) {
|
|
30
|
+
if (!globalObj.TextEncoder) {
|
|
31
|
+
globalObj.TextEncoder = TextEncoder;
|
|
32
|
+
}
|
|
33
|
+
if (!globalObj.TextDecoder) {
|
|
34
|
+
globalObj.TextDecoder = TextDecoder;
|
|
35
|
+
}
|
|
36
|
+
// Create a special global constructor that TensorFlow can use safely
|
|
37
|
+
;
|
|
38
|
+
globalObj.__TextEncoder__ = TextEncoder;
|
|
39
|
+
globalObj.__TextDecoder__ = TextDecoder;
|
|
40
|
+
}
|
|
41
|
+
// Also import normally for ES modules environments
|
|
42
|
+
import { applyTensorFlowPatch } from './utils/textEncoding.js';
|
|
43
|
+
// Apply the TensorFlow.js platform patch
|
|
44
|
+
applyTensorFlowPatch();
|
|
45
|
+
console.log('Applied TensorFlow.js patch via ES modules in setup.ts');
|
|
46
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,gEAAgE;AAChE,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;IACtB,IAAI,OAAO,UAAU,KAAK,WAAW;QAAE,OAAO,UAAU,CAAA;IACxD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,IAAI,OAAO,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAC5C,OAAO,IAAI,CAAA,CAAC,6BAA6B;AAC3C,CAAC,CAAC,EAAE,CAAA;AAEJ,6EAA6E;AAC7E,wFAAwF;AACxF,IAAI,SAAS,EAAE,CAAC;IACd,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC3B,SAAS,CAAC,WAAW,GAAG,WAAW,CAAA;IACrC,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC3B,SAAS,CAAC,WAAW,GAAG,WAAW,CAAA;IACrC,CAAC;IAED,qEAAqE;IACrE,CAAC;IAAC,SAAiB,CAAC,eAAe,GAAG,WAAW,CAChD;IAAC,SAAiB,CAAC,eAAe,GAAG,WAAW,CAAA;AACnD,CAAC;AAED,mDAAmD;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,yCAAyC;AACzC,oBAAoB,EAAE,CAAA;AACtB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,YAAY,CAAA;AAanB,eAAO,MAAM,WAAW;;;;;;;;CAsBvB,CAAA;AAmBD,cAAc,YAAY,CAAA;AAG1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified.js","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,+DAA+D;AAE/D,+EAA+E;AAC/E,6FAA6F;AAC7F,2FAA2F;AAC3F,mDAAmD;AACnD,EAAE;AACF,sFAAsF;AACtF,0EAA0E;AAC1E,OAAO,YAAY,CAAA;AAEnB,yCAAyC;AACzC,OAAO,EACL,SAAS,EACT,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAE/B,sDAAsD;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,SAAS;QACX,OAAO,SAAS,EAAE,CAAA;IACpB,CAAC;IACD,IAAI,MAAM;QACR,OAAO,MAAM,EAAE,CAAA;IACjB,CAAC;IACD,IAAI,YAAY;QACd,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;IAClC,CAAC;IACD,WAAW,EAAE;QACX,OAAO,WAAW,EAAE,CAAA;IACtB,CAAC;IACD,IAAI,oBAAoB;QACtB,OAAO,oBAAoB,EAAE,CAAA;IAC/B,CAAC;IACD,yBAAyB,EAAE;QACzB,OAAO,yBAAyB,EAAE,CAAA;IACpC,CAAC;IACD,yBAAyB,EAAE;QACzB,OAAO,yBAAyB,EAAE,CAAA;IACpC,CAAC;CACF,CAAA;AAED,kDAAkD;AAClD,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;IACtC,CAAC;IAAC,UAAkB,CAAC,OAAO,GAAG,WAAW,CAAA;AAC5C,CAAC;AAED,+BAA+B;AAC/B,OAAO,CAAC,GAAG,CACT,qBACE,WAAW,CAAC,SAAS;IACnB,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,WAAW,CAAC,MAAM;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,oBACR,cAAc,CACf,CAAA;AAED,qCAAqC;AACrC,cAAc,YAAY,CAAA;AAE1B,kEAAkE;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -238,27 +238,50 @@ export class RobustModelLoader {
|
|
|
238
238
|
if (brainyModels?.BundledUniversalSentenceEncoder) {
|
|
239
239
|
console.log('✅ Found @soulcraft/brainy-models package installed');
|
|
240
240
|
console.log(' Using local bundled model for maximum performance and reliability');
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
241
|
+
try {
|
|
242
|
+
const encoder = new brainyModels.BundledUniversalSentenceEncoder({
|
|
243
|
+
verbose: this.options.verbose,
|
|
244
|
+
preferCompressed: false
|
|
245
|
+
});
|
|
246
|
+
// Log metadata if available
|
|
247
|
+
if (encoder.metadata) {
|
|
248
|
+
console.log('📋 Model metadata:', encoder.metadata);
|
|
249
|
+
}
|
|
250
|
+
await encoder.load();
|
|
251
|
+
console.log('✅ Local Universal Sentence Encoder model loaded successfully');
|
|
252
|
+
// Return a wrapper that matches the Universal Sentence Encoder interface
|
|
253
|
+
return {
|
|
254
|
+
init: async () => {
|
|
255
|
+
// Already initialized
|
|
256
|
+
},
|
|
257
|
+
embed: async (sentences) => {
|
|
258
|
+
const input = Array.isArray(sentences) ? sentences : [sentences];
|
|
259
|
+
const embeddings = await encoder.embedToArrays(input);
|
|
260
|
+
// Return the first embedding as a Vector (number[])
|
|
261
|
+
return embeddings[0] || [];
|
|
262
|
+
},
|
|
263
|
+
dispose: async () => {
|
|
264
|
+
encoder.dispose();
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch (loadError) {
|
|
269
|
+
console.error('Failed to load bundled model:', loadError);
|
|
270
|
+
// Try alternative loading method if available
|
|
271
|
+
if (brainyModels.loadUniversalSentenceEncoder) {
|
|
272
|
+
console.log('Trying alternative loading method...');
|
|
273
|
+
try {
|
|
274
|
+
const model = await brainyModels.loadUniversalSentenceEncoder({
|
|
275
|
+
verbose: this.options.verbose
|
|
276
|
+
});
|
|
277
|
+
console.log('✅ Loaded via alternative method');
|
|
278
|
+
return model;
|
|
279
|
+
}
|
|
280
|
+
catch (altError) {
|
|
281
|
+
console.error('Alternative loading failed:', altError);
|
|
282
|
+
}
|
|
260
283
|
}
|
|
261
|
-
}
|
|
284
|
+
}
|
|
262
285
|
}
|
|
263
286
|
}
|
|
264
287
|
catch (importError) {
|
|
@@ -282,12 +305,18 @@ export class RobustModelLoader {
|
|
|
282
305
|
const __dirname = path.dirname(__filename);
|
|
283
306
|
// Look for bundled model in multiple possible locations
|
|
284
307
|
const possiblePaths = [
|
|
308
|
+
// Direct @soulcraft/brainy-models paths
|
|
309
|
+
path.join(process.cwd(), 'node_modules', '@soulcraft', 'brainy-models', 'models', 'universal-sentence-encoder'),
|
|
310
|
+
path.join(process.cwd(), 'node_modules', '@soulcraft', 'brainy-models', 'universal-sentence-encoder'),
|
|
311
|
+
path.join(__dirname, '..', '..', 'node_modules', '@soulcraft', 'brainy-models', 'models', 'universal-sentence-encoder'),
|
|
312
|
+
path.join(__dirname, '..', '..', 'node_modules', '@soulcraft', 'brainy-models', 'universal-sentence-encoder'),
|
|
313
|
+
// Alternative paths
|
|
285
314
|
path.join(__dirname, '..', '..', 'models', 'bundled', 'universal-sentence-encoder'),
|
|
286
315
|
path.join(__dirname, '..', '..', 'brainy-models-package', 'models', 'universal-sentence-encoder'),
|
|
287
316
|
path.join(process.cwd(), 'brainy-models-package', 'models', 'universal-sentence-encoder'),
|
|
288
|
-
|
|
289
|
-
path.join(
|
|
290
|
-
path.join(process.cwd(), 'node_modules', '@soulcraft', 'brainy-models', 'universal-sentence-encoder')
|
|
317
|
+
// Check parent directories (for monorepo structures)
|
|
318
|
+
path.join(process.cwd(), '..', 'node_modules', '@soulcraft', 'brainy-models', 'models', 'universal-sentence-encoder'),
|
|
319
|
+
path.join(process.cwd(), '..', '..', 'node_modules', '@soulcraft', 'brainy-models', 'models', 'universal-sentence-encoder')
|
|
291
320
|
];
|
|
292
321
|
for (const modelPath of possiblePaths) {
|
|
293
322
|
const modelJsonPath = path.join(modelPath, 'model.json');
|
|
@@ -529,8 +558,14 @@ export function createRobustModelLoader(options) {
|
|
|
529
558
|
*/
|
|
530
559
|
export function getUniversalSentenceEncoderFallbacks() {
|
|
531
560
|
return [
|
|
532
|
-
|
|
533
|
-
'https://
|
|
561
|
+
// TensorFlow Hub model URL (correct path)
|
|
562
|
+
'https://tfhub.dev/tensorflow/tfjs-model/universal-sentence-encoder/1/default/1/model.json?tfjs-format=file',
|
|
563
|
+
// Alternative TensorFlow Hub URL
|
|
564
|
+
'https://www.kaggle.com/models/tensorflow/universal-sentence-encoder/tfJs/default/1/model.json?tfjs-format=file',
|
|
565
|
+
// Google Storage URL (updated path)
|
|
566
|
+
'https://storage.googleapis.com/tfjs-models/savedmodel/universal_sentence_encoder/model.json',
|
|
567
|
+
// Alternative Google Storage URL
|
|
568
|
+
'https://storage.googleapis.com/tfhub-tfjs-modules/tensorflow/universal-sentence-encoder/1/default/1/model.json',
|
|
534
569
|
// Add more fallback URLs as they become available
|
|
535
570
|
];
|
|
536
571
|
}
|