import { Fragment } from "react"; import { AgentProbeUsageFreshness } from "./AgentProbeUsageFreshness"; export interface AgentSlashStatusPanelStatus { agentSessionId?: string | null; baseUrl?: string | null; contextWindow?: { usedTokens?: number | null; totalTokens?: number | null; } | null; limits?: readonly AgentSlashStatusPanelLimit[]; limitsLoading?: boolean; limitsUnavailable?: boolean; limitsResolvedEmpty?: boolean; limitsCapturedAtUnixMs?: number | null; limitsErrorMessage?: string | null; refreshFailed?: boolean; isRefreshing?: boolean; } export interface AgentSlashStatusPanelLimit { id: string; label: string; percentRemaining?: number | null; value: string; reset?: string | null; } export interface AgentSlashStatusPanelLabels { slashStatusTitle: string; slashStatusSession: string; slashStatusBaseUrl: string; slashStatusContext: string; slashStatusLimits: string; slashStatusClose: string; slashStatusContextValue: (input: { percentLeft: number; usedTokens: string; totalTokens: string; }) => string; slashStatusContextUnavailable: string; slashStatusLimitsUnavailable: string; slashStatusEmptyValue: string; slashStatusUsageJustUpdated: string; slashStatusUsageMinutesAgo: (count: number) => string; slashStatusUsageHoursAgo: (count: number) => string; slashStatusUsageUpdating: string; slashStatusUsageRefreshFailed: string; slashStatusUsageRefreshAria: string; } export function formatSlashStatusTokenCount( value: number | null | undefined ): string { if (typeof value !== "number" || !Number.isFinite(value)) { return ""; } return Math.max(0, Math.trunc(value)).toLocaleString("en-US"); } function slashStatusContextText( status: AgentSlashStatusPanelStatus | null | undefined, labels: Pick< AgentSlashStatusPanelLabels, "slashStatusContextValue" | "slashStatusContextUnavailable" > ): string { const usedTokens = status?.contextWindow?.usedTokens; const totalTokens = status?.contextWindow?.totalTokens; if ( typeof usedTokens !== "number" || !Number.isFinite(usedTokens) || typeof totalTokens !== "number" || !Number.isFinite(totalTokens) || totalTokens <= 0 ) { return labels.slashStatusContextUnavailable; } const used = Math.max(0, Math.trunc(usedTokens)); const total = Math.max(0, Math.trunc(totalTokens)); const percentLeft = Math.max( 0, Math.min(100, Math.round(((total - used) / total) * 100)) ); return labels.slashStatusContextValue({ percentLeft, usedTokens: formatSlashStatusTokenCount(used), totalTokens: formatSlashStatusTokenCount(total) }); } export function AgentSlashStatusPanel({ status, labels, onClose, onRefresh }: { status: AgentSlashStatusPanelStatus | null | undefined; labels: AgentSlashStatusPanelLabels; onClose: () => void; onRefresh?: () => void; }): React.JSX.Element { const limits = status?.limits ?? []; const agentSessionId = status?.agentSessionId?.trim() ?? ""; const showSessionDetails = agentSessionId.length > 0; return (

{labels.slashStatusTitle}

{onRefresh ? ( ) : null}
{status?.limitsErrorMessage ? (
{status.limitsErrorMessage}
) : null}
{showSessionDetails ? ( <>
{labels.slashStatusSession}:
{agentSessionId}
) : null}
{labels.slashStatusContext}:
{slashStatusContextText(status, labels)}
{limits.map((limit) => (
{limit.label}:
{typeof limit.percentRemaining === "number" && Number.isFinite(limit.percentRemaining) ? (
))} {limits.length === 0 && (status?.limitsUnavailable || status?.limitsResolvedEmpty || status?.limitsLoading) ? ( <>
{labels.slashStatusLimits}:
{status?.limitsLoading ? labels.slashStatusUsageUpdating : status?.limitsResolvedEmpty ? labels.slashStatusEmptyValue : labels.slashStatusLimitsUnavailable}
) : null}
); }