import React, { useState, useEffect } from 'react'; import { Bot, Loader2, CheckCircle2, X, BrainCircuit, MessageSquareText, Thermometer, Timer } from 'lucide-react'; import MarkdownRenderer from './components/MarkdownRenderer'; import { ExpertResult } from './types'; // Simple component to format milliseconds to ss.ms or mm:ss const TimeDisplay = ({ start, end, status }: { start?: number, end?: number, status: string }) => { const [elapsed, setElapsed] = useState(0); useEffect(() => { let interval: any; // Update live timer if (status === 'thinking' && start) { // Calculate initial diff immediately setElapsed(Date.now() - start); interval = setInterval(() => { setElapsed(Date.now() - start); }, 100); } // Show final duration else if ((status === 'completed' || status === 'error') && start && end) { setElapsed(end - start); } else { setElapsed(0); } return () => clearInterval(interval); }, [status, start, end]); if (!start) return null; const seconds = (elapsed / 1000).toFixed(1); return (
{seconds}s
); }; const ExpertCard = ({ expert }: { expert: ExpertResult }) => { const [view, setView] = useState<'thoughts' | 'output'>('output'); const isWorking = expert.status === 'thinking'; const isDone = expert.status === 'completed'; const isPending = expert.status === 'pending'; const isError = expert.status === 'error'; // Auto-switch to thoughts if that's all we have so far React.useEffect(() => { if (isWorking && expert.thoughts && !expert.content) { setView('thoughts'); } else if (expert.content && view === 'thoughts' && !expert.thoughts) { setView('output'); } }, [expert.thoughts, expert.content, isWorking]); return (
{/* Header */}

{expert.role}

{/* Timer for Expert */}

{expert.description}

{expert.temperature !== undefined && (
{expert.temperature}
)}
{isWorking && } {isDone && } {isError && }
{/* Tabs */} {!isPending && (
)} {/* Content Area */}
{isPending ? (
Waiting for assignment...
) : ( <> {view === 'thoughts' && (
{expert.thoughts ? ( ) : ( Initializing thought process... )} {isWorking && }
)} {view === 'output' && (
{expert.content ? ( ) : ( {isWorking ? "Formulating output..." : "No output generated."} )} {isWorking && !expert.content && }
)} )}
); }; export default ExpertCard;