import { useState, useEffect, useCallback } from "react"; import { X, Trash2 } from "lucide-react"; import type { Task, AgentLogEntry } from "@kb/core"; import { useMultiAgentLogs } from "../hooks/useMultiAgentLogs"; import { AgentLogViewer } from "./AgentLogViewer"; interface TerminalModalProps { isOpen: boolean; onClose: () => void; tasks: Task[]; } interface LogEntryWithTask extends AgentLogEntry { taskId: string; } export function TerminalModal({ isOpen, onClose, tasks }: TerminalModalProps) { const [activeTaskId, setActiveTaskId] = useState(null); // Get task IDs for all in-progress tasks const inProgressTaskIds = tasks.map((t) => t.id); // Get log state for all tasks const logState = useMultiAgentLogs(inProgressTaskIds); // Set initial active task when modal opens useEffect(() => { if (isOpen && tasks.length > 0) { // If no active task or active task not in current list, set first task if (!activeTaskId || !tasks.find((t) => t.id === activeTaskId)) { setActiveTaskId(tasks[0].id); } } // Reset when modal closes if (!isOpen) { setActiveTaskId(null); } }, [isOpen, tasks, activeTaskId]); // Handle escape key to close modal useEffect(() => { if (!isOpen) return; const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); }, [isOpen, onClose]); // Handle overlay click to close const handleOverlayClick = useCallback( (e: React.MouseEvent) => { if (e.target === e.currentTarget) onClose(); }, [onClose], ); if (!isOpen) return null; // Get active task info const activeTask = tasks.find((t) => t.id === activeTaskId); const activeLogState = activeTaskId ? logState[activeTaskId] : null; return (
{/* Header with tabs and close button */}
{tasks.length === 0 ? (
No active tasks
) : ( tasks.map((task) => ( )) )}
{/* Log content area */}
{tasks.length === 0 ? (

No tasks currently in progress.

Start a task to see live logs here.

) : activeTask && activeLogState ? ( <>
{activeTask.id} {activeTask.title || activeTask.description}
) : null}
); }