import { useEffect, useRef } from 'react'; import { useFlowStore } from '../../store/useFlowStore'; import { Icon } from '../shared/Icon'; const LEVEL_COLORS: Record = { info: '#22c55e', warn: '#eab308', error: '#ef4444', debug: '#64748b', }; function isHighlightEntry(message: string): boolean { const keywords = ['request', 'matching', 'confirmation', 'assigned', 'accepted']; const lower = message.toLowerCase(); return keywords.some((k) => lower.includes(k)); } function exportLogs(logs: { timestamp: Date; level: string; source: string; message: string }[]) { const text = logs .map((l) => `[${l.timestamp.toLocaleTimeString('en-US', { hour12: false })}] [${l.level.toUpperCase()}] ${l.source}: ${l.message}`) .join('\n'); const blob = new Blob([text], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `system-logs-${Date.now()}.txt`; a.click(); URL.revokeObjectURL(url); } export function SystemLogsTerminal() { const logs = useFlowStore((s) => s.logs); const clearLogs = useFlowStore((s) => s.clearLogs); const toggleLogsPanel = useFlowStore((s) => s.toggleLogsPanel); const scrollRef = useRef(null); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [logs]); return (
{/* Header */}

System Logs

{/* macOS window dots */}
{/* Log entries */}
{logs.length === 0 ? (
Waiting for events...
) : ( logs.map((log, index) => { const isLast = index === logs.length - 1; const isHighlight = isHighlightEntry(log.message); return (
{log.timestamp.toLocaleTimeString('en-US', { hour12: false })} {log.source} {log.message}
); }) )}
); }