@ai.ntellect/core 0.7.7 → 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 -92
  14. package/dist/graph/event-manager.d.ts.map +0 -1
  15. package/dist/graph/event-manager.js +0 -244
  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 -92
  26. package/dist/graph/node.d.ts.map +0 -1
  27. package/dist/graph/node.js +0 -249
  28. package/dist/graph/node.js.map +0 -1
  29. package/dist/graph/observer.d.ts +0 -113
  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 -166
  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 -295
  87. package/graph/index.ts +0 -397
  88. package/graph/logger.ts +0 -70
  89. package/graph/node.ts +0 -305
  90. package/graph/observer.ts +0 -368
  91. package/interfaces/index.ts +0 -545
  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 -72
  102. package/test/graph/index.test.ts +0 -768
  103. package/test/graph/node.test.ts +0 -510
  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 -184
  110. package/utils/generate-action-schema.ts +0 -46
  111. package/utils/header-builder.ts +0 -40
package/graph/index.ts DELETED
@@ -1,397 +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?: (keyof GraphContext<T> extends string
191
- ? keyof GraphContext<T>
192
- : never)[];
193
- onStreamLetter?: (data: { letter: string; property: string }) => void;
194
- onStreamComplete?: () => void;
195
- } = {}
196
- ): GraphObservable<T> {
197
- return this.observer.state(options) as GraphObservable<T>;
198
- }
199
-
200
- /**
201
- * Enable or disable verbose logging
202
- * @param {boolean} enabled - Whether to enable verbose logging
203
- */
204
- public setVerbose(enabled: boolean): void {
205
- this.logger.setVerbose(enabled);
206
- }
207
-
208
- /**
209
- * Get current verbose setting
210
- * @returns {boolean} Current verbose setting
211
- */
212
- public isVerbose(): boolean {
213
- return this.logger.isVerbose();
214
- }
215
-
216
- /**
217
- * Executes the graph flow starting from a specific node
218
- * @param {string} startNode - Name of the node to start execution from
219
- * @param {any} inputs - Optional input parameters for the start node
220
- * @param {Partial<GraphContext<T>>} context - Optional context to merge
221
- * @param {NodeParams} params - Optional node parameters
222
- * @returns {Promise<GraphContext<T>>} Final context after execution
223
- */
224
- public async execute(
225
- startNode: string,
226
- params?: NodeParams,
227
- context?: Partial<GraphContext<T>>
228
- ): Promise<GraphContext<T>> {
229
- if (context) {
230
- Object.assign(this.context, context);
231
- }
232
-
233
- this.eventEmitter.emit("graphStarted", { name: this.name });
234
-
235
- try {
236
- const node = this.nodes.get(startNode);
237
- if (!node) throw new Error(`Node "${startNode}" not found`);
238
-
239
- if (node.params && !params) {
240
- throw new Error(`Params required for node "${startNode}"`);
241
- }
242
-
243
- await this.nodeExecutor.executeNode(
244
- startNode,
245
- this.context,
246
- params,
247
- false
248
- );
249
-
250
- this.eventEmitter.emit("graphCompleted", {
251
- name: this.name,
252
- context: this.context,
253
- });
254
-
255
- return this.getContext();
256
- } catch (error) {
257
- this.eventEmitter.emit("graphError", { name: this.name, error });
258
- this.globalErrorHandler?.(error as Error, this.context);
259
- throw error;
260
- }
261
- }
262
-
263
- /**
264
- * Emits an event to trigger event-based nodes
265
- * @param {string} eventName - Name of the event to emit
266
- * @param {Partial<GraphContext<T>>} data - Optional data to merge with context
267
- * @returns {Promise<void>}
268
- */
269
- public async emit(
270
- eventName: string,
271
- data?: Partial<GraphContext<T>>
272
- ): Promise<void> {
273
- const event: GraphEvent<T> = {
274
- type: eventName,
275
- payload: data,
276
- timestamp: Date.now(),
277
- };
278
- this.eventSubject.next(event);
279
- await new Promise((resolve) => setTimeout(resolve, 0));
280
- }
281
-
282
- /**
283
- * Registers an event handler
284
- * @param {string} eventName - Name of the event to listen for
285
- * @param {Function} handler - Handler function to execute when event is emitted
286
- */
287
- public on(eventName: string, handler: (...args: any[]) => void): void {
288
- this.eventManager.on(eventName, handler);
289
- }
290
-
291
- /**
292
- * Updates the graph definition with new configuration
293
- * @param {GraphDefinition<T>} definition - New graph definition
294
- */
295
- public load(definition: GraphDefinition<T>): void {
296
- // Clear all existing nodes
297
- this.nodes.clear();
298
- // Wipe out old node-based event listeners
299
- // (We keep external test listeners like "nodeStarted" or "nodeCompleted".)
300
- if (definition.nodes?.length) {
301
- const allEvents = new Set<string>();
302
- definition.nodes.forEach((n) =>
303
- n.events?.forEach((evt) => allEvents.add(evt))
304
- );
305
- for (const evt of allEvents) {
306
- this.eventEmitter.removeAllListeners(evt);
307
- }
308
- }
309
-
310
- // Add in new nodes
311
- definition.nodes.forEach((node) => this.nodes.set(node.name, node));
312
-
313
- // Parse the new context
314
- this.context = definition.schema.parse(
315
- definition.context
316
- ) as GraphContext<T>;
317
- this.validator = definition.schema;
318
-
319
- // Store entry node
320
- this.entryNode = definition.entryNode;
321
- // Store graph events
322
- this.graphEvents = definition.events;
323
-
324
- // Re-setup only node-based event triggers
325
- for (const node of this.nodes.values()) {
326
- if (node.events && node.events.length > 0) {
327
- node.events.forEach((event) => {
328
- this.eventEmitter.on(
329
- event,
330
- async (data?: Partial<GraphContext<T>>) => {
331
- const freshContext = structuredClone(this.context);
332
- if (data) Object.assign(freshContext, data);
333
- await this.executeNode(node.name, freshContext, undefined, true);
334
- }
335
- );
336
- });
337
- }
338
- }
339
-
340
- // Re-setup graph event listeners
341
- this.setupGraphEventListeners();
342
- }
343
-
344
- /**
345
- * Gets a copy of the current context
346
- * @returns {GraphContext<T>} A deep copy of the current context
347
- */
348
- public getContext(): GraphContext<T> {
349
- return structuredClone(this.context);
350
- }
351
-
352
- /**
353
- * Logs a message with optional data
354
- * @param {string} message - Message to log
355
- * @param {any} data - Optional data to log
356
- */
357
- public log(message: string, data?: any): void {
358
- this.logger.log(message, data);
359
- }
360
-
361
- /**
362
- * Adds a new node to the graph
363
- * @param {Node<T>} node - Node to add
364
- * @throws {Error} If node with same name already exists
365
- */
366
- public addNode(node: Node<T, any>): void {
367
- this.nodes.set(node.name, node);
368
- this.eventManager.setupEventListeners();
369
- }
370
-
371
- /**
372
- * Removes a node from the graph
373
- * @param {string} nodeName - Name of the node to remove
374
- */
375
- public removeNode(nodeName: string): void {
376
- this.nodes.delete(nodeName);
377
- this.eventManager.setupEventListeners();
378
- }
379
-
380
- /**
381
- * Returns all nodes in the graph
382
- * @returns {Node<T>[]} Array of all nodes
383
- */
384
- public getNodes(): Node<T, any>[] {
385
- return Array.from(this.nodes.values());
386
- }
387
-
388
- /**
389
- * Cleanup resources
390
- */
391
- public destroy(): void {
392
- this.destroySubject.next();
393
- this.destroySubject.complete();
394
- this.eventSubject.complete();
395
- this.stateSubject.complete();
396
- }
397
- }
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
- }