import { useState } from 'react'; import type React from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; import { Bot, Workflow } from 'lucide-react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { AgentKind } from '@/app/infra/entities/api'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import EmojiPicker from '@/components/ui/emoji-picker'; export default function AgentCreateContent({ onCreated, }: { onCreated: (agentId: string) => void; }) { const { t } = useTranslation(); const [kind, setKind] = useState('agent'); const formSchema = z.object({ name: z.string().min(1, { message: t('agents.nameRequired') }), description: z.string().optional(), emoji: z.string().optional(), }); type FormValues = z.infer; const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: '', description: '', emoji: '🤖', }, }); function handleKindChange(nextKind: AgentKind) { setKind(nextKind); if (!form.getValues('emoji')) { form.setValue('emoji', nextKind === 'pipeline' ? '⚙️' : '🤖'); } } function handleSubmit(values: FormValues) { httpClient .createAgent({ kind, name: values.name, description: values.description ?? '', emoji: values.emoji || (kind === 'pipeline' ? '⚙️' : '🤖'), }) .then((resp) => { toast.success(t('agents.createSuccess')); onCreated(resp.uuid); }) .catch((err) => { toast.error(t('agents.createError') + err.msg); }); } const typeOptions: Array<{ kind: AgentKind; icon: React.ElementType; title: string; description: string; badge: string; }> = [ { kind: 'agent', icon: Bot, title: t('agents.agentOrchestration'), description: t('agents.agentOrchestrationDescription'), badge: t('agents.allEvents'), }, { kind: 'pipeline', icon: Workflow, title: t('agents.pipelineType'), description: t('agents.pipelineTypeDescription'), badge: t('agents.messageEventsOnly'), }, ]; return (

{t('agents.create')}

{typeOptions.map((option) => { const Icon = option.icon; const selected = kind === option.kind; return ( ); })}
{t('agents.basicInfo')} {t('agents.basicInfoDescription')}
( {t('common.name')} * )} /> ( {t('common.icon')} )} />
( {t('common.description')} )} />
); }