flowcraft 2.8.0 → 2.8.1
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 -1
- package/dist/index-D3dyjW2G.d.mts +1269 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +727 -0
- package/dist/index.mjs.map +1 -0
- package/dist/replay-BB11M6K1.mjs +107 -0
- package/dist/replay-BB11M6K1.mjs.map +1 -0
- package/dist/runtime-CmefIAu_.mjs +2216 -0
- package/dist/runtime-CmefIAu_.mjs.map +1 -0
- package/dist/{sdk.d.ts → sdk.d.mts} +14 -12
- package/dist/sdk.mjs +29 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/testing/index.d.mts +172 -0
- package/dist/testing/index.mjs +277 -0
- package/dist/testing/index.mjs.map +1 -0
- package/package.json +13 -13
- package/dist/adapters/index.d.ts +0 -4
- package/dist/adapters/index.js +0 -4
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/persistent-event-bus.d.ts +0 -69
- package/dist/adapters/persistent-event-bus.js +0 -3
- package/dist/adapters/persistent-event-bus.js.map +0 -1
- package/dist/analysis.d.ts +0 -53
- package/dist/analysis.js +0 -3
- package/dist/analysis.js.map +0 -1
- package/dist/chunk-26VTGQAF.js +0 -103
- package/dist/chunk-26VTGQAF.js.map +0 -1
- package/dist/chunk-27STBUGG.js +0 -44
- package/dist/chunk-27STBUGG.js.map +0 -1
- package/dist/chunk-2TSADFQX.js +0 -46
- package/dist/chunk-2TSADFQX.js.map +0 -1
- package/dist/chunk-3Y5O5EGB.js +0 -3
- package/dist/chunk-3Y5O5EGB.js.map +0 -1
- package/dist/chunk-4JUPOFSL.js +0 -76
- package/dist/chunk-4JUPOFSL.js.map +0 -1
- package/dist/chunk-4PELJWF7.js +0 -29
- package/dist/chunk-4PELJWF7.js.map +0 -1
- package/dist/chunk-55J6XMHW.js +0 -3
- package/dist/chunk-55J6XMHW.js.map +0 -1
- package/dist/chunk-5A24LVGQ.js +0 -90
- package/dist/chunk-5A24LVGQ.js.map +0 -1
- package/dist/chunk-6RKHCJUU.js +0 -29
- package/dist/chunk-6RKHCJUU.js.map +0 -1
- package/dist/chunk-7EBKWATZ.js +0 -86
- package/dist/chunk-7EBKWATZ.js.map +0 -1
- package/dist/chunk-BC4G7OM6.js +0 -42
- package/dist/chunk-BC4G7OM6.js.map +0 -1
- package/dist/chunk-BCRWXTWX.js +0 -21
- package/dist/chunk-BCRWXTWX.js.map +0 -1
- package/dist/chunk-BV6MXL74.js +0 -340
- package/dist/chunk-BV6MXL74.js.map +0 -1
- package/dist/chunk-CIXL7AKH.js +0 -532
- package/dist/chunk-CIXL7AKH.js.map +0 -1
- package/dist/chunk-DL7KVYZF.js +0 -39
- package/dist/chunk-DL7KVYZF.js.map +0 -1
- package/dist/chunk-E6ICIXVR.js +0 -25
- package/dist/chunk-E6ICIXVR.js.map +0 -1
- package/dist/chunk-HFJXYY4E.js +0 -3
- package/dist/chunk-HFJXYY4E.js.map +0 -1
- package/dist/chunk-HNHM3FDK.js +0 -52
- package/dist/chunk-HNHM3FDK.js.map +0 -1
- package/dist/chunk-I53JB2KW.js +0 -26
- package/dist/chunk-I53JB2KW.js.map +0 -1
- package/dist/chunk-IDTYHLDQ.js +0 -16
- package/dist/chunk-IDTYHLDQ.js.map +0 -1
- package/dist/chunk-IKOTX22J.js +0 -85
- package/dist/chunk-IKOTX22J.js.map +0 -1
- package/dist/chunk-K446NZ4E.js +0 -25
- package/dist/chunk-K446NZ4E.js.map +0 -1
- package/dist/chunk-L3MX5MTA.js +0 -33
- package/dist/chunk-L3MX5MTA.js.map +0 -1
- package/dist/chunk-L46TQXCV.js +0 -144
- package/dist/chunk-L46TQXCV.js.map +0 -1
- package/dist/chunk-LM4ACVHL.js +0 -73
- package/dist/chunk-LM4ACVHL.js.map +0 -1
- package/dist/chunk-LNK7LZER.js +0 -51
- package/dist/chunk-LNK7LZER.js.map +0 -1
- package/dist/chunk-NVLZFLYM.js +0 -3
- package/dist/chunk-NVLZFLYM.js.map +0 -1
- package/dist/chunk-ONH7PIJZ.js +0 -300
- package/dist/chunk-ONH7PIJZ.js.map +0 -1
- package/dist/chunk-OOJEXFYY.js +0 -47
- package/dist/chunk-OOJEXFYY.js.map +0 -1
- package/dist/chunk-PH2IYZHV.js +0 -48
- package/dist/chunk-PH2IYZHV.js.map +0 -1
- package/dist/chunk-PU2VTWJD.js +0 -164
- package/dist/chunk-PU2VTWJD.js.map +0 -1
- package/dist/chunk-QA2WDZPV.js +0 -74
- package/dist/chunk-QA2WDZPV.js.map +0 -1
- package/dist/chunk-RM677CNU.js +0 -52
- package/dist/chunk-RM677CNU.js.map +0 -1
- package/dist/chunk-TKSSRS5U.js +0 -39
- package/dist/chunk-TKSSRS5U.js.map +0 -1
- package/dist/chunk-UNORA7EM.js +0 -103
- package/dist/chunk-UNORA7EM.js.map +0 -1
- package/dist/chunk-VZ4BRDBK.js +0 -54
- package/dist/chunk-VZ4BRDBK.js.map +0 -1
- package/dist/chunk-X5RJOZY2.js +0 -279
- package/dist/chunk-X5RJOZY2.js.map +0 -1
- package/dist/chunk-ZETQCNEF.js +0 -139
- package/dist/chunk-ZETQCNEF.js.map +0 -1
- package/dist/chunk-ZKINHLMS.js +0 -230
- package/dist/chunk-ZKINHLMS.js.map +0 -1
- package/dist/chunk-ZLW4QOTS.js +0 -192
- package/dist/chunk-ZLW4QOTS.js.map +0 -1
- package/dist/container-factory.d.ts +0 -17
- package/dist/container-factory.js +0 -13
- package/dist/container-factory.js.map +0 -1
- package/dist/container.d.ts +0 -23
- package/dist/container.js +0 -3
- package/dist/container.js.map +0 -1
- package/dist/context.d.ts +0 -65
- package/dist/context.js +0 -3
- package/dist/context.js.map +0 -1
- package/dist/error-mapper.d.ts +0 -15
- package/dist/error-mapper.js +0 -4
- package/dist/error-mapper.js.map +0 -1
- package/dist/errors.d.ts +0 -20
- package/dist/errors.js +0 -3
- package/dist/errors.js.map +0 -1
- package/dist/evaluator.d.ts +0 -32
- package/dist/evaluator.js +0 -3
- package/dist/evaluator.js.map +0 -1
- package/dist/flow.d.ts +0 -83
- package/dist/flow.js +0 -4
- package/dist/flow.js.map +0 -1
- package/dist/index.d.ts +0 -18
- package/dist/index.js +0 -38
- package/dist/index.js.map +0 -1
- package/dist/linter.d.ts +0 -26
- package/dist/linter.js +0 -4
- package/dist/linter.js.map +0 -1
- package/dist/logger.d.ts +0 -20
- package/dist/logger.js +0 -3
- package/dist/logger.js.map +0 -1
- package/dist/node.d.ts +0 -3
- package/dist/node.js +0 -3
- package/dist/node.js.map +0 -1
- package/dist/nodes/batch-gather.d.ts +0 -9
- package/dist/nodes/batch-gather.js +0 -4
- package/dist/nodes/batch-gather.js.map +0 -1
- package/dist/nodes/batch-scatter.d.ts +0 -9
- package/dist/nodes/batch-scatter.js +0 -4
- package/dist/nodes/batch-scatter.js.map +0 -1
- package/dist/nodes/sleep.d.ts +0 -9
- package/dist/nodes/sleep.js +0 -4
- package/dist/nodes/sleep.js.map +0 -1
- package/dist/nodes/subflow.d.ts +0 -9
- package/dist/nodes/subflow.js +0 -10
- package/dist/nodes/subflow.js.map +0 -1
- package/dist/nodes/wait.d.ts +0 -9
- package/dist/nodes/wait.js +0 -4
- package/dist/nodes/wait.js.map +0 -1
- package/dist/nodes/webhook.d.ts +0 -13
- package/dist/nodes/webhook.js +0 -4
- package/dist/nodes/webhook.js.map +0 -1
- package/dist/runtime/adapter.d.ts +0 -114
- package/dist/runtime/adapter.js +0 -28
- package/dist/runtime/adapter.js.map +0 -1
- package/dist/runtime/builtin-keys.d.ts +0 -38
- package/dist/runtime/builtin-keys.js +0 -10
- package/dist/runtime/builtin-keys.js.map +0 -1
- package/dist/runtime/execution-context.d.ts +0 -3
- package/dist/runtime/execution-context.js +0 -6
- package/dist/runtime/execution-context.js.map +0 -1
- package/dist/runtime/executors.d.ts +0 -3
- package/dist/runtime/executors.js +0 -4
- package/dist/runtime/executors.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -7
- package/dist/runtime/index.js +0 -31
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/node-executor-factory.d.ts +0 -12
- package/dist/runtime/node-executor-factory.js +0 -6
- package/dist/runtime/node-executor-factory.js.map +0 -1
- package/dist/runtime/orchestrator.d.ts +0 -9
- package/dist/runtime/orchestrator.js +0 -8
- package/dist/runtime/orchestrator.js.map +0 -1
- package/dist/runtime/orchestrators/replay.d.ts +0 -45
- package/dist/runtime/orchestrators/replay.js +0 -3
- package/dist/runtime/orchestrators/replay.js.map +0 -1
- package/dist/runtime/orchestrators/step-by-step.d.ts +0 -16
- package/dist/runtime/orchestrators/step-by-step.js +0 -5
- package/dist/runtime/orchestrators/step-by-step.js.map +0 -1
- package/dist/runtime/orchestrators/utils.d.ts +0 -35
- package/dist/runtime/orchestrators/utils.js +0 -4
- package/dist/runtime/orchestrators/utils.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -3
- package/dist/runtime/runtime.js +0 -27
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/scheduler.d.ts +0 -3
- package/dist/runtime/scheduler.js +0 -3
- package/dist/runtime/scheduler.js.map +0 -1
- package/dist/runtime/state.d.ts +0 -3
- package/dist/runtime/state.js +0 -5
- package/dist/runtime/state.js.map +0 -1
- package/dist/runtime/traverser.d.ts +0 -3
- package/dist/runtime/traverser.js +0 -5
- package/dist/runtime/traverser.js.map +0 -1
- package/dist/runtime/types.d.ts +0 -3
- package/dist/runtime/types.js +0 -3
- package/dist/runtime/types.js.map +0 -1
- package/dist/runtime/workflow-logic-handler.d.ts +0 -17
- package/dist/runtime/workflow-logic-handler.js +0 -5
- package/dist/runtime/workflow-logic-handler.js.map +0 -1
- package/dist/sanitizer.d.ts +0 -12
- package/dist/sanitizer.js +0 -3
- package/dist/sanitizer.js.map +0 -1
- package/dist/sdk.js +0 -20
- package/dist/sdk.js.map +0 -1
- package/dist/serializer.d.ts +0 -18
- package/dist/serializer.js +0 -3
- package/dist/serializer.js.map +0 -1
- package/dist/testing/event-logger.d.ts +0 -63
- package/dist/testing/event-logger.js +0 -3
- package/dist/testing/event-logger.js.map +0 -1
- package/dist/testing/index.d.ts +0 -7
- package/dist/testing/index.js +0 -37
- package/dist/testing/index.js.map +0 -1
- package/dist/testing/run-with-trace.d.ts +0 -38
- package/dist/testing/run-with-trace.js +0 -33
- package/dist/testing/run-with-trace.js.map +0 -1
- package/dist/testing/stepper.d.ts +0 -79
- package/dist/testing/stepper.js +0 -11
- package/dist/testing/stepper.js.map +0 -1
- package/dist/types-Biip2gLh.d.ts +0 -676
- package/dist/types.d.ts +0 -3
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
package/dist/chunk-ZKINHLMS.js
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
|
|
2
|
-
import { FlowcraftError } from './chunk-BCRWXTWX.js';
|
|
3
|
-
|
|
4
|
-
// src/runtime/traverser.ts
|
|
5
|
-
var GraphTraverser = class _GraphTraverser {
|
|
6
|
-
frontier = /* @__PURE__ */ new Set();
|
|
7
|
-
allPredecessors;
|
|
8
|
-
allSuccessors;
|
|
9
|
-
dynamicBlueprint;
|
|
10
|
-
completedNodes = /* @__PURE__ */ new Set();
|
|
11
|
-
nodesInLoops;
|
|
12
|
-
constructor(blueprint, isStrictMode = false) {
|
|
13
|
-
this.dynamicBlueprint = structuredClone(blueprint);
|
|
14
|
-
this.allPredecessors = /* @__PURE__ */ new Map();
|
|
15
|
-
this.allSuccessors = /* @__PURE__ */ new Map();
|
|
16
|
-
this.nodesInLoops = /* @__PURE__ */ new Map();
|
|
17
|
-
for (const node of this.dynamicBlueprint.nodes) {
|
|
18
|
-
this.allPredecessors.set(node.id, /* @__PURE__ */ new Set());
|
|
19
|
-
this.allSuccessors.set(node.id, /* @__PURE__ */ new Set());
|
|
20
|
-
}
|
|
21
|
-
for (const edge of this.dynamicBlueprint.edges) {
|
|
22
|
-
this.getPredecessors(edge.target).add(edge.source);
|
|
23
|
-
}
|
|
24
|
-
for (const edge of this.dynamicBlueprint.edges) {
|
|
25
|
-
this.getSuccessors(edge.source).add(edge.target);
|
|
26
|
-
}
|
|
27
|
-
const analysis = analyzeBlueprint(blueprint);
|
|
28
|
-
this.filterNodesInLoops(blueprint);
|
|
29
|
-
this.frontier = new Set(analysis.startNodeIds.filter((id) => !this.isFallbackNode(id)));
|
|
30
|
-
if (this.frontier.size === 0 && analysis.cycles.length > 0 && !isStrictMode) {
|
|
31
|
-
const uniqueStartNodes = /* @__PURE__ */ new Set();
|
|
32
|
-
const cycleEntryPoints = new Set(blueprint.metadata?.cycleEntryPoints || []);
|
|
33
|
-
for (const cycle of analysis.cycles) {
|
|
34
|
-
if (cycle.length > 0) {
|
|
35
|
-
const entryPoint = cycle.find((node) => cycleEntryPoints.has(node));
|
|
36
|
-
uniqueStartNodes.add(entryPoint || cycle[0]);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
this.frontier = new Set(uniqueStartNodes);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Clears all nodes from the execution frontier.
|
|
44
|
-
*/
|
|
45
|
-
clearFrontier() {
|
|
46
|
-
this.frontier.clear();
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Creates and initializes a GraphTraverser from a saved workflow state.
|
|
50
|
-
* This is the correct way to prepare a traverser for a `resume` operation.
|
|
51
|
-
* @param blueprint The workflow blueprint.
|
|
52
|
-
* @param state The workflow state being resumed.
|
|
53
|
-
* @returns A configured GraphTraverser instance.
|
|
54
|
-
*/
|
|
55
|
-
static fromState(blueprint, state) {
|
|
56
|
-
const traverser = new _GraphTraverser(blueprint);
|
|
57
|
-
traverser.clearFrontier();
|
|
58
|
-
const completedNodes = state.getCompletedNodes();
|
|
59
|
-
traverser.completedNodes = new Set(completedNodes);
|
|
60
|
-
for (const node of traverser.dynamicBlueprint.nodes) {
|
|
61
|
-
if (traverser.completedNodes.has(node.id)) continue;
|
|
62
|
-
const requiredPredecessors = traverser.allPredecessors.get(node.id);
|
|
63
|
-
const joinStrategy = traverser.getJoinStrategy(node.id);
|
|
64
|
-
if (!requiredPredecessors || requiredPredecessors.size === 0) {
|
|
65
|
-
traverser.frontier.add(node.id);
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
const completedPredecessors = [...requiredPredecessors].filter((p) => traverser.completedNodes.has(p));
|
|
69
|
-
const isReady = joinStrategy === "any" ? completedPredecessors.length > 0 : completedPredecessors.length === requiredPredecessors.size;
|
|
70
|
-
if (isReady) traverser.frontier.add(node.id);
|
|
71
|
-
}
|
|
72
|
-
return traverser;
|
|
73
|
-
}
|
|
74
|
-
isFallbackNode(nodeId) {
|
|
75
|
-
return this.dynamicBlueprint.nodes.some((n) => n.config?.fallback === nodeId);
|
|
76
|
-
}
|
|
77
|
-
getJoinStrategy(nodeId) {
|
|
78
|
-
const node = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId);
|
|
79
|
-
const baseJoinStrategy = node?.config?.joinStrategy || "all";
|
|
80
|
-
return baseJoinStrategy;
|
|
81
|
-
}
|
|
82
|
-
filterNodesInLoops(blueprint) {
|
|
83
|
-
blueprint.nodes.forEach((node) => {
|
|
84
|
-
if (node.uses !== "loop-controller") return;
|
|
85
|
-
const nextInLoopId = blueprint.edges.find((e) => e.source === node.id && e.action === "continue")?.target;
|
|
86
|
-
if (!nextInLoopId) {
|
|
87
|
-
throw new FlowcraftError(
|
|
88
|
-
`Loop '${node.id}' has no continue edge to start node. Ensure edges are wired inside the loop and incoming/breaking edges point to the loop controller.`,
|
|
89
|
-
{ nodeId: node.id, blueprintId: blueprint.id }
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
const set = /* @__PURE__ */ new Set();
|
|
93
|
-
set.add(nextInLoopId);
|
|
94
|
-
this.nodesInLoops.set(node.id, this.getAllLoopSuccessors(nextInLoopId, blueprint, set));
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
getAllLoopSuccessors(nodeId, blueprint, set) {
|
|
98
|
-
this.getSuccessors(nodeId).forEach((successor) => {
|
|
99
|
-
if (set.has(successor)) return;
|
|
100
|
-
const node = this.getNode(successor, blueprint);
|
|
101
|
-
if (!node || node.uses === "loop-controller") return;
|
|
102
|
-
set.add(successor);
|
|
103
|
-
this.getAllLoopSuccessors(successor, blueprint, set);
|
|
104
|
-
});
|
|
105
|
-
return set;
|
|
106
|
-
}
|
|
107
|
-
getReadyNodes() {
|
|
108
|
-
const readyNodes = [];
|
|
109
|
-
for (const nodeId of this.frontier) {
|
|
110
|
-
const nodeDef = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId);
|
|
111
|
-
if (nodeDef) {
|
|
112
|
-
readyNodes.push({ nodeId, nodeDef });
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
this.frontier.clear();
|
|
116
|
-
return readyNodes;
|
|
117
|
-
}
|
|
118
|
-
hasMoreWork() {
|
|
119
|
-
return this.frontier.size > 0;
|
|
120
|
-
}
|
|
121
|
-
markNodeCompleted(nodeId, result, nextNodes) {
|
|
122
|
-
this.completedNodes.add(nodeId);
|
|
123
|
-
if (result?.dynamicNodes && result.dynamicNodes.length > 0) {
|
|
124
|
-
const gatherNodeId = result.output?.gatherNodeId;
|
|
125
|
-
for (const dynamicNode of result.dynamicNodes) {
|
|
126
|
-
this.dynamicBlueprint.nodes.push(dynamicNode);
|
|
127
|
-
this.allPredecessors.set(dynamicNode.id, /* @__PURE__ */ new Set([nodeId]));
|
|
128
|
-
if (gatherNodeId) {
|
|
129
|
-
this.getPredecessors(gatherNodeId).add(dynamicNode.id);
|
|
130
|
-
}
|
|
131
|
-
this.frontier.add(dynamicNode.id);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
for (const node of nextNodes) {
|
|
135
|
-
const joinStrategy = this.getJoinStrategy(node.id);
|
|
136
|
-
if (joinStrategy !== "any" && this.completedNodes.has(node.id)) continue;
|
|
137
|
-
const requiredPredecessors = this.getPredecessors(node.id);
|
|
138
|
-
const isReady = joinStrategy === "any" ? requiredPredecessors.has(nodeId) : [...requiredPredecessors].every((p) => this.completedNodes.has(p));
|
|
139
|
-
if (isReady) {
|
|
140
|
-
this.frontier.add(node.id);
|
|
141
|
-
if (node.uses === "loop-controller") {
|
|
142
|
-
this.getNodesInLoop(node.id).forEach((id) => {
|
|
143
|
-
this.resetNodeCompletion(id);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (nextNodes.length === 0) {
|
|
149
|
-
for (const [potentialNextId, predecessors] of this.allPredecessors) {
|
|
150
|
-
if (predecessors.has(nodeId) && !this.completedNodes.has(potentialNextId)) {
|
|
151
|
-
const joinStrategy = this.getJoinStrategy(potentialNextId);
|
|
152
|
-
const isReady = joinStrategy === "any" ? predecessors.has(nodeId) : [...predecessors].every((p) => this.completedNodes.has(p));
|
|
153
|
-
if (isReady) {
|
|
154
|
-
this.frontier.add(potentialNextId);
|
|
155
|
-
const node = this.getNode(potentialNextId, this.dynamicBlueprint);
|
|
156
|
-
if (!node) continue;
|
|
157
|
-
if (node.uses === "loop-controller") {
|
|
158
|
-
this.getNodesInLoop(node.id).forEach((id) => {
|
|
159
|
-
this.resetNodeCompletion(id);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
getAllNodeIds() {
|
|
168
|
-
return new Set(this.dynamicBlueprint.nodes.map((n) => n.id));
|
|
169
|
-
}
|
|
170
|
-
getFallbackNodeIds() {
|
|
171
|
-
const fallbackNodeIds = /* @__PURE__ */ new Set();
|
|
172
|
-
for (const node of this.dynamicBlueprint.nodes) {
|
|
173
|
-
if (node.config?.fallback) fallbackNodeIds.add(node.config.fallback);
|
|
174
|
-
}
|
|
175
|
-
return fallbackNodeIds;
|
|
176
|
-
}
|
|
177
|
-
getCompletedNodes() {
|
|
178
|
-
return new Set(this.completedNodes);
|
|
179
|
-
}
|
|
180
|
-
getDynamicBlueprint() {
|
|
181
|
-
return this.dynamicBlueprint;
|
|
182
|
-
}
|
|
183
|
-
getAllPredecessors() {
|
|
184
|
-
return this.allPredecessors;
|
|
185
|
-
}
|
|
186
|
-
getAllSuccessors() {
|
|
187
|
-
return this.allSuccessors;
|
|
188
|
-
}
|
|
189
|
-
getPredecessors(nodeId) {
|
|
190
|
-
const predecessors = this.allPredecessors.get(nodeId);
|
|
191
|
-
if (!predecessors) return /* @__PURE__ */ new Set();
|
|
192
|
-
return predecessors;
|
|
193
|
-
}
|
|
194
|
-
getSuccessors(nodeId) {
|
|
195
|
-
const successors = this.allSuccessors.get(nodeId);
|
|
196
|
-
if (!successors) return /* @__PURE__ */ new Set();
|
|
197
|
-
return successors;
|
|
198
|
-
}
|
|
199
|
-
getNodesInLoop(id) {
|
|
200
|
-
const loopNodes = this.nodesInLoops.get(id);
|
|
201
|
-
if (!loopNodes) return /* @__PURE__ */ new Set();
|
|
202
|
-
return loopNodes;
|
|
203
|
-
}
|
|
204
|
-
resetNodeCompletion(nodeId) {
|
|
205
|
-
this.completedNodes.delete(nodeId);
|
|
206
|
-
}
|
|
207
|
-
getNode(nodeId, blueprint) {
|
|
208
|
-
return blueprint.nodes.find((n) => n.id === nodeId);
|
|
209
|
-
}
|
|
210
|
-
addDynamicNode(_nodeId, dynamicNode, predecessorId, gatherNodeId) {
|
|
211
|
-
this.dynamicBlueprint.nodes.push(dynamicNode);
|
|
212
|
-
this.allPredecessors.set(dynamicNode.id, /* @__PURE__ */ new Set([predecessorId]));
|
|
213
|
-
if (gatherNodeId) {
|
|
214
|
-
this.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id);
|
|
215
|
-
}
|
|
216
|
-
this.frontier.add(dynamicNode.id);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Manually adds a node ID back to the execution frontier.
|
|
220
|
-
* Used by orchestrators that need fine-grained control over steps.
|
|
221
|
-
* @param nodeId The ID of the node to add to the frontier.
|
|
222
|
-
*/
|
|
223
|
-
addToFrontier(nodeId) {
|
|
224
|
-
this.frontier.add(nodeId);
|
|
225
|
-
}
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
export { GraphTraverser };
|
|
229
|
-
//# sourceMappingURL=chunk-ZKINHLMS.js.map
|
|
230
|
-
//# sourceMappingURL=chunk-ZKINHLMS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/traverser.ts"],"names":[],"mappings":"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","file":"chunk-ZKINHLMS.js","sourcesContent":["import { analyzeBlueprint } from '../analysis'\nimport { FlowcraftError } from '../errors'\nimport type { NodeDefinition, NodeResult, WorkflowBlueprint } from '../types'\nimport type { WorkflowState } from './state'\n\nexport interface ReadyNode {\n\tnodeId: string\n\tnodeDef: NodeDefinition\n}\n\nexport class GraphTraverser {\n\tprivate frontier = new Set<string>()\n\tprivate allPredecessors: Map<string, Set<string>>\n\tprivate allSuccessors: Map<string, Set<string>>\n\tprivate dynamicBlueprint: WorkflowBlueprint\n\tprivate completedNodes = new Set<string>()\n\tprivate nodesInLoops: Map<string, Set<string>>\n\n\tconstructor(blueprint: WorkflowBlueprint, isStrictMode: boolean = false) {\n\t\tthis.dynamicBlueprint = structuredClone(blueprint) as WorkflowBlueprint\n\t\tthis.allPredecessors = new Map<string, Set<string>>()\n\t\tthis.allSuccessors = new Map<string, Set<string>>()\n\t\tthis.nodesInLoops = new Map<string, Set<string>>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tthis.allPredecessors.set(node.id, new Set())\n\t\t\tthis.allSuccessors.set(node.id, new Set())\n\t\t}\n\t\tfor (const edge of this.dynamicBlueprint.edges) {\n\t\t\tthis.getPredecessors(edge.target).add(edge.source)\n\t\t}\n\t\tfor (const edge of this.dynamicBlueprint.edges) {\n\t\t\tthis.getSuccessors(edge.source).add(edge.target)\n\t\t}\n\t\tconst analysis = analyzeBlueprint(blueprint)\n\t\tthis.filterNodesInLoops(blueprint)\n\t\tthis.frontier = new Set(analysis.startNodeIds.filter((id) => !this.isFallbackNode(id)))\n\t\tif (this.frontier.size === 0 && analysis.cycles.length > 0 && !isStrictMode) {\n\t\t\tconst uniqueStartNodes = new Set<string>()\n\t\t\tconst cycleEntryPoints = new Set(blueprint.metadata?.cycleEntryPoints || [])\n\t\t\tfor (const cycle of analysis.cycles) {\n\t\t\t\tif (cycle.length > 0) {\n\t\t\t\t\tconst entryPoint = cycle.find((node) => cycleEntryPoints.has(node))\n\t\t\t\t\tuniqueStartNodes.add(entryPoint || cycle[0])\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.frontier = new Set(uniqueStartNodes)\n\t\t}\n\t}\n\n\t/**\n\t * Clears all nodes from the execution frontier.\n\t */\n\tpublic clearFrontier(): void {\n\t\tthis.frontier.clear()\n\t}\n\n\t/**\n\t * Creates and initializes a GraphTraverser from a saved workflow state.\n\t * This is the correct way to prepare a traverser for a `resume` operation.\n\t * @param blueprint The workflow blueprint.\n\t * @param state The workflow state being resumed.\n\t * @returns A configured GraphTraverser instance.\n\t */\n\tpublic static fromState(blueprint: WorkflowBlueprint, state: WorkflowState<any>): GraphTraverser {\n\t\tconst traverser = new GraphTraverser(blueprint)\n\n\t\t// clear auto-populated frontier from constructor\n\t\ttraverser.clearFrontier()\n\n\t\t// re-hydrate the set of completed nodes\n\t\tconst completedNodes = state.getCompletedNodes()\n\t\ttraverser.completedNodes = new Set(completedNodes)\n\n\t\tfor (const node of traverser.dynamicBlueprint.nodes) {\n\t\t\tif (traverser.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = traverser.allPredecessors.get(node.id)\n\t\t\tconst joinStrategy = traverser.getJoinStrategy(node.id)\n\n\t\t\t// if no predecessors and not completed, it's a start node and should be in the frontier\n\t\t\tif (!requiredPredecessors || requiredPredecessors.size === 0) {\n\t\t\t\ttraverser.frontier.add(node.id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst completedPredecessors = [...requiredPredecessors].filter((p) => traverser.completedNodes.has(p))\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? completedPredecessors.length > 0\n\t\t\t\t\t: completedPredecessors.length === requiredPredecessors.size\n\n\t\t\tif (isReady) traverser.frontier.add(node.id)\n\t\t}\n\n\t\treturn traverser\n\t}\n\n\tprivate isFallbackNode(nodeId: string): boolean {\n\t\treturn this.dynamicBlueprint.nodes.some((n) => n.config?.fallback === nodeId)\n\t}\n\n\tprivate getJoinStrategy(nodeId: string): 'any' | 'all' {\n\t\tconst node = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\tconst baseJoinStrategy = node?.config?.joinStrategy || 'all'\n\t\treturn baseJoinStrategy\n\t}\n\n\tprivate filterNodesInLoops(blueprint: WorkflowBlueprint): void {\n\t\tblueprint.nodes.forEach((node) => {\n\t\t\tif (node.uses !== 'loop-controller') return\n\n\t\t\tconst nextInLoopId = blueprint.edges.find((e) => e.source === node.id && e.action === 'continue')?.target\n\t\t\tif (!nextInLoopId) {\n\t\t\t\tthrow new FlowcraftError(\n\t\t\t\t\t`Loop '${node.id}' has no continue edge to start node. ` +\n\t\t\t\t\t\t`Ensure edges are wired inside the loop and incoming/breaking edges point to the loop controller.`,\n\t\t\t\t\t{ nodeId: node.id, blueprintId: blueprint.id },\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst set: Set<string> = new Set()\n\t\t\tset.add(nextInLoopId)\n\t\t\tthis.nodesInLoops.set(node.id, this.getAllLoopSuccessors(nextInLoopId, blueprint, set))\n\t\t})\n\t}\n\n\tprivate getAllLoopSuccessors(nodeId: string, blueprint: WorkflowBlueprint, set: Set<string>): Set<string> {\n\t\tthis.getSuccessors(nodeId).forEach((successor) => {\n\t\t\tif (set.has(successor)) return\n\t\t\tconst node = this.getNode(successor, blueprint)\n\t\t\tif (!node || node.uses === 'loop-controller') return\n\t\t\tset.add(successor)\n\t\t\tthis.getAllLoopSuccessors(successor, blueprint, set)\n\t\t})\n\t\treturn set\n\t}\n\n\tgetReadyNodes(): ReadyNode[] {\n\t\tconst readyNodes: ReadyNode[] = []\n\t\tfor (const nodeId of this.frontier) {\n\t\t\tconst nodeDef = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\t\tif (nodeDef) {\n\t\t\t\treadyNodes.push({ nodeId, nodeDef })\n\t\t\t}\n\t\t}\n\t\tthis.frontier.clear()\n\t\treturn readyNodes\n\t}\n\n\thasMoreWork(): boolean {\n\t\treturn this.frontier.size > 0\n\t}\n\n\tmarkNodeCompleted(nodeId: string, result: NodeResult<any, any>, nextNodes: NodeDefinition[]): void {\n\t\tthis.completedNodes.add(nodeId)\n\n\t\tif (result?.dynamicNodes && result.dynamicNodes.length > 0) {\n\t\t\tconst gatherNodeId = result.output?.gatherNodeId\n\t\t\tfor (const dynamicNode of result.dynamicNodes) {\n\t\t\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\t\t\tthis.allPredecessors.set(dynamicNode.id, new Set([nodeId]))\n\t\t\t\tif (gatherNodeId) {\n\t\t\t\t\tthis.getPredecessors(gatherNodeId).add(dynamicNode.id)\n\t\t\t\t}\n\t\t\t\tthis.frontier.add(dynamicNode.id)\n\t\t\t}\n\t\t}\n\n\t\tfor (const node of nextNodes) {\n\t\t\tconst joinStrategy = this.getJoinStrategy(node.id)\n\t\t\tif (joinStrategy !== 'any' && this.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = this.getPredecessors(node.id)\n\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? requiredPredecessors.has(nodeId)\n\t\t\t\t\t: [...requiredPredecessors].every((p) => this.completedNodes.has(p))\n\n\t\t\tif (isReady) {\n\t\t\t\tthis.frontier.add(node.id)\n\t\t\t\t// reset to uncompleted for all nodes in a loop\n\t\t\t\tif (node.uses === 'loop-controller') {\n\t\t\t\t\tthis.getNodesInLoop(node.id).forEach((id) => {\n\t\t\t\t\t\tthis.resetNodeCompletion(id)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (nextNodes.length === 0) {\n\t\t\tfor (const [potentialNextId, predecessors] of this.allPredecessors) {\n\t\t\t\tif (predecessors.has(nodeId) && !this.completedNodes.has(potentialNextId)) {\n\t\t\t\t\tconst joinStrategy = this.getJoinStrategy(potentialNextId)\n\t\t\t\t\tconst isReady =\n\t\t\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t\t\t? predecessors.has(nodeId)\n\t\t\t\t\t\t\t: [...predecessors].every((p) => this.completedNodes.has(p))\n\t\t\t\t\tif (isReady) {\n\t\t\t\t\t\tthis.frontier.add(potentialNextId)\n\t\t\t\t\t\tconst node = this.getNode(potentialNextId, this.dynamicBlueprint)\n\t\t\t\t\t\tif (!node) continue\n\t\t\t\t\t\t// reset to uncompleted for all nodes in a loop\n\t\t\t\t\t\tif (node.uses === 'loop-controller') {\n\t\t\t\t\t\t\tthis.getNodesInLoop(node.id).forEach((id) => {\n\t\t\t\t\t\t\t\tthis.resetNodeCompletion(id)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAllNodeIds(): Set<string> {\n\t\treturn new Set(this.dynamicBlueprint.nodes.map((n) => n.id))\n\t}\n\n\tgetFallbackNodeIds(): Set<string> {\n\t\tconst fallbackNodeIds = new Set<string>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tif (node.config?.fallback) fallbackNodeIds.add(node.config.fallback)\n\t\t}\n\t\treturn fallbackNodeIds\n\t}\n\n\tgetCompletedNodes(): Set<string> {\n\t\treturn new Set(this.completedNodes)\n\t}\n\n\tgetDynamicBlueprint(): WorkflowBlueprint {\n\t\treturn this.dynamicBlueprint\n\t}\n\n\tgetAllPredecessors(): Map<string, Set<string>> {\n\t\treturn this.allPredecessors\n\t}\n\n\tgetAllSuccessors(): Map<string, Set<string>> {\n\t\treturn this.allSuccessors\n\t}\n\n\tgetPredecessors(nodeId: string): Set<string> {\n\t\tconst predecessors = this.allPredecessors.get(nodeId)\n\t\tif (!predecessors) return new Set()\n\t\treturn predecessors\n\t}\n\n\tgetSuccessors(nodeId: string): Set<string> {\n\t\tconst successors = this.allSuccessors.get(nodeId)\n\t\tif (!successors) return new Set()\n\t\treturn successors\n\t}\n\n\tgetNodesInLoop(id: string): Set<string> {\n\t\tconst loopNodes = this.nodesInLoops.get(id)\n\t\tif (!loopNodes) return new Set()\n\t\treturn loopNodes\n\t}\n\n\tresetNodeCompletion(nodeId: string): void {\n\t\tthis.completedNodes.delete(nodeId)\n\t}\n\n\tgetNode(nodeId: string, blueprint: WorkflowBlueprint): NodeDefinition | undefined {\n\t\treturn blueprint.nodes.find((n) => n.id === nodeId)\n\t}\n\n\taddDynamicNode(_nodeId: string, dynamicNode: NodeDefinition, predecessorId: string, gatherNodeId?: string): void {\n\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\tthis.allPredecessors.set(dynamicNode.id, new Set([predecessorId]))\n\t\tif (gatherNodeId) {\n\t\t\tthis.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id)\n\t\t}\n\t\tthis.frontier.add(dynamicNode.id)\n\t}\n\n\t/**\n\t * Manually adds a node ID back to the execution frontier.\n\t * Used by orchestrators that need fine-grained control over steps.\n\t * @param nodeId The ID of the node to add to the frontier.\n\t */\n\tpublic addToFrontier(nodeId: string): void {\n\t\tthis.frontier.add(nodeId)\n\t}\n}\n"]}
|
package/dist/chunk-ZLW4QOTS.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// src/analysis.ts
|
|
2
|
-
function checkForCycles(blueprint) {
|
|
3
|
-
const cycles = [];
|
|
4
|
-
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
5
|
-
return cycles;
|
|
6
|
-
}
|
|
7
|
-
const allNodeIds = blueprint.nodes.map((node) => node.id);
|
|
8
|
-
const adj = /* @__PURE__ */ new Map();
|
|
9
|
-
for (const id of allNodeIds) {
|
|
10
|
-
adj.set(id, []);
|
|
11
|
-
}
|
|
12
|
-
for (const edge of blueprint.edges) {
|
|
13
|
-
adj.get(edge.source)?.push(edge.target);
|
|
14
|
-
}
|
|
15
|
-
const state = /* @__PURE__ */ new Map();
|
|
16
|
-
for (const id of allNodeIds) {
|
|
17
|
-
state.set(id, 0);
|
|
18
|
-
}
|
|
19
|
-
for (const startNode of allNodeIds) {
|
|
20
|
-
if (state.get(startNode) !== 0) continue;
|
|
21
|
-
const stack = [{ node: startNode, path: [] }];
|
|
22
|
-
const pathSet = /* @__PURE__ */ new Set();
|
|
23
|
-
while (stack.length > 0) {
|
|
24
|
-
const { node, path } = stack[stack.length - 1];
|
|
25
|
-
if (state.get(node) === 0) {
|
|
26
|
-
state.set(node, 1);
|
|
27
|
-
pathSet.add(node);
|
|
28
|
-
path.push(node);
|
|
29
|
-
}
|
|
30
|
-
const neighbors = adj.get(node) || [];
|
|
31
|
-
let foundUnvisited = false;
|
|
32
|
-
for (const neighbor of neighbors) {
|
|
33
|
-
if (state.get(neighbor) === 1) {
|
|
34
|
-
const cycleStartIndex = path.indexOf(neighbor);
|
|
35
|
-
const cycle = path.slice(cycleStartIndex);
|
|
36
|
-
cycles.push([...cycle, neighbor]);
|
|
37
|
-
} else if (state.get(neighbor) === 0) {
|
|
38
|
-
stack.push({ node: neighbor, path: [...path] });
|
|
39
|
-
foundUnvisited = true;
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (!foundUnvisited) {
|
|
44
|
-
state.set(node, 2);
|
|
45
|
-
stack.pop();
|
|
46
|
-
pathSet.delete(node);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return cycles;
|
|
51
|
-
}
|
|
52
|
-
function generateMermaid(blueprint) {
|
|
53
|
-
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
54
|
-
return "flowchart TD\n empty[Empty Blueprint]";
|
|
55
|
-
}
|
|
56
|
-
let mermaid = "flowchart TD\n";
|
|
57
|
-
for (const node of blueprint.nodes) {
|
|
58
|
-
const paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : "";
|
|
59
|
-
const nodeLabel = `${node.id}${paramsString}`;
|
|
60
|
-
mermaid += ` ${node.id}["${nodeLabel}"]
|
|
61
|
-
`;
|
|
62
|
-
}
|
|
63
|
-
for (const edge of blueprint.edges || []) {
|
|
64
|
-
const labelParts = [];
|
|
65
|
-
if (edge.action) {
|
|
66
|
-
labelParts.push(edge.action);
|
|
67
|
-
}
|
|
68
|
-
if (edge.condition) {
|
|
69
|
-
labelParts.push(edge.condition);
|
|
70
|
-
}
|
|
71
|
-
if (edge.transform) {
|
|
72
|
-
labelParts.push(edge.transform);
|
|
73
|
-
}
|
|
74
|
-
if (labelParts.length > 0) {
|
|
75
|
-
const edgeLabel = labelParts.join(" | ");
|
|
76
|
-
mermaid += ` ${edge.source} -- "${edgeLabel}" --> ${edge.target}
|
|
77
|
-
`;
|
|
78
|
-
} else {
|
|
79
|
-
mermaid += ` ${edge.source} --> ${edge.target}
|
|
80
|
-
`;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return mermaid;
|
|
84
|
-
}
|
|
85
|
-
function generateMermaidForRun(blueprint, events) {
|
|
86
|
-
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
87
|
-
return "flowchart TD\n empty[Empty Blueprint]";
|
|
88
|
-
}
|
|
89
|
-
let mermaid = "flowchart TD\n";
|
|
90
|
-
const successfulNodes = /* @__PURE__ */ new Set();
|
|
91
|
-
const failedNodes = /* @__PURE__ */ new Set();
|
|
92
|
-
const takenEdges = /* @__PURE__ */ new Set();
|
|
93
|
-
for (const event of events) {
|
|
94
|
-
switch (event.type) {
|
|
95
|
-
case "node:finish":
|
|
96
|
-
successfulNodes.add(event.payload.nodeId);
|
|
97
|
-
break;
|
|
98
|
-
case "node:error":
|
|
99
|
-
failedNodes.add(event.payload.nodeId);
|
|
100
|
-
break;
|
|
101
|
-
case "edge:evaluate":
|
|
102
|
-
if (event.payload.result) {
|
|
103
|
-
const edgeKey = `${event.payload.source}->${event.payload.target}`;
|
|
104
|
-
takenEdges.add(edgeKey);
|
|
105
|
-
}
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
for (const node of blueprint.nodes) {
|
|
110
|
-
const paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : "";
|
|
111
|
-
const nodeLabel = `${node.id}${paramsString}`;
|
|
112
|
-
mermaid += ` ${node.id}["${nodeLabel}"]
|
|
113
|
-
`;
|
|
114
|
-
}
|
|
115
|
-
for (const node of blueprint.nodes) {
|
|
116
|
-
if (successfulNodes.has(node.id)) {
|
|
117
|
-
mermaid += ` style ${node.id} fill:#d4edda,stroke:#c3e6cb
|
|
118
|
-
`;
|
|
119
|
-
} else if (failedNodes.has(node.id)) {
|
|
120
|
-
mermaid += ` style ${node.id} fill:#f8d7da,stroke:#f5c6cb
|
|
121
|
-
`;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
let edgeIndex = 0;
|
|
125
|
-
for (const edge of blueprint.edges || []) {
|
|
126
|
-
const labelParts = [];
|
|
127
|
-
if (edge.action) {
|
|
128
|
-
labelParts.push(edge.action);
|
|
129
|
-
}
|
|
130
|
-
if (edge.condition) {
|
|
131
|
-
labelParts.push(edge.condition);
|
|
132
|
-
}
|
|
133
|
-
if (edge.transform) {
|
|
134
|
-
labelParts.push(edge.transform);
|
|
135
|
-
}
|
|
136
|
-
const edgeKey = `${edge.source}->${edge.target}`;
|
|
137
|
-
const isTaken = takenEdges.has(edgeKey);
|
|
138
|
-
let edgeLine;
|
|
139
|
-
if (labelParts.length > 0) {
|
|
140
|
-
const edgeLabel = labelParts.join(" | ");
|
|
141
|
-
edgeLine = ` ${edge.source} -- "${edgeLabel}" --> ${edge.target}
|
|
142
|
-
`;
|
|
143
|
-
} else {
|
|
144
|
-
edgeLine = ` ${edge.source} --> ${edge.target}
|
|
145
|
-
`;
|
|
146
|
-
}
|
|
147
|
-
mermaid += edgeLine;
|
|
148
|
-
if (isTaken) {
|
|
149
|
-
mermaid += ` linkStyle ${edgeIndex} stroke:#007bff,stroke-width:3px
|
|
150
|
-
`;
|
|
151
|
-
}
|
|
152
|
-
edgeIndex++;
|
|
153
|
-
}
|
|
154
|
-
return mermaid;
|
|
155
|
-
}
|
|
156
|
-
function analyzeBlueprint(blueprint) {
|
|
157
|
-
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
158
|
-
return {
|
|
159
|
-
cycles: [],
|
|
160
|
-
startNodeIds: [],
|
|
161
|
-
terminalNodeIds: [],
|
|
162
|
-
nodeCount: 0,
|
|
163
|
-
edgeCount: 0,
|
|
164
|
-
isDag: true
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
const cycles = checkForCycles(blueprint);
|
|
168
|
-
const nodeCount = blueprint.nodes.length;
|
|
169
|
-
const edgeCount = blueprint.edges?.length || 0;
|
|
170
|
-
const nodesWithIncoming = /* @__PURE__ */ new Set();
|
|
171
|
-
for (const edge of blueprint.edges || []) {
|
|
172
|
-
nodesWithIncoming.add(edge.target);
|
|
173
|
-
}
|
|
174
|
-
const startNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithIncoming.has(nodeId));
|
|
175
|
-
const nodesWithOutgoing = /* @__PURE__ */ new Set();
|
|
176
|
-
for (const edge of blueprint.edges || []) {
|
|
177
|
-
nodesWithOutgoing.add(edge.source);
|
|
178
|
-
}
|
|
179
|
-
const terminalNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithOutgoing.has(nodeId));
|
|
180
|
-
return {
|
|
181
|
-
cycles,
|
|
182
|
-
startNodeIds,
|
|
183
|
-
terminalNodeIds,
|
|
184
|
-
nodeCount,
|
|
185
|
-
edgeCount,
|
|
186
|
-
isDag: cycles.length === 0
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export { analyzeBlueprint, checkForCycles, generateMermaid, generateMermaidForRun };
|
|
191
|
-
//# sourceMappingURL=chunk-ZLW4QOTS.js.map
|
|
192
|
-
//# sourceMappingURL=chunk-ZLW4QOTS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/analysis.ts"],"names":[],"mappings":"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","file":"chunk-ZLW4QOTS.js","sourcesContent":["import type { FlowcraftEvent, WorkflowBlueprint } from './types'\n\n/**\n * A list of cycles found in the graph. Each cycle is an array of node IDs.\n */\nexport type Cycles = string[][]\n\n/**\n * Analysis result for a workflow blueprint\n */\nexport interface BlueprintAnalysis {\n\t/** Cycles found in the graph */\n\tcycles: Cycles\n\t/** Node IDs that have no incoming edges (start nodes) */\n\tstartNodeIds: string[]\n\t/** Node IDs that have no outgoing edges (terminal nodes) */\n\tterminalNodeIds: string[]\n\t/** Total number of nodes */\n\tnodeCount: number\n\t/** Total number of edges */\n\tedgeCount: number\n\t/** Whether the graph is a valid DAG (no cycles) */\n\tisDag: boolean\n}\n\n/**\n * Analyzes a workflow blueprint to detect cycles using an iterative DFS algorithm.\n * This avoids stack overflow issues for deep graphs compared to the recursive version.\n * @param blueprint The WorkflowBlueprint object containing nodes and edges.\n * @returns An array of cycles found. Each cycle is represented as an array of node IDs.\n */\nexport function checkForCycles(blueprint: WorkflowBlueprint): Cycles {\n\tconst cycles: Cycles = []\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn cycles\n\t}\n\n\tconst allNodeIds = blueprint.nodes.map((node) => node.id)\n\tconst adj = new Map<string, string[]>()\n\tfor (const id of allNodeIds) {\n\t\tadj.set(id, [])\n\t}\n\tfor (const edge of blueprint.edges) {\n\t\tadj.get(edge.source)?.push(edge.target)\n\t}\n\n\t// 0 = not visited, 1 = visiting, 2 = visited\n\tconst state = new Map<string, number>()\n\tfor (const id of allNodeIds) {\n\t\tstate.set(id, 0)\n\t}\n\n\tfor (const startNode of allNodeIds) {\n\t\tif (state.get(startNode) !== 0) continue\n\n\t\tconst stack: { node: string; path: string[] }[] = [{ node: startNode, path: [] }]\n\t\tconst pathSet = new Set<string>()\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst { node, path } = stack[stack.length - 1]\n\n\t\t\tif (state.get(node) === 0) {\n\t\t\t\t// first visit\n\t\t\t\tstate.set(node, 1) // visiting\n\t\t\t\tpathSet.add(node)\n\t\t\t\tpath.push(node)\n\t\t\t}\n\n\t\t\tconst neighbors = adj.get(node) || []\n\t\t\tlet foundUnvisited = false\n\n\t\t\tfor (const neighbor of neighbors) {\n\t\t\t\tif (state.get(neighbor) === 1) {\n\t\t\t\t\t// back edge, cycle found\n\t\t\t\t\tconst cycleStartIndex = path.indexOf(neighbor)\n\t\t\t\t\tconst cycle = path.slice(cycleStartIndex)\n\t\t\t\t\tcycles.push([...cycle, neighbor])\n\t\t\t\t} else if (state.get(neighbor) === 0) {\n\t\t\t\t\t// unvisited neighbor\n\t\t\t\t\tstack.push({ node: neighbor, path: [...path] })\n\t\t\t\t\tfoundUnvisited = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!foundUnvisited) {\n\t\t\t\t// all neighbors visited\n\t\t\t\tstate.set(node, 2) // visited\n\t\t\t\tstack.pop()\n\t\t\t\tpathSet.delete(node)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn cycles\n}\n\n/**\n * Generates Mermaid diagram syntax from a WorkflowBlueprint\n * @param blueprint The WorkflowBlueprint object containing nodes and edges\n * @returns Mermaid syntax string for the flowchart\n */\nexport function generateMermaid(blueprint: WorkflowBlueprint): string {\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn 'flowchart TD\\n empty[Empty Blueprint]'\n\t}\n\n\tlet mermaid = 'flowchart TD\\n'\n\n\tfor (const node of blueprint.nodes) {\n\t\tconst paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : ''\n\t\tconst nodeLabel = `${node.id}${paramsString}`\n\t\tmermaid += ` ${node.id}[\"${nodeLabel}\"]\\n`\n\t}\n\n\tfor (const edge of blueprint.edges || []) {\n\t\tconst labelParts: string[] = []\n\n\t\tif (edge.action) {\n\t\t\tlabelParts.push(edge.action)\n\t\t}\n\t\tif (edge.condition) {\n\t\t\tlabelParts.push(edge.condition)\n\t\t}\n\t\tif (edge.transform) {\n\t\t\tlabelParts.push(edge.transform)\n\t\t}\n\n\t\tif (labelParts.length > 0) {\n\t\t\tconst edgeLabel = labelParts.join(' | ')\n\t\t\tmermaid += ` ${edge.source} -- \"${edgeLabel}\" --> ${edge.target}\\n`\n\t\t} else {\n\t\t\tmermaid += ` ${edge.source} --> ${edge.target}\\n`\n\t\t}\n\t}\n\n\treturn mermaid\n}\n\n/**\n * Generates Mermaid diagram syntax from a WorkflowBlueprint with execution history styling\n * @param blueprint The WorkflowBlueprint object containing nodes and edges\n * @param events Array of FlowcraftEvent objects from the workflow execution\n * @returns Mermaid syntax string for the flowchart with execution path highlighting\n */\nexport function generateMermaidForRun(blueprint: WorkflowBlueprint, events: FlowcraftEvent[]): string {\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn 'flowchart TD\\n empty[Empty Blueprint]'\n\t}\n\n\tlet mermaid = 'flowchart TD\\n'\n\n\tconst successfulNodes = new Set<string>()\n\tconst failedNodes = new Set<string>()\n\tconst takenEdges = new Set<string>()\n\n\tfor (const event of events) {\n\t\tswitch (event.type) {\n\t\t\tcase 'node:finish':\n\t\t\t\tsuccessfulNodes.add(event.payload.nodeId)\n\t\t\t\tbreak\n\t\t\tcase 'node:error':\n\t\t\t\tfailedNodes.add(event.payload.nodeId)\n\t\t\t\tbreak\n\t\t\tcase 'edge:evaluate':\n\t\t\t\tif (event.payload.result) {\n\t\t\t\t\tconst edgeKey = `${event.payload.source}->${event.payload.target}`\n\t\t\t\t\ttakenEdges.add(edgeKey)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tfor (const node of blueprint.nodes) {\n\t\tconst paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : ''\n\t\tconst nodeLabel = `${node.id}${paramsString}`\n\t\tmermaid += ` ${node.id}[\"${nodeLabel}\"]\\n`\n\t}\n\n\tfor (const node of blueprint.nodes) {\n\t\tif (successfulNodes.has(node.id)) {\n\t\t\tmermaid += ` style ${node.id} fill:#d4edda,stroke:#c3e6cb\\n`\n\t\t} else if (failedNodes.has(node.id)) {\n\t\t\tmermaid += ` style ${node.id} fill:#f8d7da,stroke:#f5c6cb\\n`\n\t\t}\n\t}\n\n\tlet edgeIndex = 0\n\tfor (const edge of blueprint.edges || []) {\n\t\tconst labelParts: string[] = []\n\n\t\tif (edge.action) {\n\t\t\tlabelParts.push(edge.action)\n\t\t}\n\t\tif (edge.condition) {\n\t\t\tlabelParts.push(edge.condition)\n\t\t}\n\t\tif (edge.transform) {\n\t\t\tlabelParts.push(edge.transform)\n\t\t}\n\n\t\tconst edgeKey = `${edge.source}->${edge.target}`\n\t\tconst isTaken = takenEdges.has(edgeKey)\n\n\t\tlet edgeLine: string\n\t\tif (labelParts.length > 0) {\n\t\t\tconst edgeLabel = labelParts.join(' | ')\n\t\t\tedgeLine = ` ${edge.source} -- \"${edgeLabel}\" --> ${edge.target}\\n`\n\t\t} else {\n\t\t\tedgeLine = ` ${edge.source} --> ${edge.target}\\n`\n\t\t}\n\n\t\tmermaid += edgeLine\n\n\t\tif (isTaken) {\n\t\t\tmermaid += ` linkStyle ${edgeIndex} stroke:#007bff,stroke-width:3px\\n`\n\t\t}\n\n\t\tedgeIndex++\n\t}\n\n\treturn mermaid\n}\n\n/**\n * Analyzes a workflow blueprint and returns comprehensive analysis\n * @param blueprint The WorkflowBlueprint object containing nodes and edges\n * @returns Analysis result with cycles, start nodes, terminal nodes, and other metrics\n */\nexport function analyzeBlueprint(blueprint: WorkflowBlueprint): BlueprintAnalysis {\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn {\n\t\t\tcycles: [],\n\t\t\tstartNodeIds: [],\n\t\t\tterminalNodeIds: [],\n\t\t\tnodeCount: 0,\n\t\t\tedgeCount: 0,\n\t\t\tisDag: true,\n\t\t}\n\t}\n\n\tconst cycles = checkForCycles(blueprint)\n\tconst nodeCount = blueprint.nodes.length\n\tconst edgeCount = blueprint.edges?.length || 0\n\n\tconst nodesWithIncoming = new Set<string>()\n\tfor (const edge of blueprint.edges || []) {\n\t\tnodesWithIncoming.add(edge.target)\n\t}\n\n\tconst startNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithIncoming.has(nodeId))\n\n\tconst nodesWithOutgoing = new Set<string>()\n\tfor (const edge of blueprint.edges || []) {\n\t\tnodesWithOutgoing.add(edge.source)\n\t}\n\n\tconst terminalNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithOutgoing.has(nodeId))\n\n\treturn {\n\t\tcycles,\n\t\tstartNodeIds,\n\t\tterminalNodeIds,\n\t\tnodeCount,\n\t\tedgeCount,\n\t\tisDag: cycles.length === 0,\n\t}\n}\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { DIContainer } from './container.js';
|
|
2
|
-
import { v as RuntimeDependencies, y as ILogger, D as ISerializer, x as IEvaluator, A as IEventBus, M as Middleware, o as NodeFunction, p as NodeClass, h as WorkflowBlueprint } from './types-Biip2gLh.js';
|
|
3
|
-
import './errors.js';
|
|
4
|
-
|
|
5
|
-
interface ContainerOptions<TDependencies extends RuntimeDependencies = RuntimeDependencies> {
|
|
6
|
-
logger?: ILogger;
|
|
7
|
-
serializer?: ISerializer;
|
|
8
|
-
evaluator?: IEvaluator;
|
|
9
|
-
eventBus?: IEventBus;
|
|
10
|
-
middleware?: Middleware[];
|
|
11
|
-
registry?: Record<string, NodeFunction | NodeClass>;
|
|
12
|
-
blueprints?: Record<string, WorkflowBlueprint>;
|
|
13
|
-
dependencies?: TDependencies;
|
|
14
|
-
}
|
|
15
|
-
declare function createDefaultContainer<TDependencies extends RuntimeDependencies = RuntimeDependencies>(options?: ContainerOptions<TDependencies>): DIContainer;
|
|
16
|
-
|
|
17
|
-
export { type ContainerOptions, createDefaultContainer };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { createDefaultContainer } from './chunk-E6ICIXVR.js';
|
|
2
|
-
import './chunk-QA2WDZPV.js';
|
|
3
|
-
import './chunk-26VTGQAF.js';
|
|
4
|
-
import './chunk-L3MX5MTA.js';
|
|
5
|
-
import './chunk-L46TQXCV.js';
|
|
6
|
-
import './chunk-4PELJWF7.js';
|
|
7
|
-
import './chunk-6RKHCJUU.js';
|
|
8
|
-
import './chunk-OOJEXFYY.js';
|
|
9
|
-
import './chunk-ZETQCNEF.js';
|
|
10
|
-
import './chunk-BCRWXTWX.js';
|
|
11
|
-
import './chunk-PH2IYZHV.js';
|
|
12
|
-
//# sourceMappingURL=container-factory.js.map
|
|
13
|
-
//# sourceMappingURL=container-factory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"container-factory.js"}
|
package/dist/container.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
type ServiceToken<_T = any> = string | symbol;
|
|
2
|
-
declare class DIContainer {
|
|
3
|
-
private services;
|
|
4
|
-
private factories;
|
|
5
|
-
register<T>(token: ServiceToken<T>, implementation: T): void;
|
|
6
|
-
registerFactory<T>(token: ServiceToken<T>, factory: (container: DIContainer) => T): void;
|
|
7
|
-
resolve<T>(token: ServiceToken<T>): T;
|
|
8
|
-
has(token: ServiceToken): boolean;
|
|
9
|
-
createChild(): DIContainer;
|
|
10
|
-
}
|
|
11
|
-
declare const ServiceTokens: {
|
|
12
|
-
readonly Logger: symbol;
|
|
13
|
-
readonly Serializer: symbol;
|
|
14
|
-
readonly Evaluator: symbol;
|
|
15
|
-
readonly EventBus: symbol;
|
|
16
|
-
readonly Orchestrator: symbol;
|
|
17
|
-
readonly Middleware: symbol;
|
|
18
|
-
readonly NodeRegistry: symbol;
|
|
19
|
-
readonly BlueprintRegistry: symbol;
|
|
20
|
-
readonly Dependencies: symbol;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export { DIContainer, type ServiceToken, ServiceTokens };
|
package/dist/container.js
DELETED
package/dist/container.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"container.js"}
|
package/dist/context.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { t as ISyncContext, u as IAsyncContext, P as PatchOperation } from './types-Biip2gLh.js';
|
|
2
|
-
import './errors.js';
|
|
3
|
-
import './container.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A default, high-performance, in-memory implementation of ISyncContext using a Map.
|
|
7
|
-
*/
|
|
8
|
-
declare class Context<TContext extends Record<string, any>> implements ISyncContext<TContext> {
|
|
9
|
-
readonly type: "sync";
|
|
10
|
-
private data;
|
|
11
|
-
constructor(initialData?: Partial<TContext>);
|
|
12
|
-
get<K extends keyof TContext>(key: K): TContext[K] | undefined;
|
|
13
|
-
set<K extends keyof TContext>(key: K, value: TContext[K]): void;
|
|
14
|
-
has<K extends keyof TContext>(key: K): boolean;
|
|
15
|
-
delete<K extends keyof TContext>(key: K): boolean;
|
|
16
|
-
toJSON(): Record<string, any>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* An adapter that provides a consistent, Promise-based view of a synchronous context.
|
|
20
|
-
* This is created by the runtime and is transparent to the node author.
|
|
21
|
-
*/
|
|
22
|
-
declare class AsyncContextView<TContext extends Record<string, any>> implements IAsyncContext<TContext> {
|
|
23
|
-
private syncContext;
|
|
24
|
-
readonly type: "async";
|
|
25
|
-
constructor(syncContext: ISyncContext<TContext>);
|
|
26
|
-
get<K extends keyof TContext>(key: K): Promise<TContext[K] | undefined>;
|
|
27
|
-
set<K extends keyof TContext>(key: K, value: TContext[K]): Promise<void>;
|
|
28
|
-
has<K extends keyof TContext>(key: K): Promise<boolean>;
|
|
29
|
-
delete<K extends keyof TContext>(key: K): Promise<boolean>;
|
|
30
|
-
toJSON(): Promise<Record<string, any>>;
|
|
31
|
-
patch(_operations: PatchOperation[]): Promise<void>;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* A proxy wrapper that tracks changes to an async context for delta-based persistence.
|
|
35
|
-
* Records all mutations (set/delete operations) to enable efficient partial updates.
|
|
36
|
-
*/
|
|
37
|
-
declare class TrackedAsyncContext<TContext extends Record<string, any>> implements IAsyncContext<TContext> {
|
|
38
|
-
readonly type: "async";
|
|
39
|
-
private deltas;
|
|
40
|
-
private innerContext;
|
|
41
|
-
private eventBus?;
|
|
42
|
-
private executionId?;
|
|
43
|
-
private sourceNode?;
|
|
44
|
-
constructor(innerContext: IAsyncContext<TContext>, eventBus?: any, executionId?: string, sourceNode?: string);
|
|
45
|
-
get<K extends keyof TContext>(key: K): Promise<TContext[K] | undefined>;
|
|
46
|
-
set<K extends keyof TContext>(key: K, value: TContext[K]): Promise<void>;
|
|
47
|
-
has<K extends keyof TContext>(key: K): Promise<boolean>;
|
|
48
|
-
delete<K extends keyof TContext>(key: K): Promise<boolean>;
|
|
49
|
-
toJSON(): Promise<Record<string, any>>;
|
|
50
|
-
patch(operations: PatchOperation[]): Promise<void>;
|
|
51
|
-
getDeltas(): PatchOperation[];
|
|
52
|
-
clearDeltas(): void;
|
|
53
|
-
/**
|
|
54
|
-
* Configures the event emitter for tracking context changes.
|
|
55
|
-
* This enables the context to emit events when set/delete operations occur,
|
|
56
|
-
* allowing for external monitoring and persistence of context mutations.
|
|
57
|
-
*
|
|
58
|
-
* @param eventBus - The event bus instance to emit context change events
|
|
59
|
-
* @param executionId - The unique identifier for the current workflow execution
|
|
60
|
-
* @param sourceNode - Optional identifier for the node that triggered the context change
|
|
61
|
-
*/
|
|
62
|
-
configureEventEmitter(eventBus: any, executionId: string, sourceNode?: string): void;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export { AsyncContextView, Context, TrackedAsyncContext };
|
package/dist/context.js
DELETED
package/dist/context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"context.js"}
|
package/dist/error-mapper.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { h as WorkflowBlueprint } from './types-Biip2gLh.js';
|
|
2
|
-
import './errors.js';
|
|
3
|
-
import './container.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates an error mapper function that enhances runtime errors with source location information.
|
|
7
|
-
* The mapper looks up node IDs in the provided manifest blueprints and returns enhanced errors
|
|
8
|
-
* that point to the original TypeScript source code.
|
|
9
|
-
*
|
|
10
|
-
* @param manifestBlueprints - The compiled blueprint manifest containing source location data
|
|
11
|
-
* @returns A function that maps errors to enhanced errors with source location information
|
|
12
|
-
*/
|
|
13
|
-
declare function createErrorMapper(manifestBlueprints: Record<string, WorkflowBlueprint>): (error: Error) => Error;
|
|
14
|
-
|
|
15
|
-
export { createErrorMapper };
|
package/dist/error-mapper.js
DELETED