@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.
- package/README.md +158 -81
- package/index.ts +462 -22
- package/package copy.json +21 -0
- package/package.json +9 -44
- package/tsconfig.json +108 -22
- package/types.ts +62 -0
- package/utils/executor.ts +42 -0
- package/.mocharc.json +0 -5
- package/dist/graph/controller.d.ts +0 -31
- package/dist/graph/controller.d.ts.map +0 -1
- package/dist/graph/controller.js +0 -71
- package/dist/graph/controller.js.map +0 -1
- package/dist/graph/event-manager.d.ts +0 -92
- package/dist/graph/event-manager.d.ts.map +0 -1
- package/dist/graph/event-manager.js +0 -244
- package/dist/graph/event-manager.js.map +0 -1
- package/dist/graph/index.d.ts +0 -159
- package/dist/graph/index.d.ts.map +0 -1
- package/dist/graph/index.js +0 -303
- package/dist/graph/index.js.map +0 -1
- package/dist/graph/logger.d.ts +0 -46
- package/dist/graph/logger.d.ts.map +0 -1
- package/dist/graph/logger.js +0 -69
- package/dist/graph/logger.js.map +0 -1
- package/dist/graph/node.d.ts +0 -92
- package/dist/graph/node.d.ts.map +0 -1
- package/dist/graph/node.js +0 -249
- package/dist/graph/node.js.map +0 -1
- package/dist/graph/observer.d.ts +0 -113
- package/dist/graph/observer.d.ts.map +0 -1
- package/dist/graph/observer.js +0 -198
- package/dist/graph/observer.js.map +0 -1
- package/dist/index.d.ts +0 -26
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -42
- package/dist/index.js.map +0 -1
- package/dist/interfaces/index.d.ts +0 -447
- package/dist/interfaces/index.d.ts.map +0 -1
- package/dist/interfaces/index.js +0 -75
- package/dist/interfaces/index.js.map +0 -1
- package/dist/modules/agenda/adapters/node-cron/index.d.ts +0 -17
- package/dist/modules/agenda/adapters/node-cron/index.d.ts.map +0 -1
- package/dist/modules/agenda/adapters/node-cron/index.js +0 -30
- package/dist/modules/agenda/adapters/node-cron/index.js.map +0 -1
- package/dist/modules/agenda/index.d.ts +0 -63
- package/dist/modules/agenda/index.d.ts.map +0 -1
- package/dist/modules/agenda/index.js +0 -141
- package/dist/modules/agenda/index.js.map +0 -1
- package/dist/modules/embedding/adapters/ai/index.d.ts +0 -29
- package/dist/modules/embedding/adapters/ai/index.d.ts.map +0 -1
- package/dist/modules/embedding/adapters/ai/index.js +0 -58
- package/dist/modules/embedding/adapters/ai/index.js.map +0 -1
- package/dist/modules/embedding/index.d.ts +0 -36
- package/dist/modules/embedding/index.d.ts.map +0 -1
- package/dist/modules/embedding/index.js +0 -60
- package/dist/modules/embedding/index.js.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.d.ts +0 -120
- package/dist/modules/memory/adapters/in-memory/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.js +0 -211
- package/dist/modules/memory/adapters/in-memory/index.js.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.d.ts +0 -110
- package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.js +0 -321
- package/dist/modules/memory/adapters/meilisearch/index.js.map +0 -1
- package/dist/modules/memory/adapters/redis/index.d.ts +0 -82
- package/dist/modules/memory/adapters/redis/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/redis/index.js +0 -159
- package/dist/modules/memory/adapters/redis/index.js.map +0 -1
- package/dist/modules/memory/index.d.ts +0 -67
- package/dist/modules/memory/index.d.ts.map +0 -1
- package/dist/modules/memory/index.js +0 -104
- package/dist/modules/memory/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -166
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/utils/generate-action-schema.d.ts +0 -5
- package/dist/utils/generate-action-schema.d.ts.map +0 -1
- package/dist/utils/generate-action-schema.js +0 -44
- package/dist/utils/generate-action-schema.js.map +0 -1
- package/dist/utils/header-builder.d.ts +0 -12
- package/dist/utils/header-builder.d.ts.map +0 -1
- package/dist/utils/header-builder.js +0 -35
- package/dist/utils/header-builder.js.map +0 -1
- package/graph/controller.ts +0 -74
- package/graph/event-manager.ts +0 -295
- package/graph/index.ts +0 -397
- package/graph/logger.ts +0 -70
- package/graph/node.ts +0 -305
- package/graph/observer.ts +0 -368
- package/interfaces/index.ts +0 -545
- package/modules/agenda/adapters/node-cron/index.ts +0 -25
- package/modules/agenda/index.ts +0 -146
- package/modules/embedding/adapters/ai/index.ts +0 -42
- package/modules/embedding/index.ts +0 -45
- package/modules/memory/adapters/in-memory/index.ts +0 -207
- package/modules/memory/adapters/meilisearch/index.ts +0 -361
- package/modules/memory/adapters/redis/index.ts +0 -164
- package/modules/memory/index.ts +0 -93
- package/test/graph/controller.test.ts +0 -187
- package/test/graph/event-manager.test.ts +0 -72
- package/test/graph/index.test.ts +0 -768
- package/test/graph/node.test.ts +0 -510
- package/test/graph/observer.test.ts +0 -398
- package/test/modules/agenda/node-cron.test.ts +0 -307
- package/test/modules/memory/adapters/in-memory.test.ts +0 -153
- package/test/modules/memory/adapters/meilisearch.test.ts +0 -287
- package/test/modules/memory/base.test.ts +0 -230
- package/types/index.ts +0 -184
- package/utils/generate-action-schema.ts +0 -46
- package/utils/header-builder.ts +0 -40
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"generate-action-schema.js","sourceRoot":"","sources":["../../utils/generate-action-schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAGjB,MAAM,oBAAoB,GAAG,CAAC,MAAwB,EAAE,EAAE;IAC/D,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM;YAC/B,CAAC,CAAC,IAAA,uBAAe,EAAC,QAAQ,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,eAAe,CAAC;QACpB,OAAO,aAAa,KAAK,CAAC,IAAI,iBAAiB,SAAS,EAAE,CAAC;IAC7D,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC,CAAC;AAVW,QAAA,oBAAoB,wBAU/B;AAEK,MAAM,eAAe,GAAG,CAAC,MAAiB,EAAU,EAAE;IAC3D,IAAI,MAAM,YAAY,OAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAI,KAAa,CAAC,IAAI,CAAC,WAAW,CAAC;YACpD,MAAM,SAAS,GAAG,IAAA,uBAAe,EAAC,KAAkB,CAAC,CAAC;YACtD,OAAO,WAAW;gBAChB,CAAC,CAAC,GAAG,GAAG,KAAK,SAAS,OAAO,WAAW,EAAE;gBAC1C,CAAC,CAAC,GAAG,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,YAAY,OAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,WAAW,IAAA,uBAAe,EAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,YAAY,OAAC,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,YAAY,OAAC,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,YAAY,OAAC,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AA9BW,QAAA,eAAe,mBA8B1B"}
|
@@ -1,12 +0,0 @@
|
|
1
|
-
type HeaderValue = string | string[] | undefined;
|
2
|
-
export declare class LLMHeaderBuilder {
|
3
|
-
private headers;
|
4
|
-
private _result;
|
5
|
-
constructor();
|
6
|
-
addHeader(key: string, value: HeaderValue): LLMHeaderBuilder;
|
7
|
-
valueOf(): string;
|
8
|
-
toString(): string;
|
9
|
-
static create(): LLMHeaderBuilder;
|
10
|
-
}
|
11
|
-
export {};
|
12
|
-
//# sourceMappingURL=header-builder.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"header-builder.d.ts","sourceRoot":"","sources":["../../utils/header-builder.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAEjD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAS;;IAOxB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,gBAAgB;IAiB5D,OAAO,IAAI,MAAM;IAIjB,QAAQ,IAAI,MAAM;IAIlB,MAAM,CAAC,MAAM,IAAI,gBAAgB;CAGlC"}
|
@@ -1,35 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.LLMHeaderBuilder = void 0;
|
4
|
-
class LLMHeaderBuilder {
|
5
|
-
constructor() {
|
6
|
-
this.headers = new Map();
|
7
|
-
this._result = "";
|
8
|
-
}
|
9
|
-
addHeader(key, value) {
|
10
|
-
if (Array.isArray(value)) {
|
11
|
-
this.headers.set(key, value.join("\n"));
|
12
|
-
}
|
13
|
-
else {
|
14
|
-
this.headers.set(key, value);
|
15
|
-
}
|
16
|
-
// Build result immediately
|
17
|
-
this._result = Array.from(this.headers.entries())
|
18
|
-
.filter(([_, value]) => value !== undefined)
|
19
|
-
.map(([key, value]) => `# ${key}: ${value}`)
|
20
|
-
.join("\n")
|
21
|
-
.trim();
|
22
|
-
return this;
|
23
|
-
}
|
24
|
-
valueOf() {
|
25
|
-
return this._result;
|
26
|
-
}
|
27
|
-
toString() {
|
28
|
-
return this._result;
|
29
|
-
}
|
30
|
-
static create() {
|
31
|
-
return new LLMHeaderBuilder();
|
32
|
-
}
|
33
|
-
}
|
34
|
-
exports.LLMHeaderBuilder = LLMHeaderBuilder;
|
35
|
-
//# sourceMappingURL=header-builder.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"header-builder.js","sourceRoot":"","sources":["../../utils/header-builder.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAI3B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,KAAkB;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC;aAC3C,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChC,CAAC;CACF;AArCD,4CAqCC"}
|
package/graph/controller.ts
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
import { ZodSchema } from "zod";
|
2
|
-
import { GraphContext } from "../types";
|
3
|
-
import { GraphFlow } from "./index";
|
4
|
-
import { NodeParams } from "./node";
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Controller class for managing the execution of graph flows
|
8
|
-
* Handles both sequential and parallel execution of multiple graphs
|
9
|
-
*/
|
10
|
-
export class GraphController {
|
11
|
-
/**
|
12
|
-
* Executes multiple graphs sequentially
|
13
|
-
* @param graphs - Array of GraphFlow instances to execute
|
14
|
-
* @param startNodes - Array of starting node identifiers for each graph
|
15
|
-
* @param params - Optional array of node parameters for each graph
|
16
|
-
* @returns Map containing results of each graph execution, keyed by graph name and index
|
17
|
-
* @template T - Zod schema type for graph context validation
|
18
|
-
*/
|
19
|
-
static async executeSequential<T extends ZodSchema>(
|
20
|
-
graphs: GraphFlow<T>[],
|
21
|
-
startNodes: string[],
|
22
|
-
params?: NodeParams[]
|
23
|
-
): Promise<any[]> {
|
24
|
-
const results = new Map<string, GraphContext<T>>();
|
25
|
-
for (let i = 0; i < graphs.length; i++) {
|
26
|
-
const result = await graphs[i].execute(startNodes[i], params?.[i]);
|
27
|
-
results.set(`${graphs[i].name}-${i}`, result);
|
28
|
-
}
|
29
|
-
return Array.from(results.values());
|
30
|
-
}
|
31
|
-
|
32
|
-
private static async executeGraph<T extends ZodSchema>(
|
33
|
-
graph: GraphFlow<T>,
|
34
|
-
startNode: string,
|
35
|
-
params?: NodeParams
|
36
|
-
): Promise<GraphContext<T>> {
|
37
|
-
try {
|
38
|
-
return await graph.execute(startNode, params);
|
39
|
-
} catch (error) {
|
40
|
-
throw error;
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
/**
|
45
|
-
* Executes multiple graphs in parallel with optional concurrency control
|
46
|
-
* @param graphs - Array of GraphFlow instances to execute
|
47
|
-
* @param startNodes - Array of starting node identifiers for each graph
|
48
|
-
* @param concurrency - Optional limit on number of concurrent graph executions
|
49
|
-
* @param params - Optional array of node parameters for each graph
|
50
|
-
* @returns Map containing results of each graph execution, keyed by graph name
|
51
|
-
* @template T - Zod schema type for graph context validation
|
52
|
-
*/
|
53
|
-
static async executeParallel<T extends ZodSchema>(
|
54
|
-
graphs: GraphFlow<T>[],
|
55
|
-
startNodes: string[],
|
56
|
-
concurrency: number,
|
57
|
-
params?: NodeParams[]
|
58
|
-
): Promise<GraphContext<T>[]> {
|
59
|
-
const results: GraphContext<T>[] = [];
|
60
|
-
|
61
|
-
for (let i = 0; i < graphs.length; i += concurrency) {
|
62
|
-
const batch = graphs.slice(i, i + concurrency);
|
63
|
-
const batchResults = await Promise.all(
|
64
|
-
batch.map((graph, idx) => {
|
65
|
-
const param = params?.[i + idx];
|
66
|
-
return this.executeGraph(graph, startNodes[i + idx], param);
|
67
|
-
})
|
68
|
-
);
|
69
|
-
results.push(...batchResults);
|
70
|
-
}
|
71
|
-
|
72
|
-
return results;
|
73
|
-
}
|
74
|
-
}
|
package/graph/event-manager.ts
DELETED
@@ -1,295 +0,0 @@
|
|
1
|
-
import { Observable, Subject, filter } from "rxjs";
|
2
|
-
import { ZodSchema } from "zod";
|
3
|
-
import { IEventEmitter } from "../interfaces";
|
4
|
-
import { GraphContext, GraphEvent, Node } from "../types";
|
5
|
-
import { GraphNode } from "./node";
|
6
|
-
|
7
|
-
/**
|
8
|
-
* Manages event handling and routing for a graph
|
9
|
-
* Coordinates event emission, listening, and execution of event-driven nodes
|
10
|
-
* @template T - The Zod schema type for validation
|
11
|
-
*/
|
12
|
-
export class GraphEventManager<T extends ZodSchema> {
|
13
|
-
private eventSubject: Subject<GraphEvent<T>> = new Subject();
|
14
|
-
private nodeStreams: Map<string, Observable<GraphEvent<T>>> = new Map();
|
15
|
-
private context: GraphContext<T>;
|
16
|
-
private name: string;
|
17
|
-
private graphEvents?: string[];
|
18
|
-
private entryNode?: string;
|
19
|
-
private globalErrorHandler?: (error: Error, context: GraphContext<T>) => void;
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Creates a new GraphEventManager instance
|
23
|
-
* @param eventEmitter - The event emitter implementation to use
|
24
|
-
* @param nodes - Map of all nodes in the graph
|
25
|
-
* @param name - Name of the graph
|
26
|
-
* @param context - Initial graph context
|
27
|
-
* @param graphEvents - List of events the graph should listen to
|
28
|
-
* @param entryNode - Name of the entry node for graph events
|
29
|
-
* @param globalErrorHandler - Global error handling function
|
30
|
-
* @param nodeExecutor - GraphNode instance for executing nodes
|
31
|
-
*/
|
32
|
-
constructor(
|
33
|
-
private eventEmitter: IEventEmitter,
|
34
|
-
private nodes: Map<string, Node<T, any>>,
|
35
|
-
name: string,
|
36
|
-
context: GraphContext<T>,
|
37
|
-
graphEvents?: string[],
|
38
|
-
entryNode?: string,
|
39
|
-
globalErrorHandler?: (error: Error, context: GraphContext<T>) => void,
|
40
|
-
private nodeExecutor?: GraphNode<T>
|
41
|
-
) {
|
42
|
-
this.name = name;
|
43
|
-
this.context = context;
|
44
|
-
this.graphEvents = graphEvents;
|
45
|
-
this.entryNode = entryNode;
|
46
|
-
this.globalErrorHandler = globalErrorHandler;
|
47
|
-
this.setupEventStreams();
|
48
|
-
}
|
49
|
-
|
50
|
-
/**
|
51
|
-
* Sets up event streams for all nodes that listen to events
|
52
|
-
*/
|
53
|
-
public setupEventStreams(): void {
|
54
|
-
for (const [nodeName, node] of this.nodes.entries()) {
|
55
|
-
if (node.events && node.events.length > 0) {
|
56
|
-
const nodeStream = this.eventSubject.pipe(
|
57
|
-
filter((event) => node.events!.includes(event.type))
|
58
|
-
);
|
59
|
-
this.nodeStreams.set(nodeName, nodeStream);
|
60
|
-
}
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
/**
|
65
|
-
* Emits an event with optional payload and context
|
66
|
-
* @param type - The type of event to emit
|
67
|
-
* @param payload - Optional payload data
|
68
|
-
* @param context - Optional graph context
|
69
|
-
*/
|
70
|
-
public emitEvent<P = any>(
|
71
|
-
type: string,
|
72
|
-
payload?: P,
|
73
|
-
context?: GraphContext<T>
|
74
|
-
): void {
|
75
|
-
// Éviter la double imbrication des événements
|
76
|
-
const event = {
|
77
|
-
type,
|
78
|
-
payload,
|
79
|
-
timestamp: Date.now(),
|
80
|
-
};
|
81
|
-
|
82
|
-
// Émettre l'événement une seule fois
|
83
|
-
this.eventSubject.next(event);
|
84
|
-
this.eventEmitter.emit(type, payload);
|
85
|
-
}
|
86
|
-
|
87
|
-
/**
|
88
|
-
* Sets up event listeners for all nodes in the graph
|
89
|
-
* Handles cleanup and re-registration of event listeners
|
90
|
-
*/
|
91
|
-
setupEventListeners(): void {
|
92
|
-
// First remove only the existing node-based listeners that we might have created previously
|
93
|
-
// We do NOT remove, for example, "nodeStarted" or "nodeCompleted" listeners that test code added.
|
94
|
-
for (const [eventName, listener] of this.eventEmitter
|
95
|
-
.rawListeners("*")
|
96
|
-
.entries()) {
|
97
|
-
// This can be tricky—EventEmitter doesn't directly let you remove by "type" of listener.
|
98
|
-
// Alternatively, we can store references in a separate structure.
|
99
|
-
// For simplicity, let's do a full removeAllListeners() on node-specified events (only),
|
100
|
-
// then re-add them below, but keep the test-based events like "nodeStarted" or "nodeCompleted".
|
101
|
-
}
|
102
|
-
|
103
|
-
// The simplest approach: removeAllListeners for each event that is declared as a node event
|
104
|
-
// so we don't stack up duplicates:
|
105
|
-
const allEvents = new Set<string>();
|
106
|
-
for (const node of this.nodes.values()) {
|
107
|
-
if (node.events) {
|
108
|
-
node.events.forEach((evt) => allEvents.add(evt));
|
109
|
-
}
|
110
|
-
}
|
111
|
-
for (const evt of allEvents) {
|
112
|
-
// remove only those events that are used by nodes
|
113
|
-
this.eventEmitter.removeAllListeners(evt);
|
114
|
-
}
|
115
|
-
|
116
|
-
// Now re-add the node-based event triggers
|
117
|
-
for (const node of this.nodes.values()) {
|
118
|
-
if (node.events && node.events.length > 0) {
|
119
|
-
node.events.forEach((event) => {
|
120
|
-
this.eventEmitter.on(
|
121
|
-
event,
|
122
|
-
async (data?: Partial<GraphContext<T>>) => {
|
123
|
-
const freshContext = structuredClone(this.context);
|
124
|
-
if (data) Object.assign(freshContext, data);
|
125
|
-
|
126
|
-
// If triggered by an event, we pass "true" so event-driven node will skip `next`.
|
127
|
-
await this.executeNode(
|
128
|
-
node.name,
|
129
|
-
freshContext,
|
130
|
-
undefined,
|
131
|
-
/* triggeredByEvent= */ true
|
132
|
-
);
|
133
|
-
}
|
134
|
-
);
|
135
|
-
});
|
136
|
-
}
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
/**
|
141
|
-
* Sets up listeners for graph-level events
|
142
|
-
* Handles graph start, completion, and error events
|
143
|
-
*/
|
144
|
-
setupGraphEventListeners(): void {
|
145
|
-
if (this.graphEvents && this.graphEvents.length > 0) {
|
146
|
-
this.graphEvents.forEach((event) => {
|
147
|
-
this.eventEmitter.on(event, async (data?: Partial<GraphContext<T>>) => {
|
148
|
-
const freshContext = this.createNewContext();
|
149
|
-
if (data) Object.assign(freshContext, data);
|
150
|
-
|
151
|
-
// Emit "graphStarted"
|
152
|
-
this.eventEmitter.emit("graphStarted", { name: this.name });
|
153
|
-
|
154
|
-
try {
|
155
|
-
// Execute the graph starting from the entry node
|
156
|
-
if (!this.entryNode) {
|
157
|
-
throw new Error("No entry node defined for graph event handling");
|
158
|
-
}
|
159
|
-
|
160
|
-
await this.executeNode(
|
161
|
-
this.entryNode,
|
162
|
-
freshContext,
|
163
|
-
undefined,
|
164
|
-
false
|
165
|
-
);
|
166
|
-
|
167
|
-
// Emit "graphCompleted"
|
168
|
-
this.eventEmitter.emit("graphCompleted", {
|
169
|
-
name: this.name,
|
170
|
-
context: this.context,
|
171
|
-
});
|
172
|
-
} catch (error) {
|
173
|
-
// Emit "graphError"
|
174
|
-
this.eventEmitter.emit("graphError", { name: this.name, error });
|
175
|
-
this.globalErrorHandler?.(error as Error, freshContext);
|
176
|
-
throw error;
|
177
|
-
}
|
178
|
-
});
|
179
|
-
});
|
180
|
-
}
|
181
|
-
}
|
182
|
-
|
183
|
-
/**
|
184
|
-
* Waits for a set of events to occur within a timeout period
|
185
|
-
* @param events - Array of event names to wait for
|
186
|
-
* @param timeout - Maximum time to wait in milliseconds
|
187
|
-
* @returns Promise that resolves with array of received events
|
188
|
-
* @throws Error if timeout occurs before all events are received
|
189
|
-
*/
|
190
|
-
async waitForEvents(
|
191
|
-
events: string[],
|
192
|
-
timeout: number = 30000
|
193
|
-
): Promise<any[]> {
|
194
|
-
return new Promise((resolve, reject) => {
|
195
|
-
const receivedEvents = new Map<string, any>();
|
196
|
-
const eventHandlers = new Map();
|
197
|
-
let isResolved = false;
|
198
|
-
|
199
|
-
const cleanup = () => {
|
200
|
-
events.forEach((event) => {
|
201
|
-
const handler = eventHandlers.get(event);
|
202
|
-
if (handler) {
|
203
|
-
this.eventEmitter.removeListener(event, handler);
|
204
|
-
}
|
205
|
-
});
|
206
|
-
};
|
207
|
-
|
208
|
-
events.forEach((event) => {
|
209
|
-
const handler = (eventData: any) => {
|
210
|
-
console.log(`Received event: ${event}`, eventData);
|
211
|
-
if (!isResolved) {
|
212
|
-
receivedEvents.set(event, eventData);
|
213
|
-
console.log(
|
214
|
-
"Current received events:",
|
215
|
-
Array.from(receivedEvents.keys())
|
216
|
-
);
|
217
|
-
|
218
|
-
if (events.every((e) => receivedEvents.has(e))) {
|
219
|
-
console.log("All events received, resolving");
|
220
|
-
isResolved = true;
|
221
|
-
clearTimeout(timeoutId);
|
222
|
-
cleanup();
|
223
|
-
resolve(Array.from(receivedEvents.values()));
|
224
|
-
}
|
225
|
-
}
|
226
|
-
};
|
227
|
-
|
228
|
-
eventHandlers.set(event, handler);
|
229
|
-
this.eventEmitter.on(event, handler);
|
230
|
-
});
|
231
|
-
|
232
|
-
const timeoutId = setTimeout(() => {
|
233
|
-
if (!isResolved) {
|
234
|
-
isResolved = true;
|
235
|
-
cleanup();
|
236
|
-
reject(new Error(`Timeout waiting for events: ${events.join(", ")}`));
|
237
|
-
}
|
238
|
-
}, timeout);
|
239
|
-
});
|
240
|
-
}
|
241
|
-
|
242
|
-
/**
|
243
|
-
* Registers an event handler
|
244
|
-
* @param eventName - Name of the event to listen for
|
245
|
-
* @param handler - Function to handle the event
|
246
|
-
*/
|
247
|
-
on(eventName: string, handler: (...args: any[]) => void): void {
|
248
|
-
this.eventEmitter.on(eventName, handler);
|
249
|
-
}
|
250
|
-
|
251
|
-
/**
|
252
|
-
* Emits an event through the event emitter
|
253
|
-
* @param eventName - Name of the event to emit
|
254
|
-
* @param data - Optional data to include with the event
|
255
|
-
*/
|
256
|
-
emit(eventName: string, data?: any): void {
|
257
|
-
this.eventEmitter.emit(eventName, data);
|
258
|
-
}
|
259
|
-
|
260
|
-
/**
|
261
|
-
* Creates a new context object by cloning the current context
|
262
|
-
* @returns A new graph context instance
|
263
|
-
* @private
|
264
|
-
*/
|
265
|
-
private createNewContext(): GraphContext<T> {
|
266
|
-
return structuredClone(this.context);
|
267
|
-
}
|
268
|
-
|
269
|
-
/**
|
270
|
-
* Executes a node with the given parameters
|
271
|
-
* @param nodeName - Name of the node to execute
|
272
|
-
* @param context - Graph context for execution
|
273
|
-
* @param inputs - Input data for the node
|
274
|
-
* @param triggeredByEvent - Whether execution was triggered by an event
|
275
|
-
* @returns Promise that resolves when execution is complete
|
276
|
-
* @throws Error if nodeExecutor is not initialized
|
277
|
-
* @private
|
278
|
-
*/
|
279
|
-
private async executeNode(
|
280
|
-
nodeName: string,
|
281
|
-
context: GraphContext<T>,
|
282
|
-
inputs: any,
|
283
|
-
triggeredByEvent: boolean
|
284
|
-
): Promise<void> {
|
285
|
-
if (!this.nodeExecutor) {
|
286
|
-
throw new Error("NodeExecutor not initialized");
|
287
|
-
}
|
288
|
-
return this.nodeExecutor.executeNode(
|
289
|
-
nodeName,
|
290
|
-
context,
|
291
|
-
inputs,
|
292
|
-
triggeredByEvent
|
293
|
-
);
|
294
|
-
}
|
295
|
-
}
|