diff --git a/src/components/AgentModal.tsx b/src/components/AgentModal.tsx index 9a0f3e4..33a0049 100644 --- a/src/components/AgentModal.tsx +++ b/src/components/AgentModal.tsx @@ -11,6 +11,8 @@ interface Props { export default function AgentModal({ agent, onClose, onUpdated }: Props) { const [name, setName] = useState(agent.name); + const [slug, setSlug] = useState(agent.slug); + const [slugError, setSlugError] = useState(""); const [capabilities, setCapabilities] = useState( agent.agent_config?.capabilities?.join(", ") || "" ); @@ -34,8 +36,14 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { setSaving(true); try { const caps = capabilities.split(",").map((c) => c.trim()).filter(Boolean); + const trimmedSlug = slug.trim().toLowerCase().replace(/[^a-z0-9_-]/g, ''); + if (!trimmedSlug) { + setSlugError("Slug не может быть пустым"); + return; + } const updated = await updateMember(agent.id, { name: name.trim(), + slug: trimmedSlug !== agent.slug ? trimmedSlug : undefined, agent_config: { capabilities: caps, labels: agentLabels, @@ -47,8 +55,12 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { }); onUpdated(updated); onClose(); - } catch (e) { - console.error(e); + } catch (e: any) { + if (e?.response?.status === 409) { + setSlugError("Этот slug уже занят"); + } else { + console.error(e); + } } finally { setSaving(false); } @@ -114,6 +126,17 @@ export default function AgentModal({ agent, onClose, onUpdated }: Props) { /> +