/** * dashboard-client/src/components/RepoDetailModal.tsx — repo drill-down. * * Full detail from an /api/index row: token breakdown (kept/dropped), model * info, context window, dedup rate, reasoning flag. Click backdrop to close. */ import type React from "react"; import { useEffect } from "react"; import type { IndexesIndexRow } from "@contracts"; export interface RepoDetailModalProps { repo: IndexesIndexRow; onClose: () => void; } function fmt(n: number): string { if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`; if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`; return String(n); } /** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */ function fmtBytesTop(b: number): string { if (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`; if (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`; return `${b} B`; } function formatTs(ts: number | null): string { if (ts === null || ts === undefined) return "never"; try { return new Date(ts).toLocaleString(); } catch { return String(ts); } } export function RepoDetailModal({ repo, onClose, }: RepoDetailModalProps): React.ReactElement { // Close on Escape key. useEffect(() => { const handler = (e: KeyboardEvent): void => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, [onClose]); return (
e.stopPropagation()} >

{repo.displayName}

{repo.repoRoot}

Checkpoints {repo.checkpointCount.toLocaleString()}
Sessions {repo.sessions.toLocaleString()}
Tokens saved {fmt(repo.tokensSaved)}
Tokens kept {fmt(repo.tokensKept)}
Tokens dropped {fmt(repo.tokensDropped)}
Dedup rate

Model

Provider
{repo.providerName ?? "—"}
Model
{repo.modelName ?? "—"}
Input rate
{repo.inputRate !== null ? `${repo.inputRate} tok/s` : "—"}
Output rate
{repo.outputRate !== null ? `${repo.outputRate} tok/s` : "—"}
Context window
{repo.contextWindow !== null ? fmt(repo.contextWindow) : "—"}
Max tokens
{repo.maxTokens !== null ? fmt(repo.maxTokens) : "—"}
Reasoning
{repo.reasoning === null ? "—" : repo.reasoning ? "on" : "off"}

Activity

Last compacted
{formatTs(repo.lastCompactedAt)}
Last seen
{formatTs(repo.lastSeen)}
Compressed-Original
{fmtBytesTop(repo.compressedOriginalBytes)}
); }