import { useState, useEffect, Fragment } from "react"; import type { CorpusStats } from "./types"; import { api, checkConnection } from "./api"; import TrainingPanel from "./components/TrainingPanel"; import EngineSetup from "./components/EngineSetup"; import SemanticSearch from "./components/SemanticSearch"; import TextCompare from "./components/TextCompare"; import SimilarWords from "./components/SimilarWords"; import ContextAnalysis from "./components/ContextAnalysis"; import AnomalyPanel from "./components/AnomalyPanel"; import Word2VecPanel from "./components/Word2VecPanel"; import DatasetPanel from "./components/DatasetPanel"; import MetricCard from "./components/MetricCard"; import "./styles.css"; type NavGroup = "data" | "training"; type TrainingTab = "model" | "w2v"; type AnalysisTab = "context" | "anomalies"; const STEPS: { id: NavGroup; label: string }[] = [ { id: "data", label: "Data & Setup" }, { id: "training", label: "Training" }, ]; const TRAINING_TABS: { id: TrainingTab; label: string }[] = [ { id: "model", label: "Fine-tune Model" }, { id: "w2v", label: "Word2Vec Baseline" }, ]; const ANALYSIS_TABS: { id: AnalysisTab; label: string }[] = [ { id: "context", label: "Context" }, { id: "anomalies", label: "Anomalies" }, ]; export default function App() { const [group, setGroup] = useState("data"); const [trainingTab, setTrainingTab] = useState("w2v"); const [analysisTab, setAnalysisTab] = useState("context"); const [stats, setStats] = useState(null); const [showManualSetup, setShowManualSetup] = useState(false); const [serverError, setServerError] = useState(null); const [w2vReady, setW2vReady] = useState(false); const [w2vInfo, setW2vInfo] = useState<{ vocab_size: number; sentences: number; vector_size: number } | null>(null); useEffect(() => { checkConnection().then((err) => { setServerError(err); if (!err) { api.getStats().then(setStats).catch(() => {}); api.w2vStatus().then(res => { if (res.ready) { setW2vReady(true); setW2vInfo({ vocab_size: res.vocab_size!, sentences: res.sentences!, vector_size: res.vector_size! }); setGroup("training"); } }).catch(() => {}); } }); const interval = setInterval(() => { checkConnection().then(setServerError); }, 15000); return () => clearInterval(interval); }, []); function handleW2vReady(ready: boolean, info?: { vocab_size: number; sentences: number; vector_size: number }) { setW2vReady(ready); setW2vInfo(ready && info ? info : null); } return (

Contextual Similarity Engine

{stats && (
{stats.model_name} {stats.total_documents} docs {stats.total_chunks} chunks
)}
{serverError && (
Server unavailable: {serverError}
)} {/* Progress Stepper — hidden once training is complete */} {!w2vReady && ( )} {/* Content */}
{group === "data" && ( <> setGroup("training")} /> {showManualSetup && } )} {group === "training" && !w2vReady && ( <> {trainingTab === "model" && } {trainingTab === "w2v" && } )} {group === "training" && w2vReady && w2vInfo && ( <>

Trained Corpus

Word2Vec model is trained and persisted. Use the tools below to explore similarity.

{analysisTab === "context" && ( <> )} {analysisTab === "anomalies" && } )}
); }