@ai.ntellect/core 0.8.2 → 0.8.3

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 (42) hide show
  1. package/dist/graph/controller.d.ts +4 -5
  2. package/dist/graph/controller.d.ts.map +1 -1
  3. package/dist/graph/controller.js +10 -10
  4. package/dist/graph/controller.js.map +1 -1
  5. package/dist/graph/event-manager.d.ts.map +1 -1
  6. package/dist/graph/event-manager.js +4 -4
  7. package/dist/graph/event-manager.js.map +1 -1
  8. package/dist/graph/index.d.ts +2 -12
  9. package/dist/graph/index.d.ts.map +1 -1
  10. package/dist/graph/index.js +26 -46
  11. package/dist/graph/index.js.map +1 -1
  12. package/dist/graph/node.d.ts +1 -10
  13. package/dist/graph/node.d.ts.map +1 -1
  14. package/dist/graph/node.js +7 -36
  15. package/dist/graph/node.js.map +1 -1
  16. package/dist/graph/observer.d.ts +4 -0
  17. package/dist/graph/observer.d.ts.map +1 -1
  18. package/dist/graph/observer.js +27 -1
  19. package/dist/graph/observer.js.map +1 -1
  20. package/dist/modules/agent/agent.js +1 -1
  21. package/dist/modules/agent/agent.js.map +1 -1
  22. package/dist/modules/agent/generic-assistant.js +1 -1
  23. package/dist/modules/agent/generic-assistant.js.map +1 -1
  24. package/dist/modules/agent/generic-executor.js +1 -1
  25. package/dist/modules/agent/generic-executor.js.map +1 -1
  26. package/dist/modules/agent/llm-factory.d.ts.map +1 -1
  27. package/dist/types/index.d.ts +1 -1
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/graph/controller.ts +10 -11
  30. package/graph/event-manager.ts +2 -14
  31. package/graph/index.ts +29 -57
  32. package/graph/node.ts +5 -39
  33. package/graph/observer.ts +35 -5
  34. package/modules/agent/agent.ts +1 -1
  35. package/modules/agent/generic-assistant.ts +1 -1
  36. package/modules/agent/generic-executor.ts +1 -1
  37. package/package.json +1 -1
  38. package/test/graph/controller.test.ts +60 -15
  39. package/test/graph/index.test.ts +104 -109
  40. package/test/graph/node.test.ts +38 -233
  41. package/test/graph/observer.test.ts +1 -1
  42. package/types/index.ts +0 -1
@@ -5,7 +5,8 @@ import { BehaviorSubject, Subject } from "rxjs";
5
5
  import { z } from "zod";
6
6
  import { GraphEventManager } from "../../graph/event-manager";
7
7
  import { GraphLogger } from "../../graph/logger";
8
- import { GraphNode, NodeParams } from "../../graph/node";
8
+ import { GraphNode } from "../../graph/node";
9
+ import { IEventEmitter } from "../../interfaces";
9
10
  import { GraphContext } from "../../types";
10
11
 
11
12
  use(chaiAsPromised);
@@ -66,7 +67,7 @@ describe("GraphNode", () => {
66
67
  stateSubject
67
68
  );
68
69
 
69
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
70
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
70
71
 
71
72
  // Vérifier les événements émis
72
73
  expect(events).to.have.lengthOf(3); // nodeStarted, nodeStateChanged, nodeCompleted
@@ -94,12 +95,12 @@ describe("GraphNode", () => {
94
95
  );
95
96
 
96
97
  // Test avec condition vraie
97
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
98
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
98
99
  expect(events.some((e) => e.type === "nodeStateChanged")).to.be.true;
99
100
 
100
101
  // Test avec condition fausse
101
102
  events = [];
102
- await node.executeNode("test", { counter: 5, message: "Hello" }, null);
103
+ await node.executeNode("test", { counter: 5, message: "Hello" }, undefined);
103
104
  expect(events.some((e) => e.type === "nodeStateChanged")).to.be.false;
104
105
  });
105
106
 
