@ghchinoy/litflow 0.2.7 → 0.3.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/CHANGELOG.md +59 -0
- package/dist/breadboard/data/common.d.ts +35 -0
- package/dist/breadboard/engine/loader/capability.d.ts +21 -0
- package/dist/breadboard/engine/loader/loader.d.ts +29 -0
- package/dist/breadboard/engine/loader/resolve-graph-urls.d.ts +16 -0
- package/dist/breadboard/engine/runtime/bubble.d.ts +23 -0
- package/dist/breadboard/engine/runtime/graph-based-node-handler.d.ts +16 -0
- package/dist/breadboard/engine/runtime/handler.d.ts +27 -0
- package/dist/breadboard/engine/runtime/harness/events.d.ts +145 -0
- package/dist/breadboard/engine/runtime/harness/local.d.ts +10 -0
- package/dist/breadboard/engine/runtime/harness/plan-runner.d.ts +25 -0
- package/dist/breadboard/engine/runtime/run/invoke-graph.d.ts +12 -0
- package/dist/breadboard/engine/runtime/run/node-invoker.d.ts +12 -0
- package/dist/breadboard/engine/runtime/run/run-graph.d.ts +12 -0
- package/dist/breadboard/engine/runtime/run.d.ts +29 -0
- package/dist/breadboard/engine/runtime/sandbox/capabilities-manager.d.ts +15 -0
- package/dist/breadboard/engine/runtime/sandbox/file-system-handler-factory.d.ts +15 -0
- package/dist/breadboard/engine/runtime/sandbox/invoke-describer.d.ts +10 -0
- package/dist/breadboard/engine/runtime/static/create-plan.d.ts +14 -0
- package/dist/breadboard/engine/runtime/static/orchestrator.d.ts +72 -0
- package/dist/breadboard/engine/runtime/traversal/index.d.ts +20 -0
- package/dist/breadboard/engine/runtime/traversal/iterator.d.ts +12 -0
- package/dist/breadboard/engine/runtime/traversal/machine.d.ts +14 -0
- package/dist/breadboard/engine/runtime/traversal/representation.d.ts +27 -0
- package/dist/breadboard/engine/runtime/traversal/result.d.ts +24 -0
- package/dist/breadboard/engine/runtime/traversal/state.d.ts +34 -0
- package/dist/breadboard/lit-flow-runner.d.ts +13 -0
- package/dist/breadboard/lit-flow-runner.test.d.ts +1 -0
- package/dist/breadboard/runner.d.ts +13 -0
- package/dist/index.d.ts +2 -0
- package/dist/lit-chiclet.d.ts +9 -0
- package/dist/lit-schema-node.d.ts +13 -0
- package/dist/lit-schema-node.test.d.ts +1 -0
- package/dist/litflow.js +708 -442
- package/dist/litflow.js.map +1 -1
- package/package.json +18 -4
- package/src/breadboard/data/common.ts +450 -0
- package/src/breadboard/data/file-system.ts +54 -0
- package/src/breadboard/data/inline-all-content.ts +126 -0
- package/src/breadboard/data/recent-boards.ts +118 -0
- package/src/breadboard/data/save-outputs-as-file.ts +104 -0
- package/src/breadboard/engine/add-run-module.ts +168 -0
- package/src/breadboard/engine/editor/blank.ts +65 -0
- package/src/breadboard/engine/editor/edge.ts +27 -0
- package/src/breadboard/engine/editor/events.ts +64 -0
- package/src/breadboard/engine/editor/graph.ts +383 -0
- package/src/breadboard/engine/editor/history.ts +98 -0
- package/src/breadboard/engine/editor/index.ts +8 -0
- package/src/breadboard/engine/editor/operations/add-asset.ts +45 -0
- package/src/breadboard/engine/editor/operations/add-edge.ts +142 -0
- package/src/breadboard/engine/editor/operations/add-graph.ts +47 -0
- package/src/breadboard/engine/editor/operations/add-module.ts +64 -0
- package/src/breadboard/engine/editor/operations/add-node.ts +86 -0
- package/src/breadboard/engine/editor/operations/change-asset-metadata.ts +70 -0
- package/src/breadboard/engine/editor/operations/change-configuration.ts +82 -0
- package/src/breadboard/engine/editor/operations/change-edge-metadata.ts +58 -0
- package/src/breadboard/engine/editor/operations/change-edge.ts +111 -0
- package/src/breadboard/engine/editor/operations/change-graph-metadata.ts +52 -0
- package/src/breadboard/engine/editor/operations/change-metadata.ts +92 -0
- package/src/breadboard/engine/editor/operations/change-module.ts +64 -0
- package/src/breadboard/engine/editor/operations/error.ts +21 -0
- package/src/breadboard/engine/editor/operations/remove-asset.ts +48 -0
- package/src/breadboard/engine/editor/operations/remove-edge.ts +89 -0
- package/src/breadboard/engine/editor/operations/remove-graph.ts +49 -0
- package/src/breadboard/engine/editor/operations/remove-integration.ts +54 -0
- package/src/breadboard/engine/editor/operations/remove-module.ts +69 -0
- package/src/breadboard/engine/editor/operations/remove-node.ts +86 -0
- package/src/breadboard/engine/editor/operations/replace-graph.ts +52 -0
- package/src/breadboard/engine/editor/operations/toggle-export.ts +72 -0
- package/src/breadboard/engine/editor/operations/upsert-integration.ts +43 -0
- package/src/breadboard/engine/editor/selection.ts +58 -0
- package/src/breadboard/engine/editor/transforms/configure-sidewire.ts +73 -0
- package/src/breadboard/engine/editor/transforms/isolate-selection.ts +54 -0
- package/src/breadboard/engine/editor/transforms/merge-graph.ts +58 -0
- package/src/breadboard/engine/editor/transforms/move-to-graph.ts +102 -0
- package/src/breadboard/engine/editor/transforms/move-to-new-graph.ts +72 -0
- package/src/breadboard/engine/editor/transforms/sidewire-to-new-graph.ts +82 -0
- package/src/breadboard/engine/file-system/blob-transform.ts +44 -0
- package/src/breadboard/engine/file-system/composed-peristent-backend.ts +140 -0
- package/src/breadboard/engine/file-system/ephemeral-blob-store.ts +46 -0
- package/src/breadboard/engine/file-system/in-memory-blob-store.ts +87 -0
- package/src/breadboard/engine/file-system/index.ts +723 -0
- package/src/breadboard/engine/file-system/partial-persistent-backend.ts +109 -0
- package/src/breadboard/engine/file-system/path.ts +125 -0
- package/src/breadboard/engine/file-system/persistent-file.ts +66 -0
- package/src/breadboard/engine/file-system/readable-stream-file.ts +61 -0
- package/src/breadboard/engine/file-system/stub-file-system.ts +47 -0
- package/src/breadboard/engine/file-system/utils.ts +40 -0
- package/src/breadboard/engine/inspector/graph/bubbled-node.ts +162 -0
- package/src/breadboard/engine/inspector/graph/describe-cache.ts +78 -0
- package/src/breadboard/engine/inspector/graph/describe-type-cache.ts +48 -0
- package/src/breadboard/engine/inspector/graph/edge-cache.ts +118 -0
- package/src/breadboard/engine/inspector/graph/edge.ts +133 -0
- package/src/breadboard/engine/inspector/graph/event.ts +35 -0
- package/src/breadboard/engine/inspector/graph/exports-describer.ts +45 -0
- package/src/breadboard/engine/inspector/graph/graph-cache.ts +54 -0
- package/src/breadboard/engine/inspector/graph/graph-describer-manager.ts +338 -0
- package/src/breadboard/engine/inspector/graph/graph-descriptor-handle.ts +73 -0
- package/src/breadboard/engine/inspector/graph/graph-node-type.ts +111 -0
- package/src/breadboard/engine/inspector/graph/graph-queries.ts +256 -0
- package/src/breadboard/engine/inspector/graph/graph.ts +163 -0
- package/src/breadboard/engine/inspector/graph/inspectable-asset.ts +36 -0
- package/src/breadboard/engine/inspector/graph/kits.ts +208 -0
- package/src/breadboard/engine/inspector/graph/module.ts +69 -0
- package/src/breadboard/engine/inspector/graph/mutable-graph.ts +150 -0
- package/src/breadboard/engine/inspector/graph/node-cache.ts +123 -0
- package/src/breadboard/engine/inspector/graph/node-describer-manager.ts +279 -0
- package/src/breadboard/engine/inspector/graph/node-type-describer-manager.ts +122 -0
- package/src/breadboard/engine/inspector/graph/node.ts +149 -0
- package/src/breadboard/engine/inspector/graph/port-cache.ts +80 -0
- package/src/breadboard/engine/inspector/graph/ports.ts +292 -0
- package/src/breadboard/engine/inspector/graph/schemas.ts +131 -0
- package/src/breadboard/engine/inspector/graph/virtual-node.ts +184 -0
- package/src/breadboard/engine/inspector/graph-store.ts +629 -0
- package/src/breadboard/engine/inspector/index.ts +13 -0
- package/src/breadboard/engine/inspector/utils.ts +20 -0
- package/src/breadboard/engine/loader/capability.ts +184 -0
- package/src/breadboard/engine/loader/index.ts +14 -0
- package/src/breadboard/engine/loader/loader.ts +244 -0
- package/src/breadboard/engine/loader/resolve-graph-urls.ts +111 -0
- package/src/breadboard/engine/runtime/bubble.ts +269 -0
- package/src/breadboard/engine/runtime/graph-based-node-handler.ts +174 -0
- package/src/breadboard/engine/runtime/handler.ts +166 -0
- package/src/breadboard/engine/runtime/harness/diagnostics.ts +22 -0
- package/src/breadboard/engine/runtime/harness/events.ts +217 -0
- package/src/breadboard/engine/runtime/harness/index.ts +14 -0
- package/src/breadboard/engine/runtime/harness/local.ts +48 -0
- package/src/breadboard/engine/runtime/harness/plan-runner.ts +759 -0
- package/src/breadboard/engine/runtime/index.ts +8 -0
- package/src/breadboard/engine/runtime/legacy.ts +28 -0
- package/src/breadboard/engine/runtime/run/invoke-graph.ts +79 -0
- package/src/breadboard/engine/runtime/run/node-invoker.ts +137 -0
- package/src/breadboard/engine/runtime/run/run-graph.ts +186 -0
- package/src/breadboard/engine/runtime/run.ts +111 -0
- package/src/breadboard/engine/runtime/sandbox/capabilities-manager.ts +253 -0
- package/src/breadboard/engine/runtime/sandbox/file-system-handler-factory.ts +53 -0
- package/src/breadboard/engine/runtime/sandbox/invoke-describer.ts +125 -0
- package/src/breadboard/engine/runtime/static/condense.ts +155 -0
- package/src/breadboard/engine/runtime/static/create-plan.ts +134 -0
- package/src/breadboard/engine/runtime/static/nodes-to-subgraph.ts +168 -0
- package/src/breadboard/engine/runtime/static/orchestrator.ts +664 -0
- package/src/breadboard/engine/runtime/static/types.ts +77 -0
- package/src/breadboard/engine/runtime/traversal/index.ts +58 -0
- package/src/breadboard/engine/runtime/traversal/iterator.ts +124 -0
- package/src/breadboard/engine/runtime/traversal/machine.ts +58 -0
- package/src/breadboard/engine/runtime/traversal/representation.ts +115 -0
- package/src/breadboard/engine/runtime/traversal/result.ts +72 -0
- package/src/breadboard/engine/runtime/traversal/state.ts +115 -0
- package/src/breadboard/engine/telemetry.ts +121 -0
- package/src/breadboard/engine/types.ts +32 -0
- package/src/breadboard/lit-flow-runner.test.ts +44 -0
- package/src/breadboard/lit-flow-runner.ts +98 -0
- package/src/breadboard/runner.ts +80 -0
- package/src/index.ts +2 -0
- package/src/lit-chiclet.ts +69 -0
- package/src/lit-flow.ts +17 -7
- package/src/lit-schema-node.test.ts +65 -0
- package/src/lit-schema-node.ts +194 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2025 Google LLC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
Edge,
|
|
10
|
+
GraphDescriptor,
|
|
11
|
+
NodeDescriptor,
|
|
12
|
+
OrchestrationPlan,
|
|
13
|
+
PlanNodeInfo,
|
|
14
|
+
} from "@breadboard-ai/types";
|
|
15
|
+
|
|
16
|
+
export { createPlan };
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates an execution plan from the provided GraphDescription.
|
|
20
|
+
* The graph is guaranteed to be condensed (no cycles), and each
|
|
21
|
+
* strongly connected component is represented with a single node
|
|
22
|
+
* that has a "folded" tag.
|
|
23
|
+
*/
|
|
24
|
+
function createPlan(graph: GraphDescriptor): OrchestrationPlan {
|
|
25
|
+
const { nodes, edges } = graph;
|
|
26
|
+
|
|
27
|
+
if (!nodes || nodes.length === 0) {
|
|
28
|
+
return { stages: [] };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const nodeMap = new Map(nodes.map((node) => [node.id, node]));
|
|
32
|
+
const inDegree = new Map<string, number>();
|
|
33
|
+
const outEdges = new Map<string, Edge[]>();
|
|
34
|
+
const inEdges = new Map<string, Edge[]>();
|
|
35
|
+
|
|
36
|
+
nodes.forEach((node) => {
|
|
37
|
+
inDegree.set(node.id, 0);
|
|
38
|
+
outEdges.set(node.id, []);
|
|
39
|
+
inEdges.set(node.id, []);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (edges) {
|
|
43
|
+
edges.forEach((edge) => {
|
|
44
|
+
const currentDegree = inDegree.get(edge.to) || 0;
|
|
45
|
+
inDegree.set(edge.to, currentDegree + 1);
|
|
46
|
+
|
|
47
|
+
const fromEdges = outEdges.get(edge.from) || [];
|
|
48
|
+
fromEdges.push({ ...edge });
|
|
49
|
+
outEdges.set(edge.from, fromEdges);
|
|
50
|
+
|
|
51
|
+
const toEdges = inEdges.get(edge.to) || [];
|
|
52
|
+
toEdges.push({ ...edge });
|
|
53
|
+
inEdges.set(edge.to, toEdges);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const stages: PlanNodeInfo[][] = [];
|
|
58
|
+
const entries = nodes.filter((node) => inDegree.get(node.id) === 0);
|
|
59
|
+
|
|
60
|
+
// Now, let's separate out all standalone steps and see if maybe we only
|
|
61
|
+
// have standalone nodes.
|
|
62
|
+
const standalone: NodeDescriptor[] = [];
|
|
63
|
+
const connected: NodeDescriptor[] = [];
|
|
64
|
+
let onlyStandalone = true;
|
|
65
|
+
entries.forEach((node) => {
|
|
66
|
+
const nodeTails = outEdges.get(node.id) || [];
|
|
67
|
+
if (nodeTails.length == 0) {
|
|
68
|
+
standalone.push(node);
|
|
69
|
+
} else {
|
|
70
|
+
onlyStandalone = false;
|
|
71
|
+
connected.push(node);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
let queue: NodeDescriptor[];
|
|
75
|
+
|
|
76
|
+
// If there are no standalone nodes, return all entries as usual.
|
|
77
|
+
if (standalone.length === 0) {
|
|
78
|
+
queue = entries;
|
|
79
|
+
} else if (onlyStandalone) {
|
|
80
|
+
// This is the situation when we have a bunch of random nodes in graph
|
|
81
|
+
// and they are not connected, and there's no designated start node.
|
|
82
|
+
|
|
83
|
+
// Just return the first standalone node.
|
|
84
|
+
queue = [standalone[0]];
|
|
85
|
+
} else {
|
|
86
|
+
// If there are both standalone and connected nodes, we just ignore
|
|
87
|
+
// all standalone nodes.
|
|
88
|
+
queue = connected;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const processed = new Set<string>();
|
|
92
|
+
|
|
93
|
+
while (queue.length > 0) {
|
|
94
|
+
const stageNodes: PlanNodeInfo[] = [];
|
|
95
|
+
const nextQueue: typeof queue = [];
|
|
96
|
+
|
|
97
|
+
while (queue.length > 0) {
|
|
98
|
+
const node = queue.shift()!;
|
|
99
|
+
|
|
100
|
+
if (processed.has(node.id)) continue;
|
|
101
|
+
processed.add(node.id);
|
|
102
|
+
|
|
103
|
+
const downstream = outEdges.get(node.id) || [];
|
|
104
|
+
|
|
105
|
+
const upstream = inEdges.get(node.id) || [];
|
|
106
|
+
|
|
107
|
+
const planNodeInfo: PlanNodeInfo = {
|
|
108
|
+
node: nodeMap.get(node.id)!,
|
|
109
|
+
downstream,
|
|
110
|
+
upstream,
|
|
111
|
+
};
|
|
112
|
+
stageNodes.push(planNodeInfo);
|
|
113
|
+
|
|
114
|
+
(outEdges.get(node.id) || []).forEach((edge) => {
|
|
115
|
+
const targetDegree = inDegree.get(edge.to) || 0;
|
|
116
|
+
if (targetDegree > 0) {
|
|
117
|
+
inDegree.set(edge.to, targetDegree - 1);
|
|
118
|
+
if (targetDegree === 1) {
|
|
119
|
+
const targetNode = nodeMap.get(edge.to);
|
|
120
|
+
if (targetNode) nextQueue.push(targetNode);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (stageNodes.length > 0) {
|
|
127
|
+
stages.push(stageNodes);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
queue.push(...nextQueue);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { stages };
|
|
134
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2025 Google LLC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
GraphDescriptor,
|
|
10
|
+
GraphIdentifier,
|
|
11
|
+
NodeDescriptor,
|
|
12
|
+
NodeIdentifier,
|
|
13
|
+
} from "@breadboard-ai/types";
|
|
14
|
+
|
|
15
|
+
export { nodesToSubgraph };
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Moves a group of nodes within a graph into a subgraph, mutating
|
|
19
|
+
* the supplied graph.
|
|
20
|
+
*
|
|
21
|
+
* @param graph - The graph where the subgraph will be created.
|
|
22
|
+
* @param nodeGroup - The group of nodes to include in the subgraph.
|
|
23
|
+
* @param subgraphId - The unique identifier for the subgraph.
|
|
24
|
+
* @param title - An optional title for the subgraph.
|
|
25
|
+
* @param description - An optional description for the subgraph.
|
|
26
|
+
*/
|
|
27
|
+
function nodesToSubgraph(
|
|
28
|
+
graph: GraphDescriptor,
|
|
29
|
+
nodeGroup: NodeIdentifier[],
|
|
30
|
+
subgraphId: GraphIdentifier,
|
|
31
|
+
title?: string,
|
|
32
|
+
description?: string
|
|
33
|
+
) {
|
|
34
|
+
// Find all edges within the node group
|
|
35
|
+
const subgraph = createSubgraph(
|
|
36
|
+
graph,
|
|
37
|
+
nodeGroup,
|
|
38
|
+
subgraphId,
|
|
39
|
+
title,
|
|
40
|
+
description
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
graph.graphs ??= {};
|
|
44
|
+
graph.graphs[subgraphId] = subgraph;
|
|
45
|
+
|
|
46
|
+
const replacementNodeId = subgraphId;
|
|
47
|
+
const replacementNode: NodeDescriptor = {
|
|
48
|
+
id: replacementNodeId,
|
|
49
|
+
type: `#${subgraphId}`,
|
|
50
|
+
metadata: {
|
|
51
|
+
title: `Subgraph "${subgraphId}"`,
|
|
52
|
+
tags: ["folded"],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Replace folded nodes with a replacement
|
|
57
|
+
graph.nodes =
|
|
58
|
+
graph.nodes?.filter((node) => !nodeGroup.includes(node.id)) || [];
|
|
59
|
+
graph.nodes.push(replacementNode);
|
|
60
|
+
|
|
61
|
+
// Update edges to point to/from condensed node
|
|
62
|
+
updateEdgeForFoldedNode(graph, nodeGroup, replacementNodeId);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function createSubgraph(
|
|
66
|
+
graph: GraphDescriptor,
|
|
67
|
+
nodeGroup: NodeIdentifier[],
|
|
68
|
+
subgraphId: GraphIdentifier,
|
|
69
|
+
title?: string,
|
|
70
|
+
description?: string
|
|
71
|
+
): GraphDescriptor {
|
|
72
|
+
const internalEdges =
|
|
73
|
+
graph.edges?.filter(
|
|
74
|
+
(edge) => nodeGroup.includes(edge.from) && nodeGroup.includes(edge.to)
|
|
75
|
+
) || [];
|
|
76
|
+
|
|
77
|
+
// Find incoming edges to the node group
|
|
78
|
+
const incomingEdges =
|
|
79
|
+
graph.edges?.filter(
|
|
80
|
+
(edge) => !nodeGroup.includes(edge.from) && nodeGroup.includes(edge.to)
|
|
81
|
+
) || [];
|
|
82
|
+
|
|
83
|
+
// Find outgoing edges from the node group
|
|
84
|
+
const outgoingEdges =
|
|
85
|
+
graph.edges?.filter(
|
|
86
|
+
(edge) => nodeGroup.includes(edge.from) && !nodeGroup.includes(edge.to)
|
|
87
|
+
) || [];
|
|
88
|
+
|
|
89
|
+
// Get nodes in the group
|
|
90
|
+
const groupNodes =
|
|
91
|
+
graph.nodes?.filter((node) => nodeGroup.includes(node.id)) || [];
|
|
92
|
+
|
|
93
|
+
// Create input node for capturing incoming edges
|
|
94
|
+
const inputNode: NodeDescriptor = {
|
|
95
|
+
id: `input_${subgraphId}`,
|
|
96
|
+
type: "input",
|
|
97
|
+
metadata: {
|
|
98
|
+
title: "Subgraph Input",
|
|
99
|
+
description: "Captures incoming edges to the subgraph",
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Create output node for capturing outgoing edges
|
|
104
|
+
const outputNode: NodeDescriptor = {
|
|
105
|
+
id: `output_${subgraphId}`,
|
|
106
|
+
type: "output",
|
|
107
|
+
metadata: {
|
|
108
|
+
title: "Subgraph Output",
|
|
109
|
+
description: "Captures outgoing edges from the subgraph",
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Create subgraph edges
|
|
114
|
+
const subgraphEdges = [...internalEdges];
|
|
115
|
+
|
|
116
|
+
// Add edges from input node to group entry points
|
|
117
|
+
incomingEdges.forEach((edge) => {
|
|
118
|
+
subgraphEdges.push({
|
|
119
|
+
from: `input_${subgraphId}`,
|
|
120
|
+
to: edge.to,
|
|
121
|
+
in: edge.in,
|
|
122
|
+
out: edge.in || "out",
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Add edges from group exit points to output node
|
|
127
|
+
outgoingEdges.forEach((edge) => {
|
|
128
|
+
subgraphEdges.push({
|
|
129
|
+
from: edge.from,
|
|
130
|
+
to: `output_${subgraphId}`,
|
|
131
|
+
in: edge.out || "in",
|
|
132
|
+
out: edge.out,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
title: title || `Subgraph ${subgraphId}`,
|
|
138
|
+
description: description || `Subgraph containing ${nodeGroup.length} nodes`,
|
|
139
|
+
nodes: [inputNode, ...groupNodes, outputNode],
|
|
140
|
+
edges: subgraphEdges,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function updateEdgeForFoldedNode(
|
|
145
|
+
graph: GraphDescriptor,
|
|
146
|
+
nodeGroup: string[],
|
|
147
|
+
nodeId: string
|
|
148
|
+
) {
|
|
149
|
+
if (!graph.edges) return;
|
|
150
|
+
|
|
151
|
+
// Update edges that cross fold lines
|
|
152
|
+
graph.edges = graph.edges
|
|
153
|
+
.map((edge) => {
|
|
154
|
+
const from = nodeGroup.includes(edge.from);
|
|
155
|
+
const into = nodeGroup.includes(edge.to);
|
|
156
|
+
|
|
157
|
+
if (from && !into) {
|
|
158
|
+
return { ...edge, from: nodeId };
|
|
159
|
+
} else if (!from && into) {
|
|
160
|
+
return { ...edge, to: nodeId };
|
|
161
|
+
}
|
|
162
|
+
return edge;
|
|
163
|
+
})
|
|
164
|
+
// Remove internal edges (they're now in the subgraph)
|
|
165
|
+
.filter((edge) => {
|
|
166
|
+
return !(nodeGroup.includes(edge.from) && nodeGroup.includes(edge.to));
|
|
167
|
+
});
|
|
168
|
+
}
|