footprint-explainable-ui 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flowchart.cjs +77 -59
- package/dist/flowchart.cjs.map +1 -1
- package/dist/flowchart.js +77 -59
- package/dist/flowchart.js.map +1 -1
- package/package.json +8 -1
package/dist/flowchart.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/flowchart.ts","../src/components/FlowchartView/FlowchartView.tsx","../src/components/StageNode/StageNode.tsx","../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/useDarkModeTokens.ts","../src/components/FlowchartView/TracedFlowchartView.tsx","../src/components/FlowchartView/specToReactFlow.ts","../src/components/FlowchartView/SubflowBreadcrumb.tsx","../src/components/FlowchartView/useSubflowNavigation.ts","../src/components/FlowchartView/SubflowTree.tsx","../src/components/TimeTravelDebugger/TimeTravelDebugger.tsx","../src/components/MemoryInspector/MemoryInspector.tsx","../src/components/NarrativeLog/NarrativeLog.tsx","../src/components/GanttTimeline/GanttTimeline.tsx"],"sourcesContent":["// Flowchart components (require @xyflow/react peer dependency)\n// Import from \"footprint-explainable-ui/flowchart\"\n\nexport { FlowchartView } from \"./components/FlowchartView\";\nexport type { FlowchartViewProps } from \"./components/FlowchartView\";\n\nexport { StageNode } from \"./components/StageNode\";\nexport type { StageNodeData } from \"./components/StageNode\";\n\nexport { TimeTravelDebugger } from \"./components/TimeTravelDebugger\";\nexport type { TimeTravelDebuggerProps } from \"./components/TimeTravelDebugger\";\n\nexport { specToReactFlow, specToLayout, applyOverlay } from \"./components/FlowchartView/specToReactFlow\";\nexport type {\n SpecNode,\n ExecutionOverlay,\n FlowchartColors,\n SpecLayout,\n LayoutNode,\n LayoutEdge,\n} from \"./components/FlowchartView/specToReactFlow\";\n\n// Self-contained traced flowchart (spec + snapshots → full visualization)\nexport { TracedFlowchartView } from \"./components/FlowchartView\";\nexport type { TracedFlowchartViewProps } from \"./components/FlowchartView\";\n\n// Subflow drill-down navigation\nexport { SubflowBreadcrumb } from \"./components/FlowchartView\";\nexport type { SubflowBreadcrumbProps } from \"./components/FlowchartView\";\nexport { useSubflowNavigation } from \"./components/FlowchartView\";\nexport type { SubflowNavigation, BreadcrumbEntry } from \"./components/FlowchartView\";\n\n// Subflow manifest tree (no ReactFlow dependency — pure React)\nexport { SubflowTree } from \"./components/FlowchartView\";\nexport type { SubflowTreeProps, SubflowTreeEntry } from \"./components/FlowchartView\";\n","import { useMemo, useCallback } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useNodesState,\n useEdgesState,\n} from \"@xyflow/react\";\nimport type { Node, Edge } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport type { StageNodeData } from \"../StageNode\";\nimport { theme } from \"../../theme\";\n\nexport interface FlowchartViewProps extends BaseComponentProps {\n /** ReactFlow nodes */\n nodes: Node[];\n /** ReactFlow edges */\n edges: Edge[];\n /** Optional snapshots for state-aware rendering (done/active coloring) */\n snapshots?: StageSnapshot[];\n /** Currently selected snapshot index (for state coloring) */\n selectedIndex?: number;\n /** Callback when a node is clicked */\n onNodeClick?: (index: number) => void;\n}\n\nconst nodeTypes = { stageNode: StageNode };\n\n/**\n * Pipeline flowchart visualization using ReactFlow.\n * When snapshots are provided, nodes are colored by execution state.\n */\nexport function FlowchartView({\n nodes: rawNodes,\n edges: rawEdges,\n snapshots,\n selectedIndex = 0,\n onNodeClick,\n unstyled = false,\n className,\n style,\n}: FlowchartViewProps) {\n // Enhance nodes with execution state\n const enhancedNodes = useMemo(() => {\n if (!snapshots || snapshots.length === 0) {\n return rawNodes.map((n) => ({\n ...n,\n type: \"stageNode\",\n data: {\n ...n.data,\n label: (n.data as StageNodeData).label || n.id,\n active: false,\n done: false,\n error: false,\n },\n }));\n }\n\n const doneNames = new Set(\n snapshots.slice(0, selectedIndex).map((s) => s.stageName)\n );\n const activeName = snapshots[selectedIndex]?.stageName;\n\n return rawNodes.map((n) => ({\n ...n,\n type: \"stageNode\",\n data: {\n ...n.data,\n label: (n.data as StageNodeData).label || n.id,\n active: n.id === activeName,\n done: doneNames.has(n.id),\n error: false,\n },\n }));\n }, [rawNodes, snapshots, selectedIndex]);\n\n // Enhance edges with state coloring\n const enhancedEdges = useMemo(() => {\n if (!snapshots || snapshots.length === 0) {\n return rawEdges.map((e) => ({\n ...e,\n style: { stroke: theme.textMuted, strokeWidth: 1.5 },\n animated: false,\n }));\n }\n\n const doneNames = new Set(\n snapshots.slice(0, selectedIndex + 1).map((s) => s.stageName)\n );\n const activeName = snapshots[selectedIndex]?.stageName;\n\n return rawEdges.map((e) => {\n const sourceIsDone = doneNames.has(e.source);\n const isFromActive = e.source === activeName;\n return {\n ...e,\n style: {\n stroke: sourceIsDone ? theme.success : theme.textMuted,\n strokeWidth: 1.5,\n },\n animated: isFromActive,\n };\n });\n }, [rawEdges, snapshots, selectedIndex]);\n\n const [nodes, , onNodesChange] = useNodesState(enhancedNodes);\n const [edges, , onEdgesChange] = useEdgesState(enhancedEdges);\n\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick || !snapshots) return;\n const idx = snapshots.findIndex((s) => s.stageName === node.id);\n if (idx >= 0) onNodeClick(idx);\n },\n [onNodeClick, snapshots]\n );\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style,\n }}\n data-fp=\"flowchart-view\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","import { memo, useEffect, useRef } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport { theme } from \"../../theme\";\n\nconst KEYFRAMES_ID = \"fp-stage-node-keyframes\";\nconst KEYFRAMES_CSS = `\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fp-pulse {\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 0.15; transform: scale(1.06); }\n }\n @keyframes fp-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n}\n@media (prefers-reduced-motion: reduce) {\n @keyframes fp-pulse { 0%, 100% { opacity: 0.3; } }\n @keyframes fp-blink { 0%, 100% { opacity: 1; } }\n}\n`;\n\nexport interface StageNodeData {\n label: string;\n active?: boolean;\n done?: boolean;\n error?: boolean;\n linked?: boolean;\n /** Semantic icon hint (e.g., \"llm\", \"tool\", \"rag\", \"start\", \"parse\", \"agent\", \"guard\") */\n icon?: string;\n /** Step numbers in execution order (shown as badges — multiple when revisited via loops) */\n stepNumbers?: number[];\n /** Node was not executed (dim it) */\n dimmed?: boolean;\n /** Node is a subflow root (show nested indicator) */\n isSubflow?: boolean;\n /** Node uses lazy resolution (dashed border + cloud icon when unresolved) */\n isLazy?: boolean;\n /** Node is a decider (renders as diamond shape per flowchart convention) */\n isDecider?: boolean;\n /** Node is a fork (parallel fan-out) */\n isFork?: boolean;\n /** Human-readable description of what this stage does */\n description?: string;\n /** Subflow identifier — set when this node belongs to a subflow */\n subflowId?: string;\n [key: string]: unknown;\n}\n\n// ── Stage icon SVGs ───────────────────────────────────────────────────────\n// Inline SVGs for crisp rendering at any size. Consumers pass a string key\n// via SpecNode.icon; StageNode renders the matching mini-icon.\n\nconst ICON_SIZE = 16;\n\nfunction StageIcon({ type, color }: { type: string; color: string }) {\n const s = ICON_SIZE;\n const props = { width: s, height: s, viewBox: `0 0 ${s} ${s}`, fill: \"none\", style: { flexShrink: 0 } as const };\n\n switch (type) {\n // LLM / AI call — brain/sparkle\n case \"llm\":\n case \"ai\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M5.5 8C5.5 6.5 6.5 5 8 5S10.5 6.5 10.5 8\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"9.5\" r=\"1\" fill={color} />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"3.5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"12.5\" y1=\"4\" x2=\"11.2\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"3.5\" y1=\"4\" x2=\"4.8\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Tool / function call — gear\n case \"tool\":\n case \"function\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke={color} strokeWidth=\"1.5\" />\n {[0, 45, 90, 135, 180, 225, 270, 315].map((angle) => {\n const rad = (angle * Math.PI) / 180;\n const x1 = 8 + Math.cos(rad) * 4.5;\n const y1 = 8 + Math.sin(rad) * 4.5;\n const x2 = 8 + Math.cos(rad) * 6;\n const y2 = 8 + Math.sin(rad) * 6;\n return <line key={angle} x1={x1} y1={y1} x2={x2} y2={y2} stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />;\n })}\n </svg>\n );\n\n // RAG / retrieval — magnifying glass + doc\n case \"rag\":\n case \"search\":\n case \"retrieval\":\n return (\n <svg {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" stroke={color} strokeWidth=\"1.5\" />\n <line x1=\"10\" y1=\"10\" x2=\"13.5\" y2=\"13.5\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"6\" x2=\"8.5\" y2=\"6\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"8\" x2=\"7.5\" y2=\"8\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Parse / process — diamond with arrows\n case \"parse\":\n case \"process\":\n case \"transform\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke={color} strokeWidth=\"1.5\" transform=\"rotate(45 8 8)\" />\n </svg>\n );\n\n // Start / seed — play triangle\n case \"start\":\n case \"seed\":\n case \"init\":\n return (\n <svg {...props}>\n <path d=\"M5 3.5L12.5 8L5 12.5V3.5Z\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // End / finalize — stop square\n case \"end\":\n case \"finalize\":\n case \"output\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // Agent — person silhouette\n case \"agent\":\n case \"orchestrator\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M3.5 14C3.5 11 5.5 9 8 9S12.5 11 12.5 14\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Swarm — multi-agent\n case \"swarm\":\n case \"multi-agent\":\n return (\n <svg {...props}>\n <circle cx=\"5\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"11\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"8\" cy=\"11\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <line x1=\"5\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n <line x1=\"11\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n );\n\n // Guard / guardrail — shield\n case \"guard\":\n case \"guardrail\":\n case \"validate\":\n return (\n <svg {...props}>\n <path d=\"M8 2L3 5V9C3 11.5 5 13.5 8 14.5C11 13.5 13 11.5 13 9V5L8 2Z\" stroke={color} strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M6 8L7.5 9.5L10 6.5\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n // Stream — wave\n case \"stream\":\n case \"streaming\":\n return (\n <svg {...props}>\n <path d=\"M2 8C4 5 6 11 8 8S12 5 14 8\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M2 11C4 8 6 14 8 11S12 8 14 11\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.5\" />\n </svg>\n );\n\n // Memory / state — database cylinder\n case \"memory\":\n case \"state\":\n case \"db\":\n return (\n <svg {...props}>\n <ellipse cx=\"8\" cy=\"4.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"3\" y1=\"4.5\" x2=\"3\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <ellipse cx=\"8\" cy=\"11.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n </svg>\n );\n\n // Loop — circular arrow\n case \"loop\":\n case \"retry\":\n return (\n <svg {...props}>\n <path d=\"M12 8A4 4 0 1 1 8 4\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M8 1.5L10.5 4L8 6.5\" stroke={color} strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\n </svg>\n );\n\n // Lazy / service — cloud (deferred resolution, loaded on demand)\n case \"lazy\":\n case \"service\":\n case \"cloud\":\n return (\n <svg {...props}>\n <path\n d=\"M4.5 12C2.8 12 1.5 10.7 1.5 9C1.5 7.5 2.5 6.3 3.8 6C4 4 5.8 2.5 8 2.5C9.8 2.5 11.3 3.5 11.9 5C13.9 5.2 15.5 6.8 15.5 8.8C15.5 10.8 13.9 12.5 11.8 12.5H4.5\"\n stroke={color}\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n\n // Decision — diamond (already handled by isDecider shape)\n case \"decision\":\n case \"router\":\n return (\n <svg {...props}>\n <path d=\"M8 2L14 8L8 14L2 8Z\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill={color} />\n </svg>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Custom ReactFlow node for pipeline stages.\n * All colors and fonts come from `--fp-*` CSS variables (via theme).\n * Shows execution state via color, icon, step badge, and pulse animation.\n */\nexport const StageNode = memo(function StageNode({\n data,\n}: NodeProps & { data: StageNodeData }) {\n const { label, active, done, error, linked, icon, stepNumbers, dimmed, isSubflow, isLazy, isDecider, isFork, description } = data;\n\n // Lazy nodes show cloud icon by default (unless another icon is specified)\n const effectiveIcon = icon || (isLazy ? \"lazy\" : undefined);\n // Lazy + unresolved = dashed border\n const isLazyUnresolved = isLazy && !done && !active;\n\n // Inject keyframes once into document head\n const injectedRef = useRef(false);\n useEffect(() => {\n if (injectedRef.current) return;\n if (typeof document !== \"undefined\" && !document.getElementById(KEYFRAMES_ID)) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = KEYFRAMES_ID;\n styleEl.textContent = KEYFRAMES_CSS;\n document.head.appendChild(styleEl);\n }\n injectedRef.current = true;\n }, []);\n\n const isOnPath = active || done;\n\n const bg = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.bgSecondary;\n\n const borderColor = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.border;\n\n const shadow = active\n ? `0 0 16px color-mix(in srgb, ${theme.primary} 40%, transparent)`\n : done\n ? `0 0 8px color-mix(in srgb, ${theme.success} 20%, transparent)`\n : error\n ? `0 0 12px color-mix(in srgb, ${theme.error} 30%, transparent)`\n : `0 2px 8px rgba(0,0,0,0.15)`;\n\n // Colored states use white for contrast; default uses consumer's text color.\n const textColor =\n active || done || error ? \"#fff\" : theme.textPrimary;\n\n return (\n <>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n {/* Step number badges — multiple when revisited via loops */}\n {stepNumbers && stepNumbers.length > 0 && isOnPath && (\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: -10,\n display: \"flex\",\n gap: 3,\n zIndex: 10,\n }}\n >\n {stepNumbers.map((num, i) => {\n const isLatest = i === stepNumbers.length - 1;\n const badgeBg = isLatest && active ? theme.primary : theme.success;\n const glow = isLatest && active\n ? `color-mix(in srgb, ${theme.primary} 50%, transparent)`\n : `color-mix(in srgb, ${theme.success} 40%, transparent)`;\n return (\n <div\n key={num}\n style={{\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: badgeBg,\n color: \"#fff\",\n fontSize: 11,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: `0 0 8px ${glow}`,\n }}\n >\n {num}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Linked pulse ring */}\n {linked && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n transform: isDecider ? \"rotate(45deg)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.4,\n animation: \"fp-pulse 2s ease-in-out infinite\",\n }}\n />\n )}\n\n {/* Active node pulse ring */}\n {active && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n transform: isDecider ? \"rotate(45deg)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.3,\n animation: \"fp-pulse 1.5s ease-out infinite\",\n }}\n />\n )}\n\n {/* Diamond wrapper for decider nodes — rotated 45deg */}\n {isDecider ? (\n <div\n style={{\n background: bg,\n border: `2px ${isLazyUnresolved ? \"dashed\" : \"solid\"} ${borderColor}`,\n borderRadius: 4,\n transform: \"rotate(45deg)\",\n padding: 20,\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {/* Counter-rotate content so text/icons stay upright */}\n <div\n style={{\n transform: \"rotate(-45deg)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 2,\n fontFamily: theme.fontSans,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 5 }}>\n {icon && <StageIcon type={icon} color={textColor} />}\n {!icon && (\n <span style={{ fontSize: 10, color: textColor }}>◇</span>\n )}\n <span\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n </div>\n {description && (\n <span\n style={{\n fontSize: 9,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 130,\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n ) : (\n /* Standard rectangular node */\n <div\n style={{\n background: bg,\n border: `2px ${isLazyUnresolved ? \"dashed\" : \"solid\"} ${borderColor}`,\n borderRadius: theme.radius,\n padding: description ? \"8px 16px\" : \"10px 20px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: description ? 2 : 0,\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n fontFamily: theme.fontSans,\n minWidth: 100,\n justifyContent: \"center\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {/* Semantic icon (lazy nodes default to cloud icon) */}\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n\n {/* State icon */}\n {done && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✓</span>\n )}\n {active && !effectiveIcon && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: \"#fff\",\n animation: \"fp-blink 1s ease-in-out infinite\",\n flexShrink: 0,\n }}\n />\n )}\n {error && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✗</span>\n )}\n\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n {/* Subflow indicator — nested boxes icon */}\n {isSubflow && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: 3,\n border: `1.5px solid ${textColor}`,\n position: \"relative\",\n opacity: 0.7,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: 2,\n border: `1px solid ${textColor}`,\n }}\n />\n </span>\n )}\n </div>\n {/* Description subtitle */}\n {description && (\n <span\n style={{\n fontSize: 10,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 160,\n }}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {/* Right-side handles for loop-back edges (so they don't overlap center edges) */}\n <Handle\n id=\"loop-source\"\n type=\"source\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n <Handle\n id=\"loop-target\"\n type=\"target\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n </>\n );\n});\n","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","/**\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","/**\n * Dumb flowchart renderer — spec + snapshots → ReactFlow graph with overlay.\n *\n * No internal navigation state. The consumer (ExplainableShell) owns\n * drill-down, breadcrumb, and SubflowTree. This component just renders\n * whatever spec + snapshots it receives at any level.\n *\n * Usage:\n * <TracedFlowchartView spec={spec} /> // static\n * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} /> // traced\n */\nimport { useMemo, useCallback, useEffect } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useReactFlow,\n} from \"@xyflow/react\";\nimport type { Node, NodeTypes } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport { specToLayout, applyOverlay } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay } from \"./specToReactFlow\";\n\nexport interface TracedFlowchartViewProps extends BaseComponentProps {\n /** Pipeline spec from builder.toSpec() — for the current level */\n spec: SpecNode;\n /** Visualization snapshots (enables trace overlay when provided) */\n snapshots?: StageSnapshot[];\n /** Current time-travel position */\n snapshotIndex?: number;\n /** Callback when a node is clicked (receives snapshot index, or node id if no snapshots) */\n onNodeClick?: (indexOrId: number | string) => void;\n /** Override default node types */\n nodeTypes?: NodeTypes;\n}\n\nconst defaultNodeTypes: NodeTypes = { stage: StageNode as any };\n\n/** Calls fitView when the container resizes (e.g. panel expand/collapse). */\nfunction FitViewOnResize() {\n const { fitView } = useReactFlow();\n useEffect(() => {\n const handler = () => { requestAnimationFrame(() => fitView({ padding: 0.3 })); };\n window.addEventListener(\"resize\", handler);\n return () => window.removeEventListener(\"resize\", handler);\n }, [fitView]);\n return null;\n}\n\nexport function TracedFlowchartView({\n spec,\n snapshots,\n snapshotIndex = 0,\n onNodeClick,\n nodeTypes: customNodeTypes,\n unstyled = false,\n className,\n style,\n}: TracedFlowchartViewProps) {\n const nodeTypes = customNodeTypes ?? defaultNodeTypes;\n\n // Compute execution overlay from snapshots + index\n const overlay = useMemo<ExecutionOverlay | undefined>(() => {\n if (!snapshots || snapshots.length === 0) return undefined;\n const executionOrder = snapshots\n .slice(0, snapshotIndex + 1)\n .map((s) => s.stageLabel);\n const doneStages = new Set(\n snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel)\n );\n const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;\n const executedStages = new Set([...doneStages]);\n if (activeStage) executedStages.add(activeStage);\n return { doneStages, activeStage, executedStages, executionOrder };\n }, [snapshots, snapshotIndex]);\n\n // Phase 1: static layout — only recomputes when spec changes\n const layout = useMemo(() => {\n if (!spec) return null;\n return specToLayout(spec);\n }, [spec]);\n\n // Phase 2: apply overlay — cheap, runs per slider tick\n const { nodes, edges } = useMemo(() => {\n if (!layout) return { nodes: [], edges: [] };\n return applyOverlay(layout, overlay);\n }, [layout, overlay]);\n\n // Handle node clicks — always send string node id.\n // The consumer (ExplainableShell) decides whether to drill into a subflow\n // or jump to a snapshot index based on the node name.\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick) return;\n onNodeClick(node.id);\n },\n [onNodeClick]\n );\n\n return (\n <div\n className={className}\n style={{ width: \"100%\", height: \"100%\", ...style }}\n data-fp=\"traced-flowchart\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{ padding: 0.3 }}\n proOptions={{ hideAttribution: true }}\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n <FitViewOnResize />\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","/**\n * Converts a SerializedPipelineStructure (from builder.toSpec()) into\n * ReactFlow nodes and edges with auto-layout.\n *\n * Two-phase approach for performance:\n * 1. `specToLayout(spec)` — tree walk + positioning (expensive, cached on spec)\n * 2. `applyOverlay(layout, overlay)` — color nodes/edges (cheap, runs per slider tick)\n *\n * `specToReactFlow(spec, overlay)` combines both for convenience.\n */\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { rawDefaults } from \"../../theme/tokens\";\n\nexport interface SpecNode {\n name: string;\n id?: string;\n type?: \"stage\" | \"decider\" | \"fork\" | \"streaming\";\n /** Semantic icon hint — rendered by StageNode. Common values:\n * \"llm\", \"tool\", \"rag\", \"search\", \"parse\", \"start\", \"end\", \"loop\",\n * \"agent\", \"swarm\", \"guard\", \"stream\", \"memory\" */\n icon?: string;\n description?: string;\n children?: SpecNode[];\n next?: SpecNode;\n branchIds?: string[];\n hasDecider?: boolean;\n hasSelector?: boolean;\n loopTarget?: string;\n isSubflowRoot?: boolean;\n subflowId?: string;\n subflowName?: string;\n subflowStructure?: SpecNode;\n /** True when this subflow uses lazy resolution (deferred until execution). */\n isLazy?: boolean;\n}\n\nexport interface ExecutionOverlay {\n /** Names of stages that have completed (before the active one) */\n doneStages: Set<string>;\n /** Name of the currently active stage */\n activeStage: string | null;\n /** Names of all stages that were executed (done + active) */\n executedStages: Set<string>;\n /** Ordered list of executed stage names (for step numbering) */\n executionOrder?: string[];\n}\n\n/** Colors for the flowchart — consumer provides these to match their theme */\nexport interface FlowchartColors {\n edgeDefault: string;\n edgeExecuted: string;\n edgeActive: string;\n edgeLoop: string;\n labelDefault: string;\n labelExecuted: string;\n labelLoop: string;\n pathGlow: string;\n}\n\n/** Default colors derived from raw theme defaults. Consumer can override per-call. */\nconst DEFAULT_COLORS: FlowchartColors = {\n edgeDefault: rawDefaults.colors.textMuted,\n edgeExecuted: rawDefaults.colors.success,\n edgeActive: rawDefaults.colors.primary,\n edgeLoop: rawDefaults.colors.warning,\n labelDefault: rawDefaults.colors.textSecondary,\n labelExecuted: rawDefaults.colors.success,\n labelLoop: rawDefaults.colors.warning,\n pathGlow: `${rawDefaults.colors.success}4D`, // ~30% opacity hex\n};\n\n// ---------------------------------------------------------------------------\n// Phase 1: Static layout (expensive — depends only on spec)\n// ---------------------------------------------------------------------------\n\n/** A positioned node with all static info, before overlay is applied. */\nexport interface LayoutNode {\n id: string;\n x: number;\n y: number;\n label: string;\n isDecider: boolean;\n isFork: boolean;\n description?: string;\n icon?: string;\n subflowId?: string;\n isSubflow: boolean;\n isLazy?: boolean;\n}\n\n/** A positioned edge with source/target info. */\nexport interface LayoutEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n isLoop: boolean;\n}\n\n/** Static layout output — positions + structure, no execution state. */\nexport interface SpecLayout {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n /** Maps stage ID → node id for resolving loopTarget references. */\n idToName: Map<string, string>;\n}\n\nconst Y_STEP = 100;\nconst X_SPREAD = 200;\n\nfunction nid(n: SpecNode): string {\n return n.name || n.id || `spec-${Math.random()}`;\n}\n\ninterface WalkState {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n edgeCounter: number;\n seen: Set<string>;\n idToName: Map<string, string>;\n}\n\nfunction registerNode(state: WalkState, node: SpecNode): void {\n if (node.id && node.name) {\n state.idToName.set(node.id, node.name);\n }\n}\n\nfunction walkLayout(\n node: SpecNode,\n state: WalkState,\n x: number,\n y: number,\n): { lastIds: string[]; bottomY: number } {\n if (!node) return { lastIds: [], bottomY: y };\n registerNode(state, node);\n const id = nid(node);\n\n if (state.seen.has(id)) {\n return { lastIds: [id], bottomY: y };\n }\n state.seen.add(id);\n\n const isDecider = node.type === \"decider\" || !!node.hasDecider;\n const isFork = node.type === \"fork\";\n\n state.nodes.push({\n id,\n x,\n y,\n label: node.name,\n isDecider,\n isFork,\n description: node.description,\n icon: node.icon,\n subflowId: node.subflowId,\n isSubflow: !!node.isSubflowRoot,\n isLazy: node.isLazy,\n });\n\n let lastIds = [id];\n let bottomY = y;\n\n // Handle children (fork/decider branches)\n if (node.children && node.children.length > 0) {\n const totalWidth = (node.children.length - 1) * X_SPREAD;\n const startX = x - totalWidth / 2;\n const childY = y + Y_STEP;\n const childResults: { lastIds: string[]; bottomY: number }[] = [];\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const childX = startX + i * X_SPREAD;\n const edgeLabel = node.branchIds?.[i];\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: nid(child), label: edgeLabel, isLoop: false });\n const result = walkLayout(child, state, childX, childY);\n childResults.push(result);\n }\n\n lastIds = childResults.flatMap((r) => r.lastIds);\n bottomY = Math.max(...childResults.map((r) => r.bottomY));\n }\n\n // Loop-back edge\n if (node.loopTarget) {\n const resolvedTarget = state.idToName.get(node.loopTarget) ?? node.loopTarget;\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: resolvedTarget, label: \"loop\", isLoop: true });\n }\n\n // Linear continuation\n if (node.next) {\n const rawNextId = nid(node.next);\n const resolvedNextId = state.idToName.get(rawNextId) ?? rawNextId;\n const isLoopRef = node.loopTarget && state.seen.has(resolvedNextId);\n\n if (isLoopRef) {\n return { lastIds, bottomY };\n }\n\n const nextY = bottomY + Y_STEP;\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, isLoop: false });\n }\n return walkLayout(node.next, state, x, nextY);\n }\n\n return { lastIds, bottomY };\n}\n\n/**\n * Phase 1: Compute static layout from spec. Cached on spec reference — only\n * recomputes when the pipeline structure changes, not on every slider tick.\n */\nexport function specToLayout(spec: SpecNode): SpecLayout {\n const state: WalkState = {\n nodes: [],\n edges: [],\n edgeCounter: 0,\n seen: new Set(),\n idToName: new Map(),\n };\n walkLayout(spec, state, 300, 0);\n return { nodes: state.nodes, edges: state.edges, idToName: state.idToName };\n}\n\n// ---------------------------------------------------------------------------\n// Phase 2: Apply overlay (cheap — runs per slider tick)\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 2: Apply execution overlay to static layout.\n * Produces ReactFlow nodes/edges with correct colors, step numbers, and glow.\n */\nexport function applyOverlay(\n layout: SpecLayout,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const c = { ...DEFAULT_COLORS, ...colors };\n const o = overlay ?? null;\n\n // Nodes\n const nodes: Node[] = layout.nodes.map((ln) => {\n const isDone = o ? o.doneStages.has(ln.id) : false;\n const isActive = o ? o.activeStage === ln.id : false;\n const wasExecuted = o ? o.executedStages.has(ln.id) : false;\n const dimmed = o && !wasExecuted;\n\n let stepNumbers: number[] | undefined;\n if (o?.executionOrder) {\n const nums: number[] = [];\n for (let i = 0; i < o.executionOrder.length; i++) {\n if (o.executionOrder[i] === ln.id) nums.push(i + 1);\n }\n if (nums.length > 0) stepNumbers = nums;\n }\n\n return {\n id: ln.id,\n position: { x: ln.x, y: ln.y },\n data: {\n label: ln.label,\n active: isActive,\n done: isDone,\n error: false,\n isDecider: ln.isDecider,\n isFork: ln.isFork,\n description: ln.description,\n icon: ln.icon,\n subflowId: ln.subflowId,\n dimmed,\n stepNumbers,\n isSubflow: ln.isSubflow,\n isLazy: ln.isLazy,\n },\n type: \"stage\" as const,\n style: dimmed ? { opacity: 0.35 } : undefined,\n };\n });\n\n // Edges\n const edges: Edge[] = [];\n for (const le of layout.edges) {\n const executed = o && o.executedStages.has(le.source) && o.executedStages.has(le.target);\n const isLeadingEdge = o && le.source === o.activeStage && !o.doneStages.has(le.target);\n\n if (le.isLoop) {\n let loopExecuted = false;\n if (o?.executionOrder) {\n const lastSourceIdx = o.executionOrder.lastIndexOf(le.source);\n if (lastSourceIdx >= 0) {\n loopExecuted = o.executionOrder.slice(lastSourceIdx + 1).includes(le.target);\n }\n }\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n sourceHandle: \"loop-source\",\n targetHandle: \"loop-target\",\n label: le.label ?? \"loop\",\n type: \"smoothstep\",\n pathOptions: { offset: 40, borderRadius: 16 },\n style: {\n stroke: c.edgeLoop,\n strokeWidth: loopExecuted ? 3 : 2,\n strokeDasharray: \"6 3\",\n opacity: o && !loopExecuted ? 0.35 : 1,\n },\n labelStyle: { fontSize: 10, fontWeight: 700, fill: c.labelLoop },\n animated: loopExecuted,\n zIndex: 2,\n } as Edge);\n } else if (executed) {\n // Glow layer\n edges.push({\n id: `${le.id}-glow`,\n source: le.source,\n target: le.target,\n style: { stroke: c.pathGlow, strokeWidth: 8, opacity: 0.4 },\n zIndex: 0,\n selectable: false,\n focusable: false,\n });\n // Route line\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: isLeadingEdge ? c.edgeActive : c.edgeExecuted,\n strokeWidth: 3.5,\n },\n labelStyle: { fontSize: 10, fontWeight: 600, fill: c.labelExecuted },\n animated: !!isLeadingEdge,\n zIndex: 1,\n });\n } else {\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: c.edgeDefault,\n strokeWidth: 1.5,\n opacity: o ? 0.3 : 1,\n },\n labelStyle: { fontSize: 10, fill: c.labelDefault },\n });\n }\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience: combined single-call (backwards compatible)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a pipeline spec to ReactFlow graph.\n * Pass `overlay` to color nodes/edges by execution state.\n */\nexport function specToReactFlow(\n spec: SpecNode,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const layout = specToLayout(spec);\n return applyOverlay(layout, overlay, colors);\n}\n","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","import { useState, useCallback, useMemo } from \"react\";\nimport { specToReactFlow } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay, FlowchartColors } from \"./specToReactFlow\";\nimport type { Node, Edge } from \"@xyflow/react\";\n\nexport interface BreadcrumbEntry {\n /** Display name for this level */\n label: string;\n /** The spec node tree at this level */\n spec: SpecNode;\n /** Human-readable description of this subflow */\n description?: string;\n}\n\nexport interface SubflowNavigation {\n /** Current breadcrumb path (root → ... → current) */\n breadcrumbs: BreadcrumbEntry[];\n /** Current level's ReactFlow nodes */\n nodes: Node[];\n /** Current level's ReactFlow edges */\n edges: Edge[];\n /** Call when a node is clicked — drills in if it's a subflow */\n handleNodeClick: (nodeId: string) => boolean;\n /** Navigate to a specific breadcrumb level (0 = root) */\n navigateTo: (level: number) => void;\n /** Whether we're currently inside a subflow (not at root) */\n isInSubflow: boolean;\n /** Name of the subflow node we drilled into (for finding execution data) */\n currentSubflowNodeName: string | null;\n}\n\n/**\n * Hook that manages subflow drill-down navigation for a flowchart spec.\n *\n * Maintains a breadcrumb stack. When a subflow node is clicked, pushes its\n * nested spec onto the stack and re-derives nodes/edges. Breadcrumb clicks\n * pop back to that level.\n */\nexport function useSubflowNavigation(\n rootSpec: SpecNode | null,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>\n): SubflowNavigation {\n const [stack, setStack] = useState<BreadcrumbEntry[]>([]);\n\n // Current spec = top of stack, or root\n const currentSpec = stack.length > 0 ? stack[stack.length - 1].spec : rootSpec;\n\n // Derive nodes/edges from current spec\n // Overlay is always passed through — consumer provides the appropriate overlay\n // (root overlay at root level, subflow overlay when drilled in)\n const { nodes, edges } = useMemo(() => {\n if (!currentSpec) return { nodes: [], edges: [] };\n return specToReactFlow(currentSpec, overlay, colors);\n }, [currentSpec, overlay, colors]);\n\n // Build a lookup of subflow nodes at the current level\n const subflowMap = useMemo(() => {\n const map = new Map<string, SpecNode>();\n if (!currentSpec) return map;\n\n function collectSubflows(node: SpecNode) {\n if (node.isSubflowRoot && node.subflowStructure) {\n const id = node.name || node.id || \"\";\n map.set(id, node);\n }\n if (node.children) node.children.forEach(collectSubflows);\n if (node.next) collectSubflows(node.next);\n }\n collectSubflows(currentSpec);\n return map;\n }, [currentSpec]);\n\n const breadcrumbs: BreadcrumbEntry[] = useMemo(() => {\n const root: BreadcrumbEntry = {\n label: rootSpec?.name || \"Flowchart\",\n spec: rootSpec!,\n description: rootSpec?.description,\n };\n return [root, ...stack];\n }, [rootSpec, stack]);\n\n const handleNodeClick = useCallback(\n (nodeId: string): boolean => {\n const subflowNode = subflowMap.get(nodeId);\n if (!subflowNode?.subflowStructure) return false;\n\n setStack((prev) => [\n ...prev,\n {\n label: subflowNode.subflowName || subflowNode.name,\n spec: subflowNode.subflowStructure!,\n description: subflowNode.description,\n },\n ]);\n return true;\n },\n [subflowMap]\n );\n\n const navigateTo = useCallback(\n (level: number) => {\n if (level === 0) {\n setStack([]);\n } else {\n setStack((prev) => prev.slice(0, level));\n }\n },\n []\n );\n\n return {\n breadcrumbs,\n nodes,\n edges,\n handleNodeClick,\n navigateTo,\n isInSubflow: stack.length > 0,\n currentSubflowNodeName: stack.length > 0 ? stack[stack.length - 1].label : null,\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 { useState } from \"react\";\nimport type { Node, Edge } from \"@xyflow/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\";\nimport { FlowchartView } from \"../FlowchartView\";\n\nexport interface TimeTravelDebuggerProps extends BaseComponentProps {\n /** Stage snapshots */\n snapshots: StageSnapshot[];\n /** ReactFlow nodes (required for flowchart) */\n nodes: Node[];\n /** ReactFlow edges (required for flowchart) */\n edges: Edge[];\n /** Show Gantt timeline */\n showGantt?: boolean;\n /** Layout direction */\n layout?: \"horizontal\" | \"vertical\";\n /** Title */\n title?: string;\n}\n\n/**\n * Full time-travel debugger: scrubber + flowchart + memory + narrative + gantt.\n * This is the \"batteries included\" component for pipeline debugging.\n */\nexport function TimeTravelDebugger({\n snapshots,\n nodes,\n edges,\n showGantt = true,\n layout = \"horizontal\",\n title = \"Time-Travel Debugger\",\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: TimeTravelDebuggerProps) {\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: theme.textMuted,\n ...style,\n }}\n >\n No snapshots to debug\n </div>\n );\n }\n\n const isHorizontal = layout === \"horizontal\";\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"time-travel-debugger\">\n <h3>{title}</h3>\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 <FlowchartView\n nodes={nodes}\n edges={edges}\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onNodeClick={setSelectedIndex}\n unstyled\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=\"time-travel-debugger\"\n >\n {/* Scrubber header */}\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: 8,\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 }}\n >\n Scrub to replay execution\n </span>\n </div>\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 <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n flexShrink: 0,\n fontFamily: theme.fontMono,\n }}\n >\n {selectedIndex + 1}/{snapshots.length}\n </span>\n </div>\n </div>\n\n {/* Main content: flowchart + data panels */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: isHorizontal ? \"row\" : \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* Flowchart */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n borderRight: isHorizontal\n ? `1px solid ${theme.border}`\n : \"none\",\n borderBottom: !isHorizontal\n ? `1px solid ${theme.border}`\n : \"none\",\n }}\n >\n <FlowchartView\n nodes={nodes}\n edges={edges}\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onNodeClick={setSelectedIndex}\n size={size}\n />\n </div>\n\n {/* Data panel */}\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 </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, 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, 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"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","StageNode","import_jsx_runtime","import_react","import_jsx_runtime","nodeTypes","import_react","import_jsx_runtime","SubflowBreadcrumb","import_react","import_react","import_jsx_runtime","TreeNode","SectionLabel","SubflowTree","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/flowchart.ts","../src/components/FlowchartView/FlowchartView.tsx","../src/components/StageNode/StageNode.tsx","../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/useDarkModeTokens.ts","../src/components/FlowchartView/TracedFlowchartView.tsx","../src/components/FlowchartView/specToReactFlow.ts","../src/components/FlowchartView/SubflowBreadcrumb.tsx","../src/components/FlowchartView/useSubflowNavigation.ts","../src/components/FlowchartView/SubflowTree.tsx","../src/components/TimeTravelDebugger/TimeTravelDebugger.tsx","../src/components/MemoryInspector/MemoryInspector.tsx","../src/components/NarrativeLog/NarrativeLog.tsx","../src/components/GanttTimeline/GanttTimeline.tsx"],"sourcesContent":["// Flowchart components (require @xyflow/react peer dependency)\n// Import from \"footprint-explainable-ui/flowchart\"\n\nexport { FlowchartView } from \"./components/FlowchartView\";\nexport type { FlowchartViewProps } from \"./components/FlowchartView\";\n\nexport { StageNode } from \"./components/StageNode\";\nexport type { StageNodeData } from \"./components/StageNode\";\n\nexport { TimeTravelDebugger } from \"./components/TimeTravelDebugger\";\nexport type { TimeTravelDebuggerProps } from \"./components/TimeTravelDebugger\";\n\nexport { specToReactFlow, specToLayout, applyOverlay } from \"./components/FlowchartView/specToReactFlow\";\nexport type {\n SpecNode,\n ExecutionOverlay,\n FlowchartColors,\n SpecLayout,\n LayoutNode,\n LayoutEdge,\n} from \"./components/FlowchartView/specToReactFlow\";\n\n// Self-contained traced flowchart (spec + snapshots → full visualization)\nexport { TracedFlowchartView } from \"./components/FlowchartView\";\nexport type { TracedFlowchartViewProps } from \"./components/FlowchartView\";\n\n// Subflow drill-down navigation\nexport { SubflowBreadcrumb } from \"./components/FlowchartView\";\nexport type { SubflowBreadcrumbProps } from \"./components/FlowchartView\";\nexport { useSubflowNavigation } from \"./components/FlowchartView\";\nexport type { SubflowNavigation, BreadcrumbEntry } from \"./components/FlowchartView\";\n\n// Subflow manifest tree (no ReactFlow dependency — pure React)\nexport { SubflowTree } from \"./components/FlowchartView\";\nexport type { SubflowTreeProps, SubflowTreeEntry } from \"./components/FlowchartView\";\n","import { useMemo, useCallback } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useNodesState,\n useEdgesState,\n} from \"@xyflow/react\";\nimport type { Node, Edge } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport type { StageNodeData } from \"../StageNode\";\nimport { theme } from \"../../theme\";\n\nexport interface FlowchartViewProps extends BaseComponentProps {\n /** ReactFlow nodes */\n nodes: Node[];\n /** ReactFlow edges */\n edges: Edge[];\n /** Optional snapshots for state-aware rendering (done/active coloring) */\n snapshots?: StageSnapshot[];\n /** Currently selected snapshot index (for state coloring) */\n selectedIndex?: number;\n /** Callback when a node is clicked */\n onNodeClick?: (index: number) => void;\n}\n\nconst nodeTypes = { stageNode: StageNode };\n\n/**\n * Pipeline flowchart visualization using ReactFlow.\n * When snapshots are provided, nodes are colored by execution state.\n */\nexport function FlowchartView({\n nodes: rawNodes,\n edges: rawEdges,\n snapshots,\n selectedIndex = 0,\n onNodeClick,\n unstyled = false,\n className,\n style,\n}: FlowchartViewProps) {\n // Enhance nodes with execution state\n const enhancedNodes = useMemo(() => {\n if (!snapshots || snapshots.length === 0) {\n return rawNodes.map((n) => ({\n ...n,\n type: \"stageNode\",\n data: {\n ...n.data,\n label: (n.data as StageNodeData).label || n.id,\n active: false,\n done: false,\n error: false,\n },\n }));\n }\n\n const doneNames = new Set(\n snapshots.slice(0, selectedIndex).map((s) => s.stageName)\n );\n const activeName = snapshots[selectedIndex]?.stageName;\n\n return rawNodes.map((n) => ({\n ...n,\n type: \"stageNode\",\n data: {\n ...n.data,\n label: (n.data as StageNodeData).label || n.id,\n active: n.id === activeName,\n done: doneNames.has(n.id),\n error: false,\n },\n }));\n }, [rawNodes, snapshots, selectedIndex]);\n\n // Enhance edges with state coloring\n const enhancedEdges = useMemo(() => {\n if (!snapshots || snapshots.length === 0) {\n return rawEdges.map((e) => ({\n ...e,\n style: { stroke: theme.textMuted, strokeWidth: 1.5 },\n animated: false,\n }));\n }\n\n const doneNames = new Set(\n snapshots.slice(0, selectedIndex + 1).map((s) => s.stageName)\n );\n const activeName = snapshots[selectedIndex]?.stageName;\n\n return rawEdges.map((e) => {\n const sourceIsDone = doneNames.has(e.source);\n const isFromActive = e.source === activeName;\n return {\n ...e,\n style: {\n stroke: sourceIsDone ? theme.success : theme.textMuted,\n strokeWidth: 1.5,\n },\n animated: isFromActive,\n };\n });\n }, [rawEdges, snapshots, selectedIndex]);\n\n const [nodes, , onNodesChange] = useNodesState(enhancedNodes);\n const [edges, , onEdgesChange] = useEdgesState(enhancedEdges);\n\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick || !snapshots) return;\n const idx = snapshots.findIndex((s) => s.stageName === node.id);\n if (idx >= 0) onNodeClick(idx);\n },\n [onNodeClick, snapshots]\n );\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style,\n }}\n data-fp=\"flowchart-view\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","import { memo, useEffect, useRef } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport { theme } from \"../../theme\";\n\nconst KEYFRAMES_ID = \"fp-stage-node-keyframes\";\nconst KEYFRAMES_CSS = `\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fp-pulse {\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 0.15; transform: scale(1.06); }\n }\n @keyframes fp-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n}\n@media (prefers-reduced-motion: reduce) {\n @keyframes fp-pulse { 0%, 100% { opacity: 0.3; } }\n @keyframes fp-blink { 0%, 100% { opacity: 1; } }\n}\n`;\n\nexport interface StageNodeData {\n label: string;\n active?: boolean;\n done?: boolean;\n error?: boolean;\n linked?: boolean;\n /** Semantic icon hint (e.g., \"llm\", \"tool\", \"rag\", \"start\", \"parse\", \"agent\", \"guard\") */\n icon?: string;\n /** Step numbers in execution order (shown as badges — multiple when revisited via loops) */\n stepNumbers?: number[];\n /** Node was not executed (dim it) */\n dimmed?: boolean;\n /** Node is a subflow root (show nested indicator) */\n isSubflow?: boolean;\n /** Node uses lazy resolution (dashed border + cloud icon when unresolved) */\n isLazy?: boolean;\n /** Node is a decider (renders as diamond shape per flowchart convention) */\n isDecider?: boolean;\n /** Node is a fork (parallel fan-out) */\n isFork?: boolean;\n /** Human-readable description of what this stage does */\n description?: string;\n /** Subflow identifier — set when this node belongs to a subflow */\n subflowId?: string;\n [key: string]: unknown;\n}\n\n// ── Stage icon SVGs ───────────────────────────────────────────────────────\n// Inline SVGs for crisp rendering at any size. Consumers pass a string key\n// via SpecNode.icon; StageNode renders the matching mini-icon.\n\nconst ICON_SIZE = 16;\n\nfunction StageIcon({ type, color }: { type: string; color: string }) {\n const s = ICON_SIZE;\n const props = { width: s, height: s, viewBox: `0 0 ${s} ${s}`, fill: \"none\", style: { flexShrink: 0 } as const };\n\n switch (type) {\n // LLM / AI call — brain/sparkle\n case \"llm\":\n case \"ai\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M5.5 8C5.5 6.5 6.5 5 8 5S10.5 6.5 10.5 8\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"9.5\" r=\"1\" fill={color} />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"3.5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"12.5\" y1=\"4\" x2=\"11.2\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"3.5\" y1=\"4\" x2=\"4.8\" y2=\"5\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Tool / function call — gear\n case \"tool\":\n case \"function\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke={color} strokeWidth=\"1.5\" />\n {[0, 45, 90, 135, 180, 225, 270, 315].map((angle) => {\n const rad = (angle * Math.PI) / 180;\n const x1 = 8 + Math.cos(rad) * 4.5;\n const y1 = 8 + Math.sin(rad) * 4.5;\n const x2 = 8 + Math.cos(rad) * 6;\n const y2 = 8 + Math.sin(rad) * 6;\n return <line key={angle} x1={x1} y1={y1} x2={x2} y2={y2} stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />;\n })}\n </svg>\n );\n\n // RAG / retrieval — magnifying glass + doc\n case \"rag\":\n case \"search\":\n case \"retrieval\":\n return (\n <svg {...props}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" stroke={color} strokeWidth=\"1.5\" />\n <line x1=\"10\" y1=\"10\" x2=\"13.5\" y2=\"13.5\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"6\" x2=\"8.5\" y2=\"6\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n <line x1=\"5.5\" y1=\"8\" x2=\"7.5\" y2=\"8\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Parse / process — diamond with arrows\n case \"parse\":\n case \"process\":\n case \"transform\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke={color} strokeWidth=\"1.5\" transform=\"rotate(45 8 8)\" />\n </svg>\n );\n\n // Start / seed — play triangle\n case \"start\":\n case \"seed\":\n case \"init\":\n return (\n <svg {...props}>\n <path d=\"M5 3.5L12.5 8L5 12.5V3.5Z\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // End / finalize — stop square\n case \"end\":\n case \"finalize\":\n case \"output\":\n return (\n <svg {...props}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} opacity=\"0.8\" />\n </svg>\n );\n\n // Agent — person silhouette\n case \"agent\":\n case \"orchestrator\":\n return (\n <svg {...props}>\n <circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke={color} strokeWidth=\"1.5\" />\n <path d=\"M3.5 14C3.5 11 5.5 9 8 9S12.5 11 12.5 14\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n\n // Swarm — multi-agent\n case \"swarm\":\n case \"multi-agent\":\n return (\n <svg {...props}>\n <circle cx=\"5\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"11\" cy=\"5\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <circle cx=\"8\" cy=\"11\" r=\"2\" stroke={color} strokeWidth=\"1.2\" />\n <line x1=\"5\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n <line x1=\"11\" y1=\"7\" x2=\"8\" y2=\"9\" stroke={color} strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n );\n\n // Guard / guardrail — shield\n case \"guard\":\n case \"guardrail\":\n case \"validate\":\n return (\n <svg {...props}>\n <path d=\"M8 2L3 5V9C3 11.5 5 13.5 8 14.5C11 13.5 13 11.5 13 9V5L8 2Z\" stroke={color} strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M6 8L7.5 9.5L10 6.5\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n\n // Stream — wave\n case \"stream\":\n case \"streaming\":\n return (\n <svg {...props}>\n <path d=\"M2 8C4 5 6 11 8 8S12 5 14 8\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M2 11C4 8 6 14 8 11S12 8 14 11\" stroke={color} strokeWidth=\"1\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.5\" />\n </svg>\n );\n\n // Memory / state — database cylinder\n case \"memory\":\n case \"state\":\n case \"db\":\n return (\n <svg {...props}>\n <ellipse cx=\"8\" cy=\"4.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"3\" y1=\"4.5\" x2=\"3\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"11.5\" stroke={color} strokeWidth=\"1.3\" />\n <ellipse cx=\"8\" cy=\"11.5\" rx=\"5\" ry=\"2\" stroke={color} strokeWidth=\"1.3\" />\n </svg>\n );\n\n // Loop — circular arrow\n case \"loop\":\n case \"retry\":\n return (\n <svg {...props}>\n <path d=\"M12 8A4 4 0 1 1 8 4\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" />\n <path d=\"M8 1.5L10.5 4L8 6.5\" stroke={color} strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" />\n </svg>\n );\n\n // Lazy / service — cloud (deferred resolution, loaded on demand)\n case \"lazy\":\n case \"service\":\n case \"cloud\":\n return (\n <svg {...props}>\n <path\n d=\"M4.5 12C2.8 12 1.5 10.7 1.5 9C1.5 7.5 2.5 6.3 3.8 6C4 4 5.8 2.5 8 2.5C9.8 2.5 11.3 3.5 11.9 5C13.9 5.2 15.5 6.8 15.5 8.8C15.5 10.8 13.9 12.5 11.8 12.5H4.5\"\n stroke={color}\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n\n // Decision — diamond (already handled by isDecider shape)\n case \"decision\":\n case \"router\":\n return (\n <svg {...props}>\n <path d=\"M8 2L14 8L8 14L2 8Z\" stroke={color} strokeWidth=\"1.5\" fill=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill={color} />\n </svg>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Custom ReactFlow node for pipeline stages.\n * All colors and fonts come from `--fp-*` CSS variables (via theme).\n * Shows execution state via color, icon, step badge, and pulse animation.\n */\nexport const StageNode = memo(function StageNode({\n data,\n}: NodeProps & { data: StageNodeData }) {\n const { label, active, done, error, linked, icon, stepNumbers, dimmed, isSubflow, isLazy, isDecider, isFork, description } = data;\n\n // Lazy nodes show cloud icon by default (unless another icon is specified)\n const effectiveIcon = icon || (isLazy ? \"lazy\" : undefined);\n // Lazy + unresolved = dashed border\n const isLazyUnresolved = isLazy && !done && !active;\n\n // Inject keyframes once into document head\n const injectedRef = useRef(false);\n useEffect(() => {\n if (injectedRef.current) return;\n if (typeof document !== \"undefined\" && !document.getElementById(KEYFRAMES_ID)) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = KEYFRAMES_ID;\n styleEl.textContent = KEYFRAMES_CSS;\n document.head.appendChild(styleEl);\n }\n injectedRef.current = true;\n }, []);\n\n const isOnPath = active || done;\n\n const bg = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.bgSecondary;\n\n const borderColor = active\n ? theme.primary\n : done\n ? theme.success\n : error\n ? theme.error\n : theme.border;\n\n const shadow = active\n ? `0 0 16px color-mix(in srgb, ${theme.primary} 40%, transparent)`\n : done\n ? `0 0 8px color-mix(in srgb, ${theme.success} 20%, transparent)`\n : error\n ? `0 0 12px color-mix(in srgb, ${theme.error} 30%, transparent)`\n : `0 2px 8px rgba(0,0,0,0.15)`;\n\n // Colored states use white for contrast; default uses consumer's text color.\n const textColor =\n active || done || error ? \"#fff\" : theme.textPrimary;\n\n return (\n <>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n {/* Step number badges — multiple when revisited via loops */}\n {stepNumbers && stepNumbers.length > 0 && isOnPath && (\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: -10,\n display: \"flex\",\n gap: 3,\n zIndex: 10,\n }}\n >\n {stepNumbers.map((num, i) => {\n const isLatest = i === stepNumbers.length - 1;\n const badgeBg = isLatest && active ? theme.primary : theme.success;\n const glow = isLatest && active\n ? `color-mix(in srgb, ${theme.primary} 50%, transparent)`\n : `color-mix(in srgb, ${theme.success} 40%, transparent)`;\n return (\n <div\n key={num}\n style={{\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: badgeBg,\n color: \"#fff\",\n fontSize: 11,\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: `0 0 8px ${glow}`,\n }}\n >\n {num}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Linked pulse ring */}\n {linked && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.4,\n animation: \"fp-pulse 2s ease-in-out infinite\",\n }}\n />\n )}\n\n {/* Active node pulse ring */}\n {active && (\n <div\n style={{\n position: \"absolute\",\n inset: -6,\n borderRadius: isDecider ? 0 : `calc(${theme.radius} + 4px)`,\n clipPath: isDecider ? \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" : undefined,\n border: `2px solid ${theme.primary}`,\n opacity: 0.3,\n animation: \"fp-pulse 1.5s ease-out infinite\",\n }}\n />\n )}\n\n {/* Diamond for decider nodes — proper diamond via clip-path */}\n {isDecider ? (\n <div style={{ position: \"relative\", width: 120, height: 72 }}>\n {/* Diamond shape layer */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: bg,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n border: \"none\",\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n }}\n />\n {/* Border layer — slightly larger diamond behind */}\n <div\n style={{\n position: \"absolute\",\n inset: -2,\n clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\",\n background: borderColor,\n zIndex: -1,\n ...(isLazyUnresolved ? {\n background: \"transparent\",\n // Dashed border via SVG for clip-path (CSS border doesn't work with clip-path)\n } : {}),\n }}\n />\n {/* Content — centered on top of diamond */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 1,\n fontFamily: theme.fontSans,\n zIndex: 1,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n {!effectiveIcon && (\n <span style={{ fontSize: 9, color: textColor }}>◇</span>\n )}\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n </div>\n {description && (\n <span\n style={{\n fontSize: 8,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 100,\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n ) : (\n /* Standard rectangular node */\n <div\n style={{\n background: bg,\n border: `2px ${isLazyUnresolved ? \"dashed\" : \"solid\"} ${borderColor}`,\n borderRadius: theme.radius,\n padding: description ? \"8px 16px\" : \"10px 20px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: description ? 2 : 0,\n boxShadow: shadow,\n transition: \"all 0.3s ease\",\n fontFamily: theme.fontSans,\n minWidth: 100,\n justifyContent: \"center\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {/* Semantic icon (lazy nodes default to cloud icon) */}\n {effectiveIcon && <StageIcon type={effectiveIcon} color={textColor} />}\n\n {/* State icon */}\n {done && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✓</span>\n )}\n {active && !effectiveIcon && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: \"#fff\",\n animation: \"fp-blink 1s ease-in-out infinite\",\n flexShrink: 0,\n }}\n />\n )}\n {error && !effectiveIcon && (\n <span style={{ fontSize: 10, color: textColor }}>✗</span>\n )}\n\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: textColor,\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </span>\n {/* Subflow indicator — nested boxes icon */}\n {isSubflow && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: 3,\n border: `1.5px solid ${textColor}`,\n position: \"relative\",\n opacity: 0.7,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: 2,\n border: `1px solid ${textColor}`,\n }}\n />\n </span>\n )}\n </div>\n {/* Description subtitle */}\n {description && (\n <span\n style={{\n fontSize: 10,\n fontWeight: 400,\n color: textColor,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: 160,\n }}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {/* Right-side handles for loop-back edges (so they don't overlap center edges) */}\n <Handle\n id=\"loop-source\"\n type=\"source\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n <Handle\n id=\"loop-target\"\n type=\"target\"\n position={Position.Right}\n style={{ background: \"transparent\", border: \"none\", width: 6, height: 6 }}\n />\n </>\n );\n});\n","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","/**\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","/**\n * Dumb flowchart renderer — spec + snapshots → ReactFlow graph with overlay.\n *\n * No internal navigation state. The consumer (ExplainableShell) owns\n * drill-down, breadcrumb, and SubflowTree. This component just renders\n * whatever spec + snapshots it receives at any level.\n *\n * Usage:\n * <TracedFlowchartView spec={spec} /> // static\n * <TracedFlowchartView spec={spec} snapshots={snaps} snapshotIndex={idx} /> // traced\n */\nimport { useMemo, useCallback, useEffect } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n useReactFlow,\n} from \"@xyflow/react\";\nimport type { Node, NodeTypes } from \"@xyflow/react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { StageNode } from \"../StageNode\";\nimport { specToLayout, applyOverlay } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay } from \"./specToReactFlow\";\n\nexport interface TracedFlowchartViewProps extends BaseComponentProps {\n /** Pipeline spec from builder.toSpec() — for the current level */\n spec: SpecNode;\n /** Visualization snapshots (enables trace overlay when provided) */\n snapshots?: StageSnapshot[];\n /** Current time-travel position */\n snapshotIndex?: number;\n /** Callback when a node is clicked (receives snapshot index, or node id if no snapshots) */\n onNodeClick?: (indexOrId: number | string) => void;\n /** Override default node types */\n nodeTypes?: NodeTypes;\n}\n\nconst defaultNodeTypes: NodeTypes = { stage: StageNode as any };\n\n/** Calls fitView when the container resizes (e.g. panel expand/collapse). */\nfunction FitViewOnResize() {\n const { fitView } = useReactFlow();\n useEffect(() => {\n const handler = () => { requestAnimationFrame(() => fitView({ padding: 0.3 })); };\n window.addEventListener(\"resize\", handler);\n return () => window.removeEventListener(\"resize\", handler);\n }, [fitView]);\n return null;\n}\n\nexport function TracedFlowchartView({\n spec,\n snapshots,\n snapshotIndex = 0,\n onNodeClick,\n nodeTypes: customNodeTypes,\n unstyled = false,\n className,\n style,\n}: TracedFlowchartViewProps) {\n const nodeTypes = customNodeTypes ?? defaultNodeTypes;\n\n // Compute execution overlay from snapshots + index\n const overlay = useMemo<ExecutionOverlay | undefined>(() => {\n if (!snapshots || snapshots.length === 0) return undefined;\n const executionOrder = snapshots\n .slice(0, snapshotIndex + 1)\n .map((s) => s.stageLabel);\n const doneStages = new Set(\n snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel)\n );\n const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;\n const executedStages = new Set([...doneStages]);\n if (activeStage) executedStages.add(activeStage);\n return { doneStages, activeStage, executedStages, executionOrder };\n }, [snapshots, snapshotIndex]);\n\n // Phase 1: static layout — only recomputes when spec changes\n const layout = useMemo(() => {\n if (!spec) return null;\n return specToLayout(spec);\n }, [spec]);\n\n // Phase 2: apply overlay — cheap, runs per slider tick\n const { nodes, edges } = useMemo(() => {\n if (!layout) return { nodes: [], edges: [] };\n return applyOverlay(layout, overlay);\n }, [layout, overlay]);\n\n // Handle node clicks — always send string node id.\n // The consumer (ExplainableShell) decides whether to drill into a subflow\n // or jump to a snapshot index based on the node name.\n const handleNodeClick = useCallback(\n (_: unknown, node: Node) => {\n if (!onNodeClick) return;\n onNodeClick(node.id);\n },\n [onNodeClick]\n );\n\n return (\n <div\n className={className}\n style={{ width: \"100%\", height: \"100%\", ...style }}\n data-fp=\"traced-flowchart\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodeClick={handleNodeClick}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{ padding: 0.3 }}\n proOptions={{ hideAttribution: true }}\n panOnDrag={false}\n zoomOnScroll={false}\n zoomOnPinch={false}\n zoomOnDoubleClick={false}\n preventScrolling={false}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={!!onNodeClick}\n >\n <FitViewOnResize />\n {!unstyled && (\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} />\n )}\n </ReactFlow>\n </div>\n );\n}\n","/**\n * Converts a SerializedPipelineStructure (from builder.toSpec()) into\n * ReactFlow nodes and edges with auto-layout.\n *\n * Two-phase approach for performance:\n * 1. `specToLayout(spec)` — tree walk + positioning (expensive, cached on spec)\n * 2. `applyOverlay(layout, overlay)` — color nodes/edges (cheap, runs per slider tick)\n *\n * `specToReactFlow(spec, overlay)` combines both for convenience.\n */\nimport type { Node, Edge } from \"@xyflow/react\";\nimport { rawDefaults } from \"../../theme/tokens\";\n\nexport interface SpecNode {\n name: string;\n id?: string;\n type?: \"stage\" | \"decider\" | \"fork\" | \"streaming\";\n /** Semantic icon hint — rendered by StageNode. Common values:\n * \"llm\", \"tool\", \"rag\", \"search\", \"parse\", \"start\", \"end\", \"loop\",\n * \"agent\", \"swarm\", \"guard\", \"stream\", \"memory\" */\n icon?: string;\n description?: string;\n children?: SpecNode[];\n next?: SpecNode;\n branchIds?: string[];\n hasDecider?: boolean;\n hasSelector?: boolean;\n loopTarget?: string;\n isSubflowRoot?: boolean;\n subflowId?: string;\n subflowName?: string;\n subflowStructure?: SpecNode;\n /** True when this subflow uses lazy resolution (deferred until execution). */\n isLazy?: boolean;\n}\n\nexport interface ExecutionOverlay {\n /** Names of stages that have completed (before the active one) */\n doneStages: Set<string>;\n /** Name of the currently active stage */\n activeStage: string | null;\n /** Names of all stages that were executed (done + active) */\n executedStages: Set<string>;\n /** Ordered list of executed stage names (for step numbering) */\n executionOrder?: string[];\n}\n\n/** Colors for the flowchart — consumer provides these to match their theme */\nexport interface FlowchartColors {\n edgeDefault: string;\n edgeExecuted: string;\n edgeActive: string;\n edgeLoop: string;\n labelDefault: string;\n labelExecuted: string;\n labelLoop: string;\n pathGlow: string;\n}\n\n/** Default colors derived from raw theme defaults. Consumer can override per-call. */\nconst DEFAULT_COLORS: FlowchartColors = {\n edgeDefault: rawDefaults.colors.textMuted,\n edgeExecuted: rawDefaults.colors.success,\n edgeActive: rawDefaults.colors.primary,\n edgeLoop: rawDefaults.colors.warning,\n labelDefault: rawDefaults.colors.textSecondary,\n labelExecuted: rawDefaults.colors.success,\n labelLoop: rawDefaults.colors.warning,\n pathGlow: `${rawDefaults.colors.success}4D`, // ~30% opacity hex\n};\n\n// ---------------------------------------------------------------------------\n// Phase 1: Static layout (expensive — depends only on spec)\n// ---------------------------------------------------------------------------\n\n/** A positioned node with all static info, before overlay is applied. */\nexport interface LayoutNode {\n id: string;\n x: number;\n y: number;\n label: string;\n isDecider: boolean;\n isFork: boolean;\n description?: string;\n icon?: string;\n subflowId?: string;\n isSubflow: boolean;\n isLazy?: boolean;\n}\n\n/** A positioned edge with source/target info. */\nexport interface LayoutEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n isLoop: boolean;\n}\n\n/** Static layout output — positions + structure, no execution state. */\nexport interface SpecLayout {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n /** Maps stage ID → node id for resolving loopTarget references. */\n idToName: Map<string, string>;\n}\n\nconst Y_STEP = 100;\nconst X_SPREAD = 200;\n\nfunction nid(n: SpecNode): string {\n return n.name || n.id || `spec-${Math.random()}`;\n}\n\ninterface WalkState {\n nodes: LayoutNode[];\n edges: LayoutEdge[];\n edgeCounter: number;\n seen: Set<string>;\n idToName: Map<string, string>;\n}\n\nfunction registerNode(state: WalkState, node: SpecNode): void {\n if (node.id && node.name) {\n state.idToName.set(node.id, node.name);\n }\n}\n\nfunction walkLayout(\n node: SpecNode,\n state: WalkState,\n x: number,\n y: number,\n): { lastIds: string[]; bottomY: number } {\n if (!node) return { lastIds: [], bottomY: y };\n registerNode(state, node);\n const id = nid(node);\n\n if (state.seen.has(id)) {\n return { lastIds: [id], bottomY: y };\n }\n state.seen.add(id);\n\n const isDecider = node.type === \"decider\" || !!node.hasDecider;\n const isFork = node.type === \"fork\";\n\n state.nodes.push({\n id,\n x,\n y,\n label: node.name,\n isDecider,\n isFork,\n description: node.description,\n icon: node.icon,\n subflowId: node.subflowId,\n isSubflow: !!node.isSubflowRoot,\n isLazy: node.isLazy,\n });\n\n let lastIds = [id];\n let bottomY = y;\n\n // Handle children (fork/decider branches)\n if (node.children && node.children.length > 0) {\n const totalWidth = (node.children.length - 1) * X_SPREAD;\n const startX = x - totalWidth / 2;\n const childY = y + Y_STEP;\n const childResults: { lastIds: string[]; bottomY: number }[] = [];\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const childX = startX + i * X_SPREAD;\n const edgeLabel = node.branchIds?.[i];\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: nid(child), label: edgeLabel, isLoop: false });\n const result = walkLayout(child, state, childX, childY);\n childResults.push(result);\n }\n\n lastIds = childResults.flatMap((r) => r.lastIds);\n bottomY = Math.max(...childResults.map((r) => r.bottomY));\n }\n\n // Loop-back edge\n if (node.loopTarget) {\n const resolvedTarget = state.idToName.get(node.loopTarget) ?? node.loopTarget;\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: id, target: resolvedTarget, label: \"loop\", isLoop: true });\n }\n\n // Linear continuation\n if (node.next) {\n const rawNextId = nid(node.next);\n const resolvedNextId = state.idToName.get(rawNextId) ?? rawNextId;\n const isLoopRef = node.loopTarget && state.seen.has(resolvedNextId);\n\n if (isLoopRef) {\n return { lastIds, bottomY };\n }\n\n const nextY = bottomY + Y_STEP;\n for (const lid of lastIds) {\n state.edgeCounter++;\n state.edges.push({ id: `se${state.edgeCounter}`, source: lid, target: resolvedNextId, isLoop: false });\n }\n return walkLayout(node.next, state, x, nextY);\n }\n\n return { lastIds, bottomY };\n}\n\n/**\n * Phase 1: Compute static layout from spec. Cached on spec reference — only\n * recomputes when the pipeline structure changes, not on every slider tick.\n */\nexport function specToLayout(spec: SpecNode): SpecLayout {\n const state: WalkState = {\n nodes: [],\n edges: [],\n edgeCounter: 0,\n seen: new Set(),\n idToName: new Map(),\n };\n walkLayout(spec, state, 300, 0);\n return { nodes: state.nodes, edges: state.edges, idToName: state.idToName };\n}\n\n// ---------------------------------------------------------------------------\n// Phase 2: Apply overlay (cheap — runs per slider tick)\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 2: Apply execution overlay to static layout.\n * Produces ReactFlow nodes/edges with correct colors, step numbers, and glow.\n */\nexport function applyOverlay(\n layout: SpecLayout,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const c = { ...DEFAULT_COLORS, ...colors };\n const o = overlay ?? null;\n\n // Nodes\n const nodes: Node[] = layout.nodes.map((ln) => {\n const isDone = o ? o.doneStages.has(ln.id) : false;\n const isActive = o ? o.activeStage === ln.id : false;\n const wasExecuted = o ? o.executedStages.has(ln.id) : false;\n const dimmed = o && !wasExecuted;\n\n let stepNumbers: number[] | undefined;\n if (o?.executionOrder) {\n const nums: number[] = [];\n for (let i = 0; i < o.executionOrder.length; i++) {\n if (o.executionOrder[i] === ln.id) nums.push(i + 1);\n }\n if (nums.length > 0) stepNumbers = nums;\n }\n\n return {\n id: ln.id,\n position: { x: ln.x, y: ln.y },\n data: {\n label: ln.label,\n active: isActive,\n done: isDone,\n error: false,\n isDecider: ln.isDecider,\n isFork: ln.isFork,\n description: ln.description,\n icon: ln.icon,\n subflowId: ln.subflowId,\n dimmed,\n stepNumbers,\n isSubflow: ln.isSubflow,\n isLazy: ln.isLazy,\n },\n type: \"stage\" as const,\n style: dimmed ? { opacity: 0.35 } : undefined,\n };\n });\n\n // Edges\n const edges: Edge[] = [];\n for (const le of layout.edges) {\n const executed = o && o.executedStages.has(le.source) && o.executedStages.has(le.target);\n const isLeadingEdge = o && le.source === o.activeStage && !o.doneStages.has(le.target);\n\n if (le.isLoop) {\n let loopExecuted = false;\n if (o?.executionOrder) {\n const lastSourceIdx = o.executionOrder.lastIndexOf(le.source);\n if (lastSourceIdx >= 0) {\n loopExecuted = o.executionOrder.slice(lastSourceIdx + 1).includes(le.target);\n }\n }\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n sourceHandle: \"loop-source\",\n targetHandle: \"loop-target\",\n label: le.label ?? \"loop\",\n type: \"smoothstep\",\n pathOptions: { offset: 40, borderRadius: 16 },\n style: {\n stroke: c.edgeLoop,\n strokeWidth: loopExecuted ? 3 : 2,\n strokeDasharray: \"6 3\",\n opacity: o && !loopExecuted ? 0.35 : 1,\n },\n labelStyle: { fontSize: 10, fontWeight: 700, fill: c.labelLoop },\n animated: loopExecuted,\n zIndex: 2,\n } as Edge);\n } else if (executed) {\n // Glow layer\n edges.push({\n id: `${le.id}-glow`,\n source: le.source,\n target: le.target,\n style: { stroke: c.pathGlow, strokeWidth: 8, opacity: 0.4 },\n zIndex: 0,\n selectable: false,\n focusable: false,\n });\n // Route line\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: isLeadingEdge ? c.edgeActive : c.edgeExecuted,\n strokeWidth: 3.5,\n },\n labelStyle: { fontSize: 10, fontWeight: 600, fill: c.labelExecuted },\n animated: !!isLeadingEdge,\n zIndex: 1,\n });\n } else {\n edges.push({\n id: le.id,\n source: le.source,\n target: le.target,\n label: le.label,\n style: {\n stroke: c.edgeDefault,\n strokeWidth: 1.5,\n opacity: o ? 0.3 : 1,\n },\n labelStyle: { fontSize: 10, fill: c.labelDefault },\n });\n }\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience: combined single-call (backwards compatible)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a pipeline spec to ReactFlow graph.\n * Pass `overlay` to color nodes/edges by execution state.\n */\nexport function specToReactFlow(\n spec: SpecNode,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>,\n): { nodes: Node[]; edges: Edge[] } {\n const layout = specToLayout(spec);\n return applyOverlay(layout, overlay, colors);\n}\n","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","import { useState, useCallback, useMemo } from \"react\";\nimport { specToReactFlow } from \"./specToReactFlow\";\nimport type { SpecNode, ExecutionOverlay, FlowchartColors } from \"./specToReactFlow\";\nimport type { Node, Edge } from \"@xyflow/react\";\n\nexport interface BreadcrumbEntry {\n /** Display name for this level */\n label: string;\n /** The spec node tree at this level */\n spec: SpecNode;\n /** Human-readable description of this subflow */\n description?: string;\n}\n\nexport interface SubflowNavigation {\n /** Current breadcrumb path (root → ... → current) */\n breadcrumbs: BreadcrumbEntry[];\n /** Current level's ReactFlow nodes */\n nodes: Node[];\n /** Current level's ReactFlow edges */\n edges: Edge[];\n /** Call when a node is clicked — drills in if it's a subflow */\n handleNodeClick: (nodeId: string) => boolean;\n /** Navigate to a specific breadcrumb level (0 = root) */\n navigateTo: (level: number) => void;\n /** Whether we're currently inside a subflow (not at root) */\n isInSubflow: boolean;\n /** Name of the subflow node we drilled into (for finding execution data) */\n currentSubflowNodeName: string | null;\n}\n\n/**\n * Hook that manages subflow drill-down navigation for a flowchart spec.\n *\n * Maintains a breadcrumb stack. When a subflow node is clicked, pushes its\n * nested spec onto the stack and re-derives nodes/edges. Breadcrumb clicks\n * pop back to that level.\n */\nexport function useSubflowNavigation(\n rootSpec: SpecNode | null,\n overlay?: ExecutionOverlay,\n colors?: Partial<FlowchartColors>\n): SubflowNavigation {\n const [stack, setStack] = useState<BreadcrumbEntry[]>([]);\n\n // Current spec = top of stack, or root\n const currentSpec = stack.length > 0 ? stack[stack.length - 1].spec : rootSpec;\n\n // Derive nodes/edges from current spec\n // Overlay is always passed through — consumer provides the appropriate overlay\n // (root overlay at root level, subflow overlay when drilled in)\n const { nodes, edges } = useMemo(() => {\n if (!currentSpec) return { nodes: [], edges: [] };\n return specToReactFlow(currentSpec, overlay, colors);\n }, [currentSpec, overlay, colors]);\n\n // Build a lookup of subflow nodes at the current level\n const subflowMap = useMemo(() => {\n const map = new Map<string, SpecNode>();\n if (!currentSpec) return map;\n\n function collectSubflows(node: SpecNode) {\n if (node.isSubflowRoot && node.subflowStructure) {\n const id = node.name || node.id || \"\";\n map.set(id, node);\n }\n if (node.children) node.children.forEach(collectSubflows);\n if (node.next) collectSubflows(node.next);\n }\n collectSubflows(currentSpec);\n return map;\n }, [currentSpec]);\n\n const breadcrumbs: BreadcrumbEntry[] = useMemo(() => {\n const root: BreadcrumbEntry = {\n label: rootSpec?.name || \"Flowchart\",\n spec: rootSpec!,\n description: rootSpec?.description,\n };\n return [root, ...stack];\n }, [rootSpec, stack]);\n\n const handleNodeClick = useCallback(\n (nodeId: string): boolean => {\n const subflowNode = subflowMap.get(nodeId);\n if (!subflowNode?.subflowStructure) return false;\n\n setStack((prev) => [\n ...prev,\n {\n label: subflowNode.subflowName || subflowNode.name,\n spec: subflowNode.subflowStructure!,\n description: subflowNode.description,\n },\n ]);\n return true;\n },\n [subflowMap]\n );\n\n const navigateTo = useCallback(\n (level: number) => {\n if (level === 0) {\n setStack([]);\n } else {\n setStack((prev) => prev.slice(0, level));\n }\n },\n []\n );\n\n return {\n breadcrumbs,\n nodes,\n edges,\n handleNodeClick,\n navigateTo,\n isInSubflow: stack.length > 0,\n currentSubflowNodeName: stack.length > 0 ? stack[stack.length - 1].label : null,\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 { useState } from \"react\";\nimport type { Node, Edge } from \"@xyflow/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\";\nimport { FlowchartView } from \"../FlowchartView\";\n\nexport interface TimeTravelDebuggerProps extends BaseComponentProps {\n /** Stage snapshots */\n snapshots: StageSnapshot[];\n /** ReactFlow nodes (required for flowchart) */\n nodes: Node[];\n /** ReactFlow edges (required for flowchart) */\n edges: Edge[];\n /** Show Gantt timeline */\n showGantt?: boolean;\n /** Layout direction */\n layout?: \"horizontal\" | \"vertical\";\n /** Title */\n title?: string;\n}\n\n/**\n * Full time-travel debugger: scrubber + flowchart + memory + narrative + gantt.\n * This is the \"batteries included\" component for pipeline debugging.\n */\nexport function TimeTravelDebugger({\n snapshots,\n nodes,\n edges,\n showGantt = true,\n layout = \"horizontal\",\n title = \"Time-Travel Debugger\",\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: TimeTravelDebuggerProps) {\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: theme.textMuted,\n ...style,\n }}\n >\n No snapshots to debug\n </div>\n );\n }\n\n const isHorizontal = layout === \"horizontal\";\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"time-travel-debugger\">\n <h3>{title}</h3>\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 <FlowchartView\n nodes={nodes}\n edges={edges}\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onNodeClick={setSelectedIndex}\n unstyled\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=\"time-travel-debugger\"\n >\n {/* Scrubber header */}\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: 8,\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 }}\n >\n Scrub to replay execution\n </span>\n </div>\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 <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n flexShrink: 0,\n fontFamily: theme.fontMono,\n }}\n >\n {selectedIndex + 1}/{snapshots.length}\n </span>\n </div>\n </div>\n\n {/* Main content: flowchart + data panels */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: isHorizontal ? \"row\" : \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* Flowchart */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n borderRight: isHorizontal\n ? `1px solid ${theme.border}`\n : \"none\",\n borderBottom: !isHorizontal\n ? `1px solid ${theme.border}`\n : \"none\",\n }}\n >\n <FlowchartView\n nodes={nodes}\n edges={edges}\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onNodeClick={setSelectedIndex}\n size={size}\n />\n </div>\n\n {/* Data panel */}\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 </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, 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, 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"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","StageNode","import_jsx_runtime","import_react","import_jsx_runtime","nodeTypes","import_react","import_jsx_runtime","SubflowBreadcrumb","import_react","import_react","import_jsx_runtime","TreeNode","SectionLabel","SubflowTree","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime"]}
|