import { Navigate, Outlet, Route, Routes, useLocation, useParams } from "@/lib/router"; import { VOCAB } from "@paperclipai/branding"; import { useQuery } from "@tanstack/react-query"; import { lazy, Suspense } from "react"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Layout } from "./components/Layout"; import { OnboardingWizard } from "./components/OnboardingWizard"; import { authApi } from "./api/auth"; import { healthApi } from "./api/health"; import { queryKeys } from "./lib/queryKeys"; import { useCompany } from "./context/CompanyContext"; import { useDialog } from "./context/DialogContext"; import { loadLastInboxTab } from "./lib/inbox"; import { shouldRedirectCompanylessRouteToOnboarding } from "./lib/onboarding-route"; const Dashboard = lazy(() => import("./pages/Dashboard").then(m => ({ default: m.Dashboard }))); const Companies = lazy(() => import("./pages/Companies").then(m => ({ default: m.Companies }))); const Agents = lazy(() => import("./pages/Agents").then(m => ({ default: m.Agents }))); const AgentDetail = lazy(() => import("./pages/AgentDetail").then(m => ({ default: m.AgentDetail }))); const Projects = lazy(() => import("./pages/Projects").then(m => ({ default: m.Projects }))); const ProjectDetail = lazy(() => import("./pages/ProjectDetail").then(m => ({ default: m.ProjectDetail }))); const Issues = lazy(() => import("./pages/Issues").then(m => ({ default: m.Issues }))); const IssueDetail = lazy(() => import("./pages/IssueDetail").then(m => ({ default: m.IssueDetail }))); const Routines = lazy(() => import("./pages/Routines").then(m => ({ default: m.Routines }))); const RoutineDetail = lazy(() => import("./pages/RoutineDetail").then(m => ({ default: m.RoutineDetail }))); const ExecutionWorkspaceDetail = lazy(() => import("./pages/ExecutionWorkspaceDetail").then(m => ({ default: m.ExecutionWorkspaceDetail }))); const Goals = lazy(() => import("./pages/Goals").then(m => ({ default: m.Goals }))); const GoalDetail = lazy(() => import("./pages/GoalDetail").then(m => ({ default: m.GoalDetail }))); const Approvals = lazy(() => import("./pages/Approvals").then(m => ({ default: m.Approvals }))); const ApprovalDetail = lazy(() => import("./pages/ApprovalDetail").then(m => ({ default: m.ApprovalDetail }))); const Costs = lazy(() => import("./pages/Costs").then(m => ({ default: m.Costs }))); const Activity = lazy(() => import("./pages/Activity").then(m => ({ default: m.Activity }))); const Inbox = lazy(() => import("./pages/Inbox").then(m => ({ default: m.Inbox }))); const CompanySettings = lazy(() => import("./pages/CompanySettings").then(m => ({ default: m.CompanySettings }))); const CompanySkills = lazy(() => import("./pages/CompanySkills").then(m => ({ default: m.CompanySkills }))); const CompanyExport = lazy(() => import("./pages/CompanyExport").then(m => ({ default: m.CompanyExport }))); const CompanyImport = lazy(() => import("./pages/CompanyImport").then(m => ({ default: m.CompanyImport }))); const DesignGuide = lazy(() => import("./pages/DesignGuide").then(m => ({ default: m.DesignGuide }))); const InstanceGeneralSettings = lazy(() => import("./pages/InstanceGeneralSettings").then(m => ({ default: m.InstanceGeneralSettings }))); const InstanceSettings = lazy(() => import("./pages/InstanceSettings").then(m => ({ default: m.InstanceSettings }))); const InstanceExperimentalSettings = lazy(() => import("./pages/InstanceExperimentalSettings").then(m => ({ default: m.InstanceExperimentalSettings }))); const PluginManager = lazy(() => import("./pages/PluginManager").then(m => ({ default: m.PluginManager }))); const PluginSettings = lazy(() => import("./pages/PluginSettings").then(m => ({ default: m.PluginSettings }))); const PluginPage = lazy(() => import("./pages/PluginPage").then(m => ({ default: m.PluginPage }))); const RunTranscriptUxLab = lazy(() => import("./pages/RunTranscriptUxLab").then(m => ({ default: m.RunTranscriptUxLab }))); const OrgChart = lazy(() => import("./pages/OrgChart").then(m => ({ default: m.OrgChart }))); const NewAgent = lazy(() => import("./pages/NewAgent").then(m => ({ default: m.NewAgent }))); const AuthPage = lazy(() => import("./pages/Auth").then(m => ({ default: m.AuthPage }))); const BoardClaimPage = lazy(() => import("./pages/BoardClaim").then(m => ({ default: m.BoardClaimPage }))); const CliAuthPage = lazy(() => import("./pages/CliAuth").then(m => ({ default: m.CliAuthPage }))); const InviteLandingPage = lazy(() => import("./pages/InviteLanding").then(m => ({ default: m.InviteLandingPage }))); const NotFoundPage = lazy(() => import("./pages/NotFound").then(m => ({ default: m.NotFoundPage }))); const PersonalAssistant = lazy(() => import("./pages/PersonalAssistant").then(m => ({ default: m.PersonalAssistant }))); function BootstrapPendingPage({ hasActiveInvite = false }: { hasActiveInvite?: boolean }) { return (
{hasActiveInvite ? `No instance admin exists yet. A bootstrap invite is already active. Check your ${VOCAB.appName} startup logs for the first admin invite URL, or run this command to rotate it:` : `No instance admin exists yet. Run this command in your ${VOCAB.appName} environment to generate the first admin invite URL:`}
{`pnpm paperclipai auth bootstrap-ceo`}
{description}
Get started by creating a company.