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
package/README.md CHANGED
@@ -137,9 +137,34 @@ function PipelineChart({ spec }) {
137
137
  }
138
138
  ```
139
139
 
140
- ### With execution overlay (time-travel)
140
+ ### Self-contained traced flowchart (recommended)
141
141
 
142
- The overlay highlights which stages have executed, which is active, and the execution path like a Google Maps route overlay.
142
+ `TracedFlowchartView` handles everything overlay computation, subflow drill-down, breadcrumbs. Just pass `spec` + `snapshots`:
143
+
144
+ ```tsx
145
+ import { TracedFlowchartView } from "footprint-explainable-ui/flowchart";
146
+
147
+ function MyDebugger({ spec, snapshots }) {
148
+ const [idx, setIdx] = useState(0);
149
+
150
+ return (
151
+ <div style={{ height: 400 }}>
152
+ <TracedFlowchartView
153
+ spec={spec}
154
+ snapshots={snapshots}
155
+ snapshotIndex={idx}
156
+ onNodeClick={(i) => setIdx(i as number)}
157
+ />
158
+ </div>
159
+ );
160
+ }
161
+ ```
162
+
163
+ Without `snapshots`, it renders a plain static flowchart. With `snapshots`, it shows the execution trace path.
164
+
165
+ ### With execution overlay (manual control)
166
+
167
+ For full control, use `specToReactFlow` directly. The overlay highlights which stages have executed, which is active, and the execution path — like a Google Maps route overlay.
143
168
 
144
169
  ```tsx
145
170
  import { specToReactFlow, type ExecutionOverlay } from "footprint-explainable-ui/flowchart";
