@ai.ntellect/core 0.7.8 → 1.0.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.
Files changed (111) hide show
  1. package/README.md +158 -81
  2. package/index.ts +462 -22
  3. package/package copy.json +21 -0
  4. package/package.json +9 -44
  5. package/tsconfig.json +108 -22
  6. package/types.ts +62 -0
  7. package/utils/executor.ts +42 -0
  8. package/.mocharc.json +0 -5
  9. package/dist/graph/controller.d.ts +0 -31
  10. package/dist/graph/controller.d.ts.map +0 -1
  11. package/dist/graph/controller.js +0 -71
  12. package/dist/graph/controller.js.map +0 -1
  13. package/dist/graph/event-manager.d.ts +0 -93
  14. package/dist/graph/event-manager.d.ts.map +0 -1
  15. package/dist/graph/event-manager.js +0 -296
  16. package/dist/graph/event-manager.js.map +0 -1
  17. package/dist/graph/index.d.ts +0 -159
  18. package/dist/graph/index.d.ts.map +0 -1
  19. package/dist/graph/index.js +0 -303
  20. package/dist/graph/index.js.map +0 -1
  21. package/dist/graph/logger.d.ts +0 -46
  22. package/dist/graph/logger.d.ts.map +0 -1
  23. package/dist/graph/logger.js +0 -69
  24. package/dist/graph/logger.js.map +0 -1
  25. package/dist/graph/node.d.ts +0 -93
  26. package/dist/graph/node.d.ts.map +0 -1
  27. package/dist/graph/node.js +0 -259
  28. package/dist/graph/node.js.map +0 -1
  29. package/dist/graph/observer.d.ts +0 -115
  30. package/dist/graph/observer.d.ts.map +0 -1
  31. package/dist/graph/observer.js +0 -198
  32. package/dist/graph/observer.js.map +0 -1
  33. package/dist/index.d.ts +0 -26
  34. package/dist/index.d.ts.map +0 -1
  35. package/dist/index.js +0 -42
  36. package/dist/index.js.map +0 -1
  37. package/dist/interfaces/index.d.ts +0 -447
  38. package/dist/interfaces/index.d.ts.map +0 -1
  39. package/dist/interfaces/index.js +0 -75
  40. package/dist/interfaces/index.js.map +0 -1
  41. package/dist/modules/agenda/adapters/node-cron/index.d.ts +0 -17
  42. package/dist/modules/agenda/adapters/node-cron/index.d.ts.map +0 -1
  43. package/dist/modules/agenda/adapters/node-cron/index.js +0 -30
  44. package/dist/modules/agenda/adapters/node-cron/index.js.map +0 -1
  45. package/dist/modules/agenda/index.d.ts +0 -63
  46. package/dist/modules/agenda/index.d.ts.map +0 -1
  47. package/dist/modules/agenda/index.js +0 -141
  48. package/dist/modules/agenda/index.js.map +0 -1
  49. package/dist/modules/embedding/adapters/ai/index.d.ts +0 -29
  50. package/dist/modules/embedding/adapters/ai/index.d.ts.map +0 -1
  51. package/dist/modules/embedding/adapters/ai/index.js +0 -58
  52. package/dist/modules/embedding/adapters/ai/index.js.map +0 -1
  53. package/dist/modules/embedding/index.d.ts +0 -36
  54. package/dist/modules/embedding/index.d.ts.map +0 -1
  55. package/dist/modules/embedding/index.js +0 -60
  56. package/dist/modules/embedding/index.js.map +0 -1
  57. package/dist/modules/memory/adapters/in-memory/index.d.ts +0 -120
  58. package/dist/modules/memory/adapters/in-memory/index.d.ts.map +0 -1
  59. package/dist/modules/memory/adapters/in-memory/index.js +0 -211
  60. package/dist/modules/memory/adapters/in-memory/index.js.map +0 -1
  61. package/dist/modules/memory/adapters/meilisearch/index.d.ts +0 -110
  62. package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +0 -1
  63. package/dist/modules/memory/adapters/meilisearch/index.js +0 -321
  64. package/dist/modules/memory/adapters/meilisearch/index.js.map +0 -1
  65. package/dist/modules/memory/adapters/redis/index.d.ts +0 -82
  66. package/dist/modules/memory/adapters/redis/index.d.ts.map +0 -1
  67. package/dist/modules/memory/adapters/redis/index.js +0 -159
  68. package/dist/modules/memory/adapters/redis/index.js.map +0 -1
  69. package/dist/modules/memory/index.d.ts +0 -67
  70. package/dist/modules/memory/index.d.ts.map +0 -1
  71. package/dist/modules/memory/index.js +0 -104
  72. package/dist/modules/memory/index.js.map +0 -1
  73. package/dist/types/index.d.ts +0 -170
  74. package/dist/types/index.d.ts.map +0 -1
  75. package/dist/types/index.js +0 -3
  76. package/dist/types/index.js.map +0 -1
  77. package/dist/utils/generate-action-schema.d.ts +0 -5
  78. package/dist/utils/generate-action-schema.d.ts.map +0 -1
  79. package/dist/utils/generate-action-schema.js +0 -44
  80. package/dist/utils/generate-action-schema.js.map +0 -1
  81. package/dist/utils/header-builder.d.ts +0 -12
  82. package/dist/utils/header-builder.d.ts.map +0 -1
  83. package/dist/utils/header-builder.js +0 -35
  84. package/dist/utils/header-builder.js.map +0 -1
  85. package/graph/controller.ts +0 -74
  86. package/graph/event-manager.ts +0 -363
  87. package/graph/index.ts +0 -395
  88. package/graph/logger.ts +0 -70
  89. package/graph/node.ts +0 -327
  90. package/graph/observer.ts +0 -368
  91. package/interfaces/index.ts +0 -548
  92. package/modules/agenda/adapters/node-cron/index.ts +0 -25
  93. package/modules/agenda/index.ts +0 -146
  94. package/modules/embedding/adapters/ai/index.ts +0 -42
  95. package/modules/embedding/index.ts +0 -45
  96. package/modules/memory/adapters/in-memory/index.ts +0 -207
  97. package/modules/memory/adapters/meilisearch/index.ts +0 -361
  98. package/modules/memory/adapters/redis/index.ts +0 -164
  99. package/modules/memory/index.ts +0 -93
  100. package/test/graph/controller.test.ts +0 -187
  101. package/test/graph/event-manager.test.ts +0 -118
  102. package/test/graph/index.test.ts +0 -684
  103. package/test/graph/node.test.ts +0 -655
  104. package/test/graph/observer.test.ts +0 -398
  105. package/test/modules/agenda/node-cron.test.ts +0 -307
  106. package/test/modules/memory/adapters/in-memory.test.ts +0 -153
  107. package/test/modules/memory/adapters/meilisearch.test.ts +0 -287
  108. package/test/modules/memory/base.test.ts +0 -230
  109. package/types/index.ts +0 -190
  110. package/utils/generate-action-schema.ts +0 -46
  111. package/utils/header-builder.ts +0 -40
