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.
- package/README.md +42 -3
- package/dist/adapters/fromRuntimeSnapshot.d.ts +52 -0
- package/dist/adapters/fromRuntimeSnapshot.d.ts.map +1 -0
- package/dist/adapters/fromRuntimeSnapshot.js +97 -0
- package/dist/adapters/fromRuntimeSnapshot.js.map +1 -0
- package/dist/components/ExplainableShell/ExplainableShell.d.ts +26 -0
- package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +1 -0
- package/dist/components/ExplainableShell/ExplainableShell.js +94 -0
- package/dist/components/ExplainableShell/ExplainableShell.js.map +1 -0
- package/dist/components/ExplainableShell/index.d.ts +3 -0
- package/dist/components/ExplainableShell/index.d.ts.map +1 -0
- package/dist/components/ExplainableShell/index.js +2 -0
- package/dist/components/ExplainableShell/index.js.map +1 -0
- package/dist/components/FlowchartView/FlowchartView.d.ts +20 -0
- package/dist/components/FlowchartView/FlowchartView.d.ts.map +1 -0
- package/dist/components/FlowchartView/FlowchartView.js +80 -0
- package/dist/components/FlowchartView/FlowchartView.js.map +1 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts +11 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts.map +1 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.js +49 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.js.map +1 -0
- package/dist/components/FlowchartView/SubflowTree.d.ts +36 -0
- package/dist/components/FlowchartView/SubflowTree.d.ts.map +1 -0
- package/dist/components/FlowchartView/SubflowTree.js +143 -0
- package/dist/components/FlowchartView/SubflowTree.js.map +1 -0
- package/dist/components/FlowchartView/TracedFlowchartView.d.ts +20 -0
- package/dist/components/FlowchartView/TracedFlowchartView.d.ts.map +1 -0
- package/dist/components/FlowchartView/TracedFlowchartView.js +101 -0
- package/dist/components/FlowchartView/TracedFlowchartView.js.map +1 -0
- package/dist/components/FlowchartView/index.d.ts +11 -0
- package/dist/components/FlowchartView/index.d.ts.map +1 -0
- package/dist/components/FlowchartView/index.js +6 -0
- package/dist/components/FlowchartView/index.js.map +1 -0
- package/dist/components/FlowchartView/specToReactFlow.d.ts +56 -0
- package/dist/components/FlowchartView/specToReactFlow.d.ts.map +1 -0
- package/dist/components/FlowchartView/specToReactFlow.js +202 -0
- package/dist/components/FlowchartView/specToReactFlow.js.map +1 -0
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts +35 -0
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +1 -0
- package/dist/components/FlowchartView/useSubflowNavigation.js +80 -0
- package/dist/components/FlowchartView/useSubflowNavigation.js.map +1 -0
- package/dist/components/GanttTimeline/GanttTimeline.d.ts +18 -0
- package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +1 -0
- package/dist/components/GanttTimeline/GanttTimeline.js +123 -0
- package/dist/components/GanttTimeline/GanttTimeline.js.map +1 -0
- package/dist/components/GanttTimeline/index.d.ts +3 -0
- package/dist/components/GanttTimeline/index.d.ts.map +1 -0
- package/dist/components/GanttTimeline/index.js +2 -0
- package/dist/components/GanttTimeline/index.js.map +1 -0
- package/dist/components/MemoryInspector/MemoryInspector.d.ts +19 -0
- package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +1 -0
- package/dist/components/MemoryInspector/MemoryInspector.js +95 -0
- package/dist/components/MemoryInspector/MemoryInspector.js.map +1 -0
- package/dist/components/MemoryInspector/index.d.ts +3 -0
- package/dist/components/MemoryInspector/index.d.ts.map +1 -0
- package/dist/components/MemoryInspector/index.js +2 -0
- package/dist/components/MemoryInspector/index.js.map +1 -0
- package/dist/components/NarrativeLog/NarrativeLog.d.ts +15 -0
- package/dist/components/NarrativeLog/NarrativeLog.d.ts.map +1 -0
- package/dist/components/NarrativeLog/NarrativeLog.js +65 -0
- package/dist/components/NarrativeLog/NarrativeLog.js.map +1 -0
- package/dist/components/NarrativeLog/index.d.ts +3 -0
- package/dist/components/NarrativeLog/index.d.ts.map +1 -0
- package/dist/components/NarrativeLog/index.js +2 -0
- package/dist/components/NarrativeLog/index.js.map +1 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts +13 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +1 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.js +127 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.js.map +1 -0
- package/dist/components/NarrativeTrace/index.d.ts +3 -0
- package/dist/components/NarrativeTrace/index.d.ts.map +1 -0
- package/dist/components/NarrativeTrace/index.js +2 -0
- package/dist/components/NarrativeTrace/index.js.map +1 -0
- package/dist/components/ResultPanel/ResultPanel.d.ts +11 -0
- package/dist/components/ResultPanel/ResultPanel.d.ts.map +1 -0
- package/dist/components/ResultPanel/ResultPanel.js +54 -0
- package/dist/components/ResultPanel/ResultPanel.js.map +1 -0
- package/dist/components/ResultPanel/index.d.ts +3 -0
- package/dist/components/ResultPanel/index.d.ts.map +1 -0
- package/dist/components/ResultPanel/index.js +2 -0
- package/dist/components/ResultPanel/index.js.map +1 -0
- package/dist/components/ScopeDiff/ScopeDiff.d.ts +17 -0
- package/dist/components/ScopeDiff/ScopeDiff.d.ts.map +1 -0
- package/dist/components/ScopeDiff/ScopeDiff.js +87 -0
- package/dist/components/ScopeDiff/ScopeDiff.js.map +1 -0
- package/dist/components/ScopeDiff/index.d.ts +3 -0
- package/dist/components/ScopeDiff/index.d.ts.map +1 -0
- package/dist/components/ScopeDiff/index.js +2 -0
- package/dist/components/ScopeDiff/index.js.map +1 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts +17 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts.map +1 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.js +85 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.js.map +1 -0
- package/dist/components/SnapshotPanel/index.d.ts +3 -0
- package/dist/components/SnapshotPanel/index.d.ts.map +1 -0
- package/dist/components/SnapshotPanel/index.js +2 -0
- package/dist/components/SnapshotPanel/index.js.map +1 -0
- package/dist/components/StageNode/StageNode.d.ts +31 -0
- package/dist/components/StageNode/StageNode.d.ts.map +1 -0
- package/dist/components/StageNode/StageNode.js +134 -0
- package/dist/components/StageNode/StageNode.js.map +1 -0
- package/dist/components/StageNode/index.d.ts +3 -0
- package/dist/components/StageNode/index.d.ts.map +1 -0
- package/dist/components/StageNode/index.js +2 -0
- package/dist/components/StageNode/index.js.map +1 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts +13 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +1 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.js +104 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.js.map +1 -0
- package/dist/components/TimeTravelControls/index.d.ts +3 -0
- package/dist/components/TimeTravelControls/index.d.ts.map +1 -0
- package/dist/components/TimeTravelControls/index.js +2 -0
- package/dist/components/TimeTravelControls/index.js.map +1 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +22 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +1 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +104 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +1 -0
- package/dist/components/TimeTravelDebugger/index.d.ts +3 -0
- package/dist/components/TimeTravelDebugger/index.d.ts.map +1 -0
- package/dist/components/TimeTravelDebugger/index.js +2 -0
- package/dist/components/TimeTravelDebugger/index.js.map +1 -0
- package/dist/flowchart.cjs +704 -220
- package/dist/flowchart.cjs.map +1 -1
- package/dist/flowchart.d.cts +55 -1
- package/dist/flowchart.d.ts +55 -1
- package/dist/flowchart.d.ts.map +1 -0
- package/dist/flowchart.js +700 -214
- package/dist/flowchart.js.map +1 -1
- package/dist/index.cjs +849 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +95 -3
- package/dist/index.d.ts +95 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +851 -80
- package/dist/index.js.map +1 -1
- package/dist/theme/ThemeProvider.d.ts +13 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +16 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/index.d.ts +7 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +5 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/presets.d.ts +15 -0
- package/dist/theme/presets.d.ts.map +1 -0
- package/dist/theme/presets.js +70 -0
- package/dist/theme/presets.js.map +1 -0
- package/dist/theme/styles.d.ts +32 -0
- package/dist/theme/styles.d.ts.map +1 -0
- package/dist/theme/styles.js +37 -0
- package/dist/theme/styles.js.map +1 -0
- package/dist/theme/tokens.d.ts +28 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +58 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -137,9 +137,34 @@ function PipelineChart({ spec }) {
|
|
|
137
137
|
}
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
###
|
|
140
|
+
### Self-contained traced flowchart (recommended)
|
|
141
141
|
|
|
142
|
-
|
|
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
|
-
| `
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|