footprint-explainable-ui 0.3.2 → 0.5.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.
Files changed (161) hide show
  1. package/README.md +42 -3
  2. package/dist/adapters/fromRuntimeSnapshot.d.ts +52 -0
  3. package/dist/adapters/fromRuntimeSnapshot.d.ts.map +1 -0
  4. package/dist/adapters/fromRuntimeSnapshot.js +97 -0
  5. package/dist/adapters/fromRuntimeSnapshot.js.map +1 -0
  6. package/dist/components/ExplainableShell/ExplainableShell.d.ts +26 -0
  7. package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +1 -0
  8. package/dist/components/ExplainableShell/ExplainableShell.js +94 -0
  9. package/dist/components/ExplainableShell/ExplainableShell.js.map +1 -0
  10. package/dist/components/ExplainableShell/index.d.ts +3 -0
  11. package/dist/components/ExplainableShell/index.d.ts.map +1 -0
  12. package/dist/components/ExplainableShell/index.js +2 -0
  13. package/dist/components/ExplainableShell/index.js.map +1 -0
  14. package/dist/components/FlowchartView/FlowchartView.d.ts +20 -0
  15. package/dist/components/FlowchartView/FlowchartView.d.ts.map +1 -0
  16. package/dist/components/FlowchartView/FlowchartView.js +80 -0
  17. package/dist/components/FlowchartView/FlowchartView.js.map +1 -0
  18. package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts +11 -0
  19. package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts.map +1 -0
  20. package/dist/components/FlowchartView/SubflowBreadcrumb.js +49 -0
  21. package/dist/components/FlowchartView/SubflowBreadcrumb.js.map +1 -0
  22. package/dist/components/FlowchartView/SubflowTree.d.ts +36 -0
  23. package/dist/components/FlowchartView/SubflowTree.d.ts.map +1 -0
  24. package/dist/components/FlowchartView/SubflowTree.js +143 -0
  25. package/dist/components/FlowchartView/SubflowTree.js.map +1 -0
  26. package/dist/components/FlowchartView/TracedFlowchartView.d.ts +20 -0
  27. package/dist/components/FlowchartView/TracedFlowchartView.d.ts.map +1 -0
  28. package/dist/components/FlowchartView/TracedFlowchartView.js +101 -0
  29. package/dist/components/FlowchartView/TracedFlowchartView.js.map +1 -0
  30. package/dist/components/FlowchartView/index.d.ts +11 -0
  31. package/dist/components/FlowchartView/index.d.ts.map +1 -0
  32. package/dist/components/FlowchartView/index.js +6 -0
  33. package/dist/components/FlowchartView/index.js.map +1 -0
  34. package/dist/components/FlowchartView/specToReactFlow.d.ts +56 -0
  35. package/dist/components/FlowchartView/specToReactFlow.d.ts.map +1 -0
  36. package/dist/components/FlowchartView/specToReactFlow.js +202 -0
  37. package/dist/components/FlowchartView/specToReactFlow.js.map +1 -0
  38. package/dist/components/FlowchartView/useSubflowNavigation.d.ts +35 -0
  39. package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +1 -0
  40. package/dist/components/FlowchartView/useSubflowNavigation.js +80 -0
  41. package/dist/components/FlowchartView/useSubflowNavigation.js.map +1 -0
  42. package/dist/components/GanttTimeline/GanttTimeline.d.ts +18 -0
  43. package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +1 -0
  44. package/dist/components/GanttTimeline/GanttTimeline.js +123 -0
  45. package/dist/components/GanttTimeline/GanttTimeline.js.map +1 -0
  46. package/dist/components/GanttTimeline/index.d.ts +3 -0
  47. package/dist/components/GanttTimeline/index.d.ts.map +1 -0
  48. package/dist/components/GanttTimeline/index.js +2 -0
  49. package/dist/components/GanttTimeline/index.js.map +1 -0
  50. package/dist/components/MemoryInspector/MemoryInspector.d.ts +19 -0
  51. package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +1 -0
  52. package/dist/components/MemoryInspector/MemoryInspector.js +95 -0
  53. package/dist/components/MemoryInspector/MemoryInspector.js.map +1 -0
  54. package/dist/components/MemoryInspector/index.d.ts +3 -0
  55. package/dist/components/MemoryInspector/index.d.ts.map +1 -0
  56. package/dist/components/MemoryInspector/index.js +2 -0
  57. package/dist/components/MemoryInspector/index.js.map +1 -0
  58. package/dist/components/NarrativeLog/NarrativeLog.d.ts +15 -0
  59. package/dist/components/NarrativeLog/NarrativeLog.d.ts.map +1 -0
  60. package/dist/components/NarrativeLog/NarrativeLog.js +65 -0
  61. package/dist/components/NarrativeLog/NarrativeLog.js.map +1 -0
  62. package/dist/components/NarrativeLog/index.d.ts +3 -0
  63. package/dist/components/NarrativeLog/index.d.ts.map +1 -0
  64. package/dist/components/NarrativeLog/index.js +2 -0
  65. package/dist/components/NarrativeLog/index.js.map +1 -0
  66. package/dist/components/NarrativeTrace/NarrativeTrace.d.ts +13 -0
  67. package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +1 -0
  68. package/dist/components/NarrativeTrace/NarrativeTrace.js +127 -0
  69. package/dist/components/NarrativeTrace/NarrativeTrace.js.map +1 -0
  70. package/dist/components/NarrativeTrace/index.d.ts +3 -0
  71. package/dist/components/NarrativeTrace/index.d.ts.map +1 -0
  72. package/dist/components/NarrativeTrace/index.js +2 -0
  73. package/dist/components/NarrativeTrace/index.js.map +1 -0
  74. package/dist/components/ResultPanel/ResultPanel.d.ts +11 -0
  75. package/dist/components/ResultPanel/ResultPanel.d.ts.map +1 -0
  76. package/dist/components/ResultPanel/ResultPanel.js +54 -0
  77. package/dist/components/ResultPanel/ResultPanel.js.map +1 -0
  78. package/dist/components/ResultPanel/index.d.ts +3 -0
  79. package/dist/components/ResultPanel/index.d.ts.map +1 -0
  80. package/dist/components/ResultPanel/index.js +2 -0
  81. package/dist/components/ResultPanel/index.js.map +1 -0
  82. package/dist/components/ScopeDiff/ScopeDiff.d.ts +17 -0
  83. package/dist/components/ScopeDiff/ScopeDiff.d.ts.map +1 -0
  84. package/dist/components/ScopeDiff/ScopeDiff.js +87 -0
  85. package/dist/components/ScopeDiff/ScopeDiff.js.map +1 -0
  86. package/dist/components/ScopeDiff/index.d.ts +3 -0
  87. package/dist/components/ScopeDiff/index.d.ts.map +1 -0
  88. package/dist/components/ScopeDiff/index.js +2 -0
  89. package/dist/components/ScopeDiff/index.js.map +1 -0
  90. package/dist/components/SnapshotPanel/SnapshotPanel.d.ts +17 -0
  91. package/dist/components/SnapshotPanel/SnapshotPanel.d.ts.map +1 -0
  92. package/dist/components/SnapshotPanel/SnapshotPanel.js +85 -0
  93. package/dist/components/SnapshotPanel/SnapshotPanel.js.map +1 -0
  94. package/dist/components/SnapshotPanel/index.d.ts +3 -0
  95. package/dist/components/SnapshotPanel/index.d.ts.map +1 -0
  96. package/dist/components/SnapshotPanel/index.js +2 -0
  97. package/dist/components/SnapshotPanel/index.js.map +1 -0
  98. package/dist/components/StageNode/StageNode.d.ts +31 -0
  99. package/dist/components/StageNode/StageNode.d.ts.map +1 -0
  100. package/dist/components/StageNode/StageNode.js +134 -0
  101. package/dist/components/StageNode/StageNode.js.map +1 -0
  102. package/dist/components/StageNode/index.d.ts +3 -0
  103. package/dist/components/StageNode/index.d.ts.map +1 -0
  104. package/dist/components/StageNode/index.js +2 -0
  105. package/dist/components/StageNode/index.js.map +1 -0
  106. package/dist/components/TimeTravelControls/TimeTravelControls.d.ts +13 -0
  107. package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +1 -0
  108. package/dist/components/TimeTravelControls/TimeTravelControls.js +104 -0
  109. package/dist/components/TimeTravelControls/TimeTravelControls.js.map +1 -0
  110. package/dist/components/TimeTravelControls/index.d.ts +3 -0
  111. package/dist/components/TimeTravelControls/index.d.ts.map +1 -0
  112. package/dist/components/TimeTravelControls/index.js +2 -0
  113. package/dist/components/TimeTravelControls/index.js.map +1 -0
  114. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +22 -0
  115. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +1 -0
  116. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +104 -0
  117. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +1 -0
  118. package/dist/components/TimeTravelDebugger/index.d.ts +3 -0
  119. package/dist/components/TimeTravelDebugger/index.d.ts.map +1 -0
  120. package/dist/components/TimeTravelDebugger/index.js +2 -0
  121. package/dist/components/TimeTravelDebugger/index.js.map +1 -0
  122. package/dist/flowchart.cjs +704 -220
  123. package/dist/flowchart.cjs.map +1 -1
  124. package/dist/flowchart.d.cts +55 -1
  125. package/dist/flowchart.d.ts +55 -1
  126. package/dist/flowchart.d.ts.map +1 -0
  127. package/dist/flowchart.js +700 -214
  128. package/dist/flowchart.js.map +1 -1
  129. package/dist/index.cjs +849 -76
  130. package/dist/index.cjs.map +1 -1
  131. package/dist/index.d.cts +95 -3
  132. package/dist/index.d.ts +95 -3
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +851 -80
  135. package/dist/index.js.map +1 -1
  136. package/dist/theme/ThemeProvider.d.ts +13 -0
  137. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  138. package/dist/theme/ThemeProvider.js +16 -0
  139. package/dist/theme/ThemeProvider.js.map +1 -0
  140. package/dist/theme/index.d.ts +7 -0
  141. package/dist/theme/index.d.ts.map +1 -0
  142. package/dist/theme/index.js +5 -0
  143. package/dist/theme/index.js.map +1 -0
  144. package/dist/theme/presets.d.ts +15 -0
  145. package/dist/theme/presets.d.ts.map +1 -0
  146. package/dist/theme/presets.js +70 -0
  147. package/dist/theme/presets.js.map +1 -0
  148. package/dist/theme/styles.d.ts +32 -0
  149. package/dist/theme/styles.d.ts.map +1 -0
  150. package/dist/theme/styles.js +37 -0
  151. package/dist/theme/styles.js.map +1 -0
  152. package/dist/theme/tokens.d.ts +28 -0
  153. package/dist/theme/tokens.d.ts.map +1 -0
  154. package/dist/theme/tokens.js +58 -0
  155. package/dist/theme/tokens.js.map +1 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -0
  157. package/dist/types.d.ts +35 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +2 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +10 -4
