import React, { useState, useEffect } from 'react'; import { Users, Zap, Brain, Loader2, CheckCircle2, Clock } from 'lucide-react'; import { AppState, AnalysisResult, ExpertResult } from '../types'; import ProcessNode from '../ProcessNode'; import ExpertCard from '../ExpertCard'; interface ProcessFlowProps { appState: AppState; managerAnalysis: AnalysisResult | null; experts: ExpertResult[]; defaultExpanded?: boolean; processStartTime?: number | null; processEndTime?: number | null; } const GlobalTimer = ({ start, end, appState }: { start: number | null | undefined, end: number | null | undefined, appState: AppState }) => { const [elapsed, setElapsed] = useState(0); useEffect(() => { let interval: any; const isRunning = appState !== 'idle' && appState !== 'completed' && start; if (isRunning) { interval = setInterval(() => { setElapsed(Date.now() - (start || 0)); }, 100); } else if (appState === 'completed' && start && end) { setElapsed(end - start); } else if (appState === 'idle') { setElapsed(0); } return () => clearInterval(interval); }, [appState, start, end]); if (!start) return null; const seconds = (elapsed / 1000).toFixed(1); return (
{seconds}s
); }; const ProcessFlow = ({ appState, managerAnalysis, experts, defaultExpanded = true, processStartTime, processEndTime }: ProcessFlowProps) => { const [isExpanded, setIsExpanded] = useState(defaultExpanded); // Status computation helpers const isAnalysisDone = !!managerAnalysis; const isSynthesisActive = appState === 'synthesizing'; const isComplete = appState === 'completed'; // Experts are active if ANY expert is currently thinking or pending // We use this logic instead of just `appState` because now experts run IN PARALLEL with analysis const hasExperts = experts.length > 0; const anyExpertWorking = experts.some(e => e.status === 'thinking' || e.status === 'pending'); const allExpertsDone = experts.length > 0 && experts.every(e => e.status === 'completed' || e.status === 'error'); // Logic for Node Active States // 1. Manager: Active if analyzing, OR if we don't have analysis yet but experts have started (edge case), Completed if analysis exists. const managerStatus = (appState === 'analyzing' && !managerAnalysis) ? 'active' : (isAnalysisDone ? 'completed' : 'idle'); // 2. Experts: Active if any is working, Completed if all are done, Idle otherwise const expertsStatus = anyExpertWorking ? 'active' : (allExpertsDone ? 'completed' : 'idle'); return (
{/* Global Timer Overlay */}
{/* Connector Line */}
{/* Node 1: Manager Analysis */} setIsExpanded(!isExpanded)} >
{managerAnalysis ? ( <>

"{managerAnalysis.thought_process}"

{managerAnalysis.experts?.map((exp, i) => ( {exp.role} ))}
) : (
Analyzing request...
)}
{/* Node 2: Expert Pool */} {hasExperts && ( setIsExpanded(!isExpanded)} >
{experts.map((expert) => ( ))}
)} {/* Node 3: Synthesis */} {(isSynthesisActive || isComplete) && ( setIsExpanded(!isExpanded)} >
{isSynthesisActive ? (
Synthesizing final answer...
) : (
Reasoning complete.
)}
)}
); }; export default ProcessFlow;