import { useCallback, useEffect, useState } from "react"; import { toast } from "react-toastify"; import { agents as agentsApi } from "../api/client"; import type { Agent } from "../api/types"; import { Button, Card, EmptyState, PageHeader, Spinner } from "../components/ui"; import { AgentAvatar } from "../components/AgentAvatar"; import { AgentFormModal, ConnectModal } from "../components/AgentModals"; export function AgentsPage() { const [agents, setAgents] = useState([]); const [loading, setLoading] = useState(true); const [formOpen, setFormOpen] = useState(false); const [editing, setEditing] = useState(null); const [connectAgent, setConnectAgent] = useState(null); const [revealedKey, setRevealedKey] = useState(null); const load = useCallback(async () => { try { setAgents(await agentsApi.list()); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); const onSaved = (agent: Agent, created: boolean) => { load(); if (created && agent.api_key) { setRevealedKey(agent.api_key); setConnectAgent(agent); } }; const regenerate = async (agent: Agent) => { if (!confirm(`Regenerate the API key for "${agent.name}"? The old key stops working immediately.`)) return; try { const updated = await agentsApi.regenerateKey(agent.id); toast.success("API key regenerated"); setRevealedKey(updated.api_key ?? null); setConnectAgent(updated); load(); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed"); } }; const toggleDisabled = async (agent: Agent) => { try { await agentsApi.setDisabled(agent.id, !agent.disabled); toast.success(agent.disabled ? "Agent enabled" : "Agent disabled"); load(); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed"); } }; const remove = async (agent: Agent) => { if (!confirm(`Delete "${agent.name}"? All its requests will be permanently deleted.`)) return; try { await agentsApi.remove(agent.id); toast.success("Agent deleted"); load(); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed"); } }; return (
{ setEditing(null); setFormOpen(true); }} disabled={agents.length >= 5} > + New agent } /> {loading ? (
) : agents.length === 0 ? ( ) : (
{agents.map((a) => (

{a.name}

{a.disabled && ( DISABLED )}
{a.description &&

{a.description}

}

{a.pending_count ?? 0}/{a.max_pending_requests} pending ·{" "} {a.api_key_masked}

))}
)} setFormOpen(false)} agent={editing} onSaved={onSaved} /> {connectAgent && ( { setConnectAgent(null); setRevealedKey(null); }} agent={connectAgent} revealedKey={revealedKey} /> )}
); }