import { AGENT_RUNTIMES, type AnyAgentRuntime, findInvalidSkillRef, RUNTIME_LABELS } from "@vtit-agent-coding/shared"; import React, { useEffect, useRef, useState } from "react"; import { Link, Navigate, useNavigate, useParams } from "react-router-dom"; import { AgentIdenticon } from "../components/AgentIdenticon"; import { SkillMultiSelect } from "../components/SkillMultiSelect"; import { Button } from "../components/ui/button"; import { Input } from "../components/ui/input"; import { Label } from "../components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../components/ui/select"; import { Textarea } from "../components/ui/textarea"; import { useAgent, useUpdateAgent } from "../hooks/useAgents"; import { agentColor } from "../lib/agentIdentity"; export function AgentEditPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { agent, loading } = useAgent(id); const updateAgent = useUpdateAgent(); const [name, setName] = useState(""); const [bio, setBio] = useState(""); const [soul, setSoul] = useState(""); const [role, setRole] = useState(""); const [runtime, setRuntime] = useState("claude"); const [model, setModel] = useState(""); const [skills, setSkills] = useState([]); const [error, setError] = useState(null); const [initialized, setInitialized] = useState(false); useEffect(() => { if (agent && !initialized) { setName(agent.name ?? ""); setBio(agent.bio ?? ""); setSoul(agent.soul ?? ""); setRole(agent.role ?? ""); setRuntime(agent.runtime ?? "claude"); setModel(agent.model ?? ""); setSkills(agent.skills ?? []); setInitialized(true); } }, [agent, initialized]); if (loading) { return (
); } if (!agent) { return (

Agent not found.

); } if (agent.kind === "leader") { return ; } const previewColor = agentColor(agent.public_key || name.trim() || "preview"); async function handleSave() { if (!name.trim()) return; setError(null); const invalidSkill = findInvalidSkillRef(skills); if (invalidSkill) { setError(`Invalid skill "${invalidSkill}". Use source/repo[#ref]@skill-name format.`); return; } try { await updateAgent.mutateAsync({ id: agent!.id, body: { name: name.trim(), bio: bio.trim() || undefined, soul: soul.trim() || undefined, role: role.trim() || undefined, runtime, model: model.trim() || undefined, skills: skills.length ? skills : undefined, }, }); navigate(`/agents/${agent!.id}`); } catch (err: any) { setError(err.message); } } return (
Back to {agent.name}

Edit agent

{/* Identity */}
Identity
setName(e.target.value)} placeholder="e.g. Bolt" className="font-mono" />
setRole(e.target.value)} placeholder="e.g. backend-developer" className="font-mono" />
setBio(e.target.value)} placeholder="Short description" />