import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Database, Eye, Download, GitBranch, Play, Calendar, Hash, FileText, Settings, Network, Loader, } from "lucide-react"; import { KnowledgeGraph, WindowKnowledgeGraph, Entity, Relation, } from "@/types"; import { formatRelativeTime } from "@/lib/utils"; import { SimpleGraphVisualization } from "../../features/workspace/SimpleGraphVisualization"; import { api } from "@/lib/api"; import { useAgentGraph } from "@/context/AgentGraphContext"; interface KnowledgeGraphModalProps { data: { knowledgeGraph: KnowledgeGraph; windowGraphs?: WindowKnowledgeGraph[]; }; onClose: () => void; } interface GraphData { entities: Entity[]; relations: Relation[]; metadata?: Record; } export function KnowledgeGraphModal({ data, onClose, }: KnowledgeGraphModalProps) { const { knowledgeGraph, windowGraphs = [] } = data; const [graphData, setGraphData] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const { actions } = useAgentGraph(); // Removed visualization type toggle - only using simple visualization in modal // Fetch the actual graph data when component mounts useEffect(() => { const fetchGraphData = async () => { if (!knowledgeGraph.id) return; setIsLoading(true); setError(null); try { const data = await api.knowledgeGraphs.getData(knowledgeGraph.id); setGraphData(data); } catch (err) { console.error("Failed to fetch knowledge graph data:", err); setError( err instanceof Error ? err.message : "Failed to load graph data" ); } finally { setIsLoading(false); } }; fetchGraphData(); }, [knowledgeGraph.id]); const getStatusColor = (status: KnowledgeGraph["status"]) => { switch (status) { case "created": return "bg-green-500/10 text-green-700 border-green-200"; case "enriched": return "bg-blue-500/10 text-blue-700 border-blue-200"; case "perturbed": return "bg-purple-500/10 text-purple-700 border-purple-200"; case "analyzed": return "bg-orange-500/10 text-orange-700 border-orange-200"; case "causal": return "bg-red-500/10 text-red-700 border-red-200"; default: return "bg-yellow-500/10 text-yellow-700 border-yellow-200"; } }; const getPipelineStageStatus = (status?: string) => { switch (status) { case "completed": return "bg-green-500/10 text-green-700"; case "running": return "bg-blue-500/10 text-blue-700"; case "error": return "bg-red-500/10 text-red-700"; default: return "bg-gray-500/10 text-gray-700"; } }; const formatDisplayName = (filename?: string, id?: string) => { if (!filename) return `Knowledge Graph ${id?.slice(0, 8)}`; // Strip the _knowledge_graph_{timestamp}_{uuid}.json part if present if (filename.includes("_knowledge_graph_")) { return filename.split("_knowledge_graph_")[0]; } return filename; }; return ( Details Visualization
{/* Header */}

{formatDisplayName( knowledgeGraph.filename, knowledgeGraph.id )}

Created {formatRelativeTime(knowledgeGraph.created_at)}

{knowledgeGraph.status} {knowledgeGraph.is_final && ( Final )}
{/* Knowledge Graph Information */} Graph Information

Entities

{knowledgeGraph.entity_count?.toLocaleString() || "N/A"}

Relations

{knowledgeGraph.relation_count?.toLocaleString() || "N/A"}

Created

{new Date(knowledgeGraph.created_at).toLocaleDateString()}

Status

{knowledgeGraph.status}

{knowledgeGraph.window_total && (

Windows

{knowledgeGraph.window_total} total

)} {knowledgeGraph.processing_run_id && (

Run ID

{knowledgeGraph.processing_run_id.slice(0, 8)}

)}
{/* Pipeline Status */} Pipeline Status
Prompt Reconstruction
{knowledgeGraph.is_enriched ? "Completed" : "Pending"}
Perturbation Testing
{knowledgeGraph.is_perturbed ? "Completed" : "Pending"}
Causal Analysis
{knowledgeGraph.is_analyzed ? "Completed" : "Pending"}
{/* Window Agent Graphs */} {windowGraphs.length > 0 && ( Window Agent Graphs ({windowGraphs.length})
{windowGraphs.map((windowKg, index) => { const entityCount = windowKg.entity_count || 0; const relationCount = windowKg.relation_count || 0; return (
#{index + 1}

Characters{" "} {windowKg.window_start_char?.toLocaleString()} -{" "} {windowKg.window_end_char?.toLocaleString()}

{entityCount} entities {relationCount} relations Window {index + 1}
); })}
)} {/* Actions */}
{knowledgeGraph.processing_run_id && windowGraphs.length > 1 && ( )}
{isLoading ? (

Loading graph data...

) : error ? (
Error: {error}
) : (
{/* Simple Visualization */}

Agent Graph Visualization

For advanced interactive visualization, use the full-page visualizer

)}
); }