import { Links, LinksFunction, Meta, MetaFunction, Outlet, Scripts, ScrollRestoration, useLocation, useNavigate, useNavigation as useRouterNavigation, } from "react-router"; import "./tailwind.css"; import "./index.css"; import React from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Toaster } from "react-hot-toast"; import { clearCachedAgentServerInfo, isAgentServerUnavailableError, isAgentServerAuthError, } from "#/api/agent-server-compatibility"; import { getLockedCloudAuthMode, getLockedCloudHost, isAuthRequiredAndMissing, isSameCloudHost, } from "#/api/agent-server-config"; import { authenticateWithMainAppCookie, redirectToMainAppLogin, shouldUseMainAppCookieAuth, } from "#/api/main-app-auth"; import { getEffectiveLocalBackend } from "#/api/backend-registry/active-store"; import { useActiveBackendContext } from "#/contexts/active-backend-context"; import { isCloudBackendApiKeyOrNetworkHealthError, isCloudBackendLoggedOutHealthError, useBackendsHealth, } from "#/hooks/query/use-backends-health"; import { TOAST_OPTIONS } from "#/utils/custom-toast-handlers"; import { LoadingSpinner } from "#/components/shared/loading-spinner"; import { useConfig } from "#/hooks/query/use-config"; import { QUERY_KEYS } from "#/hooks/query/query-keys"; import { AgentServerUIRoot } from "#/components/providers"; import { TelemetryConsentBanner } from "#/components/features/analytics/telemetry-consent-banner"; import { buildAgentCanvasPath } from "#/utils/base-path"; import { useOnboardingCompletion } from "#/components/features/onboarding/use-onboarding-completion"; import { NavigationProvider } from "#/context/navigation-context"; import { applyColorTheme, readPersistedColorTheme, } from "#/themes/color-themes"; /** Applies the persisted color-theme palette to document.body on mount. */ function ColorThemeApplier() { React.useEffect(() => { applyColorTheme(readPersistedColorTheme()); }, []); return null; } // Only rendered when the active backend is unreachable; keep the modal out of // the default root graph. const ManageBackendsModal = React.lazy(() => import("#/components/features/backends/manage-backends-modal").then((m) => ({ default: m.ManageBackendsModal, })), ); // Rendered when the backend returns 401 (public mode — user must paste key). const ApiKeyEntryScreen = React.lazy( () => import("#/components/features/backends/api-key-entry-screen"), ); // Rendered only for first-run public/frontend-only bootstraps; keep the // onboarding flow out of the root bundle until this rare gate is active. const OnboardingModal = React.lazy(() => import("#/components/features/onboarding/onboarding-modal").then((m) => ({ default: m.OnboardingModal, })), ); // Rendered for first-run in locked-to-Cloud mode; shows Cloud login directly // without the onboarding progress bars. const BackendFormModal = React.lazy(() => import("#/components/features/backends/backend-form-modal").then((m) => ({ default: m.BackendFormModal, })), ); export function Layout({ children }: { children: React.ReactNode }) { return ( {children}