/** * dashboard-client/src/components/RepoAllSessionsCard.tsx — Repo (all sessions) card. * * 7 fields: Checkpoints, Original, Kept, Freed, Sessions, Collapsed, Storage Dedup. * Plus a compression meter bar (green ≥90%, yellow ≥60%, red <60%). * * NOTE: storageDedupRate, compressionPct, dedupPct are 0–1 fractions * at runtime (despite contract saying 0–100). */ import type React from "react"; import { fmtPctFromFraction } from "../utils/format"; import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card"; export interface RepoAllSessionsCardProps { checkpointCount: number; /** Original tokens dropped (repo-level). */ tokensIn: number; /** Kept summary tokens (repo-level). */ tokensOut: number; /** Tokens freed (repo-level). */ tokensFreed: number; /** Number of sessions. */ sessionCount: number; /** Duplicate chunks collapsed (repo-level). */ dedupCollapsed: number; /** Storage dedup rate — 0–1 fraction. */ storageDedupRate: number; /** Repo compression ratio — 0–1 fraction. */ compressionPct: number; /** Repo dedup contribution — 0–1 fraction. */ dedupPct: number; } function compressClass(sp: number): string { if (sp >= 0.9) return "meter-green"; if (sp >= 0.6) return "meter-yellow"; return "meter-red"; } function StatRow({ label, value, }: { label: string; value: string | number; }): React.ReactElement { return (
{label} {value}
); } export function RepoAllSessionsCard( props: RepoAllSessionsCardProps, ): React.ReactElement { const sp = props.compressionPct; const barCls = compressClass(sp); const barWidth = Math.max(sp * 100, 0.5); const compressSub = `${fmtPctFromFraction(sp)} tokens saved · dedup: ${fmtPctFromFraction(props.dedupPct)}`; return ( Repo (all sessions)
{compressSub}
); }