import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useAgents, useCreateAgent, useUpdateAgent, useDeleteAgent, useExecuteAgent, useTestRunAgent, useAgentRuns, useAgentVersions, useRestoreAgentVersion, useAgentTools, useSendAgentMessage, } from '@/api/automation'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { Modal } from '@/components/ui/Modal'; import { Select } from '@/components/ui/Select'; import { EmptyState } from '@/components/ui/EmptyState'; import { Skeleton } from '@/components/ui/Skeleton'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; import { useToast } from '@/components/ui/Toast'; import type { AgentDefinition } from '@/types/automation'; import { Plus, Play, TestTube, History, GitBranch, Trash2, Settings2, Bot, AlertCircle, Loader2, Brain, Activity, Clock, DollarSign, MessageCircle, Send, } from 'lucide-react'; const modeOptions = [ { value: 'reactive', label: 'Reactive' }, { value: 'proactive', label: 'Proactive' }, ]; const commonModels = [ 'gpt-4', 'gpt-4-turbo', 'gpt-3.5-turbo', 'claude-3-opus', 'claude-3-sonnet', 'claude-3-haiku', 'llama-3-70b', 'llama-3-8b', 'mistral-large', 'mixtral-8x7b', ]; function statusBadgeVariant(status: string): 'success' | 'warning' | 'secondary' { switch (status) { case 'active': return 'success'; case 'inactive': return 'warning'; default: return 'secondary'; } } function runStatusBadgeVariant(status: string): 'success' | 'warning' | 'danger' | 'info' { switch (status) { case 'completed': return 'success'; case 'running': return 'info'; case 'failed': return 'danger'; case 'cancelled': return 'warning'; default: return 'warning'; } } interface AgentFormData { name: string; description: string; model: string; system_prompt: string; tools: string[]; heartbeat_interval: number; mode: 'proactive' | 'reactive'; max_executions_per_hour: number; max_duration: number; budget_limit: number; active: boolean; } const emptyForm: AgentFormData = { name: '', description: '', model: 'gpt-4', system_prompt: '', tools: [], heartbeat_interval: 0, mode: 'reactive', max_executions_per_hour: 100, max_duration: 300, budget_limit: 0, active: true, }; function AgentForm({ initial, onSave, onCancel, isSaving, }: { initial?: AgentDefinition; onSave: (data: Partial) => void; onCancel: () => void; isSaving: boolean; }) { const { t } = useTranslation(); const { data: availableTools } = useAgentTools(); const [form, setForm] = useState(() => { if (initial) { return { name: initial.name, description: initial.description || '', model: initial.model, system_prompt: initial.system_prompt || '', tools: initial.tools || [], heartbeat_interval: initial.heartbeat_interval, mode: initial.mode, max_executions_per_hour: initial.max_executions_per_hour, max_duration: initial.max_duration, budget_limit: initial.budget_limit, active: initial.active, }; } return { ...emptyForm }; }); const updateField = (key: K, value: AgentFormData[K]) => { setForm((prev) => ({ ...prev, [key]: value })); }; const toggleTool = (toolName: string) => { setForm((prev) => { const tools = prev.tools.includes(toolName) ? prev.tools.filter((t) => t !== toolName) : [...prev.tools, toolName]; return { ...prev, tools }; }); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave({ name: form.name, description: form.description || undefined, model: form.model, system_prompt: form.system_prompt || undefined, tools: form.tools, heartbeat_interval: form.heartbeat_interval, mode: form.mode, max_executions_per_hour: form.max_executions_per_hour, max_duration: form.max_duration, budget_limit: form.budget_limit, active: form.active, }); }; return (
{/* Name & Description */}
updateField('name', e.target.value)} required className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="My Agent" />