import React, { useState, useEffect, useRef } from "react"; import { Routes, Route, NavLink, useLocation } from "react-router-dom"; import { Home, Plus, Clock, Cpu, Bot, Shield, Link, Plug, ChevronLeft, ChevronRight, Sun, Moon, Terminal, FileCode, } from "lucide-react"; import { useSettingsStore } from "@/stores/settingsStore"; import { getAppVersionCmd, loadAiProvidersCmd, testProviderConnectionCmd, shutdownPortForwardsCmd } from "@/lib/tauriCommands"; import Dashboard from "@/pages/Dashboard"; import NewIssue from "@/pages/NewIssue"; import LogUpload from "@/pages/LogUpload"; import Triage from "@/pages/Triage"; import Resolution from "@/pages/Resolution"; import RCA from "@/pages/RCA"; import Postmortem from "@/pages/Postmortem"; import History from "@/pages/History"; import AIProviders from "@/pages/Settings/AIProviders"; import Ollama from "@/pages/Settings/Ollama"; import Integrations from "@/pages/Settings/Integrations"; import MCPServers from "@/pages/Settings/MCPServers"; import Security from "@/pages/Settings/Security"; import ShellExecution from "@/pages/Settings/ShellExecution"; import KubeconfigManager from "@/pages/Settings/KubeconfigManager"; import { ShellApprovalModal } from "@/components/ShellApprovalModal"; const navItems = [ { to: "/", icon: Home, label: "Dashboard" }, { to: "/new-issue", icon: Plus, label: "New Issue" }, { to: "/history", icon: Clock, label: "History" }, ]; const settingsItems = [ { to: "/settings/providers", icon: Cpu, label: "AI Providers" }, { to: "/settings/ollama", icon: Bot, label: "Ollama" }, { to: "/settings/shell", icon: Terminal, label: "Shell Execution" }, { to: "/settings/kubeconfig", icon: FileCode, label: "Kubeconfig" }, { to: "/settings/integrations", icon: Link, label: "Integrations" }, { to: "/settings/mcp", icon: Plug, label: "MCP Servers" }, { to: "/settings/security", icon: Shield, label: "Security" }, ]; export default function App() { const [collapsed, setCollapsed] = useState(false); const [appVersion, setAppVersion] = useState(""); const { theme, setTheme, setProviders, getActiveProvider } = useSettingsStore(); const cleanupDone = useRef(false); void useLocation(); useEffect(() => { getAppVersionCmd().then(setAppVersion).catch(() => {}); }, []); // Cleanup port forwards on app unmount useEffect(() => { return () => { if (!cleanupDone.current) { cleanupDone.current = true; void shutdownPortForwardsCmd().catch((err) => { console.error("Failed to shutdown port forwards:", err); }); } }; }, []); // Load providers and auto-test active provider on startup useEffect(() => { const initializeProviders = async () => { try { const providers = await loadAiProvidersCmd(); setProviders(providers); // Auto-test the active provider const activeProvider = getActiveProvider(); if (activeProvider) { console.log("Auto-testing active AI provider:", activeProvider.name); try { await testProviderConnectionCmd(activeProvider); console.log("✓ Active provider connection verified:", activeProvider.name); } catch (err) { console.warn("⚠ Active provider connection test failed:", activeProvider.name, err); } } } catch (err) { console.error("Failed to initialize AI providers:", err); } }; initializeProviders(); }, [setProviders, getActiveProvider]); return (
{/* Sidebar */} {/* Main content */}
} /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } />
); }