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