@@ -0,0 +1,143 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo, useState, useCallback, useMemo } from "react";
3
+ import { theme } from "../../theme";
4
+ /** Extracts a flat-ish tree of entries from a SpecNode for display. */
5
+ export function specToTree(node) {
6
+ const entries = [];
7
+ const seen = new Set();
8
+ function walk(n) {
9
+ const id = n.name || n.id || "";
10
+ if (seen.has(id))
11
+ return;
12
+ seen.add(id);
13
+ const entry = {
14
+ name: n.name,
15
+ description: n.description,
16
+ subflowId: n.subflowId,
17
+ isSubflow: !!n.isSubflowRoot,
18
+ };
19
+ // If this is a subflow with nested structure, recurse into it
20
+ if (n.isSubflowRoot && n.subflowStructure) {
21
+ entry.children = specToTree(n.subflowStructure);
22
+ }
23
+ entries.push(entry);
24
+ // Walk children (fork/decider branches)
25
+ if (n.children) {
26
+ for (const child of n.children) {
27
+ walk(child);
28
+ }
29
+ }
30
+ // Walk linear continuation
31
+ if (n.next) {
32
+ walk(n.next);
33
+ }
34
+ }
35
+ walk(node);
36
+ return entries;
37
+ }
38
+ /** Single tree node row */
39
+ const TreeNode = memo(function TreeNode({ entry, depth, activeStage, doneStages, onNodeSelect, }) {
40
+ const [expanded, setExpanded] = useState(true);
41
+ const hasChildren = entry.children && entry.children.length > 0;
42
+ const isActive = activeStage === entry.name;
43
+ const isDone = doneStages?.has(entry.name);
44
+ const handleClick = useCallback(() => {
45
+ if (hasChildren) {
46
+ setExpanded((prev) => !prev);
47
+ }
48
+ onNodeSelect?.(entry.name, !!entry.isSubflow);
49
+ }, [hasChildren, onNodeSelect, entry.name, entry.isSubflow]);
50
+ return (_jsxs(_Fragment, { children: [_jsxs("button", { onClick: handleClick, "data-fp": "subflow-tree-node", style: {
51
+ display: "flex",
52
+ alignItems: "center",
53
+ gap: 6,
54
+ width: "100%",
55
+ border: "none",
56
+ background: isActive
57
+ ? `color-mix(in srgb, ${theme.primary} 15%, transparent)`
58
+ : "transparent",
59
+ cursor: "pointer",
60
+ padding: `4px 8px 4px ${8 + depth * 16}px`,
61
+ fontFamily: theme.fontSans,
62
+ fontSize: 12,
63
+ textAlign: "left",
64
+ borderRadius: 4,
65
+ transition: "background 0.15s",
66
+ }, onMouseEnter: (e) => {
67
+ if (!isActive) {
68
+ e.currentTarget.style.background = `color-mix(in srgb, ${theme.textMuted} 10%, transparent)`;
69
+ }
70
+ }, onMouseLeave: (e) => {
71
+ if (!isActive) {
72
+ e.currentTarget.style.background = "transparent";
73
+ }
74
+ }, children: [hasChildren ? (_jsx("span", { style: {
75
+ fontSize: 10,
76
+ color: theme.textMuted,
77
+ width: 12,
78
+ textAlign: "center",
79
+ flexShrink: 0,
80
+ transition: "transform 0.15s",
81
+ transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
82
+ display: "inline-block",
83
+ }, children: "\u25B6" })) : (_jsx("span", { style: { width: 12, flexShrink: 0 } })), _jsx("span", { style: {
84
+ width: 6,
85
+ height: 6,
86
+ borderRadius: "50%",
87
+ flexShrink: 0,
88
+ background: isActive
89
+ ? theme.primary
90
+ : isDone
91
+ ? theme.success
92
+ : theme.border,
93
+ } }), _jsxs("span", { style: { display: "flex", flexDirection: "column", minWidth: 0 }, children: [_jsxs("span", { style: {
94
+ color: isActive
95
+ ? theme.primary
96
+ : isDone
97
+ ? theme.textPrimary
98
+ : theme.textSecondary,
99
+ fontWeight: isActive ? 600 : entry.isSubflow ? 500 : 400,
100
+ whiteSpace: "nowrap",
101
+ overflow: "hidden",
102
+ textOverflow: "ellipsis",
103
+ }, children: [entry.name, entry.isSubflow && (_jsx("span", { style: { opacity: 0.5, marginLeft: 4, fontSize: 10 }, children: "\u229E" }))] }), entry.description && (_jsx("span", { style: {
104
+ color: theme.textMuted,
105
+ fontSize: 10,
106
+ whiteSpace: "nowrap",
107
+ overflow: "hidden",
108
+ textOverflow: "ellipsis",
109
+ }, children: entry.description }))] })] }), hasChildren && expanded && (_jsx("div", { children: entry.children.map((child, i) => (_jsx(TreeNode, { entry: child, depth: depth + 1, activeStage: activeStage, doneStages: doneStages, onNodeSelect: onNodeSelect }, `${child.name}-${i}`))) }))] }));
110
+ });
111
+ /**
112
+ * Collapsible tree sidebar showing the full subflow manifest.
113
+ *
114
+ * Shared navigation layer — humans click through the tree just like
115
+ * LLMs call getSubflowManifest() / getSubflowSpec().
116
+ *
117
+ * All colors come from `--fp-*` CSS variables set by the consumer.
118
+ */
119
+ export const SubflowTree = memo(function SubflowTree({ spec, activeStage, doneStages, onNodeSelect, unstyled = false, className, style, }) {
120
+ const tree = useMemo(() => specToTree(spec), [spec]);
121
+ return (_jsxs("div", { className: className, "data-fp": "subflow-tree", style: {
122
+ ...(unstyled
123
+ ? {}
124
+ : {
125
+ fontFamily: theme.fontSans,
126
+ fontSize: 12,
127
+ background: theme.bgPrimary,
128
+ borderRight: `1px solid ${theme.border}`,
129
+ overflowY: "auto",
130
+ overflowX: "hidden",
131
+ padding: "8px 0",
132
+ }),
133
+ ...style,
134
+ }, children: [!unstyled && (_jsx("div", { style: {
135
+ padding: "4px 12px 8px",
136
+ fontSize: 10,
137
+ fontWeight: 600,
138
+ textTransform: "uppercase",
139
+ letterSpacing: "0.05em",
140
+ color: theme.textMuted,
141
+ }, children: "Pipeline" })), tree.map((entry, i) => (_jsx(TreeNode, { entry: entry, depth: 0, activeStage: activeStage, doneStages: doneStages, onNodeSelect: onNodeSelect }, `${entry.name}-${i}`)))] }));
142
+ });
143
+ //# sourceMappingURL=SubflowTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubflowTree.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/SubflowTree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { StageSnapshot, BaseComponentProps } from "../../types";
2
+ import type { SpecNode } from "./specToReactFlow";
3
+ export interface TracedFlowchartViewProps extends BaseComponentProps {
4
+ /** Pipeline spec from builder.toSpec() */
5
+ spec: SpecNode;
6
+ /** Visualization snapshots (enables trace overlay when provided) */
7
+ snapshots?: StageSnapshot[];
8
+ /** Current time-travel position */
9
+ snapshotIndex?: number;
10
+ /** Callback when a node is clicked (receives snapshot index, or node id if no snapshots) */
11
+ onNodeClick?: (indexOrId: number | string) => void;
12
+ /** Callback when subflow navigation changes (true = entered subflow) */
13
+ onSubflowChange?: (isInSubflow: boolean, subflowNodeName: string | null) => void;
14
+ /** Show collapsible subflow tree sidebar (default: false) */
15
+ showTree?: boolean;
16
+ /** Width of the tree sidebar in pixels (default: 200) */
17
+ treeWidth?: number;
18
+ }
19
+ export declare function TracedFlowchartView({ spec, snapshots, snapshotIndex, onNodeClick, onSubflowChange, showTree, treeWidth, unstyled, className, style, }: TracedFlowchartViewProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=TracedFlowchartView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracedFlowchartView.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/TracedFlowchartView.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,mBAAmB,CAAC;AAKpE,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACnD,wEAAwE;IACxE,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjF,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,aAAiB,EACjB,WAAW,EACX,eAAe,EACf,QAAgB,EAChB,SAAe,EACf,QAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,wBAAwB,2CA+K1B"}
@@ -0,0 +1,101 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Self-contained flowchart with execution trace overlay.
4
+ *
5
+ * Consumer just passes `spec` and optionally `snapshots` + `snapshotIndex`.
6
+ * The component internally computes the overlay, handles subflow drill-down,
7
+ * and renders the correct nodes/edges — no manual overlay construction needed.
8
+ *
9
+ * Usage:
10
+ * <TracedFlowchartView spec={spec} /> // static
11
+ * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} /> // traced
12
+ * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} showTree />
13
+ */
14
+ import { useState, useMemo, useCallback } from "react";
15
+ import { ReactFlow, Background, BackgroundVariant, } from "@xyflow/react";
16
+ import { StageNode } from "../StageNode";
17
+ import { specToReactFlow } from "./specToReactFlow";
18
+ import { useSubflowNavigation } from "./useSubflowNavigation";
19
+ import { SubflowBreadcrumb } from "./SubflowBreadcrumb";
20
+ import { SubflowTree } from "./SubflowTree";
21
+ const nodeTypes = { stage: StageNode };
22
+ export function TracedFlowchartView({ spec, snapshots, snapshotIndex = 0, onNodeClick, onSubflowChange, showTree = false, treeWidth = 200, unstyled = false, className, style, }) {
23
+ const [treeVisible, setTreeVisible] = useState(showTree);
24
+ // Subflow navigation — no overlay passed (computed synchronously below)
25
+ const subflowNav = useSubflowNavigation(spec);
26
+ // Get the current level's spec from breadcrumbs
27
+ const currentSpec = subflowNav.breadcrumbs.length > 0
28
+ ? subflowNav.breadcrumbs[subflowNav.breadcrumbs.length - 1].spec
29
+ : null;
30
+ // Compute execution overlay from snapshots + index
31
+ const overlay = useMemo(() => {
32
+ if (!snapshots || snapshots.length === 0)
33
+ return undefined;
34
+ const executionOrder = snapshots
35
+ .slice(0, snapshotIndex + 1)
36
+ .map((s) => s.stageLabel);
37
+ const doneStages = new Set(snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel));
38
+ const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;
39
+ const executedStages = new Set([...doneStages]);
40
+ if (activeStage)
41
+ executedStages.add(activeStage);
42
+ return { doneStages, activeStage, executedStages, executionOrder };
43
+ }, [snapshots, snapshotIndex]);
44
+ // Derive nodes/edges with overlay applied
45
+ const { nodes, edges } = useMemo(() => {
46
+ if (!currentSpec)
47
+ return { nodes: [], edges: [] };
48
+ return specToReactFlow(currentSpec, overlay);
49
+ }, [currentSpec, overlay]);
50
+ // Handle node clicks — drill into subflow or notify consumer
51
+ const handleNodeClick = useCallback((_, node) => {
52
+ // Try subflow drill-down first
53
+ if (subflowNav.handleNodeClick(node.id)) {
54
+ onSubflowChange?.(true, node.id);
55
+ return;
56
+ }
57
+ // Otherwise notify consumer
58
+ if (onNodeClick && snapshots) {
59
+ const idx = snapshots.findIndex((s) => s.stageLabel === node.id);
60
+ if (idx >= 0)
61
+ onNodeClick(idx);
62
+ }
63
+ else if (onNodeClick) {
64
+ onNodeClick(node.id);
65
+ }
66
+ }, [subflowNav, onNodeClick, onSubflowChange, snapshots]);
67
+ // Navigate breadcrumb
68
+ const handleBreadcrumbNavigate = useCallback((level) => {
69
+ subflowNav.navigateTo(level);
70
+ onSubflowChange?.(level > 0, null);
71
+ }, [subflowNav, onSubflowChange]);
72
+ // Tree node click — drill into subflow or jump to snapshot
73
+ const handleTreeNodeSelect = useCallback((name, isSubflow) => {
74
+ if (isSubflow) {
75
+ if (subflowNav.handleNodeClick(name)) {
76
+ onSubflowChange?.(true, name);
77
+ }
78
+ }
79
+ else if (onNodeClick && snapshots) {
80
+ const idx = snapshots.findIndex((s) => s.stageLabel === name);
81
+ if (idx >= 0)
82
+ onNodeClick(idx);
83
+ }
84
+ }, [subflowNav, onNodeClick, onSubflowChange, snapshots]);
85
+ return (_jsxs("div", { className: className, style: { width: "100%", height: "100%", display: "flex", flexDirection: "row", ...style }, "data-fp": "traced-flowchart", children: [showTree && treeVisible && (_jsx(SubflowTree, { spec: spec, activeStage: overlay?.activeStage, doneStages: overlay?.doneStages, onNodeSelect: handleTreeNodeSelect, unstyled: unstyled, style: { width: treeWidth, flexShrink: 0, height: "100%" } })), _jsxs("div", { style: { flex: 1, display: "flex", flexDirection: "column", minWidth: 0, height: "100%" }, children: [(subflowNav.isInSubflow || (showTree && !treeVisible)) && (_jsxs("div", { style: { display: "flex", alignItems: "stretch", flexShrink: 0 }, children: [showTree && !treeVisible && (_jsx("button", { onClick: () => setTreeVisible(true), "data-fp": "tree-toggle", style: unstyled ? {} : {
86
+ background: "transparent",
87
+ border: "none",
88
+ cursor: "pointer",
89
+ padding: "6px 8px",
90
+ fontSize: 10,
91
+ flexShrink: 0,
92
+ }, children: "\u25B6" })), _jsx("div", { style: { flex: 1 }, children: _jsx(SubflowBreadcrumb, { breadcrumbs: subflowNav.breadcrumbs, onNavigate: handleBreadcrumbNavigate }) })] })), showTree && treeVisible && (_jsxs("div", { style: { display: "flex", alignItems: "stretch", flexShrink: 0 }, children: [_jsx("button", { onClick: () => setTreeVisible(false), "data-fp": "tree-toggle", style: unstyled ? {} : {
93
+ background: "transparent",
94
+ border: "none",
95
+ cursor: "pointer",
96
+ padding: "6px 8px",
97
+ fontSize: 10,
98
+ flexShrink: 0,
99
+ }, children: "\u25C0" }), _jsx("div", { style: { flex: 1 }, children: subflowNav.isInSubflow && (_jsx(SubflowBreadcrumb, { breadcrumbs: subflowNav.breadcrumbs, onNavigate: handleBreadcrumbNavigate })) })] })), _jsx("div", { style: { flex: 1, minHeight: 0 }, children: _jsx(ReactFlow, { nodes: nodes, edges: edges, onNodeClick: handleNodeClick, nodeTypes: nodeTypes, fitView: true, panOnDrag: false, zoomOnScroll: false, zoomOnPinch: false, zoomOnDoubleClick: false, preventScrolling: false, nodesDraggable: false, nodesConnectable: false, elementsSelectable: !!onNodeClick, children: !unstyled && (_jsx(Background, { variant: BackgroundVariant.Dots, gap: 16, size: 1 })) }) })] })] }));
100
+ }
101
+ //# sourceMappingURL=TracedFlowchartView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracedFlowchartView.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/TracedFlowchartView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { FlowchartView } from "./FlowchartView";
2
+ export type { FlowchartViewProps } from "./FlowchartView";
3
+ export { TracedFlowchartView } from "./TracedFlowchartView";
4
+ export type { TracedFlowchartViewProps } from "./TracedFlowchartView";
5
+ export { SubflowBreadcrumb } from "./SubflowBreadcrumb";
6
+ export type { SubflowBreadcrumbProps } from "./SubflowBreadcrumb";
7
+ export { useSubflowNavigation } from "./useSubflowNavigation";
8
+ export type { SubflowNavigation, BreadcrumbEntry } from "./useSubflowNavigation";
9
+ export { SubflowTree } from "./SubflowTree";
10
+ export type { SubflowTreeProps, SubflowTreeEntry } from "./SubflowTree";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { FlowchartView } from "./FlowchartView";
2
+ export { TracedFlowchartView } from "./TracedFlowchartView";
3
+ export { SubflowBreadcrumb } from "./SubflowBreadcrumb";
4
+ export { useSubflowNavigation } from "./useSubflowNavigation";
5
+ export { SubflowTree } from "./SubflowTree";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Converts a SerializedPipelineStructure (from builder.toSpec()) into
3
+ * ReactFlow nodes and edges with auto-layout.
4
+ *
5
+ * Supports two modes:
6
+ * 1. Build-time only (no executionState) — all nodes gray
7
+ * 2. With execution overlay — executed nodes colored, active node highlighted,
8
+ * unvisited nodes stay gray
9
+ */
10
+ import type { Node, Edge } from "@xyflow/react";
11
+ export interface SpecNode {
12
+ name: string;
13
+ id?: string;
14
+ type?: "stage" | "decider" | "fork" | "streaming";
15
+ description?: string;
16
+ children?: SpecNode[];
17
+ next?: SpecNode;
18
+ branchIds?: string[];
19
+ hasDecider?: boolean;
20
+ hasSelector?: boolean;
21
+ loopTarget?: string;
22
+ isSubflowRoot?: boolean;
23
+ subflowId?: string;
24
+ subflowName?: string;
25
+ subflowStructure?: SpecNode;
26
+ }
27
+ export interface ExecutionOverlay {
28
+ /** Names of stages that have completed (before the active one) */
29
+ doneStages: Set<string>;
30
+ /** Name of the currently active stage */
31
+ activeStage: string | null;
32
+ /** Names of all stages that were executed (done + active) */
33
+ executedStages: Set<string>;
34
+ /** Ordered list of executed stage names (for step numbering) */
35
+ executionOrder?: string[];
36
+ }
37
+ /** Colors for the flowchart — consumer provides these to match their theme */
38
+ export interface FlowchartColors {
39
+ edgeDefault: string;
40
+ edgeExecuted: string;
41
+ edgeActive: string;
42
+ edgeLoop: string;
43
+ labelDefault: string;
44
+ labelExecuted: string;
45
+ labelLoop: string;
46
+ pathGlow: string;
47
+ }
48
+ /**
49
+ * Convert a pipeline spec to ReactFlow graph.
50
+ * Pass `overlay` to color nodes/edges by execution state.
51
+ */
52
+ export declare function specToReactFlow(spec: SpecNode, overlay?: ExecutionOverlay, colors?: Partial<FlowchartColors>): {
53
+ nodes: Node[];
54
+ edges: Edge[];
55
+ };
56
+ //# sourceMappingURL=specToReactFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specToReactFlow.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/specToReactFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,yCAAyC;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6DAA6D;IAC7D,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgOD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,CAAC,EAAE,gBAAgB,EAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf,CAaA"}
@@ -0,0 +1,202 @@
1
+ import { defaultTokens } from "../../theme/tokens";
2
+ /** Default colors derived from theme tokens. Consumer can override per-call. */
3
+ const DEFAULT_COLORS = {
4
+ edgeDefault: defaultTokens.colors.textMuted,
5
+ edgeExecuted: defaultTokens.colors.success,
6
+ edgeActive: defaultTokens.colors.primary,
7
+ edgeLoop: defaultTokens.colors.warning,
8
+ labelDefault: defaultTokens.colors.textSecondary,
9
+ labelExecuted: defaultTokens.colors.success,
10
+ labelLoop: defaultTokens.colors.warning,
11
+ pathGlow: `${defaultTokens.colors.success}4D`, // ~30% opacity hex
12
+ };
13
+ const Y_STEP = 100;
14
+ const X_SPREAD = 200;
15
+ function nid(n) {
16
+ return n.name || n.id || `spec-${Math.random()}`;
17
+ }
18
+ function addEdge(state, source, target, label, isLoop) {
19
+ state.edgeCounter++;
20
+ const o = state.overlay;
21
+ const c = state.colors;
22
+ const executed = o && o.executedStages.has(source) && o.executedStages.has(target);
23
+ const isLeadingEdge = o && source === o.activeStage && !o.doneStages.has(target);
24
+ // Loop edges — route via right-side handles so they don't overlap center edges
25
+ // Only mark as executed when the loop has actually fired:
26
+ // the target must appear AFTER the source in executionOrder
27
+ if (isLoop) {
28
+ let loopExecuted = false;
29
+ if (o?.executionOrder) {
30
+ const lastSourceIdx = o.executionOrder.lastIndexOf(source);
31
+ if (lastSourceIdx >= 0) {
32
+ loopExecuted = o.executionOrder.slice(lastSourceIdx + 1).includes(target);
33
+ }
34
+ }
35
+ state.edges.push({
36
+ id: `se${state.edgeCounter}`,
37
+ source,
38
+ target,
39
+ sourceHandle: "loop-source",
40
+ targetHandle: "loop-target",
41
+ label: label ?? "loop",
42
+ type: "smoothstep",
43
+ pathOptions: { offset: 40, borderRadius: 16 },
44
+ style: {
45
+ stroke: c.edgeLoop,
46
+ strokeWidth: loopExecuted ? 3 : 2,
47
+ strokeDasharray: "6 3",
48
+ opacity: o && !loopExecuted ? 0.35 : 1,
49
+ },
50
+ labelStyle: { fontSize: 10, fontWeight: 700, fill: c.labelLoop },
51
+ animated: loopExecuted,
52
+ zIndex: 2,
53
+ });
54
+ return;
55
+ }
56
+ if (executed) {
57
+ // "Google Maps route" — thick glowing path for executed edges
58
+ // Background glow layer (subtle, behind the route line)
59
+ state.edges.push({
60
+ id: `se${state.edgeCounter}-glow`,
61
+ source,
62
+ target,
63
+ style: {
64
+ stroke: c.pathGlow,
65
+ strokeWidth: 8,
66
+ opacity: 0.4,
67
+ },
68
+ zIndex: 0,
69
+ selectable: false,
70
+ focusable: false,
71
+ });
72
+ // Foreground path (solid route line)
73
+ state.edges.push({
74
+ id: `se${state.edgeCounter}`,
75
+ source,
76
+ target,
77
+ label,
78
+ style: {
79
+ stroke: isLeadingEdge ? c.edgeActive : c.edgeExecuted,
80
+ strokeWidth: 3.5,
81
+ },
82
+ labelStyle: { fontSize: 10, fontWeight: 600, fill: c.labelExecuted },
83
+ animated: !!isLeadingEdge,
84
+ zIndex: 1,
85
+ });
86
+ }
87
+ else {
88
+ // Non-executed — thin, faded base map edge
89
+ state.edges.push({
90
+ id: `se${state.edgeCounter}`,
91
+ source,
92
+ target,
93
+ label,
94
+ style: {
95
+ stroke: c.edgeDefault,
96
+ strokeWidth: 1.5,
97
+ opacity: o ? 0.3 : 1,
98
+ },
99
+ labelStyle: { fontSize: 10, fill: c.labelDefault },
100
+ });
101
+ }
102
+ }
103
+ function walk(node, state, x, y) {
104
+ const id = nid(node);
105
+ if (state.seen.has(id)) {
106
+ return { lastIds: [id], bottomY: y };
107
+ }
108
+ state.seen.add(id);
109
+ const isDecider = node.type === "decider" || node.hasDecider;
110
+ const isFork = node.type === "fork";
111
+ const o = state.overlay;
112
+ const isDone = o ? o.doneStages.has(id) : false;
113
+ const isActive = o ? o.activeStage === id : false;
114
+ const wasExecuted = o ? o.executedStages.has(id) : false;
115
+ // When overlay is present, dim unvisited nodes
116
+ const dimmed = o && !wasExecuted;
117
+ // Step numbers for executed nodes (1-based) — multiple when revisited via loops
118
+ let stepNumbers;
119
+ if (o?.executionOrder) {
120
+ const nums = [];
121
+ for (let i = 0; i < o.executionOrder.length; i++) {
122
+ if (o.executionOrder[i] === id)
123
+ nums.push(i + 1);
124
+ }
125
+ if (nums.length > 0)
126
+ stepNumbers = nums;
127
+ }
128
+ state.nodes.push({
129
+ id,
130
+ position: { x, y },
131
+ data: {
132
+ label: node.name,
133
+ active: isActive,
134
+ done: isDone,
135
+ error: false,
136
+ isDecider,
137
+ isFork,
138
+ description: node.description,
139
+ subflowId: node.subflowId,
140
+ dimmed,
141
+ stepNumbers,
142
+ isSubflow: !!node.isSubflowRoot,
143
+ },
144
+ type: "stage",
145
+ style: dimmed ? { opacity: 0.35 } : undefined,
146
+ });
147
+ let lastIds = [id];
148
+ let bottomY = y;
149
+ // Handle children (fork/decider branches)
150
+ if (node.children && node.children.length > 0) {
151
+ const totalWidth = (node.children.length - 1) * X_SPREAD;
152
+ const startX = x - totalWidth / 2;
153
+ const childY = y + Y_STEP;
154
+ const childResults = [];
155
+ for (let i = 0; i < node.children.length; i++) {
156
+ const child = node.children[i];
157
+ const childX = startX + i * X_SPREAD;
158
+ const edgeLabel = node.branchIds?.[i];
159
+ addEdge(state, id, nid(child), edgeLabel);
160
+ const result = walk(child, state, childX, childY);
161
+ childResults.push(result);
162
+ }
163
+ lastIds = childResults.flatMap((r) => r.lastIds);
164
+ bottomY = Math.max(...childResults.map((r) => r.bottomY));
165
+ }
166
+ // Handle loop-back edge — visually distinct dashed orange arrow
167
+ // Must be added before processing `next`, since `next` returns early
168
+ if (node.loopTarget) {
169
+ addEdge(state, id, node.loopTarget, "loop", true);
170
+ }
171
+ // Handle linear continuation
172
+ if (node.next) {
173
+ const nextY = bottomY + Y_STEP;
174
+ const nextId = nid(node.next);
175
+ for (const lid of lastIds) {
176
+ // Skip forward edge when a loop edge already connects to the same target
177
+ if (node.loopTarget && lid === id && node.loopTarget === nextId)
178
+ continue;
179
+ addEdge(state, lid, nextId);
180
+ }
181
+ const result = walk(node.next, state, x, nextY);
182
+ return result;
183
+ }
184
+ return { lastIds, bottomY };
185
+ }
186
+ /**
187
+ * Convert a pipeline spec to ReactFlow graph.
188
+ * Pass `overlay` to color nodes/edges by execution state.
189
+ */
190
+ export function specToReactFlow(spec, overlay, colors) {
191
+ const state = {
192
+ nodes: [],
193
+ edges: [],
194
+ edgeCounter: 0,
195
+ seen: new Set(),
196
+ overlay: overlay ?? null,
197
+ colors: { ...DEFAULT_COLORS, ...colors },
198
+ };
199
+ walk(spec, state, 300, 0);
200
+ return { nodes: state.nodes, edges: state.edges };
201
+ }
202
+ //# sourceMappingURL=specToReactFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specToReactFlow.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/specToReactFlow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { SpecNode, ExecutionOverlay, FlowchartColors } from "./specToReactFlow";
2
+ import type { Node, Edge } from "@xyflow/react";
3
+ export interface BreadcrumbEntry {
4
+ /** Display name for this level */
5
+ label: string;
6
+ /** The spec node tree at this level */
7
+ spec: SpecNode;
8
+ /** Human-readable description of this subflow */
9
+ description?: string;
10
+ }
11
+ export interface SubflowNavigation {
12
+ /** Current breadcrumb path (root → ... → current) */
13
+ breadcrumbs: BreadcrumbEntry[];
14
+ /** Current level's ReactFlow nodes */
15
+ nodes: Node[];
16
+ /** Current level's ReactFlow edges */
17
+ edges: Edge[];
18
+ /** Call when a node is clicked — drills in if it's a subflow */
19
+ handleNodeClick: (nodeId: string) => boolean;
20
+ /** Navigate to a specific breadcrumb level (0 = root) */
21
+ navigateTo: (level: number) => void;
22
+ /** Whether we're currently inside a subflow (not at root) */
23
+ isInSubflow: boolean;
24
+ /** Name of the subflow node we drilled into (for finding execution data) */
25
+ currentSubflowNodeName: string | null;
26
+ }
27
+ /**
28
+ * Hook that manages subflow drill-down navigation for a flowchart spec.
29
+ *
30
+ * Maintains a breadcrumb stack. When a subflow node is clicked, pushes its
31
+ * nested spec onto the stack and re-derives nodes/edges. Breadcrumb clicks
32
+ * pop back to that level.
33
+ */
34
+ export declare function useSubflowNavigation(rootSpec: SpecNode | null, overlay?: ExecutionOverlay, colors?: Partial<FlowchartColors>): SubflowNavigation;
35
+ //# sourceMappingURL=useSubflowNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSubflowNavigation.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/useSubflowNavigation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,sCAAsC;IACtC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,gEAAgE;IAChE,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7C,yDAAyD;IACzD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,gBAAgB,EAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,iBAAiB,CA8EnB"}