@ai.ntellect/core 0.7.13 → 0.8.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/graph/controller.d.ts +3 -3
- package/dist/graph/controller.d.ts.map +1 -1
- package/dist/graph/controller.js +14 -5
- package/dist/graph/controller.js.map +1 -1
- package/dist/graph/event-manager.d.ts +9 -1
- package/dist/graph/event-manager.d.ts.map +1 -1
- package/dist/graph/event-manager.js +115 -37
- package/dist/graph/event-manager.js.map +1 -1
- package/dist/graph/index.d.ts +21 -2
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js +60 -11
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/node.d.ts +0 -24
- package/dist/graph/node.d.ts.map +1 -1
- package/dist/graph/node.js +2 -71
- package/dist/graph/node.js.map +1 -1
- package/dist/graph/observer.d.ts +6 -87
- package/dist/graph/observer.d.ts.map +1 -1
- package/dist/graph/observer.js +3 -116
- package/dist/graph/observer.js.map +1 -1
- package/dist/index.d.ts +1 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.d.ts +10 -1
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js.map +1 -1
- package/dist/modules/agent/agent.d.ts +35 -0
- package/dist/modules/agent/agent.d.ts.map +1 -0
- package/dist/modules/agent/agent.js +106 -0
- package/dist/modules/agent/agent.js.map +1 -0
- package/dist/modules/agent/base/executor.d.ts +51 -0
- package/dist/modules/agent/base/executor.d.ts.map +1 -0
- package/dist/modules/agent/base/executor.js +66 -0
- package/dist/modules/agent/base/executor.js.map +1 -0
- package/dist/modules/agent/base/index.d.ts +30 -0
- package/dist/modules/agent/base/index.d.ts.map +1 -0
- package/dist/modules/agent/base/index.js +100 -0
- package/dist/modules/agent/base/index.js.map +1 -0
- package/dist/modules/agent/generic-assistant.d.ts +20 -0
- package/dist/modules/agent/generic-assistant.d.ts.map +1 -0
- package/dist/modules/agent/generic-assistant.js +89 -0
- package/dist/modules/agent/generic-assistant.js.map +1 -0
- package/dist/modules/agent/generic-executor.d.ts +57 -0
- package/dist/modules/agent/generic-executor.d.ts.map +1 -0
- package/dist/modules/agent/generic-executor.js +200 -0
- package/dist/modules/agent/generic-executor.js.map +1 -0
- package/dist/modules/agent/llm-factory.d.ts +19 -0
- package/dist/modules/agent/llm-factory.d.ts.map +1 -0
- package/dist/modules/agent/llm-factory.js +56 -0
- package/dist/modules/agent/llm-factory.js.map +1 -0
- package/dist/modules/agent/prompt-builder.d.ts +35 -0
- package/dist/modules/agent/prompt-builder.d.ts.map +1 -0
- package/dist/modules/agent/prompt-builder.js +76 -0
- package/dist/modules/agent/prompt-builder.js.map +1 -0
- package/dist/modules/memory/adapters/in-memory/index.d.ts.map +1 -1
- package/dist/modules/memory/adapters/in-memory/index.js +4 -3
- package/dist/modules/memory/adapters/in-memory/index.js.map +1 -1
- package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +1 -1
- package/dist/modules/memory/adapters/meilisearch/index.js +7 -4
- package/dist/modules/memory/adapters/meilisearch/index.js.map +1 -1
- package/dist/modules/memory/adapters/redis/index.d.ts.map +1 -1
- package/dist/modules/memory/adapters/redis/index.js +2 -1
- package/dist/modules/memory/adapters/redis/index.js.map +1 -1
- package/dist/modules/nlp/engine.d.ts +126 -0
- package/dist/modules/nlp/engine.d.ts.map +1 -0
- package/dist/modules/nlp/engine.js +300 -0
- package/dist/modules/nlp/engine.js.map +1 -0
- package/dist/modules/nlp/index.d.ts +27 -0
- package/dist/modules/nlp/index.d.ts.map +1 -0
- package/dist/modules/nlp/index.js +56 -0
- package/dist/modules/nlp/index.js.map +1 -0
- package/dist/types/agent.d.ts +233 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +29 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/index.d.ts +81 -18
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/generate-action-schema.d.ts.map +1 -1
- package/graph/controller.ts +21 -10
- package/graph/event-manager.ts +135 -42
- package/graph/index.ts +58 -5
- package/graph/node.ts +2 -104
- package/graph/observer.ts +9 -215
- package/index.ts +2 -7
- package/interfaces/index.ts +12 -0
- package/modules/agent/agent.ts +108 -0
- package/modules/agent/base/executor.ts +100 -0
- package/modules/agent/base/index.ts +99 -0
- package/modules/agent/generic-assistant.ts +90 -0
- package/modules/agent/generic-executor.ts +259 -0
- package/modules/agent/llm-factory.ts +47 -0
- package/modules/agent/prompt-builder.ts +78 -0
- package/modules/memory/adapters/in-memory/index.ts +4 -3
- package/modules/memory/adapters/meilisearch/index.ts +7 -4
- package/modules/memory/adapters/redis/index.ts +2 -1
- package/modules/nlp/engine.ts +325 -0
- package/modules/nlp/index.ts +45 -0
- package/package.json +5 -2
- package/test/graph/controller.test.ts +18 -14
- package/test/graph/index.test.ts +10 -8
- package/test/graph/node.test.ts +18 -14
- package/types/agent.ts +174 -0
- package/types/index.ts +84 -18
package/graph/event-manager.ts
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
import { Observable, Subject, filter } from "rxjs";
|
2
2
|
import { ZodSchema } from "zod";
|
3
3
|
import { IEventEmitter } from "../interfaces";
|
4
|
-
import {
|
4
|
+
import {
|
5
|
+
EventConfig,
|
6
|
+
GraphContext,
|
7
|
+
GraphEvent,
|
8
|
+
GraphNodeConfig,
|
9
|
+
} from "../types";
|
5
10
|
import { GraphNode } from "./node";
|
6
11
|
|
7
12
|
/**
|
@@ -17,6 +22,7 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
17
22
|
private graphEvents?: string[];
|
18
23
|
private entryNode?: string;
|
19
24
|
private globalErrorHandler?: (error: Error, context: GraphContext<T>) => void;
|
25
|
+
private lastEvents = new Map<string, any>();
|
20
26
|
|
21
27
|
/**
|
22
28
|
* Creates a new GraphEventManager instance
|
@@ -72,14 +78,12 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
72
78
|
payload?: P,
|
73
79
|
context?: GraphContext<T>
|
74
80
|
): void {
|
75
|
-
// Éviter la double imbrication des événements
|
76
81
|
const event = {
|
77
82
|
type,
|
78
83
|
payload,
|
79
84
|
timestamp: Date.now(),
|
80
85
|
};
|
81
86
|
|
82
|
-
// Émettre l'événement une seule fois
|
83
87
|
this.eventSubject.next(event);
|
84
88
|
this.eventEmitter.emit(type, payload);
|
85
89
|
}
|
@@ -248,6 +252,7 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
248
252
|
* @param data - Optional data to include with the event
|
249
253
|
*/
|
250
254
|
emit(eventName: string, data?: any): void {
|
255
|
+
this.lastEvents.set(eventName, data);
|
251
256
|
this.eventEmitter.emit(eventName, data);
|
252
257
|
}
|
253
258
|
|
@@ -285,20 +290,9 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
285
290
|
throw new Error(`Node "${nodeName}" not found`);
|
286
291
|
}
|
287
292
|
|
288
|
-
//
|
289
|
-
if (node.
|
290
|
-
|
291
|
-
await this.waitForEvents(
|
292
|
-
node.waitForEvents.events,
|
293
|
-
node.waitForEvents.timeout
|
294
|
-
);
|
295
|
-
} catch (error) {
|
296
|
-
throw new Error(
|
297
|
-
`Timeout waiting for events in node "${nodeName}": ${
|
298
|
-
(error as Error).message
|
299
|
-
}`
|
300
|
-
);
|
301
|
-
}
|
293
|
+
// Remplacer le code existant de gestion d'événements
|
294
|
+
if (node.when) {
|
295
|
+
await this.handleNodeEvents(nodeName, node.when);
|
302
296
|
}
|
303
297
|
|
304
298
|
return this.nodeExecutor.executeNode(
|
@@ -309,21 +303,54 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
309
303
|
);
|
310
304
|
}
|
311
305
|
|
312
|
-
|
306
|
+
/**
|
307
|
+
* Waits for correlated events to occur and validates them using a correlation function
|
308
|
+
*/
|
309
|
+
waitForCorrelatedEvents(
|
313
310
|
eventTypes: string[],
|
314
311
|
timeoutMs: number,
|
315
312
|
correlationFn: (events: GraphEvent<T>[]) => boolean
|
316
313
|
): Promise<GraphEvent<T>[]> {
|
317
314
|
return new Promise((resolve, reject) => {
|
318
315
|
const receivedEvents = new Map<string, GraphEvent<T>>();
|
316
|
+
const eventHandlers = new Map();
|
319
317
|
let isResolved = false;
|
320
318
|
|
319
|
+
const cleanup = () => {
|
320
|
+
eventHandlers.forEach((handler, event) => {
|
321
|
+
this.eventEmitter.removeListener(event, handler);
|
322
|
+
});
|
323
|
+
};
|
324
|
+
|
325
|
+
eventTypes.forEach((eventType) => {
|
326
|
+
const handler = (eventData: any) => {
|
327
|
+
if (!isResolved) {
|
328
|
+
const event: GraphEvent<T> = {
|
329
|
+
type: eventType,
|
330
|
+
payload: eventData,
|
331
|
+
timestamp: Date.now(),
|
332
|
+
};
|
333
|
+
receivedEvents.set(eventType, event);
|
334
|
+
|
335
|
+
if (eventTypes.every((type) => receivedEvents.has(type))) {
|
336
|
+
const events = Array.from(receivedEvents.values());
|
337
|
+
if (correlationFn(events)) {
|
338
|
+
isResolved = true;
|
339
|
+
clearTimeout(timeoutId);
|
340
|
+
cleanup();
|
341
|
+
resolve(events);
|
342
|
+
}
|
343
|
+
}
|
344
|
+
}
|
345
|
+
};
|
346
|
+
|
347
|
+
eventHandlers.set(eventType, handler);
|
348
|
+
this.eventEmitter.on(eventType, handler);
|
349
|
+
});
|
350
|
+
|
321
351
|
const timeoutId = setTimeout(() => {
|
322
352
|
if (!isResolved) {
|
323
|
-
|
324
|
-
eventTypes.forEach((type) => {
|
325
|
-
this.eventEmitter.removeAllListeners(type);
|
326
|
-
});
|
353
|
+
cleanup();
|
327
354
|
reject(
|
328
355
|
new Error(
|
329
356
|
`Timeout waiting for correlated events: ${eventTypes.join(", ")}`
|
@@ -331,33 +358,99 @@ export class GraphEventManager<T extends ZodSchema> {
|
|
331
358
|
);
|
332
359
|
}
|
333
360
|
}, timeoutMs);
|
361
|
+
});
|
362
|
+
}
|
363
|
+
|
364
|
+
/**
|
365
|
+
* Handles events based on the node's event handler configuration
|
366
|
+
*/
|
367
|
+
async handleNodeEvents(
|
368
|
+
nodeName: string,
|
369
|
+
config: EventConfig
|
370
|
+
): Promise<any[]> {
|
371
|
+
const { events, timeout = 30000, strategy } = config;
|
372
|
+
|
373
|
+
return new Promise((resolve, reject) => {
|
374
|
+
const receivedEvents = new Map<string, any>();
|
375
|
+
const eventHandlers = new Map();
|
376
|
+
let isResolved = false;
|
334
377
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
378
|
+
// Ajouter les événements déjà reçus
|
379
|
+
events.forEach((event: string) => {
|
380
|
+
const existingEvent = this.lastEvents.get(event);
|
381
|
+
if (existingEvent) {
|
382
|
+
receivedEvents.set(event, {
|
383
|
+
type: event,
|
384
|
+
payload: existingEvent,
|
385
|
+
timestamp: Date.now(),
|
386
|
+
});
|
387
|
+
}
|
388
|
+
});
|
389
|
+
|
390
|
+
// Vérifier si on a déjà tous les événements nécessaires
|
391
|
+
const checkEvents = () => {
|
392
|
+
if (isResolved) return;
|
393
|
+
|
394
|
+
const eventsList = Array.from(receivedEvents.values());
|
395
|
+
|
396
|
+
switch (strategy.type) {
|
397
|
+
case "single":
|
398
|
+
if (receivedEvents.size > 0) {
|
399
|
+
resolve(eventsList);
|
340
400
|
isResolved = true;
|
341
|
-
clearTimeout(timeoutId);
|
342
|
-
eventTypes.forEach((type) => {
|
343
|
-
this.eventEmitter.removeAllListeners(type);
|
344
|
-
});
|
345
|
-
resolve(events);
|
346
401
|
}
|
347
|
-
|
402
|
+
break;
|
403
|
+
|
404
|
+
case "all":
|
405
|
+
case "correlate":
|
406
|
+
const allReceived = events.every((e: string) =>
|
407
|
+
receivedEvents.has(e)
|
408
|
+
);
|
409
|
+
if (allReceived) {
|
410
|
+
if (strategy.type === "correlate") {
|
411
|
+
const correlated = strategy.correlation?.(eventsList);
|
412
|
+
if (!correlated) return;
|
413
|
+
}
|
414
|
+
resolve(eventsList);
|
415
|
+
isResolved = true;
|
416
|
+
}
|
417
|
+
break;
|
418
|
+
}
|
419
|
+
|
420
|
+
if (isResolved) {
|
421
|
+
cleanup();
|
348
422
|
}
|
349
423
|
};
|
350
424
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
425
|
+
events.forEach((event: string) => {
|
426
|
+
if (!receivedEvents.has(event)) {
|
427
|
+
const handler = (eventData: any) => {
|
428
|
+
receivedEvents.set(event, {
|
429
|
+
type: event,
|
430
|
+
payload: eventData,
|
431
|
+
timestamp: Date.now(),
|
432
|
+
});
|
433
|
+
checkEvents();
|
434
|
+
};
|
435
|
+
eventHandlers.set(event, handler);
|
436
|
+
this.eventEmitter.on(event, handler);
|
437
|
+
}
|
360
438
|
});
|
439
|
+
|
440
|
+
const cleanup = () => {
|
441
|
+
eventHandlers.forEach((handler, event) => {
|
442
|
+
this.eventEmitter.removeListener(event, handler);
|
443
|
+
});
|
444
|
+
};
|
445
|
+
|
446
|
+
checkEvents();
|
447
|
+
|
448
|
+
const timeoutId = setTimeout(() => {
|
449
|
+
if (!isResolved) {
|
450
|
+
cleanup();
|
451
|
+
reject(new Error(`Timeout waiting for events: ${events.join(", ")}`));
|
452
|
+
}
|
453
|
+
}, timeout);
|
361
454
|
});
|
362
455
|
}
|
363
456
|
}
|
package/graph/index.ts
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import { EventEmitter } from "events";
|
2
2
|
import { BehaviorSubject, Subject } from "rxjs";
|
3
3
|
import { ZodSchema } from "zod";
|
4
|
-
import { GraphObservable, IEventEmitter } from "../interfaces";
|
4
|
+
import { GraphObservable, IEventEmitter, NLPNodeConfig } from "../interfaces";
|
5
|
+
import { NLPNode } from "../modules/nlp";
|
5
6
|
import {
|
6
7
|
GraphConfig,
|
7
8
|
GraphContext,
|
@@ -16,7 +17,7 @@ import { GraphVisualizer } from "./visualizer";
|
|
16
17
|
|
17
18
|
/**
|
18
19
|
* @module GraphFlow
|
19
|
-
* @description A
|
20
|
+
* @description A workflow engine that manages the execution of nodes in a graph-like structure.
|
20
21
|
*
|
21
22
|
* Key features:
|
22
23
|
* - Multiple branches support
|
@@ -46,6 +47,8 @@ export class GraphFlow<T extends ZodSchema> {
|
|
46
47
|
private eventManager: GraphEventManager<T>;
|
47
48
|
private nodeExecutor: GraphNode<T>;
|
48
49
|
|
50
|
+
private nlpNodes: Map<string, NLPNode<T>> = new Map();
|
51
|
+
|
49
52
|
/**
|
50
53
|
* Creates a new instance of GraphFlow
|
51
54
|
* @param {string} name - The name of the graph flow
|
@@ -96,7 +99,8 @@ export class GraphFlow<T extends ZodSchema> {
|
|
96
99
|
this,
|
97
100
|
this.eventSubject,
|
98
101
|
this.stateSubject,
|
99
|
-
this.destroySubject
|
102
|
+
this.destroySubject,
|
103
|
+
this.eventManager
|
100
104
|
);
|
101
105
|
}
|
102
106
|
|
@@ -165,6 +169,9 @@ export class GraphFlow<T extends ZodSchema> {
|
|
165
169
|
inputs: any,
|
166
170
|
triggeredByEvent: boolean = false
|
167
171
|
): Promise<void> {
|
172
|
+
const node = this.nodes.get(nodeName);
|
173
|
+
if (!node) throw new Error(`Node "${nodeName}" not found`);
|
174
|
+
|
168
175
|
return this.nodeExecutor.executeNode(
|
169
176
|
nodeName,
|
170
177
|
context,
|
@@ -270,7 +277,7 @@ export class GraphFlow<T extends ZodSchema> {
|
|
270
277
|
* @param {Partial<GraphContext<T>>} data - Optional data to merge with context
|
271
278
|
* @returns {Promise<void>}
|
272
279
|
*/
|
273
|
-
public
|
280
|
+
public emit(
|
274
281
|
eventName: string,
|
275
282
|
data?: Partial<GraphContext<T>>
|
276
283
|
): Promise<void> {
|
@@ -280,7 +287,8 @@ export class GraphFlow<T extends ZodSchema> {
|
|
280
287
|
timestamp: Date.now(),
|
281
288
|
};
|
282
289
|
this.eventSubject.next(event);
|
283
|
-
|
290
|
+
this.eventManager.emit(eventName, data);
|
291
|
+
return Promise.resolve();
|
284
292
|
}
|
285
293
|
|
286
294
|
/**
|
@@ -406,4 +414,49 @@ export class GraphFlow<T extends ZodSchema> {
|
|
406
414
|
public createVisualizer(): GraphVisualizer<T> {
|
407
415
|
return new GraphVisualizer(this.nodes);
|
408
416
|
}
|
417
|
+
|
418
|
+
/**
|
419
|
+
* Gets the schema for the current graph
|
420
|
+
* @returns {T} The schema for the current graph
|
421
|
+
*/
|
422
|
+
public getSchema(): T {
|
423
|
+
return this.validator as T;
|
424
|
+
}
|
425
|
+
|
426
|
+
/**
|
427
|
+
* Adds a new NLP node to the graph
|
428
|
+
* @param {NLPNodeConfig<T>} config - Configuration for the NLP node
|
429
|
+
* @returns {Promise<void>}
|
430
|
+
*/
|
431
|
+
public async addNLPNode(config: NLPNodeConfig<T>) {
|
432
|
+
const node = new NLPNode(config);
|
433
|
+
await node.initialize();
|
434
|
+
this.nlpNodes.set(config.name, node);
|
435
|
+
|
436
|
+
this.addNode({
|
437
|
+
name: config.name,
|
438
|
+
execute: async (context, input) => {
|
439
|
+
if (!input?.input) return;
|
440
|
+
const result = await node.process(input.input);
|
441
|
+
console.log("GraphFlow NLP result:", result);
|
442
|
+
Object.assign(context, { nlpResult: result });
|
443
|
+
},
|
444
|
+
next: config.next,
|
445
|
+
});
|
446
|
+
}
|
447
|
+
|
448
|
+
/**
|
449
|
+
* Processes natural language input using a specific NLP node
|
450
|
+
* @param {string} text - The input text to process
|
451
|
+
* @param {string} nodeName - The name of the NLP node to use
|
452
|
+
* @returns {Promise<GraphContext<T>>} The result of the NLP node execution
|
453
|
+
*/
|
454
|
+
public async processNaturalLanguage(text: string, nodeName: string) {
|
455
|
+
const node = this.nlpNodes.get(nodeName);
|
456
|
+
if (!node) {
|
457
|
+
throw new Error(`NLP node "${nodeName}" not found`);
|
458
|
+
}
|
459
|
+
|
460
|
+
return this.execute(nodeName, { input: text });
|
461
|
+
}
|
409
462
|
}
|
package/graph/node.ts
CHANGED
@@ -96,22 +96,8 @@ export class GraphNode<T extends ZodSchema> {
|
|
96
96
|
this.emitEvent("nodeStarted", { name: nodeName, context: nodeContext });
|
97
97
|
|
98
98
|
try {
|
99
|
-
if (node.
|
100
|
-
await this.eventManager.
|
101
|
-
node.correlateEvents.events,
|
102
|
-
node.correlateEvents.timeout || 30000,
|
103
|
-
(events) => {
|
104
|
-
return node.correlateEvents!.correlation(events);
|
105
|
-
}
|
106
|
-
);
|
107
|
-
}
|
108
|
-
|
109
|
-
// Ensuite, attendre les événements si waitForEvents est défini
|
110
|
-
if (node.waitForEvents) {
|
111
|
-
await this.eventManager.waitForEvents(
|
112
|
-
node.waitForEvents.events,
|
113
|
-
node.waitForEvents.timeout
|
114
|
-
);
|
99
|
+
if (node.when) {
|
100
|
+
await this.eventManager.handleNodeEvents(nodeName, node.when);
|
115
101
|
}
|
116
102
|
|
117
103
|
const contextProxy = new Proxy(nodeContext, {
|
@@ -206,27 +192,6 @@ export class GraphNode<T extends ZodSchema> {
|
|
206
192
|
}
|
207
193
|
}
|
208
194
|
|
209
|
-
/**
|
210
|
-
* Handles event-related operations for a node
|
211
|
-
* @param node - The node whose events need handling
|
212
|
-
* @param nodeName - The name of the node
|
213
|
-
* @param context - The current graph context
|
214
|
-
* @private
|
215
|
-
*/
|
216
|
-
private async handleEvents(
|
217
|
-
node: GraphNodeConfig<T, any>,
|
218
|
-
nodeName: string,
|
219
|
-
context: GraphContext<T>
|
220
|
-
): Promise<void> {
|
221
|
-
if (node.correlateEvents) {
|
222
|
-
await this.handleCorrelatedEvents(node, nodeName);
|
223
|
-
}
|
224
|
-
|
225
|
-
if (node.waitForEvents) {
|
226
|
-
await this.handleWaitForEvents(node, nodeName);
|
227
|
-
}
|
228
|
-
}
|
229
|
-
|
230
195
|
/**
|
231
196
|
* Executes a node with retry logic
|
232
197
|
* @param node - The node to execute
|
@@ -277,71 +242,4 @@ export class GraphNode<T extends ZodSchema> {
|
|
277
242
|
}
|
278
243
|
}
|
279
244
|
}
|
280
|
-
|
281
|
-
/**
|
282
|
-
* Handles correlated events for a node
|
283
|
-
* @param node - The node with correlated events
|
284
|
-
* @param nodeName - The name of the node
|
285
|
-
* @throws Error if correlation fails or timeout occurs
|
286
|
-
* @private
|
287
|
-
*/
|
288
|
-
private async handleCorrelatedEvents(
|
289
|
-
node: GraphNodeConfig<T, any>,
|
290
|
-
nodeName: string
|
291
|
-
): Promise<void> {
|
292
|
-
if (node.correlateEvents) {
|
293
|
-
const { events, timeout, correlation } = node.correlateEvents;
|
294
|
-
this.logger.addLog(
|
295
|
-
`⏳ Node "${nodeName}" waiting for correlated events: ${events.join(
|
296
|
-
", "
|
297
|
-
)}`
|
298
|
-
);
|
299
|
-
|
300
|
-
try {
|
301
|
-
// Attendre les événements
|
302
|
-
const receivedEvents = await this.eventManager.waitForEvents(
|
303
|
-
events,
|
304
|
-
timeout
|
305
|
-
);
|
306
|
-
|
307
|
-
// Vérifier la corrélation
|
308
|
-
if (!correlation(receivedEvents)) {
|
309
|
-
this.logger.addLog(
|
310
|
-
`❌ Event correlation failed for node "${nodeName}"`
|
311
|
-
);
|
312
|
-
throw new Error(`Event correlation failed for node "${nodeName}"`);
|
313
|
-
}
|
314
|
-
|
315
|
-
this.logger.addLog(
|
316
|
-
`✅ Event correlation succeeded for node "${nodeName}"`
|
317
|
-
);
|
318
|
-
} catch (error) {
|
319
|
-
this.logger.addLog(
|
320
|
-
`❌ Error waiting for events: ${(error as Error).message}`
|
321
|
-
);
|
322
|
-
throw error;
|
323
|
-
}
|
324
|
-
}
|
325
|
-
}
|
326
|
-
|
327
|
-
/**
|
328
|
-
* Handles waiting for events
|
329
|
-
* @param node - The node waiting for events
|
330
|
-
* @param nodeName - The name of the node
|
331
|
-
* @throws Error if timeout occurs
|
332
|
-
* @private
|
333
|
-
*/
|
334
|
-
private async handleWaitForEvents(
|
335
|
-
node: GraphNodeConfig<T, any>,
|
336
|
-
nodeName: string
|
337
|
-
): Promise<void> {
|
338
|
-
if (node.waitForEvents) {
|
339
|
-
const { events, timeout } = node.waitForEvents;
|
340
|
-
this.logger.addLog(
|
341
|
-
`⏳ Node "${nodeName}" waiting for events: ${events.join(", ")}`
|
342
|
-
);
|
343
|
-
await this.eventManager.waitForEvents(events, timeout);
|
344
|
-
this.logger.addLog(`✅ All events received for node "${nodeName}"`);
|
345
|
-
}
|
346
|
-
}
|
347
245
|
}
|