package/graph/index.ts DELETED
@@ -1,395 +0,0 @@
1
- import { EventEmitter } from "events";
2
- import { BehaviorSubject, Subject } from "rxjs";
3
- import { ZodSchema } from "zod";
4
- import { GraphObservable, IEventEmitter } from "../interfaces";
5
- import { GraphContext, GraphDefinition, GraphEvent, Node } from "../types";
6
- import { GraphEventManager } from "./event-manager";
7
- import { GraphLogger } from "./logger";
8
- import { GraphNode, NodeParams } from "./node";
9
- import { GraphObserver } from "./observer";
10
-
11
- /**
12
- * @module GraphFlow
13
- * @description A flexible workflow engine that manages the execution of nodes in a graph-like structure.
14
- *
15
- * Key features:
16
- * - Multiple branches support
17
- * - Conditional branching (runs first matching condition, or all if none have conditions)
18
- * - Event-driven nodes
19
- * - Zod validation of context/inputs/outputs
20
- * - Automatic retry on node failures
21
- *
22
- * @template T - Extends ZodSchema for type validation
23
- */
24
- export class GraphFlow<T extends ZodSchema> {
25
- private context: GraphContext<T>;
26
- public validator?: T;
27
- private eventEmitter: IEventEmitter;
28
- private globalErrorHandler?: (error: Error, context: GraphContext<T>) => void;
29
- private graphEvents?: string[];
30
- private entryNode?: string;
31
- private verbose: boolean = false;
32
- public nodes: Map<string, Node<T, any>>;
33
-
34
- private eventSubject: Subject<GraphEvent<T>> = new Subject();
35
- private stateSubject: BehaviorSubject<GraphContext<T>>;
36
- private destroySubject: Subject<void> = new Subject();
37
-
38
- public observer: GraphObserver<T>;
39
- private logger: GraphLogger;
40
- private eventManager: GraphEventManager<T>;
41
- private nodeExecutor: GraphNode<T>;
42
-
43
- /**
44
- * Creates a new instance of GraphFlow
45
- * @param {string} name - The name of the graph flow
46
- * @param {GraphDefinition<T>} config - Configuration object containing nodes, schema, context, and error handlers
47
- * @param {Object} options - Optional options for the graph flow
48
- */
49
- constructor(
50
- public name: string,
51
- config: GraphDefinition<T>,
52
- options: { verbose?: boolean } = {}
53
- ) {
54
- this.nodes = new Map(
55
- config.nodes.map((node: Node<T, any>) => [node.name, node])
56
- );
57
- this.validator = config.schema;
58
- this.context = config.schema.parse(config.context) as GraphContext<T>;
59
- this.globalErrorHandler = config.onError;
60
- this.eventEmitter =
61
- config.eventEmitter || (new EventEmitter() as IEventEmitter);
62
- this.graphEvents = config.events;
63
- this.verbose = options.verbose ?? false;
64
-
65
- this.stateSubject = new BehaviorSubject<GraphContext<T>>(this.context);
66
-
67
- this.logger = new GraphLogger(name, options.verbose);
68
- this.eventManager = new GraphEventManager(
69
- this.eventEmitter,
70
- this.nodes,
71
- name,
72
- this.context,
73
- config.events,
74
- config.entryNode,
75
- config.onError
76
- );
77
- this.nodeExecutor = new GraphNode(
78
- this.nodes as Map<string, Node<T, any>>,
79
- this.logger,
80
- this.eventManager,
81
- this.eventSubject,
82
- this.stateSubject
83
- );
84
-
85
- this.setupEventStreams();
86
- this.setupEventListeners();
87
- this.setupGraphEventListeners();
88
-
89
- this.observer = new GraphObserver(
90
- this,
91
- this.eventSubject,
92
- this.stateSubject,
93
- this.destroySubject
94
- );
95
- }
96
-
97
- /**
98
- * Sets up event listeners for node-based events
99
- * @private
100
- * @description Attaches all node-based event triggers while preserving external listeners
101
- */
102
- private setupEventStreams(): void {
103
- this.eventManager.on("nodeStarted", (data) => {
104
- this.addLog(`Event: Node "${data.name}" started`);
105
- });
106
-
107
- this.eventManager.on("nodeCompleted", (data) => {
108
- this.addLog(`Event: Node "${data.name}" completed`);
109
- });
110
-
111
- this.eventManager.on("nodeError", (data) => {
112
- let errorMessage = "Unknown error";
113
- if (data.error) {
114
- errorMessage =
115
- data.error instanceof Error
116
- ? data.error.message
117
- : data.error.errors?.[0]?.message ||
118
- data.error.message ||
119
- "Unknown error";
120
- }
121
- this.addLog(`Event: Node "${data.name}" error: ${errorMessage}`);
122
- });
123
-
124
- this.eventManager.on("nodeStateChanged", (data) => {
125
- this.addLog(`Event: Node "${data.name}" state changed`);
126
- });
127
- }
128
-
129
- /**
130
- * Sets up event listeners for node-based events
131
- * @private
132
- * @description Attaches all node-based event triggers while preserving external listeners
133
- */
134
- private setupEventListeners(): void {
135
- this.eventManager.setupEventListeners();
136
- }
137
-
138
- /**
139
- * Sets up event listeners for graph-based events
140
- * @private
141
- * @description Attaches all graph-based event triggers
142
- */
143
- private setupGraphEventListeners(): void {
144
- this.eventManager.setupGraphEventListeners();
145
- }
146
-
147
- /**
148
- * Executes a specific node in the graph
149
- * @private
150
- * @param {string} nodeName - Name of the node to execute
151
- * @param {GraphContext<T>} context - Current execution context
152
- * @param {any} inputs - Input parameters for the node
153
- * @param {boolean} triggeredByEvent - Whether the execution was triggered by an event
154
- * @returns {Promise<void>}
155
- */
156
- private async executeNode(
157
- nodeName: string,
158
- context: GraphContext<T>,
159
- inputs: any,
160
- triggeredByEvent: boolean = false
161
- ): Promise<void> {
162
- return this.nodeExecutor.executeNode(
163
- nodeName,
164
- context,
165
- inputs,
166
- triggeredByEvent
167
- );
168
- }
169
-
170
- private addLog(message: string): void {
171
- this.logger.addLog(message);
172
- }
173
-
174
- public getLogs(): string[] {
175
- return this.logger.getLogs();
176
- }
177
-
178
- public clearLogs(): void {
179
- this.logger.clearLogs();
180
- }
181
-
182
- /**
183
- * Get the observer instance for monitoring graph state and events
184
- */
185
- public observe(
186
- options: {
187
- debounce?: number;
188
- delay?: number;
189
- stream?: boolean;
190
- properties?: (string | number)[];
191
- onStreamLetter?: (data: { letter: string; property: string }) => void;
192
- onStreamComplete?: () => void;
193
- } = {}
194
- ): GraphObservable<T> {
195
- return this.observer.state(options) as GraphObservable<T>;
196
- }
197
-
198
- /**
199
- * Enable or disable verbose logging
200
- * @param {boolean} enabled - Whether to enable verbose logging
201
- */
202
- public setVerbose(enabled: boolean): void {
203
- this.logger.setVerbose(enabled);
204
- }
205
-
206
- /**
207
- * Get current verbose setting
208
- * @returns {boolean} Current verbose setting
209
- */
210
- public isVerbose(): boolean {
211
- return this.logger.isVerbose();
212
- }
213
-
214
- /**
215
- * Executes the graph flow starting from a specific node
216
- * @param {string} startNode - Name of the node to start execution from
217
- * @param {any} inputs - Optional input parameters for the start node
218
- * @param {Partial<GraphContext<T>>} context - Optional context to merge
219
- * @param {NodeParams} params - Optional node parameters
220
- * @returns {Promise<GraphContext<T>>} Final context after execution
221
- */
222
- public async execute(
223
- startNode: string,
224
- params?: NodeParams,
225
- context?: Partial<GraphContext<T>>
226
- ): Promise<GraphContext<T>> {
227
- if (context) {
228
- Object.assign(this.context, context);
229
- }
230
-
231
- this.eventEmitter.emit("graphStarted", { name: this.name });
232
-
233
- try {
234
- const node = this.nodes.get(startNode);
235
- if (!node) throw new Error(`Node "${startNode}" not found`);
236
-
237
- if (node.params && !params) {
238
- throw new Error(`Params required for node "${startNode}"`);
239
- }
240
-
241
- await this.nodeExecutor.executeNode(
242
- startNode,
243
- this.context,
244
- params,
245
- false
246
- );
247
-
248
- this.eventEmitter.emit("graphCompleted", {
249
- name: this.name,
250
- context: this.context,
251
- });
252
-
253
- return this.getContext();
254
- } catch (error) {
255
- this.eventEmitter.emit("graphError", { name: this.name, error });
256
- this.globalErrorHandler?.(error as Error, this.context);
257
- throw error;
258
- }
259
- }
260
-
261
- /**
262
- * Emits an event to trigger event-based nodes
263
- * @param {string} eventName - Name of the event to emit
264
- * @param {Partial<GraphContext<T>>} data - Optional data to merge with context
265
- * @returns {Promise<void>}
266
- */
267
- public async emit(
268
- eventName: string,
269
- data?: Partial<GraphContext<T>>
270
- ): Promise<void> {
271
- const event: GraphEvent<T> = {
272
- type: eventName,
273
- payload: data,
274
- timestamp: Date.now(),
275
- };
276
- this.eventSubject.next(event);
277
- await new Promise((resolve) => setTimeout(resolve, 0));
278
- }
279
-
280
- /**
281
- * Registers an event handler
282
- * @param {string} eventName - Name of the event to listen for
283
- * @param {Function} handler - Handler function to execute when event is emitted
284
- */
285
- public on(eventName: string, handler: (...args: any[]) => void): void {
286
- this.eventManager.on(eventName, handler);
287
- }
288
-
289
- /**
290
- * Updates the graph definition with new configuration
291
- * @param {GraphDefinition<T>} definition - New graph definition
292
- */
293
- public load(definition: GraphDefinition<T>): void {
294
- // Clear all existing nodes
295
- this.nodes.clear();
296
- // Wipe out old node-based event listeners
297
- // (We keep external test listeners like "nodeStarted" or "nodeCompleted".)
298
- if (definition.nodes?.length) {
299
- const allEvents = new Set<string>();
300
- definition.nodes.forEach((n) =>
301
- n.events?.forEach((evt) => allEvents.add(evt))
302
- );
303
- for (const evt of allEvents) {
304
- this.eventEmitter.removeAllListeners(evt);
305
- }
306
- }
307
-
308
- // Add in new nodes
309
- definition.nodes.forEach((node) => this.nodes.set(node.name, node));
310
-
311
- // Parse the new context
312
- this.context = definition.schema.parse(
313
- definition.context
314
- ) as GraphContext<T>;
315
- this.validator = definition.schema;
316
-
317
- // Store entry node
318
- this.entryNode = definition.entryNode;
319
- // Store graph events
320
- this.graphEvents = definition.events;
321
-
322
- // Re-setup only node-based event triggers
323
- for (const node of this.nodes.values()) {
324
- if (node.events && node.events.length > 0) {
325
- node.events.forEach((event) => {
326
- this.eventEmitter.on(
327
- event,
328
- async (data?: Partial<GraphContext<T>>) => {
329
- const freshContext = structuredClone(this.context);
330
- if (data) Object.assign(freshContext, data);
331
- await this.executeNode(node.name, freshContext, undefined, true);
332
- }
333
- );
334
- });
335
- }
336
- }
337
-
338
- // Re-setup graph event listeners
339
- this.setupGraphEventListeners();
340
- }
341
-
342
- /**
343
- * Gets a copy of the current context
344
- * @returns {GraphContext<T>} A deep copy of the current context
345
- */
346
- public getContext(): GraphContext<T> {
347
- return structuredClone(this.context);
348
- }
349
-
350
- /**
351
- * Logs a message with optional data
352
- * @param {string} message - Message to log
353
- * @param {any} data - Optional data to log
354
- */
355
- public log(message: string, data?: any): void {
356
- this.logger.log(message, data);
357
- }
358
-
359
- /**
360
- * Adds a new node to the graph
361
- * @param {Node<T>} node - Node to add
362
- * @throws {Error} If node with same name already exists
363
- */
364
- public addNode(node: Node<T, any>): void {
365
- this.nodes.set(node.name, node);
366
- this.eventManager.setupEventListeners();
367
- }
368
-
369
- /**
370
- * Removes a node from the graph
371
- * @param {string} nodeName - Name of the node to remove
372
- */
373
- public removeNode(nodeName: string): void {
374
- this.nodes.delete(nodeName);
375
- this.eventManager.setupEventListeners();
376
- }
377
-
378
- /**
379
- * Returns all nodes in the graph
380
- * @returns {Node<T>[]} Array of all nodes
381
- */
382
- public getNodes(): Node<T, any>[] {
383
- return Array.from(this.nodes.values());
384
- }
385
-
386
- /**
387
- * Cleanup resources
388
- */
389
- public destroy(): void {
390
- this.destroySubject.next();
391
- this.destroySubject.complete();
392
- this.eventSubject.complete();
393
- this.stateSubject.complete();
394
- }
395
- }
package/graph/logger.ts DELETED
@@ -1,70 +0,0 @@
1
- /**
2
- * Handles logging operations for a graph instance
3
- * Provides methods for adding, retrieving, and managing logs with optional verbose output
4
- */
5
- export class GraphLogger {
6
- private logs: string[] = [];
7
- private verbose: boolean = false;
8
-
9
- /**
10
- * Creates a new GraphLogger instance
11
- * @param graphName - The name of the graph this logger is associated with
12
- * @param verbose - Whether to output logs to console in real-time
13
- */
14
- constructor(private graphName: string, verbose: boolean = false) {
15
- this.verbose = verbose;
16
- }
17
-
18
- /**
19
- * Adds a new log entry with timestamp
20
- * @param message - The message to log
21
- */
22
- public addLog(message: string): void {
23
- const timestamp = new Date().toISOString();
24
- const logMessage = `[${timestamp}] ${message}`;
25
- this.logs.push(logMessage);
26
- if (this.verbose) {
27
- console.log(`${this.graphName} - ${message}`);
28
- }
29
- }
30
-
31
- /**
32
- * Returns a copy of all stored logs
33
- * @returns Array of log messages
34
- */
35
- public getLogs(): string[] {
36
- return [...this.logs];
37
- }
38
-
39
- /**
40
- * Clears all stored logs
41
- */
42
- public clearLogs(): void {
43
- this.logs = [];
44
- }
45
-
46
- /**
47
- * Sets the verbose mode
48
- * @param enabled - Whether to enable verbose mode
49
- */
50
- public setVerbose(enabled: boolean): void {
51
- this.verbose = enabled;
52
- }
53
-
54
- /**
55
- * Gets the current verbose mode status
56
- * @returns Current verbose mode state
57
- */
58
- public isVerbose(): boolean {
59
- return this.verbose;
60
- }
61
-
62
- /**
63
- * Logs a message to console with graph name prefix
64
- * @param message - The message to log
65
- * @param data - Optional data to log
66
- */
67
- log(message: string, data?: any): void {
68
- console.log(`[Graph ${this.graphName}] ${message}`, data);
69
- }
70
- }