footprint-explainable-ui 0.13.2 → 0.13.3
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/dist/flowchart.d.cts +2 -0
- package/dist/flowchart.d.ts +2 -0
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/presets.ts","../src/theme/useDarkModeTokens.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/adapters/fromRuntimeSnapshot.ts","../src/components/MemoryPanel/MemoryPanel.tsx","../src/components/NarrativePanel/NarrativePanel.tsx","../src/components/StoryNarrative/StoryNarrative.tsx","../src/components/FlowchartView/SubflowTree.tsx","../src/components/FlowchartView/SubflowBreadcrumb.tsx","../src/components/FlowchartView/TracedFlowchartView.tsx","../src/components/StageNode/StageNode.tsx","../src/components/FlowchartView/specToReactFlow.ts"],"sourcesContent":["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/** Raw fallback values — used by tokensToCSSVars() and anywhere a real color is needed. */\nexport const rawDefaults = {\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} as const;\n\n/** Default dark theme values with CSS variable references (consumers can override via CSS). */\nexport const defaultTokens: Required<{\n [K in keyof ThemeTokens]-?: Required<ThemeTokens[K]>;\n}> = {\n colors: {\n primary: `var(--fp-color-primary, ${rawDefaults.colors.primary})`,\n success: `var(--fp-color-success, ${rawDefaults.colors.success})`,\n error: `var(--fp-color-error, ${rawDefaults.colors.error})`,\n warning: `var(--fp-color-warning, ${rawDefaults.colors.warning})`,\n bgPrimary: `var(--fp-bg-primary, ${rawDefaults.colors.bgPrimary})`,\n bgSecondary: `var(--fp-bg-secondary, ${rawDefaults.colors.bgSecondary})`,\n bgTertiary: `var(--fp-bg-tertiary, ${rawDefaults.colors.bgTertiary})`,\n textPrimary: `var(--fp-text-primary, ${rawDefaults.colors.textPrimary})`,\n textSecondary: `var(--fp-text-secondary, ${rawDefaults.colors.textSecondary})`,\n textMuted: `var(--fp-text-muted, ${rawDefaults.colors.textMuted})`,\n border: `var(--fp-border, ${rawDefaults.colors.border})`,\n },\n radius: `var(--fp-radius, ${rawDefaults.radius})`,\n fontFamily: {\n sans: `var(--fp-font-sans, ${rawDefaults.fontFamily.sans})`,\n mono: `var(--fp-font-mono, ${rawDefaults.fontFamily.mono})`,\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/** Cool light theme — neutral grays, matches Tailwind zinc palette */\nexport const coolLight: ThemeTokens = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#ffffff\",\n bgSecondary: \"#f9fafb\",\n bgTertiary: \"#e5e7eb\",\n textPrimary: \"#18181b\",\n textSecondary: \"#52525b\",\n textMuted: \"#a1a1aa\",\n border: \"#e5e7eb\",\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 coolLight,\n warmDark,\n warmLight,\n} as const;\n\nexport type ThemePresetName = keyof typeof themePresets;\n","/**\n * useDarkModeTokens — Auto-bridge between CSS class-based dark mode and FootprintTheme.\n *\n * Watches for a `.dark` class on <html> (Tailwind convention) and returns\n * the appropriate ThemeTokens preset. Pairs with FootprintTheme:\n *\n * import { FootprintTheme, useDarkModeTokens } from 'footprint-explainable-ui';\n *\n * function MyApp() {\n * const tokens = useDarkModeTokens();\n * return (\n * <FootprintTheme tokens={tokens}>\n * <NarrativeTrace ... />\n * </FootprintTheme>\n * );\n * }\n *\n * Consumers can override the light/dark presets:\n *\n * const tokens = useDarkModeTokens({ light: warmLight, dark: warmDark });\n */\n\nimport { useState, useEffect } from \"react\";\nimport type { ThemeTokens } from \"./tokens\";\nimport { coolDark } from \"./presets\";\nimport { coolLight } from \"./presets\";\n\nexport interface DarkModeTokensOptions {\n /** Tokens to use in light mode. Defaults to coolLight. */\n light?: ThemeTokens;\n /** Tokens to use in dark mode. Defaults to coolDark. */\n dark?: ThemeTokens;\n /** CSS selector to watch for dark mode. Defaults to checking .dark on documentElement. */\n selector?: string;\n}\n\nexport function useDarkModeTokens(options?: DarkModeTokensOptions): ThemeTokens {\n const lightTokens = options?.light ?? coolLight;\n const darkTokens = options?.dark ?? coolDark;\n\n const [isDark, setIsDark] = useState(\n () => document.documentElement.classList.contains(options?.selector ?? \"dark\"),\n );\n\n useEffect(() => {\n const cls = options?.selector ?? \"dark\";\n const obs = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(cls));\n });\n obs.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => obs.disconnect();\n }, [options?.selector]);\n\n return isDark ? darkTokens : lightTokens;\n}\n","import { useMemo, useRef } 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/** Cache for incremental memory accumulation — avoids O(n) rebuild on every slider scrub. */\ninterface MemoryCache {\n snapshots: StageSnapshot[];\n index: number;\n accumulated: Record<string, unknown>;\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 // Incremental cache: accumulate forward from last known index instead of rebuilding from 0\n const cacheRef = useRef<MemoryCache | null>(null);\n\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 safeIdx = Math.min(selectedIndex, snapshots.length - 1);\n let merged: Record<string, unknown>;\n const cache = cacheRef.current;\n\n if (cache && cache.snapshots === snapshots && cache.index <= safeIdx) {\n // Forward scrub: extend from cached state\n merged = { ...cache.accumulated };\n for (let i = cache.index + 1; i <= safeIdx; i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n } else {\n // Backward scrub or new snapshots: rebuild from scratch\n merged = {};\n for (let i = 0; i <= safeIdx; i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n }\n\n // Update cache\n cacheRef.current = { snapshots, index: safeIdx, accumulated: merged };\n\n const nk = new Set<string>();\n if (highlightNew && safeIdx > 0) {\n // Previous state is cache at safeIdx-1, or rebuild if needed\n let prev: Record<string, unknown>;\n if (cache && cache.snapshots === snapshots && cache.index === safeIdx - 1) {\n prev = cache.accumulated;\n } else {\n prev = {};\n for (let i = 0; i < safeIdx; i++) {\n Object.assign(prev, snapshots[i]?.memory);\n }\n }\n const current = snapshots[safeIdx]?.memory ?? {};\n for (const k of Object.keys(current)) {\n if (!(k in prev)) nk.add(k);\n }\n } else if (highlightNew && safeIdx === 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\" role=\"region\" aria-label=\"Memory state\">\n <div data-fp=\"memory-label\">Memory State</div>\n <pre data-fp=\"memory-json\">\n <code>{JSON.stringify(memory, null, 2)}</code>\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 role=\"region\"\n aria-label=\"Memory state\"\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 role={group.steps.length > 0 ? \"button\" : undefined}\n tabIndex={group.steps.length > 0 ? 0 : undefined}\n aria-expanded={group.steps.length > 0 ? !collapsedSet.has(group.headerIdx) : undefined}\n aria-label={`Stage ${gi + 1}, ${group.steps.length} steps${gi === lastIdx ? \", current\" : \"\"}`}\n onClick={() => {\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }\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.length > 0 && (\n <div data-fp=\"narrative-future-hint\">\n {futureGroups.length} more {futureGroups.length === 1 ? \"stage\" : \"stages\"} ahead...\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 role={hasSteps ? \"button\" : undefined}\n tabIndex={hasSteps ? 0 : undefined}\n aria-expanded={hasSteps ? !isCollapsed : undefined}\n aria-label={`Stage ${gi + 1}, ${group.steps.length} steps${isLatest ? \", current\" : \", completed\"}`}\n onClick={() => {\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }\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 {/* Future groups — show count hint only, skip full rendering for performance */}\n {futureGroups.length > 0 && (\n <div style={{\n opacity: 0.3,\n fontSize: fs.small,\n color: theme.textMuted,\n padding: `8px ${pad}px`,\n fontStyle: \"italic\",\n }}>\n {futureGroups.length} more {futureGroups.length === 1 ? \"stage\" : \"stages\"} ahead...\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\" role=\"listbox\" aria-label=\"Execution timeline\">\n {snapshots.map((snap, idx) => (\n <div\n key={`${snap.stageName}-${idx}`}\n data-fp=\"gantt-bar\"\n data-selected={idx === selectedIndex}\n data-visible={idx <= selectedIndex}\n role=\"option\"\n aria-selected={idx === selectedIndex}\n aria-label={`${snap.stageLabel}, ${snap.durationMs}ms`}\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 role=\"listbox\"\n aria-label=\"Execution timeline\"\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}-${idx}`}\n ref={isSelected ? activeRowRef : undefined}\n role=\"option\"\n aria-selected={isSelected}\n aria-label={`${snap.stageLabel}, ${snap.durationMs}ms`}\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 title={snap.stageLabel}\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: `color-mix(in srgb, ${theme.success} 10%, transparent)`, fg: theme.success, icon: \"+\" },\n removed: { bg: `color-mix(in srgb, ${theme.error} 10%, transparent)`, fg: theme.error, icon: \"-\" },\n changed: { bg: `color-mix(in srgb, ${theme.warning} 10%, transparent)`, fg: theme.warning, 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 handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowLeft\" && canPrev && !playing) {\n e.preventDefault();\n setPlaying(false);\n onIndexChange(selectedIndex - 1);\n } else if (e.key === \"ArrowRight\" && canNext && !playing) {\n e.preventDefault();\n setPlaying(false);\n onIndexChange(selectedIndex + 1);\n } else if (e.key === \" \" && autoPlayable) {\n e.preventDefault();\n togglePlay();\n }\n },\n [canPrev, canNext, playing, selectedIndex, onIndexChange, autoPlayable, togglePlay]\n );\n\n const fs = fontSize[size];\n\n if (unstyled) {\n return (\n <div\n className={className}\n style={style}\n data-fp=\"time-travel-controls\"\n role=\"toolbar\"\n aria-label=\"Time travel controls\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <button\n data-fp=\"tt-prev\"\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n aria-label=\"Previous stage\"\n >\n Prev\n </button>\n {autoPlayable && (\n <button data-fp=\"tt-play\" onClick={togglePlay} aria-label={playing ? \"Pause\" : \"Play\"}>\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 aria-label=\"Next stage\"\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 role=\"toolbar\"\n aria-label=\"Time travel controls\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <button\n style={btnStyle(!canPrev || playing)}\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n aria-label=\"Previous stage\"\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 aria-label={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 aria-label=\"Next stage\"\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","/**\n * ExplainableShell — Pure orchestrator for explainable pipeline visualization.\n *\n * Collapsible sections use the **line + centered pill** pattern:\n * - Collapsed = thin divider line with a pill button sitting on it\n * - Expanded = full content with a pill at the closing edge\n *\n * Sub-components are memo'd to minimize re-renders when scrubbing the\n * time-travel slider. Only components that depend on snapshotIdx re-render.\n *\n * Consumer controls theme via --fp-* CSS custom properties.\n */\nimport { memo, useState, useCallback, useMemo, useRef, useEffect } from \"react\";\nimport type { StageSnapshot, BaseComponentProps, NarrativeEntry } from \"../../types\";\nimport { theme } from \"../../theme\";\nimport { toVisualizationSnapshots, subflowResultToSnapshots } from \"../../adapters/fromRuntimeSnapshot\";\nimport { ResultPanel } from \"../ResultPanel\";\nimport { GanttTimeline } from \"../GanttTimeline\";\nimport { TimeTravelControls } from \"../TimeTravelControls\";\nimport { MemoryPanel } from \"../MemoryPanel\";\nimport { NarrativePanel } from \"../NarrativePanel\";\nimport { SubflowTree } from \"../FlowchartView/SubflowTree\";\nimport { SubflowBreadcrumb } from \"../FlowchartView/SubflowBreadcrumb\";\nimport { TracedFlowchartView } from \"../FlowchartView/TracedFlowchartView\";\nimport type { SpecNode } from \"../FlowchartView/specToReactFlow\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Tab ID — \"result\", \"memory\", \"narrative\", or any custom recorder view ID. */\nexport type ShellTab = string;\n\n\ninterface SubflowLevel {\n subflowId: string;\n label: string;\n spec: SpecNode;\n snapshots: StageSnapshot[];\n}\n\ninterface DrillDownEntry extends SubflowLevel {\n parentSnapshotIdx: number;\n}\n\nexport interface PanelLabels {\n /** Left panel pill label (subflow tree). Default: \"Topology\" */\n topology?: string;\n /** Right panel pill label (memory/narrative). Default: \"Details\" */\n details?: string;\n /** Bottom panel pill label (timeline). Default: \"Timeline\" */\n timeline?: string;\n}\n\n/** Which panels start expanded. Default: `{ details: true }` (flowchart + memory). */\nexport interface DefaultExpanded {\n topology?: boolean;\n details?: boolean;\n timeline?: boolean;\n}\n\n/**\n * Raw runtime snapshot from FlowChartExecutor.getSnapshot().\n * When provided, ExplainableShell converts it internally — zero boilerplate.\n */\nexport interface RuntimeSnapshotInput {\n sharedState: Record<string, unknown>;\n executionTree: unknown;\n commitLog: unknown[];\n subflowResults?: Record<string, unknown>;\n /** Recorder snapshots from FlowRecorder.toSnapshot() — auto-generates detail tabs. */\n recorders?: Array<{ id: string; name: string; data: unknown }>;\n}\n\n/**\n * A recorder view that appears as a tab in the details panel.\n * Each recorder provides its own per-stage rendering.\n * Memory and Narrative are built-in defaults — add more via this prop.\n */\nexport interface RecorderView {\n /** Unique key for this view tab */\n id: string;\n /** Display label on the tab */\n name: string;\n /**\n * Render function — receives the current snapshot index and all snapshots.\n * Return a React node to display in the details panel.\n */\n render: (props: { snapshots: StageSnapshot[]; selectedIndex: number }) => React.ReactNode;\n}\n\nexport interface ExplainableShellProps extends BaseComponentProps {\n /**\n * Pre-converted visualization snapshots. Use when you've already called\n * toVisualizationSnapshots() yourself.\n */\n snapshots?: StageSnapshot[];\n /**\n * Raw runtime snapshot from executor.getSnapshot(). The shell converts it\n * internally via toVisualizationSnapshots(). When provided, `snapshots`,\n * `resultData`, and `narrative` are derived automatically.\n *\n * Usage: `<ExplainableShell runtimeSnapshot={executor.getSnapshot()} spec={spec} />`\n */\n runtimeSnapshot?: RuntimeSnapshotInput | null;\n spec?: SpecNode | null;\n title?: string;\n resultData?: Record<string, unknown> | null;\n logs?: string[];\n narrative?: string[];\n narrativeEntries?: NarrativeEntry[];\n tabs?: ShellTab[];\n defaultTab?: ShellTab;\n hideConsole?: boolean;\n /** Hide specific detail tabs (e.g., ['result', 'memory']). */\n hideTabs?: string[];\n /** Customize the labels on collapsible panel pills */\n panelLabels?: PanelLabels;\n /** Which panels start expanded. Default: `{ details: true }` */\n defaultExpanded?: DefaultExpanded;\n /**\n * Recorder views — each becomes a tab in the details panel.\n * Default: Memory + Narrative. Pass additional recorder views\n * to show tokens, cost, tools, permissions, or custom data.\n *\n * Usage:\n * recorderViews={[\n * { id: 'tokens', name: 'Tokens', render: ({ selectedIndex }) => <div>...</div> },\n * ]}\n */\n recorderViews?: RecorderView[];\n /**\n * Custom flowchart renderer. When omitted and `spec` is provided,\n * ExplainableShell renders TracedFlowchartView by default.\n */\n renderFlowchart?: (props: {\n spec: SpecNode;\n snapshots: StageSnapshot[];\n selectedIndex: number;\n onNodeClick?: (indexOrId: number | string) => void;\n }) => React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Line + Pill — collapsed state is just a line with a pill centered on it\n// ---------------------------------------------------------------------------\n\n/** Horizontal line with centered pill (for top/bottom edges) */\nconst HLinePill = memo(function HLinePill({\n label,\n detail,\n expanded,\n onClick,\n}: {\n label: string;\n detail?: string;\n expanded: boolean;\n onClick: () => void;\n}) {\n return (\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0,\n padding: \"0\",\n }}>\n <div style={{ flex: 1, height: 1, background: theme.border }} />\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"3px 12px\",\n margin: \"4px 0\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: theme.textMuted,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n transition: \"color 0.15s ease\",\n }}\n >\n <span style={{ fontSize: 7 }}>{expanded ? \"▼\" : \"▶\"}</span>\n {label}\n {detail && <span style={{ fontWeight: 400, opacity: 0.5, fontSize: 9 }}>{detail}</span>}\n </button>\n <div style={{ flex: 1, height: 1, background: theme.border }} />\n </div>\n );\n});\n\n/** Vertical line with centered pill (for left/right edges).\n * `side` controls arrow direction:\n * - \"right\": expanded=▶ collapsed=◀ (panel is on right, collapses right)\n * - \"left\": expanded=◀ collapsed=▶ (panel is on left, collapses left)\n */\nconst VLinePill = memo(function VLinePill({\n label,\n expanded,\n side = \"right\",\n onClick,\n}: {\n label: string;\n expanded: boolean;\n side?: \"left\" | \"right\";\n onClick: () => void;\n}) {\n const arrow = side === \"right\"\n ? (expanded ? \"▶\" : \"◀\")\n : (expanded ? \"◀\" : \"▶\");\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 0,\n padding: \"0\",\n }}>\n <div style={{ flex: 1, width: 1, background: theme.border }} />\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"10px 4px\",\n margin: \"0 3px\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: theme.textMuted,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n writingMode: \"vertical-lr\",\n transition: \"color 0.15s ease\",\n }}\n >\n <span style={{ fontSize: 7, writingMode: \"horizontal-tb\" }}>{arrow}</span>\n {label}\n </button>\n <div style={{ flex: 1, width: 1, background: theme.border }} />\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// DetailsContent — Recorder-driven tab switcher (Memory + Narrative are defaults)\n// ---------------------------------------------------------------------------\n\nconst DetailsContent = memo(function DetailsContent({\n snapshots,\n selectedIndex,\n narrativeEntries,\n narrative,\n size,\n fillHeight,\n extraViews,\n}: {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n narrativeEntries?: NarrativeEntry[];\n narrative?: string[];\n size: \"compact\" | \"default\" | \"detailed\";\n fillHeight?: boolean;\n extraViews?: RecorderView[];\n}) {\n // Built-in views (always available)\n const builtInViews: RecorderView[] = [\n {\n id: \"memory\",\n name: \"Memory\",\n render: ({ snapshots: snaps, selectedIndex: idx }) => (\n <MemoryPanel snapshots={snaps} selectedIndex={idx} size={size} style={fillHeight ? { height: \"100%\" } : undefined} />\n ),\n },\n {\n id: \"narrative\",\n name: \"Narrative\",\n render: ({ snapshots: snaps, selectedIndex: idx }) => (\n <NarrativePanel snapshots={snaps} selectedIndex={idx} narrativeEntries={narrativeEntries} narrative={narrative} size={size} style={fillHeight ? { height: \"100%\" } : undefined} />\n ),\n },\n ];\n\n const allViews = [...builtInViews, ...(extraViews ?? [])];\n const [activeViewId, setActiveViewId] = useState(allViews[0]?.id ?? \"memory\");\n const activeView = allViews.find((v) => v.id === activeViewId) ?? allViews[0];\n\n return (\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n {/* Tab switcher — one per recorder view */}\n <div style={{ display: \"flex\", borderBottom: `1px solid ${theme.border}`, flexShrink: 0, overflowX: \"auto\" }}>\n {allViews.map((view) => {\n const active = view.id === activeViewId;\n return (\n <button\n key={view.id}\n onClick={() => setActiveViewId(view.id)}\n style={{\n flex: allViews.length <= 3 ? 1 : undefined,\n padding: \"6px 8px\", fontSize: 11,\n fontWeight: active ? 600 : 400,\n color: active ? theme.primary : theme.textMuted,\n background: active ? `color-mix(in srgb, ${theme.primary} 8%, transparent)` : \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${theme.primary}` : \"2px solid transparent\",\n cursor: \"pointer\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontFamily: \"inherit\",\n whiteSpace: \"nowrap\",\n }}\n >\n {view.name}\n </button>\n );\n })}\n </div>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {activeView?.render({ snapshots, selectedIndex })}\n </div>\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// Subflow resolution helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveSubflowLevel(\n parentSpec: SpecNode,\n parentSnapshots: StageSnapshot[],\n subflowNodeName: string,\n narrativeEntries?: NarrativeEntry[],\n): SubflowLevel | null {\n const specNode = findSubflowSpecNode(parentSpec, subflowNodeName);\n if (!specNode?.subflowStructure) return null;\n const parentSnap = parentSnapshots.find(\n (s) => s.stageName === subflowNodeName || s.stageLabel === subflowNodeName\n );\n if (!parentSnap?.subflowResult) return null;\n // Extract subflow narrative: prefer subflowId (structured), fall back to display name (text scan)\n const sfId = specNode.subflowId ?? subflowNodeName;\n const sfDisplayName = specNode.subflowName ?? specNode.name;\n const sfNarrative = narrativeEntries\n ? extractSubflowNarrative(narrativeEntries, sfId, sfDisplayName)\n : undefined;\n const sfSnapshots = subflowResultToSnapshots(parentSnap.subflowResult, sfNarrative);\n if (sfSnapshots.length === 0) return null;\n return {\n subflowId: specNode.subflowId ?? subflowNodeName,\n label: specNode.subflowName ?? specNode.name,\n spec: specNode.subflowStructure,\n snapshots: sfSnapshots,\n };\n}\n\nfunction extractSubflowNarrative(entries: NarrativeEntry[], subflowId: string, subflowName?: string): NarrativeEntry[] {\n // Primary: filter by stageName prefix (e.g., \"auth/Validate Token\" starts with \"auth/\")\n // This works reliably even for parallel subflows (no shared stack corruption)\n const prefix = subflowId + \"/\";\n const byPrefix = entries.filter((e) => e.stageName?.startsWith(prefix));\n if (byPrefix.length > 0) return byPrefix;\n\n // Fallback: structured subflowId field (from CombinedNarrativeRecorder stack tagging)\n const byId = entries.filter((e) => (e as any).subflowId === subflowId);\n if (byId.length > 0) return byId;\n\n // Last resort: scan for Entering/Exiting text markers\n const result: NarrativeEntry[] = [];\n const searchName = subflowName ?? subflowId;\n let inside = false;\n for (const entry of entries) {\n if (entry.type === \"subflow\" && entry.text.includes(searchName) && entry.text.startsWith(\"Entering\")) { inside = true; continue; }\n if (inside && entry.type === \"subflow\" && entry.text.includes(searchName) && entry.text.startsWith(\"Exiting\")) break;\n if (inside) result.push(entry);\n }\n return result;\n}\n\nfunction findSubflowSpecNode(node: SpecNode, name: string): SpecNode | null {\n if ((node.name === name || node.id === name) && node.isSubflowRoot) return node;\n if (node.children) { for (const child of node.children) { const f = findSubflowSpecNode(child, name); if (f) return f; } }\n if (node.next) return findSubflowSpecNode(node.next, name);\n return null;\n}\n\nfunction hasSubflowNodes(node: SpecNode): boolean {\n if (!node) return false;\n if (node.isSubflowRoot) return true;\n if (node.children?.some((c) => c && hasSubflowNodes(c))) return true;\n if (node.next && hasSubflowNodes(node.next)) return true;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// Default flowchart renderer — used when renderFlowchart is not provided\nfunction defaultRenderFlowchart({ spec: s, snapshots: snaps, selectedIndex, onNodeClick }: {\n spec: SpecNode; snapshots: StageSnapshot[]; selectedIndex: number;\n onNodeClick?: (indexOrId: number | string) => void;\n}) {\n return (\n <TracedFlowchartView\n spec={s}\n snapshots={snaps}\n snapshotIndex={selectedIndex}\n onNodeClick={onNodeClick}\n />\n );\n}\n\nexport function ExplainableShell({\n snapshots: snapshotsProp,\n runtimeSnapshot,\n spec,\n title,\n resultData: resultDataProp,\n logs = [],\n narrative: narrativeProp,\n narrativeEntries,\n tabs = [\"result\", \"explainable\"],\n defaultTab,\n hideConsole = false,\n hideTabs: hideTabsProp,\n panelLabels,\n defaultExpanded,\n recorderViews,\n renderFlowchart,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ExplainableShellProps) {\n // Convert runtimeSnapshot → visualization snapshots (zero-boilerplate mode)\n const derivedFromRuntime = useMemo(() => {\n if (!runtimeSnapshot) return null;\n try {\n const snaps = toVisualizationSnapshots(runtimeSnapshot as any, narrativeEntries as any);\n const narr: string[] = [];\n for (const snap of snaps) {\n const lines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n narr.push(...lines);\n }\n return { snapshots: snaps, resultData: runtimeSnapshot.sharedState, narrative: narr };\n } catch {\n return null;\n }\n }, [runtimeSnapshot, narrativeEntries]);\n\n // Use derived data when runtimeSnapshot is provided, otherwise use explicit props\n const snapshots = snapshotsProp ?? derivedFromRuntime?.snapshots ?? [];\n const resultData = resultDataProp ?? derivedFromRuntime?.resultData ?? null;\n const narrative = narrativeProp ?? derivedFromRuntime?.narrative;\n\n // Default flowchart renderer when spec is provided\n const effectiveRenderFlowchart = renderFlowchart ?? (spec ? defaultRenderFlowchart : undefined);\n const leftLabel = panelLabels?.topology ?? \"Topology\";\n const rightLabel = panelLabels?.details ?? \"Details\";\n const bottomLabel = panelLabels?.timeline ?? \"Timeline\";\n\n // Responsive: detect narrow container + notify children of size changes\n const shellRef = useRef<HTMLDivElement>(null);\n const [isNarrow, setIsNarrow] = useState(false);\n useEffect(() => {\n const el = shellRef.current;\n if (!el) return;\n const ro = new ResizeObserver(([entry]) => {\n setIsNarrow(entry.contentRect.width < 640);\n // Notify ReactFlow (and other layout-sensitive children) that our container resized\n window.dispatchEvent(new Event(\"resize\"));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // Auto-detect recorder views from runtimeSnapshot.recorders\n const autoRecorderViews = useMemo(() => {\n const recorders = (runtimeSnapshot as any)?.recorders as Array<{ id: string; name: string; data: unknown }> | undefined;\n if (!recorders?.length) return [];\n // Don't auto-generate for IDs that have explicit recorderViews\n const explicitIds = new Set((recorderViews ?? []).map((v) => v.id));\n return recorders\n .filter((r) => !explicitIds.has(r.id))\n .map((r) => ({ id: r.id, name: r.name, data: r.data }));\n }, [runtimeSnapshot, recorderViews]);\n\n // Build tab list: Result + Memory (always), Narrative (when data exists),\n // explicit recorder views, auto-detected recorder views\n const hasNarrative = !!(narrative?.length || narrativeEntries?.length);\n const allTabs = useMemo(() => {\n const tabs: Array<{ id: string; name: string }> = [\n { id: \"result\", name: \"Result\" },\n { id: \"memory\", name: \"Memory\" },\n ];\n if (hasNarrative) {\n tabs.push({ id: \"narrative\", name: \"Narrative\" });\n }\n for (const v of recorderViews ?? []) {\n tabs.push({ id: v.id, name: v.name });\n }\n for (const v of autoRecorderViews) {\n tabs.push({ id: v.id, name: v.name });\n }\n // Filter hidden tabs\n const hideSet = new Set(hideTabsProp ?? []);\n return hideSet.size > 0 ? tabs.filter((t) => !hideSet.has(t.id)) : tabs;\n }, [hasNarrative, recorderViews, autoRecorderViews, hideTabsProp]);\n\n const validTabIds = new Set(allTabs.map((t) => t.id));\n const resolvedDefault = defaultTab && validTabIds.has(defaultTab) ? defaultTab : allTabs[0]?.id ?? \"result\";\n const [activeTab, setActiveTab] = useState<string>(resolvedDefault);\n const [snapshotIdx, setSnapshotIdx] = useState(0);\n const [drillDownStack, setDrillDownStack] = useState<DrillDownEntry[]>([]);\n const [rightExpanded, setRightExpanded] = useState(defaultExpanded?.details ?? true);\n const [leftExpanded, setLeftExpanded] = useState(defaultExpanded?.topology ?? false);\n const [timelineExpanded, setTimelineExpanded] = useState(defaultExpanded?.timeline ?? false);\n\n // Auto-collapse all panels when switching to narrow (mobile)\n useEffect(() => {\n if (isNarrow) {\n setLeftExpanded(false);\n setRightExpanded(false);\n setTimelineExpanded(false);\n }\n }, [isNarrow]);\n\n // Notify ReactFlow (and any ResizeObserver-based children) when panels toggle\n const triggerReflow = useCallback(() => {\n // Fire twice: once immediately for fast response, once after CSS transition ends\n requestAnimationFrame(() => window.dispatchEvent(new Event(\"resize\")));\n setTimeout(() => window.dispatchEvent(new Event(\"resize\")), 320);\n }, []);\n const toggleLeft = useCallback((v: boolean) => { setLeftExpanded(v); triggerReflow(); }, [triggerReflow]);\n const toggleRight = useCallback((v: boolean) => { setRightExpanded(v); triggerReflow(); }, [triggerReflow]);\n const toggleTimeline = useCallback(() => { setTimelineExpanded((p) => !p); triggerReflow(); }, [triggerReflow]);\n\n const isInSubflow = drillDownStack.length > 0;\n\n const currentLevel = useMemo(() => {\n if (drillDownStack.length > 0) {\n const top = drillDownStack[drillDownStack.length - 1];\n return { spec: top.spec, snapshots: top.snapshots };\n }\n return { spec: spec ?? null, snapshots };\n }, [drillDownStack, spec, snapshots]);\n\n const activeSnapshots = currentLevel.snapshots;\n const activeSpec = currentLevel.spec;\n const safeIdx = activeSnapshots.length > 0\n ? Math.max(0, Math.min(snapshotIdx, activeSnapshots.length - 1))\n : 0;\n\n const activeNarrative = useMemo<string[] | undefined>(() => {\n if (!isInSubflow) return narrative;\n const lines: string[] = [];\n for (const snap of activeSnapshots) {\n const stageLines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n lines.push(...stageLines);\n }\n return lines.length > 0 ? lines : undefined;\n }, [isInSubflow, narrative, activeSnapshots]);\n\n const activeNarrativeEntries = isInSubflow ? undefined : narrativeEntries;\n\n const breadcrumbs = useMemo(() => {\n const root = { label: title || \"Flowchart\", spec: spec!, description: spec?.description };\n return [root, ...drillDownStack.map((e) => ({ label: e.label, spec: e.spec, description: undefined as string | undefined }))];\n }, [spec, title, drillDownStack]);\n\n const showTreeSidebar = useMemo(() => !!spec && hasSubflowNodes(spec), [spec]);\n\n const rootOverlay = useMemo(() => {\n if (isInSubflow || !snapshots.length) return { activeStage: undefined, doneStages: undefined };\n const doneStages = new Set(snapshots.slice(0, safeIdx).map((s) => s.stageLabel));\n const activeStage = snapshots[safeIdx]?.stageLabel ?? null;\n return { activeStage, doneStages };\n }, [isInSubflow, snapshots, safeIdx]);\n\n // ── Handlers ──\n const handleTabChange = useCallback((tab: ShellTab) => {\n setActiveTab(tab);\n setDrillDownStack([]);\n }, []);\n\n const handleSnapshotChange = useCallback((idx: number | string) => {\n if (typeof idx === \"number\") setSnapshotIdx(idx);\n }, []);\n\n const handleDrillDown = useCallback(\n (nodeName: string) => {\n if (!activeSpec) return;\n const entry = resolveSubflowLevel(activeSpec, activeSnapshots, nodeName, narrativeEntries);\n if (entry) {\n setDrillDownStack((prev) => [...prev, { ...entry, parentSnapshotIdx: snapshotIdx }]);\n setSnapshotIdx(0);\n }\n },\n [activeSpec, activeSnapshots, narrativeEntries, snapshotIdx]\n );\n\n const handleBreadcrumbNavigate = useCallback((level: number) => {\n setDrillDownStack((prev) => {\n const popped = level === 0 ? prev[0] : prev[level];\n if (popped) setSnapshotIdx(popped.parentSnapshotIdx);\n return level === 0 ? [] : prev.slice(0, level);\n });\n }, []);\n\n const handleNodeClick = useCallback(\n (indexOrId: number | string) => {\n if (typeof indexOrId === \"number\") { setSnapshotIdx(indexOrId); return; }\n if (activeSpec) {\n const sfNode = findSubflowSpecNode(activeSpec, indexOrId);\n if (sfNode?.subflowStructure) { handleDrillDown(indexOrId); return; }\n }\n const idx = activeSnapshots.findIndex((s) => s.stageLabel === indexOrId);\n if (idx >= 0) setSnapshotIdx(idx);\n },\n [activeSpec, activeSnapshots, handleDrillDown]\n );\n\n const handleTreeNodeSelect = useCallback(\n (name: string, isSubflow: boolean) => {\n if (isSubflow && spec) {\n setDrillDownStack([]);\n const entry = resolveSubflowLevel(spec, snapshots, name, narrativeEntries);\n if (entry) { setDrillDownStack([{ ...entry, parentSnapshotIdx: snapshotIdx }]); setSnapshotIdx(0); }\n } else {\n setDrillDownStack([]);\n const idx = snapshots.findIndex((s) => s.stageLabel === name);\n if (idx >= 0) setSnapshotIdx(idx);\n }\n },\n [spec, snapshots, narrativeEntries, snapshotIdx]\n );\n\n // Map tab id → label for rendering\n const tabLabels = new Map(allTabs.map((t) => [t.id, t.name]));\n\n // ── Unstyled mode ──\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"explainable-shell\">\n <div data-fp=\"shell-tabs\">\n {allTabs.map((tab) => (\n <button key={tab.id} data-fp=\"shell-tab\" data-active={tab.id === activeTab} onClick={() => handleTabChange(tab.id)}>{tab.name}</button>\n ))}\n </div>\n <div data-fp=\"shell-content\" data-tab={activeTab}>\n {activeTab === \"result\" && <ResultPanel data={resultData ?? null} logs={logs} hideConsole={hideConsole} unstyled />}\n {(activeTab === \"explainable\" || activeTab === \"ai-compatible\") && (\n <>\n <TimeTravelControls snapshots={activeSnapshots} selectedIndex={safeIdx} onIndexChange={handleSnapshotChange} unstyled />\n {isInSubflow && <SubflowBreadcrumb breadcrumbs={breadcrumbs} onNavigate={handleBreadcrumbNavigate} />}\n {activeSpec && effectiveRenderFlowchart?.({ spec: activeSpec, snapshots: activeSnapshots, selectedIndex: safeIdx, onNodeClick: handleNodeClick })}\n <MemoryPanel snapshots={activeSnapshots} selectedIndex={safeIdx} unstyled />\n <NarrativePanel snapshots={activeSnapshots} selectedIndex={safeIdx} narrativeEntries={activeNarrativeEntries} narrative={activeNarrative} unstyled />\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} unstyled />\n </>\n )}\n </div>\n </div>\n );\n }\n\n // ── Styled mode ──\n\n // Show topology when spec has subflows\n const showTopology = !!effectiveRenderFlowchart && !!activeSpec;\n\n // Render the active details tab content\n const detailsContent = useMemo(() => {\n if (activeTab === \"result\") {\n return <ResultPanel data={resultData ?? null} logs={logs} hideConsole={hideConsole} size={size} />;\n }\n if (activeTab === \"memory\") {\n return <MemoryPanel snapshots={activeSnapshots} selectedIndex={safeIdx} size={size} style={{ height: \"100%\" }} />;\n }\n if (activeTab === \"narrative\") {\n return <NarrativePanel snapshots={activeSnapshots} selectedIndex={safeIdx} narrativeEntries={activeNarrativeEntries} narrative={activeNarrative} size={size} style={{ height: \"100%\" }} />;\n }\n const customView = recorderViews?.find((v) => v.id === activeTab);\n if (customView?.render) {\n return customView.render({ snapshots: activeSnapshots, selectedIndex: safeIdx });\n }\n // Auto-detected recorder view — render as formatted JSON\n const autoView = autoRecorderViews.find((v) => v.id === activeTab);\n if (autoView) {\n return (\n <div style={{ padding: 12, fontFamily: theme.fontMono, fontSize: 11, whiteSpace: \"pre-wrap\", overflow: \"auto\", height: \"100%\" }}>\n {typeof autoView.data === \"string\" ? autoView.data : JSON.stringify(autoView.data, null, 2)}\n </div>\n );\n }\n return null;\n }, [activeTab, resultData, logs, hideConsole, size, activeSnapshots, safeIdx, activeNarrativeEntries, activeNarrative, recorderViews, autoRecorderViews]);\n\n // Details panel with internal tabs\n const detailsPanel = (\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", overflow: \"hidden\" }}>\n {/* Tab bar inside details panel */}\n <div style={{\n display: \"flex\",\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n overflowX: \"auto\",\n }}>\n {allTabs.map((tab) => {\n const active = tab.id === activeTab;\n return (\n <button\n key={tab.id}\n onClick={() => handleTabChange(tab.id as ShellTab)}\n style={{\n padding: \"6px 14px\",\n fontSize: 11,\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 fontFamily: \"inherit\",\n whiteSpace: \"nowrap\",\n }}\n >\n {tab.name}\n </button>\n );\n })}\n </div>\n {/* Tab content */}\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {detailsContent}\n </div>\n </div>\n );\n\n return (\n <div\n ref={shellRef}\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 fontSize: 12,\n ...style,\n }}\n data-fp=\"explainable-shell\"\n >\n {/* Time-travel slider */}\n <TimeTravelControls\n snapshots={activeSnapshots}\n selectedIndex={safeIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n\n {/* Breadcrumb */}\n {isInSubflow && (\n <SubflowBreadcrumb breadcrumbs={breadcrumbs} onNavigate={handleBreadcrumbNavigate} />\n )}\n\n {/* Content */}\n <div style={{ flex: 1, overflow: isNarrow ? \"auto\" : \"hidden\", display: \"flex\", flexDirection: \"column\" }}>\n {isNarrow ? (\n /* ── Mobile: stacked vertical ── */\n <>\n {/* Flowchart — only when topology is relevant */}\n {showTopology && (\n <div style={{ height: 350, flexShrink: 0, overflow: \"hidden\" }}>\n {effectiveRenderFlowchart!({\n spec: activeSpec!,\n snapshots: activeSnapshots,\n selectedIndex: safeIdx,\n onNodeClick: handleNodeClick,\n })}\n </div>\n )}\n\n {/* Topology (subflow tree) — collapsible */}\n {showTreeSidebar && (\n <>\n <HLinePill label={leftLabel} expanded={leftExpanded} onClick={() => toggleLeft(!leftExpanded)} />\n {leftExpanded && (\n <div style={{ maxHeight: 180, overflow: \"auto\", flexShrink: 0 }}>\n <SubflowTree\n spec={spec!}\n activeStage={rootOverlay.activeStage}\n doneStages={rootOverlay.doneStages}\n onNodeSelect={handleTreeNodeSelect}\n />\n </div>\n )}\n </>\n )}\n\n {/* Details panel with tabs */}\n <HLinePill label={rightLabel} expanded={rightExpanded} onClick={() => toggleRight(!rightExpanded)} />\n {rightExpanded && (\n <div style={{ maxHeight: 350, flexShrink: 0, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n )}\n\n {/* Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n ) : showTopology ? (\n /* ── Desktop with topology: side-by-side ── */\n <>\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n\n {/* Left: SubflowTree with VLinePill handle — only when spec has subflows */}\n {showTreeSidebar && (\n leftExpanded ? (\n <div style={{ width: 220, flexShrink: 0, display: \"flex\", flexDirection: \"row\", overflow: \"hidden\" }}>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n <SubflowTree\n spec={spec!}\n activeStage={rootOverlay.activeStage}\n doneStages={rootOverlay.doneStages}\n onNodeSelect={handleTreeNodeSelect}\n />\n </div>\n <VLinePill label={leftLabel} expanded={true} side=\"left\" onClick={() => toggleLeft(false)} />\n </div>\n ) : (\n <VLinePill label={leftLabel} expanded={false} side=\"left\" onClick={() => toggleLeft(true)} />\n )\n )}\n\n {/* Center: Flowchart */}\n <div style={{ flex: 1, overflow: \"hidden\", minWidth: 0 }}>\n {effectiveRenderFlowchart!({\n spec: activeSpec!,\n snapshots: activeSnapshots,\n selectedIndex: safeIdx,\n onNodeClick: handleNodeClick,\n })}\n </div>\n\n {/* Right: Details panel with tabs */}\n {rightExpanded ? (\n <div style={{ width: \"38%\", minWidth: 300, maxWidth: 500, display: \"flex\", flexDirection: \"row\", overflow: \"hidden\" }}>\n <VLinePill label={rightLabel} expanded={true} onClick={() => toggleRight(false)} />\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n </div>\n ) : (\n <VLinePill label={rightLabel} expanded={false} onClick={() => toggleRight(true)} />\n )}\n </div>\n\n {/* Bottom: Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n ) : (\n /* ── Desktop without topology: details panel takes full width ── */\n <>\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n\n {/* Bottom: Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { StageSnapshot, NarrativeEntry } 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 RecorderSnapshot {\n id: string;\n name: string;\n data: unknown;\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 /** Snapshots from recorders that implement toSnapshot() (e.g. MetricRecorder). */\n recorders?: RecorderSnapshot[];\n}\n\n// NarrativeEntry: canonical definition lives in types.ts.\n// Re-export here for backward compatibility (index.ts re-exports as AdapterNarrativeEntry).\nexport type { NarrativeEntry } from '../types';\n\n/**\n * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots\n * suitable for visualization components.\n *\n * The `narrativeEntries` parameter (from `executor.getNarrativeEntries()`)\n * distributes the library's rich combined narrative per-stage.\n * When narrative is not enabled, stages get \"Narrative not available\" —\n * this adapter reflects what the library produces, nothing more.\n *\n * Usage:\n * ```ts\n * const executor = new FlowChartExecutor(chart);\n * await executor.run();\n * const snapshots = toVisualizationSnapshots(\n * executor.getSnapshot(),\n * executor.getNarrativeEntries(),\n * );\n * ```\n */\nexport function toVisualizationSnapshots(\n runtime: RuntimeSnapshot,\n narrativeEntries?: NarrativeEntry[],\n): StageSnapshot[] {\n const stageNarrativeMap = narrativeEntries?.length\n ? buildStageNarrativeMap(narrativeEntries)\n : new Map<string, string[]>();\n\n // Extract per-stage timings from MetricRecorder if present in snapshot.recorders.\n const stageTimings = extractStageTimings(runtime.recorders);\n\n const snapshots: StageSnapshot[] = [];\n flattenTree(runtime.executionTree, snapshots, runtime.sharedState, 0, runtime.subflowResults, {}, stageNarrativeMap, stageTimings);\n return snapshots;\n}\n\n/**\n * Extracts per-stage duration data from recorder snapshots.\n * MetricRecorder serializes as { name: 'Metrics', data: { stages: { [stageName]: { totalDuration } } } }.\n */\nfunction extractStageTimings(recorders?: RecorderSnapshot[]): Map<string, number> {\n const timings = new Map<string, number>();\n if (!recorders) return timings;\n for (const rec of recorders) {\n if (rec.name === 'Metrics' && rec.data && typeof rec.data === 'object') {\n const data = rec.data as { stages?: Record<string, { totalDuration?: number }> };\n if (data.stages) {\n for (const [stageName, metrics] of Object.entries(data.stages)) {\n if (typeof metrics.totalDuration === 'number' && metrics.totalDuration > 0) {\n timings.set(stageName, Math.round(metrics.totalDuration));\n }\n }\n }\n }\n }\n return timings;\n}\n\n/**\n * Groups narrative entries by stage name, preserving non-stage entries\n * (conditions, forks) attached to the preceding stage.\n */\nfunction buildStageNarrativeMap(entries: NarrativeEntry[]): Map<string, string[]> {\n const map = new Map<string, string[]>();\n let currentStageName: string | undefined;\n\n for (const entry of entries) {\n if (entry.stageName) {\n currentStageName = entry.stageName;\n }\n\n if (currentStageName) {\n if (!map.has(currentStageName)) {\n map.set(currentStageName, []);\n }\n const indent = ' '.repeat(entry.depth);\n map.get(currentStageName)!.push(`${indent}${entry.text}`);\n }\n }\n\n\n return map;\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 stageNarrativeMap: Map<string, string[]> = new Map(),\n stageTimings: Map<string, number> = new Map(),\n): number {\n // Prefer MetricRecorder timing (real wall-clock), then scope.$metric('durationMs'), then 0.\n const stageName = node.name ?? node.id;\n const durationMs =\n (stageName ? stageTimings.get(stageName) : undefined) ??\n (typeof node.metrics?.durationMs === \"number\" ? node.metrics.durationMs : 0);\n\n const startMs = accumulatedMs;\n // Use id for matching (stable, matches spec node ids).\n // name may carry display prefixes like \"[service-name] STAGE\".\n const stageId = node.id || node.name || 'unknown';\n const displayName = node.name || node.id || 'unknown';\n\n // Narrative comes from the library. When not available (e.g. subflow internals\n // where the root recorder only captures enter/exit markers), build a basic\n // narrative from the stage name, description, and data operations.\n // Try id first, then name — narrative entries use node.name (may be prefixed)\n // while snapshot uses node.id (stable). Both need to match for subflows.\n const stageLines = stageNarrativeMap.get(stageId) ?? stageNarrativeMap.get(displayName);\n let narrative: string;\n if (stageLines) {\n narrative = stageLines.join('\\n');\n } else {\n const parts: string[] = [`${displayName} executed.`];\n if (node.description) parts.push(node.description);\n if (node.stageWrites) {\n const keys = Object.keys(node.stageWrites);\n if (keys.length > 0) parts.push(`Wrote: ${keys.join(', ')}`);\n }\n narrative = parts.join('\\n');\n }\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 const sfResult = subflowResults?.[node.subflowId ?? stageId];\n\n out.push({\n stageName: displayName,\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, stageNarrativeMap, stageTimings);\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, stageNarrativeMap, stageTimings);\n }\n\n return nextMs;\n}\n\n/**\n * Converts a footprintjs SubflowResult (stored on StageSnapshot.subflowResult)\n * into visualization snapshots for drill-down views.\n *\n * SubflowResult shape (from footprintjs):\n * { subflowId, subflowName, treeContext: { globalContext, stageContexts, history }, parentStageId }\n *\n * Returns empty array if the input is not a valid SubflowResult.\n */\nexport function subflowResultToSnapshots(\n subflowResult: unknown,\n narrativeEntries?: NarrativeEntry[],\n): StageSnapshot[] {\n if (!subflowResult || typeof subflowResult !== 'object') return [];\n const sf = subflowResult as {\n subflowId?: string;\n treeContext?: {\n globalContext?: Record<string, unknown>;\n stageContexts?: unknown;\n history?: unknown[];\n };\n };\n if (!sf.treeContext?.stageContexts) return [];\n\n const runtime: RuntimeSnapshot = {\n sharedState: sf.treeContext.globalContext ?? {},\n executionTree: sf.treeContext.stageContexts as RuntimeStageSnapshot,\n commitLog: sf.treeContext.history ?? [],\n };\n\n const snapshots = toVisualizationSnapshots(runtime, narrativeEntries);\n\n // Strip subflow prefix from stage names so they match the spec node names.\n // Runtime names are prefixed (e.g., \"analyze/SeedScope\") but spec nodes\n // use unprefixed names (e.g., \"SeedScope\").\n const prefix = sf.subflowId ? `${sf.subflowId}/` : '';\n if (prefix) {\n for (const snap of snapshots) {\n if (snap.stageName.startsWith(prefix)) {\n snap.stageName = snap.stageName.slice(prefix.length);\n }\n if (snap.stageLabel.startsWith(prefix)) {\n snap.stageLabel = snap.stageLabel.slice(prefix.length);\n }\n }\n }\n\n return snapshots;\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","/**\n * MemoryPanel — Commit-history based view of pipeline state.\n *\n * Shows accumulated memory at the selected snapshot + what changed.\n * Data source: Scope Recorder (transactional state from SharedMemory).\n *\n * This is a thin composition of MemoryInspector + ScopeDiff — no logic\n * of its own, just correct data derivation from snapshots + index.\n */\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme } from \"../../theme\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { ScopeDiff } from \"../ScopeDiff\";\n\nexport interface MemoryPanelProps extends BaseComponentProps {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n}\n\nexport function MemoryPanel({\n snapshots,\n selectedIndex,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: MemoryPanelProps) {\n const prevMemory = selectedIndex > 0\n ? snapshots[selectedIndex - 1]?.memory ?? null\n : null;\n const currMemory = snapshots[selectedIndex]?.memory ?? {};\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"memory-panel\">\n <MemoryInspector snapshots={snapshots} selectedIndex={selectedIndex} unstyled />\n <ScopeDiff previous={prevMemory} current={currMemory} unstyled />\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n data-fp=\"memory-panel\"\n >\n <MemoryInspector snapshots={snapshots} selectedIndex={selectedIndex} size={size} />\n <div style={{ borderTop: `1px solid ${theme.border}` }}>\n <ScopeDiff previous={prevMemory} current={currMemory} hideUnchanged size={size} />\n </div>\n </div>\n );\n}\n","/**\n * NarrativePanel — Recorder-based view of pipeline execution.\n *\n * Renders the execution narrative with progressive reveal synced to\n * snapshot index. Prefers structured NarrativeEntries (from\n * CombinedNarrativeRecorder) when available, falls back to plain\n * narrative lines built from per-stage snapshot.narrative fields.\n *\n * Data source: FlowRecorder (fires AFTER stage execution)\n */\nimport { useMemo, useState, useCallback } from \"react\";\nimport type { StageSnapshot, NarrativeEntry, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { StoryNarrative } from \"../StoryNarrative\";\nimport { NarrativeTrace } from \"../NarrativeTrace\";\n\nexport interface NarrativePanelProps extends BaseComponentProps {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n /** Structured narrative entries (preferred — richer rendering) */\n narrativeEntries?: NarrativeEntry[];\n /** Plain narrative lines (fallback) */\n narrative?: string[];\n}\n\nexport function NarrativePanel({\n snapshots,\n selectedIndex,\n narrativeEntries,\n narrative: narrativeProp,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativePanelProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n // Build plain narrative from snapshots if not provided\n const narrative = useMemo<string[]>(() => {\n if (narrativeProp && narrativeProp.length > 0) return narrativeProp;\n const lines: string[] = [];\n for (const snap of snapshots) {\n const stageLines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n lines.push(...stageLines);\n }\n return lines;\n }, [narrativeProp, snapshots]);\n\n // Progressive reveal for plain narrative\n const revealedCount = useMemo(() => {\n if (snapshots.length === 0 || narrative.length === 0) return narrative.length;\n const stageBoundaries: number[] = [];\n for (let i = 0; i < narrative.length; i++) {\n const trimmed = narrative[i].trimStart();\n if (trimmed.startsWith(\"Stage \") && !trimmed.match(/^Stage\\s+\\d+:\\s*Step\\s/)) {\n stageBoundaries.push(i);\n }\n }\n if (stageBoundaries.length === 0) {\n const ratio = (selectedIndex + 1) / snapshots.length;\n return Math.max(1, Math.ceil(narrative.length * ratio));\n }\n const groupsToShow = Math.min(selectedIndex + 1, stageBoundaries.length);\n const endIdx = groupsToShow < stageBoundaries.length\n ? stageBoundaries[groupsToShow]\n : narrative.length;\n return Math.max(1, endIdx);\n }, [snapshots.length, selectedIndex, narrative]);\n\n // Position-based sync: for each snapshot, find the range of entries that belong\n // to it by matching snapshot stageLabel/stageName against entry stageId/stageName.\n // Handles loops (same stageId at different positions) correctly because we walk\n // entries sequentially and consume matches in order.\n const revealedEntryCount = useMemo(() => {\n if (!narrativeEntries?.length || snapshots.length === 0) return 0;\n\n // For each snapshot up to selectedIndex, find entries that belong to it.\n // Walk entries sequentially — each entry is consumed once.\n let entryIdx = 0;\n for (let si = 0; si <= selectedIndex && si < snapshots.length; si++) {\n const snap = snapshots[si];\n const keys = new Set<string>();\n if (snap.stageLabel) keys.add(snap.stageLabel);\n if (snap.stageName) keys.add(snap.stageName);\n if (snap.subflowId) keys.add(snap.subflowId);\n\n // Advance past entries that match this snapshot's keys\n // First, find the start of this snapshot's entries\n let found = false;\n for (let j = entryIdx; j < narrativeEntries.length; j++) {\n const e = narrativeEntries[j] as { stageId?: string; subflowId?: string; stageName?: string };\n const eKey = e.stageId ?? e.subflowId ?? e.stageName;\n if (eKey && keys.has(eKey)) {\n found = true;\n entryIdx = j;\n break;\n }\n // Entries with no key belong to previous snapshot — include them\n if (!eKey && !found) {\n // Keep advancing\n }\n }\n\n if (!found) continue;\n\n // Now consume all consecutive entries that belong to this snapshot\n while (entryIdx < narrativeEntries.length) {\n const e = narrativeEntries[entryIdx] as { stageId?: string; subflowId?: string; stageName?: string };\n const eKey = e.stageId ?? e.subflowId ?? e.stageName;\n if (eKey && !keys.has(eKey)) break; // next snapshot's entry\n entryIdx++;\n }\n }\n return entryIdx;\n }, [narrativeEntries, snapshots, selectedIndex]);\n\n const hasStructured = narrativeEntries && narrativeEntries.length > 0;\n\n // ── Copy as LLM-ready text ─────────────────────────────────────────────\n const [copied, setCopied] = useState(false);\n\n const buildLLMNarrative = useCallback(() => {\n if (!narrativeEntries?.length) {\n return narrative.join(\"\\n\");\n }\n\n // ── Partition entries: root vs subflow internals ─────────────────\n // Root includes: stages, subflow entry/exit markers, decisions, loops, breaks\n // Subflow internals: entries with subflowId that aren't entry/exit markers\n const root: NarrativeEntry[] = [];\n const subflows = new Map<string, NarrativeEntry[]>();\n const subflowNames = new Map<string, string>(); // sfId → display name\n\n for (const entry of narrativeEntries) {\n const sfId = (entry as { subflowId?: string }).subflowId;\n if (!sfId) {\n root.push(entry);\n } else {\n // Subflow ENTRY markers go in root (show WHEN the subflow ran).\n // Exit markers (\"Done: X\") are noise — the next stage implies completion.\n if (entry.type === \"subflow\") {\n const isExit = entry.text.startsWith(\"Done:\") || entry.text.startsWith(\"Exiting\");\n if (!isExit) {\n root.push(entry);\n }\n // Track name for the subflow details header\n if (entry.stageName && !isExit) {\n subflowNames.set(sfId, entry.stageName);\n }\n } else {\n // Internal subflow entries go in the subflow detail section\n if (!subflows.has(sfId)) subflows.set(sfId, []);\n subflows.get(sfId)!.push(entry);\n }\n }\n }\n\n // ── Render a list of entries as numbered text ────────────────────\n // Uses only entry.text (already rendered by the NarrativeRenderer).\n // No type prefix — the renderer output IS the narrative.\n const renderEntries = (entries: NarrativeEntry[], opts?: { inSubflow?: string }): string => {\n let counter = 0;\n const lines: string[] = [];\n\n for (const e of entries) {\n // Skip subflow entry/exit in subflow details (redundant — we're already in the section)\n if (opts?.inSubflow && e.type === \"subflow\") continue;\n\n let text = e.text;\n\n // Strip subflow path prefix from stage names inside subflow details.\n // e.g., \"[sf-system-prompt/ResolvePrompt]\" → \"[ResolvePrompt]\"\n // The section header already identifies the subflow.\n if (opts?.inSubflow) {\n text = text.replace(new RegExp(`\\\\[${opts.inSubflow}/`), \"[\");\n }\n\n const isHeading = e.type === \"stage\" || e.type === \"subflow\" || e.type === \"fork\" || e.type === \"selector\";\n\n if (isHeading) {\n counter++;\n // For subflow markers in root, append the subflow ID for drill-down\n const sfId = (e as { subflowId?: string }).subflowId;\n const idSuffix = e.type === \"subflow\" && sfId ? ` [→ ${sfId}]` : \"\";\n lines.push(`${counter}. ${text}${idSuffix}`);\n } else {\n // Sub-items (steps, conditions, loops, breaks, errors) — indented\n lines.push(` ${text}`);\n }\n }\n\n return lines.join(\"\\n\");\n };\n\n // ── Assemble the full LLM-ready document ────────────────────────\n const sections: string[] = [];\n sections.push(\"## Execution Narrative\\n\");\n sections.push(renderEntries(root));\n\n if (subflows.size > 0) {\n sections.push(\"\\n\\n## Subflow Details\");\n sections.push(\"Use the subflow IDs above to look up details below.\\n\");\n for (const [sfId, entries] of subflows) {\n const name = subflowNames.get(sfId) ?? sfId;\n sections.push(`### ${name} (${sfId})\\n`);\n sections.push(renderEntries(entries, { inSubflow: sfId }));\n sections.push(\"\");\n }\n }\n\n return sections.join(\"\\n\");\n }, [narrativeEntries, narrative]);\n\n const handleCopy = useCallback(async () => {\n const text = buildLLMNarrative();\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [buildLLMNarrative]);\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-panel\">\n {hasStructured ? (\n <StoryNarrative entries={narrativeEntries!} revealedEntryCount={revealedEntryCount} unstyled />\n ) : (\n <NarrativeTrace narrative={narrative} revealedCount={revealedCount} unstyled />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n data-fp=\"narrative-panel\"\n >\n {/* Intro + Copy button */}\n <div\n style={{\n padding: `${pad - 4}px ${pad}px`,\n fontSize: fs.small,\n color: theme.textMuted,\n borderBottom: `1px solid ${theme.border}`,\n flexShrink: 0,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span style={{ fontStyle: \"italic\" }}>\n What happened at each stage, what data flowed, what decisions were made, and why.\n </span>\n <button\n onClick={handleCopy}\n title=\"Copy narrative as LLM-ready text (includes subflow details)\"\n style={{\n background: copied ? theme.success : theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 4,\n padding: \"2px 8px\",\n fontSize: fs.small,\n color: copied ? \"#fff\" : theme.textSecondary,\n cursor: \"pointer\",\n flexShrink: 0,\n marginLeft: 8,\n transition: \"all 0.2s\",\n }}\n >\n {copied ? \"Copied!\" : \"Copy for LLM\"}\n </button>\n </div>\n {hasStructured ? (\n <StoryNarrative\n entries={narrativeEntries!}\n revealedEntryCount={revealedEntryCount}\n size={size}\n style={{ flex: 1 }}\n />\n ) : (\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n size={size}\n style={{ flex: 1 }}\n />\n )}\n </div>\n );\n}\n","/**\n * StoryNarrative — Rich rendering of structured narrative entries.\n *\n * Recorder-based view: renders CombinedNarrativeRecorder output with\n * progressive reveal synced to snapshot index. Each entry is typed\n * (stage, step, condition, fork, subflow, loop, break, error) and\n * rendered with appropriate icon + indentation.\n *\n * Data source: FlowRecorder (fires AFTER stage execution)\n */\nimport { useMemo, useRef, useEffect } from \"react\";\nimport type { NarrativeEntry, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface StoryNarrativeProps extends BaseComponentProps {\n /** Structured narrative entries from CombinedNarrativeRecorder */\n entries: NarrativeEntry[];\n /** Number of entries to reveal (position-based sync from NarrativePanel) */\n revealedEntryCount: number;\n}\n\nconst ENTRY_ICONS: Record<string, { icon: string; color: string; label: string }> = {\n stage: { icon: \"▸\", color: theme.primary, label: \"Stage\" },\n step: { icon: \"·\", color: theme.textMuted, label: \"Data operation\" },\n condition: { icon: \"◇\", color: theme.warning, label: \"Decision\" },\n fork: { icon: \"⑃\", color: theme.primary, label: \"Parallel\" },\n selector: { icon: \"⑃\", color: theme.primary, label: \"Selector\" },\n subflow: { icon: \"↳\", color: theme.textSecondary, label: \"Subflow\" },\n loop: { icon: \"↻\", color: theme.warning, label: \"Loop\" },\n break: { icon: \"■\", color: theme.error, label: \"Break\" },\n error: { icon: \"✗\", color: theme.error, label: \"Error\" },\n};\n\nexport function StoryNarrative({\n entries,\n revealedEntryCount,\n size = \"default\",\n unstyled = false,\n className,\n style: outerStyle,\n}: StoryNarrativeProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n // Position-based reveal: NarrativePanel computes the cut point based on\n // section boundaries (stage entries). This handles loops (same stageId,\n // different iterations) and subflow repeats correctly.\n const revealedCount = revealedEntryCount;\n\n // Filter revealed entries: show root-level entries + subflow Entering/Exiting markers.\n // Subflow internal entries (stage, step, condition inside a subflow) are hidden —\n // they appear in the drill-down view.\n const revealed = useMemo(() => {\n const raw = entries.slice(0, revealedCount);\n return raw.filter((e) => {\n const sfId = (e as { subflowId?: string }).subflowId;\n if (!sfId) return true; // root-level — always show\n if (e.type === \"subflow\") return true; // Entering/Exiting markers — show\n return false; // internal subflow entries — hide (drill-down only)\n });\n }, [entries, revealedCount]);\n // Future count: only count entries that would actually be shown (same filter as revealed)\n const futureCount = useMemo(() => {\n let count = 0;\n for (let i = revealedCount; i < entries.length; i++) {\n const e = entries[i] as { subflowId?: string };\n if (!e.subflowId || entries[i].type === \"subflow\") count++;\n }\n return count;\n }, [entries, revealedCount]);\n\n const latestRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n latestRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [revealed.length]);\n\n // Compute heading numbers for each revealed entry.\n // Flat sequential counter matching flowchart traversal (DFS visit order):\n // 1. [Stage: Seed] ...\n // 2. [Subflow: SystemPrompt] ...\n // 3. [Subflow: Messages] ...\n // 4. [Stage: ApplyPreparedMessages] ...\n //\n // Counter increments on: stage, subflow entry, condition, first fork in sequence.\n // No counter on: step, subflow exit, loop, break, error, subsequent forks.\n const numberedEntries = useMemo(() => {\n let counter = 0;\n // Track subflow enter/exit: first occurrence of type=subflow per stageId = enter, second = exit.\n const subflowSeen = new Set<string>();\n let prevType = \"\";\n\n return revealed.map((entry) => {\n // Strip legacy \"Stage N: \" prefix from text (default renderer)\n let cleanText = entry.text;\n cleanText = cleanText.replace(/^Stage \\d+:\\s*/, \"\");\n // Detect fork type BEFORE stripping prefix\n const isSelector = entry.type === \"fork\" && entry.text.includes(\"[Selected]\");\n cleanText = cleanText.replace(/^\\[(Selected|Parallel)\\]:\\s*/, \"\");\n\n // ── Subflow: detect enter vs exit by toggle ──\n if (entry.type === \"subflow\") {\n // Use stageId as toggle key (unique per subflow visit).\n // Fall back to text for renderers that don't set stageId.\n const toggleKey = (entry as { stageId?: string }).stageId ?? entry.text;\n const isExit = subflowSeen.has(toggleKey);\n if (!isExit) {\n subflowSeen.add(toggleKey);\n counter++;\n return {\n ...entry,\n heading: `${counter}`,\n headingType: \"Subflow\",\n text: cleanText,\n isHeading: true,\n isSubflow: true,\n };\n }\n // Exit marker — no heading, will be hidden in render\n return { ...entry, heading: null, isHeading: false, isSubflowExit: true };\n }\n\n // ── Stage ──\n if (entry.type === \"stage\") {\n counter++;\n return { ...entry, heading: `${counter}`, headingType: \"Stage\", text: cleanText, isHeading: true };\n }\n\n // ── Condition (decision) — nested under the preceding stage, no separate number ──\n if (entry.type === \"condition\") {\n return { ...entry, heading: null, headingType: \"Decision\", text: cleanText, isHeading: false };\n }\n\n // ── Fork / Selector — first in sequence gets number ──\n if (entry.type === \"fork\" || entry.type === \"selector\") {\n const isForkHeading = prevType !== \"fork\" && prevType !== \"selector\";\n prevType = entry.type;\n if (isForkHeading) {\n counter++;\n const typeLabel = entry.type === \"selector\" || isSelector ? \"Selector\" : \"Fork\";\n return { ...entry, heading: `${counter}`, headingType: typeLabel, text: cleanText, isHeading: true };\n }\n return { ...entry, heading: null, isHeading: false, text: cleanText };\n }\n\n prevType = entry.type;\n // loop, break, step, error — no heading number\n // Loop is a back-edge (not a new node), break is termination signal\n return { ...entry, heading: null, isHeading: false };\n });\n }, [revealed]);\n\n if (unstyled) {\n return (\n <div className={className} style={outerStyle} data-fp=\"story-narrative\" role=\"log\">\n {numberedEntries.map((entry, i) => {\n if ((entry as any).isSubflowExit) return null;\n const ht = (entry as any).headingType;\n return (\n <div key={i} data-fp=\"narrative-entry\" data-type={entry.type}>\n {entry.heading\n ? entry.text.startsWith('[')\n ? `${entry.heading}. ${entry.text}`\n : `${entry.heading}. [${ht}: ${entry.stageName ?? ''}] ${entry.text}`\n : entry.text}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n flex: 1,\n overflow: \"auto\",\n padding: pad,\n fontFamily: theme.fontSans,\n ...outerStyle,\n }}\n data-fp=\"story-narrative\"\n role=\"log\"\n aria-label=\"Execution narrative\"\n >\n {numberedEntries.map((entry, i) => {\n // Skip subflow exit markers — entry marker is enough\n if ((entry as any).isSubflowExit) return null;\n\n const meta = ENTRY_ICONS[entry.type] ?? ENTRY_ICONS.step;\n const isHeading = entry.isHeading;\n const isDecision = entry.type === \"condition\";\n const isError = entry.type === \"error\";\n const isBreak = entry.type === \"break\";\n const isSubflow = (entry as any).isSubflow;\n const isLast = i === numberedEntries.length - 1;\n const headingType = (entry as any).headingType as string | undefined;\n\n return (\n <div\n key={i}\n ref={isLast ? latestRef : undefined}\n style={{\n display: \"flex\",\n gap: 8,\n padding: isHeading ? `${pad - 4}px 0` : `2px 0`,\n marginLeft: entry.depth * 16,\n borderBottom: isHeading ? `1px solid ${theme.border}` : undefined,\n marginTop: isHeading && i > 0 ? 8 : 0,\n }}\n >\n <span\n style={{\n color: meta.color,\n fontWeight: 700,\n fontSize: isHeading ? fs.body : fs.small,\n width: 16,\n textAlign: \"center\",\n flexShrink: 0,\n }}\n title={meta.label}\n aria-label={meta.label}\n >\n {meta.icon}\n </span>\n <span\n style={{\n fontSize: isHeading ? fs.body : fs.small,\n fontWeight: isHeading ? 600 : 400,\n color: isError || isBreak\n ? theme.error\n : isDecision\n ? theme.warning\n : isHeading\n ? theme.textPrimary\n : theme.textSecondary,\n lineHeight: 1.6,\n fontFamily: entry.type === \"step\" ? theme.fontMono : theme.fontSans,\n }}\n >\n {entry.heading && headingType ? (\n entry.text.startsWith('[') ? (\n <>\n <strong>{entry.heading}.</strong>\n {' '}{entry.text}\n </>\n ) : (\n <>\n <strong>{entry.heading}. [{headingType}{entry.stageName ? `: ${entry.stageName}` : ''}]</strong>\n {' '}{entry.text}\n </>\n )\n ) : entry.text}\n </span>\n </div>\n );\n })}\n\n {/* Future entries — show count hint only, skip full rendering for performance */}\n {futureCount > 0 && (\n <div style={{\n opacity: 0.3,\n fontSize: fs.small,\n color: theme.textMuted,\n padding: `8px 0`,\n fontStyle: \"italic\",\n }}>\n {futureCount} more {futureCount === 1 ? \"entry\" : \"entries\"} ahead...\n </div>\n )}\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 if (!node) return [];\n\n const entries: SubflowTreeEntry[] = [];\n const seen = new Set<string>();\n\n function walk(n: SpecNode) {\n if (!n) return;\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 if (child) 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.subflowId ?? `${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 // Only show subflow entries — the flowchart view handles main stages\n const subflowStages = useMemo(() => tree.filter((e) => e.isSubflow), [tree]);\n\n // Don't render anything if there are no subflows\n if (subflowStages.length === 0) return null;\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>Subflows</SectionLabel>}\n {subflowStages.map((entry, i) => (\n <TreeNode\n key={entry.subflowId ?? `${entry.name}-${i}`}\n entry={entry}\n depth={0}\n activeStage={activeStage}\n doneStages={doneStages}\n onNodeSelect={onNodeSelect}\n />\n ))}\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { theme } from \"../../theme\";\nimport type { BreadcrumbEntry } from \"./useSubflowNavigation\";\n\nexport interface SubflowBreadcrumbProps {\n breadcrumbs: BreadcrumbEntry[];\n onNavigate: (level: number) => void;\n}\n\n/**\n * Breadcrumb bar for subflow drill-down navigation.\n * Shows: Root > SubflowA > SubflowB — clicking any crumb navigates back.\n */\nexport const SubflowBreadcrumb = memo(function SubflowBreadcrumb({\n breadcrumbs,\n onNavigate,\n}: SubflowBreadcrumbProps) {\n if (breadcrumbs.length <= 1) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"6px 12px\",\n background: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n fontSize: 12,\n fontFamily: theme.fontSans,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {breadcrumbs.map((crumb, i) => {\n const isLast = i === breadcrumbs.length - 1;\n return (\n <span key={`${crumb.label}-${i}`} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {i > 0 && (\n <span style={{ color: theme.textMuted, fontSize: 10 }}>\n ›\n </span>\n )}\n {isLast ? (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span\n style={{\n color: theme.primary,\n fontWeight: 600,\n }}\n >\n {crumb.label}\n </span>\n {crumb.description && (\n <span\n style={{\n color: theme.textMuted,\n fontWeight: 400,\n fontSize: 11,\n }}\n >\n — {crumb.description}\n </span>\n )}\n </span>\n ) : (\n <button\n onClick={() => onNavigate(i)}\n style={{\n background: \"none\",\n border: \"none\",\n color: theme.textSecondary,\n cursor: \"pointer\",\n padding: \"2px 4px\",\n borderRadius: 4,\n fontSize: 12,\n fontFamily: \"inherit\",\n fontWeight: 500,\n transition: \"color 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = `${theme.primary}`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = `${theme.textSecondary}`;\n }}\n >\n {crumb.label}\n </button>\n )}\n </span>\n );\n })}\n </div>\n );\n});\n","/**\n * Dumb flowchart renderer — spec + snapshots → ReactFlow graph with overlay.\n *\n * No internal navigation state. The consumer (ExplainableShell) owns\n * drill-down, breadcrumb, and SubflowTree. This component just renders\n * whatever spec + snapshots it receives at any level.\n *\n * Usage:\n * <TracedFlowchartView spec={spec} /> // static\n * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} /> // traced\n */\nimport { useMemo, useCallback, useEffect } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useReactFlow,\n useNodesState,\n useEdgesState,\n} from \"@xyflow/react\";\nimport type { Node, NodeTypes } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport { specToLayout, applyOverlay } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay } from \"./specToReactFlow\";\n\nexport interface TracedFlowchartViewProps extends BaseComponentProps {\n /** Pipeline spec from builder.toSpec() — for the current level */\n spec: SpecNode;\n /** Visualization snapshots (enables trace overlay when provided) */\n snapshots?: StageSnapshot[];\n /** Current time-travel position */\n snapshotIndex?: number;\n /** Callback when a node is clicked (receives snapshot index, or node id if no snapshots) */\n onNodeClick?: (indexOrId: number | string) => void;\n /** Override default node types */\n nodeTypes?: NodeTypes;\n}\n\nconst defaultNodeTypes: NodeTypes = { stage: StageNode as any };\n\n/** Calls fitView when the container resizes (e.g. panel expand/collapse). */\nfunction FitViewOnResize() {\n const { fitView } = useReactFlow();\n useEffect(() => {\n const handler = () => { requestAnimationFrame(() => fitView({ padding: 0.3 })); };\n window.addEventListener(\"resize\", handler);\n // Also fit on mount after layout settles\n const timer = setTimeout(handler, 50);\n return () => { window.removeEventListener(\"resize\", handler); clearTimeout(timer); };\n }, [fitView]);\n return null;\n}\n\nexport function TracedFlowchartView({\n spec,\n snapshots,\n snapshotIndex = 0,\n onNodeClick,\n nodeTypes: customNodeTypes,\n unstyled = false,\n className,\n style,\n}: TracedFlowchartViewProps) {\n const nodeTypes = customNodeTypes ?? defaultNodeTypes;\n\n // Compute execution overlay from snapshots + index\n const overlay = useMemo<ExecutionOverlay | undefined>(() => {\n if (!snapshots || snapshots.length === 0) return undefined;\n const executionOrder = snapshots\n .slice(0, snapshotIndex + 1)\n .map((s) => s.stageLabel);\n const doneStages = new Set(\n snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel)\n );\n const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;\n const executedStages = new Set([...doneStages]);\n if (activeStage) executedStages.add(activeStage);\n\n return { doneStages, activeStage, executedStages, executionOrder };\n }, [snapshots, snapshotIndex]);\n\n // Phase 1: static layout — only recomputes when spec changes\n const layout = useMemo(() => {\n if (!spec) return null;\n return specToLayout(spec);\n }, [spec]);\n\n // Phase 2: apply overlay — cheap, runs per slider tick\n const flowData = useMemo(() => {\n if (!layout) return { nodes: [] as Node[], edges: [] as any[] };\n return applyOverlay(layout, overlay);\n }, [layout, overlay]);\n\n // Explicit state sync — ReactFlow needs setNodes/setEdges to reliably\n // update node data (colors, step numbers) on same-id nodes.\n const [nodes, setNodes, onNodesChange] = useNodesState(flowData.nodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(flowData.edges);\n\n useEffect(() => {\n setNodes(flowData.nodes);\n setEdges(flowData.edges);\n }, [flowData, setNodes, setEdges]);\n\n // Handle node clicks — always send string node id.\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick) return;\n onNodeClick(node.id);\n },\n [onNodeClick]\n );\n\n return (\n <div\n className={className}\n style={{ width: \"100%\", height: \"100%\", ...style }}\n data-fp=\"traced-flowchart\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{ padding: 0.3 }}\n proOptions={{ hideAttribution: true }}\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n <FitViewOnResize />\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","import { memo, useEffect, useRef } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport { theme } from \"../../theme\";\n\nconst KEYFRAMES_ID = \"fp-stage-node-keyframes\";\nconst KEYFRAMES_CSS = `\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fp-pulse {\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 0.15; transform: scale(1.06); }\n }\n @keyframes fp-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n}\n@media (prefers-reduced-motion: reduce) {\n @keyframes fp-pulse { 0%, 100% { opacity: 0.3; } }\n @keyframes fp-blink { 0%, 100% { opacity: 1; } }\n}\n`;\n\nexport interface StageNodeData {\n label: string;\n active?: boolean;\n done?: boolean;\n error?: boolean;\n linked?: boolean;\n /** Semantic icon hint (e.g., \"llm\", \"tool\", \"rag\", \"start\", \"parse\", \"agent\", \"guard\") */\n icon?: string;\n /** Step numbers in execution order (shown as badges — multiple when revisited via loops) */\n stepNumbers?: number[];\n /** Node was not executed (dim it) */\n dimmed?: boolean;\n /** Node is a subflow root (show nested indicator) */\n isSubflow?: boolean;\n /** Node uses lazy resolution (dashed border + cloud icon when unresolved) */\n isLazy?: boolean;\n /** Node is a decider (renders as diamond shape per flowchart convention) */\n isDecider?: boolean;\n /** Node is a fork (parallel fan-out) */\n isFork?: boolean;\n /** Human-readable description of what this stage does */\n description?: string;\n /** Subflow identifier — set when this node belongs to a subflow */\n subflowId?: string;\n [key: string]: unknown;\n}\n\n// ── Stage icon SVGs ───────────────────────────────────────────────────────\n// Inline SVGs for crisp rendering at any size. Consumers pass a string key\n// via SpecNode.icon; StageNode renders the matching mini-icon.\n\nconst ICON_SIZE = 16;\n\nfunction StageIcon({ type, color }: { type: string; color: string }) {\n const s = ICON_SIZE;\n const props = { width: s, height: s, viewBox: `0 0 ${s} ${s}`, fill: \"none\", style: { flexShrink: 0 } as const };\n\n switch (type) {\n // LLM / AI call — brain/sparkle\n case \"llm\":\n case \"ai\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M5.5 8C5.5 6.5 6.5 5 8 5S10.5 6.5 10.5 8\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"9.5\" r=\"1\" fill={color} />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"3.5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"12.5\" y1=\"4\" x2=\"11.2\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"3.5\" y1=\"4\" x2=\"4.8\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Tool / function call — gear\n case \"tool\":\n case \"function\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke={color} strokeWidth=\"1.5\" />\n {[0, 45, 90, 135, 180, 225, 270, 315].map((angle) => {\n const rad = (angle * Math.PI) / 180;\n const x1 = 8 + Math.cos(rad) * 4.5;\n const y1 = 8 + Math.sin(rad) * 4.5;\n const x2 = 8 + Math.cos(rad) * 6;\n const y2 = 8 + Math.sin(rad) * 6;\n return <line key={angle} x1={x1} y1={y1} x2={x2} y2={y2} stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />;\n })}\n </svg>\n );\n\n // RAG / retrieval — magnifying glass + doc\n case \"rag\":\n case \"search\":\n case \"retrieval\":\n return (\n <svg {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" stroke={color} strokeWidth=\"1.5\" />\n <line x1=\"10\" y1=\"10\" x2=\"13.5\" y2=\"13.5\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"6\" x2=\"8.5\" y2=\"6\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"8\" x2=\"7.5\" y2=\"8\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Parse / process — diamond with arrows\n case \"parse\":\n case \"process\":\n case \"transform\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke={color} strokeWidth=\"1.5\" transform=\"rotate(45 8 8)\" />\n </svg>\n );\n\n // Start / seed — play triangle\n case \"start\":\n case \"seed\":\n case \"init\":\n return (\n <svg {...props}>\n <path d=\"M5 3.5L12.5 8L5 12.5V3.5Z\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // End / finalize — stop square\n case \"end\":\n case \"finalize\":\n case \"output\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // Agent — person silhouette\n case \"agent\":\n case \"orchestrator\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M3.5 14C3.5 11 5.5 9 8 9S12.5 11 12.5 14\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Swarm — multi-agent\n case \"swarm\":\n case \"multi-agent\":\n return (\n <svg {...props}>\n <circle cx=\"5\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"11\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"8\" cy=\"11\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <line x1=\"5\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n <line x1=\"11\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n );\n\n // Guard / guardrail — shield\n case \"guard\":\n case \"guardrail\":\n case \"validate\":\n return (\n <svg {...props}>\n <path d=\"M8 2L3 5V9C3 11.5 5 13.5 8 14.5C11 13.5 13 11.5 13 9V5L8 2Z\" stroke={color} strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M6 8L7.5 9.5L10 6.5\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n // Stream — wave\n case \"stream\":\n case \"streaming\":\n return (\n <svg {...props}>\n <path d=\"M2 8C4 5 6 11 8 8S12 5 14 8\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M2 11C4 8 6 14 8 11S12 8 14 11\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.5\" />\n </svg>\n );\n\n // Memory / state — database cylinder\n case \"memory\":\n case \"state\":\n case \"db\":\n return (\n <svg {...props}>\n <ellipse cx=\"8\" cy=\"4.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"3\" y1=\"4.5\" x2=\"3\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <ellipse cx=\"8\" cy=\"11.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n </svg>\n );\n\n // Loop — circular arrow\n case \"loop\":\n case \"retry\":\n return (\n <svg {...props}>\n <path d=\"M12 8A4 4 0 1 1 8 4\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M8 1.5L10.5 4L8 6.5\" stroke={color} strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\n </svg>\n );\n\n // Lazy / service — cloud (deferred resolution, loaded on demand)\n case \"lazy\":\n case \"service\":\n case \"cloud\":\n return (\n <svg {...props}>\n <path\n d=\"M4.5 12C2.8 12 1.5 10.7 1.5 9C1.5 7.5 2.5 6.3 3.8 6C4 4 5.8 2.5 8 2.5C9.8 2.5 11.3 3.5 11.9 5C13.9 5.2 15.5 6.8 15.5 8.8C15.5 10.8 13.9 12.5 11.8 12.5H4.5\"\n stroke={color}\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n\n // Decision — diamond (already handled by isDecider shape)\n case \"decision\":\n case \"router\":\n return (\n <svg {...props}>\n <path d=\"M8 2L14 8L8 14L2 8Z\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill={color} />\n </svg>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Custom ReactFlow node for pipeline stages.\n * All colors and fonts come from `--fp-*` CSS variables (via theme).\n * Shows execution state via color, icon, step badge, and pulse animation.\n */\nexport const StageNode = memo(function StageNode({\n data,\n}: NodeProps & { data: StageNodeData }) {\n const { label, active, done, error, linked, icon, stepNumbers, dimmed, isSubflow, isLazy, isDecider, isFork, description } = data;\n\n // Lazy nodes show cloud icon by default (unless another icon is specified)\n const effectiveIcon = icon || (isLazy ? \"lazy\" : undefined);\n // Lazy + unresolved = dashed border\n const isLazyUnresolved = isLazy && !done && !active;\n\n // Inject keyframes once into document head\n const injectedRef = useRef(false);\n useEffect(() => {\n if (injectedRef.current) return;\n if (typeof document !== \"undefined\" && !document.getElementById(KEYFRAMES_ID)) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = KEYFRAMES_ID;\n styleEl.textContent = KEYFRAMES_CSS;\n document.head.appendChild(styleEl);\n }\n injectedRef.current = true;\n }, []);\n\n const isOnPath = active || done;\n\n const bg = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.bgSecondary;\n\n const borderColor = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.border;\n\n const shadow = active\n ? `0 0 16px color-mix(in srgb, ${theme.primary} 40%, transparent)`\n : done\n ? `0 0 8px color-mix(in srgb, ${theme.success} 20%, transparent)`\n : error\n ? `0 0 12px color-mix(in srgb, ${theme.error} 30%, transparent)`\n : `0 2px 8px rgba(0,0,0,0.15)`;\n\n // Colored states use white for contrast; default uses consumer's text color.\n const textColor =\n active || done || error ? \"#fff\" : theme.textPrimary;\n\n return (\n <>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n {/* Step number badges — multiple when revisited via loops */}\n {stepNumbers && stepNumbers.length > 0 && isOnPath && (\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: -10,\n display: \"flex\",\n gap: 3,\n zIndex: 10,\n }}\n >\n {stepNumbers.map((num, i) => {\n const isLatest = i === stepNumbers.length - 1;\n const badgeBg = isLatest && active ? theme.primary : theme.success;\n const glow = isLatest && active\n ? `color-mix(in srgb, ${theme.primary} 50%, transparent)`\n : `color-mix(in srgb, ${theme.success} 40%, transparent)`;\n return (\n <div\n key={num}\n style={{\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: badgeBg,\n color: \"#fff\",\n fontSize: 11,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: `0 0 8px ${glow}`,\n }}\n >\n {num}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Linked pulse ring */}\n {linked && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.4,\n animation: \"fp-pulse 2s ease-in-out infinite\",\n }}\n />\n )}\n\n {/* Active node pulse ring */}\n {active && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.3,\n animation: \"fp-pulse 1.5s ease-out infinite\",\n }}\n />\n )}\n\n {/* Diamond for decider nodes — proper diamond via clip-path */}\n {isDecider ? (\n <div style={{ position: \"relative\", width: 120, height: 72 }}>\n {/* Diamond shape layer */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: bg,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n border: \"none\",\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n }}\n />\n {/* Border layer — slightly larger diamond behind */}\n <div\n style={{\n position: \"absolute\",\n inset: -2,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n background: borderColor,\n zIndex: -1,\n ...(isLazyUnresolved ? {\n background: \"transparent\",\n // Dashed border via SVG for clip-path (CSS border doesn't work with clip-path)\n } : {}),\n }}\n />\n {/* Content — centered on top of diamond */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 1,\n fontFamily: theme.fontSans,\n zIndex: 1,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n {!effectiveIcon && (\n <span style={{ fontSize: 9, color: textColor }}>◇</span>\n )}\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n </div>\n {description && (\n <span\n style={{\n fontSize: 8,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 100,\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n ) : (\n /* Standard rectangular node */\n <div\n style={{\n background: bg,\n border: `2px ${isLazyUnresolved ? \"dashed\" : \"solid\"} ${borderColor}`,\n borderRadius: theme.radius,\n padding: description ? \"8px 16px\" : \"10px 20px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: description ? 2 : 0,\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n fontFamily: theme.fontSans,\n minWidth: 100,\n justifyContent: \"center\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {/* Semantic icon (lazy nodes default to cloud icon) */}\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n\n {/* State icon */}\n {done && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✓</span>\n )}\n {active && !effectiveIcon && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: \"#fff\",\n animation: \"fp-blink 1s ease-in-out infinite\",\n flexShrink: 0,\n }}\n />\n )}\n {error && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✗</span>\n )}\n\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n {/* Subflow indicator — nested boxes icon */}\n {isSubflow && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: 3,\n border: `1.5px solid ${textColor}`,\n position: \"relative\",\n opacity: 0.7,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: 2,\n border: `1px solid ${textColor}`,\n }}\n />\n </span>\n )}\n </div>\n {/* Description subtitle */}\n {description && (\n <span\n style={{\n fontSize: 10,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 160,\n }}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {/* Right-side handles for loop-back edges (so they don't overlap center edges) */}\n <Handle\n id=\"loop-source\"\n type=\"source\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n <Handle\n id=\"loop-target\"\n type=\"target\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n </>\n );\n});\n","/**\n * Converts a SerializedPipelineStructure (from builder.toSpec()) into\n * ReactFlow nodes and edges with auto-layout.\n *\n * Two-phase approach for performance:\n * 1. `specToLayout(spec)` — tree walk + positioning (expensive, cached on spec)\n * 2. `applyOverlay(layout, overlay)` — color nodes/edges (cheap, runs per slider tick)\n *\n * `specToReactFlow(spec, overlay)` combines both for convenience.\n */\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { rawDefaults } from \"../../theme/tokens\";\n\nexport interface SpecNode {\n name: string;\n id?: string;\n type?: \"stage\" | \"decider\" | \"selector\" | \"fork\" | \"streaming\";\n /** Semantic icon hint — rendered by StageNode. Common values:\n * \"llm\", \"tool\", \"rag\", \"search\", \"parse\", \"start\", \"end\", \"loop\",\n * \"agent\", \"swarm\", \"guard\", \"stream\", \"memory\" */\n icon?: string;\n description?: string;\n children?: SpecNode[];\n next?: SpecNode;\n branchIds?: string[];\n hasDecider?: boolean;\n hasSelector?: boolean;\n loopTarget?: string;\n isSubflowRoot?: boolean;\n subflowId?: string;\n subflowName?: string;\n subflowStructure?: SpecNode;\n /** True when this subflow uses lazy resolution (deferred until execution). */\n isLazy?: boolean;\n}\n\nexport interface ExecutionOverlay {\n /** Names of stages that have completed (before the active one) */\n doneStages: Set<string>;\n /** Name of the currently active stage */\n activeStage: string | null;\n /** Names of all stages that were executed (done + active) */\n executedStages: Set<string>;\n /** Ordered list of executed stage names (for step numbering) */\n executionOrder?: string[];\n}\n\n/** Colors for the flowchart — consumer provides these to match their theme */\nexport interface FlowchartColors {\n edgeDefault: string;\n edgeExecuted: string;\n edgeActive: string;\n edgeLoop: string;\n labelDefault: string;\n labelExecuted: string;\n labelLoop: string;\n pathGlow: string;\n}\n\n/** Default colors derived from raw theme defaults. Consumer can override per-call. */\nconst DEFAULT_COLORS: FlowchartColors = {\n edgeDefault: rawDefaults.colors.textMuted,\n edgeExecuted: rawDefaults.colors.success,\n edgeActive: rawDefaults.colors.primary,\n edgeLoop: rawDefaults.colors.warning,\n labelDefault: rawDefaults.colors.textSecondary,\n labelExecuted: rawDefaults.colors.success,\n labelLoop: rawDefaults.colors.warning,\n pathGlow: `${rawDefaults.colors.success}4D`, // ~30% opacity hex\n};\n\n// ---------------------------------------------------------------------------\n// Phase 1: Static layout (expensive — depends only on spec)\n// ---------------------------------------------------------------------------\n\n/** A positioned node with all static info, before overlay is applied. */\nexport interface LayoutNode {\n id: string;\n x: number;\n y: number;\n label: string;\n isDecider: boolean;\n isFork: boolean;\n description?: string;\n icon?: string;\n subflowId?: string;\n isSubflow: boolean;\n isLazy?: boolean;\n}\n\n/** A positioned edge with source/target info. */\nexport interface LayoutEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n isLoop: boolean;\n}\n\n/** Static layout output — positions + structure, no execution state. */\nexport interface SpecLayout {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n /** Maps stage ID → node id for resolving loopTarget references. */\n idToName: Map<string, string>;\n}\n\nconst Y_STEP = 100;\nconst X_SPREAD = 200;\n\nfunction nid(n: SpecNode): string {\n return n.id || n.name || `spec-${Math.random()}`;\n}\n\ninterface WalkState {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n edgeCounter: number;\n seen: Set<string>;\n idToName: Map<string, string>;\n}\n\nfunction registerNode(state: WalkState, node: SpecNode): void {\n if (node.id && node.name) {\n state.idToName.set(node.id, node.name);\n }\n}\n\nfunction walkLayout(\n node: SpecNode,\n state: WalkState,\n x: number,\n y: number,\n): { lastIds: string[]; bottomY: number } {\n if (!node) return { lastIds: [], bottomY: y };\n registerNode(state, node);\n const id = nid(node);\n\n if (state.seen.has(id)) {\n return { lastIds: [id], bottomY: y };\n }\n state.seen.add(id);\n\n const isDecider = node.type === \"decider\" || node.type === \"selector\" || !!node.hasDecider || !!node.hasSelector;\n const isFork = node.type === \"fork\";\n\n state.nodes.push({\n id,\n x,\n y,\n label: node.name,\n isDecider,\n isFork,\n description: node.description,\n icon: node.icon,\n subflowId: node.subflowId,\n isSubflow: !!node.isSubflowRoot,\n isLazy: node.isLazy,\n });\n\n let lastIds = [id];\n let bottomY = y;\n\n // Handle children (fork/decider branches)\n if (node.children && node.children.length > 0) {\n const totalWidth = (node.children.length - 1) * X_SPREAD;\n const startX = x - totalWidth / 2;\n const childY = y + Y_STEP;\n const childResults: { lastIds: string[]; bottomY: number }[] = [];\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const childX = startX + i * X_SPREAD;\n const edgeLabel = node.branchIds?.[i];\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: nid(child), label: edgeLabel, isLoop: false });\n const result = walkLayout(child, state, childX, childY);\n childResults.push(result);\n }\n\n lastIds = childResults.flatMap((r) => r.lastIds);\n bottomY = Math.max(...childResults.map((r) => r.bottomY));\n }\n\n // Loop-back edge\n if (node.loopTarget) {\n // loopTarget is a stage ID — use it directly (ReactFlow node IDs = spec node IDs)\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: node.loopTarget, label: \"loop\", isLoop: true });\n }\n\n // Linear continuation\n if (node.next) {\n const rawNextId = nid(node.next);\n const resolvedNextId = state.idToName.get(rawNextId) ?? rawNextId;\n const isLoopRef = node.loopTarget && state.seen.has(resolvedNextId);\n\n if (isLoopRef) {\n // Add dotted back-edge for the loop reference\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, label: \"loop\", isLoop: true });\n }\n return { lastIds, bottomY };\n }\n\n const nextY = bottomY + Y_STEP;\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, isLoop: false });\n }\n return walkLayout(node.next, state, x, nextY);\n }\n\n return { lastIds, bottomY };\n}\n\n/**\n * Phase 1: Compute static layout from spec. Cached on spec reference — only\n * recomputes when the pipeline structure changes, not on every slider tick.\n */\nexport function specToLayout(spec: SpecNode): SpecLayout {\n const state: WalkState = {\n nodes: [],\n edges: [],\n edgeCounter: 0,\n seen: new Set(),\n idToName: new Map(),\n };\n walkLayout(spec, state, 300, 0);\n return { nodes: state.nodes, edges: state.edges, idToName: state.idToName };\n}\n\n// ---------------------------------------------------------------------------\n// Phase 2: Apply overlay (cheap — runs per slider tick)\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 2: Apply execution overlay to static layout.\n * Produces ReactFlow nodes/edges with correct colors, step numbers, and glow.\n */\nexport function applyOverlay(\n layout: SpecLayout,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const c = { ...DEFAULT_COLORS, ...colors };\n const o = overlay ?? null;\n\n // Nodes\n const nodes: Node[] = layout.nodes.map((ln) => {\n const isDone = o ? o.doneStages.has(ln.id) : false;\n const isActive = o ? o.activeStage === ln.id : false;\n const wasExecuted = o ? o.executedStages.has(ln.id) : false;\n const dimmed = o && !wasExecuted;\n\n let stepNumbers: number[] | undefined;\n if (o?.executionOrder) {\n const nums: number[] = [];\n for (let i = 0; i < o.executionOrder.length; i++) {\n if (o.executionOrder[i] === ln.id) nums.push(i + 1);\n }\n if (nums.length > 0) stepNumbers = nums;\n }\n\n return {\n id: ln.id,\n position: { x: ln.x, y: ln.y },\n data: {\n label: ln.label,\n active: isActive,\n done: isDone,\n error: false,\n isDecider: ln.isDecider,\n isFork: ln.isFork,\n description: ln.description,\n icon: ln.icon,\n subflowId: ln.subflowId,\n dimmed,\n stepNumbers,\n isSubflow: ln.isSubflow,\n isLazy: ln.isLazy,\n },\n type: \"stage\" as const,\n style: dimmed ? { opacity: 0.35 } : undefined,\n };\n });\n\n // Edges\n const edges: Edge[] = [];\n for (const le of layout.edges) {\n const executed = o && o.executedStages.has(le.source) && o.executedStages.has(le.target);\n const isLeadingEdge = o && le.source === o.activeStage && !o.doneStages.has(le.target);\n\n if (le.isLoop) {\n let loopExecuted = false;\n if (o?.executionOrder) {\n const lastSourceIdx = o.executionOrder.lastIndexOf(le.source);\n if (lastSourceIdx >= 0) {\n loopExecuted = o.executionOrder.slice(lastSourceIdx + 1).includes(le.target);\n }\n }\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n sourceHandle: \"loop-source\",\n targetHandle: \"loop-target\",\n label: le.label ?? \"loop\",\n type: \"smoothstep\",\n pathOptions: { offset: 40, borderRadius: 16 },\n style: {\n stroke: c.edgeLoop,\n strokeWidth: loopExecuted ? 3 : 2,\n strokeDasharray: \"6 3\",\n opacity: o && !loopExecuted ? 0.35 : 1,\n },\n labelStyle: { fontSize: 10, fontWeight: 700, fill: c.labelLoop },\n animated: loopExecuted,\n zIndex: 2,\n } as Edge);\n } else if (executed) {\n // Glow layer\n edges.push({\n id: `${le.id}-glow`,\n source: le.source,\n target: le.target,\n style: { stroke: c.pathGlow, strokeWidth: 8, opacity: 0.4 },\n zIndex: 0,\n selectable: false,\n focusable: false,\n });\n // Route line\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: isLeadingEdge ? c.edgeActive : c.edgeExecuted,\n strokeWidth: 3.5,\n },\n labelStyle: { fontSize: 10, fontWeight: 600, fill: c.labelExecuted },\n animated: !!isLeadingEdge,\n zIndex: 1,\n });\n } else {\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: c.edgeDefault,\n strokeWidth: 1.5,\n opacity: o ? 0.3 : 1,\n },\n labelStyle: { fontSize: 10, fill: c.labelDefault },\n });\n }\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience: combined single-call (backwards compatible)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a pipeline spec to ReactFlow graph.\n * Pass `overlay` to color nodes/edges by execution state.\n */\nexport function specToReactFlow(\n spec: SpecNode,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const layout = specToLayout(spec);\n return applyOverlay(layout, overlay, colors);\n}\n"],"mappings":"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","names":["jsx","useMemo","jsx","jsxs","useMemo","useState","useMemo","useEffect","useRef","jsx","jsxs","useMemo","useState","useRef","useEffect","useState","useMemo","useRef","useEffect","jsx","jsxs","useState","useRef","useMemo","useEffect","useState","jsx","jsxs","useState","useMemo","jsx","jsxs","v","useMemo","jsx","jsxs","useState","useMemo","useCallback","Fragment","jsx","jsxs","fmt","v","jsxs","jsx","useMemo","Fragment","useState","useCallback","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","memo","useState","useCallback","useMemo","useRef","useEffect","jsx","jsxs","useMemo","useState","useCallback","useMemo","useRef","useEffect","Fragment","jsx","jsxs","useMemo","useRef","useEffect","jsx","jsxs","useMemo","useState","useCallback","useState","useCallback","useMemo","Fragment","jsx","jsxs","TreeNode","useState","useCallback","SectionLabel","SubflowTree","useMemo","memo","jsx","jsxs","memo","SubflowBreadcrumb","useMemo","useCallback","useEffect","memo","useEffect","useRef","Fragment","jsx","jsxs","memo","StageNode","useRef","useEffect","jsx","jsxs","useEffect","useMemo","useCallback","Fragment","jsx","jsxs","memo","HLinePill","VLinePill","DetailsContent","useState","v","useMemo","useRef","useEffect","tabs","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/presets.ts","../src/theme/useDarkModeTokens.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/adapters/fromRuntimeSnapshot.ts","../src/components/MemoryPanel/MemoryPanel.tsx","../src/components/NarrativePanel/NarrativePanel.tsx","../src/components/StoryNarrative/StoryNarrative.tsx","../src/components/FlowchartView/SubflowTree.tsx","../src/components/FlowchartView/SubflowBreadcrumb.tsx","../src/components/FlowchartView/TracedFlowchartView.tsx","../src/components/StageNode/StageNode.tsx","../src/components/FlowchartView/specToReactFlow.ts"],"sourcesContent":["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/** Raw fallback values — used by tokensToCSSVars() and anywhere a real color is needed. */\nexport const rawDefaults = {\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} as const;\n\n/** Default dark theme values with CSS variable references (consumers can override via CSS). */\nexport const defaultTokens: Required<{\n [K in keyof ThemeTokens]-?: Required<ThemeTokens[K]>;\n}> = {\n colors: {\n primary: `var(--fp-color-primary, ${rawDefaults.colors.primary})`,\n success: `var(--fp-color-success, ${rawDefaults.colors.success})`,\n error: `var(--fp-color-error, ${rawDefaults.colors.error})`,\n warning: `var(--fp-color-warning, ${rawDefaults.colors.warning})`,\n bgPrimary: `var(--fp-bg-primary, ${rawDefaults.colors.bgPrimary})`,\n bgSecondary: `var(--fp-bg-secondary, ${rawDefaults.colors.bgSecondary})`,\n bgTertiary: `var(--fp-bg-tertiary, ${rawDefaults.colors.bgTertiary})`,\n textPrimary: `var(--fp-text-primary, ${rawDefaults.colors.textPrimary})`,\n textSecondary: `var(--fp-text-secondary, ${rawDefaults.colors.textSecondary})`,\n textMuted: `var(--fp-text-muted, ${rawDefaults.colors.textMuted})`,\n border: `var(--fp-border, ${rawDefaults.colors.border})`,\n },\n radius: `var(--fp-radius, ${rawDefaults.radius})`,\n fontFamily: {\n sans: `var(--fp-font-sans, ${rawDefaults.fontFamily.sans})`,\n mono: `var(--fp-font-mono, ${rawDefaults.fontFamily.mono})`,\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/** Cool light theme — neutral grays, matches Tailwind zinc palette */\nexport const coolLight: ThemeTokens = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#ffffff\",\n bgSecondary: \"#f9fafb\",\n bgTertiary: \"#e5e7eb\",\n textPrimary: \"#18181b\",\n textSecondary: \"#52525b\",\n textMuted: \"#a1a1aa\",\n border: \"#e5e7eb\",\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 coolLight,\n warmDark,\n warmLight,\n} as const;\n\nexport type ThemePresetName = keyof typeof themePresets;\n","/**\n * useDarkModeTokens — Auto-bridge between CSS class-based dark mode and FootprintTheme.\n *\n * Watches for a `.dark` class on <html> (Tailwind convention) and returns\n * the appropriate ThemeTokens preset. Pairs with FootprintTheme:\n *\n * import { FootprintTheme, useDarkModeTokens } from 'footprint-explainable-ui';\n *\n * function MyApp() {\n * const tokens = useDarkModeTokens();\n * return (\n * <FootprintTheme tokens={tokens}>\n * <NarrativeTrace ... />\n * </FootprintTheme>\n * );\n * }\n *\n * Consumers can override the light/dark presets:\n *\n * const tokens = useDarkModeTokens({ light: warmLight, dark: warmDark });\n */\n\nimport { useState, useEffect } from \"react\";\nimport type { ThemeTokens } from \"./tokens\";\nimport { coolDark } from \"./presets\";\nimport { coolLight } from \"./presets\";\n\nexport interface DarkModeTokensOptions {\n /** Tokens to use in light mode. Defaults to coolLight. */\n light?: ThemeTokens;\n /** Tokens to use in dark mode. Defaults to coolDark. */\n dark?: ThemeTokens;\n /** CSS selector to watch for dark mode. Defaults to checking .dark on documentElement. */\n selector?: string;\n}\n\nexport function useDarkModeTokens(options?: DarkModeTokensOptions): ThemeTokens {\n const lightTokens = options?.light ?? coolLight;\n const darkTokens = options?.dark ?? coolDark;\n\n const [isDark, setIsDark] = useState(\n () => document.documentElement.classList.contains(options?.selector ?? \"dark\"),\n );\n\n useEffect(() => {\n const cls = options?.selector ?? \"dark\";\n const obs = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(cls));\n });\n obs.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => obs.disconnect();\n }, [options?.selector]);\n\n return isDark ? darkTokens : lightTokens;\n}\n","import { useMemo, useRef } 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/** Cache for incremental memory accumulation — avoids O(n) rebuild on every slider scrub. */\ninterface MemoryCache {\n snapshots: StageSnapshot[];\n index: number;\n accumulated: Record<string, unknown>;\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 // Incremental cache: accumulate forward from last known index instead of rebuilding from 0\n const cacheRef = useRef<MemoryCache | null>(null);\n\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 safeIdx = Math.min(selectedIndex, snapshots.length - 1);\n let merged: Record<string, unknown>;\n const cache = cacheRef.current;\n\n if (cache && cache.snapshots === snapshots && cache.index <= safeIdx) {\n // Forward scrub: extend from cached state\n merged = { ...cache.accumulated };\n for (let i = cache.index + 1; i <= safeIdx; i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n } else {\n // Backward scrub or new snapshots: rebuild from scratch\n merged = {};\n for (let i = 0; i <= safeIdx; i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n }\n\n // Update cache\n cacheRef.current = { snapshots, index: safeIdx, accumulated: merged };\n\n const nk = new Set<string>();\n if (highlightNew && safeIdx > 0) {\n // Previous state is cache at safeIdx-1, or rebuild if needed\n let prev: Record<string, unknown>;\n if (cache && cache.snapshots === snapshots && cache.index === safeIdx - 1) {\n prev = cache.accumulated;\n } else {\n prev = {};\n for (let i = 0; i < safeIdx; i++) {\n Object.assign(prev, snapshots[i]?.memory);\n }\n }\n const current = snapshots[safeIdx]?.memory ?? {};\n for (const k of Object.keys(current)) {\n if (!(k in prev)) nk.add(k);\n }\n } else if (highlightNew && safeIdx === 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\" role=\"region\" aria-label=\"Memory state\">\n <div data-fp=\"memory-label\">Memory State</div>\n <pre data-fp=\"memory-json\">\n <code>{JSON.stringify(memory, null, 2)}</code>\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 role=\"region\"\n aria-label=\"Memory state\"\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 role={group.steps.length > 0 ? \"button\" : undefined}\n tabIndex={group.steps.length > 0 ? 0 : undefined}\n aria-expanded={group.steps.length > 0 ? !collapsedSet.has(group.headerIdx) : undefined}\n aria-label={`Stage ${gi + 1}, ${group.steps.length} steps${gi === lastIdx ? \", current\" : \"\"}`}\n onClick={() => {\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }\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.length > 0 && (\n <div data-fp=\"narrative-future-hint\">\n {futureGroups.length} more {futureGroups.length === 1 ? \"stage\" : \"stages\"} ahead...\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 role={hasSteps ? \"button\" : undefined}\n tabIndex={hasSteps ? 0 : undefined}\n aria-expanded={hasSteps ? !isCollapsed : undefined}\n aria-label={`Stage ${gi + 1}, ${group.steps.length} steps${isLatest ? \", current\" : \", completed\"}`}\n onClick={() => {\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }\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 {/* Future groups — show count hint only, skip full rendering for performance */}\n {futureGroups.length > 0 && (\n <div style={{\n opacity: 0.3,\n fontSize: fs.small,\n color: theme.textMuted,\n padding: `8px ${pad}px`,\n fontStyle: \"italic\",\n }}>\n {futureGroups.length} more {futureGroups.length === 1 ? \"stage\" : \"stages\"} ahead...\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\" role=\"listbox\" aria-label=\"Execution timeline\">\n {snapshots.map((snap, idx) => (\n <div\n key={`${snap.stageName}-${idx}`}\n data-fp=\"gantt-bar\"\n data-selected={idx === selectedIndex}\n data-visible={idx <= selectedIndex}\n role=\"option\"\n aria-selected={idx === selectedIndex}\n aria-label={`${snap.stageLabel}, ${snap.durationMs}ms`}\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 role=\"listbox\"\n aria-label=\"Execution timeline\"\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}-${idx}`}\n ref={isSelected ? activeRowRef : undefined}\n role=\"option\"\n aria-selected={isSelected}\n aria-label={`${snap.stageLabel}, ${snap.durationMs}ms`}\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 title={snap.stageLabel}\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: `color-mix(in srgb, ${theme.success} 10%, transparent)`, fg: theme.success, icon: \"+\" },\n removed: { bg: `color-mix(in srgb, ${theme.error} 10%, transparent)`, fg: theme.error, icon: \"-\" },\n changed: { bg: `color-mix(in srgb, ${theme.warning} 10%, transparent)`, fg: theme.warning, 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 handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowLeft\" && canPrev && !playing) {\n e.preventDefault();\n setPlaying(false);\n onIndexChange(selectedIndex - 1);\n } else if (e.key === \"ArrowRight\" && canNext && !playing) {\n e.preventDefault();\n setPlaying(false);\n onIndexChange(selectedIndex + 1);\n } else if (e.key === \" \" && autoPlayable) {\n e.preventDefault();\n togglePlay();\n }\n },\n [canPrev, canNext, playing, selectedIndex, onIndexChange, autoPlayable, togglePlay]\n );\n\n const fs = fontSize[size];\n\n if (unstyled) {\n return (\n <div\n className={className}\n style={style}\n data-fp=\"time-travel-controls\"\n role=\"toolbar\"\n aria-label=\"Time travel controls\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <button\n data-fp=\"tt-prev\"\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n aria-label=\"Previous stage\"\n >\n Prev\n </button>\n {autoPlayable && (\n <button data-fp=\"tt-play\" onClick={togglePlay} aria-label={playing ? \"Pause\" : \"Play\"}>\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 aria-label=\"Next stage\"\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 role=\"toolbar\"\n aria-label=\"Time travel controls\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <button\n style={btnStyle(!canPrev || playing)}\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n aria-label=\"Previous stage\"\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 aria-label={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 aria-label=\"Next stage\"\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","/**\n * ExplainableShell — Pure orchestrator for explainable pipeline visualization.\n *\n * Collapsible sections use the **line + centered pill** pattern:\n * - Collapsed = thin divider line with a pill button sitting on it\n * - Expanded = full content with a pill at the closing edge\n *\n * Sub-components are memo'd to minimize re-renders when scrubbing the\n * time-travel slider. Only components that depend on snapshotIdx re-render.\n *\n * Consumer controls theme via --fp-* CSS custom properties.\n */\nimport { memo, useState, useCallback, useMemo, useRef, useEffect } from \"react\";\nimport type { StageSnapshot, BaseComponentProps, NarrativeEntry } from \"../../types\";\nimport { theme } from \"../../theme\";\nimport { toVisualizationSnapshots, subflowResultToSnapshots } from \"../../adapters/fromRuntimeSnapshot\";\nimport { ResultPanel } from \"../ResultPanel\";\nimport { GanttTimeline } from \"../GanttTimeline\";\nimport { TimeTravelControls } from \"../TimeTravelControls\";\nimport { MemoryPanel } from \"../MemoryPanel\";\nimport { NarrativePanel } from \"../NarrativePanel\";\nimport { SubflowTree } from \"../FlowchartView/SubflowTree\";\nimport { SubflowBreadcrumb } from \"../FlowchartView/SubflowBreadcrumb\";\nimport { TracedFlowchartView } from \"../FlowchartView/TracedFlowchartView\";\nimport type { SpecNode } from \"../FlowchartView/specToReactFlow\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Tab ID — \"result\", \"memory\", \"narrative\", or any custom recorder view ID. */\nexport type ShellTab = string;\n\n\ninterface SubflowLevel {\n subflowId: string;\n label: string;\n spec: SpecNode;\n snapshots: StageSnapshot[];\n}\n\ninterface DrillDownEntry extends SubflowLevel {\n parentSnapshotIdx: number;\n}\n\nexport interface PanelLabels {\n /** Left panel pill label (subflow tree). Default: \"Topology\" */\n topology?: string;\n /** Right panel pill label (memory/narrative). Default: \"Details\" */\n details?: string;\n /** Bottom panel pill label (timeline). Default: \"Timeline\" */\n timeline?: string;\n}\n\n/** Which panels start expanded. Default: `{ details: true }` (flowchart + memory). */\nexport interface DefaultExpanded {\n topology?: boolean;\n details?: boolean;\n timeline?: boolean;\n}\n\n/**\n * Raw runtime snapshot from FlowChartExecutor.getSnapshot().\n * When provided, ExplainableShell converts it internally — zero boilerplate.\n */\nexport interface RuntimeSnapshotInput {\n sharedState: Record<string, unknown>;\n executionTree: unknown;\n commitLog: unknown[];\n subflowResults?: Record<string, unknown>;\n /** Recorder snapshots from FlowRecorder.toSnapshot() — auto-generates detail tabs. */\n recorders?: Array<{ id: string; name: string; data: unknown }>;\n}\n\n/**\n * A recorder view that appears as a tab in the details panel.\n * Each recorder provides its own per-stage rendering.\n * Memory and Narrative are built-in defaults — add more via this prop.\n */\nexport interface RecorderView {\n /** Unique key for this view tab */\n id: string;\n /** Display label on the tab */\n name: string;\n /**\n * Render function — receives the current snapshot index and all snapshots.\n * Return a React node to display in the details panel.\n */\n render: (props: { snapshots: StageSnapshot[]; selectedIndex: number }) => React.ReactNode;\n}\n\nexport interface ExplainableShellProps extends BaseComponentProps {\n /**\n * Pre-converted visualization snapshots. Use when you've already called\n * toVisualizationSnapshots() yourself.\n */\n snapshots?: StageSnapshot[];\n /**\n * Raw runtime snapshot from executor.getSnapshot(). The shell converts it\n * internally via toVisualizationSnapshots(). When provided, `snapshots`,\n * `resultData`, and `narrative` are derived automatically.\n *\n * Usage: `<ExplainableShell runtimeSnapshot={executor.getSnapshot()} spec={spec} />`\n */\n runtimeSnapshot?: RuntimeSnapshotInput | null;\n spec?: SpecNode | null;\n title?: string;\n resultData?: Record<string, unknown> | null;\n logs?: string[];\n narrative?: string[];\n narrativeEntries?: NarrativeEntry[];\n tabs?: ShellTab[];\n defaultTab?: ShellTab;\n hideConsole?: boolean;\n /** Hide specific detail tabs (e.g., ['result', 'memory']). */\n hideTabs?: string[];\n /** Customize the labels on collapsible panel pills */\n panelLabels?: PanelLabels;\n /** Which panels start expanded. Default: `{ details: true }` */\n defaultExpanded?: DefaultExpanded;\n /**\n * Recorder views — each becomes a tab in the details panel.\n * Default: Memory + Narrative. Pass additional recorder views\n * to show tokens, cost, tools, permissions, or custom data.\n *\n * Usage:\n * recorderViews={[\n * { id: 'tokens', name: 'Tokens', render: ({ selectedIndex }) => <div>...</div> },\n * ]}\n */\n recorderViews?: RecorderView[];\n /**\n * Custom flowchart renderer. When omitted and `spec` is provided,\n * ExplainableShell renders TracedFlowchartView by default.\n */\n renderFlowchart?: (props: {\n spec: SpecNode;\n snapshots: StageSnapshot[];\n selectedIndex: number;\n onNodeClick?: (indexOrId: number | string) => void;\n }) => React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Line + Pill — collapsed state is just a line with a pill centered on it\n// ---------------------------------------------------------------------------\n\n/** Horizontal line with centered pill (for top/bottom edges) */\nconst HLinePill = memo(function HLinePill({\n label,\n detail,\n expanded,\n onClick,\n}: {\n label: string;\n detail?: string;\n expanded: boolean;\n onClick: () => void;\n}) {\n return (\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0,\n padding: \"0\",\n }}>\n <div style={{ flex: 1, height: 1, background: theme.border }} />\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"3px 12px\",\n margin: \"4px 0\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: theme.textMuted,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n transition: \"color 0.15s ease\",\n }}\n >\n <span style={{ fontSize: 7 }}>{expanded ? \"▼\" : \"▶\"}</span>\n {label}\n {detail && <span style={{ fontWeight: 400, opacity: 0.5, fontSize: 9 }}>{detail}</span>}\n </button>\n <div style={{ flex: 1, height: 1, background: theme.border }} />\n </div>\n );\n});\n\n/** Vertical line with centered pill (for left/right edges).\n * `side` controls arrow direction:\n * - \"right\": expanded=▶ collapsed=◀ (panel is on right, collapses right)\n * - \"left\": expanded=◀ collapsed=▶ (panel is on left, collapses left)\n */\nconst VLinePill = memo(function VLinePill({\n label,\n expanded,\n side = \"right\",\n onClick,\n}: {\n label: string;\n expanded: boolean;\n side?: \"left\" | \"right\";\n onClick: () => void;\n}) {\n const arrow = side === \"right\"\n ? (expanded ? \"▶\" : \"◀\")\n : (expanded ? \"◀\" : \"▶\");\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 0,\n padding: \"0\",\n }}>\n <div style={{ flex: 1, width: 1, background: theme.border }} />\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"10px 4px\",\n margin: \"0 3px\",\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: theme.textMuted,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n writingMode: \"vertical-lr\",\n transition: \"color 0.15s ease\",\n }}\n >\n <span style={{ fontSize: 7, writingMode: \"horizontal-tb\" }}>{arrow}</span>\n {label}\n </button>\n <div style={{ flex: 1, width: 1, background: theme.border }} />\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// DetailsContent — Recorder-driven tab switcher (Memory + Narrative are defaults)\n// ---------------------------------------------------------------------------\n\nconst DetailsContent = memo(function DetailsContent({\n snapshots,\n selectedIndex,\n narrativeEntries,\n narrative,\n size,\n fillHeight,\n extraViews,\n}: {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n narrativeEntries?: NarrativeEntry[];\n narrative?: string[];\n size: \"compact\" | \"default\" | \"detailed\";\n fillHeight?: boolean;\n extraViews?: RecorderView[];\n}) {\n // Built-in views (always available)\n const builtInViews: RecorderView[] = [\n {\n id: \"memory\",\n name: \"Memory\",\n render: ({ snapshots: snaps, selectedIndex: idx }) => (\n <MemoryPanel snapshots={snaps} selectedIndex={idx} size={size} style={fillHeight ? { height: \"100%\" } : undefined} />\n ),\n },\n {\n id: \"narrative\",\n name: \"Narrative\",\n render: ({ snapshots: snaps, selectedIndex: idx }) => (\n <NarrativePanel snapshots={snaps} selectedIndex={idx} narrativeEntries={narrativeEntries} narrative={narrative} size={size} style={fillHeight ? { height: \"100%\" } : undefined} />\n ),\n },\n ];\n\n const allViews = [...builtInViews, ...(extraViews ?? [])];\n const [activeViewId, setActiveViewId] = useState(allViews[0]?.id ?? \"memory\");\n const activeView = allViews.find((v) => v.id === activeViewId) ?? allViews[0];\n\n return (\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n {/* Tab switcher — one per recorder view */}\n <div style={{ display: \"flex\", borderBottom: `1px solid ${theme.border}`, flexShrink: 0, overflowX: \"auto\" }}>\n {allViews.map((view) => {\n const active = view.id === activeViewId;\n return (\n <button\n key={view.id}\n onClick={() => setActiveViewId(view.id)}\n style={{\n flex: allViews.length <= 3 ? 1 : undefined,\n padding: \"6px 8px\", fontSize: 11,\n fontWeight: active ? 600 : 400,\n color: active ? theme.primary : theme.textMuted,\n background: active ? `color-mix(in srgb, ${theme.primary} 8%, transparent)` : \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${theme.primary}` : \"2px solid transparent\",\n cursor: \"pointer\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontFamily: \"inherit\",\n whiteSpace: \"nowrap\",\n }}\n >\n {view.name}\n </button>\n );\n })}\n </div>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {activeView?.render({ snapshots, selectedIndex })}\n </div>\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// Subflow resolution helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveSubflowLevel(\n parentSpec: SpecNode,\n parentSnapshots: StageSnapshot[],\n subflowNodeName: string,\n narrativeEntries?: NarrativeEntry[],\n): SubflowLevel | null {\n const specNode = findSubflowSpecNode(parentSpec, subflowNodeName);\n if (!specNode?.subflowStructure) return null;\n const parentSnap = parentSnapshots.find(\n (s) => s.stageName === subflowNodeName || s.stageLabel === subflowNodeName\n );\n if (!parentSnap?.subflowResult) return null;\n // Extract subflow narrative: prefer subflowId (structured), fall back to display name (text scan)\n const sfId = specNode.subflowId ?? subflowNodeName;\n const sfDisplayName = specNode.subflowName ?? specNode.name;\n const sfNarrative = narrativeEntries\n ? extractSubflowNarrative(narrativeEntries, sfId, sfDisplayName)\n : undefined;\n const sfSnapshots = subflowResultToSnapshots(parentSnap.subflowResult, sfNarrative);\n if (sfSnapshots.length === 0) return null;\n return {\n subflowId: specNode.subflowId ?? subflowNodeName,\n label: specNode.subflowName ?? specNode.name,\n spec: specNode.subflowStructure,\n snapshots: sfSnapshots,\n };\n}\n\nfunction extractSubflowNarrative(entries: NarrativeEntry[], subflowId: string, subflowName?: string): NarrativeEntry[] {\n // Primary: filter by stageName prefix (e.g., \"auth/Validate Token\" starts with \"auth/\")\n // This works reliably even for parallel subflows (no shared stack corruption)\n const prefix = subflowId + \"/\";\n const byPrefix = entries.filter((e) => e.stageName?.startsWith(prefix));\n if (byPrefix.length > 0) return byPrefix;\n\n // Fallback: structured subflowId field (from CombinedNarrativeRecorder stack tagging)\n const byId = entries.filter((e) => (e as any).subflowId === subflowId);\n if (byId.length > 0) return byId;\n\n // Last resort: scan for Entering/Exiting text markers\n const result: NarrativeEntry[] = [];\n const searchName = subflowName ?? subflowId;\n let inside = false;\n for (const entry of entries) {\n if (entry.type === \"subflow\" && entry.text.includes(searchName) && entry.text.startsWith(\"Entering\")) { inside = true; continue; }\n if (inside && entry.type === \"subflow\" && entry.text.includes(searchName) && entry.text.startsWith(\"Exiting\")) break;\n if (inside) result.push(entry);\n }\n return result;\n}\n\nfunction findSubflowSpecNode(node: SpecNode, name: string): SpecNode | null {\n if ((node.name === name || node.id === name) && node.isSubflowRoot) return node;\n if (node.children) { for (const child of node.children) { const f = findSubflowSpecNode(child, name); if (f) return f; } }\n if (node.next) return findSubflowSpecNode(node.next, name);\n return null;\n}\n\nfunction hasSubflowNodes(node: SpecNode): boolean {\n if (!node) return false;\n if (node.isSubflowRoot) return true;\n if (node.children?.some((c) => c && hasSubflowNodes(c))) return true;\n if (node.next && hasSubflowNodes(node.next)) return true;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// Default flowchart renderer — used when renderFlowchart is not provided\nfunction defaultRenderFlowchart({ spec: s, snapshots: snaps, selectedIndex, onNodeClick }: {\n spec: SpecNode; snapshots: StageSnapshot[]; selectedIndex: number;\n onNodeClick?: (indexOrId: number | string) => void;\n}) {\n return (\n <TracedFlowchartView\n spec={s}\n snapshots={snaps}\n snapshotIndex={selectedIndex}\n onNodeClick={onNodeClick}\n />\n );\n}\n\nexport function ExplainableShell({\n snapshots: snapshotsProp,\n runtimeSnapshot,\n spec,\n title,\n resultData: resultDataProp,\n logs = [],\n narrative: narrativeProp,\n narrativeEntries,\n tabs = [\"result\", \"explainable\"],\n defaultTab,\n hideConsole = false,\n hideTabs: hideTabsProp,\n panelLabels,\n defaultExpanded,\n recorderViews,\n renderFlowchart,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ExplainableShellProps) {\n // Convert runtimeSnapshot → visualization snapshots (zero-boilerplate mode)\n const derivedFromRuntime = useMemo(() => {\n if (!runtimeSnapshot) return null;\n try {\n const snaps = toVisualizationSnapshots(runtimeSnapshot as any, narrativeEntries as any);\n const narr: string[] = [];\n for (const snap of snaps) {\n const lines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n narr.push(...lines);\n }\n return { snapshots: snaps, resultData: runtimeSnapshot.sharedState, narrative: narr };\n } catch {\n return null;\n }\n }, [runtimeSnapshot, narrativeEntries]);\n\n // Use derived data when runtimeSnapshot is provided, otherwise use explicit props\n const snapshots = snapshotsProp ?? derivedFromRuntime?.snapshots ?? [];\n const resultData = resultDataProp ?? derivedFromRuntime?.resultData ?? null;\n const narrative = narrativeProp ?? derivedFromRuntime?.narrative;\n\n // Default flowchart renderer when spec is provided\n const effectiveRenderFlowchart = renderFlowchart ?? (spec ? defaultRenderFlowchart : undefined);\n const leftLabel = panelLabels?.topology ?? \"Topology\";\n const rightLabel = panelLabels?.details ?? \"Details\";\n const bottomLabel = panelLabels?.timeline ?? \"Timeline\";\n\n // Responsive: detect narrow container + notify children of size changes\n const shellRef = useRef<HTMLDivElement>(null);\n const [isNarrow, setIsNarrow] = useState(false);\n useEffect(() => {\n const el = shellRef.current;\n if (!el) return;\n const ro = new ResizeObserver(([entry]) => {\n setIsNarrow(entry.contentRect.width < 640);\n // Notify ReactFlow (and other layout-sensitive children) that our container resized\n window.dispatchEvent(new Event(\"resize\"));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // Auto-detect recorder views from runtimeSnapshot.recorders\n const autoRecorderViews = useMemo(() => {\n const recorders = (runtimeSnapshot as any)?.recorders as Array<{ id: string; name: string; data: unknown }> | undefined;\n if (!recorders?.length) return [];\n // Don't auto-generate for IDs that have explicit recorderViews\n const explicitIds = new Set((recorderViews ?? []).map((v) => v.id));\n return recorders\n .filter((r) => !explicitIds.has(r.id))\n .map((r) => ({ id: r.id, name: r.name, data: r.data }));\n }, [runtimeSnapshot, recorderViews]);\n\n // Build tab list: Result + Memory (always), Narrative (when data exists),\n // explicit recorder views, auto-detected recorder views\n const hasNarrative = !!(narrative?.length || narrativeEntries?.length);\n const allTabs = useMemo(() => {\n const tabs: Array<{ id: string; name: string }> = [\n { id: \"result\", name: \"Result\" },\n { id: \"memory\", name: \"Memory\" },\n ];\n if (hasNarrative) {\n tabs.push({ id: \"narrative\", name: \"Narrative\" });\n }\n for (const v of recorderViews ?? []) {\n tabs.push({ id: v.id, name: v.name });\n }\n for (const v of autoRecorderViews) {\n tabs.push({ id: v.id, name: v.name });\n }\n // Filter hidden tabs\n const hideSet = new Set(hideTabsProp ?? []);\n return hideSet.size > 0 ? tabs.filter((t) => !hideSet.has(t.id)) : tabs;\n }, [hasNarrative, recorderViews, autoRecorderViews, hideTabsProp]);\n\n const validTabIds = new Set(allTabs.map((t) => t.id));\n const resolvedDefault = defaultTab && validTabIds.has(defaultTab) ? defaultTab : allTabs[0]?.id ?? \"result\";\n const [activeTab, setActiveTab] = useState<string>(resolvedDefault);\n const [snapshotIdx, setSnapshotIdx] = useState(0);\n const [drillDownStack, setDrillDownStack] = useState<DrillDownEntry[]>([]);\n const [rightExpanded, setRightExpanded] = useState(defaultExpanded?.details ?? true);\n const [leftExpanded, setLeftExpanded] = useState(defaultExpanded?.topology ?? false);\n const [timelineExpanded, setTimelineExpanded] = useState(defaultExpanded?.timeline ?? false);\n\n // Auto-collapse all panels when switching to narrow (mobile)\n useEffect(() => {\n if (isNarrow) {\n setLeftExpanded(false);\n setRightExpanded(false);\n setTimelineExpanded(false);\n }\n }, [isNarrow]);\n\n // Notify ReactFlow (and any ResizeObserver-based children) when panels toggle\n const triggerReflow = useCallback(() => {\n // Fire twice: once immediately for fast response, once after CSS transition ends\n requestAnimationFrame(() => window.dispatchEvent(new Event(\"resize\")));\n setTimeout(() => window.dispatchEvent(new Event(\"resize\")), 320);\n }, []);\n const toggleLeft = useCallback((v: boolean) => { setLeftExpanded(v); triggerReflow(); }, [triggerReflow]);\n const toggleRight = useCallback((v: boolean) => { setRightExpanded(v); triggerReflow(); }, [triggerReflow]);\n const toggleTimeline = useCallback(() => { setTimelineExpanded((p) => !p); triggerReflow(); }, [triggerReflow]);\n\n const isInSubflow = drillDownStack.length > 0;\n\n const currentLevel = useMemo(() => {\n if (drillDownStack.length > 0) {\n const top = drillDownStack[drillDownStack.length - 1];\n return { spec: top.spec, snapshots: top.snapshots };\n }\n return { spec: spec ?? null, snapshots };\n }, [drillDownStack, spec, snapshots]);\n\n const activeSnapshots = currentLevel.snapshots;\n const activeSpec = currentLevel.spec;\n const safeIdx = activeSnapshots.length > 0\n ? Math.max(0, Math.min(snapshotIdx, activeSnapshots.length - 1))\n : 0;\n\n const activeNarrative = useMemo<string[] | undefined>(() => {\n if (!isInSubflow) return narrative;\n const lines: string[] = [];\n for (const snap of activeSnapshots) {\n const stageLines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n lines.push(...stageLines);\n }\n return lines.length > 0 ? lines : undefined;\n }, [isInSubflow, narrative, activeSnapshots]);\n\n const activeNarrativeEntries = isInSubflow ? undefined : narrativeEntries;\n\n const breadcrumbs = useMemo(() => {\n const root = { label: title || \"Flowchart\", spec: spec!, description: spec?.description };\n return [root, ...drillDownStack.map((e) => ({ label: e.label, spec: e.spec, description: undefined as string | undefined }))];\n }, [spec, title, drillDownStack]);\n\n const showTreeSidebar = useMemo(() => !!spec && hasSubflowNodes(spec), [spec]);\n\n const rootOverlay = useMemo(() => {\n if (isInSubflow || !snapshots.length) return { activeStage: undefined, doneStages: undefined };\n const doneStages = new Set(snapshots.slice(0, safeIdx).map((s) => s.stageLabel));\n const activeStage = snapshots[safeIdx]?.stageLabel ?? null;\n return { activeStage, doneStages };\n }, [isInSubflow, snapshots, safeIdx]);\n\n // ── Handlers ──\n const handleTabChange = useCallback((tab: ShellTab) => {\n setActiveTab(tab);\n setDrillDownStack([]);\n }, []);\n\n const handleSnapshotChange = useCallback((idx: number | string) => {\n if (typeof idx === \"number\") setSnapshotIdx(idx);\n }, []);\n\n const handleDrillDown = useCallback(\n (nodeName: string) => {\n if (!activeSpec) return;\n const entry = resolveSubflowLevel(activeSpec, activeSnapshots, nodeName, narrativeEntries);\n if (entry) {\n setDrillDownStack((prev) => [...prev, { ...entry, parentSnapshotIdx: snapshotIdx }]);\n setSnapshotIdx(0);\n }\n },\n [activeSpec, activeSnapshots, narrativeEntries, snapshotIdx]\n );\n\n const handleBreadcrumbNavigate = useCallback((level: number) => {\n setDrillDownStack((prev) => {\n const popped = level === 0 ? prev[0] : prev[level];\n if (popped) setSnapshotIdx(popped.parentSnapshotIdx);\n return level === 0 ? [] : prev.slice(0, level);\n });\n }, []);\n\n const handleNodeClick = useCallback(\n (indexOrId: number | string) => {\n if (typeof indexOrId === \"number\") { setSnapshotIdx(indexOrId); return; }\n if (activeSpec) {\n const sfNode = findSubflowSpecNode(activeSpec, indexOrId);\n if (sfNode?.subflowStructure) { handleDrillDown(indexOrId); return; }\n }\n const idx = activeSnapshots.findIndex((s) => s.stageLabel === indexOrId);\n if (idx >= 0) setSnapshotIdx(idx);\n },\n [activeSpec, activeSnapshots, handleDrillDown]\n );\n\n const handleTreeNodeSelect = useCallback(\n (name: string, isSubflow: boolean) => {\n if (isSubflow && spec) {\n setDrillDownStack([]);\n const entry = resolveSubflowLevel(spec, snapshots, name, narrativeEntries);\n if (entry) { setDrillDownStack([{ ...entry, parentSnapshotIdx: snapshotIdx }]); setSnapshotIdx(0); }\n } else {\n setDrillDownStack([]);\n const idx = snapshots.findIndex((s) => s.stageLabel === name);\n if (idx >= 0) setSnapshotIdx(idx);\n }\n },\n [spec, snapshots, narrativeEntries, snapshotIdx]\n );\n\n // Map tab id → label for rendering\n const tabLabels = new Map(allTabs.map((t) => [t.id, t.name]));\n\n // ── Unstyled mode ──\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"explainable-shell\">\n <div data-fp=\"shell-tabs\">\n {allTabs.map((tab) => (\n <button key={tab.id} data-fp=\"shell-tab\" data-active={tab.id === activeTab} onClick={() => handleTabChange(tab.id)}>{tab.name}</button>\n ))}\n </div>\n <div data-fp=\"shell-content\" data-tab={activeTab}>\n {activeTab === \"result\" && <ResultPanel data={resultData ?? null} logs={logs} hideConsole={hideConsole} unstyled />}\n {(activeTab === \"explainable\" || activeTab === \"ai-compatible\") && (\n <>\n <TimeTravelControls snapshots={activeSnapshots} selectedIndex={safeIdx} onIndexChange={handleSnapshotChange} unstyled />\n {isInSubflow && <SubflowBreadcrumb breadcrumbs={breadcrumbs} onNavigate={handleBreadcrumbNavigate} />}\n {activeSpec && effectiveRenderFlowchart?.({ spec: activeSpec, snapshots: activeSnapshots, selectedIndex: safeIdx, onNodeClick: handleNodeClick })}\n <MemoryPanel snapshots={activeSnapshots} selectedIndex={safeIdx} unstyled />\n <NarrativePanel snapshots={activeSnapshots} selectedIndex={safeIdx} narrativeEntries={activeNarrativeEntries} narrative={activeNarrative} unstyled />\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} unstyled />\n </>\n )}\n </div>\n </div>\n );\n }\n\n // ── Styled mode ──\n\n // Show topology when spec has subflows\n const showTopology = !!effectiveRenderFlowchart && !!activeSpec;\n\n // Render the active details tab content\n const detailsContent = useMemo(() => {\n if (activeTab === \"result\") {\n return <ResultPanel data={resultData ?? null} logs={logs} hideConsole={hideConsole} size={size} />;\n }\n if (activeTab === \"memory\") {\n return <MemoryPanel snapshots={activeSnapshots} selectedIndex={safeIdx} size={size} style={{ height: \"100%\" }} />;\n }\n if (activeTab === \"narrative\") {\n return <NarrativePanel snapshots={activeSnapshots} selectedIndex={safeIdx} narrativeEntries={activeNarrativeEntries} narrative={activeNarrative} size={size} style={{ height: \"100%\" }} />;\n }\n const customView = recorderViews?.find((v) => v.id === activeTab);\n if (customView?.render) {\n return customView.render({ snapshots: activeSnapshots, selectedIndex: safeIdx });\n }\n // Auto-detected recorder view — render as formatted JSON\n const autoView = autoRecorderViews.find((v) => v.id === activeTab);\n if (autoView) {\n return (\n <div style={{ padding: 12, fontFamily: theme.fontMono, fontSize: 11, whiteSpace: \"pre-wrap\", overflow: \"auto\", height: \"100%\" }}>\n {typeof autoView.data === \"string\" ? autoView.data : JSON.stringify(autoView.data, null, 2)}\n </div>\n );\n }\n return null;\n }, [activeTab, resultData, logs, hideConsole, size, activeSnapshots, safeIdx, activeNarrativeEntries, activeNarrative, recorderViews, autoRecorderViews]);\n\n // Details panel with internal tabs\n const detailsPanel = (\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", overflow: \"hidden\" }}>\n {/* Tab bar inside details panel */}\n <div style={{\n display: \"flex\",\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n overflowX: \"auto\",\n }}>\n {allTabs.map((tab) => {\n const active = tab.id === activeTab;\n return (\n <button\n key={tab.id}\n onClick={() => handleTabChange(tab.id as ShellTab)}\n style={{\n padding: \"6px 14px\",\n fontSize: 11,\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 fontFamily: \"inherit\",\n whiteSpace: \"nowrap\",\n }}\n >\n {tab.name}\n </button>\n );\n })}\n </div>\n {/* Tab content */}\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {detailsContent}\n </div>\n </div>\n );\n\n return (\n <div\n ref={shellRef}\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 fontSize: 12,\n ...style,\n }}\n data-fp=\"explainable-shell\"\n >\n {/* Time-travel slider */}\n <TimeTravelControls\n snapshots={activeSnapshots}\n selectedIndex={safeIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n\n {/* Breadcrumb */}\n {isInSubflow && (\n <SubflowBreadcrumb breadcrumbs={breadcrumbs} onNavigate={handleBreadcrumbNavigate} />\n )}\n\n {/* Content */}\n <div style={{ flex: 1, overflow: isNarrow ? \"auto\" : \"hidden\", display: \"flex\", flexDirection: \"column\" }}>\n {isNarrow ? (\n /* ── Mobile: stacked vertical ── */\n <>\n {/* Flowchart — only when topology is relevant */}\n {showTopology && (\n <div style={{ height: 350, flexShrink: 0, overflow: \"hidden\" }}>\n {effectiveRenderFlowchart!({\n spec: activeSpec!,\n snapshots: activeSnapshots,\n selectedIndex: safeIdx,\n onNodeClick: handleNodeClick,\n })}\n </div>\n )}\n\n {/* Topology (subflow tree) — collapsible */}\n {showTreeSidebar && (\n <>\n <HLinePill label={leftLabel} expanded={leftExpanded} onClick={() => toggleLeft(!leftExpanded)} />\n {leftExpanded && (\n <div style={{ maxHeight: 180, overflow: \"auto\", flexShrink: 0 }}>\n <SubflowTree\n spec={spec!}\n activeStage={rootOverlay.activeStage}\n doneStages={rootOverlay.doneStages}\n onNodeSelect={handleTreeNodeSelect}\n />\n </div>\n )}\n </>\n )}\n\n {/* Details panel with tabs */}\n <HLinePill label={rightLabel} expanded={rightExpanded} onClick={() => toggleRight(!rightExpanded)} />\n {rightExpanded && (\n <div style={{ maxHeight: 350, flexShrink: 0, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n )}\n\n {/* Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n ) : showTopology ? (\n /* ── Desktop with topology: side-by-side ── */\n <>\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n\n {/* Left: SubflowTree with VLinePill handle — only when spec has subflows */}\n {showTreeSidebar && (\n leftExpanded ? (\n <div style={{ width: 220, flexShrink: 0, display: \"flex\", flexDirection: \"row\", overflow: \"hidden\" }}>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n <SubflowTree\n spec={spec!}\n activeStage={rootOverlay.activeStage}\n doneStages={rootOverlay.doneStages}\n onNodeSelect={handleTreeNodeSelect}\n />\n </div>\n <VLinePill label={leftLabel} expanded={true} side=\"left\" onClick={() => toggleLeft(false)} />\n </div>\n ) : (\n <VLinePill label={leftLabel} expanded={false} side=\"left\" onClick={() => toggleLeft(true)} />\n )\n )}\n\n {/* Center: Flowchart */}\n <div style={{ flex: 1, overflow: \"hidden\", minWidth: 0 }}>\n {effectiveRenderFlowchart!({\n spec: activeSpec!,\n snapshots: activeSnapshots,\n selectedIndex: safeIdx,\n onNodeClick: handleNodeClick,\n })}\n </div>\n\n {/* Right: Details panel with tabs */}\n {rightExpanded ? (\n <div style={{ width: \"38%\", minWidth: 300, maxWidth: 500, display: \"flex\", flexDirection: \"row\", overflow: \"hidden\" }}>\n <VLinePill label={rightLabel} expanded={true} onClick={() => toggleRight(false)} />\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n </div>\n ) : (\n <VLinePill label={rightLabel} expanded={false} onClick={() => toggleRight(true)} />\n )}\n </div>\n\n {/* Bottom: Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n ) : (\n /* ── Desktop without topology: details panel takes full width ── */\n <>\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {detailsPanel}\n </div>\n\n {/* Bottom: Timeline */}\n <HLinePill label={bottomLabel} detail={`${activeSnapshots.length} stages`} expanded={timelineExpanded} onClick={toggleTimeline} />\n {timelineExpanded && (\n <div style={{ flexShrink: 0, overflow: \"hidden\" }}>\n <GanttTimeline snapshots={activeSnapshots} selectedIndex={safeIdx} onSelect={handleSnapshotChange} size={size} />\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { StageSnapshot, NarrativeEntry } 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 RecorderSnapshot {\n id: string;\n name: string;\n data: unknown;\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 /** Snapshots from recorders that implement toSnapshot() (e.g. MetricRecorder). */\n recorders?: RecorderSnapshot[];\n}\n\n// NarrativeEntry: canonical definition lives in types.ts.\n// Re-export here for backward compatibility (index.ts re-exports as AdapterNarrativeEntry).\nexport type { NarrativeEntry } from '../types';\n\n/**\n * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots\n * suitable for visualization components.\n *\n * The `narrativeEntries` parameter (from `executor.getNarrativeEntries()`)\n * distributes the library's rich combined narrative per-stage.\n * When narrative is not enabled, stages get \"Narrative not available\" —\n * this adapter reflects what the library produces, nothing more.\n *\n * Usage:\n * ```ts\n * const executor = new FlowChartExecutor(chart);\n * await executor.run();\n * const snapshots = toVisualizationSnapshots(\n * executor.getSnapshot(),\n * executor.getNarrativeEntries(),\n * );\n * ```\n */\nexport function toVisualizationSnapshots(\n runtime: RuntimeSnapshot,\n narrativeEntries?: NarrativeEntry[],\n): StageSnapshot[] {\n const stageNarrativeMap = narrativeEntries?.length\n ? buildStageNarrativeMap(narrativeEntries)\n : new Map<string, string[]>();\n\n // Extract per-stage timings from MetricRecorder if present in snapshot.recorders.\n const stageTimings = extractStageTimings(runtime.recorders);\n\n const snapshots: StageSnapshot[] = [];\n flattenTree(runtime.executionTree, snapshots, runtime.sharedState, 0, runtime.subflowResults, {}, stageNarrativeMap, stageTimings);\n return snapshots;\n}\n\n/**\n * Extracts per-stage duration data from recorder snapshots.\n * MetricRecorder serializes as { name: 'Metrics', data: { stages: { [stageName]: { totalDuration } } } }.\n */\nfunction extractStageTimings(recorders?: RecorderSnapshot[]): Map<string, number> {\n const timings = new Map<string, number>();\n if (!recorders) return timings;\n for (const rec of recorders) {\n if (rec.name === 'Metrics' && rec.data && typeof rec.data === 'object') {\n const data = rec.data as { stages?: Record<string, { totalDuration?: number }> };\n if (data.stages) {\n for (const [stageName, metrics] of Object.entries(data.stages)) {\n if (typeof metrics.totalDuration === 'number' && metrics.totalDuration > 0) {\n timings.set(stageName, Math.round(metrics.totalDuration));\n }\n }\n }\n }\n }\n return timings;\n}\n\n/**\n * Groups narrative entries by stage name, preserving non-stage entries\n * (conditions, forks) attached to the preceding stage.\n */\nfunction buildStageNarrativeMap(entries: NarrativeEntry[]): Map<string, string[]> {\n const map = new Map<string, string[]>();\n let currentStageName: string | undefined;\n\n for (const entry of entries) {\n if (entry.stageName) {\n currentStageName = entry.stageName;\n }\n\n if (currentStageName) {\n if (!map.has(currentStageName)) {\n map.set(currentStageName, []);\n }\n const indent = ' '.repeat(entry.depth);\n map.get(currentStageName)!.push(`${indent}${entry.text}`);\n }\n }\n\n\n return map;\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 stageNarrativeMap: Map<string, string[]> = new Map(),\n stageTimings: Map<string, number> = new Map(),\n): number {\n // Prefer MetricRecorder timing (real wall-clock), then scope.$metric('durationMs'), then 0.\n const stageName = node.name ?? node.id;\n const durationMs =\n (stageName ? stageTimings.get(stageName) : undefined) ??\n (typeof node.metrics?.durationMs === \"number\" ? node.metrics.durationMs : 0);\n\n const startMs = accumulatedMs;\n // Use id for matching (stable, matches spec node ids).\n // name may carry display prefixes like \"[service-name] STAGE\".\n const stageId = node.id || node.name || 'unknown';\n const displayName = node.name || node.id || 'unknown';\n\n // Narrative comes from the library. When not available (e.g. subflow internals\n // where the root recorder only captures enter/exit markers), build a basic\n // narrative from the stage name, description, and data operations.\n // Try id first, then name — narrative entries use node.name (may be prefixed)\n // while snapshot uses node.id (stable). Both need to match for subflows.\n const stageLines = stageNarrativeMap.get(stageId) ?? stageNarrativeMap.get(displayName);\n let narrative: string;\n if (stageLines) {\n narrative = stageLines.join('\\n');\n } else {\n const parts: string[] = [`${displayName} executed.`];\n if (node.description) parts.push(node.description);\n if (node.stageWrites) {\n const keys = Object.keys(node.stageWrites);\n if (keys.length > 0) parts.push(`Wrote: ${keys.join(', ')}`);\n }\n narrative = parts.join('\\n');\n }\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 const sfResult = subflowResults?.[node.subflowId ?? stageId];\n\n out.push({\n stageName: displayName,\n stageLabel: stageId,\n runtimeStageId: (node as any).runtimeStageId ?? undefined,\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, stageNarrativeMap, stageTimings);\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, stageNarrativeMap, stageTimings);\n }\n\n return nextMs;\n}\n\n/**\n * Converts a footprintjs SubflowResult (stored on StageSnapshot.subflowResult)\n * into visualization snapshots for drill-down views.\n *\n * SubflowResult shape (from footprintjs):\n * { subflowId, subflowName, treeContext: { globalContext, stageContexts, history }, parentStageId }\n *\n * Returns empty array if the input is not a valid SubflowResult.\n */\nexport function subflowResultToSnapshots(\n subflowResult: unknown,\n narrativeEntries?: NarrativeEntry[],\n): StageSnapshot[] {\n if (!subflowResult || typeof subflowResult !== 'object') return [];\n const sf = subflowResult as {\n subflowId?: string;\n treeContext?: {\n globalContext?: Record<string, unknown>;\n stageContexts?: unknown;\n history?: unknown[];\n };\n };\n if (!sf.treeContext?.stageContexts) return [];\n\n const runtime: RuntimeSnapshot = {\n sharedState: sf.treeContext.globalContext ?? {},\n executionTree: sf.treeContext.stageContexts as RuntimeStageSnapshot,\n commitLog: sf.treeContext.history ?? [],\n };\n\n const snapshots = toVisualizationSnapshots(runtime, narrativeEntries);\n\n // Strip subflow prefix from stage names so they match the spec node names.\n // Runtime names are prefixed (e.g., \"analyze/SeedScope\") but spec nodes\n // use unprefixed names (e.g., \"SeedScope\").\n const prefix = sf.subflowId ? `${sf.subflowId}/` : '';\n if (prefix) {\n for (const snap of snapshots) {\n if (snap.stageName.startsWith(prefix)) {\n snap.stageName = snap.stageName.slice(prefix.length);\n }\n if (snap.stageLabel.startsWith(prefix)) {\n snap.stageLabel = snap.stageLabel.slice(prefix.length);\n }\n }\n }\n\n return snapshots;\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","/**\n * MemoryPanel — Commit-history based view of pipeline state.\n *\n * Shows accumulated memory at the selected snapshot + what changed.\n * Data source: Scope Recorder (transactional state from SharedMemory).\n *\n * This is a thin composition of MemoryInspector + ScopeDiff — no logic\n * of its own, just correct data derivation from snapshots + index.\n */\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme } from \"../../theme\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { ScopeDiff } from \"../ScopeDiff\";\n\nexport interface MemoryPanelProps extends BaseComponentProps {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n}\n\nexport function MemoryPanel({\n snapshots,\n selectedIndex,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: MemoryPanelProps) {\n const prevMemory = selectedIndex > 0\n ? snapshots[selectedIndex - 1]?.memory ?? null\n : null;\n const currMemory = snapshots[selectedIndex]?.memory ?? {};\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"memory-panel\">\n <MemoryInspector snapshots={snapshots} selectedIndex={selectedIndex} unstyled />\n <ScopeDiff previous={prevMemory} current={currMemory} unstyled />\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n data-fp=\"memory-panel\"\n >\n <MemoryInspector snapshots={snapshots} selectedIndex={selectedIndex} size={size} />\n <div style={{ borderTop: `1px solid ${theme.border}` }}>\n <ScopeDiff previous={prevMemory} current={currMemory} hideUnchanged size={size} />\n </div>\n </div>\n );\n}\n","/**\n * NarrativePanel — Recorder-based view of pipeline execution.\n *\n * Renders the execution narrative with progressive reveal synced to\n * snapshot index. Prefers structured NarrativeEntries (from\n * CombinedNarrativeRecorder) when available, falls back to plain\n * narrative lines built from per-stage snapshot.narrative fields.\n *\n * Data source: FlowRecorder (fires AFTER stage execution)\n */\nimport { useMemo, useState, useCallback } from \"react\";\nimport type { StageSnapshot, NarrativeEntry, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { StoryNarrative } from \"../StoryNarrative\";\nimport { NarrativeTrace } from \"../NarrativeTrace\";\n\nexport interface NarrativePanelProps extends BaseComponentProps {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n /** Structured narrative entries (preferred — richer rendering) */\n narrativeEntries?: NarrativeEntry[];\n /** Plain narrative lines (fallback) */\n narrative?: string[];\n}\n\nexport function NarrativePanel({\n snapshots,\n selectedIndex,\n narrativeEntries,\n narrative: narrativeProp,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativePanelProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n // Build plain narrative from snapshots if not provided\n const narrative = useMemo<string[]>(() => {\n if (narrativeProp && narrativeProp.length > 0) return narrativeProp;\n const lines: string[] = [];\n for (const snap of snapshots) {\n const stageLines = (snap.narrative ?? \"\").split(\"\\n\").filter(Boolean);\n lines.push(...stageLines);\n }\n return lines;\n }, [narrativeProp, snapshots]);\n\n // Progressive reveal for plain narrative\n const revealedCount = useMemo(() => {\n if (snapshots.length === 0 || narrative.length === 0) return narrative.length;\n const stageBoundaries: number[] = [];\n for (let i = 0; i < narrative.length; i++) {\n const trimmed = narrative[i].trimStart();\n if (trimmed.startsWith(\"Stage \") && !trimmed.match(/^Stage\\s+\\d+:\\s*Step\\s/)) {\n stageBoundaries.push(i);\n }\n }\n if (stageBoundaries.length === 0) {\n const ratio = (selectedIndex + 1) / snapshots.length;\n return Math.max(1, Math.ceil(narrative.length * ratio));\n }\n const groupsToShow = Math.min(selectedIndex + 1, stageBoundaries.length);\n const endIdx = groupsToShow < stageBoundaries.length\n ? stageBoundaries[groupsToShow]\n : narrative.length;\n return Math.max(1, endIdx);\n }, [snapshots.length, selectedIndex, narrative]);\n\n // Position-based sync: for each snapshot, find the range of entries that belong\n // to it by matching snapshot stageLabel/stageName against entry stageId/stageName.\n // Handles loops (same stageId at different positions) correctly because we walk\n // entries sequentially and consume matches in order.\n const revealedEntryCount = useMemo(() => {\n if (!narrativeEntries?.length || snapshots.length === 0) return 0;\n\n // For each snapshot up to selectedIndex, find entries that belong to it.\n // Walk entries sequentially — each entry is consumed once.\n let entryIdx = 0;\n for (let si = 0; si <= selectedIndex && si < snapshots.length; si++) {\n const snap = snapshots[si];\n const keys = new Set<string>();\n if (snap.stageLabel) keys.add(snap.stageLabel);\n if (snap.stageName) keys.add(snap.stageName);\n if (snap.subflowId) keys.add(snap.subflowId);\n\n // Advance past entries that match this snapshot's keys\n // First, find the start of this snapshot's entries\n let found = false;\n for (let j = entryIdx; j < narrativeEntries.length; j++) {\n const e = narrativeEntries[j] as { stageId?: string; subflowId?: string; stageName?: string };\n const eKey = e.stageId ?? e.subflowId ?? e.stageName;\n if (eKey && keys.has(eKey)) {\n found = true;\n entryIdx = j;\n break;\n }\n // Entries with no key belong to previous snapshot — include them\n if (!eKey && !found) {\n // Keep advancing\n }\n }\n\n if (!found) continue;\n\n // Now consume all consecutive entries that belong to this snapshot\n while (entryIdx < narrativeEntries.length) {\n const e = narrativeEntries[entryIdx] as { stageId?: string; subflowId?: string; stageName?: string };\n const eKey = e.stageId ?? e.subflowId ?? e.stageName;\n if (eKey && !keys.has(eKey)) break; // next snapshot's entry\n entryIdx++;\n }\n }\n return entryIdx;\n }, [narrativeEntries, snapshots, selectedIndex]);\n\n const hasStructured = narrativeEntries && narrativeEntries.length > 0;\n\n // ── Copy as LLM-ready text ─────────────────────────────────────────────\n const [copied, setCopied] = useState(false);\n\n const buildLLMNarrative = useCallback(() => {\n if (!narrativeEntries?.length) {\n return narrative.join(\"\\n\");\n }\n\n // ── Partition entries: root vs subflow internals ─────────────────\n // Root includes: stages, subflow entry/exit markers, decisions, loops, breaks\n // Subflow internals: entries with subflowId that aren't entry/exit markers\n const root: NarrativeEntry[] = [];\n const subflows = new Map<string, NarrativeEntry[]>();\n const subflowNames = new Map<string, string>(); // sfId → display name\n\n for (const entry of narrativeEntries) {\n const sfId = (entry as { subflowId?: string }).subflowId;\n if (!sfId) {\n root.push(entry);\n } else {\n // Subflow ENTRY markers go in root (show WHEN the subflow ran).\n // Exit markers (\"Done: X\") are noise — the next stage implies completion.\n if (entry.type === \"subflow\") {\n const isExit = entry.text.startsWith(\"Done:\") || entry.text.startsWith(\"Exiting\");\n if (!isExit) {\n root.push(entry);\n }\n // Track name for the subflow details header\n if (entry.stageName && !isExit) {\n subflowNames.set(sfId, entry.stageName);\n }\n } else {\n // Internal subflow entries go in the subflow detail section\n if (!subflows.has(sfId)) subflows.set(sfId, []);\n subflows.get(sfId)!.push(entry);\n }\n }\n }\n\n // ── Render a list of entries as numbered text ────────────────────\n // Uses only entry.text (already rendered by the NarrativeRenderer).\n // No type prefix — the renderer output IS the narrative.\n const renderEntries = (entries: NarrativeEntry[], opts?: { inSubflow?: string }): string => {\n let counter = 0;\n const lines: string[] = [];\n\n for (const e of entries) {\n // Skip subflow entry/exit in subflow details (redundant — we're already in the section)\n if (opts?.inSubflow && e.type === \"subflow\") continue;\n\n let text = e.text;\n\n // Strip subflow path prefix from stage names inside subflow details.\n // e.g., \"[sf-system-prompt/ResolvePrompt]\" → \"[ResolvePrompt]\"\n // The section header already identifies the subflow.\n if (opts?.inSubflow) {\n text = text.replace(new RegExp(`\\\\[${opts.inSubflow}/`), \"[\");\n }\n\n const isHeading = e.type === \"stage\" || e.type === \"subflow\" || e.type === \"fork\" || e.type === \"selector\";\n\n if (isHeading) {\n counter++;\n // For subflow markers in root, append the subflow ID for drill-down\n const sfId = (e as { subflowId?: string }).subflowId;\n const idSuffix = e.type === \"subflow\" && sfId ? ` [→ ${sfId}]` : \"\";\n lines.push(`${counter}. ${text}${idSuffix}`);\n } else {\n // Sub-items (steps, conditions, loops, breaks, errors) — indented\n lines.push(` ${text}`);\n }\n }\n\n return lines.join(\"\\n\");\n };\n\n // ── Assemble the full LLM-ready document ────────────────────────\n const sections: string[] = [];\n sections.push(\"## Execution Narrative\\n\");\n sections.push(renderEntries(root));\n\n if (subflows.size > 0) {\n sections.push(\"\\n\\n## Subflow Details\");\n sections.push(\"Use the subflow IDs above to look up details below.\\n\");\n for (const [sfId, entries] of subflows) {\n const name = subflowNames.get(sfId) ?? sfId;\n sections.push(`### ${name} (${sfId})\\n`);\n sections.push(renderEntries(entries, { inSubflow: sfId }));\n sections.push(\"\");\n }\n }\n\n return sections.join(\"\\n\");\n }, [narrativeEntries, narrative]);\n\n const handleCopy = useCallback(async () => {\n const text = buildLLMNarrative();\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [buildLLMNarrative]);\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-panel\">\n {hasStructured ? (\n <StoryNarrative entries={narrativeEntries!} revealedEntryCount={revealedEntryCount} unstyled />\n ) : (\n <NarrativeTrace narrative={narrative} revealedCount={revealedCount} unstyled />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n data-fp=\"narrative-panel\"\n >\n {/* Intro + Copy button */}\n <div\n style={{\n padding: `${pad - 4}px ${pad}px`,\n fontSize: fs.small,\n color: theme.textMuted,\n borderBottom: `1px solid ${theme.border}`,\n flexShrink: 0,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span style={{ fontStyle: \"italic\" }}>\n What happened at each stage, what data flowed, what decisions were made, and why.\n </span>\n <button\n onClick={handleCopy}\n title=\"Copy narrative as LLM-ready text (includes subflow details)\"\n style={{\n background: copied ? theme.success : theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: 4,\n padding: \"2px 8px\",\n fontSize: fs.small,\n color: copied ? \"#fff\" : theme.textSecondary,\n cursor: \"pointer\",\n flexShrink: 0,\n marginLeft: 8,\n transition: \"all 0.2s\",\n }}\n >\n {copied ? \"Copied!\" : \"Copy for LLM\"}\n </button>\n </div>\n {hasStructured ? (\n <StoryNarrative\n entries={narrativeEntries!}\n revealedEntryCount={revealedEntryCount}\n size={size}\n style={{ flex: 1 }}\n />\n ) : (\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n size={size}\n style={{ flex: 1 }}\n />\n )}\n </div>\n );\n}\n","/**\n * StoryNarrative — Rich rendering of structured narrative entries.\n *\n * Recorder-based view: renders CombinedNarrativeRecorder output with\n * progressive reveal synced to snapshot index. Each entry is typed\n * (stage, step, condition, fork, subflow, loop, break, error) and\n * rendered with appropriate icon + indentation.\n *\n * Data source: FlowRecorder (fires AFTER stage execution)\n */\nimport { useMemo, useRef, useEffect } from \"react\";\nimport type { NarrativeEntry, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface StoryNarrativeProps extends BaseComponentProps {\n /** Structured narrative entries from CombinedNarrativeRecorder */\n entries: NarrativeEntry[];\n /** Number of entries to reveal (position-based sync from NarrativePanel) */\n revealedEntryCount: number;\n}\n\nconst ENTRY_ICONS: Record<string, { icon: string; color: string; label: string }> = {\n stage: { icon: \"▸\", color: theme.primary, label: \"Stage\" },\n step: { icon: \"·\", color: theme.textMuted, label: \"Data operation\" },\n condition: { icon: \"◇\", color: theme.warning, label: \"Decision\" },\n fork: { icon: \"⑃\", color: theme.primary, label: \"Parallel\" },\n selector: { icon: \"⑃\", color: theme.primary, label: \"Selector\" },\n subflow: { icon: \"↳\", color: theme.textSecondary, label: \"Subflow\" },\n loop: { icon: \"↻\", color: theme.warning, label: \"Loop\" },\n break: { icon: \"■\", color: theme.error, label: \"Break\" },\n error: { icon: \"✗\", color: theme.error, label: \"Error\" },\n};\n\nexport function StoryNarrative({\n entries,\n revealedEntryCount,\n size = \"default\",\n unstyled = false,\n className,\n style: outerStyle,\n}: StoryNarrativeProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n // Position-based reveal: NarrativePanel computes the cut point based on\n // section boundaries (stage entries). This handles loops (same stageId,\n // different iterations) and subflow repeats correctly.\n const revealedCount = revealedEntryCount;\n\n // Filter revealed entries: show root-level entries + subflow Entering/Exiting markers.\n // Subflow internal entries (stage, step, condition inside a subflow) are hidden —\n // they appear in the drill-down view.\n const revealed = useMemo(() => {\n const raw = entries.slice(0, revealedCount);\n return raw.filter((e) => {\n const sfId = (e as { subflowId?: string }).subflowId;\n if (!sfId) return true; // root-level — always show\n if (e.type === \"subflow\") return true; // Entering/Exiting markers — show\n return false; // internal subflow entries — hide (drill-down only)\n });\n }, [entries, revealedCount]);\n // Future count: only count entries that would actually be shown (same filter as revealed)\n const futureCount = useMemo(() => {\n let count = 0;\n for (let i = revealedCount; i < entries.length; i++) {\n const e = entries[i] as { subflowId?: string };\n if (!e.subflowId || entries[i].type === \"subflow\") count++;\n }\n return count;\n }, [entries, revealedCount]);\n\n const latestRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n latestRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [revealed.length]);\n\n // Compute heading numbers for each revealed entry.\n // Flat sequential counter matching flowchart traversal (DFS visit order):\n // 1. [Stage: Seed] ...\n // 2. [Subflow: SystemPrompt] ...\n // 3. [Subflow: Messages] ...\n // 4. [Stage: ApplyPreparedMessages] ...\n //\n // Counter increments on: stage, subflow entry, condition, first fork in sequence.\n // No counter on: step, subflow exit, loop, break, error, subsequent forks.\n const numberedEntries = useMemo(() => {\n let counter = 0;\n // Track subflow enter/exit: first occurrence of type=subflow per stageId = enter, second = exit.\n const subflowSeen = new Set<string>();\n let prevType = \"\";\n\n return revealed.map((entry) => {\n // Strip legacy \"Stage N: \" prefix from text (default renderer)\n let cleanText = entry.text;\n cleanText = cleanText.replace(/^Stage \\d+:\\s*/, \"\");\n // Detect fork type BEFORE stripping prefix\n const isSelector = entry.type === \"fork\" && entry.text.includes(\"[Selected]\");\n cleanText = cleanText.replace(/^\\[(Selected|Parallel)\\]:\\s*/, \"\");\n\n // ── Subflow: detect enter vs exit by toggle ──\n if (entry.type === \"subflow\") {\n // Use stageId as toggle key (unique per subflow visit).\n // Fall back to text for renderers that don't set stageId.\n const toggleKey = (entry as { stageId?: string }).stageId ?? entry.text;\n const isExit = subflowSeen.has(toggleKey);\n if (!isExit) {\n subflowSeen.add(toggleKey);\n counter++;\n return {\n ...entry,\n heading: `${counter}`,\n headingType: \"Subflow\",\n text: cleanText,\n isHeading: true,\n isSubflow: true,\n };\n }\n // Exit marker — no heading, will be hidden in render\n return { ...entry, heading: null, isHeading: false, isSubflowExit: true };\n }\n\n // ── Stage ──\n if (entry.type === \"stage\") {\n counter++;\n return { ...entry, heading: `${counter}`, headingType: \"Stage\", text: cleanText, isHeading: true };\n }\n\n // ── Condition (decision) — nested under the preceding stage, no separate number ──\n if (entry.type === \"condition\") {\n return { ...entry, heading: null, headingType: \"Decision\", text: cleanText, isHeading: false };\n }\n\n // ── Fork / Selector — first in sequence gets number ──\n if (entry.type === \"fork\" || entry.type === \"selector\") {\n const isForkHeading = prevType !== \"fork\" && prevType !== \"selector\";\n prevType = entry.type;\n if (isForkHeading) {\n counter++;\n const typeLabel = entry.type === \"selector\" || isSelector ? \"Selector\" : \"Fork\";\n return { ...entry, heading: `${counter}`, headingType: typeLabel, text: cleanText, isHeading: true };\n }\n return { ...entry, heading: null, isHeading: false, text: cleanText };\n }\n\n prevType = entry.type;\n // loop, break, step, error — no heading number\n // Loop is a back-edge (not a new node), break is termination signal\n return { ...entry, heading: null, isHeading: false };\n });\n }, [revealed]);\n\n if (unstyled) {\n return (\n <div className={className} style={outerStyle} data-fp=\"story-narrative\" role=\"log\">\n {numberedEntries.map((entry, i) => {\n if ((entry as any).isSubflowExit) return null;\n const ht = (entry as any).headingType;\n return (\n <div key={i} data-fp=\"narrative-entry\" data-type={entry.type}>\n {entry.heading\n ? entry.text.startsWith('[')\n ? `${entry.heading}. ${entry.text}`\n : `${entry.heading}. [${ht}: ${entry.stageName ?? ''}] ${entry.text}`\n : entry.text}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n flex: 1,\n overflow: \"auto\",\n padding: pad,\n fontFamily: theme.fontSans,\n ...outerStyle,\n }}\n data-fp=\"story-narrative\"\n role=\"log\"\n aria-label=\"Execution narrative\"\n >\n {numberedEntries.map((entry, i) => {\n // Skip subflow exit markers — entry marker is enough\n if ((entry as any).isSubflowExit) return null;\n\n const meta = ENTRY_ICONS[entry.type] ?? ENTRY_ICONS.step;\n const isHeading = entry.isHeading;\n const isDecision = entry.type === \"condition\";\n const isError = entry.type === \"error\";\n const isBreak = entry.type === \"break\";\n const isSubflow = (entry as any).isSubflow;\n const isLast = i === numberedEntries.length - 1;\n const headingType = (entry as any).headingType as string | undefined;\n\n return (\n <div\n key={i}\n ref={isLast ? latestRef : undefined}\n style={{\n display: \"flex\",\n gap: 8,\n padding: isHeading ? `${pad - 4}px 0` : `2px 0`,\n marginLeft: entry.depth * 16,\n borderBottom: isHeading ? `1px solid ${theme.border}` : undefined,\n marginTop: isHeading && i > 0 ? 8 : 0,\n }}\n >\n <span\n style={{\n color: meta.color,\n fontWeight: 700,\n fontSize: isHeading ? fs.body : fs.small,\n width: 16,\n textAlign: \"center\",\n flexShrink: 0,\n }}\n title={meta.label}\n aria-label={meta.label}\n >\n {meta.icon}\n </span>\n <span\n style={{\n fontSize: isHeading ? fs.body : fs.small,\n fontWeight: isHeading ? 600 : 400,\n color: isError || isBreak\n ? theme.error\n : isDecision\n ? theme.warning\n : isHeading\n ? theme.textPrimary\n : theme.textSecondary,\n lineHeight: 1.6,\n fontFamily: entry.type === \"step\" ? theme.fontMono : theme.fontSans,\n }}\n >\n {entry.heading && headingType ? (\n entry.text.startsWith('[') ? (\n <>\n <strong>{entry.heading}.</strong>\n {' '}{entry.text}\n </>\n ) : (\n <>\n <strong>{entry.heading}. [{headingType}{entry.stageName ? `: ${entry.stageName}` : ''}]</strong>\n {' '}{entry.text}\n </>\n )\n ) : entry.text}\n </span>\n </div>\n );\n })}\n\n {/* Future entries — show count hint only, skip full rendering for performance */}\n {futureCount > 0 && (\n <div style={{\n opacity: 0.3,\n fontSize: fs.small,\n color: theme.textMuted,\n padding: `8px 0`,\n fontStyle: \"italic\",\n }}>\n {futureCount} more {futureCount === 1 ? \"entry\" : \"entries\"} ahead...\n </div>\n )}\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 if (!node) return [];\n\n const entries: SubflowTreeEntry[] = [];\n const seen = new Set<string>();\n\n function walk(n: SpecNode) {\n if (!n) return;\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 if (child) 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.subflowId ?? `${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 // Only show subflow entries — the flowchart view handles main stages\n const subflowStages = useMemo(() => tree.filter((e) => e.isSubflow), [tree]);\n\n // Don't render anything if there are no subflows\n if (subflowStages.length === 0) return null;\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>Subflows</SectionLabel>}\n {subflowStages.map((entry, i) => (\n <TreeNode\n key={entry.subflowId ?? `${entry.name}-${i}`}\n entry={entry}\n depth={0}\n activeStage={activeStage}\n doneStages={doneStages}\n onNodeSelect={onNodeSelect}\n />\n ))}\n </div>\n );\n});\n","import { memo } from \"react\";\nimport { theme } from \"../../theme\";\nimport type { BreadcrumbEntry } from \"./useSubflowNavigation\";\n\nexport interface SubflowBreadcrumbProps {\n breadcrumbs: BreadcrumbEntry[];\n onNavigate: (level: number) => void;\n}\n\n/**\n * Breadcrumb bar for subflow drill-down navigation.\n * Shows: Root > SubflowA > SubflowB — clicking any crumb navigates back.\n */\nexport const SubflowBreadcrumb = memo(function SubflowBreadcrumb({\n breadcrumbs,\n onNavigate,\n}: SubflowBreadcrumbProps) {\n if (breadcrumbs.length <= 1) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"6px 12px\",\n background: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n fontSize: 12,\n fontFamily: theme.fontSans,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {breadcrumbs.map((crumb, i) => {\n const isLast = i === breadcrumbs.length - 1;\n return (\n <span key={`${crumb.label}-${i}`} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {i > 0 && (\n <span style={{ color: theme.textMuted, fontSize: 10 }}>\n ›\n </span>\n )}\n {isLast ? (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span\n style={{\n color: theme.primary,\n fontWeight: 600,\n }}\n >\n {crumb.label}\n </span>\n {crumb.description && (\n <span\n style={{\n color: theme.textMuted,\n fontWeight: 400,\n fontSize: 11,\n }}\n >\n — {crumb.description}\n </span>\n )}\n </span>\n ) : (\n <button\n onClick={() => onNavigate(i)}\n style={{\n background: \"none\",\n border: \"none\",\n color: theme.textSecondary,\n cursor: \"pointer\",\n padding: \"2px 4px\",\n borderRadius: 4,\n fontSize: 12,\n fontFamily: \"inherit\",\n fontWeight: 500,\n transition: \"color 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = `${theme.primary}`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = `${theme.textSecondary}`;\n }}\n >\n {crumb.label}\n </button>\n )}\n </span>\n );\n })}\n </div>\n );\n});\n","/**\n * Dumb flowchart renderer — spec + snapshots → ReactFlow graph with overlay.\n *\n * No internal navigation state. The consumer (ExplainableShell) owns\n * drill-down, breadcrumb, and SubflowTree. This component just renders\n * whatever spec + snapshots it receives at any level.\n *\n * Usage:\n * <TracedFlowchartView spec={spec} /> // static\n * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} /> // traced\n */\nimport { useMemo, useCallback, useEffect } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useReactFlow,\n useNodesState,\n useEdgesState,\n} from \"@xyflow/react\";\nimport type { Node, NodeTypes } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport { specToLayout, applyOverlay } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay } from \"./specToReactFlow\";\n\nexport interface TracedFlowchartViewProps extends BaseComponentProps {\n /** Pipeline spec from builder.toSpec() — for the current level */\n spec: SpecNode;\n /** Visualization snapshots (enables trace overlay when provided) */\n snapshots?: StageSnapshot[];\n /** Current time-travel position */\n snapshotIndex?: number;\n /** Callback when a node is clicked (receives snapshot index, or node id if no snapshots) */\n onNodeClick?: (indexOrId: number | string) => void;\n /** Override default node types */\n nodeTypes?: NodeTypes;\n}\n\nconst defaultNodeTypes: NodeTypes = { stage: StageNode as any };\n\n/** Calls fitView when the container resizes (e.g. panel expand/collapse). */\nfunction FitViewOnResize() {\n const { fitView } = useReactFlow();\n useEffect(() => {\n const handler = () => { requestAnimationFrame(() => fitView({ padding: 0.3 })); };\n window.addEventListener(\"resize\", handler);\n // Also fit on mount after layout settles\n const timer = setTimeout(handler, 50);\n return () => { window.removeEventListener(\"resize\", handler); clearTimeout(timer); };\n }, [fitView]);\n return null;\n}\n\nexport function TracedFlowchartView({\n spec,\n snapshots,\n snapshotIndex = 0,\n onNodeClick,\n nodeTypes: customNodeTypes,\n unstyled = false,\n className,\n style,\n}: TracedFlowchartViewProps) {\n const nodeTypes = customNodeTypes ?? defaultNodeTypes;\n\n // Compute execution overlay from snapshots + index\n const overlay = useMemo<ExecutionOverlay | undefined>(() => {\n if (!snapshots || snapshots.length === 0) return undefined;\n const executionOrder = snapshots\n .slice(0, snapshotIndex + 1)\n .map((s) => s.stageLabel);\n const doneStages = new Set(\n snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel)\n );\n const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;\n const executedStages = new Set([...doneStages]);\n if (activeStage) executedStages.add(activeStage);\n\n return { doneStages, activeStage, executedStages, executionOrder };\n }, [snapshots, snapshotIndex]);\n\n // Phase 1: static layout — only recomputes when spec changes\n const layout = useMemo(() => {\n if (!spec) return null;\n return specToLayout(spec);\n }, [spec]);\n\n // Phase 2: apply overlay — cheap, runs per slider tick\n const flowData = useMemo(() => {\n if (!layout) return { nodes: [] as Node[], edges: [] as any[] };\n return applyOverlay(layout, overlay);\n }, [layout, overlay]);\n\n // Explicit state sync — ReactFlow needs setNodes/setEdges to reliably\n // update node data (colors, step numbers) on same-id nodes.\n const [nodes, setNodes, onNodesChange] = useNodesState(flowData.nodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(flowData.edges);\n\n useEffect(() => {\n setNodes(flowData.nodes);\n setEdges(flowData.edges);\n }, [flowData, setNodes, setEdges]);\n\n // Handle node clicks — always send string node id.\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick) return;\n onNodeClick(node.id);\n },\n [onNodeClick]\n );\n\n return (\n <div\n className={className}\n style={{ width: \"100%\", height: \"100%\", ...style }}\n data-fp=\"traced-flowchart\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{ padding: 0.3 }}\n proOptions={{ hideAttribution: true }}\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n <FitViewOnResize />\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","import { memo, useEffect, useRef } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport { theme } from \"../../theme\";\n\nconst KEYFRAMES_ID = \"fp-stage-node-keyframes\";\nconst KEYFRAMES_CSS = `\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fp-pulse {\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 0.15; transform: scale(1.06); }\n }\n @keyframes fp-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n}\n@media (prefers-reduced-motion: reduce) {\n @keyframes fp-pulse { 0%, 100% { opacity: 0.3; } }\n @keyframes fp-blink { 0%, 100% { opacity: 1; } }\n}\n`;\n\nexport interface StageNodeData {\n label: string;\n active?: boolean;\n done?: boolean;\n error?: boolean;\n linked?: boolean;\n /** Semantic icon hint (e.g., \"llm\", \"tool\", \"rag\", \"start\", \"parse\", \"agent\", \"guard\") */\n icon?: string;\n /** Step numbers in execution order (shown as badges — multiple when revisited via loops) */\n stepNumbers?: number[];\n /** Node was not executed (dim it) */\n dimmed?: boolean;\n /** Node is a subflow root (show nested indicator) */\n isSubflow?: boolean;\n /** Node uses lazy resolution (dashed border + cloud icon when unresolved) */\n isLazy?: boolean;\n /** Node is a decider (renders as diamond shape per flowchart convention) */\n isDecider?: boolean;\n /** Node is a fork (parallel fan-out) */\n isFork?: boolean;\n /** Human-readable description of what this stage does */\n description?: string;\n /** Subflow identifier — set when this node belongs to a subflow */\n subflowId?: string;\n [key: string]: unknown;\n}\n\n// ── Stage icon SVGs ───────────────────────────────────────────────────────\n// Inline SVGs for crisp rendering at any size. Consumers pass a string key\n// via SpecNode.icon; StageNode renders the matching mini-icon.\n\nconst ICON_SIZE = 16;\n\nfunction StageIcon({ type, color }: { type: string; color: string }) {\n const s = ICON_SIZE;\n const props = { width: s, height: s, viewBox: `0 0 ${s} ${s}`, fill: \"none\", style: { flexShrink: 0 } as const };\n\n switch (type) {\n // LLM / AI call — brain/sparkle\n case \"llm\":\n case \"ai\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M5.5 8C5.5 6.5 6.5 5 8 5S10.5 6.5 10.5 8\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"9.5\" r=\"1\" fill={color} />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"3.5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"12.5\" y1=\"4\" x2=\"11.2\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"3.5\" y1=\"4\" x2=\"4.8\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Tool / function call — gear\n case \"tool\":\n case \"function\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke={color} strokeWidth=\"1.5\" />\n {[0, 45, 90, 135, 180, 225, 270, 315].map((angle) => {\n const rad = (angle * Math.PI) / 180;\n const x1 = 8 + Math.cos(rad) * 4.5;\n const y1 = 8 + Math.sin(rad) * 4.5;\n const x2 = 8 + Math.cos(rad) * 6;\n const y2 = 8 + Math.sin(rad) * 6;\n return <line key={angle} x1={x1} y1={y1} x2={x2} y2={y2} stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />;\n })}\n </svg>\n );\n\n // RAG / retrieval — magnifying glass + doc\n case \"rag\":\n case \"search\":\n case \"retrieval\":\n return (\n <svg {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" stroke={color} strokeWidth=\"1.5\" />\n <line x1=\"10\" y1=\"10\" x2=\"13.5\" y2=\"13.5\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"6\" x2=\"8.5\" y2=\"6\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"8\" x2=\"7.5\" y2=\"8\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Parse / process — diamond with arrows\n case \"parse\":\n case \"process\":\n case \"transform\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke={color} strokeWidth=\"1.5\" transform=\"rotate(45 8 8)\" />\n </svg>\n );\n\n // Start / seed — play triangle\n case \"start\":\n case \"seed\":\n case \"init\":\n return (\n <svg {...props}>\n <path d=\"M5 3.5L12.5 8L5 12.5V3.5Z\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // End / finalize — stop square\n case \"end\":\n case \"finalize\":\n case \"output\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // Agent — person silhouette\n case \"agent\":\n case \"orchestrator\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M3.5 14C3.5 11 5.5 9 8 9S12.5 11 12.5 14\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Swarm — multi-agent\n case \"swarm\":\n case \"multi-agent\":\n return (\n <svg {...props}>\n <circle cx=\"5\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"11\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"8\" cy=\"11\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <line x1=\"5\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n <line x1=\"11\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n );\n\n // Guard / guardrail — shield\n case \"guard\":\n case \"guardrail\":\n case \"validate\":\n return (\n <svg {...props}>\n <path d=\"M8 2L3 5V9C3 11.5 5 13.5 8 14.5C11 13.5 13 11.5 13 9V5L8 2Z\" stroke={color} strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M6 8L7.5 9.5L10 6.5\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n // Stream — wave\n case \"stream\":\n case \"streaming\":\n return (\n <svg {...props}>\n <path d=\"M2 8C4 5 6 11 8 8S12 5 14 8\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M2 11C4 8 6 14 8 11S12 8 14 11\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.5\" />\n </svg>\n );\n\n // Memory / state — database cylinder\n case \"memory\":\n case \"state\":\n case \"db\":\n return (\n <svg {...props}>\n <ellipse cx=\"8\" cy=\"4.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"3\" y1=\"4.5\" x2=\"3\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <ellipse cx=\"8\" cy=\"11.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n </svg>\n );\n\n // Loop — circular arrow\n case \"loop\":\n case \"retry\":\n return (\n <svg {...props}>\n <path d=\"M12 8A4 4 0 1 1 8 4\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M8 1.5L10.5 4L8 6.5\" stroke={color} strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\n </svg>\n );\n\n // Lazy / service — cloud (deferred resolution, loaded on demand)\n case \"lazy\":\n case \"service\":\n case \"cloud\":\n return (\n <svg {...props}>\n <path\n d=\"M4.5 12C2.8 12 1.5 10.7 1.5 9C1.5 7.5 2.5 6.3 3.8 6C4 4 5.8 2.5 8 2.5C9.8 2.5 11.3 3.5 11.9 5C13.9 5.2 15.5 6.8 15.5 8.8C15.5 10.8 13.9 12.5 11.8 12.5H4.5\"\n stroke={color}\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n\n // Decision — diamond (already handled by isDecider shape)\n case \"decision\":\n case \"router\":\n return (\n <svg {...props}>\n <path d=\"M8 2L14 8L8 14L2 8Z\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill={color} />\n </svg>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Custom ReactFlow node for pipeline stages.\n * All colors and fonts come from `--fp-*` CSS variables (via theme).\n * Shows execution state via color, icon, step badge, and pulse animation.\n */\nexport const StageNode = memo(function StageNode({\n data,\n}: NodeProps & { data: StageNodeData }) {\n const { label, active, done, error, linked, icon, stepNumbers, dimmed, isSubflow, isLazy, isDecider, isFork, description } = data;\n\n // Lazy nodes show cloud icon by default (unless another icon is specified)\n const effectiveIcon = icon || (isLazy ? \"lazy\" : undefined);\n // Lazy + unresolved = dashed border\n const isLazyUnresolved = isLazy && !done && !active;\n\n // Inject keyframes once into document head\n const injectedRef = useRef(false);\n useEffect(() => {\n if (injectedRef.current) return;\n if (typeof document !== \"undefined\" && !document.getElementById(KEYFRAMES_ID)) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = KEYFRAMES_ID;\n styleEl.textContent = KEYFRAMES_CSS;\n document.head.appendChild(styleEl);\n }\n injectedRef.current = true;\n }, []);\n\n const isOnPath = active || done;\n\n const bg = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.bgSecondary;\n\n const borderColor = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.border;\n\n const shadow = active\n ? `0 0 16px color-mix(in srgb, ${theme.primary} 40%, transparent)`\n : done\n ? `0 0 8px color-mix(in srgb, ${theme.success} 20%, transparent)`\n : error\n ? `0 0 12px color-mix(in srgb, ${theme.error} 30%, transparent)`\n : `0 2px 8px rgba(0,0,0,0.15)`;\n\n // Colored states use white for contrast; default uses consumer's text color.\n const textColor =\n active || done || error ? \"#fff\" : theme.textPrimary;\n\n return (\n <>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n {/* Step number badges — multiple when revisited via loops */}\n {stepNumbers && stepNumbers.length > 0 && isOnPath && (\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: -10,\n display: \"flex\",\n gap: 3,\n zIndex: 10,\n }}\n >\n {stepNumbers.map((num, i) => {\n const isLatest = i === stepNumbers.length - 1;\n const badgeBg = isLatest && active ? theme.primary : theme.success;\n const glow = isLatest && active\n ? `color-mix(in srgb, ${theme.primary} 50%, transparent)`\n : `color-mix(in srgb, ${theme.success} 40%, transparent)`;\n return (\n <div\n key={num}\n style={{\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: badgeBg,\n color: \"#fff\",\n fontSize: 11,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: `0 0 8px ${glow}`,\n }}\n >\n {num}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Linked pulse ring */}\n {linked && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.4,\n animation: \"fp-pulse 2s ease-in-out infinite\",\n }}\n />\n )}\n\n {/* Active node pulse ring */}\n {active && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.3,\n animation: \"fp-pulse 1.5s ease-out infinite\",\n }}\n />\n )}\n\n {/* Diamond for decider nodes — proper diamond via clip-path */}\n {isDecider ? (\n <div style={{ position: \"relative\", width: 120, height: 72 }}>\n {/* Diamond shape layer */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: bg,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n border: \"none\",\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n }}\n />\n {/* Border layer — slightly larger diamond behind */}\n <div\n style={{\n position: \"absolute\",\n inset: -2,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n background: borderColor,\n zIndex: -1,\n ...(isLazyUnresolved ? {\n background: \"transparent\",\n // Dashed border via SVG for clip-path (CSS border doesn't work with clip-path)\n } : {}),\n }}\n />\n {/* Content — centered on top of diamond */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 1,\n fontFamily: theme.fontSans,\n zIndex: 1,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n {!effectiveIcon && (\n <span style={{ fontSize: 9, color: textColor }}>◇</span>\n )}\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n </div>\n {description && (\n <span\n style={{\n fontSize: 8,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 100,\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n ) : (\n /* Standard rectangular node */\n <div\n style={{\n background: bg,\n border: `2px ${isLazyUnresolved ? \"dashed\" : \"solid\"} ${borderColor}`,\n borderRadius: theme.radius,\n padding: description ? \"8px 16px\" : \"10px 20px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: description ? 2 : 0,\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n fontFamily: theme.fontSans,\n minWidth: 100,\n justifyContent: \"center\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {/* Semantic icon (lazy nodes default to cloud icon) */}\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n\n {/* State icon */}\n {done && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✓</span>\n )}\n {active && !effectiveIcon && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: \"#fff\",\n animation: \"fp-blink 1s ease-in-out infinite\",\n flexShrink: 0,\n }}\n />\n )}\n {error && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✗</span>\n )}\n\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n {/* Subflow indicator — nested boxes icon */}\n {isSubflow && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: 3,\n border: `1.5px solid ${textColor}`,\n position: \"relative\",\n opacity: 0.7,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: 2,\n border: `1px solid ${textColor}`,\n }}\n />\n </span>\n )}\n </div>\n {/* Description subtitle */}\n {description && (\n <span\n style={{\n fontSize: 10,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 160,\n }}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {/* Right-side handles for loop-back edges (so they don't overlap center edges) */}\n <Handle\n id=\"loop-source\"\n type=\"source\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n <Handle\n id=\"loop-target\"\n type=\"target\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n </>\n );\n});\n","/**\n * Converts a SerializedPipelineStructure (from builder.toSpec()) into\n * ReactFlow nodes and edges with auto-layout.\n *\n * Two-phase approach for performance:\n * 1. `specToLayout(spec)` — tree walk + positioning (expensive, cached on spec)\n * 2. `applyOverlay(layout, overlay)` — color nodes/edges (cheap, runs per slider tick)\n *\n * `specToReactFlow(spec, overlay)` combines both for convenience.\n */\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { rawDefaults } from \"../../theme/tokens\";\n\nexport interface SpecNode {\n name: string;\n id?: string;\n type?: \"stage\" | \"decider\" | \"selector\" | \"fork\" | \"streaming\";\n /** Semantic icon hint — rendered by StageNode. Common values:\n * \"llm\", \"tool\", \"rag\", \"search\", \"parse\", \"start\", \"end\", \"loop\",\n * \"agent\", \"swarm\", \"guard\", \"stream\", \"memory\" */\n icon?: string;\n description?: string;\n children?: SpecNode[];\n next?: SpecNode;\n branchIds?: string[];\n hasDecider?: boolean;\n hasSelector?: boolean;\n loopTarget?: string;\n isSubflowRoot?: boolean;\n subflowId?: string;\n subflowName?: string;\n subflowStructure?: SpecNode;\n /** True when this subflow uses lazy resolution (deferred until execution). */\n isLazy?: boolean;\n}\n\nexport interface ExecutionOverlay {\n /** Names of stages that have completed (before the active one) */\n doneStages: Set<string>;\n /** Name of the currently active stage */\n activeStage: string | null;\n /** Names of all stages that were executed (done + active) */\n executedStages: Set<string>;\n /** Ordered list of executed stage names (for step numbering) */\n executionOrder?: string[];\n}\n\n/** Colors for the flowchart — consumer provides these to match their theme */\nexport interface FlowchartColors {\n edgeDefault: string;\n edgeExecuted: string;\n edgeActive: string;\n edgeLoop: string;\n labelDefault: string;\n labelExecuted: string;\n labelLoop: string;\n pathGlow: string;\n}\n\n/** Default colors derived from raw theme defaults. Consumer can override per-call. */\nconst DEFAULT_COLORS: FlowchartColors = {\n edgeDefault: rawDefaults.colors.textMuted,\n edgeExecuted: rawDefaults.colors.success,\n edgeActive: rawDefaults.colors.primary,\n edgeLoop: rawDefaults.colors.warning,\n labelDefault: rawDefaults.colors.textSecondary,\n labelExecuted: rawDefaults.colors.success,\n labelLoop: rawDefaults.colors.warning,\n pathGlow: `${rawDefaults.colors.success}4D`, // ~30% opacity hex\n};\n\n// ---------------------------------------------------------------------------\n// Phase 1: Static layout (expensive — depends only on spec)\n// ---------------------------------------------------------------------------\n\n/** A positioned node with all static info, before overlay is applied. */\nexport interface LayoutNode {\n id: string;\n x: number;\n y: number;\n label: string;\n isDecider: boolean;\n isFork: boolean;\n description?: string;\n icon?: string;\n subflowId?: string;\n isSubflow: boolean;\n isLazy?: boolean;\n}\n\n/** A positioned edge with source/target info. */\nexport interface LayoutEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n isLoop: boolean;\n}\n\n/** Static layout output — positions + structure, no execution state. */\nexport interface SpecLayout {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n /** Maps stage ID → node id for resolving loopTarget references. */\n idToName: Map<string, string>;\n}\n\nconst Y_STEP = 100;\nconst X_SPREAD = 200;\n\nfunction nid(n: SpecNode): string {\n return n.id || n.name || `spec-${Math.random()}`;\n}\n\ninterface WalkState {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n edgeCounter: number;\n seen: Set<string>;\n idToName: Map<string, string>;\n}\n\nfunction registerNode(state: WalkState, node: SpecNode): void {\n if (node.id && node.name) {\n state.idToName.set(node.id, node.name);\n }\n}\n\nfunction walkLayout(\n node: SpecNode,\n state: WalkState,\n x: number,\n y: number,\n): { lastIds: string[]; bottomY: number } {\n if (!node) return { lastIds: [], bottomY: y };\n registerNode(state, node);\n const id = nid(node);\n\n if (state.seen.has(id)) {\n return { lastIds: [id], bottomY: y };\n }\n state.seen.add(id);\n\n const isDecider = node.type === \"decider\" || node.type === \"selector\" || !!node.hasDecider || !!node.hasSelector;\n const isFork = node.type === \"fork\";\n\n state.nodes.push({\n id,\n x,\n y,\n label: node.name,\n isDecider,\n isFork,\n description: node.description,\n icon: node.icon,\n subflowId: node.subflowId,\n isSubflow: !!node.isSubflowRoot,\n isLazy: node.isLazy,\n });\n\n let lastIds = [id];\n let bottomY = y;\n\n // Handle children (fork/decider branches)\n if (node.children && node.children.length > 0) {\n const totalWidth = (node.children.length - 1) * X_SPREAD;\n const startX = x - totalWidth / 2;\n const childY = y + Y_STEP;\n const childResults: { lastIds: string[]; bottomY: number }[] = [];\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const childX = startX + i * X_SPREAD;\n const edgeLabel = node.branchIds?.[i];\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: nid(child), label: edgeLabel, isLoop: false });\n const result = walkLayout(child, state, childX, childY);\n childResults.push(result);\n }\n\n lastIds = childResults.flatMap((r) => r.lastIds);\n bottomY = Math.max(...childResults.map((r) => r.bottomY));\n }\n\n // Loop-back edge\n if (node.loopTarget) {\n // loopTarget is a stage ID — use it directly (ReactFlow node IDs = spec node IDs)\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: node.loopTarget, label: \"loop\", isLoop: true });\n }\n\n // Linear continuation\n if (node.next) {\n const rawNextId = nid(node.next);\n const resolvedNextId = state.idToName.get(rawNextId) ?? rawNextId;\n const isLoopRef = node.loopTarget && state.seen.has(resolvedNextId);\n\n if (isLoopRef) {\n // Add dotted back-edge for the loop reference\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, label: \"loop\", isLoop: true });\n }\n return { lastIds, bottomY };\n }\n\n const nextY = bottomY + Y_STEP;\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, isLoop: false });\n }\n return walkLayout(node.next, state, x, nextY);\n }\n\n return { lastIds, bottomY };\n}\n\n/**\n * Phase 1: Compute static layout from spec. Cached on spec reference — only\n * recomputes when the pipeline structure changes, not on every slider tick.\n */\nexport function specToLayout(spec: SpecNode): SpecLayout {\n const state: WalkState = {\n nodes: [],\n edges: [],\n edgeCounter: 0,\n seen: new Set(),\n idToName: new Map(),\n };\n walkLayout(spec, state, 300, 0);\n return { nodes: state.nodes, edges: state.edges, idToName: state.idToName };\n}\n\n// ---------------------------------------------------------------------------\n// Phase 2: Apply overlay (cheap — runs per slider tick)\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 2: Apply execution overlay to static layout.\n * Produces ReactFlow nodes/edges with correct colors, step numbers, and glow.\n */\nexport function applyOverlay(\n layout: SpecLayout,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const c = { ...DEFAULT_COLORS, ...colors };\n const o = overlay ?? null;\n\n // Nodes\n const nodes: Node[] = layout.nodes.map((ln) => {\n const isDone = o ? o.doneStages.has(ln.id) : false;\n const isActive = o ? o.activeStage === ln.id : false;\n const wasExecuted = o ? o.executedStages.has(ln.id) : false;\n const dimmed = o && !wasExecuted;\n\n let stepNumbers: number[] | undefined;\n if (o?.executionOrder) {\n const nums: number[] = [];\n for (let i = 0; i < o.executionOrder.length; i++) {\n if (o.executionOrder[i] === ln.id) nums.push(i + 1);\n }\n if (nums.length > 0) stepNumbers = nums;\n }\n\n return {\n id: ln.id,\n position: { x: ln.x, y: ln.y },\n data: {\n label: ln.label,\n active: isActive,\n done: isDone,\n error: false,\n isDecider: ln.isDecider,\n isFork: ln.isFork,\n description: ln.description,\n icon: ln.icon,\n subflowId: ln.subflowId,\n dimmed,\n stepNumbers,\n isSubflow: ln.isSubflow,\n isLazy: ln.isLazy,\n },\n type: \"stage\" as const,\n style: dimmed ? { opacity: 0.35 } : undefined,\n };\n });\n\n // Edges\n const edges: Edge[] = [];\n for (const le of layout.edges) {\n const executed = o && o.executedStages.has(le.source) && o.executedStages.has(le.target);\n const isLeadingEdge = o && le.source === o.activeStage && !o.doneStages.has(le.target);\n\n if (le.isLoop) {\n let loopExecuted = false;\n if (o?.executionOrder) {\n const lastSourceIdx = o.executionOrder.lastIndexOf(le.source);\n if (lastSourceIdx >= 0) {\n loopExecuted = o.executionOrder.slice(lastSourceIdx + 1).includes(le.target);\n }\n }\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n sourceHandle: \"loop-source\",\n targetHandle: \"loop-target\",\n label: le.label ?? \"loop\",\n type: \"smoothstep\",\n pathOptions: { offset: 40, borderRadius: 16 },\n style: {\n stroke: c.edgeLoop,\n strokeWidth: loopExecuted ? 3 : 2,\n strokeDasharray: \"6 3\",\n opacity: o && !loopExecuted ? 0.35 : 1,\n },\n labelStyle: { fontSize: 10, fontWeight: 700, fill: c.labelLoop },\n animated: loopExecuted,\n zIndex: 2,\n } as Edge);\n } else if (executed) {\n // Glow layer\n edges.push({\n id: `${le.id}-glow`,\n source: le.source,\n target: le.target,\n style: { stroke: c.pathGlow, strokeWidth: 8, opacity: 0.4 },\n zIndex: 0,\n selectable: false,\n focusable: false,\n });\n // Route line\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: isLeadingEdge ? c.edgeActive : c.edgeExecuted,\n strokeWidth: 3.5,\n },\n labelStyle: { fontSize: 10, fontWeight: 600, fill: c.labelExecuted },\n animated: !!isLeadingEdge,\n zIndex: 1,\n });\n } else {\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: c.edgeDefault,\n strokeWidth: 1.5,\n opacity: o ? 0.3 : 1,\n },\n labelStyle: { fontSize: 10, fill: c.labelDefault },\n });\n }\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience: combined single-call (backwards compatible)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a pipeline spec to ReactFlow graph.\n * Pass `overlay` to color nodes/edges by execution state.\n */\nexport function specToReactFlow(\n spec: SpecNode,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const layout = specToLayout(spec);\n return applyOverlay(layout, overlay, colors);\n}\n"],"mappings":"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","names":["jsx","useMemo","jsx","jsxs","useMemo","useState","useMemo","useEffect","useRef","jsx","jsxs","useMemo","useState","useRef","useEffect","useState","useMemo","useRef","useEffect","jsx","jsxs","useState","useRef","useMemo","useEffect","useState","jsx","jsxs","useState","useMemo","jsx","jsxs","v","useMemo","jsx","jsxs","useState","useMemo","useCallback","Fragment","jsx","jsxs","fmt","v","jsxs","jsx","useMemo","Fragment","useState","useCallback","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","memo","useState","useCallback","useMemo","useRef","useEffect","jsx","jsxs","useMemo","useState","useCallback","useMemo","useRef","useEffect","Fragment","jsx","jsxs","useMemo","useRef","useEffect","jsx","jsxs","useMemo","useState","useCallback","useState","useCallback","useMemo","Fragment","jsx","jsxs","TreeNode","useState","useCallback","SectionLabel","SubflowTree","useMemo","memo","jsx","jsxs","memo","SubflowBreadcrumb","useMemo","useCallback","useEffect","memo","useEffect","useRef","Fragment","jsx","jsxs","memo","StageNode","useRef","useEffect","jsx","jsxs","useEffect","useMemo","useCallback","Fragment","jsx","jsxs","memo","HLinePill","VLinePill","DetailsContent","useState","v","useMemo","useRef","useEffect","tabs","useCallback"]}
|