@@ -121,12 +122,7 @@ describe("GraphNode", () => {
121
122
  );
122
123
 
123
124
  try {
124
- await node.executeNode(
125
- "test",
126
- { counter: 0, message: "Hello" },
127
- null,
128
- false
129
- );
125
+ await node.executeNode("test", { counter: 0, message: "Hello" }, false);
130
126
  expect.fail("Test error");
131
127
  } catch (error: any) {
132
128
  expect(error.message).to.equal("Test error");
@@ -152,7 +148,7 @@ describe("GraphNode", () => {
152
148
  eventSubject,
153
149
  stateSubject
154
150
  );
155
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
151
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
156
152
 
157
153
  // Compter les occurrences de chaque type d'événement
158
154
  const eventCounts = events.reduce((acc, event) => {
@@ -192,7 +188,7 @@ describe("GraphNode", () => {
192
188
  eventSubject,
193
189
  stateSubject
194
190
  );
195
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
191
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
196
192
 
197
193
  const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
198
194
  expect(stateChanges).to.have.lengthOf(1); // Seulement pour message
@@ -203,9 +199,9 @@ describe("GraphNode", () => {
203
199
  const nodes = new Map();
204
200
  nodes.set("test", {
205
201
  name: "test",
206
- execute: async (context: TestContext, inputs?: any) => {
207
- context.counter = inputs?.value ?? 0;
208
- context.message = inputs?.message ?? "Default";
202
+ execute: async (context: TestContext) => {
203
+ context.counter = 42;
204
+ context.message = "Custom";
209
205
  },
210
206
  });
211
207
 
@@ -217,56 +213,21 @@ describe("GraphNode", () => {
217
213
  stateSubject
218
214
  );
219
215
 
220
- await node.executeNode(
221
- "test",
222
- { counter: 0, message: "Hello" },
223
- { value: 5, message: "Custom" },
224
- false
225
- );
216
+ await node.executeNode("test", { counter: 0, message: "Hello" }, false);
226
217
 
227
218
  const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
228
219
  expect(stateChanges).to.have.lengthOf(2);
229
- expect(stateChanges[0].payload.newValue).to.equal(5);
220
+ expect(stateChanges[0].payload.newValue).to.equal(42);
230
221
  expect(stateChanges[1].payload.newValue).to.equal("Custom");
231
222
  });
232
223
 
233
- it("should use default values when no parameters provided", async () => {
234
- const nodes = new Map();
235
- nodes.set("test", {
236
- name: "test",
237
- execute: async (
238
- context: TestContext,
239
- _inputs: any,
240
- params?: NodeParams
241
- ) => {
242
- context.counter = params?.increment || 1;
243
- context.message = params?.message || "Default";
244
- },
245
- });
246
-
247
- node = new GraphNode(
248
- nodes,
249
- logger,
250
- eventManager,
251
- eventSubject,
252
- stateSubject
253
- );
254
-
255
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
256
-
257
- const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
258
- expect(stateChanges).to.have.lengthOf(2);
259
- expect(stateChanges[0].payload.newValue).to.equal(1); // counter (default)
260
- expect(stateChanges[1].payload.newValue).to.equal("Default"); // message (default)
261
- });
262
-
263
224
  it("should properly handle node inputs", async () => {
264
225
  const nodes = new Map();
265
226
  nodes.set("test", {
266
227
  name: "test",
267
- execute: async (context: TestContext, inputs: any) => {
268
- context.counter = inputs.value;
269
- context.message = inputs.message;
228
+ execute: async (context: TestContext) => {
229
+ context.counter = 42;
230
+ context.message = "Test Input";
270
231
  },
271
232
  });
272
233
 
@@ -278,21 +239,12 @@ describe("GraphNode", () => {
278
239
  stateSubject
279
240
  );
280
241
 
281
- const testInputs = {
282
- value: 42,
283
- message: "Test Input",
284
- };
285
-
286
- await node.executeNode(
287
- "test",
288
- { counter: 0, message: "Hello" },
289
- testInputs
290
- );
242
+ await node.executeNode("test", { counter: 0, message: "Hello" }, false);
291
243
 
292
244
  const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
293
245
  expect(stateChanges).to.have.lengthOf(2);
294
- expect(stateChanges[0].payload.newValue).to.equal(42); // counter from input
295
- expect(stateChanges[1].payload.newValue).to.equal("Test Input"); // message from input
246
+ expect(stateChanges[0].payload.newValue).to.equal(42);
247
+ expect(stateChanges[1].payload.newValue).to.equal("Test Input");
296
248
  });
297
249
 
298
250
  it("should not emit duplicate state changes", async () => {
@@ -315,7 +267,7 @@ describe("GraphNode", () => {
315
267
  stateSubject
316
268
  );
317
269
 
318
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
270
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
319
271
 
320
272
  // Vérifier qu'il n'y a pas de doublons dans les événements
321
273
  const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
@@ -330,159 +282,14 @@ describe("GraphNode", () => {
330
282
  expect(stateChanges).to.have.lengthOf(2); // Un pour counter, un pour message
331
283
  });
332
284
 
333
- it("should validate node parameters with Zod schema", async () => {
334
- const paramSchema = z.object({
335
- increment: z.number().min(1),
336
- message: z.string().min(1),
337
- });
338
-
339
- const nodes = new Map();
340
- nodes.set("test", {
341
- name: "test",
342
- params: paramSchema,
343
- execute: async (context: TestContext, params?: NodeParams) => {
344
- context.counter += params?.increment || 0;
345
- context.message = params?.message || "";
346
- },
347
- });
348
-
349
- node = new GraphNode(
350
- nodes,
351
- logger,
352
- eventManager,
353
- eventSubject,
354
- stateSubject
355
- );
356
-
357
- // Test avec des paramètres valides
358
- await node.executeNode(
359
- "test",
360
- { counter: 0, message: "Hello" },
361
- { increment: 5, message: "Valid" }
362
- );
363
-
364
- // Test avec des paramètres invalides
365
- await expect(
366
- node.executeNode(
367
- "test",
368
- { counter: 0, message: "Hello" },
369
- { increment: 0, message: "" }
370
- )
371
- ).to.be.rejected; // Enlever le .with() car le message d'erreur vient directement de Zod
372
- });
373
-
374
- it("should work without params schema", async () => {
375
- const nodes = new Map();
376
- nodes.set("test", {
377
- name: "test",
378
- execute: async (context: TestContext) => {
379
- context.counter++;
380
- },
381
- });
382
-
383
- node = new GraphNode(
384
- nodes,
385
- logger,
386
- eventManager,
387
- eventSubject,
388
- stateSubject
389
- );
390
-
391
- // Devrait fonctionner sans erreur même sans schema de params
392
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
393
- });
394
-
395
- it("should not require params when node has no params schema", async () => {
285
+ it("should handle node execution without params", async () => {
396
286
  const nodes = new Map();
397
287
  nodes.set("test", {
398
288
  name: "test",
399
- // Pas de schéma de params défini
400
- execute: async (context: TestContext) => {
401
- context.counter++;
402
- },
403
- });
404
-
405
- node = new GraphNode(
406
- nodes,
407
- logger,
408
- eventManager,
409
- eventSubject,
410
- stateSubject
411
- );
412
-
413
- await node.executeNode("test", { counter: 0, message: "Hello" }, null);
414
-
415
- const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
416
- expect(stateChanges).to.have.lengthOf(1);
417
- expect(stateChanges[0].payload.newValue).to.equal(1);
418
- });
419
-
420
- it("should require params only when node has params schema", async () => {
421
- const nodes = new Map();
422
- nodes.set("test", {
423
- name: "test",
424
- params: z.object({
425
- // Avec un schéma de params
426
- value: z.number(),
427
- }),
428
- execute: async (context: TestContext, params?: NodeParams) => {
429
- context.counter = params?.value || 0;
430
- },
431
- });
432
-
433
- node = new GraphNode(
434
- nodes,
435
- logger,
436
- eventManager,
437
- eventSubject,
438
- stateSubject
439
- );
440
-
441
- // Devrait échouer sans params
442
- await expect(
443
- node.executeNode("test", { counter: 0, message: "Hello" }, null)
444
- ).to.be.rejectedWith("Params required for node");
445
- });
446
-
447
- it("should execute node without params when no schema is defined (real world scenario)", async () => {
448
- const nodes = new Map();
449
- nodes.set("incrementCounter", {
450
- name: "incrementCounter",
451
- execute: async (context: TestContext) => {
452
- context.counter++;
453
- },
454
- });
455
-
456
- node = new GraphNode(
457
- nodes,
458
- logger,
459
- eventManager,
460
- eventSubject,
461
- stateSubject
462
- );
463
-
464
- // Simuler l'appel comme dans examples/t2.ts
465
- await node.executeNode(
466
- "incrementCounter",
467
- { message: "Hello", counter: 0 },
468
- { test: "test" } // Passer des params même si non requis
469
- );
470
-
471
- const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
472
- expect(stateChanges).to.have.lengthOf(1);
473
- expect(stateChanges[0].payload.newValue).to.equal(1);
474
- });
475
-
476
- it("should handle optional params schema", async () => {
477
- const nodes = new Map();
478
- nodes.set("test", {
479
- name: "test",
480
- params: z
481
- .object({
482
- test: z.string(),
483
- })
484
- .optional(),
485
- execute: async (context: TestContext, params?: NodeParams) => {
289
+ execute: async (
290
+ context: TestContext,
291
+ tools?: { eventEmitter: IEventEmitter }
292
+ ) => {
486
293
  context.counter++;
487
294
  },
488
295
  });
@@ -495,13 +302,8 @@ describe("GraphNode", () => {
495
302
  stateSubject
496
303
  );
497
304
 
498
- // Devrait fonctionner avec ou sans params
499
- await node.executeNode(
500
- "test",
501
- { counter: 0, message: "Hello" },
502
- { test: "test" }
503
- );
504
- await node.executeNode("test", { counter: 1, message: "Hello" }, null);
305
+ await node.executeNode("test", { counter: 0, message: "Hello" }, undefined);
306
+ await node.executeNode("test", { counter: 1, message: "Hello" }, undefined);
505
307
 
506
308
  const stateChanges = events.filter((e) => e.type === "nodeStateChanged");
507
309
  expect(stateChanges).to.have.lengthOf(2);
@@ -534,7 +336,7 @@ describe("GraphNode", () => {
534
336
  const execution = node.executeNode(
535
337
  "waitForEventsNode",
536
338
  { counter: 0, message: "Hello" },
537
- null
339
+ undefined
538
340
  );
539
341
 
540
342
  // Simuler les événements après un court délai
@@ -572,7 +374,11 @@ describe("GraphNode", () => {
572
374
  stateSubject
573
375
  );
574
376
  await expect(
575
- node.executeNode("timeoutNode", { counter: 0, message: "Hello" }, null)
377
+ node.executeNode(
378
+ "timeoutNode",
379
+ { counter: 0, message: "Hello" },
380
+ undefined
381
+ )
576
382
  ).to.be.rejectedWith("Timeout waiting for events");
577
383
  });
578
384
 
@@ -597,11 +403,10 @@ describe("GraphNode", () => {
597
403
  eventSubject,
598
404
  stateSubject
599
405
  );
600
- const execution = node.executeNode(
601
- "partialEventsNode",
602
- { counter: 0, message: "Hello" },
603
- null
604
- );
406
+ const execution = node.executeNode("partialEventsNode", {
407
+ counter: 0,
408
+ message: "Hello",
409
+ });
605
410
 
606
411
  setTimeout(() => {
607
412
  eventEmitter.emit("event1", { data: "test1" });
@@ -648,7 +453,7 @@ describe("GraphNode", () => {
648
453
  node.executeNode(
649
454
  "correlatedEventsNode",
650
455
  { counter: 0, message: "Hello" },
651
- null
456
+ undefined
652
457
  );
653
458
 
654
459
  setTimeout(() => {
@@ -326,7 +326,7 @@ describe("GraphObserver", () => {
326
326
  (events) => events.every((e) => e.payload?.status === "success")
327
327
  );
328
328
 
329
- // Emit events immediately
329
+ // Émettre les événements immédiatement
330
330
  eventSubject.next({
331
331
  type: "eventA",
332
332
  payload: { status: "success" },
package/types/index.ts CHANGED
@@ -191,7 +191,6 @@ export interface GraphNodeConfig<T extends ZodSchema, P = any> {
191
191
  /** Execute function for the node */
192
192
  execute: (
193
193
  context: GraphContext<T>,
194
- params?: P,
195
194
  tools?: { eventEmitter: IEventEmitter }
196
195
  ) => Promise<void>;
197
196
  /** Optional condition for node execution */