mcpgraph 0.1.5 → 0.1.7
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 +1 -0
- package/dist/api.d.ts +17 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +33 -4
- package/dist/api.js.map +1 -1
- package/dist/execution/context.d.ts +3 -6
- package/dist/execution/context.d.ts.map +1 -1
- package/dist/execution/context.js +11 -2
- package/dist/execution/context.js.map +1 -1
- package/dist/execution/controller.d.ts +29 -0
- package/dist/execution/controller.d.ts.map +1 -0
- package/dist/execution/controller.js +95 -0
- package/dist/execution/controller.js.map +1 -0
- package/dist/execution/executor.d.ts +8 -1
- package/dist/execution/executor.d.ts.map +1 -1
- package/dist/execution/executor.js +184 -37
- package/dist/execution/executor.js.map +1 -1
- package/dist/execution/nodes/entry-executor.d.ts +1 -1
- package/dist/execution/nodes/entry-executor.d.ts.map +1 -1
- package/dist/execution/nodes/entry-executor.js +3 -2
- package/dist/execution/nodes/entry-executor.js.map +1 -1
- package/dist/execution/nodes/exit-executor.d.ts +1 -1
- package/dist/execution/nodes/exit-executor.d.ts.map +1 -1
- package/dist/execution/nodes/exit-executor.js +3 -2
- package/dist/execution/nodes/exit-executor.js.map +1 -1
- package/dist/execution/nodes/mcp-tool-executor.d.ts +1 -1
- package/dist/execution/nodes/mcp-tool-executor.d.ts.map +1 -1
- package/dist/execution/nodes/mcp-tool-executor.js +3 -2
- package/dist/execution/nodes/mcp-tool-executor.js.map +1 -1
- package/dist/execution/nodes/switch-executor.d.ts +1 -1
- package/dist/execution/nodes/switch-executor.d.ts.map +1 -1
- package/dist/execution/nodes/switch-executor.js +7 -2
- package/dist/execution/nodes/switch-executor.js.map +1 -1
- package/dist/execution/nodes/transform-executor.d.ts +1 -1
- package/dist/execution/nodes/transform-executor.d.ts.map +1 -1
- package/dist/execution/nodes/transform-executor.js +3 -2
- package/dist/execution/nodes/transform-executor.js.map +1 -1
- package/dist/types/execution.d.ts +92 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +5 -0
- package/dist/types/execution.js.map +1 -0
- package/docs/design.md +220 -0
- package/docs/implementation.md +377 -0
- package/docs/introspection-debugging.md +651 -0
- package/examples/api-usage.ts +49 -1
- package/examples/switch_example.yaml +80 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -190,3 +190,4 @@ See [`examples/api-usage.ts`](examples/api-usage.ts) for a complete example.
|
|
|
190
190
|
- [Contributing Guide](CONTRIBUTING.md) - Setup, development, and contribution guidelines
|
|
191
191
|
- [Design Document](docs/design.md) - Complete design and architecture
|
|
192
192
|
- [Implementation](docs/implementation.md) - Implementation details and architecture
|
|
193
|
+
- [Introspection & Debugging](docs/introspection-debugging.md) - Guide for building visualizer applications and debuggers
|
package/dist/api.d.ts
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { McpGraphConfig } from './types/config.js';
|
|
10
10
|
import { type ValidationError } from './graph/validator.js';
|
|
11
|
+
import type { ExecutionOptions, ExecutionResult as CoreExecutionResult, ExecutionController, ExecutionState } from './types/execution.js';
|
|
11
12
|
export type { NodeDefinition, McpGraphConfig } from './types/config.js';
|
|
13
|
+
export type { ExecutionOptions, ExecutionHooks, ExecutionController, ExecutionState, ExecutionStatus, NodeExecutionRecord, ExecutionTelemetry, } from './types/execution.js';
|
|
12
14
|
export interface ToolInfo {
|
|
13
15
|
name: string;
|
|
14
16
|
description: string;
|
|
@@ -18,6 +20,8 @@ export interface ToolInfo {
|
|
|
18
20
|
export interface ExecutionResult {
|
|
19
21
|
result: unknown;
|
|
20
22
|
structuredContent?: Record<string, unknown>;
|
|
23
|
+
executionHistory?: CoreExecutionResult['executionHistory'];
|
|
24
|
+
telemetry?: CoreExecutionResult['telemetry'];
|
|
21
25
|
}
|
|
22
26
|
export declare class McpGraphApi {
|
|
23
27
|
private config;
|
|
@@ -48,7 +52,19 @@ export declare class McpGraphApi {
|
|
|
48
52
|
/**
|
|
49
53
|
* Execute a tool with the given arguments
|
|
50
54
|
*/
|
|
51
|
-
executeTool(toolName: string, toolArguments?: Record<string, unknown
|
|
55
|
+
executeTool(toolName: string, toolArguments?: Record<string, unknown>, options?: ExecutionOptions): Promise<ExecutionResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Get the execution controller (available during execution with hooks/breakpoints)
|
|
58
|
+
*/
|
|
59
|
+
getController(): ExecutionController | null;
|
|
60
|
+
/**
|
|
61
|
+
* Get the graph structure
|
|
62
|
+
*/
|
|
63
|
+
getGraph(): import("./graph/graph.js").Graph;
|
|
64
|
+
/**
|
|
65
|
+
* Get the current execution state (if execution is in progress)
|
|
66
|
+
*/
|
|
67
|
+
getExecutionState(): ExecutionState | null;
|
|
52
68
|
/**
|
|
53
69
|
* Get the full configuration
|
|
54
70
|
*/
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,IAAI,mBAAmB,EACtC,mBAAmB,EACnB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,SAAS,CAAC,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;CAC9C;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,aAAa,CAAmB;IAExC;;;;OAIG;gBACS,UAAU,EAAE,MAAM;IAmB9B;;OAEG;IACH,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAQvE;;OAEG;IACH,SAAS,IAAI,QAAQ,EAAE;IASvB;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAc/C;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC3C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC;IAW3B;;OAEG;IACH,aAAa,IAAI,mBAAmB,GAAG,IAAI;IAI3C;;OAEG;IACH,QAAQ;IAIR;;OAEG;IACH,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAY1C;;OAEG;IACH,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE;IAK5D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG;QAChD,MAAM,EAAE,cAAc,CAAC;QACvB,MAAM,EAAE,eAAe,EAAE,CAAC;KAC3B;IAMD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
package/dist/api.js
CHANGED
|
@@ -73,13 +73,42 @@ export class McpGraphApi {
|
|
|
73
73
|
/**
|
|
74
74
|
* Execute a tool with the given arguments
|
|
75
75
|
*/
|
|
76
|
-
async executeTool(toolName, toolArguments = {}) {
|
|
77
|
-
const
|
|
76
|
+
async executeTool(toolName, toolArguments = {}, options) {
|
|
77
|
+
const executionResult = await this.executor.executeTool(toolName, toolArguments, options);
|
|
78
78
|
return {
|
|
79
|
-
result,
|
|
80
|
-
structuredContent: result,
|
|
79
|
+
result: executionResult.result,
|
|
80
|
+
structuredContent: executionResult.result,
|
|
81
|
+
executionHistory: executionResult.executionHistory,
|
|
82
|
+
telemetry: executionResult.telemetry,
|
|
81
83
|
};
|
|
82
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the execution controller (available during execution with hooks/breakpoints)
|
|
87
|
+
*/
|
|
88
|
+
getController() {
|
|
89
|
+
return this.executor.getController();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the graph structure
|
|
93
|
+
*/
|
|
94
|
+
getGraph() {
|
|
95
|
+
return this.executor.getGraph();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the current execution state (if execution is in progress)
|
|
99
|
+
*/
|
|
100
|
+
getExecutionState() {
|
|
101
|
+
const controller = this.executor.getController();
|
|
102
|
+
if (!controller) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
return controller.getState();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
83
112
|
/**
|
|
84
113
|
* Get the full configuration
|
|
85
114
|
*/
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,14 @@
|
|
|
2
2
|
* Execution context for graph execution
|
|
3
3
|
*/
|
|
4
4
|
import type { ExecutionContext as ExprContext } from "../expressions/context.js";
|
|
5
|
+
import type { NodeExecutionRecord } from "../types/execution.js";
|
|
5
6
|
export declare class ExecutionContext {
|
|
6
7
|
private data;
|
|
7
8
|
private history;
|
|
8
9
|
constructor(toolInput: Record<string, unknown>);
|
|
9
10
|
getData(): ExprContext;
|
|
10
11
|
setNodeOutput(nodeId: string, output: unknown): void;
|
|
11
|
-
addHistory(nodeId: string, input: unknown, output: unknown): void;
|
|
12
|
-
getHistory():
|
|
13
|
-
nodeId: string;
|
|
14
|
-
input: unknown;
|
|
15
|
-
output: unknown;
|
|
16
|
-
}>;
|
|
12
|
+
addHistory(nodeId: string, nodeType: string, input: unknown, output: unknown, startTime: number, endTime: number, error?: Error): void;
|
|
13
|
+
getHistory(): NodeExecutionRecord[];
|
|
17
14
|
}
|
|
18
15
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/execution/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/execution/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAwB;gBAE3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAU9C,OAAO,IAAI,WAAW;IAItB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAQpD,UAAU,CACR,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK,GACZ,IAAI;IAaP,UAAU,IAAI,mBAAmB,EAAE;CAGpC"}
|
|
@@ -23,8 +23,17 @@ export class ExecutionContext {
|
|
|
23
23
|
this.data.output = output;
|
|
24
24
|
this.data.last = output;
|
|
25
25
|
}
|
|
26
|
-
addHistory(nodeId, input, output) {
|
|
27
|
-
this.history.push({
|
|
26
|
+
addHistory(nodeId, nodeType, input, output, startTime, endTime, error) {
|
|
27
|
+
this.history.push({
|
|
28
|
+
nodeId,
|
|
29
|
+
nodeType,
|
|
30
|
+
input,
|
|
31
|
+
output,
|
|
32
|
+
startTime,
|
|
33
|
+
endTime,
|
|
34
|
+
duration: endTime - startTime,
|
|
35
|
+
error,
|
|
36
|
+
});
|
|
28
37
|
}
|
|
29
38
|
getHistory() {
|
|
30
39
|
return this.history;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/execution/context.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/execution/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,gBAAgB;IACnB,IAAI,CAAc;IAClB,OAAO,CAAwB;IAEvC,YAAY,SAAkC;QAC5C,0DAA0D;QAC1D,IAAI,CAAC,IAAI,GAAG;YACV,KAAK,EAAE,SAAS;YAChB,iEAAiE;YACjE,GAAG,SAAS;SACb,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,MAAe;QAC3C,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAC3B,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,UAAU,CACR,MAAc,EACd,QAAgB,EAChB,KAAc,EACd,MAAe,EACf,SAAiB,EACjB,OAAe,EACf,KAAa;QAEb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,MAAM;YACN,QAAQ;YACR,KAAK;YACL,MAAM;YACN,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,OAAO,GAAG,SAAS;YAC7B,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution controller for debugging and introspection
|
|
3
|
+
*/
|
|
4
|
+
import type { ExecutionState, ExecutionStatus, ExecutionController as IExecutionController } from "../types/execution.js";
|
|
5
|
+
import type { ExecutionContext } from "./context.js";
|
|
6
|
+
export declare class ExecutionController implements IExecutionController {
|
|
7
|
+
private status;
|
|
8
|
+
private currentNodeId;
|
|
9
|
+
private context;
|
|
10
|
+
private breakpoints;
|
|
11
|
+
private pauseRequested;
|
|
12
|
+
private stepRequested;
|
|
13
|
+
private resumePromise;
|
|
14
|
+
private resumeResolve;
|
|
15
|
+
setContext(context: ExecutionContext): void;
|
|
16
|
+
setStatus(status: ExecutionStatus): void;
|
|
17
|
+
setCurrentNode(nodeId: string | null): void;
|
|
18
|
+
waitIfPaused(): Promise<void>;
|
|
19
|
+
shouldPause(nodeId: string): boolean;
|
|
20
|
+
pause(): void;
|
|
21
|
+
resume(): void;
|
|
22
|
+
step(): Promise<void>;
|
|
23
|
+
getState(): ExecutionState;
|
|
24
|
+
setBreakpoints(nodeIds: string[]): void;
|
|
25
|
+
clearBreakpoints(): void;
|
|
26
|
+
getBreakpoints(): string[];
|
|
27
|
+
markStepComplete(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/execution/controller.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,IAAI,oBAAoB,EAC5C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAElD,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI3C,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIrC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBnC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIpC,KAAK,IAAI,IAAI;IAQb,MAAM,IAAI,IAAI;IAWR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,QAAQ,IAAI,cAAc;IAa1B,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAIvC,gBAAgB,IAAI,IAAI;IAIxB,cAAc,IAAI,MAAM,EAAE;IAI1B,gBAAgB,IAAI,IAAI;CAMzB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution controller for debugging and introspection
|
|
3
|
+
*/
|
|
4
|
+
export class ExecutionController {
|
|
5
|
+
status = "not_started";
|
|
6
|
+
currentNodeId = null;
|
|
7
|
+
context = null;
|
|
8
|
+
breakpoints = new Set();
|
|
9
|
+
pauseRequested = false;
|
|
10
|
+
stepRequested = false;
|
|
11
|
+
resumePromise = null;
|
|
12
|
+
resumeResolve = null;
|
|
13
|
+
setContext(context) {
|
|
14
|
+
this.context = context;
|
|
15
|
+
}
|
|
16
|
+
setStatus(status) {
|
|
17
|
+
this.status = status;
|
|
18
|
+
}
|
|
19
|
+
setCurrentNode(nodeId) {
|
|
20
|
+
this.currentNodeId = nodeId;
|
|
21
|
+
}
|
|
22
|
+
async waitIfPaused() {
|
|
23
|
+
if (this.status === "paused" || this.pauseRequested) {
|
|
24
|
+
this.status = "paused";
|
|
25
|
+
this.pauseRequested = false;
|
|
26
|
+
// Create promise for resume
|
|
27
|
+
this.resumePromise = new Promise((resolve) => {
|
|
28
|
+
this.resumeResolve = resolve;
|
|
29
|
+
});
|
|
30
|
+
await this.resumePromise;
|
|
31
|
+
this.resumePromise = null;
|
|
32
|
+
this.resumeResolve = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
shouldPause(nodeId) {
|
|
36
|
+
return this.breakpoints.has(nodeId) || this.pauseRequested;
|
|
37
|
+
}
|
|
38
|
+
pause() {
|
|
39
|
+
if (this.status === "running") {
|
|
40
|
+
this.pauseRequested = true;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw new Error(`Cannot pause: execution status is "${this.status}"`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
resume() {
|
|
47
|
+
if (this.status === "paused") {
|
|
48
|
+
this.status = "running";
|
|
49
|
+
if (this.resumeResolve) {
|
|
50
|
+
this.resumeResolve();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw new Error(`Cannot resume: execution status is "${this.status}"`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async step() {
|
|
58
|
+
if (this.status === "paused") {
|
|
59
|
+
this.stepRequested = true;
|
|
60
|
+
this.resume();
|
|
61
|
+
// Wait for step to complete (will be paused again after one node)
|
|
62
|
+
await this.waitIfPaused();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error(`Cannot step: execution status is "${this.status}"`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getState() {
|
|
69
|
+
if (!this.context) {
|
|
70
|
+
throw new Error("Execution context not set");
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
status: this.status,
|
|
74
|
+
currentNodeId: this.currentNodeId,
|
|
75
|
+
executionHistory: this.context.getHistory(),
|
|
76
|
+
context: this.context,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
setBreakpoints(nodeIds) {
|
|
80
|
+
this.breakpoints = new Set(nodeIds);
|
|
81
|
+
}
|
|
82
|
+
clearBreakpoints() {
|
|
83
|
+
this.breakpoints.clear();
|
|
84
|
+
}
|
|
85
|
+
getBreakpoints() {
|
|
86
|
+
return Array.from(this.breakpoints);
|
|
87
|
+
}
|
|
88
|
+
markStepComplete() {
|
|
89
|
+
if (this.stepRequested) {
|
|
90
|
+
this.stepRequested = false;
|
|
91
|
+
this.pauseRequested = true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/execution/controller.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,mBAAmB;IACtB,MAAM,GAAoB,aAAa,CAAC;IACxC,aAAa,GAAkB,IAAI,CAAC;IACpC,OAAO,GAA4B,IAAI,CAAC;IACxC,WAAW,GAAgB,IAAI,GAAG,EAAE,CAAC;IACrC,cAAc,GAAY,KAAK,CAAC;IAChC,aAAa,GAAY,KAAK,CAAC;IAC/B,aAAa,GAAyB,IAAI,CAAC;IAC3C,aAAa,GAAwB,IAAI,CAAC;IAElD,UAAU,CAAC,OAAyB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,MAAuB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,cAAc,CAAC,MAAqB;QAClC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAE5B,4BAA4B;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,aAAa,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC;IAC7D,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,kEAAkE;YAClE,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,OAAiB;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,13 +2,20 @@
|
|
|
2
2
|
* Graph execution engine
|
|
3
3
|
*/
|
|
4
4
|
import type { McpGraphConfig } from "../types/config.js";
|
|
5
|
+
import type { ExecutionOptions, ExecutionResult, ExecutionController as IExecutionController } from "../types/execution.js";
|
|
6
|
+
import { Graph } from "../graph/graph.js";
|
|
5
7
|
import type { McpClientManager } from "../mcp/client-manager.js";
|
|
6
8
|
export declare class GraphExecutor {
|
|
7
9
|
private config;
|
|
8
10
|
private graph;
|
|
9
11
|
private clientManager;
|
|
12
|
+
private controller;
|
|
10
13
|
constructor(config: McpGraphConfig, clientManager: McpClientManager);
|
|
14
|
+
getController(): IExecutionController | null;
|
|
15
|
+
getGraph(): Graph;
|
|
16
|
+
getConfig(): McpGraphConfig;
|
|
11
17
|
private getServerConfig;
|
|
12
|
-
executeTool(toolName: string, toolInput: Record<string, unknown
|
|
18
|
+
executeTool(toolName: string, toolInput: Record<string, unknown>, options?: ExecutionOptions): Promise<ExecutionResult>;
|
|
19
|
+
private buildTelemetry;
|
|
13
20
|
}
|
|
14
21
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/execution/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/execution/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgD,MAAM,oBAAoB,CAAC;AACvG,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAGf,mBAAmB,IAAI,oBAAoB,EAC5C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAQ1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,UAAU,CAAoC;gBAE1C,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB;IAMnE,aAAa,IAAI,oBAAoB,GAAG,IAAI;IAI5C,QAAQ,IAAI,KAAK;IAIjB,SAAS,IAAI,cAAc;IAI3B,OAAO,CAAC,eAAe;IAOjB,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC;IAgO3B,OAAO,CAAC,cAAc;CAgCvB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { Graph } from "../graph/graph.js";
|
|
5
5
|
import { ExecutionContext } from "./context.js";
|
|
6
|
+
import { ExecutionController } from "./controller.js";
|
|
6
7
|
import { executeEntryNode } from "./nodes/entry-executor.js";
|
|
7
8
|
import { executeExitNode } from "./nodes/exit-executor.js";
|
|
8
9
|
import { executeTransformNode } from "./nodes/transform-executor.js";
|
|
@@ -13,23 +14,43 @@ export class GraphExecutor {
|
|
|
13
14
|
config;
|
|
14
15
|
graph;
|
|
15
16
|
clientManager;
|
|
17
|
+
controller = null;
|
|
16
18
|
constructor(config, clientManager) {
|
|
17
19
|
this.config = config;
|
|
18
20
|
this.graph = new Graph(config.nodes);
|
|
19
21
|
this.clientManager = clientManager;
|
|
20
22
|
}
|
|
23
|
+
getController() {
|
|
24
|
+
return this.controller;
|
|
25
|
+
}
|
|
26
|
+
getGraph() {
|
|
27
|
+
return this.graph;
|
|
28
|
+
}
|
|
29
|
+
getConfig() {
|
|
30
|
+
return this.config;
|
|
31
|
+
}
|
|
21
32
|
getServerConfig(serverName) {
|
|
22
33
|
if (!this.config.servers || !this.config.servers[serverName]) {
|
|
23
34
|
throw new Error(`Server configuration not found: ${serverName}`);
|
|
24
35
|
}
|
|
25
36
|
return this.config.servers[serverName];
|
|
26
37
|
}
|
|
27
|
-
async executeTool(toolName, toolInput) {
|
|
38
|
+
async executeTool(toolName, toolInput, options) {
|
|
28
39
|
const tool = this.config.tools.find((t) => t.name === toolName);
|
|
29
40
|
if (!tool) {
|
|
30
41
|
throw new Error(`Tool not found: ${toolName}`);
|
|
31
42
|
}
|
|
32
43
|
logger.info(`Executing tool: ${toolName}`);
|
|
44
|
+
// Initialize execution options
|
|
45
|
+
const hooks = options?.hooks;
|
|
46
|
+
const breakpoints = options?.breakpoints || [];
|
|
47
|
+
const enableTelemetry = options?.enableTelemetry ?? false;
|
|
48
|
+
// Initialize controller if hooks or breakpoints are provided
|
|
49
|
+
if (hooks || breakpoints.length > 0) {
|
|
50
|
+
this.controller = new ExecutionController();
|
|
51
|
+
this.controller.setBreakpoints(breakpoints);
|
|
52
|
+
this.controller.setStatus("not_started");
|
|
53
|
+
}
|
|
33
54
|
// Find entry node for this tool
|
|
34
55
|
const entryNode = this.config.nodes.find((n) => n.type === "entry" && n.tool === toolName);
|
|
35
56
|
if (!entryNode) {
|
|
@@ -41,49 +62,175 @@ export class GraphExecutor {
|
|
|
41
62
|
throw new Error(`Exit node not found for tool: ${toolName}`);
|
|
42
63
|
}
|
|
43
64
|
const context = new ExecutionContext(toolInput);
|
|
65
|
+
if (this.controller) {
|
|
66
|
+
this.controller.setContext(context);
|
|
67
|
+
}
|
|
68
|
+
const startTime = Date.now();
|
|
44
69
|
let currentNodeId = entryNode.id;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (!node) {
|
|
49
|
-
throw new Error(`Node not found: ${currentNodeId}`);
|
|
70
|
+
try {
|
|
71
|
+
if (this.controller) {
|
|
72
|
+
this.controller.setStatus("running");
|
|
50
73
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
// Execute nodes until we reach the exit node
|
|
75
|
+
while (currentNodeId !== exitNode.id) {
|
|
76
|
+
const node = this.graph.getNode(currentNodeId);
|
|
77
|
+
if (!node) {
|
|
78
|
+
throw new Error(`Node not found: ${currentNodeId}`);
|
|
79
|
+
}
|
|
80
|
+
// Update controller with current node
|
|
81
|
+
if (this.controller) {
|
|
82
|
+
this.controller.setCurrentNode(currentNodeId);
|
|
83
|
+
}
|
|
84
|
+
// Check for breakpoint or pause request
|
|
85
|
+
if (this.controller && this.controller.shouldPause(currentNodeId)) {
|
|
86
|
+
await this.controller.waitIfPaused();
|
|
87
|
+
}
|
|
88
|
+
// Call onNodeStart hook
|
|
89
|
+
if (hooks?.onNodeStart) {
|
|
90
|
+
const shouldContinue = await hooks.onNodeStart(currentNodeId, node, context);
|
|
91
|
+
if (shouldContinue === false) {
|
|
92
|
+
// Hook requested pause
|
|
93
|
+
if (this.controller) {
|
|
94
|
+
await this.controller.waitIfPaused();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
logger.debug(`Executing node: ${currentNodeId} (type: ${node.type})`);
|
|
99
|
+
const nodeStartTime = Date.now();
|
|
100
|
+
let result;
|
|
101
|
+
let nodeError;
|
|
102
|
+
try {
|
|
103
|
+
switch (node.type) {
|
|
104
|
+
case "entry":
|
|
105
|
+
result = executeEntryNode(node, toolInput, context, nodeStartTime);
|
|
106
|
+
break;
|
|
107
|
+
case "exit":
|
|
108
|
+
result = executeExitNode(node, context, nodeStartTime);
|
|
109
|
+
// Call onNodeComplete hook for exit node
|
|
110
|
+
if (hooks?.onNodeComplete) {
|
|
111
|
+
await hooks.onNodeComplete(currentNodeId, node, context.getData(), result.output, Date.now() - nodeStartTime);
|
|
112
|
+
}
|
|
113
|
+
if (this.controller) {
|
|
114
|
+
this.controller.setStatus("finished");
|
|
115
|
+
this.controller.setCurrentNode(null);
|
|
116
|
+
}
|
|
117
|
+
const endTime = Date.now();
|
|
118
|
+
const telemetry = enableTelemetry
|
|
119
|
+
? this.buildTelemetry(context, startTime, endTime)
|
|
120
|
+
: undefined;
|
|
121
|
+
return {
|
|
122
|
+
result: result.output,
|
|
123
|
+
executionHistory: context.getHistory(),
|
|
124
|
+
telemetry,
|
|
125
|
+
};
|
|
126
|
+
case "transform":
|
|
127
|
+
result = await executeTransformNode(node, context, nodeStartTime);
|
|
128
|
+
break;
|
|
129
|
+
case "mcp":
|
|
130
|
+
const serverConfig = this.getServerConfig(node.server);
|
|
131
|
+
result = await executeMcpToolNode(node, context, this.clientManager, serverConfig, nodeStartTime);
|
|
132
|
+
break;
|
|
133
|
+
case "switch":
|
|
134
|
+
result = await executeSwitchNode(node, context, nodeStartTime);
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
throw new Error(`Unknown node type: ${node.type}`);
|
|
138
|
+
}
|
|
139
|
+
// Call onNodeComplete hook
|
|
140
|
+
if (hooks?.onNodeComplete) {
|
|
141
|
+
await hooks.onNodeComplete(currentNodeId, node, context.getData(), result.output, Date.now() - nodeStartTime);
|
|
142
|
+
}
|
|
143
|
+
// Mark step complete if stepping
|
|
144
|
+
if (this.controller) {
|
|
145
|
+
this.controller.markStepComplete();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
nodeError = error instanceof Error ? error : new Error(String(error));
|
|
150
|
+
const nodeEndTime = Date.now();
|
|
151
|
+
// Record error in history (if not already recorded by node executor)
|
|
152
|
+
const history = context.getHistory();
|
|
153
|
+
const lastRecord = history[history.length - 1];
|
|
154
|
+
if (!lastRecord || lastRecord.nodeId !== currentNodeId) {
|
|
155
|
+
context.addHistory(currentNodeId, node.type, context.getData(), null, nodeStartTime, nodeEndTime, nodeError);
|
|
156
|
+
}
|
|
157
|
+
// Call onNodeError hook
|
|
158
|
+
if (hooks?.onNodeError) {
|
|
159
|
+
await hooks.onNodeError(currentNodeId, node, nodeError, context);
|
|
160
|
+
}
|
|
161
|
+
if (this.controller) {
|
|
162
|
+
this.controller.setStatus("error");
|
|
163
|
+
this.controller.setCurrentNode(null);
|
|
164
|
+
}
|
|
165
|
+
throw nodeError;
|
|
166
|
+
}
|
|
167
|
+
if (result.nextNode) {
|
|
168
|
+
currentNodeId = result.nextNode;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
throw new Error(`Node ${currentNodeId} has no next node and is not the exit node`);
|
|
172
|
+
}
|
|
72
173
|
}
|
|
73
|
-
|
|
74
|
-
|
|
174
|
+
// Should not reach here, but handle exit node
|
|
175
|
+
const finalExitNode = this.graph.getNode(exitNode.id);
|
|
176
|
+
if (finalExitNode && finalExitNode.type === "exit") {
|
|
177
|
+
const result = executeExitNode(finalExitNode, context, Date.now());
|
|
178
|
+
if (this.controller) {
|
|
179
|
+
this.controller.setStatus("finished");
|
|
180
|
+
this.controller.setCurrentNode(null);
|
|
181
|
+
}
|
|
182
|
+
const endTime = Date.now();
|
|
183
|
+
const telemetry = enableTelemetry
|
|
184
|
+
? this.buildTelemetry(context, startTime, endTime)
|
|
185
|
+
: undefined;
|
|
186
|
+
return {
|
|
187
|
+
result: result.output,
|
|
188
|
+
executionHistory: context.getHistory(),
|
|
189
|
+
telemetry,
|
|
190
|
+
};
|
|
75
191
|
}
|
|
76
|
-
|
|
77
|
-
|
|
192
|
+
throw new Error(`Exit node ${exitNode.id} not found or invalid`);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (this.controller) {
|
|
196
|
+
this.controller.setStatus("error");
|
|
197
|
+
this.controller.setCurrentNode(null);
|
|
198
|
+
if (error instanceof Error) {
|
|
199
|
+
// Store error in controller state would require extending ExecutionState
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
// Clean up controller after execution
|
|
206
|
+
if (this.controller) {
|
|
207
|
+
this.controller = null;
|
|
78
208
|
}
|
|
79
209
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
210
|
+
}
|
|
211
|
+
buildTelemetry(context, startTime, endTime) {
|
|
212
|
+
const history = context.getHistory();
|
|
213
|
+
const nodeDurations = new Map();
|
|
214
|
+
const nodeCounts = new Map();
|
|
215
|
+
let errorCount = 0;
|
|
216
|
+
for (const record of history) {
|
|
217
|
+
// Aggregate durations by node type
|
|
218
|
+
const currentDuration = nodeDurations.get(record.nodeType) || 0;
|
|
219
|
+
nodeDurations.set(record.nodeType, currentDuration + record.duration);
|
|
220
|
+
// Count nodes by type
|
|
221
|
+
const currentCount = nodeCounts.get(record.nodeType) || 0;
|
|
222
|
+
nodeCounts.set(record.nodeType, currentCount + 1);
|
|
223
|
+
// Count errors
|
|
224
|
+
if (record.error) {
|
|
225
|
+
errorCount++;
|
|
226
|
+
}
|
|
85
227
|
}
|
|
86
|
-
|
|
228
|
+
return {
|
|
229
|
+
totalDuration: endTime - startTime,
|
|
230
|
+
nodeDurations,
|
|
231
|
+
nodeCounts,
|
|
232
|
+
errorCount,
|
|
233
|
+
};
|
|
87
234
|
}
|
|
88
235
|
}
|
|
89
236
|
//# sourceMappingURL=executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/execution/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/execution/executor.ts"],"names":[],"mappings":"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"}
|