import { useMemo } from 'react' import { useAppStore } from '@/store/appStore' import type { Evidence } from '@/lib/types' export function EvidenceDrawer() { const run = useAppStore((s) => s.runs.find((r) => r.id === s.currentRunId)) const isOpen = useAppStore((s) => s.ui.evidenceOpen) const claimId = useAppStore((s) => s.ui.selectedClaimId) const close = useAppStore((s) => s.closeEvidence) const claim = useMemo(() => run?.report?.claims.find((c) => c.id === claimId), [run, claimId]) const verdict = useMemo(() => run?.report?.verdicts.find((v) => v.claim_id === claimId), [run, claimId]) const evidences = useMemo(() => { if (!run?.report) return [] as Evidence[] const report = run.report // 1) Prefer cited evidence for this claim const citedIds = verdict?.citation_ids || [] if (citedIds.length > 0) { const cited = report.evidence.filter((e) => citedIds.includes(e.doc_id)) if (cited.length > 0) return cited } // 2) Fallback to per-claim retrieved evidence const byClaim = report.evidence_by_claim?.[claimId ?? ''] || [] if (byClaim.length > 0) return byClaim // 3) Final fallback: top-scored global evidence const sorted = [...report.evidence].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)) return sorted.slice(0, 5) }, [run, verdict, claimId]) if (!isOpen) return null return (

Evidence & Rationale

{claim && (
Claim
{claim.text}
)}
Top Evidence
    {evidences.map((e, idx) => (
  • {e.source || e.doc_id} • score {(e.score ?? 0).toFixed(2)}
    {e.snippet}
    {e.metadata && (
    {JSON.stringify(e.metadata, null, 2)}
    )}
  • ))} {evidences.length === 0 &&
  • No evidence
  • }
{verdict?.rationale && (
Model Rationale
{verdict.rationale}
)}
) }