@railtownai/railtracks-visualizer 0.0.13 → 0.0.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../node_modules/style-inject/dist/style-inject.es.js","../../src/components/Edge.tsx","../../src/components/Node.tsx","../../src/components/Timeline.tsx","../../src/components/VerticalTimeline.tsx","../../src/AgenticFlowVisualizer.tsx","../../src/Visualizer.tsx","../../node_modules/tslib/tslib.es6.js","../../src/hooks/useApi.ts","../../src/hooks/useFlowData.ts","../../src/components/FileSelector.tsx","../../src/App.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useMemo, useState, useEffect } from \"react\";\n\ninterface EdgeProps {\n id: string;\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: any;\n targetPosition: any;\n style?: React.CSSProperties;\n markerEnd?: string;\n bidirectional?: boolean;\n data?: {\n label?: string;\n source?: string;\n target?: string;\n step?: number;\n time?: number;\n details?: any;\n };\n clientToSvgCoords?: (clientX: number, clientY: number) => { x: number; y: number };\n svgRef?: React.RefObject<SVGSVGElement>;\n onInspect?: (edgeData: any) => void;\n}\n\nexport const Edge: React.FC<EdgeProps> = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n bidirectional = false,\n data,\n clientToSvgCoords,\n svgRef,\n onInspect\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Function to determine stroke color based on edge state\n const getStrokeColor = () => {\n const state = data?.details?.state;\n switch (state) {\n case \"Open\":\n return \"#000000\"; // Black\n case \"Completed\":\n return \"#15803d\"; // Darker Green\n case \"Error\":\n return \"#ef4444\"; // Red\n default:\n return style.stroke || \"#6366f1\"; // Default color\n }\n };\n\n const [edgePath, arrowMarkers] = useMemo(() => {\n // Always use curved paths for better visual appeal\n const centerX = (sourceX + targetX) / 2;\n const centerY = (sourceY + targetY) / 2;\n const path = `M ${sourceX} ${sourceY} Q ${centerX} ${centerY} ${targetX} ${targetY}`;\n\n // Create arrow markers for bidirectional edges\n const markers = [];\n if (bidirectional) {\n const strokeColor = getStrokeColor();\n // Forward arrow (source to target)\n markers.push(\n <defs key={`${id}-markers`}>\n <marker\n id={`${id}-arrowhead-forward`}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n <marker\n id={`${id}-arrowhead-backward`}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"1\"\n refY=\"3.5\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <polygon points=\"10 0, 0 3.5, 10 7\" fill={strokeColor} />\n </marker>\n </defs>\n );\n }\n\n return [path, markers];\n }, [sourceX, sourceY, targetX, targetY, id, bidirectional, data?.details?.state]);\n\n const hoverStyle = {\n ...style,\n stroke: getStrokeColor(),\n strokeWidth: style.strokeWidth || 4,\n cursor: \"pointer\"\n };\n\n const handleInspectClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n if (onInspect && data) {\n onInspect(data);\n }\n };\n\n return (\n <g data-edge-id={id}>\n {arrowMarkers}\n <path\n id={id}\n className=\"react-flow__edge-path\"\n d={edgePath}\n markerEnd={bidirectional ? `url(#${id}-arrowhead-forward)` : markerEnd}\n markerStart={bidirectional ? `url(#${id}-arrowhead-backward)` : undefined}\n style={hoverStyle}\n />\n\n {/* Edge Label Renderer */}\n {data?.label && (\n <foreignObject\n x={(sourceX + targetX) / 2 - 50}\n y={(sourceY + targetY) / 2 - 20}\n width=\"100\"\n height=\"40\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}\n >\n <div\n className=\"edge-label-renderer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"auto\"\n }}\n >\n <button\n className=\"edge-label-button\"\n onClick={handleInspectClick}\n style={{\n background: \"#6366f1\",\n color: \"white\",\n border: \"none\",\n borderRadius: 6,\n padding: \"4px 12px\",\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(99,102,241,0.10)\",\n transition: \"background 0.2s\"\n }}\n >\n Inspect\n </button>\n </div>\n </foreignObject>\n )}\n\n <style>\n {`\n .edge-label-renderer {\n z-index: 8001;\n user-select: none;\n pointer-events: auto;\n }\n\n .edge-label-button {\n pointer-events: auto;\n }\n `}\n </style>\n </g>\n );\n};\n","import React from \"react\";\nimport { Handle, Position, useReactFlow } from \"reactflow\";\n\ninterface NodeData {\n label: string;\n description?: string;\n nodeType?: string;\n step?: number;\n time?: number;\n icon?: string;\n onInspect?: (nodeData: any) => void;\n id?: string; // Add id for zoom functionality\n edges?: any[]; // Add edges to node data\n}\n\ninterface NodeProps {\n data: NodeData;\n id: string;\n}\n\nconst Node: React.FC<NodeProps> = ({ data, id }) => {\n const { fitView } = useReactFlow();\n\n // Check if this node has any outgoing edges (source edges)\n const hasOutgoingEdges = data.edges?.some((edge: any) => edge.source === id) || false;\n\n const handleNodeClick = () => {\n // Zoom to the node\n fitView({\n nodes: [{ id }],\n duration: 800,\n padding: 0.1,\n minZoom: 0.5,\n maxZoom: 1.5\n });\n\n // Open inspection drawer\n if (data.onInspect) {\n data.onInspect({\n label: data.label,\n description: data.description,\n nodeType: data.nodeType,\n step: data.step,\n time: data.time,\n icon: data.icon\n });\n }\n };\n\n return (\n <>\n <div className=\"agent-node\" onClick={handleNodeClick} style={{ cursor: \"pointer\" }}>\n <Handle type=\"target\" position={Position.Top} style={{ background: \"#6366f1\" }} />\n <div className=\"agent-header\">\n <div className=\"agent-icon\">{data.icon || \"📋\"}</div>\n <div className=\"agent-label\">{data.label}</div>\n </div>\n {data.description && <div className=\"agent-description\">{data.description}</div>}\n {data.step && (\n <div className=\"agent-meta\">\n <span className=\"step\">Step: {data.step}</span>\n {data.time && <span className=\"time\">{new Date(data.time * 1000).toLocaleTimeString()}</span>}\n </div>\n )}\n {hasOutgoingEdges && <Handle type=\"source\" position={Position.Bottom} style={{ background: \"#6366f1\" }} />}\n </div>\n\n <style>\n {`\n .agent-node {\n padding: 12px;\n border-radius: 8px;\n background: white;\n border: 2px solid #e5e7eb;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n min-width: 200px;\n max-width: 250px;\n transition: all 0.2s ease;\n position: relative;\n z-index: -5;\n }\n \n .agent-node:hover {\n border-color: #6366f1;\n box-shadow: 0 4px 8px rgba(99, 102, 241, 0.2);\n }\n \n .agent-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n \n .agent-icon {\n font-size: 20px;\n }\n \n .agent-label {\n font-weight: 600;\n color: #1f2937;\n font-size: 14px;\n word-break: break-word;\n }\n \n .agent-description {\n color: #6b7280;\n font-size: 12px;\n line-height: 1.4;\n word-break: break-word;\n white-space: pre-line;\n }\n \n .agent-meta {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid #e5e7eb;\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #9ca3af;\n }\n \n .step {\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n }\n \n .time {\n font-family: monospace;\n }\n \n .react-flow__handle {\n width: 8px;\n height: 8px;\n border: 2px solid #6366f1;\n }\n `}\n </style>\n </>\n );\n};\n\nexport { Node };\nexport type { NodeData };\n","import React, { useEffect } from \"react\";\n\ninterface TimelineProps {\n stamps: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n currentStep: number;\n isPlaying: boolean;\n onStepChange: (step: number) => void;\n onPlayPause: () => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({ stamps, currentStep, isPlaying, onStepChange, onPlayPause }) => {\n const maxStep = stamps.length > 0 ? Math.max(...stamps.map((s) => s.step)) : 0;\n const minStep = stamps.length > 0 ? Math.min(...stamps.map((s) => s.step)) : 0;\n const totalSteps = maxStep - minStep + 1;\n\n // Initialize Bootstrap tooltips\n useEffect(() => {\n // Initialize all tooltips\n const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n const tooltipList = Array.from(tooltipTriggerList).map(\n (tooltipTriggerEl) => new (window as any).bootstrap.Tooltip(tooltipTriggerEl)\n );\n\n // Cleanup function to dispose tooltips\n return () => {\n tooltipList.forEach((tooltip) => tooltip.dispose());\n };\n }, [stamps, currentStep]); // Re-initialize when stamps or currentStep changes\n\n return (\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: \"60px\",\n backgroundColor: \"white\",\n borderTop: \"1px solid #e5e7eb\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"0 16px\",\n gap: \"12px\",\n zIndex: 10\n }}\n >\n {/* Play/Pause Button */}\n <button\n onClick={onPlayPause}\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"50%\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\"\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f3f4f6\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"white\";\n }}\n >\n {isPlaying ? (\n <div style={{ display: \"flex\", gap: \"2px\" }}>\n <div\n style={{\n width: \"3px\",\n height: \"12px\",\n backgroundColor: \"#374151\"\n }}\n />\n <div\n style={{\n width: \"3px\",\n height: \"12px\",\n backgroundColor: \"#374151\"\n }}\n />\n </div>\n ) : (\n <div\n style={{\n width: 0,\n height: 0,\n borderLeft: \"8px solid #374151\",\n borderTop: \"6px solid transparent\",\n borderBottom: \"6px solid transparent\",\n marginLeft: \"2px\"\n }}\n />\n )}\n </button>\n\n {/* Timeline Steps */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"0 8px\"\n }}\n >\n {Array.from({ length: totalSteps }, (_, index) => {\n const step = minStep + index;\n const isActive = step === currentStep;\n const isPast = step < currentStep;\n const hasStep = stamps.some((s) => s.step === step);\n\n // Determine background color based on step state\n let backgroundColor = \"white\";\n if (isActive) {\n backgroundColor = \"#6366f1\";\n } else if (isPast) {\n backgroundColor = hasStep ? \"#fef3c7\" : \"#fef3c7\"; // Light yellow for past steps\n } else if (hasStep) {\n backgroundColor = \"#e5e7eb\";\n }\n\n const tooltipText = `Step ${step}${\n hasStep ? ` - ${stamps.find((s) => s.step === step)?.identifier || \"\"}` : \" - No activity\"\n }`;\n\n return (\n <button\n key={step}\n onClick={() => onStepChange(step)}\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n data-bs-title={tooltipText}\n style={{\n width: \"16px\",\n height: \"16px\",\n borderRadius: \"50%\",\n border: isActive ? \"2px solid #6366f1\" : \"1px solid #d1d5db\",\n backgroundColor: backgroundColor,\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n position: \"relative\"\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n if (isPast) {\n e.currentTarget.style.backgroundColor = hasStep ? \"#fde68a\" : \"#fde68a\"; // Darker yellow on hover for past steps\n } else {\n e.currentTarget.style.backgroundColor = hasStep ? \"#d1d5db\" : \"#f3f4f6\";\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n if (isPast) {\n e.currentTarget.style.backgroundColor = hasStep ? \"#fef3c7\" : \"#fef3c7\"; // Back to light yellow for past steps\n } else {\n e.currentTarget.style.backgroundColor = hasStep ? \"#e5e7eb\" : \"white\";\n }\n }\n }}\n />\n );\n })}\n </div>\n\n {/* Step Counter */}\n <div\n style={{\n fontSize: \"12px\",\n color: \"#6b7280\",\n minWidth: \"60px\",\n textAlign: \"right\"\n }}\n >\n {currentStep} / {maxStep}\n </div>\n </div>\n );\n};\n\nexport { Timeline };\n","import React from \"react\";\nimport { PanelLeft } from \"lucide-react\";\n\ninterface IProps {\n stamps: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n currentStep: number;\n onStepChange: (step: number) => void;\n onToggle?: () => void;\n}\n\nconst VerticalTimeline: React.FC<IProps> = ({ stamps, currentStep, onStepChange, onToggle }) => {\n const maxStep = stamps.length > 0 ? Math.max(...stamps.map((s) => s.step)) : 0;\n const minStep = stamps.length > 0 ? Math.min(...stamps.map((s) => s.step)) : 0;\n const totalSteps = maxStep - minStep + 1;\n\n // Calculate latency for each step\n const getStepLatency = (step: number) => {\n const stepStamps = stamps.filter((s) => s.step === step);\n if (stepStamps.length === 0) return null;\n\n // Calculate time difference from previous step\n const prevStep = step - 1;\n const prevStepStamps = stamps.filter((s) => s.step === prevStep);\n\n if (prevStepStamps.length === 0) return null;\n\n const currentTime = Math.min(...stepStamps.map((s) => s.time));\n const prevTime = Math.max(...prevStepStamps.map((s) => s.time));\n\n return currentTime - prevTime;\n };\n\n // Get step label\n const getStepLabel = (step: number) => {\n const stepStamps = stamps.filter((s) => s.step === step);\n if (stepStamps.length === 0) return `Step ${step}`;\n\n // Get the first identifier for this step\n const identifier = stepStamps[0]?.identifier || \"\";\n return identifier || `Step ${step}`;\n };\n\n // Format latency\n const formatLatency = (latency: number) => {\n if (latency < 1000) {\n return `${latency.toFixed(0)}ms`;\n } else if (latency < 60000) {\n return `${(latency / 1000).toFixed(1)}s`;\n } else {\n return `${(latency / 60000).toFixed(1)}m`;\n }\n };\n\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n backgroundColor: \"white\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\"\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"16px\",\n borderBottom: \"1px solid #e5e7eb\",\n backgroundColor: \"#f9fafb\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\"\n }}\n >\n <div>\n <h3\n style={{\n margin: 0,\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#1f2937\"\n }}\n >\n Timeline\n </h3>\n <p\n style={{\n margin: \"4px 0 0 0\",\n fontSize: \"12px\",\n color: \"#6b7280\"\n }}\n >\n Click to jump to step\n </p>\n </div>\n {onToggle && (\n <button\n onClick={onToggle}\n style={{\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n color: \"#6b7280\",\n padding: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 0.2s ease\"\n }}\n title=\"Collapse Panel\"\n >\n <PanelLeft size={16} />\n </button>\n )}\n </div>\n\n {/* Steps List */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"8px 0 16px 0\" // Add bottom padding\n }}\n >\n {Array.from({ length: totalSteps }, (_, index) => {\n const step = minStep + index;\n const isActive = step === currentStep;\n const isPast = step < currentStep;\n const hasStep = stamps.some((s) => s.step === step);\n const latency = getStepLatency(step);\n const label = getStepLabel(step);\n\n return (\n <div\n key={step}\n onClick={() => hasStep && onStepChange(step)}\n style={{\n padding: \"12px 16px\",\n borderBottom: \"1px solid #f3f4f6\",\n cursor: hasStep ? \"pointer\" : \"default\",\n backgroundColor: isActive ? \"#f0f9ff\" : \"transparent\",\n borderLeft: isActive ? \"4px solid #6366f1\" : \"4px solid transparent\",\n transition: \"all 0.2s ease\",\n position: \"relative\"\n }}\n onMouseEnter={(e) => {\n if (hasStep && !isActive) {\n e.currentTarget.style.backgroundColor = \"#f8fafc\";\n }\n }}\n onMouseLeave={(e) => {\n if (hasStep && !isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }\n }}\n >\n {/* Step indicator */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n marginBottom: \"4px\"\n }}\n >\n <div\n style={{\n width: \"12px\",\n height: \"12px\",\n borderRadius: \"50%\",\n backgroundColor: isActive ? \"#6366f1\" : isPast ? \"#fbbf24\" : hasStep ? \"#9ca3af\" : \"#e5e7eb\",\n border: isActive ? \"2px solid #6366f1\" : \"1px solid #d1d5db\",\n flexShrink: 0\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n fontWeight: isActive ? 600 : 500,\n color: isActive ? \"#1f2937\" : \"#6b7280\"\n }}\n >\n Step {step}\n </span>\n {latency && (\n <span\n style={{\n fontSize: \"11px\",\n color: \"#9ca3af\",\n backgroundColor: \"#f3f4f6\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n marginLeft: \"auto\"\n }}\n >\n {formatLatency(latency)}\n </span>\n )}\n </div>\n\n {/* Label */}\n <div\n style={{\n fontSize: \"13px\",\n color: hasStep ? \"#1f2937\" : \"#9ca3af\",\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n fontStyle: hasStep ? \"normal\" : \"italic\"\n }}\n >\n {hasStep ? label : \"No activity\"}\n </div>\n\n {/* Active indicator */}\n {isActive && (\n <div\n style={{\n position: \"absolute\",\n right: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#6366f1\",\n animation: \"pulse 2s infinite\"\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n\n <style>\n {`\n @keyframes pulse {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n }\n `}\n </style>\n </div>\n );\n};\n\nexport { VerticalTimeline };\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useReactFlow } from \"reactflow\";\nimport ReactFlow, {\n Node,\n Edge,\n Controls,\n Background,\n NodeTypes,\n Connection,\n addEdge,\n useNodesState,\n useEdgesState\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\nimport { PanelLeft, PanelRight } from \"lucide-react\";\nimport { Edge as RCEdge } from \"./components/Edge\";\nimport { Node as RCNode } from \"./components/Node\";\nimport { Timeline } from \"./components/Timeline\";\nimport { VerticalTimeline } from \"./components/VerticalTimeline\";\nimport { DataJsonNode, DataJsonEdge, DataJsonStructure } from \"./hooks\";\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\nexport interface AgenticFlowVisualizerProps {\n flowData?: DataJsonStructure | null;\n width?: string | number;\n height?: string | number;\n className?: string;\n defaultZoom?: number;\n defaultPan?: { x: number; y: number };\n disableAutoFit?: boolean;\n showTimeline?: boolean;\n}\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Calculates a clean tree layout: parents centered above children, siblings spaced evenly, no overlap.\n */\nconst calculateAutoLayout = (nodes: DataJsonNode[], edges: DataJsonEdge[]) => {\n // Build maps for fast lookup\n const nodeMap = new Map(nodes.map((n) => [n.identifier, n]));\n const childrenMap = new Map<string, string[]>();\n const parentMap = new Map<string, string>();\n nodes.forEach((n) => childrenMap.set(n.identifier, []));\n\n // Handle edges if they exist\n if (edges.length > 0) {\n edges.forEach((e) => {\n if (e.source && e.target) {\n childrenMap.get(e.source)?.push(e.target);\n parentMap.set(e.target, e.source);\n }\n });\n } else {\n // If no edges, try to infer relationships from parent field\n nodes.forEach((node) => {\n if (node.parent && node.parent.identifier !== node.identifier) {\n childrenMap.get(node.parent.identifier)?.push(node.identifier);\n parentMap.set(node.identifier, node.parent.identifier);\n }\n });\n }\n\n // Find root nodes (no parent)\n const roots = nodes.filter((n) => !parentMap.has(n.identifier));\n\n // Assign levels (depths) - now vertical levels from top to bottom\n const levelMap = new Map<string, number>();\n const assignLevels = (nodeId: string, level: number) => {\n levelMap.set(nodeId, level);\n for (const childId of childrenMap.get(nodeId) || []) {\n assignLevels(childId, level + 1);\n }\n };\n roots.forEach((root) => assignLevels(root.identifier, 0));\n\n // Group nodes by level\n const levels: string[][] = [];\n nodes.forEach((n) => {\n const lvl = levelMap.get(n.identifier) ?? 0;\n if (!levels[lvl]) levels[lvl] = [];\n levels[lvl].push(n.identifier);\n });\n\n // Calculate subtree widths for each node (for centering horizontally)\n const subtreeWidth = new Map<string, number>();\n const nodeWidth = 200; // Approximate node width\n const nodeSpacing = 100; // Horizontal spacing between nodes\n const calcSubtreeWidth = (nodeId: string): number => {\n const children = childrenMap.get(nodeId) || [];\n if (children.length === 0) {\n subtreeWidth.set(nodeId, nodeWidth);\n return nodeWidth;\n }\n let width = 0;\n for (const childId of children) {\n width += calcSubtreeWidth(childId);\n }\n width += (children.length - 1) * nodeSpacing;\n subtreeWidth.set(nodeId, width);\n return width;\n };\n roots.forEach((root) => calcSubtreeWidth(root.identifier));\n\n // Assign positions recursively - now top to bottom\n const positions = new Map<string, { x: number; y: number }>();\n const levelSpacing = 300; // Increased vertical spacing between levels\n const verticalMargin = 100; // Add margin to the top\n const assignPositions = (nodeId: string, xLeft: number, level: number) => {\n const width = subtreeWidth.get(nodeId) || nodeWidth;\n const y = level * levelSpacing + verticalMargin; // Add margin here\n const children = childrenMap.get(nodeId) || [];\n\n if (children.length === 0) {\n // Leaf node: center in its width\n positions.set(nodeId, { x: xLeft + width / 2 - nodeWidth / 2, y });\n } else {\n // Internal node: center above its children\n let childX = xLeft;\n for (const childId of children) {\n const childWidth = subtreeWidth.get(childId) || nodeWidth;\n assignPositions(childId, childX, level + 1);\n childX += childWidth + nodeSpacing;\n }\n // Center parent above children\n const firstChild = children[0];\n const lastChild = children[children.length - 1];\n const firstPos = positions.get(firstChild)!;\n const lastPos = positions.get(lastChild)!;\n const parentX = (firstPos.x + lastPos.x) / 2;\n positions.set(nodeId, { x: parentX, y });\n }\n };\n\n // Lay out each tree\n let xCursor = 0;\n for (const root of roots) {\n assignPositions(root.identifier, xCursor, 0);\n xCursor += (subtreeWidth.get(root.identifier) || nodeWidth) + nodeSpacing * 2;\n }\n\n return positions;\n};\n\n/**\n * Extracts LLM details from node data for display\n */\nconst extractLLMDetails = (node: DataJsonNode): { description: string; modelInfo: string } => {\n let description = node.node_type;\n let modelInfo = \"\";\n\n if (node.details?.internals?.llm_details) {\n const llmDetails = node.details.internals.llm_details;\n if (llmDetails.length > 0) {\n const lastLLM = llmDetails[llmDetails.length - 1];\n modelInfo = `${lastLLM.model_name} (${lastLLM.model_provider})`;\n description = `${node.node_type}\\n${modelInfo}`;\n }\n }\n\n return { description, modelInfo };\n};\n\n/**\n * Truncates text to specified length with ellipsis\n */\nconst truncateText = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n};\n\nconst nodeTypes: NodeTypes = {\n agent: RCNode\n};\n\nconst AgenticFlowVisualizer: React.FC<AgenticFlowVisualizerProps> = ({\n flowData: propFlowData,\n width = \"100%\",\n height = \"1000px\",\n className = \"\",\n defaultZoom = 1,\n defaultPan = { x: 0, y: 0 },\n disableAutoFit = false,\n showTimeline = false\n}) => {\n // Use prop data directly, no hooks needed\n const flowData = propFlowData;\n\n // Show no data state if no flowData is available\n if (!flowData) {\n return (\n <div\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n background: \"#f9fafb\",\n position: \"relative\",\n minWidth: \"800px\",\n minHeight: \"600px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n }}\n className={className}\n >\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: \"16px\", color: \"#6b7280\", marginBottom: \"8px\" }}>No flow data available</div>\n <div style={{ fontSize: \"14px\", color: \"#9ca3af\" }}>Please provide flowData prop</div>\n </div>\n </div>\n );\n }\n const containerRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement | null>(null);\n const [containerDimensions, setContainerDimensions] = useState({\n width: typeof width === \"number\" ? width : 800,\n height: typeof height === \"number\" ? height : 600\n });\n\n // Timeline state\n const [currentStep, setCurrentStep] = useState(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const playIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Timeline visibility state\n const [showTimelines, setShowTimelines] = useState(false);\n\n // Drawer state\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const [selectedData, setSelectedData] = useState<{\n type: \"node\" | \"edge\";\n data: any;\n } | null>(null);\n\n // Get max step from stamps or steps\n const maxStep = useMemo(() => {\n const stamps = flowData.stamps || flowData.steps || [];\n return stamps.length > 0 ? Math.max(...stamps.map((s) => s.step)) : 0;\n }, [flowData.stamps, flowData.steps]);\n\n // Auto-play functionality\n useEffect(() => {\n if (isPlaying) {\n playIntervalRef.current = setInterval(() => {\n setCurrentStep((prev) => {\n if (prev >= maxStep) {\n setIsPlaying(false);\n return prev;\n }\n return prev + 1;\n });\n }, 250); // 1 second per step\n } else {\n if (playIntervalRef.current) {\n clearInterval(playIntervalRef.current);\n playIntervalRef.current = null;\n }\n }\n\n return () => {\n if (playIntervalRef.current) {\n clearInterval(playIntervalRef.current);\n }\n };\n }, [isPlaying, maxStep]);\n\n // Initialize current step to last step and pan to hub node\n useEffect(() => {\n const stamps = flowData.stamps || flowData.steps || [];\n if (stamps.length > 0) {\n setCurrentStep(Math.max(...stamps.map((s) => s.step)));\n }\n }, [flowData.stamps, flowData.steps]);\n\n // Update dimensions when width/height props change\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerDimensions({\n width: rect.width || (typeof width === \"number\" ? width : 800),\n height: rect.height || (typeof height === \"number\" ? height : 600)\n });\n }\n };\n\n updateDimensions();\n\n // Use ResizeObserver if available, otherwise fallback to window resize\n if (window.ResizeObserver && containerRef.current) {\n const resizeObserver = new ResizeObserver(updateDimensions);\n resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n } else {\n window.addEventListener(\"resize\", updateDimensions);\n return () => window.removeEventListener(\"resize\", updateDimensions);\n }\n }, [width, height]);\n\n // Calculate auto-layout positions\n const positions = useMemo(() => {\n return calculateAutoLayout(flowData.nodes, flowData.edges || []);\n }, [flowData.nodes, flowData.edges]);\n\n // Get nodes and edges for current step\n const getNodesForStep = useCallback(\n (step: number) => {\n return flowData.nodes.filter((node) => node.stamp.step <= step);\n },\n [flowData.nodes]\n );\n\n const getEdgesForStep = useCallback(\n (step: number) => {\n return (flowData.edges || []).filter((edge) => edge.stamp.step <= step);\n },\n [flowData.edges]\n );\n\n // Handle node inspection\n const handleNodeInspect = useCallback((nodeData: any) => {\n setSelectedData({ type: \"node\", data: nodeData });\n setIsDrawerOpen(true);\n }, []);\n\n // Handle edge inspection\n const handleEdgeInspect = useCallback(\n (edgeData: any) => {\n // Find the edge in the current edges to get the ID\n const currentEdges = getEdgesForStep(currentStep);\n const edge = currentEdges.find((e) => e.source === edgeData.source && e.target === edgeData.target);\n const edgeWithId = {\n ...edgeData,\n id: edge?.identifier || \"N/A\"\n };\n setSelectedData({ type: \"edge\", data: edgeWithId });\n setIsDrawerOpen(true);\n },\n [getEdgesForStep, currentStep]\n );\n\n // Convert flow data to ReactFlow format with step filtering\n const nodes: Node[] = useMemo(() => {\n const stepNodes = getNodesForStep(currentStep);\n const stepEdges = getEdgesForStep(currentStep);\n return stepNodes.map((node) => {\n const position = positions.get(node.identifier) || { x: 0, y: 0 };\n const { description } = extractLLMDetails(node);\n const isActive = node.stamp.step === currentStep;\n\n return {\n id: node.identifier,\n type: \"agent\",\n position,\n data: {\n label: node.node_type,\n description,\n nodeType: node.node_type,\n step: node.stamp?.step,\n time: node.stamp?.time,\n isActive,\n onInspect: handleNodeInspect,\n id: node.identifier, // Add id for zoom functionality\n edges: stepEdges // Pass edges to the node\n },\n style: {\n filter: isActive ? \"drop-shadow(0 4px 8px rgba(99, 102, 241, 0.3))\" : \"none\"\n }\n };\n });\n }, [positions, currentStep, getNodesForStep, getEdgesForStep, handleNodeInspect]);\n\n const edges: Edge[] = useMemo(() => {\n const stepEdges = getEdgesForStep(currentStep);\n return stepEdges\n .filter((edge) => edge.source && edge.target)\n .map((edge) => {\n const isActive = edge.stamp.step === currentStep;\n return {\n id: edge.identifier,\n type: \"default\",\n source: edge.source!,\n target: edge.target,\n animated: isActive,\n bidirectional: true, // Enable bidirectional edges with arrow heads\n style: {\n stroke: isActive ? \"#6366f1\" : \"#9ca3af\",\n strokeWidth: isActive ? 3 : 2\n },\n label: edge.stamp?.identifier ? truncateText(String(edge.stamp.identifier), 50) : undefined,\n data: {\n label: edge.stamp?.identifier ? truncateText(String(edge.stamp.identifier), 50) : undefined,\n source: edge.source!,\n target: edge.target,\n step: edge.stamp?.step,\n time: edge.stamp?.time,\n details: edge.details\n }\n };\n });\n }, [currentStep, getEdgesForStep]);\n\n const [nodesState, setNodes, onNodesChange] = useNodesState(nodes);\n const [edgesState, setEdges, onEdgesChange] = useEdgesState(edges);\n\n // Update nodes and edges when currentStep changes\n useEffect(() => {\n setNodes(nodes);\n }, [nodes, setNodes]);\n\n useEffect(() => {\n setEdges(edges);\n }, [edges, setEdges]);\n\n const onConnect = useCallback((params: Connection) => setEdges((eds: Edge[]) => addEdge(params, eds)), [setEdges]);\n\n const handleStepChange = useCallback((step: number) => {\n setCurrentStep(step);\n setIsPlaying(false);\n }, []);\n\n const handlePlayPause = useCallback(() => {\n setIsPlaying((prev) => !prev);\n }, []);\n\n // Function to convert client (screen) coordinates to SVG coordinates\n const clientToSvgCoords = (clientX: number, clientY: number) => {\n if (!svgRef.current) return { x: 0, y: 0 };\n const pt = svgRef.current.createSVGPoint();\n pt.x = clientX;\n pt.y = clientY;\n const svgP = pt.matrixTransform(svgRef.current.getScreenCTM()?.inverse());\n return { x: svgP.x, y: svgP.y };\n };\n\n const reactFlowInstance = useReactFlow();\n\n // Pan to hub node (most connected node) on initial load, unless disabled or custom settings provided\n useEffect(() => {\n if (disableAutoFit || !reactFlowInstance || nodes.length === 0) {\n return;\n }\n\n // Find the node with the most connections\n const nodeConnectionCounts = new Map<string, number>();\n\n // Count incoming and outgoing connections for each node\n edges.forEach((edge) => {\n // Count outgoing connections (source)\n const sourceCount = nodeConnectionCounts.get(edge.source) || 0;\n nodeConnectionCounts.set(edge.source, sourceCount + 1);\n\n // Count incoming connections (target)\n const targetCount = nodeConnectionCounts.get(edge.target) || 0;\n nodeConnectionCounts.set(edge.target, targetCount + 1);\n });\n\n // Find the node with the highest connection count\n let hubNodeId = \"\";\n let maxConnections = 0;\n\n nodeConnectionCounts.forEach((count, nodeId) => {\n if (count > maxConnections) {\n maxConnections = count;\n hubNodeId = nodeId;\n }\n });\n\n // If no hub node found (no edges), use the first node\n if (!hubNodeId && nodes.length > 0) {\n hubNodeId = nodes[0].id;\n }\n\n // Pan to the hub node\n if (hubNodeId) {\n setTimeout(() => {\n reactFlowInstance.fitView({\n nodes: [{ id: hubNodeId }],\n duration: 1000,\n padding: 0.2,\n minZoom: defaultZoom,\n maxZoom: 1\n });\n }, 500); // Small delay to ensure nodes are rendered\n }\n }, [nodes, edges, reactFlowInstance, disableAutoFit, defaultZoom]);\n\n return (\n <div\n ref={containerRef}\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n position: \"relative\",\n minWidth: \"800px\",\n minHeight: \"600px\"\n }}\n className={className}\n >\n {/* Collapsible Side Panel */}\n {showTimeline && (\n <div className={`side-panel ${showTimelines ? \"expanded\" : \"collapsed\"}`}>\n {!showTimelines && (\n <button className=\"panel-toggle\" onClick={() => setShowTimelines(!showTimelines)} title=\"Expand Panel\">\n <PanelLeft size={20} />\n </button>\n )}\n\n {showTimelines && (\n <div className=\"panel-content\">\n <VerticalTimeline\n stamps={flowData.stamps || flowData.steps || []}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onToggle={() => setShowTimelines(false)}\n />\n </div>\n )}\n </div>\n )}\n\n <ReactFlow\n nodes={nodesState}\n edges={edgesState}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n nodeTypes={nodeTypes}\n edgeTypes={{\n default: (edgeProps) => (\n <RCEdge\n {...edgeProps}\n clientToSvgCoords={clientToSvgCoords}\n svgRef={svgRef}\n onInspect={handleEdgeInspect}\n />\n )\n }}\n attributionPosition=\"bottom-left\"\n style={{\n width: showTimeline && showTimelines ? \"calc(100% - 280px)\" : \"100%\", // Account for side panel width when visible\n height: showTimeline && showTimelines ? \"calc(100% - 60px)\" : \"100%\", // Account for timeline height\n marginLeft: showTimeline && showTimelines ? \"280px\" : \"0\" // Push content to the right of side panel when visible\n }}\n defaultViewport={{ x: defaultPan.x, y: defaultPan.y, zoom: defaultZoom }}\n onInit={(instance) => {\n if (containerRef.current) {\n const svg = containerRef.current.querySelector(\"svg\");\n if (svg) svgRef.current = svg as SVGSVGElement;\n }\n }}\n >\n <Controls />\n <Background color=\"#f3f4f6\" gap={16} />\n </ReactFlow>\n\n {/* Right Drawer */}\n <div className={`right-drawer ${isDrawerOpen ? \"open\" : \"\"}`}>\n <div className=\"drawer-toggle\" onClick={() => setIsDrawerOpen(!isDrawerOpen)}>\n <PanelRight size={20} />\n </div>\n\n {isDrawerOpen && selectedData && (\n <div className=\"drawer-content\">\n <div className=\"drawer-header\">\n <h3>{selectedData.type === \"node\" ? \"Node Details\" : \"Edge Details\"}</h3>\n </div>\n <div className=\"drawer-body\">\n {selectedData.type === \"node\" ? (\n // Node Details\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Label:</span>\n <span className=\"detail-value\">{selectedData.data.label || \"N/A\"}</span>\n </div>\n {selectedData.data.description && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Description:</span>\n <span className=\"detail-value\">{selectedData.data.description}</span>\n </div>\n )}\n {selectedData.data.nodeType && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Type:</span>\n <span className=\"detail-value\">{selectedData.data.nodeType}</span>\n </div>\n )}\n {selectedData.data.step && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Step:</span>\n <span className=\"detail-value\">{selectedData.data.step}</span>\n </div>\n )}\n {selectedData.data.time && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Time:</span>\n <span className=\"detail-value\">{new Date(selectedData.data.time * 1000).toLocaleString()}</span>\n </div>\n )}\n {selectedData.data.icon && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Icon:</span>\n <span className=\"detail-value\">{selectedData.data.icon}</span>\n </div>\n )}\n </>\n ) : (\n // Edge Details\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">ID:</span>\n <span className=\"detail-value\">{selectedData.data.id || \"N/A\"}</span>\n </div>\n {selectedData.data.source && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Source:</span>\n <span className=\"detail-value\">{selectedData.data.source}</span>\n </div>\n )}\n {selectedData.data.target && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Target:</span>\n <span className=\"detail-value\">{selectedData.data.target}</span>\n </div>\n )}\n {selectedData.data.label && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Label:</span>\n <span className=\"detail-value\">{selectedData.data.label}</span>\n </div>\n )}\n {selectedData.data.step && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Step:</span>\n <span className=\"detail-value\">{selectedData.data.step}</span>\n </div>\n )}\n {selectedData.data.time && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Time:</span>\n <span className=\"detail-value\">{new Date(selectedData.data.time * 1000).toLocaleString()}</span>\n </div>\n )}\n\n {selectedData.data?.details?.input_args &&\n Array.isArray(selectedData.data.details.input_args) &&\n selectedData.data.details.input_args.length > 0 && (\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Inputs</span>\n <span className=\"detail-value\" style={{ overflowY: \"auto\", maxHeight: \"300px\" }}>\n {Array.isArray(selectedData.data.details.input_args[0]) ? (\n selectedData.data.details.input_args[0].map((arg: any, index: number) => (\n <div key={arg?.role || index} style={{ marginBottom: 8 }}>\n <span className=\"detail-label\">Role:</span>\n <span className=\"detail-value\">{arg?.role || \"Unknown\"}</span>\n <span className=\"detail-label\">Content:</span>\n <span className=\"detail-value\">{arg?.content || \"No content\"}</span>\n </div>\n ))\n ) : (\n <span className=\"detail-value\">\n {JSON.stringify(selectedData.data.details.input_args[0], null, 2)}\n </span>\n )}\n </span>\n </div>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Outputs</span>\n <span className=\"detail-value\">\n {JSON.stringify(selectedData.data?.details?.output, null, 2)}\n </span>\n </div>\n </>\n )}\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Timeline */}\n {showTimeline && showTimelines && (\n <div style={{ marginLeft: \"280px\", marginTop: \"100px\" }}>\n <Timeline\n stamps={flowData.stamps || flowData.steps || []}\n currentStep={currentStep}\n isPlaying={isPlaying}\n onStepChange={handleStepChange}\n onPlayPause={handlePlayPause}\n />\n </div>\n )}\n\n <style>\n {`\n .react-flow__edge-label {\n font-size: 10px;\n background: white;\n padding: 2px 4px;\n border-radius: 4px;\n border: 1px solid #e5e7eb;\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Right Drawer Styles */\n .right-drawer {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n transition: transform 0.3s ease;\n margin-left: ${showTimeline && showTimelines ? \"280px\" : \"0\"}; /* Account for vertical timeline when visible */\n }\n\n .right-drawer:not(.open) {\n transform: translateX(calc(100% - 50px));\n }\n\n .right-drawer.open {\n transform: translateX(0);\n }\n\n .drawer-toggle {\n width: 50px;\n height: 50px;\n background: none;\n color: #6b7280;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s ease;\n margin-top: 20px;\n }\n\n .drawer-toggle:hover {\n color: #374151;\n }\n\n .drawer-content {\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px 0 0 8px;\n width: 400px;\n height: calc(100% - 40px);\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n animation: drawerSlideIn 0.3s ease-out;\n }\n\n .drawer-header {\n padding: 16px 20px;\n border-bottom: 1px solid #e5e7eb;\n background: #f9fafb;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n }\n\n .drawer-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 20px;\n color: #6b7280;\n cursor: pointer;\n padding: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .close-button:hover {\n background: #e5e7eb;\n color: #1f2937;\n }\n\n .drawer-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n width: 100%;\n box-sizing: border-box;\n }\n\n .detail-row {\n display: grid;\n grid-template-columns: 100px 1fr;\n margin-bottom: 12px;\n align-items: flex-start;\n gap: 8px;\n }\n\n .detail-row:last-child {\n margin-bottom: 0;\n }\n\n .detail-label {\n font-weight: 600;\n color: #6b7280;\n font-size: 13px;\n word-break: break-word;\n }\n\n .detail-value {\n color: #1f2937;\n font-size: 13px;\n word-break: break-word;\n flex: 1;\n width: 100%;\n overflow: visible;\n text-overflow: unset;\n max-width: unset;\n white-space: pre-line;\n line-height: 1.4;\n }\n\n @keyframes drawerSlideIn {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Scoreboard Styles */\n .scoreboard {\n position: absolute;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 400px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .scoreboard-header {\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n background: #f9fafb;\n text-align: center;\n }\n\n .scoreboard-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .scoreboard-content {\n padding: 16px;\n display: flex;\n justify-content: space-around;\n align-items: center;\n gap: 20px;\n }\n\n .scoreboard-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n }\n\n .scoreboard-label {\n font-size: 12px;\n color: #6b7280;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .scoreboard-count {\n font-size: 18px;\n font-weight: 700;\n padding: 6px 12px;\n border-radius: 6px;\n min-width: 40px;\n text-align: center;\n }\n\n .scoreboard-count.open {\n background: #fef3c7;\n color: #92400e;\n }\n\n .scoreboard-count.completed {\n background: #d1fae5;\n color: #065f46;\n }\n\n .scoreboard-count.error {\n background: #fee2e2;\n color: #991b1b;\n }\n\n .scoreboard-count.error.clickable {\n transition: all 0.2s ease;\n }\n\n .scoreboard-count.error.clickable:hover {\n background: #fecaca;\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.3);\n }\n\n /* Side Panel Styles */\n .side-panel {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n transition: all 0.3s ease;\n }\n\n .side-panel.collapsed {\n width: 60px;\n }\n\n .side-panel.expanded {\n width: 280px;\n }\n\n .panel-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: none;\n cursor: pointer;\n color: #6b7280;\n transition: color 0.2s ease;\n padding: 8px;\n margin: 20px 0 0 0;\n }\n\n .panel-toggle:hover {\n color: #374151;\n }\n\n .panel-content {\n flex: 1;\n background: white;\n border-right: 1px solid #e5e7eb;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n }\n\n\n `}\n </style>\n </div>\n );\n};\n\nexport default AgenticFlowVisualizer;\n","import React from \"react\";\nimport AgenticFlowVisualizer, { AgenticFlowVisualizerProps } from \"./AgenticFlowVisualizer\";\nimport { ReactFlowProvider } from \"reactflow\";\n\n/**\n * Visualizer component that wraps AgenticFlowVisualizer with ReactFlowProvider.\n * This is the main component that should be imported from the npm package.\n */\nconst Visualizer: React.FC<AgenticFlowVisualizerProps> = (props) => {\n return (\n <ReactFlowProvider>\n <AgenticFlowVisualizer {...props} />\n </ReactFlowProvider>\n );\n};\n\nexport default Visualizer;\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { useState, useCallback } from \"react\";\n\n// Base URL for the API\nconst API_BASE = \"/api\";\n\nexport interface JsonFile {\n name: string;\n size?: number;\n modified?: string;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n}\n\nexport const useApi = () => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ApiError | null>(null);\n\n // Function to list all JSON files in the .railtracks directory\n const listJsonFiles = useCallback(async (): Promise<JsonFile[]> => {\n setLoading(true);\n setError(null);\n\n try {\n console.log(\"Fetching files from:\", `${API_BASE}/files`);\n const response = await fetch(`${API_BASE}/files`);\n console.log(\"Response status:\", response.status);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const files = await response.json();\n console.log(\"Files received:\", files);\n return files;\n } catch (err) {\n console.error(\"Error fetching files:\", err);\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return [];\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Function to load a specific JSON file\n const loadJsonFile = useCallback(async (filename: string): Promise<any> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${API_BASE}/json/${filename}`);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Function to trigger a frontend refresh\n const triggerRefresh = useCallback(async (): Promise<any> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${API_BASE}/refresh`, {\n method: \"POST\"\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const result = await response.json();\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n loading,\n error,\n listJsonFiles,\n loadJsonFile,\n triggerRefresh\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useApi, JsonFile } from \"./useApi\";\n\n// Import the data structure types from the visualizer\nexport interface DataJsonNode {\n identifier: string;\n node_type: string;\n stamp: {\n step: number;\n time: number;\n identifier: string;\n };\n details: {\n internals?: {\n llm_details?: Array<{\n model_name: string;\n model_provider: string;\n input: Array<{\n role: string;\n content: any;\n }>;\n output: {\n role: string;\n content: any;\n };\n input_tokens: number | null;\n output_tokens: number | null;\n total_cost: number | null;\n system_fingerprint: string | null;\n }>;\n latency?: {\n total_time: number;\n };\n };\n };\n parent: DataJsonNode | null;\n}\n\nexport interface DataJsonEdge {\n identifier: string;\n source: string | null;\n target: string;\n stamp: {\n step: number;\n time: number;\n identifier: string;\n };\n details: {\n state?: string;\n input_args?: any[];\n input_kwargs?: any;\n output?: any;\n };\n parent: DataJsonEdge | null;\n}\n\nexport interface DataJsonStructure {\n nodes: DataJsonNode[];\n edges?: DataJsonEdge[];\n stamps?: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n steps?: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n}\n\nexport interface FlowDataState {\n availableFiles: JsonFile[];\n currentFile: string | null;\n flowData: DataJsonStructure | null;\n loading: boolean;\n error: string | null;\n}\n\nexport const useFlowData = () => {\n const { listJsonFiles, loadJsonFile, loading: apiLoading, error: apiError } = useApi();\n\n const [state, setState] = useState<FlowDataState>({\n availableFiles: [],\n currentFile: null,\n flowData: null,\n loading: false,\n error: null\n });\n\n // Load available files on mount\n useEffect(() => {\n loadAvailableFiles();\n }, []);\n\n const loadAvailableFiles = useCallback(async () => {\n const files = await listJsonFiles();\n setState((prev) => ({\n ...prev,\n availableFiles: files\n }));\n }, [listJsonFiles]);\n\n const loadFile = useCallback(\n async (filename: string) => {\n setState((prev) => ({\n ...prev,\n loading: true,\n error: null\n }));\n\n try {\n const data = await loadJsonFile(filename);\n if (data) {\n setState((prev) => ({\n ...prev,\n currentFile: filename,\n flowData: data,\n loading: false,\n error: null\n }));\n } else {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: \"Failed to load file data\"\n }));\n }\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : \"Unknown error occurred\"\n }));\n }\n },\n [loadJsonFile]\n );\n\n const refreshFiles = useCallback(async () => {\n await loadAvailableFiles();\n }, [loadAvailableFiles]);\n\n return {\n ...state,\n loading: state.loading || apiLoading,\n error: state.error || apiError?.message || null,\n loadFile,\n refreshFiles\n };\n};\n","import React from \"react\";\nimport { RefreshCw } from \"lucide-react\";\nimport { JsonFile } from \"../hooks\";\n\ninterface FileSelectorProps {\n files: JsonFile[];\n currentFile: string | null;\n onFileSelect: (filename: string) => void;\n onRefresh: () => void;\n loading?: boolean;\n disabled?: boolean;\n}\n\nexport const FileSelector: React.FC<FileSelectorProps> = ({\n files,\n currentFile,\n onFileSelect,\n onRefresh,\n loading = false,\n disabled = false\n}) => {\n const handleRefresh = (e: React.MouseEvent) => {\n e.stopPropagation();\n onRefresh();\n };\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <select\n value={currentFile || \"\"}\n onChange={(e) => onFileSelect(e.target.value)}\n disabled={disabled}\n style={{\n cursor: \"pointer\",\n padding: \"8px 16px 8px 16px\",\n borderRadius: \"4px\",\n fontSize: \"14px\",\n border: \"1px solid #ccc\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\"\n }}\n >\n <option value=\"\">Select a RailTracks Run...</option>\n {files.map((file) => (\n <option key={file.name} value={file.name}>\n {file.name}\n </option>\n ))}\n </select>\n\n <button\n onClick={handleRefresh}\n disabled={loading || disabled}\n title=\"Refresh files\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\"\n }}\n >\n <RefreshCw size={16} style={{ animation: loading ? \"spin 1s linear infinite\" : \"none\" }} />\n </button>\n </div>\n );\n};\n","import React, { useState } from \"react\";\nimport { useFlowData } from \"./hooks\";\nimport { FileSelector } from \"./components/FileSelector\";\nimport Visualizer from \"./Visualizer\";\n\nconst App: React.FC = () => {\n const { availableFiles, currentFile, flowData, loading, error, loadFile, refreshFiles } = useFlowData();\n const [showTimeline, setShowTimeline] = useState(false);\n\n const handleFileSelect = (filename: string) => {\n loadFile(filename);\n };\n\n return (\n <div className=\"app\">\n <div className=\"app-header\">\n <h1>RailTracks Visualizer</h1>\n <div className=\"file-selector-container\">\n <FileSelector\n files={availableFiles}\n currentFile={currentFile}\n onFileSelect={handleFileSelect}\n onRefresh={refreshFiles}\n loading={loading}\n disabled={loading}\n />\n <label className=\"timeline-toggle\">\n <input type=\"checkbox\" checked={showTimeline} onChange={(e) => setShowTimeline(e.target.checked)} />\n Show Timeline\n </label>\n </div>\n </div>\n\n {error && (\n <div className=\"error-message\">\n <p>Error: {error}</p>\n </div>\n )}\n\n <div className=\"visualizer-container\">\n {loading ? (\n <div className=\"loading-state\">\n <div className=\"loading-spinner\"></div>\n <p>Loading flow data...</p>\n </div>\n ) : flowData ? (\n <Visualizer flowData={flowData} showTimeline={showTimeline} />\n ) : (\n <div className=\"no-data-state\">\n <p>Please select a file to visualize the flow data</p>\n </div>\n )}\n </div>\n\n <style>{`\n .app {\n min-height: 100vh;\n background: #f9fafb;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .app-header {\n background: white;\n border-bottom: 1px solid #e5e7eb;\n padding: 5px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .app-header h1 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .file-selector-container {\n display: flex;\n align-items: center;\n gap: 20px;\n }\n\n .timeline-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n color: #374151;\n cursor: pointer;\n user-select: none;\n }\n\n .timeline-toggle input[type=\"checkbox\"] {\n cursor: pointer;\n }\n\n .error-message {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #991b1b;\n padding: 12px 20px;\n margin: 20px;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .visualizer-container {\n padding: 20px;\n min-height: calc(100vh - 100px);\n }\n\n .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 400px;\n color: #6b7280;\n }\n\n .loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #e5e7eb;\n border-top: 4px solid #6366f1;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 16px;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .no-data-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 400px;\n color: #6b7280;\n font-size: 16px;\n }\n `}</style>\n </div>\n );\n};\n\nexport default App;\n"],"names":["css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Edge","id","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","markerEnd","bidirectional","data","clientToSvgCoords","svgRef","onInspect","useState","getStrokeColor","_a","details","state","stroke","edgePath","arrowMarkers","useMemo","path","markers","strokeColor","push","React","key","markerWidth","markerHeight","refX","refY","orient","markerUnits","points","fill","hoverStyle","strokeWidth","cursor","className","d","markerStart","undefined","label","x","y","width","height","overflow","pointerEvents","display","alignItems","justifyContent","onClick","event","stopPropagation","background","color","border","borderRadius","padding","fontSize","fontWeight","boxShadow","transition","Node","fitView","useReactFlow","hasOutgoingEdges","edges","some","edge","source","Fragment","handleNodeClick","nodes","duration","minZoom","maxZoom","description","nodeType","step","time","icon","Handle","position","Position","Top","Date","toLocaleTimeString","Bottom","Timeline","stamps","currentStep","isPlaying","onStepChange","onPlayPause","maxStep","length","Math","max","map","s","minStep","min","totalSteps","useEffect","tooltipTriggerList","querySelectorAll","tooltipList","Array","from","tooltipTriggerEl","window","bootstrap","Tooltip","forEach","tooltip","dispose","bottom","left","right","backgroundColor","borderTop","gap","zIndex","onMouseEnter","e","currentTarget","onMouseLeave","borderLeft","borderBottom","marginLeft","flex","_","index","isActive","isPast","hasStep","tooltipText","find","identifier","minWidth","textAlign","VerticalTimeline","onToggle","flexDirection","margin","title","PanelLeft","size","overflowY","latency","stepStamps","filter","prevStep","prevStepStamps","getStepLatency","getStepLabel","marginBottom","flexShrink","toFixed","formatLatency","lineHeight","wordBreak","fontStyle","top","transform","animation","truncateText","text","maxLength","substring","nodeTypes","agent","RCNode","AgenticFlowVisualizer","flowData","propFlowData","defaultZoom","defaultPan","disableAutoFit","showTimeline","minHeight","containerRef","useRef","containerDimensions","setContainerDimensions","setCurrentStep","setIsPlaying","playIntervalRef","showTimelines","setShowTimelines","isDrawerOpen","setIsDrawerOpen","selectedData","setSelectedData","steps","current","setInterval","prev","clearInterval","updateDimensions","rect","getBoundingClientRect","ResizeObserver","resizeObserver","observe","disconnect","addEventListener","removeEventListener","positions","calculateAutoLayout","Map","n","childrenMap","parentMap","set","target","get","node","parent","roots","has","levelMap","assignLevels","nodeId","level","childId","root","levels","lvl","subtreeWidth","nodeWidth","calcSubtreeWidth","children","assignPositions","xLeft","childX","childWidth","lastChild","firstPos","lastPos","parentX","xCursor","nodeSpacing","getNodesForStep","useCallback","stamp","getEdgesForStep","handleNodeInspect","nodeData","handleEdgeInspect","edgeData","edgeWithId","Object","assign","stepNodes","stepEdges","node_type","modelInfo","_b","internals","llm_details","llmDetails","lastLLM","model_name","model_provider","extractLLMDetails","animated","String","_c","_d","nodesState","setNodes","onNodesChange","useNodesState","edgesState","setEdges","onEdgesChange","useEdgesState","onConnect","params","eds","addEdge","handleStepChange","handlePlayPause","clientX","clientY","pt","createSVGPoint","svgP","matrixTransform","getScreenCTM","inverse","reactFlowInstance","nodeConnectionCounts","sourceCount","targetCount","hubNodeId","maxConnections","count","setTimeout","ReactFlow","edgeTypes","default","edgeProps","RCEdge","attributionPosition","defaultViewport","zoom","onInit","instance","svg","querySelector","Controls","Background","PanelRight","toLocaleString","input_args","isArray","maxHeight","arg","role","content","JSON","stringify","output","marginTop","Visualizer","props","ReactFlowProvider","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","next","rejected","result","done","then","apply","SuppressedError","API_BASE","useFlowData","listJsonFiles","loadJsonFile","loading","apiLoading","error","apiError","useApi","setLoading","setError","console","log","response","fetch","status","ok","Error","files","json","err","message","filename","triggerRefresh","method","setState","availableFiles","currentFile","loadAvailableFiles","loadFile","refreshFiles","FileSelector","onFileSelect","onRefresh","disabled","onChange","appearance","WebkitAppearance","MozAppearance","file","name","RefreshCw","App","setShowTimeline","checked"],"mappings":"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","x_google_ignoreList":[0,7]}
1
+ {"version":3,"file":"index.js","sources":["../../node_modules/style-inject/dist/style-inject.es.js","../../src/components/Edge.tsx","../../src/components/Node.tsx","../../src/components/Timeline.tsx","../../src/components/VerticalTimeline.tsx","../../src/AgenticFlowVisualizer.tsx","../../src/Visualizer.tsx","../../node_modules/tslib/tslib.es6.js","../../src/hooks/useApi.ts","../../src/hooks/useFlowData.ts","../../src/components/FileSelector.tsx","../../src/App.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useMemo, useState, useEffect } from \"react\";\n\ninterface EdgeProps {\n id: string;\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: any;\n targetPosition: any;\n style?: React.CSSProperties;\n markerEnd?: string;\n bidirectional?: boolean;\n data?: {\n label?: string;\n source?: string;\n target?: string;\n step?: number;\n time?: number;\n details?: any;\n };\n clientToSvgCoords?: (clientX: number, clientY: number) => { x: number; y: number };\n svgRef?: React.RefObject<SVGSVGElement>;\n onInspect?: (edgeData: any) => void;\n}\n\nexport const Edge: React.FC<EdgeProps> = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n bidirectional = false,\n data,\n clientToSvgCoords,\n svgRef,\n onInspect\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Function to determine stroke color based on edge state\n const getStrokeColor = () => {\n const state = data?.details?.state;\n switch (state) {\n case \"Open\":\n return \"#000000\"; // Black\n case \"Completed\":\n return \"#15803d\"; // Darker Green\n case \"Error\":\n return \"#ef4444\"; // Red\n default:\n return style.stroke || \"#6366f1\"; // Default color\n }\n };\n\n const [edgePath, arrowMarkers] = useMemo(() => {\n // Always use curved paths for better visual appeal\n const centerX = (sourceX + targetX) / 2;\n const centerY = (sourceY + targetY) / 2;\n const path = `M ${sourceX} ${sourceY} Q ${centerX} ${centerY} ${targetX} ${targetY}`;\n\n // Create arrow markers for bidirectional edges\n const markers = [];\n if (bidirectional) {\n const strokeColor = getStrokeColor();\n // Forward arrow (source to target)\n markers.push(\n <defs key={`${id}-markers`}>\n <marker\n id={`${id}-arrowhead-forward`}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill={strokeColor} />\n </marker>\n <marker\n id={`${id}-arrowhead-backward`}\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"1\"\n refY=\"3.5\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <polygon points=\"10 0, 0 3.5, 10 7\" fill={strokeColor} />\n </marker>\n </defs>\n );\n }\n\n return [path, markers];\n }, [sourceX, sourceY, targetX, targetY, id, bidirectional, data?.details?.state]);\n\n const hoverStyle = {\n ...style,\n stroke: getStrokeColor(),\n strokeWidth: style.strokeWidth || 4,\n cursor: \"pointer\"\n };\n\n const handleInspectClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n if (onInspect && data) {\n onInspect(data);\n }\n };\n\n return (\n <g data-edge-id={id}>\n {arrowMarkers}\n <path\n id={id}\n className=\"react-flow__edge-path\"\n d={edgePath}\n markerEnd={bidirectional ? `url(#${id}-arrowhead-forward)` : markerEnd}\n markerStart={bidirectional ? `url(#${id}-arrowhead-backward)` : undefined}\n style={hoverStyle}\n />\n\n {/* Edge Label Renderer */}\n {data?.label && (\n <foreignObject\n x={(sourceX + targetX) / 2 - 50}\n y={(sourceY + targetY) / 2 - 20}\n width=\"100\"\n height=\"40\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}\n >\n <div\n className=\"edge-label-renderer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"auto\"\n }}\n >\n <button\n className=\"edge-label-button\"\n onClick={handleInspectClick}\n style={{\n background: \"#6366f1\",\n color: \"white\",\n border: \"none\",\n borderRadius: 6,\n padding: \"4px 12px\",\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(99,102,241,0.10)\",\n transition: \"background 0.2s\"\n }}\n >\n Inspect\n </button>\n </div>\n </foreignObject>\n )}\n\n <style>\n {`\n .edge-label-renderer {\n z-index: 8001;\n user-select: none;\n pointer-events: auto;\n }\n\n .edge-label-button {\n pointer-events: auto;\n }\n `}\n </style>\n </g>\n );\n};\n","import React from \"react\";\nimport { Handle, Position, useReactFlow } from \"reactflow\";\n\ninterface NodeData {\n label: string;\n description?: string;\n nodeType?: string;\n step?: number;\n time?: number;\n icon?: string;\n onInspect?: (nodeData: any) => void;\n id?: string; // Add id for zoom functionality\n edges?: any[]; // Add edges to node data\n}\n\ninterface NodeProps {\n data: NodeData;\n id: string;\n}\n\nconst Node: React.FC<NodeProps> = ({ data, id }) => {\n const { fitView } = useReactFlow();\n\n // Check if this node has any outgoing edges (source edges)\n const hasOutgoingEdges = data.edges?.some((edge: any) => edge.source === id) || false;\n\n const handleNodeClick = () => {\n // Zoom to the node\n fitView({\n nodes: [{ id }],\n duration: 800,\n padding: 0.1,\n minZoom: 0.5,\n maxZoom: 1.5\n });\n\n // Open inspection drawer\n if (data.onInspect) {\n data.onInspect({\n label: data.label,\n description: data.description,\n nodeType: data.nodeType,\n step: data.step,\n time: data.time,\n icon: data.icon\n });\n }\n };\n\n return (\n <>\n <div className=\"agent-node\" onClick={handleNodeClick} style={{ cursor: \"pointer\" }}>\n <Handle type=\"target\" position={Position.Top} style={{ background: \"#6366f1\" }} />\n <div className=\"agent-header\">\n <div className=\"agent-icon\">{data.icon || \"📋\"}</div>\n <div className=\"agent-label\">{data.label}</div>\n </div>\n {data.description && <div className=\"agent-description\">{data.description}</div>}\n {data.step && (\n <div className=\"agent-meta\">\n <span className=\"step\">Step: {data.step}</span>\n {data.time && <span className=\"time\">{new Date(data.time * 1000).toLocaleTimeString()}</span>}\n </div>\n )}\n {hasOutgoingEdges && <Handle type=\"source\" position={Position.Bottom} style={{ background: \"#6366f1\" }} />}\n </div>\n\n <style>\n {`\n .agent-node {\n padding: 12px;\n border-radius: 8px;\n background: white;\n border: 2px solid #e5e7eb;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n min-width: 200px;\n max-width: 250px;\n transition: all 0.2s ease;\n position: relative;\n z-index: -5;\n }\n \n .agent-node:hover {\n border-color: #6366f1;\n box-shadow: 0 4px 8px rgba(99, 102, 241, 0.2);\n }\n \n .agent-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n \n .agent-icon {\n font-size: 20px;\n }\n \n .agent-label {\n font-weight: 600;\n color: #1f2937;\n font-size: 14px;\n word-break: break-word;\n }\n \n .agent-description {\n color: #6b7280;\n font-size: 12px;\n line-height: 1.4;\n word-break: break-word;\n white-space: pre-line;\n }\n \n .agent-meta {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid #e5e7eb;\n display: flex;\n justify-content: space-between;\n font-size: 10px;\n color: #9ca3af;\n }\n \n .step {\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n }\n \n .time {\n font-family: monospace;\n }\n \n .react-flow__handle {\n width: 8px;\n height: 8px;\n border: 2px solid #6366f1;\n }\n `}\n </style>\n </>\n );\n};\n\nexport { Node };\nexport type { NodeData };\n","import React, { useEffect } from \"react\";\n\ninterface TimelineProps {\n stamps: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n currentStep: number;\n isPlaying: boolean;\n onStepChange: (step: number) => void;\n onPlayPause: () => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({ stamps, currentStep, isPlaying, onStepChange, onPlayPause }) => {\n const maxStep = stamps.length > 0 ? Math.max(...stamps.map((s) => s.step)) : 0;\n const minStep = stamps.length > 0 ? Math.min(...stamps.map((s) => s.step)) : 0;\n const totalSteps = maxStep - minStep + 1;\n\n // Initialize Bootstrap tooltips\n useEffect(() => {\n // Initialize all tooltips\n const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n const tooltipList = Array.from(tooltipTriggerList).map(\n (tooltipTriggerEl) => new (window as any).bootstrap.Tooltip(tooltipTriggerEl)\n );\n\n // Cleanup function to dispose tooltips\n return () => {\n tooltipList.forEach((tooltip) => tooltip.dispose());\n };\n }, [stamps, currentStep]); // Re-initialize when stamps or currentStep changes\n\n return (\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: \"60px\",\n backgroundColor: \"white\",\n borderTop: \"1px solid #e5e7eb\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"0 16px\",\n gap: \"12px\",\n zIndex: 10\n }}\n >\n {/* Play/Pause Button */}\n <button\n onClick={onPlayPause}\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"50%\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\"\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"#f3f4f6\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"white\";\n }}\n >\n {isPlaying ? (\n <div style={{ display: \"flex\", gap: \"2px\" }}>\n <div\n style={{\n width: \"3px\",\n height: \"12px\",\n backgroundColor: \"#374151\"\n }}\n />\n <div\n style={{\n width: \"3px\",\n height: \"12px\",\n backgroundColor: \"#374151\"\n }}\n />\n </div>\n ) : (\n <div\n style={{\n width: 0,\n height: 0,\n borderLeft: \"8px solid #374151\",\n borderTop: \"6px solid transparent\",\n borderBottom: \"6px solid transparent\",\n marginLeft: \"2px\"\n }}\n />\n )}\n </button>\n\n {/* Timeline Steps */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"0 8px\"\n }}\n >\n {Array.from({ length: totalSteps }, (_, index) => {\n const step = minStep + index;\n const isActive = step === currentStep;\n const isPast = step < currentStep;\n const hasStep = stamps.some((s) => s.step === step);\n\n // Determine background color based on step state\n let backgroundColor = \"white\";\n if (isActive) {\n backgroundColor = \"#6366f1\";\n } else if (isPast) {\n backgroundColor = hasStep ? \"#fef3c7\" : \"#fef3c7\"; // Light yellow for past steps\n } else if (hasStep) {\n backgroundColor = \"#e5e7eb\";\n }\n\n const tooltipText = `Step ${step}${\n hasStep ? ` - ${stamps.find((s) => s.step === step)?.identifier || \"\"}` : \" - No activity\"\n }`;\n\n return (\n <button\n key={step}\n onClick={() => onStepChange(step)}\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n data-bs-title={tooltipText}\n style={{\n width: \"16px\",\n height: \"16px\",\n borderRadius: \"50%\",\n border: isActive ? \"2px solid #6366f1\" : \"1px solid #d1d5db\",\n backgroundColor: backgroundColor,\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n position: \"relative\"\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n if (isPast) {\n e.currentTarget.style.backgroundColor = hasStep ? \"#fde68a\" : \"#fde68a\"; // Darker yellow on hover for past steps\n } else {\n e.currentTarget.style.backgroundColor = hasStep ? \"#d1d5db\" : \"#f3f4f6\";\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n if (isPast) {\n e.currentTarget.style.backgroundColor = hasStep ? \"#fef3c7\" : \"#fef3c7\"; // Back to light yellow for past steps\n } else {\n e.currentTarget.style.backgroundColor = hasStep ? \"#e5e7eb\" : \"white\";\n }\n }\n }}\n />\n );\n })}\n </div>\n\n {/* Step Counter */}\n <div\n style={{\n fontSize: \"12px\",\n color: \"#6b7280\",\n minWidth: \"60px\",\n textAlign: \"right\"\n }}\n >\n {currentStep} / {maxStep}\n </div>\n </div>\n );\n};\n\nexport { Timeline };\n","import React from \"react\";\nimport { PanelLeft } from \"lucide-react\";\n\ninterface IProps {\n stamps: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n currentStep: number;\n onStepChange: (step: number) => void;\n onToggle?: () => void;\n}\n\nconst VerticalTimeline: React.FC<IProps> = ({ stamps, currentStep, onStepChange, onToggle }) => {\n const maxStep = stamps.length > 0 ? Math.max(...stamps.map((s) => s.step)) : 0;\n const minStep = stamps.length > 0 ? Math.min(...stamps.map((s) => s.step)) : 0;\n const totalSteps = maxStep - minStep + 1;\n\n // Calculate latency for each step\n const getStepLatency = (step: number) => {\n const stepStamps = stamps.filter((s) => s.step === step);\n if (stepStamps.length === 0) return null;\n\n // Calculate time difference from previous step\n const prevStep = step - 1;\n const prevStepStamps = stamps.filter((s) => s.step === prevStep);\n\n if (prevStepStamps.length === 0) return null;\n\n const currentTime = Math.min(...stepStamps.map((s) => s.time));\n const prevTime = Math.max(...prevStepStamps.map((s) => s.time));\n\n return currentTime - prevTime;\n };\n\n // Get step label\n const getStepLabel = (step: number) => {\n const stepStamps = stamps.filter((s) => s.step === step);\n if (stepStamps.length === 0) return `Step ${step}`;\n\n // Get the first identifier for this step\n const identifier = stepStamps[0]?.identifier || \"\";\n return identifier || `Step ${step}`;\n };\n\n // Format latency\n const formatLatency = (latency: number) => {\n if (latency < 1000) {\n return `${latency.toFixed(0)}ms`;\n } else if (latency < 60000) {\n return `${(latency / 1000).toFixed(1)}s`;\n } else {\n return `${(latency / 60000).toFixed(1)}m`;\n }\n };\n\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n backgroundColor: \"white\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\"\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"16px\",\n borderBottom: \"1px solid #e5e7eb\",\n backgroundColor: \"#f9fafb\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\"\n }}\n >\n <div>\n <h3\n style={{\n margin: 0,\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#1f2937\"\n }}\n >\n Timeline\n </h3>\n <p\n style={{\n margin: \"4px 0 0 0\",\n fontSize: \"12px\",\n color: \"#6b7280\"\n }}\n >\n Click to jump to step\n </p>\n </div>\n {onToggle && (\n <button\n onClick={onToggle}\n style={{\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n color: \"#6b7280\",\n padding: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 0.2s ease\"\n }}\n title=\"Collapse Panel\"\n >\n <PanelLeft size={16} />\n </button>\n )}\n </div>\n\n {/* Steps List */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"8px 0 16px 0\" // Add bottom padding\n }}\n >\n {Array.from({ length: totalSteps }, (_, index) => {\n const step = minStep + index;\n const isActive = step === currentStep;\n const isPast = step < currentStep;\n const hasStep = stamps.some((s) => s.step === step);\n const latency = getStepLatency(step);\n const label = getStepLabel(step);\n\n return (\n <div\n key={step}\n onClick={() => hasStep && onStepChange(step)}\n style={{\n padding: \"12px 16px\",\n borderBottom: \"1px solid #f3f4f6\",\n cursor: hasStep ? \"pointer\" : \"default\",\n backgroundColor: isActive ? \"#f0f9ff\" : \"transparent\",\n borderLeft: isActive ? \"4px solid #6366f1\" : \"4px solid transparent\",\n transition: \"all 0.2s ease\",\n position: \"relative\"\n }}\n onMouseEnter={(e) => {\n if (hasStep && !isActive) {\n e.currentTarget.style.backgroundColor = \"#f8fafc\";\n }\n }}\n onMouseLeave={(e) => {\n if (hasStep && !isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }\n }}\n >\n {/* Step indicator */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n marginBottom: \"4px\"\n }}\n >\n <div\n style={{\n width: \"12px\",\n height: \"12px\",\n borderRadius: \"50%\",\n backgroundColor: isActive ? \"#6366f1\" : isPast ? \"#fbbf24\" : hasStep ? \"#9ca3af\" : \"#e5e7eb\",\n border: isActive ? \"2px solid #6366f1\" : \"1px solid #d1d5db\",\n flexShrink: 0\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n fontWeight: isActive ? 600 : 500,\n color: isActive ? \"#1f2937\" : \"#6b7280\"\n }}\n >\n Step {step}\n </span>\n {latency && (\n <span\n style={{\n fontSize: \"11px\",\n color: \"#9ca3af\",\n backgroundColor: \"#f3f4f6\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n marginLeft: \"auto\"\n }}\n >\n {formatLatency(latency)}\n </span>\n )}\n </div>\n\n {/* Label */}\n <div\n style={{\n fontSize: \"13px\",\n color: hasStep ? \"#1f2937\" : \"#9ca3af\",\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n fontStyle: hasStep ? \"normal\" : \"italic\"\n }}\n >\n {hasStep ? label : \"No activity\"}\n </div>\n\n {/* Active indicator */}\n {isActive && (\n <div\n style={{\n position: \"absolute\",\n right: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#6366f1\",\n animation: \"pulse 2s infinite\"\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n\n <style>\n {`\n @keyframes pulse {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n 100% {\n opacity: 1;\n }\n }\n `}\n </style>\n </div>\n );\n};\n\nexport { VerticalTimeline };\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useReactFlow } from \"reactflow\";\nimport ReactFlow, {\n Node,\n Edge,\n Controls,\n Background,\n BackgroundVariant,\n NodeTypes,\n Connection,\n addEdge,\n useNodesState,\n useEdgesState\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\nimport { PanelLeft, PanelRight } from \"lucide-react\";\nimport { Edge as RCEdge } from \"./components/Edge\";\nimport { Node as RCNode } from \"./components/Node\";\nimport { Timeline } from \"./components/Timeline\";\nimport { VerticalTimeline } from \"./components/VerticalTimeline\";\nimport { AgentRunNodeDto, AgentRunEdgeDto, AgentRunDto } from \"./hooks\";\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\nexport interface AgenticFlowVisualizerProps {\n flowData?: AgentRunDto | null;\n width?: string | number;\n height?: string | number;\n className?: string;\n defaultZoom?: number;\n defaultPan?: { x: number; y: number };\n disableAutoFit?: boolean;\n showTimeline?: boolean;\n}\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Calculates a clean tree layout: parents centered above children, siblings spaced evenly, no overlap.\n */\nconst calculateAutoLayout = (nodes: AgentRunNodeDto[], edges: AgentRunEdgeDto[]) => {\n // Handle undefined or null nodes\n if (!nodes || nodes.length === 0) {\n return new Map();\n }\n\n // Build maps for fast lookup\n const nodeMap = new Map(nodes.map((n) => [n.identifier, n]));\n const childrenMap = new Map<string, string[]>();\n const parentMap = new Map<string, string>();\n nodes.forEach((n) => childrenMap.set(n.identifier, []));\n\n // Handle edges if they exist\n if (edges.length > 0) {\n edges.forEach((e) => {\n if (e.source && e.target) {\n childrenMap.get(e.source)?.push(e.target);\n parentMap.set(e.target, e.source);\n }\n });\n } else {\n // If no edges, try to infer relationships from parent field\n nodes.forEach((node) => {\n if (node.parent && node.parent.identifier !== node.identifier) {\n childrenMap.get(node.parent.identifier)?.push(node.identifier);\n parentMap.set(node.identifier, node.parent.identifier);\n }\n });\n }\n\n // Find root nodes (no parent)\n const roots = nodes.filter((n) => !parentMap.has(n.identifier));\n\n // Assign levels (depths) - now vertical levels from top to bottom\n const levelMap = new Map<string, number>();\n const assignLevels = (nodeId: string, level: number) => {\n levelMap.set(nodeId, level);\n for (const childId of childrenMap.get(nodeId) || []) {\n assignLevels(childId, level + 1);\n }\n };\n roots.forEach((root) => assignLevels(root.identifier, 0));\n\n // Group nodes by level\n const levels: string[][] = [];\n nodes.forEach((n) => {\n const lvl = levelMap.get(n.identifier) ?? 0;\n if (!levels[lvl]) levels[lvl] = [];\n levels[lvl].push(n.identifier);\n });\n\n // Calculate subtree widths for each node (for centering horizontally)\n const subtreeWidth = new Map<string, number>();\n const nodeWidth = 200; // Approximate node width\n const nodeSpacing = 100; // Horizontal spacing between nodes\n const calcSubtreeWidth = (nodeId: string): number => {\n const children = childrenMap.get(nodeId) || [];\n if (children.length === 0) {\n subtreeWidth.set(nodeId, nodeWidth);\n return nodeWidth;\n }\n let width = 0;\n for (const childId of children) {\n width += calcSubtreeWidth(childId);\n }\n width += (children.length - 1) * nodeSpacing;\n subtreeWidth.set(nodeId, width);\n return width;\n };\n roots.forEach((root) => calcSubtreeWidth(root.identifier));\n\n // Assign positions recursively - now top to bottom\n const positions = new Map<string, { x: number; y: number }>();\n const levelSpacing = 300; // Increased vertical spacing between levels\n const verticalMargin = 100; // Add margin to the top\n const assignPositions = (nodeId: string, xLeft: number, level: number) => {\n const width = subtreeWidth.get(nodeId) || nodeWidth;\n const y = level * levelSpacing + verticalMargin; // Add margin here\n const children = childrenMap.get(nodeId) || [];\n\n if (children.length === 0) {\n // Leaf node: center in its width\n positions.set(nodeId, { x: xLeft + width / 2 - nodeWidth / 2, y });\n } else {\n // Internal node: center above its children\n let childX = xLeft;\n for (const childId of children) {\n const childWidth = subtreeWidth.get(childId) || nodeWidth;\n assignPositions(childId, childX, level + 1);\n childX += childWidth + nodeSpacing;\n }\n // Center parent above children\n const firstChild = children[0];\n const lastChild = children[children.length - 1];\n const firstPos = positions.get(firstChild)!;\n const lastPos = positions.get(lastChild)!;\n const parentX = (firstPos.x + lastPos.x) / 2;\n positions.set(nodeId, { x: parentX, y });\n }\n };\n\n // Lay out each tree\n let xCursor = 0;\n for (const root of roots) {\n assignPositions(root.identifier, xCursor, 0);\n xCursor += (subtreeWidth.get(root.identifier) || nodeWidth) + nodeSpacing * 2;\n }\n\n return positions;\n};\n\n/**\n * Extracts LLM details from node data for display\n */\nconst extractLLMDetails = (node: AgentRunNodeDto): { description: string; modelInfo: string } => {\n let description = node.node_type;\n let modelInfo = \"\";\n\n if (node.details?.internals?.llm_details) {\n const llmDetails = node.details.internals.llm_details;\n if (llmDetails.length > 0) {\n const lastLLM = llmDetails[llmDetails.length - 1];\n modelInfo = `${lastLLM.model_name} (${lastLLM.model_provider})`;\n description = `${node.node_type}\\n${modelInfo}`;\n }\n }\n\n return { description, modelInfo };\n};\n\n/**\n * Truncates text to specified length with ellipsis\n */\nconst truncateText = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n};\n\nconst nodeTypes: NodeTypes = {\n agent: RCNode\n};\n\nconst AgenticFlowVisualizer: React.FC<AgenticFlowVisualizerProps> = ({\n flowData: propFlowData,\n width = \"100%\",\n height = \"1000px\",\n className = \"\",\n defaultZoom = 1,\n defaultPan = { x: 0, y: 0 },\n disableAutoFit = false,\n showTimeline = false\n}) => {\n // Use prop data directly, no hooks needed\n const flowData = propFlowData;\n\n // Show no data state if no flowData is available\n if (!flowData) {\n return (\n <div\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n background: \"#f9fafb\",\n position: \"relative\",\n minWidth: \"800px\",\n minHeight: \"600px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n }}\n className={className}\n >\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: \"16px\", color: \"#6b7280\", marginBottom: \"8px\" }}>No flow data available</div>\n <div style={{ fontSize: \"14px\", color: \"#9ca3af\" }}>Please provide flowData prop</div>\n </div>\n </div>\n );\n }\n const containerRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement | null>(null);\n const [containerDimensions, setContainerDimensions] = useState({\n width: typeof width === \"number\" ? width : 800,\n height: typeof height === \"number\" ? height : 600\n });\n\n // Timeline state\n const [currentStep, setCurrentStep] = useState(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const playIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Timeline visibility state\n const [showTimelines, setShowTimelines] = useState(false);\n\n // Drawer state\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const [selectedData, setSelectedData] = useState<{\n type: \"node\" | \"edge\";\n data: any;\n } | null>(null);\n\n // Get max step from stamps or steps\n const maxStep = useMemo(() => {\n const stamps = flowData.stamps || flowData.steps || [];\n return stamps.length > 0 ? Math.max(...stamps.map((s: { step: number }) => s.step)) : 0;\n }, [flowData.stamps, flowData.steps]);\n\n // Auto-play functionality\n useEffect(() => {\n if (isPlaying) {\n playIntervalRef.current = setInterval(() => {\n setCurrentStep((prev) => {\n if (prev >= maxStep) {\n setIsPlaying(false);\n return prev;\n }\n return prev + 1;\n });\n }, 250); // 1 second per step\n } else {\n if (playIntervalRef.current) {\n clearInterval(playIntervalRef.current);\n playIntervalRef.current = null;\n }\n }\n\n return () => {\n if (playIntervalRef.current) {\n clearInterval(playIntervalRef.current);\n }\n };\n }, [isPlaying, maxStep]);\n\n // Initialize current step to last step and pan to hub node\n useEffect(() => {\n const stamps = flowData.stamps || flowData.steps || [];\n if (stamps.length > 0) {\n setCurrentStep(Math.max(...stamps.map((s: { step: number }) => s.step)));\n }\n }, [flowData.stamps, flowData.steps]);\n\n // Update dimensions when width/height props change\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerDimensions({\n width: rect.width || (typeof width === \"number\" ? width : 800),\n height: rect.height || (typeof height === \"number\" ? height : 600)\n });\n }\n };\n\n updateDimensions();\n\n // Use ResizeObserver if available, otherwise fallback to window resize\n if (window.ResizeObserver && containerRef.current) {\n const resizeObserver = new ResizeObserver(updateDimensions);\n resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n } else {\n window.addEventListener(\"resize\", updateDimensions);\n return () => window.removeEventListener(\"resize\", updateDimensions);\n }\n }, [width, height]);\n\n // Calculate auto-layout positions\n const positions = useMemo(() => {\n if (!flowData.nodes) {\n return new Map();\n }\n return calculateAutoLayout(flowData.nodes, flowData.edges || []);\n }, [flowData.nodes, flowData.edges]);\n\n // Get nodes and edges for current step\n const getNodesForStep = useCallback(\n (step: number) => {\n if (!flowData.nodes) {\n return [];\n }\n return flowData.nodes.filter((node: { stamp: { step: number } }) => node.stamp.step <= step);\n },\n [flowData.nodes]\n );\n\n const getEdgesForStep = useCallback(\n (step: number) => {\n return (flowData.edges || []).filter((edge: { stamp: { step: number } }) => edge.stamp.step <= step);\n },\n [flowData.edges]\n );\n\n // Handle node inspection\n const handleNodeInspect = useCallback((nodeData: any) => {\n setSelectedData({ type: \"node\", data: nodeData });\n setIsDrawerOpen(true);\n }, []);\n\n // Handle edge inspection\n const handleEdgeInspect = useCallback(\n (edgeData: any) => {\n // Find the edge in the current edges to get the ID\n const currentEdges = getEdgesForStep(currentStep);\n const edge = currentEdges.find((e) => e.source === edgeData.source && e.target === edgeData.target);\n const edgeWithId = {\n ...edgeData,\n id: edge?.identifier || \"N/A\"\n };\n setSelectedData({ type: \"edge\", data: edgeWithId });\n setIsDrawerOpen(true);\n },\n [getEdgesForStep, currentStep]\n );\n\n // Convert flow data to ReactFlow format with step filtering\n const nodes: Node[] = useMemo(() => {\n const stepNodes = getNodesForStep(currentStep);\n const stepEdges = getEdgesForStep(currentStep);\n return stepNodes.map((node) => {\n const position = positions.get(node.identifier) || { x: 0, y: 0 };\n const { description } = extractLLMDetails(node);\n const isActive = node.stamp.step === currentStep;\n\n return {\n id: node.identifier,\n type: \"agent\",\n position,\n data: {\n label: node.node_type,\n description,\n nodeType: node.node_type,\n step: node.stamp?.step,\n time: node.stamp?.time,\n isActive,\n onInspect: handleNodeInspect,\n id: node.identifier, // Add id for zoom functionality\n edges: stepEdges // Pass edges to the node\n },\n style: {\n filter: isActive ? \"drop-shadow(0 4px 8px rgba(99, 102, 241, 0.3))\" : \"none\"\n }\n };\n });\n }, [positions, currentStep, getNodesForStep, getEdgesForStep, handleNodeInspect]);\n\n const edges: Edge[] = useMemo(() => {\n const stepEdges = getEdgesForStep(currentStep);\n return stepEdges\n .filter((edge) => edge.source && edge.target)\n .map((edge) => {\n const isActive = edge.stamp.step === currentStep;\n return {\n id: edge.identifier,\n type: \"default\",\n source: edge.source!,\n target: edge.target,\n animated: isActive,\n bidirectional: true, // Enable bidirectional edges with arrow heads\n style: {\n stroke: isActive ? \"#6366f1\" : \"#9ca3af\",\n strokeWidth: isActive ? 3 : 2\n },\n label: edge.stamp?.identifier ? truncateText(String(edge.stamp.identifier), 50) : undefined,\n data: {\n label: edge.stamp?.identifier ? truncateText(String(edge.stamp.identifier), 50) : undefined,\n source: edge.source!,\n target: edge.target,\n step: edge.stamp?.step,\n time: edge.stamp?.time,\n details: edge.details\n }\n };\n });\n }, [currentStep, getEdgesForStep]);\n\n const [nodesState, setNodes, onNodesChange] = useNodesState(nodes);\n const [edgesState, setEdges, onEdgesChange] = useEdgesState(edges);\n\n // Update nodes and edges when currentStep changes\n useEffect(() => {\n setNodes(nodes);\n }, [nodes, setNodes]);\n\n useEffect(() => {\n setEdges(edges);\n }, [edges, setEdges]);\n\n const onConnect = useCallback((params: Connection) => setEdges((eds: Edge[]) => addEdge(params, eds)), [setEdges]);\n\n const handleStepChange = useCallback((step: number) => {\n setCurrentStep(step);\n setIsPlaying(false);\n }, []);\n\n const handlePlayPause = useCallback(() => {\n setIsPlaying((prev) => !prev);\n }, []);\n\n // Function to convert client (screen) coordinates to SVG coordinates\n const clientToSvgCoords = (clientX: number, clientY: number) => {\n if (!svgRef.current) return { x: 0, y: 0 };\n const pt = svgRef.current.createSVGPoint();\n pt.x = clientX;\n pt.y = clientY;\n const svgP = pt.matrixTransform(svgRef.current.getScreenCTM()?.inverse());\n return { x: svgP.x, y: svgP.y };\n };\n\n const reactFlowInstance = useReactFlow();\n\n // Pan to hub node (most connected node) on initial load, unless disabled or custom settings provided\n useEffect(() => {\n if (disableAutoFit || !reactFlowInstance || nodes.length === 0) {\n return;\n }\n\n // Find the node with the most connections\n const nodeConnectionCounts = new Map<string, number>();\n\n // Count incoming and outgoing connections for each node\n edges.forEach((edge) => {\n // Count outgoing connections (source)\n const sourceCount = nodeConnectionCounts.get(edge.source) || 0;\n nodeConnectionCounts.set(edge.source, sourceCount + 1);\n\n // Count incoming connections (target)\n const targetCount = nodeConnectionCounts.get(edge.target) || 0;\n nodeConnectionCounts.set(edge.target, targetCount + 1);\n });\n\n // Find the node with the highest connection count\n let hubNodeId = \"\";\n let maxConnections = 0;\n\n nodeConnectionCounts.forEach((count, nodeId) => {\n if (count > maxConnections) {\n maxConnections = count;\n hubNodeId = nodeId;\n }\n });\n\n // If no hub node found (no edges), use the first node\n if (!hubNodeId && nodes.length > 0) {\n hubNodeId = nodes[0].id;\n }\n\n // Pan to the hub node\n if (hubNodeId) {\n setTimeout(() => {\n reactFlowInstance.fitView({\n nodes: [{ id: hubNodeId }],\n duration: 1000,\n padding: 0.2,\n minZoom: defaultZoom,\n maxZoom: 1\n });\n }, 500); // Small delay to ensure nodes are rendered\n }\n }, [nodes, edges, reactFlowInstance, disableAutoFit, defaultZoom]);\n\n return (\n <div\n ref={containerRef}\n style={{\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n position: \"relative\",\n minWidth: \"800px\",\n minHeight: \"600px\"\n }}\n className={className}\n >\n {/* Collapsible Side Panel */}\n {showTimeline && (\n <div className={`side-panel ${showTimelines ? \"expanded\" : \"collapsed\"}`}>\n {!showTimelines && (\n <button className=\"panel-toggle\" onClick={() => setShowTimelines(!showTimelines)} title=\"Expand Panel\">\n <PanelLeft size={20} />\n </button>\n )}\n\n {showTimelines && (\n <div className=\"panel-content\">\n <VerticalTimeline\n stamps={flowData.stamps || flowData.steps || []}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onToggle={() => setShowTimelines(false)}\n />\n </div>\n )}\n </div>\n )}\n\n <ReactFlow\n nodes={nodesState}\n edges={edgesState}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n nodeTypes={nodeTypes}\n edgeTypes={{\n default: (edgeProps) => (\n <RCEdge\n {...edgeProps}\n clientToSvgCoords={clientToSvgCoords}\n svgRef={svgRef}\n onInspect={handleEdgeInspect}\n />\n )\n }}\n attributionPosition=\"bottom-left\"\n style={{\n width: showTimeline && showTimelines ? \"calc(100% - 280px)\" : \"100%\", // Account for side panel width when visible\n height: showTimeline && showTimelines ? \"calc(100% - 60px)\" : \"100%\", // Account for timeline height\n marginLeft: showTimeline && showTimelines ? \"280px\" : \"0\" // Push content to the right of side panel when visible\n }}\n defaultViewport={{ x: defaultPan.x, y: defaultPan.y, zoom: defaultZoom }}\n onInit={(instance) => {\n if (containerRef.current) {\n const svg = containerRef.current.querySelector(\"svg\");\n if (svg) svgRef.current = svg as SVGSVGElement;\n }\n }}\n >\n <Controls />\n <Background variant={BackgroundVariant.Lines} color=\"#EEEEEE\" gap={16} />\n </ReactFlow>\n\n {/* Right Drawer */}\n <div className={`right-drawer ${isDrawerOpen ? \"open\" : \"\"}`}>\n <div className=\"drawer-toggle\" onClick={() => setIsDrawerOpen(!isDrawerOpen)}>\n <PanelRight size={20} />\n </div>\n\n {isDrawerOpen && selectedData && (\n <div className=\"drawer-content\">\n <div className=\"drawer-header\">\n <h3>{selectedData.type === \"node\" ? \"Node Details\" : \"Edge Details\"}</h3>\n </div>\n <div className=\"drawer-body\">\n {selectedData.type === \"node\" ? (\n // Node Details\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Label:</span>\n <span className=\"detail-value\">{selectedData.data.label || \"N/A\"}</span>\n </div>\n {selectedData.data.description && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Description:</span>\n <span className=\"detail-value\">{selectedData.data.description}</span>\n </div>\n )}\n {selectedData.data.nodeType && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Type:</span>\n <span className=\"detail-value\">{selectedData.data.nodeType}</span>\n </div>\n )}\n {selectedData.data.step && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Step:</span>\n <span className=\"detail-value\">{selectedData.data.step}</span>\n </div>\n )}\n {selectedData.data.time && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Time:</span>\n <span className=\"detail-value\">{new Date(selectedData.data.time * 1000).toLocaleString()}</span>\n </div>\n )}\n {selectedData.data.icon && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Icon:</span>\n <span className=\"detail-value\">{selectedData.data.icon}</span>\n </div>\n )}\n </>\n ) : (\n // Edge Details\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">ID:</span>\n <span className=\"detail-value\">{selectedData.data.id || \"N/A\"}</span>\n </div>\n {selectedData.data.source && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Source:</span>\n <span className=\"detail-value\">{selectedData.data.source}</span>\n </div>\n )}\n {selectedData.data.target && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Target:</span>\n <span className=\"detail-value\">{selectedData.data.target}</span>\n </div>\n )}\n {selectedData.data.label && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Label:</span>\n <span className=\"detail-value\">{selectedData.data.label}</span>\n </div>\n )}\n {selectedData.data.step && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Step:</span>\n <span className=\"detail-value\">{selectedData.data.step}</span>\n </div>\n )}\n {selectedData.data.time && (\n <div className=\"detail-row\">\n <span className=\"detail-label\">Time:</span>\n <span className=\"detail-value\">{new Date(selectedData.data.time * 1000).toLocaleString()}</span>\n </div>\n )}\n\n {selectedData.data?.details?.input_args &&\n Array.isArray(selectedData.data.details.input_args) &&\n selectedData.data.details.input_args.length > 0 && (\n <>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Inputs</span>\n <span className=\"detail-value\" style={{ overflowY: \"auto\", maxHeight: \"300px\" }}>\n {Array.isArray(selectedData.data.details.input_args[0]) ? (\n selectedData.data.details.input_args[0].map((arg: any, index: number) => (\n <div key={arg?.role || index} style={{ marginBottom: 8 }}>\n <span className=\"detail-label\">Role:</span>\n <span className=\"detail-value\">{arg?.role || \"Unknown\"}</span>\n <span className=\"detail-label\">Content:</span>\n <span className=\"detail-value\">{arg?.content || \"No content\"}</span>\n </div>\n ))\n ) : (\n <span className=\"detail-value\">\n {JSON.stringify(selectedData.data.details.input_args[0], null, 2)}\n </span>\n )}\n </span>\n </div>\n <div className=\"detail-row\">\n <span className=\"detail-label\">Outputs</span>\n <span className=\"detail-value\">\n {JSON.stringify(selectedData.data?.details?.output, null, 2)}\n </span>\n </div>\n </>\n )}\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Timeline */}\n {showTimeline && showTimelines && (\n <div style={{ marginLeft: \"280px\", marginTop: \"100px\" }}>\n <Timeline\n stamps={flowData.stamps || flowData.steps || []}\n currentStep={currentStep}\n isPlaying={isPlaying}\n onStepChange={handleStepChange}\n onPlayPause={handlePlayPause}\n />\n </div>\n )}\n\n <style>\n {`\n .react-flow__edge-label {\n font-size: 10px;\n background: white;\n padding: 2px 4px;\n border-radius: 4px;\n border: 1px solid #e5e7eb;\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Right Drawer Styles */\n .right-drawer {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n z-index: 1000;\n display: flex;\n align-items: flex-start;\n transition: transform 0.3s ease;\n margin-left: ${showTimeline && showTimelines ? \"280px\" : \"0\"}; /* Account for vertical timeline when visible */\n }\n\n .right-drawer:not(.open) {\n transform: translateX(calc(100% - 50px));\n }\n\n .right-drawer.open {\n transform: translateX(0);\n }\n\n .drawer-toggle {\n width: 50px;\n height: 50px;\n background: none;\n color: #6b7280;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color 0.2s ease;\n margin-top: 20px;\n }\n\n .drawer-toggle:hover {\n color: #374151;\n }\n\n .drawer-content {\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px 0 0 8px;\n width: 400px;\n height: calc(100% - 40px);\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n animation: drawerSlideIn 0.3s ease-out;\n }\n\n .drawer-header {\n padding: 16px 20px;\n border-bottom: 1px solid #e5e7eb;\n background: #f9fafb;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n }\n\n .drawer-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 20px;\n color: #6b7280;\n cursor: pointer;\n padding: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .close-button:hover {\n background: #e5e7eb;\n color: #1f2937;\n }\n\n .drawer-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n width: 100%;\n box-sizing: border-box;\n }\n\n .detail-row {\n display: grid;\n grid-template-columns: 100px 1fr;\n margin-bottom: 12px;\n align-items: flex-start;\n gap: 8px;\n }\n\n .detail-row:last-child {\n margin-bottom: 0;\n }\n\n .detail-label {\n font-weight: 600;\n color: #6b7280;\n font-size: 13px;\n word-break: break-word;\n }\n\n .detail-value {\n color: #1f2937;\n font-size: 13px;\n word-break: break-word;\n flex: 1;\n width: 100%;\n overflow: visible;\n text-overflow: unset;\n max-width: unset;\n white-space: pre-line;\n line-height: 1.4;\n }\n\n @keyframes drawerSlideIn {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Scoreboard Styles */\n .scoreboard {\n position: absolute;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 400px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .scoreboard-header {\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n background: #f9fafb;\n text-align: center;\n }\n\n .scoreboard-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .scoreboard-content {\n padding: 16px;\n display: flex;\n justify-content: space-around;\n align-items: center;\n gap: 20px;\n }\n\n .scoreboard-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n }\n\n .scoreboard-label {\n font-size: 12px;\n color: #6b7280;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .scoreboard-count {\n font-size: 18px;\n font-weight: 700;\n padding: 6px 12px;\n border-radius: 6px;\n min-width: 40px;\n text-align: center;\n }\n\n .scoreboard-count.open {\n background: #fef3c7;\n color: #92400e;\n }\n\n .scoreboard-count.completed {\n background: #d1fae5;\n color: #065f46;\n }\n\n .scoreboard-count.error {\n background: #fee2e2;\n color: #991b1b;\n }\n\n .scoreboard-count.error.clickable {\n transition: all 0.2s ease;\n }\n\n .scoreboard-count.error.clickable:hover {\n background: #fecaca;\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.3);\n }\n\n /* Side Panel Styles */\n .side-panel {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n transition: all 0.3s ease;\n }\n\n .side-panel.collapsed {\n width: 60px;\n }\n\n .side-panel.expanded {\n width: 280px;\n }\n\n .panel-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: none;\n cursor: pointer;\n color: #6b7280;\n transition: color 0.2s ease;\n padding: 8px;\n margin: 20px 0 0 0;\n }\n\n .panel-toggle:hover {\n color: #374151;\n }\n\n .panel-content {\n flex: 1;\n background: white;\n border-right: 1px solid #e5e7eb;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n }\n\n\n `}\n </style>\n </div>\n );\n};\n\nexport default AgenticFlowVisualizer;\n","import React from \"react\";\nimport AgenticFlowVisualizer, { AgenticFlowVisualizerProps } from \"./AgenticFlowVisualizer\";\nimport { ReactFlowProvider } from \"reactflow\";\n\n/**\n * Visualizer component that wraps AgenticFlowVisualizer with ReactFlowProvider.\n * This is the main component that should be imported from the npm package.\n */\nconst Visualizer: React.FC<AgenticFlowVisualizerProps> = (props) => {\n return (\n <ReactFlowProvider>\n <AgenticFlowVisualizer {...props} />\n </ReactFlowProvider>\n );\n};\n\nexport default Visualizer;\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { useState, useCallback } from \"react\";\n\n// Base URL for the API\nconst API_BASE = \"/api\";\n\nexport interface JsonFile {\n name: string;\n size?: number;\n modified?: string;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n}\n\nexport const useApi = () => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ApiError | null>(null);\n\n // Function to list all JSON files in the .railtracks directory\n const listJsonFiles = useCallback(async (): Promise<JsonFile[]> => {\n setLoading(true);\n setError(null);\n\n try {\n console.log(\"Fetching files from:\", `${API_BASE}/files`);\n const response = await fetch(`${API_BASE}/files`);\n console.log(\"Response status:\", response.status);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const files = await response.json();\n console.log(\"Files received:\", files);\n return files;\n } catch (err) {\n console.error(\"Error fetching files:\", err);\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return [];\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Function to load a specific JSON file\n const loadJsonFile = useCallback(async (filename: string): Promise<any> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${API_BASE}/json/${filename}`);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Function to trigger a frontend refresh\n const triggerRefresh = useCallback(async (): Promise<any> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${API_BASE}/refresh`, {\n method: \"POST\"\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const result = await response.json();\n return result;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n const apiError: ApiError = {\n message: errorMessage,\n status: err instanceof Error && \"status\" in err ? (err as any).status : undefined\n };\n setError(apiError);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n loading,\n error,\n listJsonFiles,\n loadJsonFile,\n triggerRefresh\n };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useApi, JsonFile } from \"./useApi\";\n\n// Import the data structure types from the visualizer\nexport interface AgentRunNodeDto {\n identifier: string;\n node_type: string;\n stamp: {\n step: number;\n time: number;\n identifier: string;\n };\n details: {\n internals?: {\n llm_details?: Array<{\n model_name: string;\n model_provider: string;\n input: Array<{\n role: string;\n content: any;\n }>;\n output: {\n role: string;\n content: any;\n };\n input_tokens: number | null;\n output_tokens: number | null;\n total_cost: number | null;\n system_fingerprint: string | null;\n }>;\n latency?: {\n total_time: number;\n };\n };\n };\n parent: AgentRunNodeDto | null;\n}\n\nexport interface AgentRunEdgeDto {\n identifier: string;\n source: string | null;\n target: string;\n stamp: {\n step: number;\n time: number;\n identifier: string;\n };\n details: {\n state?: string;\n input_args?: any[];\n input_kwargs?: any;\n output?: any;\n };\n parent: AgentRunEdgeDto | null;\n}\n\nexport interface AgentRunDto {\n nodes: AgentRunNodeDto[];\n edges?: AgentRunEdgeDto[];\n stamps?: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n steps?: Array<{\n step: number;\n time: number;\n identifier: string;\n }>;\n}\n\nexport interface FlowDataState {\n availableFiles: JsonFile[];\n currentFile: string | null;\n flowData: AgentRunDto | null;\n loading: boolean;\n error: string | null;\n}\n\nexport const useFlowData = () => {\n const { listJsonFiles, loadJsonFile, loading: apiLoading, error: apiError } = useApi();\n\n const [state, setState] = useState<FlowDataState>({\n availableFiles: [],\n currentFile: null,\n flowData: null,\n loading: false,\n error: null\n });\n\n // Load available files on mount\n useEffect(() => {\n loadAvailableFiles();\n }, []);\n\n const loadAvailableFiles = useCallback(async () => {\n const files = await listJsonFiles();\n setState((prev) => ({\n ...prev,\n availableFiles: files\n }));\n }, [listJsonFiles]);\n\n const loadFile = useCallback(\n async (filename: string) => {\n setState((prev) => ({\n ...prev,\n loading: true,\n error: null\n }));\n\n try {\n const data = await loadJsonFile(filename);\n if (data) {\n setState((prev) => ({\n ...prev,\n currentFile: filename,\n flowData: data,\n loading: false,\n error: null\n }));\n } else {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: \"Failed to load file data\"\n }));\n }\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : \"Unknown error occurred\"\n }));\n }\n },\n [loadJsonFile]\n );\n\n const refreshFiles = useCallback(async () => {\n await loadAvailableFiles();\n }, [loadAvailableFiles]);\n\n return {\n ...state,\n loading: state.loading || apiLoading,\n error: state.error || apiError?.message || null,\n loadFile,\n refreshFiles\n };\n};\n","import React from \"react\";\nimport { RefreshCw } from \"lucide-react\";\nimport { JsonFile } from \"../hooks\";\n\ninterface FileSelectorProps {\n files: JsonFile[];\n currentFile: string | null;\n onFileSelect: (filename: string) => void;\n onRefresh: () => void;\n loading?: boolean;\n disabled?: boolean;\n}\n\nexport const FileSelector: React.FC<FileSelectorProps> = ({\n files,\n currentFile,\n onFileSelect,\n onRefresh,\n loading = false,\n disabled = false\n}) => {\n const handleRefresh = (e: React.MouseEvent) => {\n e.stopPropagation();\n onRefresh();\n };\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <select\n value={currentFile || \"\"}\n onChange={(e) => onFileSelect(e.target.value)}\n disabled={disabled}\n style={{\n cursor: \"pointer\",\n padding: \"8px 16px 8px 16px\",\n borderRadius: \"4px\",\n fontSize: \"14px\",\n border: \"1px solid #ccc\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\"\n }}\n >\n <option value=\"\">Select an Agent Session...</option>\n {files.map((file) => (\n <option key={file.name} value={file.name}>\n {file.name}\n </option>\n ))}\n </select>\n\n <button\n onClick={handleRefresh}\n disabled={loading || disabled}\n title=\"Refresh files\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\"\n }}\n >\n <RefreshCw size={16} style={{ animation: loading ? \"spin 1s linear infinite\" : \"none\" }} />\n </button>\n </div>\n );\n};\n","import React, { useState, useMemo } from \"react\";\nimport { useFlowData } from \"./hooks\";\nimport { FileSelector } from \"./components/FileSelector\";\nimport Visualizer from \"./Visualizer\";\n\n/**\n * This is used as an entrypoint for building the portable SPA version of the visualizer.\n *\n * It shows up in `.railtracks/ui/*` when you run `railtracks viz`\n */\nconst App: React.FC = () => {\n const { availableFiles, currentFile, flowData, loading, error, loadFile, refreshFiles } = useFlowData();\n const [showTimeline, setShowTimeline] = useState(false);\n const [selectedAgentRun, setSelectedAgentRun] = useState<number>(0);\n\n const handleFileSelect = (filename: string) => {\n loadFile(filename);\n setSelectedAgentRun(0); // Reset to first agent run when file changes\n };\n\n // Check if flowData is an array (multiple agent runs)\n const isMultipleAgentRuns = useMemo(() => {\n return Array.isArray(flowData) && flowData.length > 1;\n }, [flowData]);\n\n // Get the available agent runs for the dropdown\n const agentRuns = useMemo(() => {\n if (!Array.isArray(flowData)) return [];\n return flowData.map((run, index) => ({\n id: index,\n name: run.name || `Agent Run ${index + 1}`,\n runId: run.run_id || `Run ${index + 1}`,\n sessionId: run.session_id || `Session ${index + 1}`\n }));\n }, [flowData]);\n\n // Get the currently selected agent run data\n const selectedFlowData = useMemo(() => {\n if (!flowData) return null;\n if (Array.isArray(flowData)) {\n return flowData[selectedAgentRun] || null;\n }\n return flowData;\n }, [flowData, selectedAgentRun]);\n\n const handleAgentRunSelect = (runIndex: number) => {\n setSelectedAgentRun(runIndex);\n };\n\n return (\n <div className=\"app\">\n <div className=\"app-header\">\n <h1>RailTracks Visualizer</h1>\n <div className=\"file-selector-container\">\n <FileSelector\n files={availableFiles}\n currentFile={currentFile}\n onFileSelect={handleFileSelect}\n onRefresh={refreshFiles}\n loading={loading}\n disabled={loading}\n />\n {isMultipleAgentRuns && (\n <div className=\"agent-run-selector\">\n <label htmlFor=\"agent-run-select\">Agent Run:</label>\n <select\n id=\"agent-run-select\"\n value={selectedAgentRun}\n onChange={(e) => handleAgentRunSelect(Number(e.target.value))}\n disabled={loading}\n >\n {agentRuns.map((run) => (\n <option key={run.id} value={run.id}>\n {run.name} ({run.runId})\n </option>\n ))}\n </select>\n </div>\n )}\n <label className=\"timeline-toggle\">\n <input type=\"checkbox\" checked={showTimeline} onChange={(e) => setShowTimeline(e.target.checked)} />\n Show Timeline\n </label>\n </div>\n </div>\n\n {error && (\n <div className=\"error-message\">\n <p>Error: {error}</p>\n </div>\n )}\n\n <div className=\"visualizer-container\">\n {loading ? (\n <div className=\"loading-state\">\n <div className=\"loading-spinner\"></div>\n <p>Loading flow data...</p>\n </div>\n ) : selectedFlowData ? (\n <Visualizer flowData={selectedFlowData} showTimeline={showTimeline} />\n ) : (\n <div className=\"no-data-state\">\n <p>Please select a file to visualize the flow data</p>\n </div>\n )}\n </div>\n\n <style>{`\n .app {\n min-height: 100vh;\n background: #f9fafb;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .app-header {\n background: white;\n border-bottom: 1px solid #e5e7eb;\n padding: 5px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .app-header h1 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .file-selector-container {\n display: flex;\n align-items: center;\n gap: 20px;\n }\n\n .agent-run-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n color: #374151;\n }\n\n .agent-session-info {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .agent-session-info label {\n font-weight: 500;\n white-space: nowrap;\n }\n\n .session-id {\n font-family: monospace;\n font-size: 12px;\n color: #6b7280;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .agent-run-selector label {\n font-weight: 500;\n white-space: nowrap;\n }\n\n .agent-run-selector select {\n padding: 4px 8px;\n border: 1px solid #d1d5db;\n border-radius: 4px;\n font-size: 14px;\n background: white;\n color: #374151;\n cursor: pointer;\n }\n\n .agent-run-selector select:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .timeline-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n color: #374151;\n cursor: pointer;\n user-select: none;\n }\n\n .timeline-toggle input[type=\"checkbox\"] {\n cursor: pointer;\n }\n\n .error-message {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #991b1b;\n padding: 12px 20px;\n margin: 20px;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .visualizer-container {\n padding: 20px;\n min-height: calc(100vh - 100px);\n }\n\n .loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 400px;\n color: #6b7280;\n }\n\n .loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #e5e7eb;\n border-top: 4px solid #6366f1;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 16px;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .no-data-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 400px;\n color: #6b7280;\n font-size: 16px;\n }\n `}</style>\n </div>\n );\n};\n\nexport default App;\n"],"names":["css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Edge","id","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","markerEnd","bidirectional","data","clientToSvgCoords","svgRef","onInspect","useState","getStrokeColor","_a","details","state","stroke","edgePath","arrowMarkers","useMemo","path","markers","strokeColor","push","React","key","markerWidth","markerHeight","refX","refY","orient","markerUnits","points","fill","hoverStyle","strokeWidth","cursor","className","d","markerStart","undefined","label","x","y","width","height","overflow","pointerEvents","display","alignItems","justifyContent","onClick","event","stopPropagation","background","color","border","borderRadius","padding","fontSize","fontWeight","boxShadow","transition","Node","fitView","useReactFlow","hasOutgoingEdges","edges","some","edge","source","Fragment","handleNodeClick","nodes","duration","minZoom","maxZoom","description","nodeType","step","time","icon","Handle","position","Position","Top","Date","toLocaleTimeString","Bottom","Timeline","stamps","currentStep","isPlaying","onStepChange","onPlayPause","maxStep","length","Math","max","map","s","minStep","min","totalSteps","useEffect","tooltipTriggerList","querySelectorAll","tooltipList","Array","from","tooltipTriggerEl","window","bootstrap","Tooltip","forEach","tooltip","dispose","bottom","left","right","backgroundColor","borderTop","gap","zIndex","onMouseEnter","e","currentTarget","onMouseLeave","borderLeft","borderBottom","marginLeft","flex","_","index","isActive","isPast","hasStep","tooltipText","find","identifier","minWidth","textAlign","VerticalTimeline","onToggle","flexDirection","margin","title","PanelLeft","size","overflowY","latency","stepStamps","filter","prevStep","prevStepStamps","getStepLatency","getStepLabel","marginBottom","flexShrink","toFixed","formatLatency","lineHeight","wordBreak","fontStyle","top","transform","animation","truncateText","text","maxLength","substring","nodeTypes","agent","RCNode","AgenticFlowVisualizer","flowData","propFlowData","defaultZoom","defaultPan","disableAutoFit","showTimeline","minHeight","containerRef","useRef","containerDimensions","setContainerDimensions","setCurrentStep","setIsPlaying","playIntervalRef","showTimelines","setShowTimelines","isDrawerOpen","setIsDrawerOpen","selectedData","setSelectedData","steps","current","setInterval","prev","clearInterval","updateDimensions","rect","getBoundingClientRect","ResizeObserver","resizeObserver","observe","disconnect","addEventListener","removeEventListener","positions","calculateAutoLayout","Map","n","childrenMap","parentMap","set","target","get","node","parent","roots","has","levelMap","assignLevels","nodeId","level","childId","root","levels","lvl","subtreeWidth","nodeWidth","calcSubtreeWidth","children","assignPositions","xLeft","childX","childWidth","lastChild","firstPos","lastPos","parentX","xCursor","nodeSpacing","getNodesForStep","useCallback","stamp","getEdgesForStep","handleNodeInspect","nodeData","handleEdgeInspect","edgeData","edgeWithId","Object","assign","stepNodes","stepEdges","node_type","modelInfo","_b","internals","llm_details","llmDetails","lastLLM","model_name","model_provider","extractLLMDetails","animated","String","_c","_d","nodesState","setNodes","onNodesChange","useNodesState","edgesState","setEdges","onEdgesChange","useEdgesState","onConnect","params","eds","addEdge","handleStepChange","handlePlayPause","clientX","clientY","pt","createSVGPoint","svgP","matrixTransform","getScreenCTM","inverse","reactFlowInstance","nodeConnectionCounts","sourceCount","targetCount","hubNodeId","maxConnections","count","setTimeout","ReactFlow","edgeTypes","default","edgeProps","RCEdge","attributionPosition","defaultViewport","zoom","onInit","instance","svg","querySelector","Controls","Background","variant","BackgroundVariant","Lines","PanelRight","toLocaleString","input_args","isArray","maxHeight","arg","role","content","JSON","stringify","output","marginTop","Visualizer","props","ReactFlowProvider","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","next","rejected","result","done","then","apply","SuppressedError","API_BASE","useFlowData","listJsonFiles","loadJsonFile","loading","apiLoading","error","apiError","useApi","setLoading","setError","console","log","response","fetch","status","ok","Error","files","json","err","message","filename","triggerRefresh","method","setState","availableFiles","currentFile","loadAvailableFiles","loadFile","refreshFiles","FileSelector","onFileSelect","onRefresh","disabled","onChange","appearance","WebkitAppearance","MozAppearance","file","name","RefreshCw","App","setShowTimeline","selectedAgentRun","setSelectedAgentRun","isMultipleAgentRuns","agentRuns","run","runId","run_id","sessionId","session_id","selectedFlowData","htmlFor","handleAgentRunSelect","runIndex","Number","checked"],"mappings":"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","x_google_ignoreList":[0,7]}