+
+ Uncovered
+
+ {formatTokens(coverage.uncoveredTokens)} tokens
+
+
+
+ Covered
+
+ {formatTokens(coverage.coveredTokens)} tokens
+
+
+
+ Messages
+
+ {coverage.coveredCount} / {coverage.totalMessages}
+
+
+
+ Chunk threshold
+
+ {formatTokens(chunkTokens)} tokens
+
+
+
+ Last extraction
+
+ {coverage.lastFoldedAt ? timeAgo(coverage.lastFoldedAt) : "—"}
+
+
+ {coverage.running && (
+
+ Status
+ extracting…
+
+ )}
+
+ >
+ );
+}
\ No newline at end of file
diff --git a/components/graph-coverage.tsx b/components/graph-coverage.tsx
deleted file mode 100644
index e49e5b9..0000000
--- a/components/graph-coverage.tsx
+++ /dev/null
@@ -1,203 +0,0 @@
-"use client";
-
-import { useCallback, useEffect, useRef, useState } from "react";
-import { usePopoverDismiss } from "@/components/popover-dismiss";
-import { ListChecksIcon, Loader2Icon } from "lucide-react";
-import { useActivity } from "@/components/activity-dock";
-import { formatTokens } from "@/components/usage-format";
-
-/**
- * The extraction-coverage control (vision-extraction-coverage.md, settled
- * 2026-09-15): the graph view's window into WHAT THE PIPELINE HAS COVERED.
- * One button in the top-right chrome opens a panel with the exact coverage
- * of every session — covered/uncovered tokens and message counts — and a
- * per-session "Extract" button: the manual answer to an aborted run, a
- * pipeline error, or a session that went dormant under the chunk budget.
- *
- * Data: GET /api/graph/coverage (uncovered is DERIVED server-side —
- * fingerprint the transcript, diff the ledger — never dual-tracked).
- * Manual runs: POST /api/graph/coverage/extract; the run then surfaces in
- * the status chips + this panel's running row, and the graph refetches when
- * it finishes (the parent's runs-empty transition). The panel polls only
- * while open — no new standing poll.
- */
-
-interface CoverageChat {
- chatId: string;
- title: string;
- updatedAt: string;
- totalMessages: number;
- coveredMessages: number;
- uncoveredMessages: number;
- coveredTokens: number;
- uncoveredTokens: number;
- running: boolean;
-}
-
-export function GraphCoverageControl({ refreshKey = 0 }: { refreshKey?: number }) {
- const [open, setOpen] = useState(false);
- // The dock's start-site nudge seam (accuracy wave, 2026-09-19) — see onExtract.
- const refreshActivity = useActivity().refresh;
- // Click anywhere outside (or Escape) closes the panel (2026-09-17) —
- // the root wraps button + panel, so the toggle itself keeps working.
- const rootRef = useRef