import React, { useEffect, useState } from 'react'; import { Activity, Cpu, Gauge, KeyRound, RefreshCw } from 'lucide-react'; import { apiData } from '../services/api'; /** Dev & Account: credits, usage, capabilities (tier/engine/queue), jobs. */ const AccountPanel: React.FC = () => { const [credits, setCredits] = useState(null); const [usage, setUsage] = useState(null); const [caps, setCaps] = useState(null); const [jobs, setJobs] = useState(null); const load = () => { apiData('/api/account/credits').then(setCredits).catch(() => undefined); apiData('/api/account/usage').then(setUsage).catch(() => undefined); apiData('/api/account/capabilities').then(setCaps).catch(() => undefined); apiData('/api/jobs').then(setJobs).catch(() => undefined); }; useEffect(() => { load(); const t = setInterval(load, 4000); return () => clearInterval(t); }, []); const Card: React.FC<{ title: string; icon: any; children: React.ReactNode }> = ({ title, icon: Icon, children }) => (
{title}
{children}
); return (
{credits && ( <>
{credits.credits}
{credits.budget_scope} · via {credits.auth_via}
)}
{caps && (
perception{caps.perception_tier}
engine{caps.engine}
nova key{caps.nova_configured ? '✓' : '—'}
)}
{caps?.job_queue && (
active{caps.job_queue.active}
max workers{caps.job_queue.max_workers}
)}
{usage?.usage && Object.keys(usage.usage).length > 0 ? (
{Object.entries(usage.usage).map(([k, v]) => (
{k}{String(v)}
))}
) :

No usage yet.

}
{jobs?.jobs?.length ? (
{jobs.jobs.slice(0, 8).map((j: any) => (
{j.kind} {j.status}
))}
) :

No jobs yet.

}
); }; export default AccountPanel;