@@ -348,7 +373,8 @@ interface ThemeTokens {
348
373
 
349
374
  | Export | Description |
350
375
  |---|---|
351
- | `FlowchartView` | ReactFlow pipeline visualization with execution overlay |
376
+ | `TracedFlowchartView` | Self-contained flowchart with trace overlay, subflow drill-down, breadcrumbs |
377
+ | `FlowchartView` | Lower-level ReactFlow wrapper with execution state coloring |
352
378
  | `StageNode` | Custom node with state-aware coloring, step badges, pulse rings |
353
379
  | `specToReactFlow` | Convert pipeline spec → ReactFlow nodes/edges with path overlay |
354
380
  | `TimeTravelDebugger` | Full debugger with flowchart + all panels |
@@ -373,6 +399,19 @@ All components accept a `size` prop: `"compact"`, `"default"`, or `"detailed"`.
373
399
  <MemoryInspector snapshots={snapshots} size="detailed" />
374
400
  ```
375
401
 
402
+ ### Collapsible GanttTimeline
403
+
404
+ By default, the Gantt timeline collapses to 5 rows with an expand toggle. Auto-scrolls to keep the active stage visible:
405
+
406
+ ```tsx
407
+ <GanttTimeline
408
+ snapshots={snapshots}
409
+ selectedIndex={idx}
410
+ onSelect={setIdx}
411
+ maxVisibleRows={5} // default — set 0 to disable collapse
412
+ />
413
+ ```
414
+
376
415
  ## Unstyled Mode
377
416
 
378
417
  Strip all built-in styles for full CSS control. Components render semantic `data-fp` attributes:
@@ -0,0 +1,52 @@
1
+ import type { StageSnapshot } from "../types";
2
+ /**
3
+ * Shape of FootPrint's RuntimeSnapshot (from FlowChartExecutor.getSnapshot()).
4
+ * We define it here instead of importing to avoid a hard dependency on footprintjs.
5
+ */
6
+ interface RuntimeStageSnapshot {
7
+ id: string;
8
+ name?: string;
9
+ isDecider?: boolean;
10
+ isFork?: boolean;
11
+ logs: Record<string, unknown>;
12
+ errors: Record<string, unknown>;
13
+ metrics: Record<string, unknown>;
14
+ evals: Record<string, unknown>;
15
+ flowMessages?: unknown[];
16
+ description?: string;
17
+ subflowId?: string;
18
+ next?: RuntimeStageSnapshot;
19
+ children?: RuntimeStageSnapshot[];
20
+ }
21
+ interface RuntimeSnapshot {
22
+ sharedState: Record<string, unknown>;
23
+ executionTree: RuntimeStageSnapshot;
24
+ commitLog: unknown[];
25
+ }
26
+ /**
27
+ * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots
28
+ * suitable for visualization components.
29
+ *
30
+ * Usage:
31
+ * ```ts
32
+ * const executor = new FlowChartExecutor(chart);
33
+ * await executor.run();
34
+ * const snapshots = toVisualizationSnapshots(executor.getSnapshot());
35
+ * ```
36
+ */
37
+ export declare function toVisualizationSnapshots(runtime: RuntimeSnapshot): StageSnapshot[];
38
+ /**
39
+ * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).
40
+ * Useful for testing or custom data sources.
41
+ */
42
+ export declare function createSnapshots(stages: Array<{
43
+ name: string;
44
+ label?: string;
45
+ memory?: Record<string, unknown>;
46
+ narrative?: string;
47
+ durationMs?: number;
48
+ description?: string;
49
+ subflowId?: string;
50
+ }>): StageSnapshot[];
51
+ export {};
52
+ //# sourceMappingURL=fromRuntimeSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromRuntimeSnapshot.d.ts","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;;GAGG;AACH,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,EAAE,oBAAoB,CAAC;IACpC,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,eAAe,GACvB,aAAa,EAAE,CAIjB;AAkFD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GACD,aAAa,EAAE,CAkBjB"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots
3
+ * suitable for visualization components.
4
+ *
5
+ * Usage:
6
+ * ```ts
7
+ * const executor = new FlowChartExecutor(chart);
8
+ * await executor.run();
9
+ * const snapshots = toVisualizationSnapshots(executor.getSnapshot());
10
+ * ```
11
+ */
12
+ export function toVisualizationSnapshots(runtime) {
13
+ const snapshots = [];
14
+ flattenTree(runtime.executionTree, snapshots, runtime.sharedState);
15
+ return snapshots;
16
+ }
17
+ function flattenTree(node, out, sharedState, accumulatedMs = 0) {
18
+ // Estimate duration from metrics if available
19
+ const durationMs = typeof node.metrics?.durationMs === "number"
20
+ ? node.metrics.durationMs
21
+ : 1;
22
+ const startMs = accumulatedMs;
23
+ // Build narrative from logs
24
+ const narrative = buildNarrative(node);
25
+ // Build memory from logs (key-value pairs written during this stage)
26
+ const memory = {};
27
+ if (node.logs) {
28
+ Object.assign(memory, node.logs);
29
+ }
30
+ out.push({
31
+ stageName: node.name || node.id,
32
+ stageLabel: node.name || node.id,
33
+ memory,
34
+ narrative,
35
+ startMs,
36
+ durationMs,
37
+ status: "done",
38
+ ...(node.description ? { description: node.description } : undefined),
39
+ ...(node.subflowId ? { subflowId: node.subflowId } : undefined),
40
+ });
41
+ let nextMs = startMs + durationMs;
42
+ // Handle parallel children (fork)
43
+ if (node.children && node.children.length > 0) {
44
+ let maxChildEnd = nextMs;
45
+ for (const child of node.children) {
46
+ const childEnd = flattenTree(child, out, sharedState, nextMs);
47
+ maxChildEnd = Math.max(maxChildEnd, childEnd);
48
+ }
49
+ nextMs = maxChildEnd;
50
+ }
51
+ // Handle linear continuation
52
+ if (node.next) {
53
+ nextMs = flattenTree(node.next, out, sharedState, nextMs);
54
+ }
55
+ return nextMs;
56
+ }
57
+ function buildNarrative(node) {
58
+ const parts = [];
59
+ if (node.name) {
60
+ parts.push(`Stage "${node.name}" executed.`);
61
+ }
62
+ if (node.logs && Object.keys(node.logs).length > 0) {
63
+ const keys = Object.keys(node.logs);
64
+ parts.push(`Wrote ${keys.length} key(s): ${keys.join(", ")}.`);
65
+ }
66
+ if (node.errors && Object.keys(node.errors).length > 0) {
67
+ parts.push(`Errors: ${JSON.stringify(node.errors)}`);
68
+ }
69
+ if (node.isFork) {
70
+ parts.push(`Forked into ${node.children?.length ?? 0} parallel branch(es).`);
71
+ }
72
+ return parts.join(" ") || `Stage ${node.id} completed.`;
73
+ }
74
+ /**
75
+ * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).
76
+ * Useful for testing or custom data sources.
77
+ */
78
+ export function createSnapshots(stages) {
79
+ let accMs = 0;
80
+ return stages.map((s) => {
81
+ const duration = s.durationMs ?? 1;
82
+ const snap = {
83
+ stageName: s.name,
84
+ stageLabel: s.label ?? s.name,
85
+ memory: s.memory ?? {},
86
+ narrative: s.narrative ?? `${s.label ?? s.name} completed.`,
87
+ startMs: accMs,
88
+ durationMs: duration,
89
+ status: "done",
90
+ ...(s.description ? { description: s.description } : undefined),
91
+ ...(s.subflowId ? { subflowId: s.subflowId } : undefined),
92
+ };
93
+ accMs += duration;
94
+ return snap;
95
+ });
96
+ }
97
+ //# sourceMappingURL=fromRuntimeSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromRuntimeSnapshot.js","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { StageSnapshot, BaseComponentProps } from "../../types";
2
+ export type ShellTab = "result" | "explainable" | "ai-compatible";
3
+ export interface ExplainableShellProps extends BaseComponentProps {
4
+ /** Stage snapshots for time-travel visualization */
5
+ snapshots: StageSnapshot[];
6
+ /** Final pipeline result data */
7
+ resultData?: Record<string, unknown> | null;
8
+ /** Console log lines */
9
+ logs?: string[];
10
+ /** Combined narrative lines */
11
+ narrative?: string[];
12
+ /** Which tabs to show (default: all three) */
13
+ tabs?: ShellTab[];
14
+ /** Initially active tab */
15
+ defaultTab?: ShellTab;
16
+ /** Hide console in result tab */
17
+ hideConsole?: boolean;
18
+ /** Custom content to render in each tab slot */
19
+ renderFlowchart?: (props: {
20
+ snapshots: StageSnapshot[];
21
+ selectedIndex: number;
22
+ onNodeClick?: (index: number) => void;
23
+ }) => React.ReactNode;
24
+ }
25
+ export declare function ExplainableShell({ snapshots, resultData, logs, narrative, tabs, defaultTab, hideConsole, renderFlowchart, size, unstyled, className, style, }: ExplainableShellProps): import("react/jsx-runtime").JSX.Element;
26
+ //# sourceMappingURL=ExplainableShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainableShell.d.ts","sourceRoot":"","sources":["../../../src/components/ExplainableShell/ExplainableShell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAarE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;AAElE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oDAAoD;IACpD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,SAAS,EAAE,aAAa,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACvC,KAAK,KAAK,CAAC,SAAS,CAAC;CACvB;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,IAAS,EACT,SAAc,EACd,IAAiD,EACjD,UAAU,EACV,WAAmB,EACnB,eAAe,EACf,IAAgB,EAChB,QAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,2CAoQvB"}
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback, useMemo } from "react";
3
+ import { theme, fontSize, padding } from "../../theme";
4
+ import { ResultPanel } from "../ResultPanel";
5
+ import { GanttTimeline } from "../GanttTimeline";
6
+ import { MemoryInspector } from "../MemoryInspector";
7
+ import { NarrativeTrace } from "../NarrativeTrace";
8
+ import { ScopeDiff } from "../ScopeDiff";
9
+ import { TimeTravelControls } from "../TimeTravelControls";
10
+ // ---------------------------------------------------------------------------
11
+ // Component
12
+ // ---------------------------------------------------------------------------
13
+ export function ExplainableShell({ snapshots, resultData, logs = [], narrative = [], tabs = ["result", "explainable", "ai-compatible"], defaultTab, hideConsole = false, renderFlowchart, size = "default", unstyled = false, className, style, }) {
14
+ const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]);
15
+ const [snapshotIdx, setSnapshotIdx] = useState(0);
16
+ const fs = fontSize[size];
17
+ const pad = padding[size];
18
+ const handleSnapshotChange = useCallback((idx) => {
19
+ setSnapshotIdx(Math.max(0, Math.min(idx, snapshots.length - 1)));
20
+ }, [snapshots.length]);
21
+ // Progressive narrative reveal
22
+ const revealedCount = useMemo(() => {
23
+ if (snapshots.length === 0 || narrative.length === 0)
24
+ return narrative.length;
25
+ const boundaries = [];
26
+ for (let i = 0; i < narrative.length; i++) {
27
+ const trimmed = narrative[i].trimStart();
28
+ if ((trimmed.startsWith("Stage ") && !trimmed.match(/^Stage\s+\d+:\s*Step\s/)) ||
29
+ trimmed.startsWith("[")) {
30
+ boundaries.push(i);
31
+ }
32
+ }
33
+ if (boundaries.length === 0) {
34
+ const ratio = (snapshotIdx + 1) / snapshots.length;
35
+ return Math.max(1, Math.ceil(narrative.length * ratio));
36
+ }
37
+ const groupsToShow = Math.max(1, Math.min(Math.floor(((snapshotIdx + 1) / snapshots.length) * boundaries.length) || 1, boundaries.length));
38
+ const endIdx = groupsToShow < boundaries.length ? boundaries[groupsToShow] : narrative.length;
39
+ return Math.max(1, endIdx);
40
+ }, [snapshots.length, snapshotIdx, narrative]);
41
+ // Scope diff data
42
+ const prevMemory = snapshotIdx > 0 ? snapshots[snapshotIdx - 1]?.memory : null;
43
+ const currMemory = snapshots[snapshotIdx]?.memory ?? {};
44
+ const tabLabels = {
45
+ result: "Result",
46
+ explainable: "Explainable",
47
+ "ai-compatible": "AI-Compatible",
48
+ };
49
+ if (unstyled) {
50
+ return (_jsxs("div", { className: className, style: style, "data-fp": "explainable-shell", children: [_jsx("div", { "data-fp": "shell-tabs", children: tabs.map((tab) => (_jsx("button", { "data-fp": "shell-tab", "data-active": tab === activeTab, onClick: () => setActiveTab(tab), children: tabLabels[tab] }, tab))) }), _jsxs("div", { "data-fp": "shell-content", "data-tab": activeTab, children: [activeTab === "result" && (_jsx(ResultPanel, { data: resultData ?? null, logs: logs, hideConsole: hideConsole, unstyled: true })), activeTab === "explainable" && (_jsxs(_Fragment, { children: [_jsx(TimeTravelControls, { snapshots: snapshots, selectedIndex: snapshotIdx, onIndexChange: handleSnapshotChange, unstyled: true }), renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange }), _jsx(MemoryInspector, { snapshots: snapshots, selectedIndex: snapshotIdx, unstyled: true }), _jsx(ScopeDiff, { previous: prevMemory, current: currMemory, unstyled: true }), _jsx(GanttTimeline, { snapshots: snapshots, selectedIndex: snapshotIdx, onSelect: handleSnapshotChange, unstyled: true })] })), activeTab === "ai-compatible" && (_jsxs(_Fragment, { children: [_jsx(TimeTravelControls, { snapshots: snapshots, selectedIndex: snapshotIdx, onIndexChange: handleSnapshotChange, unstyled: true }), renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange }), _jsx(NarrativeTrace, { narrative: narrative, revealedCount: revealedCount, unstyled: true })] }))] })] }));
51
+ }
52
+ // ── Styled mode ──
53
+ return (_jsxs("div", { className: className, style: {
54
+ height: "100%",
55
+ display: "flex",
56
+ flexDirection: "column",
57
+ overflow: "hidden",
58
+ background: theme.bgPrimary,
59
+ color: theme.textPrimary,
60
+ fontFamily: theme.fontSans,
61
+ ...style,
62
+ }, "data-fp": "explainable-shell", children: [_jsx("div", { style: {
63
+ display: "flex",
64
+ gap: 0,
65
+ borderBottom: `1px solid ${theme.border}`,
66
+ background: theme.bgSecondary,
67
+ flexShrink: 0,
68
+ }, children: tabs.map((tab) => {
69
+ const active = tab === activeTab;
70
+ return (_jsx("button", { onClick: () => setActiveTab(tab), style: {
71
+ padding: `${pad - 4}px ${pad}px`,
72
+ fontSize: fs.label,
73
+ fontWeight: active ? 700 : 500,
74
+ textTransform: "uppercase",
75
+ letterSpacing: "0.08em",
76
+ color: active ? theme.primary : theme.textMuted,
77
+ background: "transparent",
78
+ border: "none",
79
+ borderBottom: active ? `2px solid ${theme.primary}` : "2px solid transparent",
80
+ cursor: "pointer",
81
+ transition: "all 0.15s ease",
82
+ }, children: tabLabels[tab] }, tab));
83
+ }) }), _jsxs("div", { style: { flex: 1, overflow: "hidden", display: "flex", flexDirection: "column" }, children: [activeTab === "result" && (_jsx(ResultPanel, { data: resultData ?? null, logs: logs, hideConsole: hideConsole, size: size })), activeTab === "explainable" && (_jsxs(_Fragment, { children: [_jsx(TimeTravelControls, { snapshots: snapshots, selectedIndex: snapshotIdx, onIndexChange: handleSnapshotChange, size: size }), _jsxs("div", { style: { flex: 1, display: "flex", overflow: "hidden" }, children: [renderFlowchart && (_jsx("div", { style: { flex: 1, overflow: "hidden", borderRight: `1px solid ${theme.border}` }, children: renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange }) })), _jsxs("div", { style: {
84
+ width: renderFlowchart ? "40%" : "100%",
85
+ minWidth: 280,
86
+ overflow: "auto",
87
+ display: "flex",
88
+ flexDirection: "column",
89
+ }, children: [_jsx(MemoryInspector, { snapshots: snapshots, selectedIndex: snapshotIdx, size: size }), _jsx("div", { style: { borderTop: `1px solid ${theme.border}` }, children: _jsx(ScopeDiff, { previous: prevMemory, current: currMemory, hideUnchanged: true, size: size }) })] })] }), _jsx("div", { style: { borderTop: `1px solid ${theme.border}`, flexShrink: 0 }, children: _jsx(GanttTimeline, { snapshots: snapshots, selectedIndex: snapshotIdx, onSelect: handleSnapshotChange, size: size }) })] })), activeTab === "ai-compatible" && (_jsxs(_Fragment, { children: [_jsx(TimeTravelControls, { snapshots: snapshots, selectedIndex: snapshotIdx, onIndexChange: handleSnapshotChange, size: size }), _jsxs("div", { style: { flex: 1, display: "flex", overflow: "hidden" }, children: [renderFlowchart && (_jsx("div", { style: { flex: 1, overflow: "hidden", borderRight: `1px solid ${theme.border}` }, children: renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange }) })), _jsx(NarrativeTrace, { narrative: narrative, revealedCount: revealedCount, size: size, style: {
90
+ width: renderFlowchart ? "40%" : "100%",
91
+ minWidth: 280,
92
+ } })] })] }))] })] }));
93
+ }
94
+ //# sourceMappingURL=ExplainableShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainableShell.js","sourceRoot":"","sources":["../../../src/components/ExplainableShell/ExplainableShell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ExplainableShell } from "./ExplainableShell";
2
+ export type { ExplainableShellProps, ShellTab } from "./ExplainableShell";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExplainableShell/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ExplainableShell } from "./ExplainableShell";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ExplainableShell/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Node, Edge } from "@xyflow/react";
2
+ import type { StageSnapshot, BaseComponentProps } from "../../types";
3
+ export interface FlowchartViewProps extends BaseComponentProps {
4
+ /** ReactFlow nodes */
5
+ nodes: Node[];
6
+ /** ReactFlow edges */
7
+ edges: Edge[];
8
+ /** Optional snapshots for state-aware rendering (done/active coloring) */
9
+ snapshots?: StageSnapshot[];
10
+ /** Currently selected snapshot index (for state coloring) */
11
+ selectedIndex?: number;
12
+ /** Callback when a node is clicked */
13
+ onNodeClick?: (index: number) => void;
14
+ }
15
+ /**
16
+ * Pipeline flowchart visualization using ReactFlow.
17
+ * When snapshots are provided, nodes are colored by execution state.
18
+ */
19
+ export declare function FlowchartView({ nodes: rawNodes, edges: rawEdges, snapshots, selectedIndex, onNodeClick, unstyled, className, style, }: FlowchartViewProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=FlowchartView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowchartView.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/FlowchartView.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKrE,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,sBAAsB;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,sBAAsB;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,0EAA0E;IAC1E,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EACT,aAAiB,EACjB,WAAW,EACX,QAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,2CA6GpB"}
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo, useCallback } from "react";
3
+ import { ReactFlow, Background, BackgroundVariant, useNodesState, useEdgesState, } from "@xyflow/react";
4
+ import { StageNode } from "../StageNode";
5
+ import { theme } from "../../theme";
6
+ const nodeTypes = { stageNode: StageNode };
7
+ /**
8
+ * Pipeline flowchart visualization using ReactFlow.
9
+ * When snapshots are provided, nodes are colored by execution state.
10
+ */
11
+ export function FlowchartView({ nodes: rawNodes, edges: rawEdges, snapshots, selectedIndex = 0, onNodeClick, unstyled = false, className, style, }) {
12
+ // Enhance nodes with execution state
13
+ const enhancedNodes = useMemo(() => {
14
+ if (!snapshots || snapshots.length === 0) {
15
+ return rawNodes.map((n) => ({
16
+ ...n,
17
+ type: "stageNode",
18
+ data: {
19
+ ...n.data,
20
+ label: n.data.label || n.id,
21
+ active: false,
22
+ done: false,
23
+ error: false,
24
+ },
25
+ }));
26
+ }
27
+ const doneNames = new Set(snapshots.slice(0, selectedIndex).map((s) => s.stageName));
28
+ const activeName = snapshots[selectedIndex]?.stageName;
29
+ return rawNodes.map((n) => ({
30
+ ...n,
31
+ type: "stageNode",
32
+ data: {
33
+ ...n.data,
34
+ label: n.data.label || n.id,
35
+ active: n.id === activeName,
36
+ done: doneNames.has(n.id),
37
+ error: false,
38
+ },
39
+ }));
40
+ }, [rawNodes, snapshots, selectedIndex]);
41
+ // Enhance edges with state coloring
42
+ const enhancedEdges = useMemo(() => {
43
+ if (!snapshots || snapshots.length === 0) {
44
+ return rawEdges.map((e) => ({
45
+ ...e,
46
+ style: { stroke: theme.textMuted, strokeWidth: 1.5 },
47
+ animated: false,
48
+ }));
49
+ }
50
+ const doneNames = new Set(snapshots.slice(0, selectedIndex + 1).map((s) => s.stageName));
51
+ const activeName = snapshots[selectedIndex]?.stageName;
52
+ return rawEdges.map((e) => {
53
+ const sourceIsDone = doneNames.has(e.source);
54
+ const isFromActive = e.source === activeName;
55
+ return {
56
+ ...e,
57
+ style: {
58
+ stroke: sourceIsDone ? theme.success : theme.textMuted,
59
+ strokeWidth: 1.5,
60
+ },
61
+ animated: isFromActive,
62
+ };
63
+ });
64
+ }, [rawEdges, snapshots, selectedIndex]);
65
+ const [nodes, , onNodesChange] = useNodesState(enhancedNodes);
66
+ const [edges, , onEdgesChange] = useEdgesState(enhancedEdges);
67
+ const handleNodeClick = useCallback((_, node) => {
68
+ if (!onNodeClick || !snapshots)
69
+ return;
70
+ const idx = snapshots.findIndex((s) => s.stageName === node.id);
71
+ if (idx >= 0)
72
+ onNodeClick(idx);
73
+ }, [onNodeClick, snapshots]);
74
+ return (_jsx("div", { className: className, style: {
75
+ width: "100%",
76
+ height: "100%",
77
+ ...style,
78
+ }, "data-fp": "flowchart-view", children: _jsx(ReactFlow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, 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 })) }) }));
79
+ }
80
+ //# sourceMappingURL=FlowchartView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowchartView.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/FlowchartView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BreadcrumbEntry } from "./useSubflowNavigation";
2
+ export interface SubflowBreadcrumbProps {
3
+ breadcrumbs: BreadcrumbEntry[];
4
+ onNavigate: (level: number) => void;
5
+ }
6
+ /**
7
+ * Breadcrumb bar for subflow drill-down navigation.
8
+ * Shows: Root > SubflowA > SubflowB — clicking any crumb navigates back.
9
+ */
10
+ export declare const SubflowBreadcrumb: import("react").NamedExoticComponent<SubflowBreadcrumbProps>;
11
+ //# sourceMappingURL=SubflowBreadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubflowBreadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/SubflowBreadcrumb.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,8DAkF5B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { theme } from "../../theme";
4
+ /**
5
+ * Breadcrumb bar for subflow drill-down navigation.
6
+ * Shows: Root > SubflowA > SubflowB — clicking any crumb navigates back.
7
+ */
8
+ export const SubflowBreadcrumb = memo(function SubflowBreadcrumb({ breadcrumbs, onNavigate, }) {
9
+ if (breadcrumbs.length <= 1)
10
+ return null;
11
+ return (_jsx("div", { style: {
12
+ display: "flex",
13
+ alignItems: "center",
14
+ gap: 4,
15
+ padding: "6px 12px",
16
+ background: theme.bgSecondary,
17
+ borderBottom: `1px solid ${theme.border}`,
18
+ fontSize: 12,
19
+ fontFamily: theme.fontSans,
20
+ flexShrink: 0,
21
+ overflowX: "auto",
22
+ }, children: breadcrumbs.map((crumb, i) => {
23
+ const isLast = i === breadcrumbs.length - 1;
24
+ return (_jsxs("span", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [i > 0 && (_jsx("span", { style: { color: theme.textMuted, fontSize: 10 }, children: "\u203A" })), isLast ? (_jsxs("span", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [_jsx("span", { style: {
25
+ color: theme.primary,
26
+ fontWeight: 600,
27
+ }, children: crumb.label }), crumb.description && (_jsxs("span", { style: {
28
+ color: theme.textMuted,
29
+ fontWeight: 400,
30
+ fontSize: 11,
31
+ }, children: ["\u2014 ", crumb.description] }))] })) : (_jsx("button", { onClick: () => onNavigate(i), style: {
32
+ background: "none",
33
+ border: "none",
34
+ color: theme.textSecondary,
35
+ cursor: "pointer",
36
+ padding: "2px 4px",
37
+ borderRadius: 4,
38
+ fontSize: 12,
39
+ fontFamily: "inherit",
40
+ fontWeight: 500,
41
+ transition: "color 0.15s",
42
+ }, onMouseEnter: (e) => {
43
+ e.currentTarget.style.color = `${theme.primary}`;
44
+ }, onMouseLeave: (e) => {
45
+ e.currentTarget.style.color = `${theme.textSecondary}`;
46
+ }, children: crumb.label }))] }, `${crumb.label}-${i}`));
47
+ }) }));
48
+ });
49
+ //# sourceMappingURL=SubflowBreadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubflowBreadcrumb.js","sourceRoot":"","sources":["../../../src/components/FlowchartView/SubflowBreadcrumb.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQpC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,iBAAiB,CAAC,EAC/D,WAAW,EACX,UAAU,GACa;IACvB,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,OAAO,CACL,cACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,KAAK,CAAC,WAAW;YAC7B,YAAY,EAAE,aAAa,KAAK,CAAC,MAAM,EAAE;YACzC,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,KAAK,CAAC,QAAQ;YAC1B,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,MAAM;SAClB,YAEA,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,CAAC,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5C,OAAO,CACL,gBAAkC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aACvF,CAAC,GAAG,CAAC,IAAI,CACR,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,uBAE9C,CACR,EACA,MAAM,CAAC,CAAC,CAAC,CACR,gBAAM,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC5D,eACE,KAAK,EAAE;oCACL,KAAK,EAAE,KAAK,CAAC,OAAO;oCACpB,UAAU,EAAE,GAAG;iCAChB,YAEA,KAAK,CAAC,KAAK,GACP,EACN,KAAK,CAAC,WAAW,IAAI,CACpB,gBACE,KAAK,EAAE;oCACL,KAAK,EAAE,KAAK,CAAC,SAAS;oCACtB,UAAU,EAAE,GAAG;oCACf,QAAQ,EAAE,EAAE;iCACb,wBAEE,KAAK,CAAC,WAAW,IACf,CACR,IACI,CACR,CAAC,CAAC,CAAC,CACF,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAC5B,KAAK,EAAE;4BACL,UAAU,EAAE,MAAM;4BAClB,MAAM,EAAE,MAAM;4BACd,KAAK,EAAE,KAAK,CAAC,aAAa;4BAC1B,MAAM,EAAE,SAAS;4BACjB,OAAO,EAAE,SAAS;4BAClB,YAAY,EAAE,CAAC;4BACf,QAAQ,EAAE,EAAE;4BACZ,UAAU,EAAE,SAAS;4BACrB,UAAU,EAAE,GAAG;4BACf,UAAU,EAAE,aAAa;yBAC1B,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;4BAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnD,CAAC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;4BAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;wBACzD,CAAC,YAEA,KAAK,CAAC,KAAK,GACL,CACV,KApDQ,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAqDzB,CACR,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { SpecNode } from "./specToReactFlow";
2
+ import type { BaseComponentProps } from "../../types";
3
+ export interface SubflowTreeEntry {
4
+ /** Node name / identifier */
5
+ name: string;
6
+ /** Human-readable description */
7
+ description?: string;
8
+ /** Subflow ID (when this node represents a subflow) */
9
+ subflowId?: string;
10
+ /** Whether this node is a subflow root (has nested structure) */
11
+ isSubflow?: boolean;
12
+ /** Nested children (subflow stages) */
13
+ children?: SubflowTreeEntry[];
14
+ }
15
+ export interface SubflowTreeProps extends BaseComponentProps {
16
+ /** Pipeline spec to derive the tree from */
17
+ spec: SpecNode;
18
+ /** Currently active stage name (highlights in tree) */
19
+ activeStage?: string | null;
20
+ /** Set of completed stage names */
21
+ doneStages?: Set<string>;
22
+ /** Called when a tree node is clicked */
23
+ onNodeSelect?: (name: string, isSubflow: boolean) => void;
24
+ }
25
+ /** Extracts a flat-ish tree of entries from a SpecNode for display. */
26
+ export declare function specToTree(node: SpecNode): SubflowTreeEntry[];
27
+ /**
28
+ * Collapsible tree sidebar showing the full subflow manifest.
29
+ *
30
+ * Shared navigation layer — humans click through the tree just like
31
+ * LLMs call getSubflowManifest() / getSubflowSpec().
32
+ *
33
+ * All colors come from `--fp-*` CSS variables set by the consumer.
34
+ */
35
+ export declare const SubflowTree: import("react").NamedExoticComponent<SubflowTreeProps>;
36
+ //# sourceMappingURL=SubflowTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubflowTree.d.ts","sourceRoot":"","sources":["../../../src/components/FlowchartView/SubflowTree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,4CAA4C;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mCAAmC;IACnC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,yCAAyC;IACzC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3D;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,EAAE,CAsC7D;AAuJD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,wDAwDtB,CAAC"}