@emmvish/stable-request 1.8.0 → 1.9.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 +194 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/stable-api-gateway.d.ts.map +1 -1
- package/dist/core/stable-api-gateway.js +1 -5
- package/dist/core/stable-api-gateway.js.map +1 -1
- package/dist/core/stable-workflow-graph.d.ts +3 -0
- package/dist/core/stable-workflow-graph.d.ts.map +1 -0
- package/dist/core/stable-workflow-graph.js +5 -0
- package/dist/core/stable-workflow-graph.js.map +1 -0
- package/dist/core/stable-workflow.d.ts.map +1 -1
- package/dist/core/stable-workflow.js +24 -21
- package/dist/core/stable-workflow.js.map +1 -1
- package/dist/enums/index.d.ts +13 -0
- package/dist/enums/index.d.ts.map +1 -1
- package/dist/enums/index.js +15 -0
- package/dist/enums/index.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +93 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utilities/execute-branch-workflow.d.ts.map +1 -1
- package/dist/utilities/execute-branch-workflow.js +98 -8
- package/dist/utilities/execute-branch-workflow.js.map +1 -1
- package/dist/utilities/execute-non-linear-workflow.d.ts.map +1 -1
- package/dist/utilities/execute-non-linear-workflow.js +47 -3
- package/dist/utilities/execute-non-linear-workflow.js.map +1 -1
- package/dist/utilities/execute-phase.d.ts +1 -1
- package/dist/utilities/execute-phase.d.ts.map +1 -1
- package/dist/utilities/execute-phase.js +34 -12
- package/dist/utilities/execute-phase.js.map +1 -1
- package/dist/utilities/execute-workflow-graph.d.ts +3 -0
- package/dist/utilities/execute-workflow-graph.d.ts.map +1 -0
- package/dist/utilities/execute-workflow-graph.js +286 -0
- package/dist/utilities/execute-workflow-graph.js.map +1 -0
- package/dist/utilities/index.d.ts +3 -0
- package/dist/utilities/index.d.ts.map +1 -1
- package/dist/utilities/index.js +3 -0
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/validate-workflow-graph.d.ts +10 -0
- package/dist/utilities/validate-workflow-graph.d.ts.map +1 -0
- package/dist/utilities/validate-workflow-graph.js +233 -0
- package/dist/utilities/validate-workflow-graph.js.map +1 -0
- package/dist/utilities/workflow-graph-builder.d.ts +37 -0
- package/dist/utilities/workflow-graph-builder.d.ts.map +1 -0
- package/dist/utilities/workflow-graph-builder.js +225 -0
- package/dist/utilities/workflow-graph-builder.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { WorkflowGraph, WorkflowGraphValidationResult } from '../types/index.js';
|
|
2
|
+
export declare function validateWorkflowGraph<T = any, R = any>(graph: WorkflowGraph<T, R>): WorkflowGraphValidationResult;
|
|
3
|
+
export declare function detectCycles<T = any, R = any>(graph: WorkflowGraph<T, R>): string[][];
|
|
4
|
+
/**
|
|
5
|
+
* Detect nodes that cannot be reached from the entry point
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectUnreachableNodes<T = any, R = any>(graph: WorkflowGraph<T, R>): string[];
|
|
8
|
+
export declare function detectOrphanNodes<T = any, R = any>(graph: WorkflowGraph<T, R>): string[];
|
|
9
|
+
export declare function calculateGraphDepth<T = any, R = any>(graph: WorkflowGraph<T, R>): number;
|
|
10
|
+
//# sourceMappingURL=validate-workflow-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-workflow-graph.d.ts","sourceRoot":"","sources":["../../src/utilities/validate-workflow-graph.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,6BAA6B,EAE9B,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACpD,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,6BAA6B,CA0D/B;AAwDD,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAC3C,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,MAAM,EAAE,EAAE,CAyCZ;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACrD,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,MAAM,EAAE,CAoDV;AAED,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAChD,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,MAAM,EAAE,CA+BV;AAED,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAClD,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,MAAM,CA4BR"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { WorkflowNodeTypes } from '../enums/index.js';
|
|
2
|
+
export function validateWorkflowGraph(graph) {
|
|
3
|
+
const errors = [];
|
|
4
|
+
const warnings = [];
|
|
5
|
+
if (!graph.entryPoint) {
|
|
6
|
+
errors.push('Graph must have an entry point');
|
|
7
|
+
}
|
|
8
|
+
else if (!graph.nodes.has(graph.entryPoint)) {
|
|
9
|
+
errors.push(`Entry point '${graph.entryPoint}' does not exist in graph nodes`);
|
|
10
|
+
}
|
|
11
|
+
if (graph.exitPoints) {
|
|
12
|
+
for (const exitPoint of graph.exitPoints) {
|
|
13
|
+
if (!graph.nodes.has(exitPoint)) {
|
|
14
|
+
errors.push(`Exit point '${exitPoint}' does not exist in graph nodes`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const [fromId, edges] of graph.edges) {
|
|
19
|
+
if (!graph.nodes.has(fromId)) {
|
|
20
|
+
errors.push(`Edge source node '${fromId}' does not exist in graph`);
|
|
21
|
+
}
|
|
22
|
+
for (const edge of edges) {
|
|
23
|
+
if (!graph.nodes.has(edge.to)) {
|
|
24
|
+
errors.push(`Edge target node '${edge.to}' (from '${fromId}') does not exist in graph`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const [nodeId, node] of graph.nodes) {
|
|
29
|
+
const nodeErrors = validateNode(node, graph);
|
|
30
|
+
errors.push(...nodeErrors);
|
|
31
|
+
}
|
|
32
|
+
const cycles = detectCycles(graph);
|
|
33
|
+
if (cycles.length > 0) {
|
|
34
|
+
errors.push(`Graph contains ${cycles.length} cycle(s), violating DAG constraints. Cycles: ${cycles.map(c => c.join(' → ')).join('; ')}`);
|
|
35
|
+
}
|
|
36
|
+
const unreachableNodes = detectUnreachableNodes(graph);
|
|
37
|
+
if (unreachableNodes.length > 0) {
|
|
38
|
+
warnings.push(`Found ${unreachableNodes.length} unreachable node(s): ${unreachableNodes.join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
const orphanNodes = detectOrphanNodes(graph);
|
|
41
|
+
if (orphanNodes.length > 0) {
|
|
42
|
+
warnings.push(`Found ${orphanNodes.length} orphan node(s) with no connections: ${orphanNodes.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
valid: errors.length === 0,
|
|
46
|
+
errors,
|
|
47
|
+
warnings,
|
|
48
|
+
cycles: cycles.length > 0 ? cycles : undefined,
|
|
49
|
+
unreachableNodes: unreachableNodes.length > 0 ? unreachableNodes : undefined,
|
|
50
|
+
orphanNodes: orphanNodes.length > 0 ? orphanNodes : undefined
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function validateNode(node, graph) {
|
|
54
|
+
const errors = [];
|
|
55
|
+
switch (node.type) {
|
|
56
|
+
case WorkflowNodeTypes.PHASE:
|
|
57
|
+
if (!node.phase) {
|
|
58
|
+
errors.push(`Phase node '${node.id}' is missing phase configuration`);
|
|
59
|
+
}
|
|
60
|
+
else if (!node.phase.requests || node.phase.requests.length === 0) {
|
|
61
|
+
errors.push(`Phase node '${node.id}' has no requests`);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case WorkflowNodeTypes.BRANCH:
|
|
65
|
+
if (!node.branch) {
|
|
66
|
+
errors.push(`Branch node '${node.id}' is missing branch configuration`);
|
|
67
|
+
}
|
|
68
|
+
else if (!node.branch.phases || node.branch.phases.length === 0) {
|
|
69
|
+
errors.push(`Branch node '${node.id}' has no phases`);
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
case WorkflowNodeTypes.CONDITIONAL:
|
|
73
|
+
if (!node.condition || typeof node.condition.evaluate !== 'function') {
|
|
74
|
+
errors.push(`Conditional node '${node.id}' is missing evaluation function`);
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
case WorkflowNodeTypes.PARALLEL_GROUP:
|
|
78
|
+
if (!node.parallelNodes || node.parallelNodes.length === 0) {
|
|
79
|
+
errors.push(`Parallel group node '${node.id}' has no parallel nodes specified`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
for (const parallelNodeId of node.parallelNodes) {
|
|
83
|
+
if (!graph.nodes.has(parallelNodeId)) {
|
|
84
|
+
errors.push(`Parallel group node '${node.id}' references non-existent node '${parallelNodeId}'`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case WorkflowNodeTypes.MERGE_POINT:
|
|
90
|
+
if (!node.waitForNodes || node.waitForNodes.length === 0) {
|
|
91
|
+
errors.push(`Merge point node '${node.id}' has no nodes to wait for`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
for (const waitForNodeId of node.waitForNodes) {
|
|
95
|
+
if (!graph.nodes.has(waitForNodeId)) {
|
|
96
|
+
errors.push(`Merge point node '${node.id}' references non-existent node '${waitForNodeId}'`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
return errors;
|
|
103
|
+
}
|
|
104
|
+
export function detectCycles(graph) {
|
|
105
|
+
const cycles = [];
|
|
106
|
+
const visited = new Set();
|
|
107
|
+
const recursionStack = new Set();
|
|
108
|
+
const currentPath = [];
|
|
109
|
+
function dfs(nodeId) {
|
|
110
|
+
visited.add(nodeId);
|
|
111
|
+
recursionStack.add(nodeId);
|
|
112
|
+
currentPath.push(nodeId);
|
|
113
|
+
const edges = graph.edges.get(nodeId) || [];
|
|
114
|
+
for (const edge of edges) {
|
|
115
|
+
const targetId = edge.to;
|
|
116
|
+
if (!visited.has(targetId)) {
|
|
117
|
+
dfs(targetId);
|
|
118
|
+
}
|
|
119
|
+
else if (recursionStack.has(targetId)) {
|
|
120
|
+
const cycleStartIndex = currentPath.indexOf(targetId);
|
|
121
|
+
const cycle = currentPath.slice(cycleStartIndex);
|
|
122
|
+
cycle.push(targetId);
|
|
123
|
+
cycles.push(cycle);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
currentPath.pop();
|
|
127
|
+
recursionStack.delete(nodeId);
|
|
128
|
+
}
|
|
129
|
+
if (graph.entryPoint && graph.nodes.has(graph.entryPoint)) {
|
|
130
|
+
dfs(graph.entryPoint);
|
|
131
|
+
}
|
|
132
|
+
for (const nodeId of graph.nodes.keys()) {
|
|
133
|
+
if (!visited.has(nodeId)) {
|
|
134
|
+
dfs(nodeId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return cycles;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Detect nodes that cannot be reached from the entry point
|
|
141
|
+
*/
|
|
142
|
+
export function detectUnreachableNodes(graph) {
|
|
143
|
+
if (!graph.entryPoint) {
|
|
144
|
+
return Array.from(graph.nodes.keys());
|
|
145
|
+
}
|
|
146
|
+
const reachable = new Set();
|
|
147
|
+
const queue = [graph.entryPoint];
|
|
148
|
+
while (queue.length > 0) {
|
|
149
|
+
const nodeId = queue.shift();
|
|
150
|
+
if (reachable.has(nodeId)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
reachable.add(nodeId);
|
|
154
|
+
const node = graph.nodes.get(nodeId);
|
|
155
|
+
if (!node)
|
|
156
|
+
continue;
|
|
157
|
+
const edges = graph.edges.get(nodeId) || [];
|
|
158
|
+
for (const edge of edges) {
|
|
159
|
+
if (!reachable.has(edge.to)) {
|
|
160
|
+
queue.push(edge.to);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (node.type === WorkflowNodeTypes.PARALLEL_GROUP && node.parallelNodes) {
|
|
164
|
+
for (const parallelNodeId of node.parallelNodes) {
|
|
165
|
+
if (!reachable.has(parallelNodeId)) {
|
|
166
|
+
queue.push(parallelNodeId);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (node.type === WorkflowNodeTypes.MERGE_POINT && node.waitForNodes) {
|
|
171
|
+
for (const waitForNodeId of node.waitForNodes) {
|
|
172
|
+
if (!reachable.has(waitForNodeId)) {
|
|
173
|
+
queue.push(waitForNodeId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const unreachable = [];
|
|
179
|
+
for (const nodeId of graph.nodes.keys()) {
|
|
180
|
+
if (!reachable.has(nodeId)) {
|
|
181
|
+
unreachable.push(nodeId);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return unreachable;
|
|
185
|
+
}
|
|
186
|
+
export function detectOrphanNodes(graph) {
|
|
187
|
+
const hasOutgoing = new Set();
|
|
188
|
+
const hasIncoming = new Set();
|
|
189
|
+
for (const [fromId, edges] of graph.edges) {
|
|
190
|
+
if (edges.length > 0) {
|
|
191
|
+
hasOutgoing.add(fromId);
|
|
192
|
+
}
|
|
193
|
+
for (const edge of edges) {
|
|
194
|
+
hasIncoming.add(edge.to);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const orphans = [];
|
|
198
|
+
for (const nodeId of graph.nodes.keys()) {
|
|
199
|
+
if (nodeId === graph.entryPoint) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (graph.exitPoints && graph.exitPoints.includes(nodeId)) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (!hasOutgoing.has(nodeId) && !hasIncoming.has(nodeId)) {
|
|
206
|
+
orphans.push(nodeId);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return orphans;
|
|
210
|
+
}
|
|
211
|
+
export function calculateGraphDepth(graph) {
|
|
212
|
+
if (!graph.entryPoint) {
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
const depths = new Map();
|
|
216
|
+
const visited = new Set();
|
|
217
|
+
function dfs(nodeId, depth) {
|
|
218
|
+
if (visited.has(nodeId)) {
|
|
219
|
+
return depths.get(nodeId) || 0;
|
|
220
|
+
}
|
|
221
|
+
visited.add(nodeId);
|
|
222
|
+
depths.set(nodeId, depth);
|
|
223
|
+
const edges = graph.edges.get(nodeId) || [];
|
|
224
|
+
let maxDepth = depth;
|
|
225
|
+
for (const edge of edges) {
|
|
226
|
+
const childDepth = dfs(edge.to, depth + 1);
|
|
227
|
+
maxDepth = Math.max(maxDepth, childDepth);
|
|
228
|
+
}
|
|
229
|
+
return maxDepth;
|
|
230
|
+
}
|
|
231
|
+
return dfs(graph.entryPoint, 0);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=validate-workflow-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-workflow-graph.js","sourceRoot":"","sources":["../../src/utilities/validate-workflow-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { WorkflowGraph, EdgeCondition, STABLE_WORKFLOW_PHASE, STABLE_WORKFLOW_BRANCH, ConditionalEvaluationContext } from '../types/index.js';
|
|
2
|
+
export declare class WorkflowGraphBuilder<RequestDataType = any, ResponseDataType = any> {
|
|
3
|
+
private nodes;
|
|
4
|
+
private edges;
|
|
5
|
+
private entryPointId?;
|
|
6
|
+
private exitPointIds;
|
|
7
|
+
private metadata;
|
|
8
|
+
private enforceDAG;
|
|
9
|
+
addPhase(id: string, phase: STABLE_WORKFLOW_PHASE<RequestDataType, ResponseDataType>): this;
|
|
10
|
+
addBranch(id: string, branch: STABLE_WORKFLOW_BRANCH<RequestDataType, ResponseDataType>): this;
|
|
11
|
+
addConditional(id: string, evaluate: (context: ConditionalEvaluationContext<ResponseDataType>) => string | Promise<string>): this;
|
|
12
|
+
addParallelGroup(id: string, nodeIds: string[]): this;
|
|
13
|
+
addMergePoint(id: string, waitForNodes: string[]): this;
|
|
14
|
+
connect(from: string, to: string, options?: {
|
|
15
|
+
condition?: EdgeCondition;
|
|
16
|
+
weight?: number;
|
|
17
|
+
label?: string;
|
|
18
|
+
metadata?: Record<string, any>;
|
|
19
|
+
}): this;
|
|
20
|
+
connectSequence(...nodeIds: string[]): this;
|
|
21
|
+
connectToMany(from: string, toNodes: string[], condition?: EdgeCondition): this;
|
|
22
|
+
connectManyTo(fromNodes: string[], to: string, condition?: EdgeCondition): this;
|
|
23
|
+
setEntryPoint(id: string): this;
|
|
24
|
+
addExitPoint(id: string): this;
|
|
25
|
+
setMetadata(metadata: Record<string, any>): this;
|
|
26
|
+
setEnforceDAG(enforce: boolean): this;
|
|
27
|
+
build(): WorkflowGraph<RequestDataType, ResponseDataType>;
|
|
28
|
+
private detectExitPoints;
|
|
29
|
+
clear(): this;
|
|
30
|
+
getNodeCount(): number;
|
|
31
|
+
getEdgeCount(): number;
|
|
32
|
+
hasNode(id: string): boolean;
|
|
33
|
+
removeNode(id: string): this;
|
|
34
|
+
removeEdge(from: string, to: string): this;
|
|
35
|
+
}
|
|
36
|
+
export declare function createLinearWorkflowGraph<T = any, R = any>(phases: STABLE_WORKFLOW_PHASE<T, R>[]): WorkflowGraph<T, R>;
|
|
37
|
+
//# sourceMappingURL=workflow-graph-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-graph-builder.d.ts","sourceRoot":"","sources":["../../src/utilities/workflow-graph-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAGb,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC7B,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,oBAAoB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG;IAC7E,OAAO,CAAC,KAAK,CAAsE;IACnF,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,UAAU,CAAiB;IAEnC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAAG,IAAI;IAc3F,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAAG,IAAI;IAc9F,cAAc,CACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,OAAO,EAAE,4BAA4B,CAAC,gBAAgB,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAC9F,IAAI;IAcP,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAkBrD,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI;IAkBvD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC1C,SAAS,CAAC,EAAE,aAAa,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,IAAI;IAiBR,eAAe,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAO3C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI;IAO/E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI;IAO/E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ/B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAU9B,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAKhD,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKrC,KAAK,IAAI,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC;IA+BzD,OAAO,CAAC,gBAAgB;IAaxB,KAAK,IAAI,IAAI;IASb,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,MAAM;IAQtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI5B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAkB5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CAY3C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACxD,MAAM,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GACpC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAiBrB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { WorkflowNodeTypes } from '../enums/index.js';
|
|
2
|
+
import { detectCycles } from './validate-workflow-graph.js';
|
|
3
|
+
export class WorkflowGraphBuilder {
|
|
4
|
+
nodes = new Map();
|
|
5
|
+
edges = new Map();
|
|
6
|
+
entryPointId;
|
|
7
|
+
exitPointIds = [];
|
|
8
|
+
metadata = {};
|
|
9
|
+
enforceDAG = true;
|
|
10
|
+
addPhase(id, phase) {
|
|
11
|
+
if (this.nodes.has(id)) {
|
|
12
|
+
throw new Error(`Node with id '${id}' already exists`);
|
|
13
|
+
}
|
|
14
|
+
this.nodes.set(id, {
|
|
15
|
+
id,
|
|
16
|
+
type: WorkflowNodeTypes.PHASE,
|
|
17
|
+
phase: { ...phase, id }
|
|
18
|
+
});
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
addBranch(id, branch) {
|
|
22
|
+
if (this.nodes.has(id)) {
|
|
23
|
+
throw new Error(`Node with id '${id}' already exists`);
|
|
24
|
+
}
|
|
25
|
+
this.nodes.set(id, {
|
|
26
|
+
id,
|
|
27
|
+
type: WorkflowNodeTypes.BRANCH,
|
|
28
|
+
branch: { ...branch, id }
|
|
29
|
+
});
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
addConditional(id, evaluate) {
|
|
33
|
+
if (this.nodes.has(id)) {
|
|
34
|
+
throw new Error(`Node with id '${id}' already exists`);
|
|
35
|
+
}
|
|
36
|
+
this.nodes.set(id, {
|
|
37
|
+
id,
|
|
38
|
+
type: WorkflowNodeTypes.CONDITIONAL,
|
|
39
|
+
condition: { evaluate }
|
|
40
|
+
});
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
addParallelGroup(id, nodeIds) {
|
|
44
|
+
if (this.nodes.has(id)) {
|
|
45
|
+
throw new Error(`Node with id '${id}' already exists`);
|
|
46
|
+
}
|
|
47
|
+
if (nodeIds.length === 0) {
|
|
48
|
+
throw new Error('Parallel group must have at least one node');
|
|
49
|
+
}
|
|
50
|
+
this.nodes.set(id, {
|
|
51
|
+
id,
|
|
52
|
+
type: WorkflowNodeTypes.PARALLEL_GROUP,
|
|
53
|
+
parallelNodes: [...nodeIds]
|
|
54
|
+
});
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
addMergePoint(id, waitForNodes) {
|
|
58
|
+
if (this.nodes.has(id)) {
|
|
59
|
+
throw new Error(`Node with id '${id}' already exists`);
|
|
60
|
+
}
|
|
61
|
+
if (waitForNodes.length === 0) {
|
|
62
|
+
throw new Error('Merge point must wait for at least one node');
|
|
63
|
+
}
|
|
64
|
+
this.nodes.set(id, {
|
|
65
|
+
id,
|
|
66
|
+
type: WorkflowNodeTypes.MERGE_POINT,
|
|
67
|
+
waitForNodes: [...waitForNodes]
|
|
68
|
+
});
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
connect(from, to, options) {
|
|
72
|
+
if (!this.edges.has(from)) {
|
|
73
|
+
this.edges.set(from, []);
|
|
74
|
+
}
|
|
75
|
+
this.edges.get(from).push({
|
|
76
|
+
from,
|
|
77
|
+
to,
|
|
78
|
+
condition: options?.condition,
|
|
79
|
+
weight: options?.weight,
|
|
80
|
+
label: options?.label,
|
|
81
|
+
metadata: options?.metadata
|
|
82
|
+
});
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
connectSequence(...nodeIds) {
|
|
86
|
+
for (let i = 0; i < nodeIds.length - 1; i++) {
|
|
87
|
+
this.connect(nodeIds[i], nodeIds[i + 1]);
|
|
88
|
+
}
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
connectToMany(from, toNodes, condition) {
|
|
92
|
+
for (const to of toNodes) {
|
|
93
|
+
this.connect(from, to, { condition });
|
|
94
|
+
}
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
connectManyTo(fromNodes, to, condition) {
|
|
98
|
+
for (const from of fromNodes) {
|
|
99
|
+
this.connect(from, to, { condition });
|
|
100
|
+
}
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
setEntryPoint(id) {
|
|
104
|
+
if (!this.nodes.has(id)) {
|
|
105
|
+
throw new Error(`Entry point node '${id}' does not exist`);
|
|
106
|
+
}
|
|
107
|
+
this.entryPointId = id;
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
addExitPoint(id) {
|
|
111
|
+
if (!this.nodes.has(id)) {
|
|
112
|
+
throw new Error(`Exit point node '${id}' does not exist`);
|
|
113
|
+
}
|
|
114
|
+
if (!this.exitPointIds.includes(id)) {
|
|
115
|
+
this.exitPointIds.push(id);
|
|
116
|
+
}
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
setMetadata(metadata) {
|
|
120
|
+
this.metadata = { ...this.metadata, ...metadata };
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
setEnforceDAG(enforce) {
|
|
124
|
+
this.enforceDAG = enforce;
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
build() {
|
|
128
|
+
if (!this.entryPointId) {
|
|
129
|
+
throw new Error('Entry point must be set before building the graph');
|
|
130
|
+
}
|
|
131
|
+
if (this.exitPointIds.length === 0) {
|
|
132
|
+
this.exitPointIds = this.detectExitPoints();
|
|
133
|
+
}
|
|
134
|
+
const graph = {
|
|
135
|
+
nodes: new Map(this.nodes),
|
|
136
|
+
edges: new Map(this.edges),
|
|
137
|
+
entryPoint: this.entryPointId,
|
|
138
|
+
exitPoints: this.exitPointIds.length > 0 ? [...this.exitPointIds] : undefined,
|
|
139
|
+
metadata: { ...this.metadata }
|
|
140
|
+
};
|
|
141
|
+
if (this.enforceDAG) {
|
|
142
|
+
const cycles = detectCycles(graph);
|
|
143
|
+
if (cycles.length > 0) {
|
|
144
|
+
const cycleDescriptions = cycles.map((cycle) => cycle.join(' → ')).join('; ');
|
|
145
|
+
throw new Error(`Cannot build graph: DAG constraint violated. Found ${cycles.length} cycle(s): ${cycleDescriptions}. ` +
|
|
146
|
+
`Cycles must be removed to ensure workflow can complete. Use builder.setEnforceDAG(false) to disable this check.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return graph;
|
|
150
|
+
}
|
|
151
|
+
detectExitPoints() {
|
|
152
|
+
const exitPoints = [];
|
|
153
|
+
for (const [nodeId] of this.nodes) {
|
|
154
|
+
const outgoingEdges = this.edges.get(nodeId);
|
|
155
|
+
if (!outgoingEdges || outgoingEdges.length === 0) {
|
|
156
|
+
exitPoints.push(nodeId);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return exitPoints;
|
|
160
|
+
}
|
|
161
|
+
clear() {
|
|
162
|
+
this.nodes.clear();
|
|
163
|
+
this.edges.clear();
|
|
164
|
+
this.entryPointId = undefined;
|
|
165
|
+
this.exitPointIds = [];
|
|
166
|
+
this.metadata = {};
|
|
167
|
+
return this;
|
|
168
|
+
}
|
|
169
|
+
getNodeCount() {
|
|
170
|
+
return this.nodes.size;
|
|
171
|
+
}
|
|
172
|
+
getEdgeCount() {
|
|
173
|
+
let count = 0;
|
|
174
|
+
for (const edges of this.edges.values()) {
|
|
175
|
+
count += edges.length;
|
|
176
|
+
}
|
|
177
|
+
return count;
|
|
178
|
+
}
|
|
179
|
+
hasNode(id) {
|
|
180
|
+
return this.nodes.has(id);
|
|
181
|
+
}
|
|
182
|
+
removeNode(id) {
|
|
183
|
+
this.nodes.delete(id);
|
|
184
|
+
this.edges.delete(id);
|
|
185
|
+
for (const [nodeId, edges] of this.edges) {
|
|
186
|
+
const filteredEdges = edges.filter(edge => edge.to !== id);
|
|
187
|
+
if (filteredEdges.length === 0) {
|
|
188
|
+
this.edges.delete(nodeId);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.edges.set(nodeId, filteredEdges);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
this.exitPointIds = this.exitPointIds.filter(exitId => exitId !== id);
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
removeEdge(from, to) {
|
|
198
|
+
const edges = this.edges.get(from);
|
|
199
|
+
if (edges) {
|
|
200
|
+
const filteredEdges = edges.filter(edge => edge.to !== to);
|
|
201
|
+
if (filteredEdges.length === 0) {
|
|
202
|
+
this.edges.delete(from);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this.edges.set(from, filteredEdges);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return this;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export function createLinearWorkflowGraph(phases) {
|
|
212
|
+
const builder = new WorkflowGraphBuilder();
|
|
213
|
+
if (phases.length === 0) {
|
|
214
|
+
throw new Error('Cannot create workflow from empty phases array');
|
|
215
|
+
}
|
|
216
|
+
phases.forEach((phase, index) => {
|
|
217
|
+
const phaseId = phase.id || `phase-${index + 1}`;
|
|
218
|
+
builder.addPhase(phaseId, phase);
|
|
219
|
+
});
|
|
220
|
+
const phaseIds = phases.map((p, i) => p.id || `phase-${i + 1}`);
|
|
221
|
+
builder.connectSequence(...phaseIds);
|
|
222
|
+
builder.setEntryPoint(phaseIds[0]);
|
|
223
|
+
return builder.build();
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=workflow-graph-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-graph-builder.js","sourceRoot":"","sources":["../../src/utilities/workflow-graph-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emmvish/stable-request",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "A production-grade HTTP Workflow Execution Engine for Node.js that transforms unreliable API calls into resilient, observable, and sophisticated multi-phase workflows with intelligent retry strategies, circuit breakers, and advanced execution patterns.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|