import { useEffect, useState } from "react"; import { useApi } from "../hooks/useApi"; import type { Agent } from "../types"; interface Props { addToast: (msg: string, type: "success" | "error") => void; } export default function AdminPanel({ addToast }: Props) { const api = useApi(); const [agents, setAgents] = useState([]); const [newAgentId, setNewAgentId] = useState(""); const [newRole, setNewRole] = useState("agent"); const [generatedToken, setGeneratedToken] = useState(""); const [loading, setLoading] = useState(true); const loadAgents = async () => { try { const data = await api.getAgents(); setAgents(Array.isArray(data) ? data : data.agents || []); } catch (e: any) { addToast("Failed to load agents: " + e.message, "error"); } finally { setLoading(false); } }; useEffect(() => { loadAgents(); }, []); const handleCreateToken = async () => { if (!newAgentId.trim()) return; try { const data = await api.createToken(newAgentId.trim(), newRole); setGeneratedToken(data.token || JSON.stringify(data)); addToast("Token created", "success"); setNewAgentId(""); loadAgents(); } catch (e: any) { addToast("Failed: " + e.message, "error"); } }; const handleRevoke = async (tokenId: string) => { try { await api.revokeToken(tokenId); addToast("Token revoked", "success"); loadAgents(); } catch (e: any) { addToast("Failed: " + e.message, "error"); } }; if (loading) return
Loading agents...
; return (

Create Agent Token

setNewAgentId(e.target.value)} placeholder="agent-name" className="px-3 py-2 bg-[#0a0a0c] border border-[#1e2030] rounded-lg text-white text-sm focus:outline-none focus:border-[#3b82f6]" style={{ fontFamily: "var(--font-mono)" }} />
{generatedToken && (

Generated token (copy now, shown once):

{generatedToken}
)}

Agents

{agents.length === 0 ? (

No agents found

) : (
{agents.map((agent) => (
{agent.id} {agent.role}
{agent.tokens?.map((t) => ( ))}
))}
)}
); }