import { useState, useEffect } from 'react'; import { Search, AlertCircle, CheckCircle2, Clock, ArrowLeft } from 'lucide-react'; import { useClient } from 'hooks/useClient'; import { DashboardLayout } from '../Layout'; import { Card } from '@/components/Card'; import { MessageBubble, type ChatMessage } from 'plugins/Chat/client'; type LogMetadata = { filename: string; taskName: string; taskDirName: string; entryName: string; entryType: 'file' | 'directory'; provider: string; model: string; startedAt: string; completedAt: string | null; isError: boolean; }; type FullLog = LogMetadata & { messages: ChatMessage[]; }; const formatDate = (iso: string) => { const d = new Date(iso); return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; const ProviderBadge = ({ provider }: { provider: string }) => ( {provider} ); export const TaskLogs = () => { const client = useClient(); const [logs, setLogs] = useState([]); const [selectedFilename, setSelectedFilename] = useState(null); const [showDetail, setShowDetail] = useState(false); const [selectedLog, setSelectedLog] = useState(null); const [search, setSearch] = useState(''); const [isLoading, setIsLoading] = useState(true); useEffect(() => { client .get('/task-logs') .then((data) => { setLogs(data); setIsLoading(false); }) .catch(() => setIsLoading(false)); }, []); useEffect(() => { if (!selectedFilename) { setSelectedLog(null); return; } client .get(`/task-logs/${selectedFilename}`) .then(setSelectedLog) .catch(() => setSelectedLog(null)); }, [selectedFilename]); const filtered = search ? logs.filter((l) => { const q = search.toLowerCase(); return ( l.taskName.toLowerCase().includes(q) || l.entryName.toLowerCase().includes(q) || l.provider.toLowerCase().includes(q) ); }) : logs; return (
{/* Left panel: list */}
setSearch(ev.target.value)} className="w-full pl-8 pr-3 py-1.5 text-sm rounded-md border border-duck-dark/15 bg-white/60 focus:outline-none focus:ring-1 focus:ring-duck-teal/40" />
{isLoading && (
Loading...
)} {!isLoading && filtered.length === 0 && (
No logs found
)} {filtered.map((log) => ( ))}
{/* Right panel: log viewer */} {!selectedLog && (
Select a log to view
)} {selectedLog && ( <>
{selectedLog.taskName}
{selectedLog.entryName} · {selectedLog.model} · {formatDate(selectedLog.startedAt)} {selectedLog.completedAt && ` — ${formatDate(selectedLog.completedAt)}`}
{selectedLog.isError && ( Error )}
{selectedLog.messages.map((msg, i) => ( ))}
)}
); };