import { AlertTriangle, CheckCircle, ChevronDown, ChevronRight, Clock, Cpu, Eye, FlaskConical, GitBranch, Link2, Shield, } from 'lucide-react'; import { useState } from 'react'; const BG = { surface: 'var(--gi-bg-surface)', elevated: 'var(--gi-bg-raised)' }; const BORDER = { subtle: 'rgba(255,255,255,0.04)', muted: 'rgba(255,255,255,0.07)' }; const TEXT = { primary: 'rgba(255,255,255,0.88)', secondary: 'rgba(255,255,255,0.55)', tertiary: 'rgba(255,255,255,0.28)', muted: 'rgba(255,255,255,0.14)', }; export interface ProofEntry { id: string; sourceClass: 'llm_generated' | 'llm_summarized' | 'human_authored' | 'system_computed' | 'hybrid'; contentType: string; modelId?: string; modelProvider?: string; confidenceScore: number; reviewState: 'unreviewed' | 'approved' | 'flagged' | 'retracted'; exportSafety: 'safe' | 'pending_review' | 'restricted' | 'blocked'; generatedAt: string; reviewedBy?: string; reviewedAt?: string; reviewNote?: string; inputSources: { type: string; label: string }[]; parentProofId?: string; } const REVIEW_STATE_CFG = { unreviewed: { color: '#c8953c', bg: 'rgba(200,149,60,0.1)', icon: Clock, label: 'Unreviewed' }, approved: { color: '#6b8f71', bg: 'rgba(107,143,113,0.1)', icon: CheckCircle, label: 'Approved' }, flagged: { color: '#ec4899', bg: 'rgba(236,72,153,0.1)', icon: AlertTriangle, label: 'Flagged' }, retracted: { color: '#c45a4a', bg: 'rgba(196,90,74,0.1)', icon: AlertTriangle, label: 'Retracted', }, }; const SOURCE_CLASS_LABELS: Record = { llm_generated: 'AI Generated', llm_summarized: 'AI Summarized', human_authored: 'Human Authored', system_computed: 'System Computed', hybrid: 'Hybrid', }; const EXPORT_SAFETY_CFG: Record = { safe: { color: '#6b8f71', label: 'Export Safe' }, pending_review: { color: '#c8953c', label: 'Pending Review' }, restricted: { color: '#ec4899', label: 'Restricted' }, blocked: { color: '#c45a4a', label: 'Blocked' }, }; function ConfidenceBar({ score }: { score: number }) { const pct = Math.round(score * 100); const color = pct >= 80 ? '#6b8f71' : pct >= 60 ? '#c8953c' : '#c45a4a'; return (
{pct}%
); } interface ProofProvenancePanelProps { entries: ProofEntry[]; compact?: boolean; } export function ProofProvenancePanel({ entries, compact }: ProofProvenancePanelProps) { const [expandedId, setExpandedId] = useState(entries[0]?.id ?? null); if (compact) { const entry = entries[0]; if (!entry) return null; const reviewCfg = REVIEW_STATE_CFG[entry.reviewState]; const ReviewIcon = reviewCfg.icon; return (
Proof Chain
{reviewCfg.label} {SOURCE_CLASS_LABELS[entry.sourceClass]}
); } return (
Proof Chain Decision Receipt
Immutable provenance — source, model, confidence, reviewer, lineage
synthetic {entries.length} record{entries.length !== 1 ? 's' : ''}
{entries.map((entry) => { const isExpanded = expandedId === entry.id; const reviewCfg = REVIEW_STATE_CFG[entry.reviewState]; const ReviewIcon = reviewCfg.icon; const exportCfg = EXPORT_SAFETY_CFG[entry.exportSafety]; return (
{isExpanded && (
{[ { label: 'Review State', value: reviewCfg.label, color: reviewCfg.color }, { label: 'Export Safety', value: exportCfg.label, color: exportCfg.color }, { label: 'Source', value: SOURCE_CLASS_LABELS[entry.sourceClass], color: TEXT.secondary, }, { label: 'Generated', value: entry.generatedAt, color: TEXT.secondary }, ].map((f) => (
{f.label}
{f.value}
))}
{entry.modelProvider && (
Provider: {entry.modelProvider} · Model: {entry.modelId}
)} {entry.inputSources.length > 0 && (
Input Sources
{entry.inputSources.map((src, i) => ( {src.label} ))}
)} {entry.reviewedBy && (
Reviewed by {entry.reviewedBy} on {entry.reviewedAt} {entry.reviewNote && ( — "{entry.reviewNote}" )}
)} {entry.parentProofId && (
Derived from proof #{entry.parentProofId}
)}
)}
); })}
); }