'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Progress } from '@/components/ui/progress'; import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; import { Play, Pause, Square, CheckCircle, XCircle, Clock, Activity, FileText, Download, ExternalLink, Loader2 } from 'lucide-react'; interface Agent { id: string; name: string; agent_type: string; description?: string; } interface AgentExecution { id: string; agent_id: string; task_description: string; task_parameters: Record; status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'; progress_percentage: number; current_step?: string; result_data: Record; output_artifacts: string[]; error_details?: string; execution_time_ms?: number; tokens_used: number; cost_cents: number; tool_calls_count: number; started_at?: string; completed_at?: string; created_at: string; } interface AgentExecutionModalProps { isOpen: boolean; onClose: () => void; agent: Agent | null; onExecute: (agentId: string, taskDescription: string, parameters: Record) => void; execution?: AgentExecution | null; isLoading?: boolean; } export function AgentExecutionModal({ isOpen, onClose, agent, onExecute, execution, isLoading = false }: AgentExecutionModalProps) { const [step, setStep] = useState<'configure' | 'executing' | 'results'>('configure'); const [taskDescription, setTaskDescription] = useState(''); const [taskParameters, setTaskParameters] = useState('{}'); const [parametersError, setParametersError] = useState(''); useEffect(() => { if (execution) { if (execution.status === 'pending' || execution.status === 'running') { setStep('executing'); } else if (execution.status === 'completed' || execution.status === 'failed') { setStep('results'); } } }, [execution]); const validateParameters = (value: string) => { try { JSON.parse(value); setParametersError(''); return true; } catch (e) { setParametersError('Invalid JSON format'); return false; } }; const handleParametersChange = (value: string) => { setTaskParameters(value); if (value.trim()) { validateParameters(value); } else { setParametersError(''); } }; const handleExecute = () => { if (!agent || !taskDescription.trim()) return; let parameters = {}; if (taskParameters.trim()) { if (!validateParameters(taskParameters)) { return; } parameters = JSON.parse(taskParameters); } onExecute(agent.id, taskDescription, parameters); setStep('executing'); }; const handleClose = () => { setStep('configure'); setTaskDescription(''); setTaskParameters('{}'); setParametersError(''); onClose(); }; const getStatusIcon = (status: string) => { switch (status) { case 'pending': return ; case 'running': return ; case 'completed': return ; case 'failed': return ; case 'cancelled': return ; default: return ; } }; const getStatusBadge = (status: string) => { const variants = { pending: 'bg-yellow-100 text-yellow-800', running: 'bg-blue-100 text-blue-800', completed: 'bg-green-100 text-green-800', failed: 'bg-red-100 text-red-800', cancelled: 'bg-gray-100 text-gray-800', }; return ( {status.charAt(0).toUpperCase() + status.slice(1)} ); }; const formatDuration = (ms?: number) => { if (!ms) return 'N/A'; const seconds = Math.floor(ms / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); if (hours > 0) { return `${hours}h ${minutes % 60}m ${seconds % 60}s`; } else if (minutes > 0) { return `${minutes}m ${seconds % 60}s`; } else { return `${seconds}s`; } }; const formatCost = (cents: number) => { return `$${(cents / 100).toFixed(4)}`; }; const renderResultData = (data: Record) => { if (!data || Object.keys(data).length === 0) { return

No result data available

; } return (
{data.summary && (

Summary

{data.summary}

)} {data.findings && Array.isArray(data.findings) && (

Key Findings

    {data.findings.map((finding: string, index: number) => (
  • {finding}
  • ))}
)} {data.insights && Array.isArray(data.insights) && (

Insights

    {data.insights.map((insight: string, index: number) => (
  • {insight}
  • ))}
)} {data.generated_code && (

Generated Code

              {data.generated_code}
            
)} {data.metrics && (

Metrics

{Object.entries(data.metrics).map(([key, value]: [string, any]) => (
{key}: {String(value)}
))}
)} {data.sources && Array.isArray(data.sources) && (

Sources

{data.sources.map((source: string, index: number) => ( {source} ))}
)}
); }; return (
{step === 'configure' ? 'Execute Agent' : step === 'executing' ? 'Agent Execution' : 'Execution Results'} {agent && ( {agent.name} )}
{step === 'configure' && (
{agent && (

{agent.name}

{agent.description}

{agent.agent_type}
)}