"use client" import { useState } from "react" import { cn } from "@/lib/utils" import { Tooltip } from "@/components/tooltip" interface PhaseProgressProps { summary: { total: number ingested: number indexed: number searched: number answered: number evaluated: number indexingEpisodes?: { total: number completed: number failed: number } } } const phases = [ { key: "ingested", label: "Ingest" }, { key: "indexed", label: "Index" }, { key: "searched", label: "Search" }, { key: "answered", label: "Answer" }, { key: "evaluated", label: "Evaluate" }, ] as const export function PhaseProgress({ summary }: PhaseProgressProps) { const [lockedEpisodes, setLockedEpisodes] = useState(false) const [isHovering, setIsHovering] = useState(false) const [justClicked, setJustClicked] = useState(false) return (

Pipeline Progress

{phases.map((phase) => { const count = summary[phase.key] const progress = (count / summary.total) * 100 const isComplete = count === summary.total const isInProgress = count > 0 && count < summary.total const isPending = count === 0 const episodes = summary.indexingEpisodes const canToggleEpisodes = phase.key === "indexed" && episodes && episodes.total > 0 && !isComplete const shouldPreview = isHovering && !justClicked const isShowingEpisodes = canToggleEpisodes && (shouldPreview ? !lockedEpisodes : lockedEpisodes) const displayLabel = isShowingEpisodes ? "Episodes Indexed" : phase.label const displayCount = isShowingEpisodes ? episodes.completed : count const displayTotal = isShowingEpisodes ? episodes.total : summary.total const displayProgress = isShowingEpisodes ? (episodes.completed / episodes.total) * 100 : progress if (canToggleEpisodes) { const content = (
setIsHovering(true)} onMouseLeave={() => { setIsHovering(false) setJustClicked(false) }} onClick={() => { setLockedEpisodes(!lockedEpisodes) setJustClicked(true) }} >
{displayLabel} {displayCount}/{displayTotal} {isShowingEpisodes && episodes.failed > 0 && ( ({episodes.failed} failed) )}
) return ( {content} ) } return (
{phase.label} {count}/{summary.total}
) })}
) }