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/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/presets.ts","../src/components/MemoryInspector/MemoryInspector.tsx","../src/components/NarrativeLog/NarrativeLog.tsx","../src/components/NarrativeTrace/NarrativeTrace.tsx","../src/components/GanttTimeline/GanttTimeline.tsx","../src/components/SnapshotPanel/SnapshotPanel.tsx","../src/components/ScopeDiff/ScopeDiff.tsx","../src/components/ResultPanel/ResultPanel.tsx","../src/components/TimeTravelControls/TimeTravelControls.tsx","../src/components/ExplainableShell/ExplainableShell.tsx","../src/adapters/fromRuntimeSnapshot.ts"],"sourcesContent":["// Types\nexport type { StageSnapshot, Size, BaseComponentProps } from \"./types\";\n\n// Theme\nexport { FootprintTheme, useFootprintTheme } from \"./theme\";\nexport { tokensToCSSVars, defaultTokens } from \"./theme\";\nexport { themePresets, coolDark, warmDark, warmLight } from \"./theme\";\nexport type { ThemeTokens, ThemePresetName } from \"./theme\";\n\n// Core components (zero external deps beyond React)\nexport { MemoryInspector } from \"./components/MemoryInspector\";\nexport type { MemoryInspectorProps } from \"./components/MemoryInspector\";\n\nexport { NarrativeLog } from \"./components/NarrativeLog\";\nexport type { NarrativeLogProps } from \"./components/NarrativeLog\";\n\nexport { NarrativeTrace } from \"./components/NarrativeTrace\";\nexport type { NarrativeTraceProps } from \"./components/NarrativeTrace\";\n\nexport { GanttTimeline } from \"./components/GanttTimeline\";\nexport type { GanttTimelineProps } from \"./components/GanttTimeline\";\n\nexport { SnapshotPanel } from \"./components/SnapshotPanel\";\nexport type { SnapshotPanelProps } from \"./components/SnapshotPanel\";\n\nexport { ScopeDiff } from \"./components/ScopeDiff\";\nexport type { ScopeDiffProps, DiffEntry } from \"./components/ScopeDiff\";\n\nexport { ResultPanel } from \"./components/ResultPanel\";\nexport type { ResultPanelProps } from \"./components/ResultPanel\";\n\nexport { TimeTravelControls } from \"./components/TimeTravelControls\";\nexport type { TimeTravelControlsProps } from \"./components/TimeTravelControls\";\n\nexport { ExplainableShell } from \"./components/ExplainableShell\";\nexport type { ExplainableShellProps, ShellTab } from \"./components/ExplainableShell\";\n\n// Adapters\nexport { toVisualizationSnapshots, createSnapshots } from \"./adapters/fromRuntimeSnapshot\";\n","import { createContext, useContext } from \"react\";\nimport type { ThemeTokens } from \"./tokens\";\nimport { tokensToCSSVars } from \"./tokens\";\n\nconst ThemeContext = createContext<ThemeTokens>({});\n\nexport function useFootprintTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n\ninterface FootprintThemeProps {\n tokens?: ThemeTokens;\n children: React.ReactNode;\n}\n\n/**\n * Optional theme provider — wraps children with CSS custom properties.\n * Consumers can also just set --fp-* CSS variables directly.\n */\nexport function FootprintTheme({ tokens = {}, children }: FootprintThemeProps) {\n const cssVars = tokensToCSSVars(tokens);\n\n return (\n <ThemeContext.Provider value={tokens}>\n <div style={cssVars as React.CSSProperties} className=\"fp-theme-root\">\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n","/** Default theme tokens — consumers override via CSS variables or ThemeProvider. */\nexport interface ThemeTokens {\n colors?: {\n primary?: string;\n success?: string;\n error?: string;\n warning?: string;\n bgPrimary?: string;\n bgSecondary?: string;\n bgTertiary?: string;\n textPrimary?: string;\n textSecondary?: string;\n textMuted?: string;\n border?: string;\n };\n radius?: string;\n fontFamily?: {\n sans?: string;\n mono?: string;\n };\n}\n\n/** Maps ThemeTokens to CSS custom property assignments. */\nexport function tokensToCSSVars(tokens: ThemeTokens): Record<string, string> {\n const vars: Record<string, string> = {};\n if (tokens.colors) {\n const c = tokens.colors;\n if (c.primary) vars[\"--fp-color-primary\"] = c.primary;\n if (c.success) vars[\"--fp-color-success\"] = c.success;\n if (c.error) vars[\"--fp-color-error\"] = c.error;\n if (c.warning) vars[\"--fp-color-warning\"] = c.warning;\n if (c.bgPrimary) vars[\"--fp-bg-primary\"] = c.bgPrimary;\n if (c.bgSecondary) vars[\"--fp-bg-secondary\"] = c.bgSecondary;\n if (c.bgTertiary) vars[\"--fp-bg-tertiary\"] = c.bgTertiary;\n if (c.textPrimary) vars[\"--fp-text-primary\"] = c.textPrimary;\n if (c.textSecondary) vars[\"--fp-text-secondary\"] = c.textSecondary;\n if (c.textMuted) vars[\"--fp-text-muted\"] = c.textMuted;\n if (c.border) vars[\"--fp-border\"] = c.border;\n }\n if (tokens.radius) vars[\"--fp-radius\"] = tokens.radius;\n if (tokens.fontFamily?.sans) vars[\"--fp-font-sans\"] = tokens.fontFamily.sans;\n if (tokens.fontFamily?.mono) vars[\"--fp-font-mono\"] = tokens.fontFamily.mono;\n return vars;\n}\n\n/** Default dark theme values (used as CSS variable fallbacks). */\nexport const defaultTokens: Required<{\n [K in keyof ThemeTokens]-?: Required<ThemeTokens[K]>;\n}> = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n","import type { Size } from \"../types\";\n\n/**\n * Helper to resolve a CSS variable with a fallback.\n * Usage: v(\"--fp-color-primary\", \"#6366f1\")\n */\nexport function v(varName: string, fallback: string): string {\n return `var(${varName}, ${fallback})`;\n}\n\n/** Shorthand for common theme variables */\nexport const theme = {\n primary: v(\"--fp-color-primary\", \"#6366f1\"),\n success: v(\"--fp-color-success\", \"#22c55e\"),\n error: v(\"--fp-color-error\", \"#ef4444\"),\n warning: v(\"--fp-color-warning\", \"#f59e0b\"),\n bgPrimary: v(\"--fp-bg-primary\", \"#0f172a\"),\n bgSecondary: v(\"--fp-bg-secondary\", \"#1e293b\"),\n bgTertiary: v(\"--fp-bg-tertiary\", \"#334155\"),\n textPrimary: v(\"--fp-text-primary\", \"#f8fafc\"),\n textSecondary: v(\"--fp-text-secondary\", \"#94a3b8\"),\n textMuted: v(\"--fp-text-muted\", \"#64748b\"),\n border: v(\"--fp-border\", \"#334155\"),\n radius: v(\"--fp-radius\", \"8px\"),\n fontSans: v(\"--fp-font-sans\", \"Inter, system-ui, -apple-system, sans-serif\"),\n fontMono: v(\"--fp-font-mono\", \"'JetBrains Mono', 'Fira Code', monospace\"),\n} as const;\n\n/** Font sizes per size variant */\nexport const fontSize: Record<Size, { label: number; body: number; small: number }> = {\n compact: { label: 10, body: 11, small: 9 },\n default: { label: 11, body: 12, small: 10 },\n detailed: { label: 12, body: 13, small: 11 },\n};\n\n/** Padding per size variant */\nexport const padding: Record<Size, number> = {\n compact: 8,\n default: 12,\n detailed: 16,\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/** Cool dark theme (the library default) */\nexport const coolDark: ThemeTokens = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm dark theme — charcoal-purple palette */\nexport const warmDark: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#3dd68c\",\n error: \"#f06292\",\n warning: \"#ffb74d\",\n bgPrimary: \"#1e1a2e\",\n bgSecondary: \"#2a2540\",\n bgTertiary: \"#3a3455\",\n textPrimary: \"#f0e6d6\",\n textSecondary: \"#a89eb4\",\n textMuted: \"#6e6480\",\n border: \"#3a3455\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm light theme — cream/peach palette */\nexport const warmLight: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#22a860\",\n error: \"#d94452\",\n warning: \"#e09030\",\n bgPrimary: \"#faf5ef\",\n bgSecondary: \"#f0e6d6\",\n bgTertiary: \"#e4d5c3\",\n textPrimary: \"#2e2938\",\n textSecondary: \"#5c5468\",\n textMuted: \"#8a7e96\",\n border: \"#d6c8b4\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** All built-in theme presets */\nexport const themePresets = {\n coolDark,\n warmDark,\n warmLight,\n} as const;\n\nexport type ThemePresetName = keyof typeof themePresets;\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface MemoryInspectorProps extends BaseComponentProps {\n /** Single memory object or snapshots (will accumulate up to selectedIndex) */\n data?: Record<string, unknown>;\n /** When using snapshots mode, pass these instead of data */\n snapshots?: StageSnapshot[];\n /** Index to accumulate up to (for time-travel) */\n selectedIndex?: number;\n /** Show data types alongside values */\n showTypes?: boolean;\n /** Highlight keys that are new at this step */\n highlightNew?: boolean;\n}\n\n/**\n * Displays pipeline memory state as formatted JSON.\n * Supports both static (data prop) and time-travel (snapshots + selectedIndex) modes.\n */\nexport function MemoryInspector({\n data,\n snapshots,\n selectedIndex = 0,\n showTypes = false,\n highlightNew = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: MemoryInspectorProps) {\n // Compute accumulated memory from snapshots\n const { memory, newKeys } = useMemo(() => {\n if (data) {\n return { memory: data, newKeys: new Set<string>() };\n }\n if (!snapshots || snapshots.length === 0) {\n return { memory: {}, newKeys: new Set<string>() };\n }\n\n const merged: Record<string, unknown> = {};\n for (let i = 0; i <= Math.min(selectedIndex, snapshots.length - 1); i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n\n const nk = new Set<string>();\n if (highlightNew && selectedIndex > 0) {\n const prev: Record<string, unknown> = {};\n for (let i = 0; i < selectedIndex; i++) {\n Object.assign(prev, snapshots[i]?.memory);\n }\n const current = snapshots[selectedIndex]?.memory ?? {};\n for (const k of Object.keys(current)) {\n if (!(k in prev)) nk.add(k);\n }\n } else if (highlightNew && selectedIndex === 0 && snapshots[0]) {\n for (const k of Object.keys(snapshots[0].memory)) nk.add(k);\n }\n\n return { memory: merged, newKeys: nk };\n }, [data, snapshots, selectedIndex, highlightNew]);\n\n const entries = Object.entries(memory);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"memory-inspector\">\n <div data-fp=\"memory-label\">Memory State</div>\n <pre data-fp=\"memory-json\">\n {JSON.stringify(memory, null, 2)}\n </pre>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n padding: pad,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"memory-inspector\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Memory State\n </span>\n <div\n style={{\n marginTop: 8,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: theme.radius,\n padding: `${pad}px ${pad + 4}px`,\n fontFamily: theme.fontMono,\n fontSize: fs.body,\n lineHeight: 1.8,\n }}\n >\n <span style={{ color: theme.textMuted }}>{\"{\"}</span>\n {entries.length === 0 && (\n <div\n style={{\n paddingLeft: 16,\n color: theme.textMuted,\n fontStyle: \"italic\",\n }}\n >\n {\"// empty\"}\n </div>\n )}\n {entries.map(([key, value], i) => {\n const isNew = newKeys.has(key);\n const isLast = i === entries.length - 1;\n return (\n <div\n key={key}\n style={{\n paddingLeft: 16,\n background: isNew\n ? `color-mix(in srgb, ${theme.success} 10%, transparent)`\n : \"transparent\",\n borderRadius: 4,\n marginLeft: -4,\n marginRight: -4,\n paddingRight: 4,\n }}\n >\n <span style={{ color: theme.primary }}>"{key}"</span>\n <span style={{ color: theme.textMuted }}>: </span>\n <span style={{ color: theme.success }}>\n {formatValue(value)}\n </span>\n {showTypes && (\n <span\n style={{\n color: theme.textMuted,\n fontSize: fs.small,\n marginLeft: 8,\n opacity: 0.6,\n }}\n >\n ({typeof value})\n </span>\n )}\n {!isLast && <span style={{ color: theme.textMuted }}>,</span>}\n </div>\n );\n })}\n <span style={{ color: theme.textMuted }}>{\"}\"}</span>\n </div>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n if (typeof value === \"object\" && value !== null) return JSON.stringify(value);\n return String(value);\n}\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface NarrativeLogProps extends BaseComponentProps {\n /** Snapshots to display narratives from */\n snapshots: StageSnapshot[];\n /** Show narratives up to this index (for time-travel sync) */\n selectedIndex?: number;\n /** Show a single narrative string (simple mode) */\n narrative?: string;\n}\n\n/**\n * Timeline-style execution log showing what happened at each stage.\n * Supports both full snapshots mode and single-narrative mode.\n */\nexport function NarrativeLog({\n snapshots,\n selectedIndex,\n narrative,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeLogProps) {\n const entries = useMemo(() => {\n if (narrative) {\n return [{ label: \"Output\", text: narrative, isCurrent: true }];\n }\n const idx = selectedIndex ?? snapshots.length - 1;\n return snapshots.slice(0, idx + 1).map((s, i) => ({\n label: s.stageLabel,\n text: s.narrative,\n isCurrent: i === idx,\n }));\n }, [snapshots, selectedIndex, narrative]);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-log\">\n {entries.map((entry, i) => (\n <div key={i} data-fp=\"narrative-entry\" data-current={entry.isCurrent}>\n <strong>{entry.label}</strong>\n <p>{entry.text}</p>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"narrative-log\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Execution Log\n </span>\n <div style={{ marginTop: 8, display: \"flex\", flexDirection: \"column\" }}>\n {entries.map((entry, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n gap: 10,\n padding: `${pad}px 0`,\n borderBottom:\n i < entries.length - 1 ? `1px solid ${theme.border}` : \"none\",\n }}\n >\n {/* Timeline dot + line */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n width: 12,\n flexShrink: 0,\n paddingTop: 5,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: entry.isCurrent ? theme.primary : theme.success,\n flexShrink: 0,\n }}\n />\n {i < entries.length - 1 && (\n <div\n style={{\n width: 1,\n flex: 1,\n background: theme.border,\n marginTop: 4,\n }}\n />\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: entry.isCurrent ? theme.primary : theme.textMuted,\n }}\n >\n {entry.label}\n </span>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.5,\n color: entry.isCurrent ? theme.textPrimary : theme.textSecondary,\n marginTop: 2,\n }}\n >\n {entry.text}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface NarrativeGroup {\n header: string;\n headerIdx: number;\n steps: { text: string; idx: number }[];\n}\n\nexport interface NarrativeTraceProps extends BaseComponentProps {\n /** All narrative lines (full trace) */\n narrative: string[];\n /** Number of lines currently revealed (for progressive reveal). Defaults to all. */\n revealedCount?: number;\n /** Start with all groups collapsed */\n defaultCollapsed?: boolean;\n /** Called when user clicks a stage header */\n onStageClick?: (headerIndex: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseGroups(lines: string[]): NarrativeGroup[] {\n const groups: NarrativeGroup[] = [];\n let current: NarrativeGroup | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trimStart();\n const isStep = trimmed.startsWith(\"Step \") || /^\\s/.test(line);\n\n if (!isStep || !current) {\n current = { header: line, headerIdx: i, steps: [] };\n groups.push(current);\n } else {\n current.steps.push({ text: trimmed, idx: i });\n }\n }\n\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function NarrativeTrace({\n narrative,\n revealedCount,\n defaultCollapsed = false,\n onStageClick,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeTraceProps) {\n const revealed = revealedCount != null ? narrative.slice(0, revealedCount) : narrative;\n const future = revealedCount != null ? narrative.slice(revealedCount) : [];\n\n const revealedGroups = useMemo(() => parseGroups(revealed), [revealed]);\n const futureGroups = useMemo(() => parseGroups(future), [future]);\n\n const [collapsedSet, setCollapsedSet] = useState<Set<number>>(() => {\n if (!defaultCollapsed) return new Set();\n return new Set(parseGroups(narrative).map((g) => g.headerIdx));\n });\n\n const latestRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n latestRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [revealedGroups.length]);\n\n const toggle = useCallback((idx: number) => {\n setCollapsedSet((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n }, []);\n\n const lastIdx = revealedGroups.length - 1;\n const fs = fontSize[size];\n const pad = padding[size];\n\n // ── Unstyled mode ──\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-trace\">\n {revealedGroups.map((group, gi) => (\n <div key={group.headerIdx} data-fp=\"narrative-group\" data-latest={gi === lastIdx}>\n <div\n data-fp=\"narrative-header\"\n data-collapsible={group.steps.length > 0}\n data-collapsed={collapsedSet.has(group.headerIdx)}\n onClick={() => {\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n >\n {group.header}\n </div>\n {!collapsedSet.has(group.headerIdx) &&\n group.steps.map((step) => (\n <div key={step.idx} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} data-fp=\"narrative-group\" data-future>\n <div data-fp=\"narrative-header\">{group.header}</div>\n {group.steps.map((step) => (\n <div key={`f-${step.idx}`} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n flex: 1,\n overflow: \"auto\",\n padding: pad,\n fontFamily: theme.fontMono,\n ...style,\n }}\n data-fp=\"narrative-trace\"\n >\n {revealedGroups.map((group, gi) => {\n const isLatest = gi === lastIdx;\n const isCollapsed = collapsedSet.has(group.headerIdx);\n const hasSteps = group.steps.length > 0;\n\n return (\n <div\n key={group.headerIdx}\n ref={isLatest ? latestRef : undefined}\n style={{ marginBottom: 2 }}\n data-fp=\"narrative-group\"\n >\n {/* Stage header */}\n <div\n onClick={() => {\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: isLatest ? theme.textPrimary : theme.textSecondary,\n padding: `4px ${pad - 4}px`,\n borderRadius: 4,\n background: isLatest ? theme.bgTertiary : \"transparent\",\n borderLeft: isLatest\n ? `3px solid ${theme.primary}`\n : `3px solid ${theme.success}`,\n cursor: hasSteps ? \"pointer\" : \"default\",\n fontWeight: 600,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n userSelect: \"none\",\n transition: \"all 0.15s ease\",\n }}\n >\n {hasSteps && (\n <span\n style={{\n fontSize: fs.small - 1,\n color: theme.textMuted,\n transition: \"transform 0.15s ease\",\n transform: isCollapsed ? \"rotate(-90deg)\" : \"rotate(0deg)\",\n display: \"inline-block\",\n width: 10,\n flexShrink: 0,\n }}\n >\n ▼\n </span>\n )}\n {!hasSteps && <span style={{ width: 10, flexShrink: 0 }} />}\n <span>{group.header}</span>\n </div>\n\n {/* Step lines */}\n {!isCollapsed &&\n group.steps.map((step) => (\n <div\n key={step.idx}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: isLatest ? theme.textSecondary : theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n opacity: isLatest ? 0.9 : 0.7,\n transition: \"all 0.15s ease\",\n }}\n data-fp=\"narrative-step\"\n >\n {step.text}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* Dimmed future groups */}\n {futureGroups.length > 0 && (\n <div style={{ opacity: 0.2 }}>\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} style={{ marginBottom: 2 }}>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: theme.textMuted,\n padding: `4px ${pad - 4}px`,\n borderLeft: `3px solid ${theme.border}`,\n fontWeight: 600,\n paddingLeft: pad + 12,\n }}\n >\n {group.header}\n </div>\n {group.steps.map((step) => (\n <div\n key={`f-${step.idx}`}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n }}\n >\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface GanttTimelineProps extends BaseComponentProps {\n /** Stage snapshots with timing info */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex?: number;\n /** Callback when a stage bar is clicked */\n onSelect?: (index: number) => void;\n}\n\n/**\n * Horizontal Gantt-style timeline showing stage durations and overlap.\n * Great for performance analysis of pipeline execution.\n */\nexport function GanttTimeline({\n snapshots,\n selectedIndex = 0,\n onSelect,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: GanttTimelineProps) {\n const totalWallTime = useMemo(\n () => Math.max(...snapshots.map((s) => s.startMs + s.durationMs), 1),\n [snapshots]\n );\n\n const fs = fontSize[size];\n const pad = padding[size];\n const labelWidth = size === \"compact\" ? 50 : size === \"detailed\" ? 100 : 80;\n const msWidth = size === \"compact\" ? 28 : 36;\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"gantt-timeline\">\n {snapshots.map((snap, idx) => (\n <div\n key={snap.stageName}\n data-fp=\"gantt-bar\"\n data-selected={idx === selectedIndex}\n data-visible={idx <= selectedIndex}\n onClick={() => onSelect?.(idx)}\n >\n <span data-fp=\"gantt-label\">{snap.stageLabel}</span>\n <span data-fp=\"gantt-duration\">{snap.durationMs}ms</span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"gantt-timeline\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n {size === \"compact\" ? \"Timeline\" : \"Execution Timeline\"}\n </span>\n <div\n style={{\n marginTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {snapshots.map((snap, idx) => {\n const leftPct = (snap.startMs / totalWallTime) * 100;\n const widthPct = Math.max((snap.durationMs / totalWallTime) * 100, 1);\n const isSelected = idx === selectedIndex;\n const isVisible = idx <= selectedIndex;\n\n return (\n <div\n key={snap.stageName}\n onClick={() => onSelect?.(idx)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: size === \"compact\" ? 4 : 8,\n cursor: onSelect ? \"pointer\" : \"default\",\n opacity: isVisible ? 1 : 0.3,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <span\n style={{\n width: labelWidth,\n fontSize: fs.small,\n color: isSelected ? theme.primary : theme.textMuted,\n fontWeight: isSelected ? 600 : 400,\n textAlign: \"right\",\n flexShrink: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {snap.stageLabel}\n </span>\n <div\n style={{\n flex: 1,\n height: size === \"compact\" ? 6 : 8,\n position: \"relative\",\n background: theme.bgTertiary,\n borderRadius: 3,\n }}\n >\n {isVisible && (\n <div\n style={{\n position: \"absolute\",\n left: `${leftPct}%`,\n top: 0,\n width: `${widthPct}%`,\n height: \"100%\",\n borderRadius: 3,\n background: isSelected ? theme.primary : theme.success,\n transition: \"width 0.3s ease\",\n }}\n />\n )}\n </div>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n width: msWidth,\n flexShrink: 0,\n }}\n >\n {snap.durationMs}ms\n </span>\n </div>\n );\n })}\n </div>\n\n {/* Time axis */}\n <div\n style={{\n marginTop: 4,\n marginLeft: labelWidth + (size === \"compact\" ? 4 : 8),\n marginRight: msWidth + (size === \"compact\" ? 4 : 8),\n display: \"flex\",\n justifyContent: \"space-between\",\n fontSize: fs.small - 1,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n <span>0ms</span>\n {size !== \"compact\" && (\n <span>{(totalWallTime / 2).toFixed(1)}ms</span>\n )}\n <span>{totalWallTime.toFixed(1)}ms</span>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeLog } from \"../NarrativeLog\";\nimport { GanttTimeline } from \"../GanttTimeline\";\n\nexport interface SnapshotPanelProps extends BaseComponentProps {\n /** Stage snapshots from pipeline execution */\n snapshots: StageSnapshot[];\n /** Show the Gantt timeline */\n showGantt?: boolean;\n /** Show the time-travel scrubber */\n showScrubber?: boolean;\n /** Title override */\n title?: string;\n}\n\n/**\n * All-in-one panel: time-travel scrubber + memory inspector + narrative log + gantt.\n * Drop this into any page to make a pipeline run inspectable.\n */\nexport function SnapshotPanel({\n snapshots,\n showGantt = true,\n showScrubber = true,\n title = \"Pipeline Inspector\",\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: SnapshotPanelProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (snapshots.length === 0) {\n return (\n <div\n className={className}\n style={{\n padding: pad * 2,\n textAlign: \"center\",\n color: unstyled ? undefined : theme.textMuted,\n fontSize: fs.body,\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n No snapshots to display\n </div>\n );\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"snapshot-panel\">\n <h3>{title}</h3>\n {showScrubber && (\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n />\n )}\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n {showGantt && (\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n unstyled\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: theme.bgPrimary,\n fontFamily: theme.fontSans,\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n {/* Header with title + scrubber */}\n <div\n style={{\n padding: `${pad}px ${pad + 4}px`,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: showScrubber ? 8 : 0,\n }}\n >\n <span\n style={{\n fontSize: fs.body + 2,\n fontWeight: 600,\n color: theme.textPrimary,\n }}\n >\n {title}\n </span>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n {selectedIndex + 1}/{snapshots.length}\n </span>\n </div>\n\n {showScrubber && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <ScrubButton\n label=\"\\u25C0\"\n disabled={selectedIndex === 0}\n onClick={() => setSelectedIndex((i) => Math.max(0, i - 1))}\n />\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n style={{\n flex: 1,\n height: 4,\n accentColor: theme.primary,\n cursor: \"pointer\",\n }}\n />\n <ScrubButton\n label=\"\\u25B6\"\n disabled={selectedIndex === snapshots.length - 1}\n onClick={() =>\n setSelectedIndex((i) => Math.min(snapshots.length - 1, i + 1))\n }\n />\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, overflow: \"auto\" }}>\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n <div\n style={{\n height: 1,\n background: theme.border,\n margin: `0 ${pad}px`,\n }}\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n </div>\n\n {/* Gantt footer */}\n {showGantt && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n size={size}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ScrubButton({\n label,\n disabled,\n onClick,\n}: {\n label: string;\n disabled: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: 6,\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {label}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DiffEntry {\n key: string;\n type: \"added\" | \"removed\" | \"changed\" | \"unchanged\";\n oldValue?: unknown;\n newValue?: unknown;\n}\n\nexport interface ScopeDiffProps extends BaseComponentProps {\n /** Memory state before the current stage */\n previous: Record<string, unknown> | null;\n /** Memory state after the current stage */\n current: Record<string, unknown>;\n /** Hide unchanged keys (default: false) */\n hideUnchanged?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction computeDiff(\n prev: Record<string, unknown> | null,\n curr: Record<string, unknown>\n): DiffEntry[] {\n const entries: DiffEntry[] = [];\n const allKeys = new Set([...Object.keys(prev ?? {}), ...Object.keys(curr)]);\n\n for (const key of allKeys) {\n const inPrev = prev != null && key in prev;\n const inCurr = key in curr;\n const oldVal = prev?.[key];\n const newVal = curr[key];\n\n if (!inPrev && inCurr) {\n entries.push({ key, type: \"added\", newValue: newVal });\n } else if (inPrev && !inCurr) {\n entries.push({ key, type: \"removed\", oldValue: oldVal });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n entries.push({ key, type: \"changed\", oldValue: oldVal, newValue: newVal });\n } else {\n entries.push({ key, type: \"unchanged\", newValue: newVal });\n }\n }\n\n const order = { added: 0, changed: 1, removed: 2, unchanged: 3 };\n entries.sort((a, b) => order[a.type] - order[b.type]);\n return entries;\n}\n\nfunction fmt(v: unknown): string {\n if (typeof v === \"string\") return `\"${v}\"`;\n if (typeof v === \"object\" && v !== null) return JSON.stringify(v, null, 2);\n return String(v);\n}\n\nconst diffColors: Record<DiffEntry[\"type\"], { bg: string; fg: string; icon: string }> = {\n added: { bg: \"rgba(34,197,94,0.10)\", fg: \"#22c55e\", icon: \"+\" },\n removed: { bg: \"rgba(239,68,68,0.10)\", fg: \"#ef4444\", icon: \"-\" },\n changed: { bg: \"rgba(245,158,11,0.10)\", fg: \"#f59e0b\", icon: \"~\" },\n unchanged: { bg: \"transparent\", fg: \"\", icon: \" \" },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ScopeDiff({\n previous,\n current,\n hideUnchanged = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ScopeDiffProps) {\n const entries = useMemo(() => computeDiff(previous, current), [previous, current]);\n const visible = hideUnchanged ? entries.filter((e) => e.type !== \"unchanged\") : entries;\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"scope-diff\">\n {visible.map((e) => (\n <div key={e.key} data-fp=\"diff-entry\" data-type={e.type}>\n <span data-fp=\"diff-key\">{e.key}</span>\n {e.type === \"changed\" && (\n <>\n <span data-fp=\"diff-old\">{fmt(e.oldValue)}</span>\n <span data-fp=\"diff-new\">{fmt(e.newValue)}</span>\n </>\n )}\n {(e.type === \"added\" || e.type === \"unchanged\") && (\n <span data-fp=\"diff-value\">{fmt(e.newValue)}</span>\n )}\n {e.type === \"removed\" && (\n <span data-fp=\"diff-value\">{fmt(e.oldValue)}</span>\n )}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontMono, ...style }}\n data-fp=\"scope-diff\"\n >\n {visible.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No changes\n </div>\n )}\n {visible.map((entry) => {\n const dc = diffColors[entry.type];\n return (\n <div\n key={entry.key}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: `4px ${pad - 4}px`,\n marginBottom: 2,\n borderRadius: 4,\n background: dc.bg,\n fontSize: fs.body,\n lineHeight: 1.5,\n }}\n data-fp=\"diff-entry\"\n >\n <span\n style={{\n width: 16,\n flexShrink: 0,\n fontWeight: 700,\n color: dc.fg || theme.textMuted,\n textAlign: \"center\",\n }}\n >\n {dc.icon}\n </span>\n <span style={{ color: theme.primary, fontWeight: 600, flexShrink: 0 }}>\n {entry.key}\n </span>\n <span style={{ color: theme.textMuted }}>=</span>\n {entry.type === \"changed\" ? (\n <span>\n <span\n style={{\n color: theme.error,\n textDecoration: \"line-through\",\n opacity: 0.7,\n }}\n >\n {fmt(entry.oldValue)}\n </span>\n <span style={{ color: theme.textMuted, margin: \"0 4px\" }}>→</span>\n <span style={{ color: theme.success }}>{fmt(entry.newValue)}</span>\n </span>\n ) : (\n <span\n style={{\n color:\n entry.type === \"added\"\n ? theme.success\n : entry.type === \"removed\"\n ? theme.error\n : theme.textPrimary,\n }}\n >\n {fmt(entry.type === \"removed\" ? entry.oldValue : entry.newValue)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface ResultPanelProps extends BaseComponentProps {\n /** Final pipeline output / shared state */\n data: Record<string, unknown> | null;\n /** Optional console log lines */\n logs?: string[];\n /** Hide console section (default: false) */\n hideConsole?: boolean;\n}\n\nexport function ResultPanel({\n data,\n logs = [],\n hideConsole = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ResultPanelProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"result-panel\">\n <div data-fp=\"result-data\">\n <pre>{data ? JSON.stringify(data, null, 2) : \"No data\"}</pre>\n </div>\n {!hideConsole && (\n <div data-fp=\"result-console\">\n {logs.map((line, i) => (\n <div key={i} data-fp=\"console-line\" data-error={line.startsWith(\"ERROR\")}>\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"result-panel\"\n >\n {data && (\n <div style={{ flex: 1, overflow: \"auto\", padding: pad }}>\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n {size === \"compact\" ? \"Result\" : \"Business Result (Scope)\"}\n </div>\n <pre\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: theme.textPrimary,\n background: theme.bgSecondary,\n padding: pad,\n borderRadius: theme.radius,\n overflow: \"auto\",\n margin: 0,\n }}\n >\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n )}\n\n {!hideConsole && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n padding: pad,\n overflow: \"auto\",\n maxHeight: \"40%\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n Console\n </div>\n {logs.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No console output\n </div>\n )}\n {logs.map((line, i) => (\n <div\n key={i}\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: line.startsWith(\"ERROR\") ? theme.error : theme.textPrimary,\n padding: \"2px 0\",\n borderBottom: `1px solid ${theme.bgSecondary}`,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }}\n >\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize } from \"../../theme\";\n\nexport interface TimeTravelControlsProps extends BaseComponentProps {\n /** Stage snapshots */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex: number;\n /** Callback when selected index changes */\n onIndexChange: (index: number) => void;\n /** Enable auto-play with Gantt-proportional timing */\n autoPlayable?: boolean;\n}\n\nexport function TimeTravelControls({\n snapshots,\n selectedIndex,\n onIndexChange,\n autoPlayable = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: TimeTravelControlsProps) {\n const [playing, setPlaying] = useState(false);\n const playRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const total = snapshots.length;\n const canPrev = selectedIndex > 0;\n const canNext = selectedIndex < total - 1;\n\n // Auto-advance with proportional timing\n useEffect(() => {\n if (!playing || !autoPlayable) return;\n if (selectedIndex >= total - 1) {\n setPlaying(false);\n return;\n }\n const stageDur = snapshots[selectedIndex]?.durationMs ?? 1;\n const totalDur = snapshots.reduce((s, snap) => s + snap.durationMs, 0) || 1;\n const fraction = stageDur / totalDur;\n const baseMs = 3000;\n const delay = Math.max(200, Math.min(fraction * baseMs, 2000));\n\n playRef.current = setTimeout(() => {\n onIndexChange(selectedIndex + 1);\n }, delay);\n\n return () => {\n if (playRef.current) clearTimeout(playRef.current);\n };\n }, [playing, selectedIndex, snapshots, total, onIndexChange, autoPlayable]);\n\n const togglePlay = useCallback(() => {\n if (playing) {\n setPlaying(false);\n } else {\n if (selectedIndex >= total - 1) onIndexChange(0);\n setPlaying(true);\n }\n }, [playing, selectedIndex, total, onIndexChange]);\n\n const fs = fontSize[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"time-travel-controls\">\n <button\n data-fp=\"tt-prev\"\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n Prev\n </button>\n {autoPlayable && (\n <button data-fp=\"tt-play\" onClick={togglePlay}>\n {playing ? \"Pause\" : \"Play\"}\n </button>\n )}\n <button\n data-fp=\"tt-next\"\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n Next\n </button>\n <div data-fp=\"tt-ticks\">\n {snapshots.map((snap, i) => (\n <button\n key={i}\n data-fp=\"tt-tick\"\n data-active={i === selectedIndex}\n data-done={i < selectedIndex}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n />\n ))}\n </div>\n </div>\n );\n }\n\n const btnStyle = (disabled: boolean): React.CSSProperties => ({\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: \"6px\",\n padding: \"4px 12px\",\n fontSize: fs.body,\n fontWeight: 600,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n flexShrink: 0,\n });\n\n return (\n <div\n className={className}\n style={{\n padding: \"6px 12px\",\n background: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flexShrink: 0,\n ...style,\n }}\n data-fp=\"time-travel-controls\"\n >\n <button\n style={btnStyle(!canPrev || playing)}\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n ◀\n </button>\n\n {autoPlayable && (\n <button\n onClick={togglePlay}\n style={{\n background: playing ? theme.primary : theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: playing ? \"white\" : theme.textPrimary,\n borderRadius: \"6px\",\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n fontSize: 14,\n flexShrink: 0,\n }}\n title={playing ? \"Pause\" : \"Play\"}\n >\n {playing ? \"\\u23F8\" : \"\\u25B6\"}\n </button>\n )}\n\n <button\n style={btnStyle(!canNext || playing)}\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n ▶\n </button>\n\n {/* Tick-mark timeline */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: \"0 4px\",\n }}\n >\n {snapshots.map((snap, i) => {\n const isActive = i === selectedIndex;\n const isDone = i < selectedIndex;\n return (\n <button\n key={i}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n style={{\n flex: 1,\n height: isActive ? 14 : 8,\n borderRadius: 3,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? theme.primary\n : isDone\n ? theme.success\n : theme.bgTertiary,\n opacity: isDone || isActive ? 1 : 0.4,\n transition: \"all 0.15s ease\",\n }}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { ResultPanel } from \"../ResultPanel\";\nimport { GanttTimeline } from \"../GanttTimeline\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeTrace } from \"../NarrativeTrace\";\nimport { ScopeDiff } from \"../ScopeDiff\";\nimport { TimeTravelControls } from \"../TimeTravelControls\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ShellTab = \"result\" | \"explainable\" | \"ai-compatible\";\n\nexport interface ExplainableShellProps extends BaseComponentProps {\n /** Stage snapshots for time-travel visualization */\n snapshots: StageSnapshot[];\n /** Final pipeline result data */\n resultData?: Record<string, unknown> | null;\n /** Console log lines */\n logs?: string[];\n /** Combined narrative lines */\n narrative?: string[];\n /** Which tabs to show (default: all three) */\n tabs?: ShellTab[];\n /** Initially active tab */\n defaultTab?: ShellTab;\n /** Hide console in result tab */\n hideConsole?: boolean;\n /** Custom content to render in each tab slot */\n renderFlowchart?: (props: {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n onNodeClick?: (index: number) => void;\n }) => React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ExplainableShell({\n snapshots,\n resultData,\n logs = [],\n narrative = [],\n tabs = [\"result\", \"explainable\", \"ai-compatible\"],\n defaultTab,\n hideConsole = false,\n renderFlowchart,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ExplainableShellProps) {\n const [activeTab, setActiveTab] = useState<ShellTab>(defaultTab ?? tabs[0]);\n const [snapshotIdx, setSnapshotIdx] = useState(0);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n const handleSnapshotChange = useCallback((idx: number) => {\n setSnapshotIdx(Math.max(0, Math.min(idx, snapshots.length - 1)));\n }, [snapshots.length]);\n\n // Progressive narrative reveal\n const revealedCount = useMemo(() => {\n if (snapshots.length === 0 || narrative.length === 0) return narrative.length;\n\n const boundaries: number[] = [];\n for (let i = 0; i < narrative.length; i++) {\n const trimmed = narrative[i].trimStart();\n if (\n (trimmed.startsWith(\"Stage \") && !trimmed.match(/^Stage\\s+\\d+:\\s*Step\\s/)) ||\n trimmed.startsWith(\"[\")\n ) {\n boundaries.push(i);\n }\n }\n\n if (boundaries.length === 0) {\n const ratio = (snapshotIdx + 1) / snapshots.length;\n return Math.max(1, Math.ceil(narrative.length * ratio));\n }\n\n const groupsToShow = Math.max(\n 1,\n Math.min(\n Math.floor(((snapshotIdx + 1) / snapshots.length) * boundaries.length) || 1,\n boundaries.length\n )\n );\n\n const endIdx =\n groupsToShow < boundaries.length ? boundaries[groupsToShow] : narrative.length;\n\n return Math.max(1, endIdx);\n }, [snapshots.length, snapshotIdx, narrative]);\n\n // Scope diff data\n const prevMemory = snapshotIdx > 0 ? snapshots[snapshotIdx - 1]?.memory : null;\n const currMemory = snapshots[snapshotIdx]?.memory ?? {};\n\n const tabLabels: Record<ShellTab, string> = {\n result: \"Result\",\n explainable: \"Explainable\",\n \"ai-compatible\": \"AI-Compatible\",\n };\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"explainable-shell\">\n <div data-fp=\"shell-tabs\">\n {tabs.map((tab) => (\n <button\n key={tab}\n data-fp=\"shell-tab\"\n data-active={tab === activeTab}\n onClick={() => setActiveTab(tab)}\n >\n {tabLabels[tab]}\n </button>\n ))}\n </div>\n <div data-fp=\"shell-content\" data-tab={activeTab}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n unstyled\n />\n )}\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <MemoryInspector snapshots={snapshots} selectedIndex={snapshotIdx} unstyled />\n <ScopeDiff previous={prevMemory} current={currMemory} unstyled />\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n unstyled\n />\n </>\n )}\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n unstyled\n />\n </>\n )}\n </div>\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n background: theme.bgPrimary,\n color: theme.textPrimary,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"explainable-shell\"\n >\n {/* Tab bar */}\n <div\n style={{\n display: \"flex\",\n gap: 0,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n {tabs.map((tab) => {\n const active = tab === activeTab;\n return (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: `${pad - 4}px ${pad}px`,\n fontSize: fs.label,\n fontWeight: active ? 700 : 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: active ? theme.primary : theme.textMuted,\n background: \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${theme.primary}` : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n >\n {tabLabels[tab]}\n </button>\n );\n })}\n </div>\n\n {/* Tab content */}\n <div style={{ flex: 1, overflow: \"hidden\", display: \"flex\", flexDirection: \"column\" }}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n size={size}\n />\n )}\n\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <div\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n size={size}\n />\n <div style={{ borderTop: `1px solid ${theme.border}` }}>\n <ScopeDiff\n previous={prevMemory}\n current={currMemory}\n hideUnchanged\n size={size}\n />\n </div>\n </div>\n </div>\n <div style={{ borderTop: `1px solid ${theme.border}`, flexShrink: 0 }}>\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n size={size}\n />\n </div>\n </>\n )}\n\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n size={size}\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n }}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { StageSnapshot } from \"../types\";\n\n/**\n * Shape of FootPrint's RuntimeSnapshot (from FlowChartExecutor.getSnapshot()).\n * We define it here instead of importing to avoid a hard dependency on footprintjs.\n */\ninterface RuntimeStageSnapshot {\n id: string;\n name?: string;\n isDecider?: boolean;\n isFork?: boolean;\n logs: Record<string, unknown>;\n errors: Record<string, unknown>;\n metrics: Record<string, unknown>;\n evals: Record<string, unknown>;\n flowMessages?: unknown[];\n next?: RuntimeStageSnapshot;\n children?: RuntimeStageSnapshot[];\n}\n\ninterface RuntimeSnapshot {\n sharedState: Record<string, unknown>;\n executionTree: RuntimeStageSnapshot;\n commitLog: unknown[];\n}\n\n/**\n * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots\n * suitable for visualization components.\n *\n * Usage:\n * ```ts\n * const executor = new FlowChartExecutor(chart);\n * await executor.run();\n * const snapshots = toVisualizationSnapshots(executor.getSnapshot());\n * ```\n */\nexport function toVisualizationSnapshots(\n runtime: RuntimeSnapshot\n): StageSnapshot[] {\n const snapshots: StageSnapshot[] = [];\n flattenTree(runtime.executionTree, snapshots, runtime.sharedState);\n return snapshots;\n}\n\nfunction flattenTree(\n node: RuntimeStageSnapshot,\n out: StageSnapshot[],\n sharedState: Record<string, unknown>,\n accumulatedMs: number = 0\n): number {\n // Estimate duration from metrics if available\n const durationMs =\n typeof node.metrics?.durationMs === \"number\"\n ? node.metrics.durationMs\n : 1;\n\n const startMs = accumulatedMs;\n\n // Build narrative from logs\n const narrative = buildNarrative(node);\n\n // Build memory from logs (key-value pairs written during this stage)\n const memory: Record<string, unknown> = {};\n if (node.logs) {\n Object.assign(memory, node.logs);\n }\n\n out.push({\n stageName: node.id,\n stageLabel: node.name || node.id,\n memory,\n narrative,\n startMs,\n durationMs,\n status: \"done\",\n });\n\n let nextMs = startMs + durationMs;\n\n // Handle parallel children (fork)\n if (node.children && node.children.length > 0) {\n let maxChildEnd = nextMs;\n for (const child of node.children) {\n const childEnd = flattenTree(child, out, sharedState, nextMs);\n maxChildEnd = Math.max(maxChildEnd, childEnd);\n }\n nextMs = maxChildEnd;\n }\n\n // Handle linear continuation\n if (node.next) {\n nextMs = flattenTree(node.next, out, sharedState, nextMs);\n }\n\n return nextMs;\n}\n\nfunction buildNarrative(node: RuntimeStageSnapshot): string {\n const parts: string[] = [];\n\n if (node.name) {\n parts.push(`Stage \"${node.name}\" executed.`);\n }\n\n if (node.logs && Object.keys(node.logs).length > 0) {\n const keys = Object.keys(node.logs);\n parts.push(`Wrote ${keys.length} key(s): ${keys.join(\", \")}.`);\n }\n\n if (node.errors && Object.keys(node.errors).length > 0) {\n parts.push(`Errors: ${JSON.stringify(node.errors)}`);\n }\n\n if (node.isFork) {\n parts.push(\n `Forked into ${node.children?.length ?? 0} parallel branch(es).`\n );\n }\n\n return parts.join(\" \") || `Stage ${node.id} completed.`;\n}\n\n/**\n * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).\n * Useful for testing or custom data sources.\n */\nexport function createSnapshots(\n stages: Array<{\n name: string;\n label?: string;\n memory?: Record<string, unknown>;\n narrative?: string;\n durationMs?: number;\n }>\n): StageSnapshot[] {\n let accMs = 0;\n return stages.map((s) => {\n const duration = s.durationMs ?? 1;\n const snap: StageSnapshot = {\n stageName: s.name,\n stageLabel: s.label ?? s.name,\n memory: s.memory ?? {},\n narrative: s.narrative ?? `${s.label ?? s.name} completed.`,\n startMs: accMs,\n durationMs: duration,\n status: \"done\",\n };\n accMs += duration;\n return snap;\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","v","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/presets.ts","../src/components/MemoryInspector/MemoryInspector.tsx","../src/components/NarrativeLog/NarrativeLog.tsx","../src/components/NarrativeTrace/NarrativeTrace.tsx","../src/components/GanttTimeline/GanttTimeline.tsx","../src/components/SnapshotPanel/SnapshotPanel.tsx","../src/components/ScopeDiff/ScopeDiff.tsx","../src/components/ResultPanel/ResultPanel.tsx","../src/components/StageDetailPanel/StageDetailPanel.tsx","../src/components/TimeTravelControls/TimeTravelControls.tsx","../src/components/ExplainableShell/ExplainableShell.tsx","../src/components/FlowchartView/SubflowTree.tsx","../src/adapters/fromRuntimeSnapshot.ts"],"sourcesContent":["// Types\nexport type { StageSnapshot, Size, BaseComponentProps } from \"./types\";\n\n// Theme\nexport { FootprintTheme, useFootprintTheme } from \"./theme\";\nexport { tokensToCSSVars, defaultTokens } from \"./theme\";\nexport { themePresets, coolDark, warmDark, warmLight } from \"./theme\";\nexport type { ThemeTokens, ThemePresetName } from \"./theme\";\n\n// Core components (zero external deps beyond React)\nexport { MemoryInspector } from \"./components/MemoryInspector\";\nexport type { MemoryInspectorProps } from \"./components/MemoryInspector\";\n\nexport { NarrativeLog } from \"./components/NarrativeLog\";\nexport type { NarrativeLogProps } from \"./components/NarrativeLog\";\n\nexport { NarrativeTrace } from \"./components/NarrativeTrace\";\nexport type { NarrativeTraceProps } from \"./components/NarrativeTrace\";\n\nexport { GanttTimeline } from \"./components/GanttTimeline\";\nexport type { GanttTimelineProps } from \"./components/GanttTimeline\";\n\nexport { SnapshotPanel } from \"./components/SnapshotPanel\";\nexport type { SnapshotPanelProps } from \"./components/SnapshotPanel\";\n\nexport { ScopeDiff } from \"./components/ScopeDiff\";\nexport type { ScopeDiffProps, DiffEntry } from \"./components/ScopeDiff\";\n\nexport { ResultPanel } from \"./components/ResultPanel\";\nexport type { ResultPanelProps } from \"./components/ResultPanel\";\n\nexport { StageDetailPanel } from \"./components/StageDetailPanel\";\nexport type { StageDetailPanelProps, StageDetailMode, MemoryChange } from \"./components/StageDetailPanel\";\n\nexport { TimeTravelControls } from \"./components/TimeTravelControls\";\nexport type { TimeTravelControlsProps } from \"./components/TimeTravelControls\";\n\nexport { ExplainableShell } from \"./components/ExplainableShell\";\nexport type { ExplainableShellProps, ShellTab } from \"./components/ExplainableShell\";\n\n// Subflow manifest tree (no ReactFlow dependency — works standalone)\nexport { SubflowTree } from \"./components/FlowchartView/SubflowTree\";\nexport type { SubflowTreeProps, SubflowTreeEntry } from \"./components/FlowchartView/SubflowTree\";\n\n// Adapters\nexport { toVisualizationSnapshots, createSnapshots } from \"./adapters/fromRuntimeSnapshot\";\n","import { createContext, useContext } from \"react\";\nimport type { ThemeTokens } from \"./tokens\";\nimport { tokensToCSSVars } from \"./tokens\";\n\nconst ThemeContext = createContext<ThemeTokens>({});\n\nexport function useFootprintTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n\ninterface FootprintThemeProps {\n tokens?: ThemeTokens;\n children: React.ReactNode;\n}\n\n/**\n * Optional theme provider — wraps children with CSS custom properties.\n * Consumers can also just set --fp-* CSS variables directly.\n */\nexport function FootprintTheme({ tokens = {}, children }: FootprintThemeProps) {\n const cssVars = tokensToCSSVars(tokens);\n\n return (\n <ThemeContext.Provider value={tokens}>\n <div style={cssVars as React.CSSProperties} className=\"fp-theme-root\">\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n","/** Default theme tokens — consumers override via CSS variables or ThemeProvider. */\nexport interface ThemeTokens {\n colors?: {\n primary?: string;\n success?: string;\n error?: string;\n warning?: string;\n bgPrimary?: string;\n bgSecondary?: string;\n bgTertiary?: string;\n textPrimary?: string;\n textSecondary?: string;\n textMuted?: string;\n border?: string;\n };\n radius?: string;\n fontFamily?: {\n sans?: string;\n mono?: string;\n };\n}\n\n/** Maps ThemeTokens to CSS custom property assignments. */\nexport function tokensToCSSVars(tokens: ThemeTokens): Record<string, string> {\n const vars: Record<string, string> = {};\n if (tokens.colors) {\n const c = tokens.colors;\n if (c.primary) vars[\"--fp-color-primary\"] = c.primary;\n if (c.success) vars[\"--fp-color-success\"] = c.success;\n if (c.error) vars[\"--fp-color-error\"] = c.error;\n if (c.warning) vars[\"--fp-color-warning\"] = c.warning;\n if (c.bgPrimary) vars[\"--fp-bg-primary\"] = c.bgPrimary;\n if (c.bgSecondary) vars[\"--fp-bg-secondary\"] = c.bgSecondary;\n if (c.bgTertiary) vars[\"--fp-bg-tertiary\"] = c.bgTertiary;\n if (c.textPrimary) vars[\"--fp-text-primary\"] = c.textPrimary;\n if (c.textSecondary) vars[\"--fp-text-secondary\"] = c.textSecondary;\n if (c.textMuted) vars[\"--fp-text-muted\"] = c.textMuted;\n if (c.border) vars[\"--fp-border\"] = c.border;\n }\n if (tokens.radius) vars[\"--fp-radius\"] = tokens.radius;\n if (tokens.fontFamily?.sans) vars[\"--fp-font-sans\"] = tokens.fontFamily.sans;\n if (tokens.fontFamily?.mono) vars[\"--fp-font-mono\"] = tokens.fontFamily.mono;\n return vars;\n}\n\n/** Default dark theme values (used as CSS variable fallbacks). */\nexport const defaultTokens: Required<{\n [K in keyof ThemeTokens]-?: Required<ThemeTokens[K]>;\n}> = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n","import type { Size } from \"../types\";\n\n/**\n * Helper to resolve a CSS variable with a fallback.\n * Usage: v(\"--fp-color-primary\", \"#6366f1\")\n */\nexport function v(varName: string, fallback: string): string {\n return `var(${varName}, ${fallback})`;\n}\n\n/** Shorthand for common theme variables */\nexport const theme = {\n primary: v(\"--fp-color-primary\", \"#6366f1\"),\n success: v(\"--fp-color-success\", \"#22c55e\"),\n error: v(\"--fp-color-error\", \"#ef4444\"),\n warning: v(\"--fp-color-warning\", \"#f59e0b\"),\n bgPrimary: v(\"--fp-bg-primary\", \"#0f172a\"),\n bgSecondary: v(\"--fp-bg-secondary\", \"#1e293b\"),\n bgTertiary: v(\"--fp-bg-tertiary\", \"#334155\"),\n textPrimary: v(\"--fp-text-primary\", \"#f8fafc\"),\n textSecondary: v(\"--fp-text-secondary\", \"#94a3b8\"),\n textMuted: v(\"--fp-text-muted\", \"#64748b\"),\n border: v(\"--fp-border\", \"#334155\"),\n radius: v(\"--fp-radius\", \"8px\"),\n fontSans: v(\"--fp-font-sans\", \"Inter, system-ui, -apple-system, sans-serif\"),\n fontMono: v(\"--fp-font-mono\", \"'JetBrains Mono', 'Fira Code', monospace\"),\n} as const;\n\n/** Font sizes per size variant */\nexport const fontSize: Record<Size, { label: number; body: number; small: number }> = {\n compact: { label: 10, body: 11, small: 9 },\n default: { label: 11, body: 12, small: 10 },\n detailed: { label: 12, body: 13, small: 11 },\n};\n\n/** Padding per size variant */\nexport const padding: Record<Size, number> = {\n compact: 8,\n default: 12,\n detailed: 16,\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/** Cool dark theme (the library default) */\nexport const coolDark: ThemeTokens = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm dark theme — charcoal-purple palette */\nexport const warmDark: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#3dd68c\",\n error: \"#f06292\",\n warning: \"#ffb74d\",\n bgPrimary: \"#1e1a2e\",\n bgSecondary: \"#2a2540\",\n bgTertiary: \"#3a3455\",\n textPrimary: \"#f0e6d6\",\n textSecondary: \"#a89eb4\",\n textMuted: \"#6e6480\",\n border: \"#3a3455\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm light theme — cream/peach palette */\nexport const warmLight: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#22a860\",\n error: \"#d94452\",\n warning: \"#e09030\",\n bgPrimary: \"#faf5ef\",\n bgSecondary: \"#f0e6d6\",\n bgTertiary: \"#e4d5c3\",\n textPrimary: \"#2e2938\",\n textSecondary: \"#5c5468\",\n textMuted: \"#8a7e96\",\n border: \"#d6c8b4\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** All built-in theme presets */\nexport const themePresets = {\n coolDark,\n warmDark,\n warmLight,\n} as const;\n\nexport type ThemePresetName = keyof typeof themePresets;\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface MemoryInspectorProps extends BaseComponentProps {\n /** Single memory object or snapshots (will accumulate up to selectedIndex) */\n data?: Record<string, unknown>;\n /** When using snapshots mode, pass these instead of data */\n snapshots?: StageSnapshot[];\n /** Index to accumulate up to (for time-travel) */\n selectedIndex?: number;\n /** Show data types alongside values */\n showTypes?: boolean;\n /** Highlight keys that are new at this step */\n highlightNew?: boolean;\n}\n\n/**\n * Displays pipeline memory state as formatted JSON.\n * Supports both static (data prop) and time-travel (snapshots + selectedIndex) modes.\n */\nexport function MemoryInspector({\n data,\n snapshots,\n selectedIndex = 0,\n showTypes = false,\n highlightNew = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: MemoryInspectorProps) {\n // Compute accumulated memory from snapshots\n const { memory, newKeys } = useMemo(() => {\n if (data) {\n return { memory: data, newKeys: new Set<string>() };\n }\n if (!snapshots || snapshots.length === 0) {\n return { memory: {}, newKeys: new Set<string>() };\n }\n\n const merged: Record<string, unknown> = {};\n for (let i = 0; i <= Math.min(selectedIndex, snapshots.length - 1); i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n\n const nk = new Set<string>();\n if (highlightNew && selectedIndex > 0) {\n const prev: Record<string, unknown> = {};\n for (let i = 0; i < selectedIndex; i++) {\n Object.assign(prev, snapshots[i]?.memory);\n }\n const current = snapshots[selectedIndex]?.memory ?? {};\n for (const k of Object.keys(current)) {\n if (!(k in prev)) nk.add(k);\n }\n } else if (highlightNew && selectedIndex === 0 && snapshots[0]) {\n for (const k of Object.keys(snapshots[0].memory)) nk.add(k);\n }\n\n return { memory: merged, newKeys: nk };\n }, [data, snapshots, selectedIndex, highlightNew]);\n\n const entries = Object.entries(memory);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"memory-inspector\">\n <div data-fp=\"memory-label\">Memory State</div>\n <pre data-fp=\"memory-json\">\n {JSON.stringify(memory, null, 2)}\n </pre>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n padding: pad,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"memory-inspector\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Memory State\n </span>\n <div\n style={{\n marginTop: 8,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: theme.radius,\n padding: `${pad}px ${pad + 4}px`,\n fontFamily: theme.fontMono,\n fontSize: fs.body,\n lineHeight: 1.8,\n }}\n >\n <span style={{ color: theme.textMuted }}>{\"{\"}</span>\n {entries.length === 0 && (\n <div\n style={{\n paddingLeft: 16,\n color: theme.textMuted,\n fontStyle: \"italic\",\n }}\n >\n {\"// empty\"}\n </div>\n )}\n {entries.map(([key, value], i) => {\n const isNew = newKeys.has(key);\n const isLast = i === entries.length - 1;\n return (\n <div\n key={key}\n style={{\n paddingLeft: 16,\n background: isNew\n ? `color-mix(in srgb, ${theme.success} 10%, transparent)`\n : \"transparent\",\n borderRadius: 4,\n marginLeft: -4,\n marginRight: -4,\n paddingRight: 4,\n }}\n >\n <span style={{ color: theme.primary }}>"{key}"</span>\n <span style={{ color: theme.textMuted }}>: </span>\n <span style={{ color: theme.success }}>\n {formatValue(value)}\n </span>\n {showTypes && (\n <span\n style={{\n color: theme.textMuted,\n fontSize: fs.small,\n marginLeft: 8,\n opacity: 0.6,\n }}\n >\n ({typeof value})\n </span>\n )}\n {!isLast && <span style={{ color: theme.textMuted }}>,</span>}\n </div>\n );\n })}\n <span style={{ color: theme.textMuted }}>{\"}\"}</span>\n </div>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n if (typeof value === \"object\" && value !== null) return JSON.stringify(value);\n return String(value);\n}\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface NarrativeLogProps extends BaseComponentProps {\n /** Snapshots to display narratives from */\n snapshots: StageSnapshot[];\n /** Show narratives up to this index (for time-travel sync) */\n selectedIndex?: number;\n /** Show a single narrative string (simple mode) */\n narrative?: string;\n}\n\n/**\n * Timeline-style execution log showing what happened at each stage.\n * Supports both full snapshots mode and single-narrative mode.\n */\nexport function NarrativeLog({\n snapshots,\n selectedIndex,\n narrative,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeLogProps) {\n const entries = useMemo(() => {\n if (narrative) {\n return [{ label: \"Output\", text: narrative, isCurrent: true }];\n }\n const idx = selectedIndex ?? snapshots.length - 1;\n return snapshots.slice(0, idx + 1).map((s, i) => ({\n label: s.stageLabel,\n text: s.narrative,\n isCurrent: i === idx,\n }));\n }, [snapshots, selectedIndex, narrative]);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-log\">\n {entries.map((entry, i) => (\n <div key={i} data-fp=\"narrative-entry\" data-current={entry.isCurrent}>\n <strong>{entry.label}</strong>\n <p>{entry.text}</p>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"narrative-log\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Execution Log\n </span>\n <div style={{ marginTop: 8, display: \"flex\", flexDirection: \"column\" }}>\n {entries.map((entry, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n gap: 10,\n padding: `${pad}px 0`,\n borderBottom:\n i < entries.length - 1 ? `1px solid ${theme.border}` : \"none\",\n }}\n >\n {/* Timeline dot + line */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n width: 12,\n flexShrink: 0,\n paddingTop: 5,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: entry.isCurrent ? theme.primary : theme.success,\n flexShrink: 0,\n }}\n />\n {i < entries.length - 1 && (\n <div\n style={{\n width: 1,\n flex: 1,\n background: theme.border,\n marginTop: 4,\n }}\n />\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: entry.isCurrent ? theme.primary : theme.textMuted,\n }}\n >\n {entry.label}\n </span>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.5,\n color: entry.isCurrent ? theme.textPrimary : theme.textSecondary,\n marginTop: 2,\n }}\n >\n {entry.text}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface NarrativeGroup {\n header: string;\n headerIdx: number;\n steps: { text: string; idx: number }[];\n}\n\nexport interface NarrativeTraceProps extends BaseComponentProps {\n /** All narrative lines (full trace) */\n narrative: string[];\n /** Number of lines currently revealed (for progressive reveal). Defaults to all. */\n revealedCount?: number;\n /** Start with all groups collapsed */\n defaultCollapsed?: boolean;\n /** Called when user clicks a stage header */\n onStageClick?: (headerIndex: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseGroups(lines: string[]): NarrativeGroup[] {\n const groups: NarrativeGroup[] = [];\n let current: NarrativeGroup | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trimStart();\n const isStep = trimmed.startsWith(\"Step \") || /^\\s/.test(line);\n\n if (!isStep || !current) {\n current = { header: line, headerIdx: i, steps: [] };\n groups.push(current);\n } else {\n current.steps.push({ text: trimmed, idx: i });\n }\n }\n\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function NarrativeTrace({\n narrative,\n revealedCount,\n defaultCollapsed = false,\n onStageClick,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeTraceProps) {\n const revealed = revealedCount != null ? narrative.slice(0, revealedCount) : narrative;\n const future = revealedCount != null ? narrative.slice(revealedCount) : [];\n\n const revealedGroups = useMemo(() => parseGroups(revealed), [revealed]);\n const futureGroups = useMemo(() => parseGroups(future), [future]);\n\n const [collapsedSet, setCollapsedSet] = useState<Set<number>>(() => {\n if (!defaultCollapsed) return new Set();\n return new Set(parseGroups(narrative).map((g) => g.headerIdx));\n });\n\n const latestRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n latestRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [revealedGroups.length]);\n\n const toggle = useCallback((idx: number) => {\n setCollapsedSet((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n }, []);\n\n const lastIdx = revealedGroups.length - 1;\n const fs = fontSize[size];\n const pad = padding[size];\n\n // ── Unstyled mode ──\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-trace\">\n {revealedGroups.map((group, gi) => (\n <div key={group.headerIdx} data-fp=\"narrative-group\" data-latest={gi === lastIdx}>\n <div\n data-fp=\"narrative-header\"\n data-collapsible={group.steps.length > 0}\n data-collapsed={collapsedSet.has(group.headerIdx)}\n onClick={() => {\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n >\n {group.header}\n </div>\n {!collapsedSet.has(group.headerIdx) &&\n group.steps.map((step) => (\n <div key={step.idx} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} data-fp=\"narrative-group\" data-future>\n <div data-fp=\"narrative-header\">{group.header}</div>\n {group.steps.map((step) => (\n <div key={`f-${step.idx}`} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n flex: 1,\n overflow: \"auto\",\n padding: pad,\n fontFamily: theme.fontMono,\n ...style,\n }}\n data-fp=\"narrative-trace\"\n >\n {revealedGroups.map((group, gi) => {\n const isLatest = gi === lastIdx;\n const isCollapsed = collapsedSet.has(group.headerIdx);\n const hasSteps = group.steps.length > 0;\n\n return (\n <div\n key={group.headerIdx}\n ref={isLatest ? latestRef : undefined}\n style={{ marginBottom: 2 }}\n data-fp=\"narrative-group\"\n >\n {/* Stage header */}\n <div\n onClick={() => {\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: isLatest ? theme.textPrimary : theme.textSecondary,\n padding: `4px ${pad - 4}px`,\n borderRadius: 4,\n background: isLatest ? theme.bgTertiary : \"transparent\",\n borderLeft: isLatest\n ? `3px solid ${theme.primary}`\n : `3px solid ${theme.success}`,\n cursor: hasSteps ? \"pointer\" : \"default\",\n fontWeight: 600,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n userSelect: \"none\",\n transition: \"all 0.15s ease\",\n }}\n >\n {hasSteps && (\n <span\n style={{\n fontSize: fs.small - 1,\n color: theme.textMuted,\n transition: \"transform 0.15s ease\",\n transform: isCollapsed ? \"rotate(-90deg)\" : \"rotate(0deg)\",\n display: \"inline-block\",\n width: 10,\n flexShrink: 0,\n }}\n >\n ▼\n </span>\n )}\n {!hasSteps && <span style={{ width: 10, flexShrink: 0 }} />}\n <span>{group.header}</span>\n </div>\n\n {/* Step lines */}\n {!isCollapsed &&\n group.steps.map((step) => (\n <div\n key={step.idx}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: isLatest ? theme.textSecondary : theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n opacity: isLatest ? 0.9 : 0.7,\n transition: \"all 0.15s ease\",\n }}\n data-fp=\"narrative-step\"\n >\n {step.text}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* Dimmed future groups */}\n {futureGroups.length > 0 && (\n <div style={{ opacity: 0.2 }}>\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} style={{ marginBottom: 2 }}>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: theme.textMuted,\n padding: `4px ${pad - 4}px`,\n borderLeft: `3px solid ${theme.border}`,\n fontWeight: 600,\n paddingLeft: pad + 12,\n }}\n >\n {group.header}\n </div>\n {group.steps.map((step) => (\n <div\n key={`f-${step.idx}`}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n }}\n >\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useRef, useEffect } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface GanttTimelineProps extends BaseComponentProps {\n /** Stage snapshots with timing info */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex?: number;\n /** Callback when a stage bar is clicked */\n onSelect?: (index: number) => void;\n /** Max visible rows before collapsing (0 = no collapse). Default: 5 */\n maxVisibleRows?: number;\n}\n\n/**\n * Horizontal Gantt-style timeline showing stage durations and overlap.\n * Collapses to `maxVisibleRows` with expand/collapse toggle.\n * Auto-scrolls to keep the active stage visible when collapsed.\n */\nexport function GanttTimeline({\n snapshots,\n selectedIndex = 0,\n onSelect,\n size = \"default\",\n unstyled = false,\n className,\n style,\n maxVisibleRows = 5,\n}: GanttTimelineProps) {\n const [expanded, setExpanded] = useState(false);\n const activeRowRef = useRef<HTMLDivElement | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n\n const totalWallTime = useMemo(\n () => Math.max(...snapshots.map((s) => s.startMs + s.durationMs), 1),\n [snapshots]\n );\n\n const fs = fontSize[size];\n const pad = padding[size];\n const labelWidth = size === \"compact\" ? 50 : size === \"detailed\" ? 100 : 80;\n const msWidth = size === \"compact\" ? 28 : 36;\n const rowHeight = size === \"compact\" ? 18 : 22;\n\n const collapsible = maxVisibleRows > 0 && snapshots.length > maxVisibleRows;\n const showAll = expanded || !collapsible;\n\n // Auto-scroll to active row when collapsed\n useEffect(() => {\n if (!showAll && activeRowRef.current && scrollContainerRef.current) {\n activeRowRef.current.scrollIntoView({\n block: \"nearest\",\n behavior: \"smooth\",\n });\n }\n }, [selectedIndex, showAll]);\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"gantt-timeline\">\n {snapshots.map((snap, idx) => (\n <div\n key={snap.stageName}\n data-fp=\"gantt-bar\"\n data-selected={idx === selectedIndex}\n data-visible={idx <= selectedIndex}\n onClick={() => onSelect?.(idx)}\n >\n <span data-fp=\"gantt-label\">{snap.stageLabel}</span>\n <span data-fp=\"gantt-duration\">{snap.durationMs}ms</span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"gantt-timeline\"\n >\n {/* Header with collapse toggle */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n {size === \"compact\" ? \"Timeline\" : \"Execution Timeline\"}\n </span>\n {collapsible && (\n <button\n onClick={() => setExpanded((e) => !e)}\n style={{\n background: \"none\",\n border: `1px solid ${theme.border}`,\n borderRadius: 4,\n color: theme.textSecondary,\n fontSize: fs.small,\n padding: \"2px 8px\",\n cursor: \"pointer\",\n fontFamily: theme.fontSans,\n }}\n >\n {expanded\n ? \"Collapse\"\n : `${snapshots.length - maxVisibleRows} more...`}\n </button>\n )}\n </div>\n\n {/* Scrollable rows container */}\n <div\n ref={scrollContainerRef}\n style={{\n marginTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n ...(showAll\n ? {}\n : {\n maxHeight: maxVisibleRows * (rowHeight + 4),\n overflowY: \"auto\",\n scrollbarWidth: \"thin\",\n }),\n }}\n >\n {snapshots.map((snap, idx) => {\n const leftPct = (snap.startMs / totalWallTime) * 100;\n const widthPct = Math.max((snap.durationMs / totalWallTime) * 100, 1);\n const isSelected = idx === selectedIndex;\n const isVisible = idx <= selectedIndex;\n\n return (\n <div\n key={snap.stageName}\n ref={isSelected ? activeRowRef : undefined}\n onClick={() => onSelect?.(idx)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: size === \"compact\" ? 4 : 8,\n cursor: onSelect ? \"pointer\" : \"default\",\n opacity: isVisible ? 1 : 0.3,\n transition: \"opacity 0.3s ease\",\n height: rowHeight,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n width: labelWidth,\n fontSize: fs.small,\n color: isSelected ? theme.primary : theme.textMuted,\n fontWeight: isSelected ? 600 : 400,\n textAlign: \"right\",\n flexShrink: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {snap.stageLabel}\n </span>\n <div\n style={{\n flex: 1,\n height: size === \"compact\" ? 6 : 8,\n position: \"relative\",\n background: theme.bgTertiary,\n borderRadius: 3,\n }}\n >\n {isVisible && (\n <div\n style={{\n position: \"absolute\",\n left: `${leftPct}%`,\n top: 0,\n width: `${widthPct}%`,\n height: \"100%\",\n borderRadius: 3,\n background: isSelected ? theme.primary : theme.success,\n transition: \"width 0.3s ease\",\n }}\n />\n )}\n </div>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n width: msWidth,\n flexShrink: 0,\n }}\n >\n {snap.durationMs}ms\n </span>\n </div>\n );\n })}\n </div>\n\n {/* Time axis */}\n <div\n style={{\n marginTop: 4,\n marginLeft: labelWidth + (size === \"compact\" ? 4 : 8),\n marginRight: msWidth + (size === \"compact\" ? 4 : 8),\n display: \"flex\",\n justifyContent: \"space-between\",\n fontSize: fs.small - 1,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n <span>0ms</span>\n {size !== \"compact\" && (\n <span>{(totalWallTime / 2).toFixed(1)}ms</span>\n )}\n <span>{totalWallTime.toFixed(1)}ms</span>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeLog } from \"../NarrativeLog\";\nimport { GanttTimeline } from \"../GanttTimeline\";\n\nexport interface SnapshotPanelProps extends BaseComponentProps {\n /** Stage snapshots from pipeline execution */\n snapshots: StageSnapshot[];\n /** Show the Gantt timeline */\n showGantt?: boolean;\n /** Show the time-travel scrubber */\n showScrubber?: boolean;\n /** Title override */\n title?: string;\n}\n\n/**\n * All-in-one panel: time-travel scrubber + memory inspector + narrative log + gantt.\n * Drop this into any page to make a pipeline run inspectable.\n */\nexport function SnapshotPanel({\n snapshots,\n showGantt = true,\n showScrubber = true,\n title = \"Pipeline Inspector\",\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: SnapshotPanelProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (snapshots.length === 0) {\n return (\n <div\n className={className}\n style={{\n padding: pad * 2,\n textAlign: \"center\",\n color: unstyled ? undefined : theme.textMuted,\n fontSize: fs.body,\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n No snapshots to display\n </div>\n );\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"snapshot-panel\">\n <h3>{title}</h3>\n {showScrubber && (\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n />\n )}\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n {showGantt && (\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n unstyled\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: theme.bgPrimary,\n fontFamily: theme.fontSans,\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n {/* Header with title + scrubber */}\n <div\n style={{\n padding: `${pad}px ${pad + 4}px`,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: showScrubber ? 8 : 0,\n }}\n >\n <span\n style={{\n fontSize: fs.body + 2,\n fontWeight: 600,\n color: theme.textPrimary,\n }}\n >\n {title}\n </span>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n {selectedIndex + 1}/{snapshots.length}\n </span>\n </div>\n\n {showScrubber && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <ScrubButton\n label=\"\\u25C0\"\n disabled={selectedIndex === 0}\n onClick={() => setSelectedIndex((i) => Math.max(0, i - 1))}\n />\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n style={{\n flex: 1,\n height: 4,\n accentColor: theme.primary,\n cursor: \"pointer\",\n }}\n />\n <ScrubButton\n label=\"\\u25B6\"\n disabled={selectedIndex === snapshots.length - 1}\n onClick={() =>\n setSelectedIndex((i) => Math.min(snapshots.length - 1, i + 1))\n }\n />\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, overflow: \"auto\" }}>\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n <div\n style={{\n height: 1,\n background: theme.border,\n margin: `0 ${pad}px`,\n }}\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n </div>\n\n {/* Gantt footer */}\n {showGantt && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n size={size}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ScrubButton({\n label,\n disabled,\n onClick,\n}: {\n label: string;\n disabled: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: 6,\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {label}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DiffEntry {\n key: string;\n type: \"added\" | \"removed\" | \"changed\" | \"unchanged\";\n oldValue?: unknown;\n newValue?: unknown;\n}\n\nexport interface ScopeDiffProps extends BaseComponentProps {\n /** Memory state before the current stage */\n previous: Record<string, unknown> | null;\n /** Memory state after the current stage */\n current: Record<string, unknown>;\n /** Hide unchanged keys (default: false) */\n hideUnchanged?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction computeDiff(\n prev: Record<string, unknown> | null,\n curr: Record<string, unknown>\n): DiffEntry[] {\n const entries: DiffEntry[] = [];\n const allKeys = new Set([...Object.keys(prev ?? {}), ...Object.keys(curr)]);\n\n for (const key of allKeys) {\n const inPrev = prev != null && key in prev;\n const inCurr = key in curr;\n const oldVal = prev?.[key];\n const newVal = curr[key];\n\n if (!inPrev && inCurr) {\n entries.push({ key, type: \"added\", newValue: newVal });\n } else if (inPrev && !inCurr) {\n entries.push({ key, type: \"removed\", oldValue: oldVal });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n entries.push({ key, type: \"changed\", oldValue: oldVal, newValue: newVal });\n } else {\n entries.push({ key, type: \"unchanged\", newValue: newVal });\n }\n }\n\n const order = { added: 0, changed: 1, removed: 2, unchanged: 3 };\n entries.sort((a, b) => order[a.type] - order[b.type]);\n return entries;\n}\n\nfunction fmt(v: unknown): string {\n if (typeof v === \"string\") return `\"${v}\"`;\n if (typeof v === \"object\" && v !== null) return JSON.stringify(v, null, 2);\n return String(v);\n}\n\nconst diffColors: Record<DiffEntry[\"type\"], { bg: string; fg: string; icon: string }> = {\n added: { bg: \"rgba(34,197,94,0.10)\", fg: \"#22c55e\", icon: \"+\" },\n removed: { bg: \"rgba(239,68,68,0.10)\", fg: \"#ef4444\", icon: \"-\" },\n changed: { bg: \"rgba(245,158,11,0.10)\", fg: \"#f59e0b\", icon: \"~\" },\n unchanged: { bg: \"transparent\", fg: \"\", icon: \" \" },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ScopeDiff({\n previous,\n current,\n hideUnchanged = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ScopeDiffProps) {\n const entries = useMemo(() => computeDiff(previous, current), [previous, current]);\n const visible = hideUnchanged ? entries.filter((e) => e.type !== \"unchanged\") : entries;\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"scope-diff\">\n {visible.map((e) => (\n <div key={e.key} data-fp=\"diff-entry\" data-type={e.type}>\n <span data-fp=\"diff-key\">{e.key}</span>\n {e.type === \"changed\" && (\n <>\n <span data-fp=\"diff-old\">{fmt(e.oldValue)}</span>\n <span data-fp=\"diff-new\">{fmt(e.newValue)}</span>\n </>\n )}\n {(e.type === \"added\" || e.type === \"unchanged\") && (\n <span data-fp=\"diff-value\">{fmt(e.newValue)}</span>\n )}\n {e.type === \"removed\" && (\n <span data-fp=\"diff-value\">{fmt(e.oldValue)}</span>\n )}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontMono, ...style }}\n data-fp=\"scope-diff\"\n >\n {visible.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No changes\n </div>\n )}\n {visible.map((entry) => {\n const dc = diffColors[entry.type];\n return (\n <div\n key={entry.key}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: `4px ${pad - 4}px`,\n marginBottom: 2,\n borderRadius: 4,\n background: dc.bg,\n fontSize: fs.body,\n lineHeight: 1.5,\n }}\n data-fp=\"diff-entry\"\n >\n <span\n style={{\n width: 16,\n flexShrink: 0,\n fontWeight: 700,\n color: dc.fg || theme.textMuted,\n textAlign: \"center\",\n }}\n >\n {dc.icon}\n </span>\n <span style={{ color: theme.primary, fontWeight: 600, flexShrink: 0 }}>\n {entry.key}\n </span>\n <span style={{ color: theme.textMuted }}>=</span>\n {entry.type === \"changed\" ? (\n <span>\n <span\n style={{\n color: theme.error,\n textDecoration: \"line-through\",\n opacity: 0.7,\n }}\n >\n {fmt(entry.oldValue)}\n </span>\n <span style={{ color: theme.textMuted, margin: \"0 4px\" }}>→</span>\n <span style={{ color: theme.success }}>{fmt(entry.newValue)}</span>\n </span>\n ) : (\n <span\n style={{\n color:\n entry.type === \"added\"\n ? theme.success\n : entry.type === \"removed\"\n ? theme.error\n : theme.textPrimary,\n }}\n >\n {fmt(entry.type === \"removed\" ? entry.oldValue : entry.newValue)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface ResultPanelProps extends BaseComponentProps {\n /** Final pipeline output / shared state */\n data: Record<string, unknown> | null;\n /** Optional console log lines */\n logs?: string[];\n /** Hide console section (default: false) */\n hideConsole?: boolean;\n}\n\nexport function ResultPanel({\n data,\n logs = [],\n hideConsole = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ResultPanelProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"result-panel\">\n <div data-fp=\"result-data\">\n <pre>{data ? JSON.stringify(data, null, 2) : \"No data\"}</pre>\n </div>\n {!hideConsole && (\n <div data-fp=\"result-console\">\n {logs.map((line, i) => (\n <div key={i} data-fp=\"console-line\" data-error={line.startsWith(\"ERROR\")}>\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"result-panel\"\n >\n {data && (\n <div style={{ flex: 1, overflow: \"auto\", padding: pad }}>\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n {size === \"compact\" ? \"Result\" : \"Business Result (Scope)\"}\n </div>\n <pre\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: theme.textPrimary,\n background: theme.bgSecondary,\n padding: pad,\n borderRadius: theme.radius,\n overflow: \"auto\",\n margin: 0,\n }}\n >\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n )}\n\n {!hideConsole && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n padding: pad,\n overflow: \"auto\",\n maxHeight: \"40%\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n Console\n </div>\n {logs.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No console output\n </div>\n )}\n {logs.map((line, i) => (\n <div\n key={i}\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: line.startsWith(\"ERROR\") ? theme.error : theme.textPrimary,\n padding: \"2px 0\",\n borderBottom: `1px solid ${theme.bgSecondary}`,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }}\n >\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type StageDetailMode = \"simple\" | \"dev\";\n\nexport interface MemoryChange {\n key: string;\n type: \"added\" | \"updated\" | \"removed\";\n oldValue?: unknown;\n newValue?: unknown;\n}\n\n/** Keys that are footprint engine internals — hidden by default in dev mode. */\nexport const DEFAULT_EXCLUDED_KEYS = new Set<string>([]);\n\nexport interface StageDetailPanelProps extends BaseComponentProps {\n /** Stage snapshots for time-travel */\n snapshots: StageSnapshot[];\n /** Current snapshot index */\n selectedIndex: number;\n /** Display mode: \"simple\" (description + narrative) or \"dev\" (memory story) */\n mode?: StageDetailMode;\n /** Show a toggle to switch between simple/dev modes (default: false) */\n showToggle?: boolean;\n /** Called when user toggles mode via built-in toggle */\n onModeChange?: (mode: StageDetailMode) => void;\n /** Keys to exclude from memory display (default: engine internals). Pass empty set to show all. */\n excludeKeys?: Set<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction computeChanges(\n prev: Record<string, unknown> | null,\n curr: Record<string, unknown>,\n): MemoryChange[] {\n const changes: MemoryChange[] = [];\n const allKeys = new Set([...Object.keys(prev ?? {}), ...Object.keys(curr)]);\n\n for (const key of allKeys) {\n const inPrev = prev != null && key in prev;\n const inCurr = key in curr;\n const oldVal = prev?.[key];\n const newVal = curr[key];\n\n if (!inPrev && inCurr) {\n changes.push({ key, type: \"added\", newValue: newVal });\n } else if (inPrev && !inCurr) {\n changes.push({ key, type: \"removed\", oldValue: oldVal });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n changes.push({ key, type: \"updated\", oldValue: oldVal, newValue: newVal });\n }\n }\n\n const order = { added: 0, updated: 1, removed: 2 };\n changes.sort((a, b) => order[a.type] - order[b.type]);\n return changes;\n}\n\nfunction fmt(v: unknown): string {\n if (typeof v === \"string\") return `\"${v}\"`;\n if (typeof v === \"object\" && v !== null) return JSON.stringify(v, null, 2);\n return String(v);\n}\n\nconst changeBadge: Record<MemoryChange[\"type\"], { bg: string; fg: string; label: string }> = {\n added: { bg: \"rgba(34,197,94,0.12)\", fg: \"#22c55e\", label: \"ADD\" },\n updated: { bg: \"rgba(245,158,11,0.12)\", fg: \"#f59e0b\", label: \"UPD\" },\n removed: { bg: \"rgba(239,68,68,0.12)\", fg: \"#ef4444\", label: \"DEL\" },\n};\n\n// ---------------------------------------------------------------------------\n// Simple Mode — description + narrative\n// ---------------------------------------------------------------------------\n\nfunction SimpleView({\n snapshot,\n fs,\n pad,\n}: {\n snapshot: StageSnapshot;\n fs: { label: number; body: number; small: number };\n pad: number;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n {/* Stage header */}\n <div>\n <div\n style={{\n fontSize: fs.label + 2,\n fontWeight: 700,\n color: theme.textPrimary,\n }}\n >\n {snapshot.stageLabel}\n </div>\n {snapshot.description && (\n <div\n style={{\n fontSize: fs.body,\n color: theme.textSecondary,\n marginTop: 4,\n lineHeight: 1.5,\n }}\n >\n {snapshot.description}\n </div>\n )}\n </div>\n\n {/* Status badge */}\n {snapshot.status && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background:\n snapshot.status === \"done\"\n ? theme.success\n : snapshot.status === \"active\"\n ? theme.primary\n : snapshot.status === \"error\"\n ? theme.error\n : theme.textMuted,\n }}\n />\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {snapshot.status}\n </span>\n </div>\n )}\n\n {/* Narrative — what happened */}\n {snapshot.narrative && (\n <div>\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 6,\n }}\n >\n What happened\n </div>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.6,\n color: theme.textPrimary,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: theme.radius,\n padding: pad,\n }}\n >\n {snapshot.narrative}\n </div>\n </div>\n )}\n\n {/* Duration */}\n {snapshot.durationMs > 0 && (\n <div\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n }}\n >\n Completed in {snapshot.durationMs < 1 ? \"<1\" : snapshot.durationMs}ms\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dev Mode — memory story (browser DevTools style)\n// ---------------------------------------------------------------------------\n\n/** A row in the full memory ledger: either a changed key or an unchanged one. */\ntype MemoryRow =\n | { kind: \"change\"; change: MemoryChange }\n | { kind: \"unchanged\"; key: string; value: unknown };\n\nfunction buildMemoryRows(\n currMemory: Record<string, unknown>,\n changes: MemoryChange[],\n): MemoryRow[] {\n const changeMap = new Map(changes.map((c) => [c.key, c]));\n const rows: MemoryRow[] = [];\n\n // Changed keys first (ADD → UPD → DEL)\n for (const change of changes) {\n rows.push({ kind: \"change\", change });\n }\n\n // Then unchanged keys (sorted alphabetically)\n const unchangedKeys = Object.keys(currMemory)\n .filter((k) => !changeMap.has(k))\n .sort();\n for (const key of unchangedKeys) {\n rows.push({ kind: \"unchanged\", key, value: currMemory[key] });\n }\n\n return rows;\n}\n\nfunction DevView({\n snapshot,\n changes,\n currMemory,\n fs,\n pad,\n}: {\n snapshot: StageSnapshot;\n changes: MemoryChange[];\n currMemory: Record<string, unknown>;\n fs: { label: number; body: number; small: number };\n pad: number;\n}) {\n const rows = useMemo(() => buildMemoryRows(currMemory, changes), [currMemory, changes]);\n const totalKeys = Object.keys(currMemory).length;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {/* Stage header with label */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n fontSize: fs.label + 2,\n fontWeight: 700,\n color: theme.textPrimary,\n fontFamily: theme.fontMono,\n }}\n >\n {snapshot.stageLabel}\n </span>\n {snapshot.durationMs > 0 && (\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n {snapshot.durationMs}ms\n </span>\n )}\n </div>\n\n {/* Memory state section header */}\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Memory\n <span style={{ fontWeight: 400, marginLeft: 6 }}>\n ({totalKeys} key{totalKeys !== 1 ? \"s\" : \"\"}\n {changes.length > 0 && `, ${changes.length} changed`})\n </span>\n </div>\n\n {/* Full memory ledger */}\n {rows.length === 0 ? (\n <div\n style={{\n fontSize: fs.body,\n color: theme.textMuted,\n fontStyle: \"italic\",\n fontFamily: theme.fontMono,\n padding: `${pad}px`,\n background: theme.bgSecondary,\n borderRadius: theme.radius,\n }}\n >\n Empty memory\n </div>\n ) : (\n <div\n style={{\n fontFamily: theme.fontMono,\n fontSize: fs.body,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: theme.radius,\n overflow: \"hidden\",\n }}\n >\n {rows.map((row) => {\n if (row.kind === \"change\") {\n const { change } = row;\n const badge = changeBadge[change.type];\n return (\n <div\n key={change.key}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: `6px ${pad}px`,\n borderBottom: `1px solid ${theme.border}`,\n background: badge.bg,\n }}\n data-fp=\"memory-change\"\n data-type={change.type}\n >\n <span\n style={{\n fontSize: fs.small,\n fontWeight: 700,\n color: badge.fg,\n width: 28,\n flexShrink: 0,\n textAlign: \"center\",\n lineHeight: 1.8,\n }}\n >\n {badge.label}\n </span>\n <span\n style={{\n color: theme.primary,\n fontWeight: 600,\n flexShrink: 0,\n lineHeight: 1.8,\n }}\n >\n {change.key}\n </span>\n <div style={{ flex: 1, minWidth: 0, lineHeight: 1.8 }}>\n {change.type === \"updated\" ? (\n <>\n <span\n style={{\n color: theme.error,\n textDecoration: \"line-through\",\n opacity: 0.7,\n }}\n >\n {fmt(change.oldValue)}\n </span>\n <span style={{ color: theme.textMuted, margin: \"0 4px\" }}>→</span>\n <span style={{ color: theme.success }}>{fmt(change.newValue)}</span>\n </>\n ) : change.type === \"added\" ? (\n <span style={{ color: theme.success }}>{fmt(change.newValue)}</span>\n ) : (\n <span style={{ color: theme.error, textDecoration: \"line-through\" }}>\n {fmt(change.oldValue)}\n </span>\n )}\n </div>\n </div>\n );\n }\n\n // Unchanged key — dimmed, no badge\n return (\n <div\n key={row.key}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: `6px ${pad}px`,\n borderBottom: `1px solid ${theme.border}`,\n opacity: 0.5,\n }}\n data-fp=\"memory-unchanged\"\n >\n <span\n style={{\n width: 28,\n flexShrink: 0,\n lineHeight: 1.8,\n }}\n />\n <span\n style={{\n color: theme.textSecondary,\n fontWeight: 500,\n flexShrink: 0,\n lineHeight: 1.8,\n }}\n >\n {row.key}\n </span>\n <div style={{ flex: 1, minWidth: 0, lineHeight: 1.8, color: theme.textMuted }}>\n {fmt(row.value)}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Unstyled Mode\n// ---------------------------------------------------------------------------\n\nfunction UnstyledSimpleView({ snapshot }: { snapshot: StageSnapshot }) {\n return (\n <div data-fp=\"stage-detail-simple\">\n <div data-fp=\"stage-label\">{snapshot.stageLabel}</div>\n {snapshot.description && (\n <div data-fp=\"stage-description\">{snapshot.description}</div>\n )}\n {snapshot.status && <div data-fp=\"stage-status\">{snapshot.status}</div>}\n {snapshot.narrative && (\n <div data-fp=\"stage-narrative\">{snapshot.narrative}</div>\n )}\n </div>\n );\n}\n\nfunction UnstyledDevView({\n snapshot,\n changes,\n currMemory,\n}: {\n snapshot: StageSnapshot;\n changes: MemoryChange[];\n currMemory: Record<string, unknown>;\n}) {\n const rows = useMemo(() => buildMemoryRows(currMemory, changes), [currMemory, changes]);\n return (\n <div data-fp=\"stage-detail-dev\">\n <div data-fp=\"stage-label\">{snapshot.stageLabel}</div>\n {rows.map((row) => {\n if (row.kind === \"change\") {\n const c = row.change;\n return (\n <div key={c.key} data-fp=\"memory-change\" data-type={c.type}>\n <span data-fp=\"change-key\">{c.key}</span>\n {c.type === \"updated\" && (\n <>\n <span data-fp=\"change-old\">{fmt(c.oldValue)}</span>\n <span data-fp=\"change-new\">{fmt(c.newValue)}</span>\n </>\n )}\n {c.type === \"added\" && (\n <span data-fp=\"change-value\">{fmt(c.newValue)}</span>\n )}\n {c.type === \"removed\" && (\n <span data-fp=\"change-value\">{fmt(c.oldValue)}</span>\n )}\n </div>\n );\n }\n return (\n <div key={row.key} data-fp=\"memory-unchanged\">\n <span data-fp=\"unchanged-key\">{row.key}</span>\n <span data-fp=\"unchanged-value\">{fmt(row.value)}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Mode Toggle\n// ---------------------------------------------------------------------------\n\nfunction ModeToggle({\n activeMode,\n onToggle,\n fs,\n unstyled,\n}: {\n activeMode: StageDetailMode;\n onToggle: () => void;\n fs: { label: number; body: number; small: number };\n unstyled: boolean;\n}) {\n if (unstyled) {\n return (\n <button data-fp=\"mode-toggle\" data-mode={activeMode} onClick={onToggle}>\n {activeMode === \"simple\" ? \"Dev\" : \"Simple\"}\n </button>\n );\n }\n\n return (\n <div\n style={{\n display: \"inline-flex\",\n borderRadius: 6,\n border: `1px solid ${theme.border}`,\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n data-fp=\"mode-toggle\"\n >\n {([\"simple\", \"dev\"] as const).map((m) => (\n <button\n key={m}\n onClick={m !== activeMode ? onToggle : undefined}\n style={{\n padding: \"4px 10px\",\n fontSize: fs.small,\n fontWeight: m === activeMode ? 700 : 400,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: m === activeMode ? theme.textPrimary : theme.textMuted,\n background: m === activeMode ? theme.bgTertiary : \"transparent\",\n border: \"none\",\n cursor: m === activeMode ? \"default\" : \"pointer\",\n }}\n >\n {m === \"simple\" ? \"Simple\" : \"Dev\"}\n </button>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nexport function StageDetailPanel({\n snapshots,\n selectedIndex,\n mode: controlledMode,\n showToggle = false,\n onModeChange,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: StageDetailPanelProps) {\n const [internalMode, setInternalMode] = useState<StageDetailMode>(controlledMode ?? \"simple\");\n\n // Support both controlled (mode prop) and uncontrolled (internal state) usage\n const activeMode = controlledMode ?? internalMode;\n\n const handleToggle = useCallback(() => {\n const next: StageDetailMode = activeMode === \"simple\" ? \"dev\" : \"simple\";\n setInternalMode(next);\n onModeChange?.(next);\n }, [activeMode, onModeChange]);\n\n const snapshot = snapshots[selectedIndex];\n const prevMemory = selectedIndex > 0 ? snapshots[selectedIndex - 1]?.memory ?? null : null;\n const currMemory = snapshot?.memory ?? {};\n\n const changes = useMemo(\n () => computeChanges(prevMemory, currMemory),\n [prevMemory, currMemory],\n );\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (!snapshot) {\n return (\n <div className={className} style={style} data-fp=\"stage-detail-panel\">\n <div style={unstyled ? {} : { color: theme.textMuted, fontSize: fs.body, fontStyle: \"italic\", padding: pad }}>\n No stage selected\n </div>\n </div>\n );\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"stage-detail-panel\" data-mode={activeMode}>\n {showToggle && (\n <ModeToggle activeMode={activeMode} onToggle={handleToggle} fs={fs} unstyled />\n )}\n {activeMode === \"simple\" ? (\n <UnstyledSimpleView snapshot={snapshot} />\n ) : (\n <UnstyledDevView snapshot={snapshot} changes={changes} currMemory={currMemory} />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n padding: pad,\n fontFamily: theme.fontSans,\n overflow: \"auto\",\n ...style,\n }}\n data-fp=\"stage-detail-panel\"\n data-mode={activeMode}\n >\n {showToggle && (\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginBottom: 12 }}>\n <ModeToggle activeMode={activeMode} onToggle={handleToggle} fs={fs} unstyled={false} />\n </div>\n )}\n {activeMode === \"simple\" ? (\n <SimpleView snapshot={snapshot} fs={fs} pad={pad} />\n ) : (\n <DevView snapshot={snapshot} changes={changes} currMemory={currMemory} fs={fs} pad={pad} />\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize } from \"../../theme\";\n\nexport interface TimeTravelControlsProps extends BaseComponentProps {\n /** Stage snapshots */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex: number;\n /** Callback when selected index changes */\n onIndexChange: (index: number) => void;\n /** Enable auto-play with Gantt-proportional timing */\n autoPlayable?: boolean;\n}\n\nexport function TimeTravelControls({\n snapshots,\n selectedIndex,\n onIndexChange,\n autoPlayable = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: TimeTravelControlsProps) {\n const [playing, setPlaying] = useState(false);\n const playRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const total = snapshots.length;\n const canPrev = selectedIndex > 0;\n const canNext = selectedIndex < total - 1;\n\n // Auto-advance with proportional timing\n useEffect(() => {\n if (!playing || !autoPlayable) return;\n if (selectedIndex >= total - 1) {\n setPlaying(false);\n return;\n }\n const stageDur = snapshots[selectedIndex]?.durationMs ?? 1;\n const totalDur = snapshots.reduce((s, snap) => s + snap.durationMs, 0) || 1;\n const fraction = stageDur / totalDur;\n const baseMs = 3000;\n const delay = Math.max(200, Math.min(fraction * baseMs, 2000));\n\n playRef.current = setTimeout(() => {\n onIndexChange(selectedIndex + 1);\n }, delay);\n\n return () => {\n if (playRef.current) clearTimeout(playRef.current);\n };\n }, [playing, selectedIndex, snapshots, total, onIndexChange, autoPlayable]);\n\n const togglePlay = useCallback(() => {\n if (playing) {\n setPlaying(false);\n } else {\n if (selectedIndex >= total - 1) onIndexChange(0);\n setPlaying(true);\n }\n }, [playing, selectedIndex, total, onIndexChange]);\n\n const fs = fontSize[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"time-travel-controls\">\n <button\n data-fp=\"tt-prev\"\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n Prev\n </button>\n {autoPlayable && (\n <button data-fp=\"tt-play\" onClick={togglePlay}>\n {playing ? \"Pause\" : \"Play\"}\n </button>\n )}\n <button\n data-fp=\"tt-next\"\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n Next\n </button>\n <div data-fp=\"tt-ticks\">\n {snapshots.map((snap, i) => (\n <button\n key={i}\n data-fp=\"tt-tick\"\n data-active={i === selectedIndex}\n data-done={i < selectedIndex}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n />\n ))}\n </div>\n </div>\n );\n }\n\n const btnStyle = (disabled: boolean): React.CSSProperties => ({\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: \"6px\",\n padding: \"4px 12px\",\n fontSize: fs.body,\n fontWeight: 600,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n flexShrink: 0,\n });\n\n return (\n <div\n className={className}\n style={{\n padding: \"6px 12px\",\n background: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flexShrink: 0,\n ...style,\n }}\n data-fp=\"time-travel-controls\"\n >\n <button\n style={btnStyle(!canPrev || playing)}\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n ◀\n </button>\n\n {autoPlayable && (\n <button\n onClick={togglePlay}\n style={{\n background: playing ? theme.primary : theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: playing ? \"white\" : theme.textPrimary,\n borderRadius: \"6px\",\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n fontSize: 14,\n flexShrink: 0,\n }}\n title={playing ? \"Pause\" : \"Play\"}\n >\n {playing ? \"\\u23F8\" : \"\\u25B6\"}\n </button>\n )}\n\n <button\n style={btnStyle(!canNext || playing)}\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n ▶\n </button>\n\n {/* Tick-mark timeline */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: \"0 4px\",\n }}\n >\n {snapshots.map((snap, i) => {\n const isActive = i === selectedIndex;\n const isDone = i < selectedIndex;\n return (\n <button\n key={i}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n style={{\n flex: 1,\n height: isActive ? 14 : 8,\n borderRadius: 3,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? theme.primary\n : isDone\n ? theme.success\n : theme.bgTertiary,\n opacity: isDone || isActive ? 1 : 0.4,\n transition: \"all 0.15s ease\",\n }}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { ResultPanel } from \"../ResultPanel\";\nimport { GanttTimeline } from \"../GanttTimeline\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeTrace } from \"../NarrativeTrace\";\nimport { ScopeDiff } from \"../ScopeDiff\";\nimport { TimeTravelControls } from \"../TimeTravelControls\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ShellTab = \"result\" | \"explainable\" | \"ai-compatible\";\n\nexport interface ExplainableShellProps extends BaseComponentProps {\n /** Stage snapshots for time-travel visualization */\n snapshots: StageSnapshot[];\n /** Final pipeline result data */\n resultData?: Record<string, unknown> | null;\n /** Console log lines */\n logs?: string[];\n /** Combined narrative lines */\n narrative?: string[];\n /** Which tabs to show (default: all three) */\n tabs?: ShellTab[];\n /** Initially active tab */\n defaultTab?: ShellTab;\n /** Hide console in result tab */\n hideConsole?: boolean;\n /** Custom content to render in each tab slot */\n renderFlowchart?: (props: {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n onNodeClick?: (index: number) => void;\n }) => React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ExplainableShell({\n snapshots,\n resultData,\n logs = [],\n narrative = [],\n tabs = [\"result\", \"explainable\", \"ai-compatible\"],\n defaultTab,\n hideConsole = false,\n renderFlowchart,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ExplainableShellProps) {\n const [activeTab, setActiveTab] = useState<ShellTab>(defaultTab ?? tabs[0]);\n const [snapshotIdx, setSnapshotIdx] = useState(0);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n const handleSnapshotChange = useCallback((idx: number) => {\n setSnapshotIdx(Math.max(0, Math.min(idx, snapshots.length - 1)));\n }, [snapshots.length]);\n\n // Progressive narrative reveal\n const revealedCount = useMemo(() => {\n if (snapshots.length === 0 || narrative.length === 0) return narrative.length;\n\n const boundaries: number[] = [];\n for (let i = 0; i < narrative.length; i++) {\n const trimmed = narrative[i].trimStart();\n if (\n (trimmed.startsWith(\"Stage \") && !trimmed.match(/^Stage\\s+\\d+:\\s*Step\\s/)) ||\n trimmed.startsWith(\"[\")\n ) {\n boundaries.push(i);\n }\n }\n\n if (boundaries.length === 0) {\n const ratio = (snapshotIdx + 1) / snapshots.length;\n return Math.max(1, Math.ceil(narrative.length * ratio));\n }\n\n const groupsToShow = Math.max(\n 1,\n Math.min(\n Math.floor(((snapshotIdx + 1) / snapshots.length) * boundaries.length) || 1,\n boundaries.length\n )\n );\n\n const endIdx =\n groupsToShow < boundaries.length ? boundaries[groupsToShow] : narrative.length;\n\n return Math.max(1, endIdx);\n }, [snapshots.length, snapshotIdx, narrative]);\n\n // Scope diff data\n const prevMemory = snapshotIdx > 0 ? snapshots[snapshotIdx - 1]?.memory : null;\n const currMemory = snapshots[snapshotIdx]?.memory ?? {};\n\n const tabLabels: Record<ShellTab, string> = {\n result: \"Result\",\n explainable: \"Explainable\",\n \"ai-compatible\": \"AI-Compatible\",\n };\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"explainable-shell\">\n <div data-fp=\"shell-tabs\">\n {tabs.map((tab) => (\n <button\n key={tab}\n data-fp=\"shell-tab\"\n data-active={tab === activeTab}\n onClick={() => setActiveTab(tab)}\n >\n {tabLabels[tab]}\n </button>\n ))}\n </div>\n <div data-fp=\"shell-content\" data-tab={activeTab}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n unstyled\n />\n )}\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <MemoryInspector snapshots={snapshots} selectedIndex={snapshotIdx} unstyled />\n <ScopeDiff previous={prevMemory} current={currMemory} unstyled />\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n unstyled\n />\n </>\n )}\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n unstyled\n />\n </>\n )}\n </div>\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n background: theme.bgPrimary,\n color: theme.textPrimary,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"explainable-shell\"\n >\n {/* Tab bar */}\n <div\n style={{\n display: \"flex\",\n gap: 0,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n {tabs.map((tab) => {\n const active = tab === activeTab;\n return (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: `${pad - 4}px ${pad}px`,\n fontSize: fs.label,\n fontWeight: active ? 700 : 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: active ? theme.primary : theme.textMuted,\n background: \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${theme.primary}` : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n >\n {tabLabels[tab]}\n </button>\n );\n })}\n </div>\n\n {/* Tab content */}\n <div style={{ flex: 1, overflow: \"hidden\", display: \"flex\", flexDirection: \"column\" }}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n size={size}\n />\n )}\n\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <div\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n size={size}\n />\n <div style={{ borderTop: `1px solid ${theme.border}` }}>\n <ScopeDiff\n previous={prevMemory}\n current={currMemory}\n hideUnchanged\n size={size}\n />\n </div>\n </div>\n </div>\n <div style={{ borderTop: `1px solid ${theme.border}`, flexShrink: 0 }}>\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n size={size}\n />\n </div>\n </>\n )}\n\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n size={size}\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n }}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { memo, useState, useCallback, useMemo } from \"react\";\nimport { theme } from \"../../theme\";\nimport type { SpecNode } from \"./specToReactFlow\";\nimport type { BaseComponentProps } from \"../../types\";\n\nexport interface SubflowTreeEntry {\n /** Node name / identifier */\n name: string;\n /** Human-readable description */\n description?: string;\n /** Subflow ID (when this node represents a subflow) */\n subflowId?: string;\n /** Whether this node is a subflow root (has nested structure) */\n isSubflow?: boolean;\n /** Nested children (subflow stages) */\n children?: SubflowTreeEntry[];\n}\n\nexport interface SubflowTreeProps extends BaseComponentProps {\n /** Pipeline spec to derive the tree from */\n spec: SpecNode;\n /** Currently active stage name (highlights in tree) */\n activeStage?: string | null;\n /** Set of completed stage names */\n doneStages?: Set<string>;\n /** Called when a tree node is clicked */\n onNodeSelect?: (name: string, isSubflow: boolean) => void;\n}\n\n/** Extracts a flat-ish tree of entries from a SpecNode for display. */\nexport function specToTree(node: SpecNode): SubflowTreeEntry[] {\n const entries: SubflowTreeEntry[] = [];\n const seen = new Set<string>();\n\n function walk(n: SpecNode) {\n const id = n.name || n.id || \"\";\n if (seen.has(id)) return;\n seen.add(id);\n\n const entry: SubflowTreeEntry = {\n name: n.name,\n description: n.description,\n subflowId: n.subflowId,\n isSubflow: !!n.isSubflowRoot,\n };\n\n // If this is a subflow with nested structure, recurse into it\n if (n.isSubflowRoot && n.subflowStructure) {\n entry.children = specToTree(n.subflowStructure);\n }\n\n entries.push(entry);\n\n // Walk children (fork/decider branches)\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n\n // Walk linear continuation\n if (n.next) {\n walk(n.next);\n }\n }\n\n walk(node);\n return entries;\n}\n\n/** Single tree node row */\nconst TreeNode = memo(function TreeNode({\n entry,\n depth,\n activeStage,\n doneStages,\n onNodeSelect,\n}: {\n entry: SubflowTreeEntry;\n depth: number;\n activeStage?: string | null;\n doneStages?: Set<string>;\n onNodeSelect?: (name: string, isSubflow: boolean) => void;\n}) {\n const [expanded, setExpanded] = useState(true);\n const hasChildren = entry.children && entry.children.length > 0;\n const isActive = activeStage === entry.name;\n const isDone = doneStages?.has(entry.name);\n\n const handleClick = useCallback(() => {\n if (hasChildren) {\n setExpanded((prev) => !prev);\n }\n onNodeSelect?.(entry.name, !!entry.isSubflow);\n }, [hasChildren, onNodeSelect, entry.name, entry.isSubflow]);\n\n return (\n <>\n <button\n onClick={handleClick}\n data-fp=\"subflow-tree-node\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n width: \"100%\",\n border: \"none\",\n background: isActive\n ? `color-mix(in srgb, ${theme.primary} 15%, transparent)`\n : \"transparent\",\n cursor: \"pointer\",\n padding: `4px 8px 4px ${8 + depth * 16}px`,\n fontFamily: theme.fontSans,\n fontSize: 12,\n textAlign: \"left\",\n borderRadius: 4,\n transition: \"background 0.15s\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = `color-mix(in srgb, ${theme.textMuted} 10%, transparent)`;\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n }\n }}\n >\n {/* Expand/collapse chevron for subflows */}\n {hasChildren ? (\n <span\n style={{\n fontSize: 10,\n color: theme.textMuted,\n width: 12,\n textAlign: \"center\",\n flexShrink: 0,\n transition: \"transform 0.15s\",\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n display: \"inline-block\",\n }}\n >\n ▶\n </span>\n ) : (\n <span style={{ width: 12, flexShrink: 0 }} />\n )}\n\n {/* Status dot */}\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n flexShrink: 0,\n background: isActive\n ? theme.primary\n : isDone\n ? theme.success\n : theme.border,\n }}\n />\n\n {/* Label + description */}\n <span style={{ display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n <span\n style={{\n color: isActive\n ? theme.primary\n : isDone\n ? theme.textPrimary\n : theme.textSecondary,\n fontWeight: isActive ? 600 : entry.isSubflow ? 500 : 400,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {entry.name}\n {entry.isSubflow && (\n <span style={{ opacity: 0.5, marginLeft: 4, fontSize: 10 }}>⊞</span>\n )}\n </span>\n {entry.description && (\n <span\n style={{\n color: theme.textMuted,\n fontSize: 10,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {entry.description}\n </span>\n )}\n </span>\n </button>\n\n {/* Children */}\n {hasChildren && expanded && (\n <div>\n {entry.children!.map((child, i) => (\n <TreeNode\n key={`${child.name}-${i}`}\n entry={child}\n depth={depth + 1}\n activeStage={activeStage}\n doneStages={doneStages}\n onNodeSelect={onNodeSelect}\n />\n ))}\n </div>\n )}\n </>\n );\n});\n\n/**\n * Collapsible tree sidebar showing the full subflow manifest.\n *\n * Shared navigation layer — humans click through the tree just like\n * LLMs call getSubflowManifest() / getSubflowSpec().\n *\n * All colors come from `--fp-*` CSS variables set by the consumer.\n */\n/** Section label used for \"Flowchart\" and \"Subflows\" headings. */\nconst SectionLabel = memo(function SectionLabel({ children }: { children: string }) {\n return (\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 10,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: theme.textMuted,\n }}\n >\n {children}\n </div>\n );\n});\n\nexport const SubflowTree = memo(function SubflowTree({\n spec,\n activeStage,\n doneStages,\n onNodeSelect,\n unstyled = false,\n className,\n style,\n}: SubflowTreeProps) {\n const tree = useMemo(() => specToTree(spec), [spec]);\n\n // Split into main flowchart stages vs subflow entries\n const mainStages = useMemo(() => tree.filter((e) => !e.isSubflow), [tree]);\n const subflowStages = useMemo(() => tree.filter((e) => e.isSubflow), [tree]);\n\n const renderEntries = (entries: SubflowTreeEntry[]) =>\n entries.map((entry, i) => (\n <TreeNode\n key={`${entry.name}-${i}`}\n entry={entry}\n depth={0}\n activeStage={activeStage}\n doneStages={doneStages}\n onNodeSelect={onNodeSelect}\n />\n ));\n\n return (\n <div\n className={className}\n data-fp=\"subflow-tree\"\n style={{\n ...(unstyled\n ? {}\n : {\n fontFamily: theme.fontSans,\n fontSize: 12,\n background: theme.bgPrimary,\n borderRight: `1px solid ${theme.border}`,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: \"8px 0\",\n }),\n ...style,\n }}\n >\n {!unstyled && <SectionLabel>Flowchart</SectionLabel>}\n {renderEntries(mainStages)}\n\n {subflowStages.length > 0 && (\n <>\n {!unstyled && (\n <div style={{ height: 1, background: theme.border, margin: \"8px 12px\" }} />\n )}\n {!unstyled && <SectionLabel>Subflows</SectionLabel>}\n {renderEntries(subflowStages)}\n </>\n )}\n </div>\n );\n});\n","import type { StageSnapshot } from \"../types\";\n\n/**\n * Shape of FootPrint's RuntimeSnapshot (from FlowChartExecutor.getSnapshot()).\n * We define it here instead of importing to avoid a hard dependency on footprintjs.\n */\ninterface RuntimeStageSnapshot {\n id: string;\n name?: string;\n isDecider?: boolean;\n isFork?: boolean;\n /** User-level writes made by this stage (pre-namespace keys → values). */\n stageWrites?: Record<string, unknown>;\n logs: Record<string, unknown>;\n errors: Record<string, unknown>;\n metrics: Record<string, unknown>;\n evals: Record<string, unknown>;\n flowMessages?: unknown[];\n description?: string;\n subflowId?: string;\n next?: RuntimeStageSnapshot;\n children?: RuntimeStageSnapshot[];\n}\n\ninterface RuntimeSnapshot {\n sharedState: Record<string, unknown>;\n executionTree: RuntimeStageSnapshot;\n commitLog: unknown[];\n /** Per-subflow execution results (keyed by subflowId). */\n subflowResults?: Record<string, unknown>;\n}\n\n/**\n * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots\n * suitable for visualization components.\n *\n * Usage:\n * ```ts\n * const executor = new FlowChartExecutor(chart);\n * await executor.run();\n * const snapshots = toVisualizationSnapshots(executor.getSnapshot());\n * ```\n */\nexport function toVisualizationSnapshots(\n runtime: RuntimeSnapshot\n): StageSnapshot[] {\n const snapshots: StageSnapshot[] = [];\n flattenTree(runtime.executionTree, snapshots, runtime.sharedState, 0, runtime.subflowResults, {});\n return snapshots;\n}\n\nfunction flattenTree(\n node: RuntimeStageSnapshot,\n out: StageSnapshot[],\n sharedState: Record<string, unknown>,\n accumulatedMs: number = 0,\n subflowResults?: Record<string, unknown>,\n cumulativeMemory: Record<string, unknown> = {},\n): number {\n // Estimate duration from metrics if available\n const durationMs =\n typeof node.metrics?.durationMs === \"number\"\n ? node.metrics.durationMs\n : 1;\n\n const startMs = accumulatedMs;\n\n // Build narrative from stage writes (actual memory mutations)\n const narrative = buildNarrative(node);\n\n // Build cumulative memory from stageWrites (actual setValue/updateValue calls)\n const memory = { ...cumulativeMemory };\n if (node.stageWrites) {\n for (const [key, value] of Object.entries(node.stageWrites)) {\n if (value === undefined) {\n delete memory[key];\n } else {\n memory[key] = value;\n }\n }\n }\n\n // Attach subflow result from the proper channel (not from logs)\n const stageId = node.name || node.id;\n const sfResult = subflowResults?.[node.subflowId ?? stageId];\n\n out.push({\n stageName: stageId,\n stageLabel: stageId,\n memory,\n narrative,\n startMs,\n durationMs,\n status: \"done\",\n ...(node.description ? { description: node.description } : undefined),\n ...(node.subflowId ? { subflowId: node.subflowId } : undefined),\n ...(sfResult ? { subflowResult: sfResult } : undefined),\n });\n\n let nextMs = startMs + durationMs;\n\n // Handle parallel children (fork)\n if (node.children && node.children.length > 0) {\n let maxChildEnd = nextMs;\n for (const child of node.children) {\n const childEnd = flattenTree(child, out, sharedState, nextMs, subflowResults, memory);\n maxChildEnd = Math.max(maxChildEnd, childEnd);\n }\n nextMs = maxChildEnd;\n }\n\n // Handle linear continuation\n if (node.next) {\n nextMs = flattenTree(node.next, out, sharedState, nextMs, subflowResults, memory);\n }\n\n return nextMs;\n}\n\nfunction buildNarrative(node: RuntimeStageSnapshot): string {\n const parts: string[] = [];\n\n if (node.name) {\n parts.push(`Stage \"${node.name}\" executed.`);\n }\n\n // Report actual memory writes (stageWrites) instead of diagnostic logs\n if (node.stageWrites && Object.keys(node.stageWrites).length > 0) {\n const keys = Object.keys(node.stageWrites);\n parts.push(`Wrote ${keys.length} key(s): ${keys.join(\", \")}.`);\n }\n\n if (node.errors && Object.keys(node.errors).length > 0) {\n parts.push(`Errors: ${JSON.stringify(node.errors)}`);\n }\n\n if (node.isFork) {\n parts.push(\n `Forked into ${node.children?.length ?? 0} parallel branch(es).`\n );\n }\n\n return parts.join(\" \") || `Stage ${node.id} completed.`;\n}\n\n/**\n * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).\n * Useful for testing or custom data sources.\n */\nexport function createSnapshots(\n stages: Array<{\n name: string;\n label?: string;\n memory?: Record<string, unknown>;\n narrative?: string;\n durationMs?: number;\n description?: string;\n subflowId?: string;\n }>\n): StageSnapshot[] {\n let accMs = 0;\n return stages.map((s) => {\n const duration = s.durationMs ?? 1;\n const snap: StageSnapshot = {\n stageName: s.name,\n stageLabel: s.label ?? s.name,\n memory: s.memory ?? {},\n narrative: s.narrative ?? `${s.label ?? s.name} completed.`,\n startMs: accMs,\n durationMs: duration,\n status: \"done\",\n ...(s.description ? { description: s.description } : undefined),\n ...(s.subflowId ? { subflowId: s.subflowId } : undefined),\n };\n accMs += duration;\n return snap;\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","v","import_jsx_runtime","import_react","import_jsx_runtime","fmt","v","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","TreeNode","SectionLabel","SubflowTree"]}
|