import { useEffect, useState } from "react"; import { apiFetch } from "../lib/api"; interface TokenMetadata { id: string; label: string; token_prefix: string; permissions: string[]; created_at: string; last_used_at: string | null; expires_at: string | null; revoked_at: string | null; } export default function AccessTokens({ brainId }: { brainId: string }) { const [tokens, setTokens] = useState([]); const [label, setLabel] = useState(""); const [write, setWrite] = useState(false); const [issued, setIssued] = useState(null); const [error, setError] = useState(null); async function refresh() { const result = await apiFetch<{ tokens: TokenMetadata[] }>(`/system/access-tokens?brain_id=${encodeURIComponent(brainId)}`); setTokens(result.tokens); } useEffect(() => { setTokens([]); setIssued(null); void refresh().catch((e: Error) => setError(e.message)); }, [brainId]); async function create(event: React.FormEvent) { event.preventDefault(); setError(null); setIssued(null); try { const result = await apiFetch("/system/access-tokens", { method: "POST", body: JSON.stringify({ brain_id: brainId, label, permissions: write ? ["memory:read", "memory:write"] : ["memory:read"] }), }); setIssued(result.token); setLabel(""); await refresh(); } catch (reason) { setError(reason instanceof Error ? reason.message : "Unable to create token"); } } async function revoke(id: string) { try { await apiFetch(`/system/access-tokens/${encodeURIComponent(id)}`, { method: "DELETE" }); setIssued(null); await refresh(); } catch (reason) { setError(reason instanceof Error ? reason.message : "Unable to revoke token"); } } return

Access tokens

void create(e)} className="flex flex-wrap gap-3">
{issued ?

This token is shown once. Copy it now.

{issued}
: null} {error ?

{error}

: null}
{["Label", "Prefix", "Permissions", "Created", "Last used", "Expiry", "Status", "Action"].map((h) => )} {tokens.map((token) => )}
{h}
{token.label}{token.token_prefix}{token.permissions.join(", ")}{token.created_at}{token.last_used_at ?? "Never"}{token.expires_at ?? "None"}{token.revoked_at ? "Revoked" : token.expires_at && Date.parse(token.expires_at) <= Date.now() ? "Expired" : "Active"}
; }