@ai.ntellect/core 0.7.14 → 0.8.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.
Files changed (99) hide show
  1. package/README.md +104 -44
  2. package/dist/graph/event-manager.d.ts +9 -1
  3. package/dist/graph/event-manager.d.ts.map +1 -1
  4. package/dist/graph/event-manager.js +115 -37
  5. package/dist/graph/event-manager.js.map +1 -1
  6. package/dist/graph/index.d.ts +20 -1
  7. package/dist/graph/index.d.ts.map +1 -1
  8. package/dist/graph/index.js +59 -10
  9. package/dist/graph/index.js.map +1 -1
  10. package/dist/graph/node.d.ts +0 -24
  11. package/dist/graph/node.d.ts.map +1 -1
  12. package/dist/graph/node.js +2 -71
  13. package/dist/graph/node.js.map +1 -1
  14. package/dist/graph/observer.d.ts +6 -87
  15. package/dist/graph/observer.d.ts.map +1 -1
  16. package/dist/graph/observer.js +3 -116
  17. package/dist/graph/observer.js.map +1 -1
  18. package/dist/index.d.ts +3 -6
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/interfaces/index.d.ts +10 -1
  23. package/dist/interfaces/index.d.ts.map +1 -1
  24. package/dist/interfaces/index.js.map +1 -1
  25. package/dist/modules/agent/agent.d.ts +35 -0
  26. package/dist/modules/agent/agent.d.ts.map +1 -0
  27. package/dist/modules/agent/agent.js +106 -0
  28. package/dist/modules/agent/agent.js.map +1 -0
  29. package/dist/modules/agent/base/executor.d.ts +51 -0
  30. package/dist/modules/agent/base/executor.d.ts.map +1 -0
  31. package/dist/modules/agent/base/executor.js +66 -0
  32. package/dist/modules/agent/base/executor.js.map +1 -0
  33. package/dist/modules/agent/base/index.d.ts +30 -0
  34. package/dist/modules/agent/base/index.d.ts.map +1 -0
  35. package/dist/modules/agent/base/index.js +100 -0
  36. package/dist/modules/agent/base/index.js.map +1 -0
  37. package/dist/modules/agent/generic-assistant.d.ts +20 -0
  38. package/dist/modules/agent/generic-assistant.d.ts.map +1 -0
  39. package/dist/modules/agent/generic-assistant.js +89 -0
  40. package/dist/modules/agent/generic-assistant.js.map +1 -0
  41. package/dist/modules/agent/generic-executor.d.ts +57 -0
  42. package/dist/modules/agent/generic-executor.d.ts.map +1 -0
  43. package/dist/modules/agent/generic-executor.js +200 -0
  44. package/dist/modules/agent/generic-executor.js.map +1 -0
  45. package/dist/modules/agent/llm-factory.d.ts +19 -0
  46. package/dist/modules/agent/llm-factory.d.ts.map +1 -0
  47. package/dist/modules/agent/llm-factory.js +56 -0
  48. package/dist/modules/agent/llm-factory.js.map +1 -0
  49. package/dist/modules/agent/prompt-builder.d.ts +35 -0
  50. package/dist/modules/agent/prompt-builder.d.ts.map +1 -0
  51. package/dist/modules/agent/prompt-builder.js +76 -0
  52. package/dist/modules/agent/prompt-builder.js.map +1 -0
  53. package/dist/modules/memory/adapters/in-memory/index.d.ts.map +1 -1
  54. package/dist/modules/memory/adapters/in-memory/index.js +4 -3
  55. package/dist/modules/memory/adapters/in-memory/index.js.map +1 -1
  56. package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +1 -1
  57. package/dist/modules/memory/adapters/meilisearch/index.js +7 -4
  58. package/dist/modules/memory/adapters/meilisearch/index.js.map +1 -1
  59. package/dist/modules/memory/adapters/redis/index.d.ts.map +1 -1
  60. package/dist/modules/memory/adapters/redis/index.js +2 -1
  61. package/dist/modules/memory/adapters/redis/index.js.map +1 -1
  62. package/dist/modules/nlp/engine.d.ts +126 -0
  63. package/dist/modules/nlp/engine.d.ts.map +1 -0
  64. package/dist/modules/nlp/engine.js +300 -0
  65. package/dist/modules/nlp/engine.js.map +1 -0
  66. package/dist/modules/nlp/index.d.ts +27 -0
  67. package/dist/modules/nlp/index.d.ts.map +1 -0
  68. package/dist/modules/nlp/index.js +56 -0
  69. package/dist/modules/nlp/index.js.map +1 -0
  70. package/dist/types/agent.d.ts +233 -0
  71. package/dist/types/agent.d.ts.map +1 -0
  72. package/dist/types/agent.js +29 -0
  73. package/dist/types/agent.js.map +1 -0
  74. package/dist/types/index.d.ts +72 -18
  75. package/dist/types/index.d.ts.map +1 -1
  76. package/dist/utils/generate-action-schema.d.ts.map +1 -1
  77. package/graph/event-manager.ts +135 -42
  78. package/graph/index.ts +57 -4
  79. package/graph/node.ts +2 -104
  80. package/graph/observer.ts +9 -215
  81. package/index.ts +4 -7
  82. package/interfaces/index.ts +12 -0
  83. package/modules/agent/agent.ts +108 -0
  84. package/modules/agent/base/executor.ts +100 -0
  85. package/modules/agent/base/index.ts +99 -0
  86. package/modules/agent/generic-assistant.ts +90 -0
  87. package/modules/agent/generic-executor.ts +259 -0
  88. package/modules/agent/llm-factory.ts +47 -0
  89. package/modules/agent/prompt-builder.ts +78 -0
  90. package/modules/memory/adapters/in-memory/index.ts +4 -3
  91. package/modules/memory/adapters/meilisearch/index.ts +7 -4
  92. package/modules/memory/adapters/redis/index.ts +2 -1
  93. package/modules/nlp/engine.ts +325 -0
  94. package/modules/nlp/index.ts +45 -0
  95. package/package.json +5 -2
  96. package/test/graph/index.test.ts +6 -4
  97. package/test/graph/node.test.ts +18 -14
  98. package/types/agent.ts +174 -0
  99. package/types/index.ts +74 -18
@@ -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 { GraphContext, GraphEvent, GraphNodeConfig } from "../types";
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
- // Attendre les événements si waitForEvents est configuré
289
- if (node.waitForEvents) {
290
- try {
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
- async waitForCorrelatedEvents(
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
- isResolved = true;
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
- const checkCorrelation = () => {
336
- if (eventTypes.every((type) => receivedEvents.has(type))) {
337
- const events = Array.from(receivedEvents.values());
338
- if (correlationFn(events)) {
339
- if (!isResolved) {
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
- eventTypes.forEach((eventType) => {
352
- this.eventEmitter.on(eventType, (eventData: any) => {
353
- receivedEvents.set(eventType, {
354
- type: eventType,
355
- payload: eventData,
356
- timestamp: Date.now(),
357
- });
358
- checkCorrelation();
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,
@@ -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 async emit(
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
- await new Promise((resolve) => setTimeout(resolve, 0));
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.correlateEvents) {
100
- await this.eventManager.waitForCorrelatedEvents(
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
  }