import { AgentChats } from "./pages/AgentChats"; import { lazy, Suspense, useEffect, type ReactNode } from "react"; import type { ToolConnectionCredentialSource } from "@paperclipai/shared"; import { Navigate, Outlet, Route, Routes, useActiveCompanyPrefix, useLocation, useParams } from "@/lib/router"; import { Button } from "@/components/ui/button"; import { useTranslation } from "@/i18n"; import { Layout } from "./components/Layout"; import { ConferenceRoomChatGate } from "./components/ConferenceRoomChatGate"; import { CasesExperimentalGate } from "./components/CasesExperimentalGate"; import { StatusCardsExperimentalGate } from "./components/StatusCardsExperimentalGate"; import { CloudManagedPageGate } from "./components/CloudManagedPageGate"; import { HiddenSettingsPageGate } from "./components/HiddenSettingsPageGate"; import { IsolatedWorkspacesRouteGate } from "./components/IsolatedWorkspacesRouteGate"; import { ExecutionWorkspaceCompanyGate, UnprefixedExecutionWorkspaceRedirect, } from "./components/UnprefixedExecutionWorkspaceRedirect"; import { useHiddenSettings } from "./hooks/useHiddenSettings"; import { OnboardingWizardVariant } from "./components/OnboardingWizardVariant"; import { CloudAccessGate } from "./components/CloudAccessGate"; import { ShellConfigurationGate } from "./components/ShellConfigurationGate"; import { PaperclipLoading } from "./components/AnimatedPaperclipIcon"; import { AGENT_FILTER_TABS } from "./lib/agent-filter-tabs"; import { useCombinedInboxTasksEnabled } from "./hooks/useCombinedInboxTasksEnabled"; import { ChatConnectorsExperimentalGate } from "./components/ChatConnectorsExperimentalGate"; import { useChatConnectorsEnabled } from "./hooks/useChatConnectorsEnabled"; import { canEnterAppsConnect } from "./pages/apps/app-connect-policy"; import { NotFoundPage } from "./pages/NotFound"; import { useCompany } from "./context/CompanyContext"; import { useDialogActions, useDialogState } from "./context/DialogContext"; import { loadLastInboxTab } from "./lib/inbox"; import { TASK_VIEW_PARAM, taskViewForInboxTab, type TaskViewKey } from "./lib/task-views"; import { isOnboardingWizardActive, onboardingStepForCompany, shouldRedirectCompanylessRouteToOnboarding, } from "./lib/onboarding-route"; import { filterHiddenInstanceSettingsPath, normalizeRememberedInstanceSettingsPath } from "./lib/instance-settings"; import { useCloudInstance } from "./hooks/useCloudInstance"; import { useStreamlinedUiEnabled } from "./hooks/useStreamlinedUiEnabled"; import { cloudStackCreateUrl } from "./lib/cloudLinks"; import { navigateTopLevel } from "@/lib/browserNavigation"; const AuthPage = lazy(() => import("./pages/Auth").then((module) => ({ default: module.AuthPage }))); const BoardClaimPage = lazy(() => import("./pages/BoardClaim").then((module) => ({ default: module.BoardClaimPage }))); const CliAuthPage = lazy(() => import("./pages/CliAuth").then((module) => ({ default: module.CliAuthPage }))); const InviteLandingPage = lazy(() => import("./pages/InviteLanding").then((module) => ({ default: module.InviteLandingPage }))); const ChatIdentityConfirm = lazy(() => import("./pages/apps/chat/ChatIdentityConfirm").then((module) => ({ default: module.ChatIdentityConfirm }))); const PaperclipCloudOAuthHandoffPage = lazy(() => import("./pages/apps/PaperclipCloudOAuthHandoff").then((module) => ({ default: module.PaperclipCloudOAuthHandoffPage }))); const McpConnectPage = lazy(() => import("./pages/McpConnect").then((module) => ({ default: module.McpConnectPage }))); const McpDevicePage = lazy(() => import("./pages/McpConnect").then((module) => ({ default: module.McpDevicePage }))); const AssistantConnectionsPage = lazy(() => import("./pages/McpConnect").then((module) => ({ default: module.AssistantConnectionsPage }))); const ProductionLayout = lazy(() => import("./components/Layout.production").then((module) => ({ default: module.Layout }))); const TaskChatLab = lazy(() => import("./pages/TaskChatLab").then((module) => ({ default: module.TaskChatLab }))); const Issues = lazy(() => import("./pages/Issues").then((module) => ({ default: module.Issues }))); let issueDetailLoad: Promise<{ default: typeof import("./pages/IssueDetail").IssueDetail }> | undefined; const loadIssueDetail = () => (issueDetailLoad ??= import("./pages/IssueDetail").then((module) => ({ default: module.IssueDetail }))); const IssueDetail = lazy(loadIssueDetail); const AgentChat = lazy(() => import("./pages/AgentChat").then((module) => ({ default: module.AgentChat }))); const IssueChatLongThreadPerf = lazy(() => import("./pages/IssueChatLongThreadPerf").then((module) => ({ default: module.IssueChatLongThreadPerf }))); const Inbox = lazy(() => import("./pages/Inbox").then((module) => ({ default: module.Inbox }))); const BootstrapSetupUxLab = lazy(() => import("./pages/BootstrapSetupUxLab").then((module) => ({ default: module.BootstrapSetupUxLab }))); const ResponsibleUserDenialUxLab = lazy(() => import("./pages/ResponsibleUserDenialUxLab").then((module) => ({ default: module.ResponsibleUserDenialUxLab }))); const CrossIssueCollaborationUxLab = lazy(() => import("./pages/CrossIssueCollaborationUxLab").then((module) => ({ default: module.CrossIssueCollaborationUxLab }))); const Agents = lazy(() => import("./pages/Agents").then((module) => ({ default: module.Agents }))); const Cases = lazy(() => import("./pages/Cases").then((module) => ({ default: module.Cases }))); const CaseDetail = lazy(() => import("./pages/CaseDetail").then((module) => ({ default: module.CaseDetail }))); const Dashboard = lazy(() => import("./pages/Dashboard").then((module) => ({ default: module.Dashboard }))); const DashboardLive = lazy(() => import("./pages/DashboardLive").then((module) => ({ default: module.DashboardLive }))); const Timeline = lazy(() => import("./pages/Timeline").then((module) => ({ default: module.Timeline }))); const Companies = lazy(() => import("./pages/Companies").then((module) => ({ default: module.Companies }))); const AgentDetail = lazy(() => import("./pages/AgentDetailPage").then((module) => ({ default: module.AgentDetailPage }))); const Projects = lazy(() => import("./pages/Projects").then((module) => ({ default: module.Projects }))); const ProjectDetail = lazy(() => import("./pages/ProjectDetail").then((module) => ({ default: module.ProjectDetail }))); const ProjectWorkspaceDetail = lazy(() => import("./pages/ProjectWorkspaceDetail").then((module) => ({ default: module.ProjectWorkspaceDetail }))); const Workspaces = lazy(() => import("./pages/Workspaces").then((module) => ({ default: module.Workspaces }))); const Search = lazy(() => import("./pages/Search").then((module) => ({ default: module.Search }))); const Routines = lazy(() => import("./pages/Routines").then((module) => ({ default: module.Routines }))); const StatusCards = lazy(() => import("./pages/StatusCards").then((module) => ({ default: module.StatusCards }))); const RoutineDetail = lazy(() => import("./pages/RoutineDetail").then((module) => ({ default: module.RoutineDetail }))); const UserProfile = lazy(() => import("./pages/UserProfile").then((module) => ({ default: module.UserProfile }))); const ExecutionWorkspaceDetail = lazy(() => import("./pages/ExecutionWorkspaceDetail").then((module) => ({ default: module.ExecutionWorkspaceDetail }))); const Goals = lazy(() => import("./pages/Goals").then((module) => ({ default: module.Goals }))); const Artifacts = lazy(() => import("./pages/Artifacts").then((module) => ({ default: module.Artifacts }))); const GoalDetail = lazy(() => import("./pages/GoalDetail").then((module) => ({ default: module.GoalDetail }))); const Approvals = lazy(() => import("./pages/Approvals").then((module) => ({ default: module.Approvals }))); const ApprovalDetail = lazy(() => import("./pages/ApprovalDetail").then((module) => ({ default: module.ApprovalDetail }))); const CompanyActivity = lazy(() => import("./pages/audit/CompanyActivity").then((module) => ({ default: module.CompanyActivity }))); const AuditHub = lazy(() => import("./pages/audit/AuditHub").then((module) => ({ default: module.AuditHub }))); const Costs = lazy(() => import("./pages/Costs").then((module) => ({ default: module.Costs }))); const WhatNeedsMe = lazy(() => import("./pages/WhatNeedsMe").then((module) => ({ default: module.WhatNeedsMe }))); const DecisionQueuePage = lazy(() => import("./pages/DecisionQueuePage").then((module) => ({ default: module.DecisionQueuePage }))); const BoardChat = lazy(() => import("./pages/BoardChat").then((module) => ({ default: module.BoardChat }))); const CompanySettings = lazy(() => import("./pages/CompanySettings").then((module) => ({ default: module.CompanySettings }))); const CompanyConnections = lazy(() => import("./pages/CompanyConnections").then((module) => ({ default: module.CompanyConnections }))); const CompanyEnvironments = lazy(() => import("./pages/CompanyEnvironments").then((module) => ({ default: module.CompanyEnvironments }))); const CompanySettingsPluginPage = lazy(() => import("./pages/CompanySettingsPluginPage").then((module) => ({ default: module.CompanySettingsPluginPage }))); const CompanyAccess = lazy(() => import("./pages/CompanyAccess").then((module) => ({ default: module.CompanyAccess }))); const CompanyAccessLegacyRoute = lazy(() => import("./pages/CompanyAccess").then((module) => ({ default: module.CompanyAccessLegacyRoute }))); const AdvancedToolsRoute = lazy(() => import("./pages/tools/AdvancedToolsRoute").then((module) => ({ default: module.AdvancedToolsRoute }))); const ProfileWizardRoute = lazy(() => import("./pages/tools/profiles/ProfileWizardRoute").then((module) => ({ default: module.ProfileWizardRoute }))); const ProfileDetailRoute = lazy(() => import("./pages/tools/profiles/ProfileDetailRoute").then((module) => ({ default: module.ProfileDetailRoute }))); const Browse = lazy(() => import("./pages/apps/Browse").then((module) => ({ default: module.Browse }))); const AppsConnect = lazy(() => import("./pages/apps/AppsConnect").then((module) => ({ default: module.AppsConnect }))); const ChatEndpointSetup = lazy(() => import("./pages/apps/chat/ChatEndpointSetup").then((module) => ({ default: module.ChatEndpointSetup }))); const ChatEndpointDetail = lazy(() => import("./pages/apps/chat/ChatEndpointDetail").then((module) => ({ default: module.ChatEndpointDetail }))); const AppsReview = lazy(() => import("./pages/apps/AppsReview").then((module) => ({ default: module.AppsReview }))); const AppDetail = lazy(() => import("./pages/apps/AppDetail").then((module) => ({ default: module.AppDetail }))); const AppNotConnected = lazy(() => import("./pages/apps/AppNotConnected").then((module) => ({ default: module.AppNotConnected }))); const GatewaysList = lazy(() => import("./pages/apps/gateways/GatewaysList").then((module) => ({ default: module.GatewaysList }))); const GatewayDetail = lazy(() => import("./pages/apps/gateways/GatewayDetail").then((module) => ({ default: module.GatewayDetail }))); const CompanySkills = lazy(() => import("./pages/CompanySkills").then((module) => ({ default: module.CompanySkills }))); const SkillSources = lazy(() => import("./pages/SkillSources").then((module) => ({ default: module.SkillSources }))); const SkillStudio = lazy(() => import("./pages/SkillStudio").then((module) => ({ default: module.SkillStudio }))); const Secrets = lazy(() => import("./pages/Secrets").then((module) => ({ default: module.Secrets }))); const CompanyImport = lazy(() => import("./pages/CompanyImport").then((module) => ({ default: module.CompanyImport }))); const DesignGuide = lazy(() => import("./pages/DesignGuide").then((module) => ({ default: module.DesignGuide }))); const InstanceExperimentalSettings = lazy(() => import("./pages/InstanceExperimentalSettings").then((module) => ({ default: module.InstanceExperimentalSettings }))); const InstanceAccess = lazy(() => import("./pages/InstanceAccess").then((module) => ({ default: module.InstanceAccess }))); const ProfileSettings = lazy(() => import("./pages/ProfileSettings").then((module) => ({ default: module.ProfileSettings }))); const PluginManager = lazy(() => import("./pages/PluginManager").then((module) => ({ default: module.PluginManager }))); const PluginSettings = lazy(() => import("./pages/PluginSettings").then((module) => ({ default: module.PluginSettings }))); const AdapterManager = lazy(() => import("./pages/AdapterManager").then((module) => ({ default: module.AdapterManager }))); const PluginPage = lazy(() => import("./pages/PluginPage").then((module) => ({ default: module.PluginPage }))); const NewAgent = lazy(() => import("./pages/NewAgent").then((module) => ({ default: module.NewAgent }))); const AssistantConnection = lazy(() => import("./pages/apps/AssistantConnection").then((module) => ({ default: module.AssistantConnection }))); const JoinRequestQueue = lazy(() => import("./pages/JoinRequestQueue").then((module) => ({ default: module.JoinRequestQueue }))); const CompanyExport = lazy(() => import("./pages/CompanyExport").then((module) => ({ default: module.CompanyExport }))); const ProductionAgents = lazy(() => import("./pages/Agents.production").then((module) => ({ default: module.Agents }))); const ProductionRoutines = lazy(() => import("./pages/Routines.production").then((module) => ({ default: module.Routines }))); const ProductionRoutineDetail = lazy(() => import("./pages/RoutineDetail.production").then((module) => ({ default: module.RoutineDetail }))); const ProductionCompanySkills = lazy(() => import("./pages/CompanySkills.production").then((module) => ({ default: module.CompanySkills }))); const ProductionCompanyActivity = lazy(() => import("./pages/audit/CompanyActivity.production").then((module) => ({ default: module.CompanyActivity }))); const ProductionOrgChart = lazy(() => import("./pages/OrgChart.production").then((module) => ({ default: module.OrgChart }))); function ProductionSurface({ children }: { children: ReactNode }) { return }>{children}; } function boardRoutes(streamlinedUiEnabled: boolean, combinedInboxTasksEnabled: boolean) { // Combined Inbox + Task List (PAP-670) only exists in the streamlined shell. const mergedTasks = streamlinedUiEnabled && combinedInboxTasksEnabled; return ( <> } /> } /> } /> : } /> } /> } /> } /> } /> } /> } /> }> } /> } /> {/* Invites moved into the Members page; the old URL redirects (and stays gated so a hidden Invites surface never round-trips through it). */} }> } /> }> }> )} /> }> }> } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Connector health is inline on the Apps landing page; keep legacy links working. */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> }> } /> } /> } /> }> } /> } /> } /> }> } /> }> } /> }> } /> } /> }> } /> } /> } /> } /> : } /> } /> } /> } /> : } /> } /> } /> } /> : } /> } /> {AGENT_FILTER_TABS.map((tab) => ( : } /> ))} } /> } /> } /> } /> } /> } /> } /> } /> } /> }> } /> } /> } /> } /> }> } /> } /> } /> } /> {mergedTasks ? ( <> {/* Combined Inbox + Task List: the status presets are real views, not aliases of /issues. */} } /> } /> } /> } /> } /> ) : ( <> } /> } /> } /> } /> } /> )} } /> } /> } /> {import.meta.env.DEV ? ( } /> ) : null} : } /> } /> } /> } /> } /> {/* Back-compat: the board lived at /status-cards before PAP-15223. */} } /> } /> : } /> : } /> }> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> : } /> } /> } /> } /> } /> } /> {streamlinedUiEnabled ? ( <> } /> } /> } /> } /> } /> } /> } /> } /> } /> ) : ( <> } /> } /> )} {/* Conference Room Chat surfaces (PAP-136/PAP-137): routes stay registered but redirect to the company home while the experimental flag is off. The board-level `artifacts` mount below is the new conference-room one; the master-level mount above it still serves `/artifacts` in both modes. */} }> } /> } /> {/* Task chat dev harness — dev builds only. */} {import.meta.env.DEV ? ( } /> ) : null} } /> } /> {/* Combined Inbox + Task List: Inbox is a view inside Tasks. Every /inbox/* URL still resolves — it redirects into the matching view — and with the flag off (or in the legacy shell) the standalone pages stay. /inbox/requests stays its own page either way; Settings → Members links straight to it. */} {mergedTasks ? ( <> } /> } /> } /> } /> } /> } /> } /> ) : ( <> } /> } /> } /> } /> } /> } /> } /> )} } /> } /> } /> } /> } /> } /> ); } function AppsConnectEntryRoute({ credentialSource = "paperclip_vault", }: { credentialSource?: ToolConnectionCredentialSource; } = {}) { const location = useLocation(); const searchParams = new URLSearchParams(location.search); const { enabled: chatConnectorsEnabled, githubEnabled: githubReviewBotsEnabled } = useChatConnectorsEnabled(); return canEnterAppsConnect(searchParams, { chatConnectorsEnabled, githubReviewBotsEnabled }) ? : ; } function InboxRootRedirect() { const { enabled: streamlinedUiEnabled } = useStreamlinedUiEnabled(); const { enabled: combinedInboxTasksEnabled } = useCombinedInboxTasksEnabled(); return streamlinedUiEnabled && combinedInboxTasksEnabled ? : ; } /** Sends a retired Inbox/Tasks URL to its view on the merged Tasks surface. */ function TaskViewRedirect({ view }: { view: TaskViewKey }) { const location = useLocation(); const params = new URLSearchParams(location.search); params.set(TASK_VIEW_PARAM, view); return ; } function LegacySkillStudioRedirect() { const location = useLocation(); const { companies, selectedCompany, loading } = useCompany(); const { companyPrefix, skillId } = useParams<{ companyPrefix?: string; skillId?: string }>(); if (loading) return null; const targetCompany = (companyPrefix ? companies.find((company) => company.issuePrefix.toUpperCase() === companyPrefix.toUpperCase()) : null) ?? selectedCompany ?? companies[0] ?? null; if (!targetCompany || !skillId) { return ; } return ( ); } function LegacySettingsRedirect() { const location = useLocation(); const { companies, selectedCompany, loading } = useCompany(); const { companyPrefix } = useParams<{ companyPrefix?: string }>(); const { hidden: hiddenSettings } = useHiddenSettings(); if (loading) { return ; } const targetCompany = (companyPrefix ? companies.find((company) => company.issuePrefix.toUpperCase() === companyPrefix.toUpperCase()) : null) ?? selectedCompany ?? companies[0] ?? null; if (!targetCompany) { if ( shouldRedirectCompanylessRouteToOnboarding({ pathname: location.pathname, hasCompanies: false, }) ) { return ; } return ; } const normalizedPath = filterHiddenInstanceSettingsPath( normalizeRememberedInstanceSettingsPath( `${location.pathname}${location.search}${location.hash}`, ), hiddenSettings, ); return ( ); } function LegacyToolsSettingsRedirect() { const { tab } = useParams<{ tab?: string }>(); return ; } // The developer "Tools" surface moved under the Apps "Advanced setup" door // (PAP-10862). `/tools` and `/tools/:tab` redirect to their new home. function LegacyToolsRedirect() { const { tab } = useParams<{ tab?: string }>(); return ; } function legacyToolsRedirectTarget(tab?: string) { if (!tab) return "/apps/advanced/profiles"; if (tab === "applications" || tab === "connections" || tab === "overview" || tab === "examples") return "/apps"; if (tab === "runtime" || tab === "audit") return "/apps"; if (tab === "policies") return "/apps/advanced/profiles"; return `/apps/advanced/${tab}`; } export function OnboardingRoutePage() { const { companies } = useCompany(); const { openOnboarding } = useDialogActions(); const { t } = useTranslation(); const cloudInstance = useCloudInstance(); const createStackUrl = cloudStackCreateUrl(cloudInstance?.cloudBaseUrl ?? null); const { onboardingOpen, onboardingRouteDismissed } = useDialogState(); const { companyPrefix } = useParams<{ companyPrefix?: string }>(); const matchedCompany = companyPrefix ? companies.find((company) => company.issuePrefix.toUpperCase() === companyPrefix.toUpperCase()) ?? null : null; // The OnboardingWizard auto-opens on this route (and can also be opened // explicitly). While it is showing it covers the whole screen, so the // launcher card below must not stay interactive behind it — otherwise users // can tab/click through to the form behind the modal (PAP-52). The launcher // only needs to render as a re-entry point once the wizard is dismissed. if (isOnboardingWizardActive({ onboardingOpen, routeDismissed: onboardingRouteDismissed })) { return null; } const title = matchedCompany ? `Add another agent to ${matchedCompany.name}` : companies.length > 0 ? "Create another organization" : "Create your first organization"; const description = matchedCompany ? "Run onboarding again to add an agent and a starter task for this organization." : companies.length > 0 ? "Run onboarding again to create another organization and seed its first agent." : "Get started by creating an organization and your first agent."; return (

{title}

{description}

{/* On a managed stack whose Cloud origin is unknown there is nowhere to send this click: creation lives on Cloud, and in-app creation is a 403 floor. A button that does nothing is worse than none, so say why instead of rendering an inert control. */} {!matchedCompany && cloudInstance && !createStackUrl ? (

{t("app.cloudCreateUnavailable", { defaultValue: "Organizations are created in Paperclip Cloud. This instance can't reach it right now — try again from your Cloud portfolio.", })}

) : ( )}
); } function CompanyRootRedirect() { const { companies, selectedCompany, loading } = useCompany(); const location = useLocation(); if (loading) { return ; } const targetCompany = selectedCompany ?? companies[0] ?? null; if (!targetCompany) { if ( shouldRedirectCompanylessRouteToOnboarding({ pathname: location.pathname, hasCompanies: false, }) ) { return ; } return ; } return ; } function StatusCardsLegacyRedirect() { const { cardId } = useParams<{ cardId?: string }>(); const prefix = useActiveCompanyPrefix(); const base = prefix ? `/${prefix}` : ""; return ; } function AuditCompatibilityRedirect({ to, forceAgentMode = false, }: { to: string; forceAgentMode?: boolean; }) { const location = useLocation(); const searchParams = new URLSearchParams(location.search); if (forceAgentMode) searchParams.set("mode", "agents"); const search = searchParams.toString(); return ; } function UnprefixedBoardRedirect() { const location = useLocation(); const { companies, selectedCompany, loading } = useCompany(); if (loading) { return ; } const targetCompany = selectedCompany ?? companies[0] ?? null; if (!targetCompany) { if ( shouldRedirectCompanylessRouteToOnboarding({ pathname: location.pathname, hasCompanies: false, }) ) { return ; } return ; } return ( ); } function NoCompaniesStartPage() { const { openOnboarding } = useDialogActions(); const { t } = useTranslation(); // A managed stack with no visible companies is a loading or error state, not // an invitation to create one in-app — creation lives on Cloud (403 floor). const cloudInstance = useCloudInstance(); const createStackUrl = cloudStackCreateUrl(cloudInstance?.cloudBaseUrl ?? null); return (

{t("app.noCompanies.title", { defaultValue: "Create your first organization" })}

{t("app.noCompanies.description", { defaultValue: "Get started by creating an organization." })}

{/* Same as the onboarding route: no Cloud origin means nowhere to send the click, and in-app creation is a 403 floor here. */} {cloudInstance && !createStackUrl ? (

{t("app.cloudCreateUnavailable", { defaultValue: "Organizations are created in Paperclip Cloud. This instance can't reach it right now — try again from your Cloud portfolio.", })}

) : ( )}
); } export function App() { const { pathname } = useLocation(); const { enabled: streamlinedUiEnabled, loaded: streamlinedUiLoaded } = useStreamlinedUiEnabled(); const { enabled: combinedInboxTasksEnabled } = useCombinedInboxTasksEnabled(); useEffect(() => { if (/^\/[^/]+\/(issues|tasks|inbox)(?:\/|$)/.test(pathname)) { void loadIssueDetail().catch(() => undefined); } }, [pathname]); return ( <> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> }> }> {/* The identity APIs enforce the chat rollout flag. Nonmembers cannot read experimental settings, but a private invitation may request membership. */} } /> } /> } /> } /> } /> }> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {streamlinedUiEnabled ? ( <> } /> } /> } /> } /> } /> } /> ) : null} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {AGENT_FILTER_TABS.map((tab) => ( } /> ))} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> : }> {boardRoutes(streamlinedUiEnabled, combinedInboxTasksEnabled)} } /> ); }