import { type Flag } from "@/src/features/feature-flags/types"; import { type ProjectScope } from "@/src/features/rbac/constants/projectAccessRights"; import { Database, LayoutDashboard, LifeBuoy, ListTree, type LucideIcon, Settings, UsersIcon, TerminalIcon, Lightbulb, Grid2X2, Sparkle, FileJson, Search, Home, SquarePercent, ClipboardPen, Clock, } from "lucide-react"; import { type ReactNode } from "react"; import { type Entitlement } from "@/src/features/entitlements/constants/entitlements"; import { type User } from "next-auth"; import { type OrganizationScope } from "@/src/features/rbac/constants/organizationAccessRights"; import { SupportButton } from "@/src/components/nav/support-button"; import { BookACallButton } from "@/src/components/nav/book-a-call-button"; import { V4BetaSidebarToggle } from "@/src/features/events/components/V4BetaSidebarToggle"; import { SidebarMenuButton } from "@/src/components/ui/sidebar"; import { useCommandMenu } from "@/src/features/command-k-menu/CommandMenuProvider"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { CloudStatusMenu } from "@/src/features/cloud-status-notification/components/CloudStatusMenu"; import { type ProductModule } from "@/src/ee/features/ui-customization/productModuleSchema"; export enum RouteSection { Main = "main", Secondary = "secondary", } export enum RouteGroup { Observability = "Observability", PromptManagement = "Prompt Management", Evaluation = "Evaluation", } export type Route = { title: string; menuNode?: ReactNode; featureFlag?: Flag; label?: string | ReactNode; projectRbacScopes?: ProjectScope[]; // array treated as OR organizationRbacScope?: OrganizationScope; icon?: LucideIcon; // ignored for nested routes pathname: string; // link items?: Array; // folder section?: RouteSection; // which section of the sidebar (top/main/bottom) newTab?: boolean; // open in new tab entitlements?: Entitlement[]; // entitlements required, array treated as OR productModule?: ProductModule; // Product module this route belongs to. Used to show/hide modules via ui customization. show?: (p: { organization: User["organizations"][number] | undefined; }) => boolean; group?: RouteGroup; // group this route belongs to (within a section) }; export const ROUTES: Route[] = [ { title: "Go to...", pathname: "", // Empty pathname since this is a dropdown icon: Search, menuNode: , section: RouteSection.Main, }, { title: "Organizations", pathname: "/", icon: Grid2X2, show: ({ organization }) => organization === undefined, section: RouteSection.Main, }, { title: "Projects", pathname: "/organization/[organizationId]", icon: Grid2X2, section: RouteSection.Main, }, { title: "Home", pathname: `/project/[projectId]`, icon: Home, section: RouteSection.Main, }, { title: "Dashboards", pathname: `/project/[projectId]/dashboards`, icon: LayoutDashboard, productModule: "dashboards", section: RouteSection.Main, }, { title: "Tracing", icon: ListTree, productModule: "tracing", group: RouteGroup.Observability, section: RouteSection.Main, pathname: `/project/[projectId]/traces`, }, { title: "Sessions", icon: Clock, productModule: "tracing", group: RouteGroup.Observability, section: RouteSection.Main, pathname: `/project/[projectId]/sessions`, }, { title: "Users", pathname: `/project/[projectId]/users`, icon: UsersIcon, productModule: "tracing", group: RouteGroup.Observability, section: RouteSection.Main, }, { title: "Prompts", pathname: "/project/[projectId]/prompts", icon: FileJson, projectRbacScopes: ["prompts:read"], productModule: "prompt-management", group: RouteGroup.PromptManagement, section: RouteSection.Main, }, { title: "Playground", pathname: "/project/[projectId]/playground", icon: TerminalIcon, productModule: "playground", group: RouteGroup.PromptManagement, section: RouteSection.Main, }, { title: "Scores", pathname: `/project/[projectId]/scores`, group: RouteGroup.Evaluation, section: RouteSection.Main, icon: SquarePercent, }, { title: "LLM-as-a-Judge", icon: Lightbulb, productModule: "evaluation", projectRbacScopes: ["evalJob:read"], group: RouteGroup.Evaluation, section: RouteSection.Main, pathname: `/project/[projectId]/evals`, }, { title: "Human Annotation", pathname: `/project/[projectId]/annotation-queues`, projectRbacScopes: ["annotationQueues:read"], group: RouteGroup.Evaluation, section: RouteSection.Main, icon: ClipboardPen, }, { title: "Datasets", pathname: `/project/[projectId]/datasets`, icon: Database, productModule: "datasets", group: RouteGroup.Evaluation, section: RouteSection.Main, }, { title: "Upgrade", icon: Sparkle, pathname: "/project/[projectId]/settings/billing", section: RouteSection.Secondary, entitlements: ["cloud-billing"], organizationRbacScope: "langfuseCloudBilling:CRUD", show: ({ organization }) => organization?.plan === "cloud:hobby", }, { title: "Upgrade", icon: Sparkle, pathname: "/organization/[organizationId]/settings/billing", section: RouteSection.Secondary, entitlements: ["cloud-billing"], organizationRbacScope: "langfuseCloudBilling:CRUD", show: ({ organization }) => organization?.plan === "cloud:hobby", }, { title: "Cloud Status", section: RouteSection.Secondary, pathname: "", menuNode: , }, { title: "v4 Beta Toggle", pathname: "", section: RouteSection.Secondary, featureFlag: "v4BetaToggleVisible", menuNode: , }, { title: "Settings", pathname: "/project/[projectId]/settings", icon: Settings, section: RouteSection.Secondary, }, { title: "Settings", pathname: "/organization/[organizationId]/settings", icon: Settings, section: RouteSection.Secondary, }, { title: "Book a call", section: RouteSection.Secondary, pathname: "", menuNode: , }, { title: "Support", icon: LifeBuoy, section: RouteSection.Secondary, pathname: "", // Empty pathname since this is a dropdown menuNode: , }, ]; function CommandMenuTrigger() { const { setOpen } = useCommandMenu(); const capture = usePostHogClientCapture(); return ( { capture("cmd_k_menu:opened", { source: "main_navigation", }); setOpen(true); }} className="whitespace-nowrap" > Go to... {navigator.userAgent.includes("Mac") ? ( ) : ( Ctrl )} K ); }