// @ts-nocheck import { useState, useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { ShieldAlert, Search, Trash2, Download, Brain, Fingerprint, Zap, BarChart3, Info, CheckCircle2, FileSearch, Activity, ChevronRight } from 'lucide-react'; import Sidebar from '../../components/layout/Sidebar'; import { scanTextSync } from '../../services/textService'; import type { TextResult } from '../../services/textService'; import { BarChart, Bar, XAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts'; const ForensicLab = () => { const [text, setText] = useState(""); const [result, setResult] = useState(null); const [isScanning, setIsScanning] = useState(false); const [mode, setMode] = useState<"quick" | "deep" | "forensic">("deep"); const handleScan = async () => { if (!text || text.length < 20) { alert("Minimum 20 characters required for forensic analysis."); return; } setIsScanning(true); setResult(null); try { const data = await scanTextSync(text); setResult(data); } catch (error) { console.error("Forensic scan failed:", error); alert("Analysis engine failure. Check backend logs."); } finally { setIsScanning(false); } }; const getLabelColor = (label: string, score: number | null) => { if (label === 'too_short') return 'transparent'; const s = (score || 0) / 100; // Proper Heatmap Logic: Clearer, more distinct highlighting if (label === 'AI') { return `rgba(239, 68, 68, ${0.4 + s * 0.4})`; // Red } if (label === 'LIKELY_AI') { return `rgba(249, 115, 22, ${0.3 + s * 0.4})`; // Orange } if (label === 'UNCERTAIN') { return `rgba(234, 179, 8, ${0.3 + s * 0.3})`; // Yellow/Amber } if (label === 'HUMAN') { return `rgba(34, 197, 94, ${0.2 + (1 - s) * 0.2})`; // Green } return 'transparent'; }; const getBorderColor = (label: string) => { if (label === 'AI') return 'border-[var(--accent-red)]/40'; if (label === 'LIKELY_AI') return 'border-orange-500/30'; if (label === 'UNCERTAIN') return 'border-[var(--accent-purple)]/30'; if (label === 'HUMAN') return 'border-[var(--accent-green)]/30'; return 'border-transparent'; }; const signalData = useMemo(() => { if (!result) return []; return [ { name: 'CLF1 (ChatGPT)', score: result.signals.clf1 * 100, color: '#00E5CC' }, { name: 'CLF2 (OpenAI)', score: (result.signals.clf2 || 0) * 100, color: 'var(--accent-purple)' }, { name: 'Embedding', score: result.signals.embedding * 100, color: '#6366f1' }, { name: 'GPT2 Stats', score: result.signals.gpt2_entropy * 100, color: 'var(--accent-red)' }, { name: 'Stylometric', score: result.signals.stylometric * 100, color: 'var(--text-active)' }, { name: 'Consistency', score: (result.signals.consistency || 0) * 100, color: '#06b6d4' }, { name: 'Repetition', score: (result.signals.repetition || 0) * 100, color: '#f97316' }, { name: 'Entropy', score: (result.signals.entropy_var || 0) * 100, color: '#ec4899' }, ]; }, [result]); return (
{/* Header */}
FORENSICS TEXT INTELLIGENCE LAB
{(['quick', 'deep', 'forensic'] as const).map((m) => ( ))}
V7.0-ALPHA-READY
{/* Main Input/Result Area */}

Investigation Chamber

REAL-TIME PATTERN MATCHING ENABLED
{!result && !isScanning && (