import { useState, useEffect } from "react"; import { Play, Square, RotateCcw } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Separator } from "@/components/ui/separator"; import { ExecutionTimeline } from "./ExecutionTimeline"; import { TokenUsageChart } from "./TokenUsageChart"; import { ResultViewer } from "./ResultViewer"; import { AgentStatusBadge } from "./AgentStatusBadge"; import { useExecutionStore } from "@/stores/executionStore"; import { useGraphStore } from "@/stores/graphStore"; import { useConfigStore } from "@/stores/configStore"; import type { AgentExecutionStatus } from "@/types/execution"; export function ExecutionPanel() { const { taskQuery, setTaskQuery, toGraphRequest, updateNodeExecutionStatus, resetExecutionStatus, nodes } = useGraphStore(); const { status, events, agentStatuses, tokenUsage, finalAnswer, totalTokens, totalTime, error, startExecution, cancelExecution, clearRun, } = useExecutionStore(); const { runnerConfig, llmProviders } = useConfigStore(); const isRunning = status === "running"; // Sync execution statuses to graph nodes for live visualization useEffect(() => { Object.entries(agentStatuses).forEach(([agentId, agentStatus]) => { updateNodeExecutionStatus(agentId, agentStatus as AgentExecutionStatus); }); }, [agentStatuses, updateNodeExecutionStatus]); // Update node token counts useEffect(() => { Object.entries(tokenUsage).forEach(([agentId, tokens]) => { updateNodeExecutionStatus(agentId, agentStatuses[agentId] as AgentExecutionStatus || "completed", undefined, tokens); }); }, [tokenUsage]); const handleRun = async () => { resetExecutionStatus(); const graphData = toGraphRequest(); const provider = llmProviders.length > 0 ? llmProviders[0] : null; await startExecution(null, graphData, taskQuery, runnerConfig, provider); }; const handleStop = () => { cancelExecution(); }; const handleClear = () => { clearRun(); resetExecutionStatus(); }; return (