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;