import React, { useState } from 'react'; import { Zap, ShieldAlert, RefreshCw, Trash2, Activity, Database, Layers, ShieldCheck, Search, Loader2, ChevronRight, AlertTriangle, CheckCircle2, Network } from 'lucide-react'; import { useQuery, useMutation } from '@tanstack/react-query'; import { apiClient } from '../../utils/apiClient'; import { Card } from '../../components/ui/Card'; import { Button } from '../../components/ui/Button'; import { Badge } from '../../components/ui/Badge'; import { AnimatedPage } from '../../components/ui/AnimatedPage'; import { motion, AnimatePresence } from 'framer-motion'; const GraphDebuggerPage: React.FC = () => { const [healingId, setHealingId] = useState(''); const { data: audit, isLoading, refetch } = useQuery({ queryKey: ['graph-audit'], queryFn: () => apiClient('/api/v1/graph/debugger/'), }); const cleanupMutation = useMutation({ mutationFn: () => apiClient('/api/v1/graph/debugger/', { method: 'POST', body: JSON.stringify({ action: 'cleanup' }) }), onSuccess: () => refetch() }); const healMutation = useMutation({ mutationFn: (mediaId: string) => apiClient('/api/v1/graph/debugger/', { method: 'POST', body: JSON.stringify({ action: 'heal', media_id: mediaId }) }), onSuccess: () => { setHealingId(''); refetch(); } }); if (isLoading) return (

Auditing Knowledge Graph...

); return (
{/* Header */}
Lore Consistency Protocol

GRAPH HEALER

Diagnostic et résolution des conflits de lore dans la base Neo4j.

{/* Top Stats Dashboard */}

Isolated Nodes

{audit.isolated_nodes} Entities

Nœuds sans aucune relation sémantique ou temporelle.

Lore Conflicts

{audit.temporal_conflicts} Detected

Contradictions temporelles (ex: suites antérieures à l'original).

Orphan Entities

{audit.orphan_entities} Entities

Entités extraites non rattachées à un média parent.

{/* Actions & Healing */}

Auto-Heal

Lancer un cycle de nettoyage global pour supprimer les bruits d'extraction et les contradictions logiques triviales.

Manual Healing

setHealingId(e.target.value)} placeholder="Media ID (ex: anime-123)" className="w-full bg-black/40 border-2 border-white/5 rounded-2xl px-6 py-4 text-sm font-bold focus:border-purple-500 outline-none transition-all" />
{/* Conflicts List */}

Critical Conflicts

TOP 5
{audit.details && audit.details.length > 0 ? (
{audit.details.map((conflict: any, i: number) => (
{conflict.t1} {conflict.y1}
CONTRA-SEQUEL
{conflict.t2} {conflict.y2}
))}
) : (

No critical conflicts

)}
); }; export default GraphDebuggerPage;