import { Link, NavLink, Outlet, useLocation } from "react-router-dom"; import type { Session } from "../api/sessions"; import { useTheme } from "../hooks/use-theme"; import { openSession } from "../utils/open-session"; import { useAuth } from "../state/auth"; import { useSessions } from "../state/sessions"; import { useMobileViewport } from "../hooks/use-mobile-viewport"; import { EventProvider } from "../state/events"; import { ToastProvider } from "../state/toast"; import { NotificationProvider } from "../state/notifications"; import { EventToastBridge } from "./features/notification/event-toast-bridge"; import { NotificationCenter } from "./features/notification/notification-center"; import { Icon } from "./icon"; import { MobileNav } from "./features/mobile/mobile-nav"; import { StartToolFAB } from "./features/tool/start-tool-fab"; import type { IconName } from "../utils/icons"; const NAV_ITEMS: { to: string; label: string; icon: IconName; badge?: "sessions"; }[] = [ { to: "/", label: "Home", icon: "dashboard" }, { to: "/projects", label: "Projects", icon: "projects" }, { to: "/workspaces", label: "Workspaces", icon: "folder" }, { to: "/sessions", label: "Sessions", icon: "terminal", badge: "sessions" }, { to: "/tool-workshop", label: "Tool Workshop", icon: "settings" }, { to: "/config-profiles", label: "Config Profiles", icon: "folder" }, { to: "/settings", label: "Settings", icon: "settings" }, ]; const SessionItem = ({ session }: { session: Session }) => { const isRunning = session.status === "running"; const contextName = session.workspace_name || session.repository_name; const tooltipParts = [ session.display_name, session.tool_type_name, session.project_name, ]; if (contextName) tooltipParts.push(contextName); tooltipParts.push(`(${session.status})`); const handleClick = (event: React.MouseEvent) => { event.preventDefault(); openSession(session); }; return ( {contextName && ( {contextName} )} {session.display_name} {session.tool_type_name} · {session.project_name} ); }; export const AppShell = () => { useTheme(); const { user, logout } = useAuth(); const { sessions } = useSessions(); const location = useLocation(); const isMobile = useMobileViewport(); const isMobileTerminal = isMobile && location.pathname.includes("/instances/") && location.pathname.includes("/terminal"); if (isMobileTerminal) { return ( ); } return ( Headquarter {user?.name ?? "User"} { void logout(); }} type="button" > Logout {!isMobile && ( )} {isMobile && ( s.status === "running").length } /> )} ); };