@copilotz/admin 0.9.35 → 0.9.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +411 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -4
- package/dist/index.d.ts +14 -4
- package/dist/index.js +419 -91
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/client.ts","../src/core/CopilotzAdmin.tsx","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/select.tsx","../src/modules/agents/index.tsx","../src/components/patterns/EmptyState.tsx","../src/components/patterns/FilterBar.tsx","../src/components/patterns/InspectorPanel.tsx","../src/components/patterns/JsonPanel.tsx","../src/components/ui/textarea.tsx","../src/components/ui/card.tsx","../src/components/patterns/MetricStrip.tsx","../src/components/ui/badge.tsx","../src/components/patterns/PageHeader.tsx","../src/components/ui/table.tsx","../src/components/patterns/ResourceTable.tsx","../src/components/patterns/StatusBadge.tsx","../src/modules/usage/calculations.ts","../src/modules/collections/index.tsx","../src/modules/events/index.tsx","../src/modules/overview/index.tsx","../src/modules/participants/index.tsx","../src/modules/threads/index.tsx","../src/modules/usage/index.tsx","../src/components/ui/chart.tsx","../src/modules/index.ts","../src/core/registry.ts","../src/core/scope.tsx","../src/config.ts","../src/useCopilotzAdmin.ts"],"sourcesContent":["import type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminCollectionItem,\n AdminDatePreset,\n AdminMessagePage,\n AdminOverview,\n AdminParticipantDetail,\n AdminParticipantSummary,\n AdminQueueEvent,\n AdminThreadDetail,\n AdminThreadSummary,\n AdminUsageFilters,\n AdminUsageResponse,\n RequestHeadersProvider,\n} from \"./types\";\n\nexport interface AdminClientPaths {\n adminBase: string;\n collectionsBase: string;\n threadsBase: string;\n}\n\nexport interface AdminClientOptions {\n baseUrl?: string;\n paths?: Partial<AdminClientPaths>;\n getRequestHeaders?: RequestHeadersProvider;\n}\n\nexport interface AdminListOptions {\n namespace?: string;\n search?: string;\n limit?: number;\n offset?: number;\n before?: string;\n after?: string;\n filter?: Record<string, unknown>;\n sort?: Record<string, \"asc\" | \"desc\">;\n populate?: string[];\n}\n\nexport interface CopilotzAdminClient {\n paths: AdminClientPaths;\n getOverview(\n options?: { range?: AdminDatePreset; namespace?: string },\n ): Promise<AdminOverview>;\n getActivity(\n options?: {\n range?: AdminDatePreset;\n interval?: AdminActivityInterval;\n namespace?: string;\n },\n ): Promise<AdminActivityPoint[]>;\n getUsage(filters?: AdminUsageFilters): Promise<AdminUsageResponse>;\n listThreads(options?: AdminListOptions): Promise<AdminThreadSummary[]>;\n listParticipants(\n options?: AdminListOptions,\n ): Promise<AdminParticipantSummary[]>;\n listAgents(\n options?: AdminListOptions & { range?: AdminDatePreset },\n ): Promise<AdminAgentSummary[]>;\n getThread(threadId: string): Promise<AdminThreadDetail>;\n getThreadMessages(\n threadId: string,\n options?: { limit?: number; before?: string },\n ): Promise<AdminMessagePage>;\n getThreadEvent(threadId: string): Promise<AdminQueueEvent | undefined>;\n listCollections(): Promise<string[]>;\n listCollectionItems(\n collection: string,\n options?: AdminListOptions,\n ): Promise<AdminCollectionItem[]>;\n getCollectionItem(\n collection: string,\n itemId: string,\n options?: { namespace?: string; populate?: string[] },\n ): Promise<AdminCollectionItem>;\n createCollectionItem(\n collection: string,\n data: Record<string, unknown>,\n options?: { namespace?: string },\n ): Promise<AdminCollectionItem>;\n updateCollectionItem(\n collection: string,\n itemId: string,\n data: Record<string, unknown>,\n options?: { namespace?: string },\n ): Promise<AdminCollectionItem>;\n deleteCollectionItem(\n collection: string,\n itemId: string,\n options?: { namespace?: string },\n ): Promise<void>;\n}\n\nconst DEFAULT_PATHS: AdminClientPaths = {\n adminBase: \"/v1/admin\",\n collectionsBase: \"/v1/collections\",\n threadsBase: \"/v1/threads\",\n};\n\nfunction resolveBaseUrl(baseUrl?: string): string {\n const candidate = (baseUrl && baseUrl.length > 0 ? baseUrl : \"/api\")\n .replace(/\\/$/, \"\");\n return candidate.startsWith(\"http\") || candidate.startsWith(\"/\")\n ? candidate\n : `/${candidate}`;\n}\n\nfunction getRangeWindow(range: AdminDatePreset = \"7d\") {\n const to = new Date();\n const from = new Date(to);\n if (range === \"24h\") {\n from.setHours(from.getHours() - 24);\n } else if (range === \"30d\") {\n from.setDate(from.getDate() - 30);\n } else {\n from.setDate(from.getDate() - 7);\n }\n return { from: from.toISOString(), to: to.toISOString() };\n}\n\nfunction encodeJsonParam(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n return JSON.stringify(value);\n}\n\nfunction encodeListParam(value: string[] | undefined): string | undefined {\n return value && value.length > 0 ? value.join(\",\") : undefined;\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n params: Record<string, string | undefined> = {},\n): URL {\n const url = new URL(`${baseUrl}${path}`, globalThis.location?.origin);\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === \"string\" && value.length > 0) {\n url.searchParams.set(key, value);\n }\n }\n return url;\n}\n\nasync function mergeHeaders(\n headers: Record<string, string>,\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> {\n const provided = getRequestHeaders ? await getRequestHeaders() : undefined;\n return provided ? { ...headers, ...provided } : headers;\n}\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message = payload?.message ?? payload?.data?.message ??\n `Admin request failed (${response.status})`;\n throw new Error(message);\n }\n return (payload?.data ?? payload) as T;\n}\n\nexport function createAdminClient(\n options: AdminClientOptions = {},\n): CopilotzAdminClient {\n const baseUrl = resolveBaseUrl(options.baseUrl);\n const paths = { ...DEFAULT_PATHS, ...options.paths };\n\n const requestJson = async <T>(\n path: string,\n params?: Record<string, string | undefined>,\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, params);\n const response = await fetch(url.toString(), {\n headers: await mergeHeaders({}, options.getRequestHeaders),\n });\n return await parseJsonResponse<T>(response);\n };\n\n const writeJson = async <T>(\n method: \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n data?: Record<string, unknown>,\n params?: Record<string, string | undefined>,\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, params);\n const response = await fetch(url.toString(), {\n method,\n headers: await mergeHeaders(\n data ? { \"Content-Type\": \"application/json\" } : {},\n options.getRequestHeaders,\n ),\n ...(data ? { body: JSON.stringify(data) } : {}),\n });\n if (response.status === 204) return undefined as T;\n return await parseJsonResponse<T>(response);\n };\n\n return {\n paths,\n getOverview: async ({ range = \"7d\", namespace } = {}) => {\n const windowRange = getRangeWindow(range);\n return await requestJson<AdminOverview>(`${paths.adminBase}/overview`, {\n namespace,\n from: windowRange.from,\n to: windowRange.to,\n });\n },\n getActivity: async ({ range = \"7d\", interval = \"day\", namespace } = {}) => {\n const windowRange = getRangeWindow(range);\n return await requestJson<AdminActivityPoint[]>(\n `${paths.adminBase}/activity`,\n {\n namespace,\n interval,\n from: windowRange.from,\n to: windowRange.to,\n },\n );\n },\n getUsage: async (filters = {}) =>\n await requestJson<AdminUsageResponse>(`${paths.adminBase}/usage`, {\n from: filters.from,\n to: filters.to,\n interval: filters.interval,\n metric: filters.metric,\n groupBy: filters.groupBy,\n attribution: filters.attribution,\n threadId: filters.threadId,\n participantId: filters.participantId,\n participantType: filters.participantType,\n namespace: filters.namespace,\n provider: filters.provider,\n model: filters.model,\n }),\n listThreads: async (listOptions = {}) =>\n await requestJson<AdminThreadSummary[]>(`${paths.adminBase}/threads`, {\n search: listOptions.search,\n namespace: listOptions.namespace,\n limit: String(listOptions.limit ?? 25),\n }),\n listParticipants: async (listOptions = {}) =>\n await requestJson<AdminParticipantSummary[]>(\n `${paths.adminBase}/participants`,\n {\n search: listOptions.search,\n namespace: listOptions.namespace,\n limit: String(listOptions.limit ?? 25),\n },\n ),\n listAgents: async (listOptions = {}) => {\n const windowRange = getRangeWindow(listOptions.range ?? \"7d\");\n return await requestJson<AdminAgentSummary[]>(`${paths.adminBase}/agents`, {\n search: listOptions.search,\n namespace: listOptions.namespace,\n from: windowRange.from,\n to: windowRange.to,\n limit: String(listOptions.limit ?? 25),\n });\n },\n getThread: async (threadId) =>\n await requestJson<AdminThreadDetail>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}`,\n ),\n getThreadMessages: async (threadId, messageOptions = {}) =>\n await requestJson<AdminMessagePage>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}/messages`,\n {\n limit: messageOptions.limit ? String(messageOptions.limit) : undefined,\n before: messageOptions.before,\n },\n ),\n getThreadEvent: async (threadId) =>\n await requestJson<AdminQueueEvent | undefined>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}/events`,\n ),\n listCollections: async () =>\n await requestJson<string[]>(paths.collectionsBase),\n listCollectionItems: async (collection, listOptions = {}) =>\n await requestJson<AdminCollectionItem[]>(\n `${paths.collectionsBase}/${encodeURIComponent(collection)}`,\n {\n q: listOptions.search,\n namespace: listOptions.namespace,\n limit: listOptions.limit ? String(listOptions.limit) : undefined,\n offset: listOptions.offset ? String(listOptions.offset) : undefined,\n before: listOptions.before,\n after: listOptions.after,\n filter: encodeJsonParam(listOptions.filter),\n sort: encodeJsonParam(listOptions.sort),\n populate: encodeListParam(listOptions.populate),\n },\n ),\n getCollectionItem: async (collection, itemId, getOptions = {}) =>\n await requestJson<AdminCollectionItem>(\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n {\n namespace: getOptions.namespace,\n populate: encodeListParam(getOptions.populate),\n },\n ),\n createCollectionItem: async (collection, data, writeOptions = {}) =>\n await writeJson<AdminCollectionItem>(\n \"POST\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}`,\n data,\n { namespace: writeOptions.namespace },\n ),\n updateCollectionItem: async (collection, itemId, data, writeOptions = {}) =>\n await writeJson<AdminCollectionItem>(\n \"PUT\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n data,\n { namespace: writeOptions.namespace },\n ),\n deleteCollectionItem: async (collection, itemId, writeOptions = {}) => {\n await writeJson<void>(\n \"DELETE\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n undefined,\n { namespace: writeOptions.namespace },\n );\n },\n };\n}\n","import React, { useMemo, useState } from \"react\";\nimport {\n Bot,\n ChevronsUpDown,\n Database,\n LayoutDashboard,\n RefreshCw,\n} from \"lucide-react\";\nimport { createAdminClient } from \"../api/client\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../components/ui/button\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n} from \"../components/ui/sidebar\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../components/ui/select\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip\";\nimport { defaultCopilotzModules } from \"../modules\";\nimport {\n ADMIN_GROUP_LABELS,\n ADMIN_GROUP_ORDER,\n canAccessAdminPermission,\n collectAdminNavItems,\n collectAdminRoutes,\n collectCollectionEditors,\n firstAccessibleRoute,\n} from \"./registry\";\nimport { AdminProvider } from \"./scope\";\nimport type {\n AdminBranding,\n AdminModuleGroup,\n AdminNavItem,\n AdminRouteState,\n CopilotzAdminProps,\n} from \"./types\";\n\nconst DEFAULT_BRANDING: Required<AdminBranding> = {\n title: \"Copilotz Admin\",\n subtitle: \"Operate and configure Copilotz projects\",\n logo: null,\n actions: null,\n};\n\nfunction routeFromLegacyPage(page?: string): string | undefined {\n switch (page) {\n case \"dashboard\":\n return \"overview\";\n case \"thread-detail\":\n return \"threads.detail\";\n case \"participant-detail\":\n return \"participants.detail\";\n case \"agent-detail\":\n return \"agents.detail\";\n case \"collection-items\":\n return \"collections\";\n case \"collection-item-detail\":\n return \"collections.detail\";\n default:\n return page;\n }\n}\n\nexport function CopilotzAdmin({\n branding: brandingProp,\n className,\n client,\n clientConfig,\n config,\n modules: modulesProp,\n onNavigate,\n permissions = {},\n scope: scopeProp,\n}: CopilotzAdminProps) {\n const modules = useMemo(\n () => modulesProp ?? defaultCopilotzModules(),\n [modulesProp],\n );\n const adminClient = useMemo(\n () =>\n client ?? createAdminClient({\n baseUrl: clientConfig?.baseUrl ?? config?.baseUrl,\n paths: clientConfig?.paths,\n getRequestHeaders: clientConfig?.getRequestHeaders ??\n config?.getRequestHeaders,\n }),\n [client, clientConfig, config],\n );\n const branding = useMemo(\n () => ({\n ...DEFAULT_BRANDING,\n ...(config?.branding ?? {}),\n ...(brandingProp ?? {}),\n }),\n [brandingProp, config?.branding],\n );\n const [namespace, setNamespaceState] = useState(\n scopeProp?.namespace ?? config?.namespace ?? \"\",\n );\n const scope = useMemo(() => ({\n ...(scopeProp ?? {}),\n namespace,\n }), [namespace, scopeProp]);\n\n const routes = useMemo(\n () => collectAdminRoutes(modules, permissions),\n [modules, permissions],\n );\n const navItems = useMemo(\n () => collectAdminNavItems(modules, permissions),\n [modules, permissions],\n );\n const collectionEditors = useMemo(\n () => collectCollectionEditors(modules),\n [modules],\n );\n\n const initialRouteId = routeFromLegacyPage(config?.defaultPage) ??\n firstAccessibleRoute(modules, permissions);\n const [route, setRoute] = useState<AdminRouteState>({\n routeId: initialRouteId,\n });\n const [refreshKey, setRefreshKey] = useState(0);\n\n const activeRoute = routes.get(route.routeId) ??\n routes.get(firstAccessibleRoute(modules, permissions));\n\n const navigate = (routeId: string, params?: Record<string, string | undefined>) => {\n const next = { routeId, params };\n setRoute(next);\n onNavigate?.(next);\n };\n\n const runtime = {\n branding,\n canAccess: (permission?: string, action?: string) =>\n canAccessAdminPermission(permissions, permission, action),\n client: adminClient,\n collectionEditors,\n modules,\n navigate,\n permissions,\n refreshKey,\n requestRefresh: () => setRefreshKey((key) => key + 1),\n route,\n scope,\n setNamespace: setNamespaceState,\n };\n\n return (\n <AdminProvider value={runtime}>\n <TooltipProvider>\n <SidebarProvider defaultOpen>\n <div\n className={cn(\n \"flex h-[100svh] w-full overflow-hidden bg-background text-foreground\",\n className,\n )}\n >\n <AdminShellSidebar\n branding={branding}\n navItems={navItems}\n namespace={namespace}\n onNavigate={navigate}\n onNamespaceChange={setNamespaceState}\n route={route}\n scopeOptions={scope.availableNamespaces}\n />\n <SidebarInset>\n <div className=\"flex h-full min-h-0 flex-col\">\n <AdminShellHeader\n brandingActions={branding.actions}\n isRefreshable={Boolean(activeRoute)}\n onRefresh={() => setRefreshKey((key) => key + 1)}\n title={activeRoute?.title ?? \"Admin\"}\n />\n <main className=\"min-h-0 flex-1 overflow-auto bg-muted/20\">\n <div className=\"mx-auto flex w-full max-w-[1600px] flex-col gap-4 p-4 lg:p-5\">\n {activeRoute\n ? activeRoute.render(runtime)\n : (\n <div className=\"rounded-lg border bg-background p-8 text-sm text-muted-foreground\">\n No accessible admin route is configured.\n </div>\n )}\n </div>\n </main>\n </div>\n </SidebarInset>\n </div>\n </SidebarProvider>\n </TooltipProvider>\n </AdminProvider>\n );\n}\n\nfunction AdminShellSidebar({\n branding,\n navItems,\n namespace,\n onNavigate,\n onNamespaceChange,\n route,\n scopeOptions,\n}: {\n branding: Required<AdminBranding>;\n navItems: AdminNavItem[];\n namespace: string;\n onNavigate: (routeId: string) => void;\n onNamespaceChange: (namespace: string) => void;\n route: AdminRouteState;\n scopeOptions?: Array<{ id: string; label?: string }>;\n}) {\n const grouped = ADMIN_GROUP_ORDER.map((group) => ({\n group,\n items: navItems.filter((item) => (item.group ?? \"extensions\") === group),\n })).filter((entry) => entry.items.length > 0);\n\n return (\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-3 px-2 py-3\">\n <div className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-primary-foreground\">\n {branding.logo ?? <Bot className=\"size-4\" />}\n </div>\n <div className=\"min-w-0 group-data-[collapsible=icon]:hidden\">\n <div className=\"truncate text-sm font-semibold\">\n {branding.title}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {branding.subtitle}\n </div>\n </div>\n </div>\n </SidebarHeader>\n <SidebarContent>\n {grouped.map(({ group, items }, index) => (\n <React.Fragment key={group}>\n {index > 0 && <SidebarSeparator />}\n <SidebarGroup>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">\n {ADMIN_GROUP_LABELS[group as AdminModuleGroup]}\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {items.map((item) => {\n const Icon = item.icon ?? LayoutDashboard;\n return (\n <SidebarMenuItem key={item.id}>\n <SidebarMenuButton\n isActive={route.routeId === item.routeId}\n onClick={() => onNavigate(item.routeId)}\n tooltip={item.label}\n >\n <Icon />\n <span>{item.label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </React.Fragment>\n ))}\n </SidebarContent>\n <SidebarFooter>\n <div className=\"group-data-[collapsible=icon]:hidden\">\n <label className=\"mb-1 block px-2 text-xs font-medium text-muted-foreground\">\n Namespace\n </label>\n <Select\n value={namespace || \"__all__\"}\n onValueChange={(value) =>\n onNamespaceChange(value === \"__all__\" ? \"\" : value)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"All namespaces\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All namespaces</SelectItem>\n {scopeOptions?.map((option) => (\n <SelectItem key={option.id} value={option.id}>\n {option.label ?? option.id}\n </SelectItem>\n ))}\n {namespace && !scopeOptions?.some((option) => option.id === namespace) && (\n <SelectItem value={namespace}>{namespace}</SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n <div className=\"hidden justify-center group-data-[collapsible=icon]:flex\">\n <ChevronsUpDown className=\"size-4 text-muted-foreground\" />\n </div>\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n );\n}\n\nfunction AdminShellHeader({\n brandingActions,\n isRefreshable,\n onRefresh,\n title,\n}: {\n brandingActions?: React.ReactNode;\n isRefreshable: boolean;\n onRefresh: () => void;\n title: string;\n}) {\n return (\n <header className=\"flex min-h-12 shrink-0 items-center gap-2 border-b bg-background/95 px-3 backdrop-blur supports-[backdrop-filter]:bg-background/80\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>Toggle sidebar</TooltipContent>\n </Tooltip>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Database className=\"size-4 text-muted-foreground\" />\n <h1 className=\"truncate text-sm font-medium\">{title}</h1>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n className=\"size-8\"\n disabled={!isRefreshable}\n onClick={onRefresh}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <RefreshCw className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n {brandingActions}\n </header>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n \n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction cleanupBodyStyles() {\n if (typeof document !== 'undefined' && document.body.style.pointerEvents === 'none') {\n document.body.style.pointerEvents = '';\n }\n}\n\nfunction Sheet({ open, onOpenChange, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n const prevOpenRef = React.useRef(open);\n\n React.useEffect(() => {\n if (prevOpenRef.current === true && open === false) {\n const timeout = setTimeout(cleanupBodyStyles, 350);\n return () => clearTimeout(timeout);\n }\n prevOpenRef.current = open;\n }, [open]);\n\n React.useEffect(() => {\n return () => {\n cleanupBodyStyles();\n };\n }, []);\n\n return <SheetPrimitive.Root data-slot=\"sheet\" open={open} onOpenChange={onOpenChange} {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n aria-describedby={undefined}\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport { cn } from \"../../lib/utils\"\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none transition-colors placeholder:text-muted-foreground focus:ring-2 focus:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n position === \"popper\" && \"translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.ScrollUpButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectPrimitive.ScrollDownButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"absolute right-2 inline-flex items-center justify-center\">\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectItem,\n}\n","import React from \"react\";\nimport { Bot, Brain, Wrench } from \"lucide-react\";\nimport type { AdminAgentSummary } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatMetricValue, formatNumber } from \"../usage/calculations\";\n\nexport function agentsModule(): AdminModule {\n return {\n group: \"configure\",\n icon: Bot,\n id: \"agents\",\n label: \"Agents\",\n navItems: [{\n group: \"configure\",\n icon: Bot,\n id: \"agents\",\n label: \"Agents\",\n order: 10,\n routeId: \"agents\",\n }],\n routes: [\n {\n id: \"agents\",\n title: \"Agents\",\n render: (context) => <AgentsPage context={context} />,\n },\n {\n id: \"agents.detail\",\n title: \"Agent Detail\",\n render: (context) => <AgentDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction AgentsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [agents, setAgents] = React.useState<AdminAgentSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setError(null);\n void context.client.listAgents({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n search: search || undefined,\n }).then((next) => {\n if (active) setAgents(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load agents\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Agents\"\n description=\"Observed agent activity with configuration-ready detail surfaces for model, tools, memory, and instructions.\"\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search agents...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load agents\" description={error} />\n ) : (\n <ResourceTable\n rows={agents}\n getRowKey={(agent) => `${agent.namespace}:${agent.agentId}`}\n onRowClick={(agent) =>\n context.navigate(\"agents.detail\", { agentId: agent.agentId })}\n empty={\n <EmptyState\n icon={Bot}\n title=\"No agents\"\n description=\"Configured or observed agents will appear here.\"\n />\n }\n columns={[\n {\n id: \"agent\",\n header: \"Agent\",\n render: (agent) => (\n <div>\n <div className=\"font-medium\">{agent.displayName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {agent.description ?? agent.agentId}\n </div>\n </div>\n ),\n },\n {\n id: \"configured\",\n header: \"Config\",\n render: (agent) => (\n <StatusBadge\n status={agent.isConfigured ? \"configured\" : \"observed\"}\n />\n ),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (agent) => formatNumber(agent.llmCallCount),\n },\n {\n align: \"right\",\n id: \"tokens\",\n header: \"Tokens\",\n render: (agent) => formatNumber(agent.totalTokens),\n },\n {\n align: \"right\",\n id: \"cost\",\n header: \"Cost\",\n render: (agent) => formatMetricValue(agent.totalCostUsd, \"cost\"),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction AgentDetailPage({ context }: { context: AdminRuntimeContext }) {\n const agentId = context.route.params?.agentId;\n const [agent, setAgent] = React.useState<AdminAgentSummary | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!agentId) return;\n let active = true;\n setError(null);\n void context.client.listAgents({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n search: agentId,\n }).then((agents) => {\n if (active) {\n setAgent(agents.find((candidate) => candidate.agentId === agentId) ?? agents[0] ?? null);\n }\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load agent\");\n });\n return () => {\n active = false;\n };\n }, [agentId, context.client, context.refreshKey, context.scope.namespace]);\n\n if (!agentId) return <EmptyState title=\"Agent not selected\" />;\n if (error) return <EmptyState title=\"Unable to load agent\" description={error} />;\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={agent?.displayName ?? agentId}\n description={agent?.description ?? \"Runtime metrics and configuration-ready surfaces.\"}\n badges={[{ label: agent?.isConfigured ? \"Configured\" : \"Observed only\" }]}\n actions={\n <button\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => context.navigate(\"agents\")}\n type=\"button\"\n >\n Back to agents\n </button>\n }\n />\n <MetricStrip\n items={[\n { icon: Brain, label: \"LLM calls\", value: formatNumber(agent?.llmCallCount ?? 0) },\n { icon: Wrench, label: \"Tool calls\", value: formatNumber(agent?.toolCallMessageCount ?? 0) },\n { icon: Bot, label: \"Tokens\", value: formatNumber(agent?.totalTokens ?? 0) },\n { label: \"Cost\", value: formatMetricValue(agent?.totalCostUsd ?? 0, \"cost\") },\n ]}\n />\n <div className=\"grid gap-4 xl:grid-cols-[1fr_420px]\">\n <div className=\"rounded-lg border bg-background p-4\">\n <h3 className=\"text-sm font-medium\">Configuration Surface</h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Model, fallback, tool, memory, and instruction editors are exposed here for project modules to extend.\n </p>\n </div>\n <JsonPanel title=\"Advanced JSON\" value={agent} minHeight={360} />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport function EmptyState({\n action,\n description,\n icon: Icon,\n title,\n}: {\n action?: React.ReactNode;\n description?: React.ReactNode;\n icon?: LucideIcon;\n title: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-lg border border-dashed bg-background p-8 text-center\">\n {Icon && (\n <Icon className=\"mx-auto mb-3 size-8 text-muted-foreground/60\" />\n )}\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {description && (\n <p className=\"mx-auto mt-2 max-w-md text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { Search } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\n\nexport function FilterBar({\n actions,\n children,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n searchValue,\n}: {\n actions?: React.ReactNode;\n children?: React.ReactNode;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n searchValue?: string;\n}) {\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex min-w-[260px] flex-1 flex-wrap items-center gap-2\">\n {onSearchChange && (\n <div className=\"relative w-full max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"h-8 pl-9\"\n onChange={(event) => onSearchChange(event.target.value)}\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n />\n </div>\n )}\n {children}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport function InspectorPanel({\n children,\n className,\n side,\n}: {\n children: React.ReactNode;\n className?: string;\n side?: React.ReactNode;\n}) {\n return (\n <div\n className={cn(\n \"grid gap-4 xl:grid-cols-[minmax(0,1fr)_360px]\",\n className,\n )}\n >\n <div className=\"min-w-0\">{children}</div>\n {side && <aside className=\"min-w-0\">{side}</aside>}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { AlertCircle, Check, Save } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/textarea\";\n\nexport function JsonPanel({\n minHeight = 280,\n onSave,\n title = \"JSON\",\n value,\n}: {\n minHeight?: number;\n onSave?: (value: Record<string, unknown>) => Promise<void> | void;\n title?: string;\n value: unknown;\n}) {\n const initialJson = useMemo(() => JSON.stringify(value ?? null, null, 2), [value]);\n const [draft, setDraft] = useState(initialJson);\n const [message, setMessage] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n React.useEffect(() => {\n setDraft(initialJson);\n }, [initialJson]);\n\n const handleSave = async () => {\n if (!onSave) return;\n setMessage(null);\n setIsSaving(true);\n try {\n const parsed = JSON.parse(draft) as Record<string, unknown>;\n await onSave(parsed);\n setMessage(\"Saved\");\n } catch (error) {\n setMessage(error instanceof Error ? error.message : \"Invalid JSON\");\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"flex h-10 items-center justify-between border-b px-3\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n <div className=\"flex items-center gap-2\">\n {message && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n {message === \"Saved\"\n ? <Check className=\"size-3 text-emerald-600\" />\n : <AlertCircle className=\"size-3 text-destructive\" />}\n {message}\n </span>\n )}\n {onSave && (\n <Button\n disabled={isSaving}\n onClick={() => void handleSave()}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n <Save className=\"size-3\" />\n Save\n </Button>\n )}\n </div>\n </div>\n <Textarea\n className=\"rounded-none border-0 font-mono text-xs shadow-none focus-visible:ring-0\"\n spellCheck={false}\n style={{ minHeight }}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n readOnly={!onSave}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex min-h-20 w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Card, CardContent } from \"../ui/card\";\n\nexport interface MetricStripItem {\n label: string;\n value: React.ReactNode;\n detail?: React.ReactNode;\n icon?: LucideIcon;\n}\n\nexport function MetricStrip({ items }: { items: MetricStripItem[] }) {\n return (\n <div className=\"grid gap-2 md:grid-cols-2 xl:grid-cols-4\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <Card className=\"rounded-lg py-3 shadow-xs\" key={item.label}>\n <CardContent className=\"flex items-center justify-between gap-3 px-4\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-xs text-muted-foreground\">\n {item.label}\n </p>\n <p className=\"mt-1 truncate text-xl font-semibold tracking-tight\">\n {item.value}\n </p>\n {item.detail && (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {item.detail}\n </p>\n )}\n </div>\n {Icon && (\n <div className=\"rounded-md border bg-muted/50 p-2 text-muted-foreground\">\n <Icon className=\"size-4\" />\n </div>\n )}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import React from \"react\";\nimport { Badge } from \"../ui/badge\";\n\nexport function PageHeader({\n actions,\n badges = [],\n description,\n title,\n}: {\n actions?: React.ReactNode;\n badges?: Array<{ label: string; variant?: \"default\" | \"secondary\" | \"outline\" | \"destructive\" }>;\n description?: React.ReactNode;\n title: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"truncate text-xl font-semibold tracking-tight\">\n {title}\n </h2>\n {badges.map((badge) => (\n <Badge key={badge.label} variant={badge.variant ?? \"outline\"}>\n {badge.label}\n </Badge>\n ))}\n </div>\n {description && (\n <div className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n {description}\n </div>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div className=\"w-full overflow-auto\">\n <table\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return <thead className={cn(\"[&_tr]:border-b\", className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n className={cn(\n \"h-9 px-3 text-left align-middle text-xs font-medium uppercase tracking-wide text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td className={cn(\"px-3 py-2 align-middle\", className)} {...props} />\n );\n}\n\nexport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow };\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport interface ResourceTableColumn<T> {\n id: string;\n header: React.ReactNode;\n align?: \"left\" | \"right\";\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\nexport function ResourceTable<T>({\n columns,\n empty,\n getRowKey,\n onRowClick,\n rows,\n}: {\n columns: Array<ResourceTableColumn<T>>;\n empty?: React.ReactNode;\n getRowKey: (row: T, index: number) => string;\n onRowClick?: (row: T) => void;\n rows: T[];\n}) {\n if (rows.length === 0) {\n return (\n <>\n {empty ?? (\n <EmptyState\n title=\"No records\"\n description=\"Records will appear here when data is available.\"\n />\n )}\n </>\n );\n }\n\n return (\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {columns.map((column) => (\n <TableHead\n className={cn(\n column.align === \"right\" && \"text-right\",\n column.className,\n )}\n key={column.id}\n >\n {column.header}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n className={onRowClick ? \"cursor-pointer\" : undefined}\n key={getRowKey(row, index)}\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => (\n <TableCell\n className={cn(\n column.align === \"right\" && \"text-right\",\n column.className,\n )}\n key={column.id}\n >\n {column.render(row)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import React from \"react\";\nimport { Badge } from \"../ui/badge\";\n\nexport function StatusBadge({ status }: { status?: string | null }) {\n const value = status ?? \"unknown\";\n const variant = value === \"failed\" || value === \"expired\"\n ? \"destructive\"\n : value === \"active\" || value === \"processing\"\n ? \"default\"\n : value === \"completed\" || value === \"archived\"\n ? \"secondary\"\n : \"outline\";\n return <Badge variant={variant}>{value}</Badge>;\n}\n","import type {\n AdminUsageDimension,\n AdminUsageInterval,\n AdminUsageMetricKind,\n AdminUsagePoint,\n AdminUsageTotals,\n} from \"../../api/types\";\nimport type {\n AggregatedUsageRow,\n UsageChartState,\n} from \"./types\";\n\nexport const EMPTY_USAGE_TOTALS: AdminUsageTotals = {\n cacheCreationInputCostUsd: 0,\n cacheCreationInputTokens: 0,\n cacheReadInputCostUsd: 0,\n cacheReadInputTokens: 0,\n inputCostUsd: 0,\n inputTokens: 0,\n outputCostUsd: 0,\n outputTokens: 0,\n reasoningCostUsd: 0,\n reasoningTokens: 0,\n totalCalls: 0,\n totalCostUsd: 0,\n totalTokens: 0,\n};\n\nconst USAGE_CHART_COLORS = [\n \"hsl(var(--primary))\",\n \"hsl(var(--chart-2, 142 76% 36%))\",\n \"hsl(var(--chart-3, 38 92% 50%))\",\n \"hsl(var(--chart-4, 199 89% 48%))\",\n \"hsl(var(--chart-5, 346 77% 49%))\",\n \"hsl(var(--muted-foreground))\",\n];\n\nexport function addUsageTotals(\n target: AdminUsageTotals,\n source: AdminUsageTotals,\n) {\n target.cacheCreationInputCostUsd += source.cacheCreationInputCostUsd;\n target.cacheCreationInputTokens += source.cacheCreationInputTokens;\n target.cacheReadInputCostUsd += source.cacheReadInputCostUsd;\n target.cacheReadInputTokens += source.cacheReadInputTokens;\n target.inputCostUsd += source.inputCostUsd;\n target.inputTokens += source.inputTokens;\n target.outputCostUsd += source.outputCostUsd;\n target.outputTokens += source.outputTokens;\n target.reasoningCostUsd += source.reasoningCostUsd;\n target.reasoningTokens += source.reasoningTokens;\n target.totalCalls += source.totalCalls;\n target.totalCostUsd += source.totalCostUsd;\n target.totalTokens += source.totalTokens;\n}\n\nexport function getUsageTotalValue(\n totals: AdminUsageTotals,\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n if (metricKind === \"calls\") return totals.totalCalls;\n if (metricKind === \"cost\") {\n switch (dimension) {\n case \"input\":\n return totals.inputCostUsd;\n case \"output\":\n return totals.outputCostUsd;\n case \"reasoning\":\n return totals.reasoningCostUsd;\n case \"cacheRead\":\n return totals.cacheReadInputCostUsd;\n case \"cacheWrite\":\n return totals.cacheCreationInputCostUsd;\n case \"total\":\n default:\n return totals.totalCostUsd;\n }\n }\n switch (dimension) {\n case \"input\":\n return totals.inputTokens;\n case \"output\":\n return totals.outputTokens;\n case \"reasoning\":\n return totals.reasoningTokens;\n case \"cacheRead\":\n return totals.cacheReadInputTokens;\n case \"cacheWrite\":\n return totals.cacheCreationInputTokens;\n case \"total\":\n default:\n return totals.totalTokens;\n }\n}\n\nexport function aggregateUsageRows(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n): AggregatedUsageRow[] {\n const totals = new Map<string, AggregatedUsageRow>();\n for (const point of points) {\n const row = totals.get(point.groupKey) ?? {\n ...EMPTY_USAGE_TOTALS,\n groupKey: point.groupKey,\n groupLabel: point.groupLabel,\n value: 0,\n };\n addUsageTotals(row, point);\n row.value = getUsageTotalValue(row, metricKind, dimension);\n totals.set(point.groupKey, row);\n }\n return Array.from(totals.values()).sort((a, b) => b.value - a.value);\n}\n\nexport function buildUsageChartState(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n interval: AdminUsageInterval,\n): UsageChartState {\n const topGroups = topUsageGroups(points, metricKind, dimension);\n const groupIdByKey = new Map(\n topGroups.map((group, index) => [group.key, `series${index + 1}`]),\n );\n const series = topGroups.map((group, index) => ({\n color: USAGE_CHART_COLORS[index % USAGE_CHART_COLORS.length],\n id: groupIdByKey.get(group.key) ?? `series${index + 1}`,\n key: group.key,\n label: group.label,\n }));\n const config = Object.fromEntries(\n series.map((item) => [item.id, {\n color: item.color,\n label: item.label,\n }]),\n );\n const buckets = buildUsageBuckets(points);\n const data = buckets.map((bucket) => {\n const row: Record<string, number | string> = {\n bucket: bucket.bucket,\n label: formatUsageBucket(bucket.bucket, interval),\n };\n for (const item of series) row[item.id] = 0;\n for (const point of bucket.points) {\n const seriesId = groupIdByKey.get(point.groupKey);\n if (!seriesId) continue;\n row[seriesId] = Number(row[seriesId] ?? 0) +\n getUsageTotalValue(point, metricKind, dimension);\n }\n return row;\n });\n return { config, data, series };\n}\n\nfunction buildUsageBuckets(points: AdminUsagePoint[]) {\n const byBucket = new Map<string, AdminUsagePoint[]>();\n for (const point of points) {\n const rows = byBucket.get(point.bucket) ?? [];\n rows.push(point);\n byBucket.set(point.bucket, rows);\n }\n return Array.from(byBucket.entries())\n .map(([bucket, bucketPoints]) => ({ bucket, points: bucketPoints }))\n .sort((a, b) =>\n new Date(a.bucket).getTime() - new Date(b.bucket).getTime()\n );\n}\n\nfunction topUsageGroups(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n const totals = new Map<string, { key: string; label: string; value: number }>();\n for (const point of points) {\n const existing = totals.get(point.groupKey) ?? {\n key: point.groupKey,\n label: point.groupLabel,\n value: 0,\n };\n existing.value += getUsageTotalValue(point, metricKind, dimension);\n totals.set(point.groupKey, existing);\n }\n return Array.from(totals.values())\n .sort((a, b) => b.value - a.value)\n .slice(0, 6);\n}\n\nexport function getUsageRange(\n period: \"24h\" | \"7d\" | \"30d\" | \"custom\",\n customFrom: string,\n customTo: string,\n) {\n if (period === \"custom\") {\n return {\n from: customFrom ? new Date(customFrom).toISOString() : undefined,\n to: customTo ? new Date(customTo).toISOString() : undefined,\n };\n }\n const to = new Date();\n const from = new Date(to);\n if (period === \"24h\") {\n from.setHours(from.getHours() - 24);\n } else if (period === \"30d\") {\n from.setDate(from.getDate() - 30);\n } else {\n from.setDate(from.getDate() - 7);\n }\n return { from: from.toISOString(), to: to.toISOString() };\n}\n\nexport function getUsageDimensionLabel(dimension: AdminUsageDimension) {\n switch (dimension) {\n case \"input\":\n return \"Input\";\n case \"output\":\n return \"Output\";\n case \"reasoning\":\n return \"Reasoning\";\n case \"cacheRead\":\n return \"Cache read\";\n case \"cacheWrite\":\n return \"Cache write\";\n case \"total\":\n default:\n return \"Total\";\n }\n}\n\nexport function getUsageGroupLabel(groupBy: string) {\n switch (groupBy) {\n case \"thread\":\n return \"Thread\";\n case \"namespace\":\n return \"Namespace\";\n case \"provider\":\n return \"Provider\";\n case \"model\":\n return \"Model\";\n case \"participant\":\n default:\n return \"Participant\";\n }\n}\n\nexport function formatUsageBucket(bucket: string, interval: AdminUsageInterval) {\n const date = new Date(bucket);\n if (Number.isNaN(date.getTime())) return bucket;\n if (interval === \"minute\" || interval === \"hour\") {\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: interval === \"minute\" ? \"2-digit\" : undefined,\n });\n }\n if (interval === \"month\") {\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n year: \"numeric\",\n });\n }\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n\nexport function formatPercent(value: number) {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 1,\n style: \"percent\",\n }).format(value);\n}\n\nexport function formatMetricValue(\n value: number,\n metricKind: AdminUsageMetricKind,\n) {\n if (metricKind === \"cost\") {\n const absoluteValue = Math.abs(value);\n const maximumFractionDigits = absoluteValue >= 1\n ? 2\n : absoluteValue >= 0.01\n ? 4\n : 6;\n return new Intl.NumberFormat(undefined, {\n currency: \"USD\",\n maximumFractionDigits,\n minimumFractionDigits: 2,\n style: \"currency\",\n }).format(value);\n }\n return formatNumber(value);\n}\n\nexport function formatCompactMetric(\n value: number,\n metricKind: AdminUsageMetricKind,\n) {\n if (metricKind === \"cost\") {\n return new Intl.NumberFormat(undefined, {\n compactDisplay: \"short\",\n currency: \"USD\",\n maximumFractionDigits: 1,\n notation: \"compact\",\n style: \"currency\",\n }).format(value);\n }\n return new Intl.NumberFormat(undefined, {\n compactDisplay: \"short\",\n maximumFractionDigits: 1,\n notation: \"compact\",\n }).format(value);\n}\n","import React from \"react\";\nimport { Database, Plus, Trash2 } from \"lucide-react\";\nimport type { AdminCollectionItem } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n PageHeader,\n ResourceTable,\n} from \"../../components/patterns\";\n\nexport function collectionsModule(): AdminModule {\n return {\n group: \"data\",\n icon: Database,\n id: \"collections\",\n label: \"Collections\",\n navItems: [{\n group: \"data\",\n icon: Database,\n id: \"collections\",\n label: \"Collections\",\n order: 20,\n routeId: \"collections\",\n }],\n routes: [\n {\n id: \"collections\",\n title: \"Collections\",\n render: (context) => <CollectionsPage context={context} />,\n },\n {\n id: \"collections.detail\",\n title: \"Collection Item\",\n render: (context) => <CollectionDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction CollectionsPage({ context }: { context: AdminRuntimeContext }) {\n const [collections, setCollections] = React.useState<string[]>([]);\n const [selected, setSelected] = React.useState<string | null>(null);\n const [search, setSearch] = React.useState(\"\");\n const [items, setItems] = React.useState<AdminCollectionItem[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n void context.client.listCollections().then((names) => {\n if (!active) return;\n setCollections(names);\n setSelected((current) => current ?? names[0] ?? null);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load collections\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey]);\n\n React.useEffect(() => {\n if (!selected) return;\n let active = true;\n setError(null);\n void context.client.listCollectionItems(selected, {\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setItems(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load collection items\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search, selected]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Collections\"\n description=\"Schema-aware collection browsing with advanced JSON fallback for records that do not have custom editors.\"\n actions={\n selected && (\n <Button\n onClick={() =>\n context.navigate(\"collections.detail\", { collection: selected })}\n size=\"sm\"\n type=\"button\"\n >\n <Plus className=\"size-3\" />\n New\n </Button>\n )\n }\n />\n <div className=\"grid gap-4 lg:grid-cols-[240px_minmax(0,1fr)]\">\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"border-b px-3 py-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n Collections\n </div>\n <div className=\"max-h-[620px] overflow-auto p-1\">\n {collections.map((collection) => (\n <button\n className={`flex w-full items-center rounded-md px-2 py-1.5 text-left text-sm ${\n selected === collection ? \"bg-accent text-accent-foreground\" : \"hover:bg-muted\"\n }`}\n key={collection}\n onClick={() => setSelected(collection)}\n type=\"button\"\n >\n {collection}\n </button>\n ))}\n </div>\n </div>\n <div className=\"space-y-3\">\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder={`Search ${selected ?? \"collection\"}...`}\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load collection\" description={error} />\n ) : selected ? (\n <ResourceTable\n rows={items}\n getRowKey={(item, index) => `${getItemId(item)}:${index}`}\n onRowClick={(item) =>\n context.navigate(\"collections.detail\", {\n collection: selected,\n itemId: getItemId(item),\n })}\n empty={\n <EmptyState\n icon={Database}\n title={`No ${selected} records`}\n description=\"Create a record or adjust the current filters.\"\n />\n }\n columns={[\n {\n id: \"id\",\n header: \"ID\",\n render: (item) => (\n <div className=\"max-w-sm truncate font-mono text-xs\">\n {getItemId(item)}\n </div>\n ),\n },\n {\n id: \"preview\",\n header: \"Preview\",\n render: (item) => (\n <div className=\"max-w-xl truncate text-sm\">\n {getItemPreview(item)}\n </div>\n ),\n },\n ]}\n />\n ) : (\n <EmptyState title=\"No collections\" />\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction CollectionDetailPage({ context }: { context: AdminRuntimeContext }) {\n const collection = context.route.params?.collection;\n const itemId = context.route.params?.itemId ?? null;\n const [item, setItem] = React.useState<AdminCollectionItem | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const isNew = !itemId;\n\n React.useEffect(() => {\n if (!collection || !itemId) {\n setItem(null);\n return;\n }\n let active = true;\n setError(null);\n void context.client.getCollectionItem(collection, itemId, {\n namespace: context.scope.namespace || undefined,\n }).then((next) => {\n if (active) setItem(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load item\");\n });\n return () => {\n active = false;\n };\n }, [collection, context.client, context.refreshKey, context.scope.namespace, itemId]);\n\n if (!collection) return <EmptyState title=\"Collection not selected\" />;\n if (error) return <EmptyState title=\"Unable to load item\" description={error} />;\n\n const Editor = context.collectionEditors[collection];\n const save = async (value: Record<string, unknown>) => {\n if (isNew) {\n const created = await context.client.createCollectionItem(collection, value, {\n namespace: context.scope.namespace || undefined,\n });\n setItem(created);\n context.navigate(\"collections.detail\", {\n collection,\n itemId: getItemId(created),\n });\n return;\n }\n if (!itemId) return;\n const updated = await context.client.updateCollectionItem(collection, itemId, value, {\n namespace: context.scope.namespace || undefined,\n });\n setItem(updated);\n };\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={isNew ? `New ${collection}` : `${collection} / ${itemId}`}\n description=\"Schema-aware editors can override this view. Advanced JSON remains available as a fallback.\"\n actions={\n <div className=\"flex items-center gap-2\">\n {!isNew && itemId && (\n <Button\n onClick={() => {\n void context.client.deleteCollectionItem(collection, itemId, {\n namespace: context.scope.namespace || undefined,\n }).then(() => context.navigate(\"collections\"));\n }}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive\"\n >\n <Trash2 className=\"size-3\" />\n Delete\n </Button>\n )}\n <Button\n onClick={() => context.navigate(\"collections\")}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Back\n </Button>\n </div>\n }\n />\n {Editor\n ? (\n <Editor\n collection={collection}\n context={context}\n isNew={isNew}\n itemId={itemId}\n value={item}\n onSaved={setItem}\n onDeleted={() => context.navigate(\"collections\")}\n />\n )\n : (\n <JsonPanel\n title=\"Advanced JSON\"\n value={item ?? { id: \"\" }}\n onSave={save}\n minHeight={520}\n />\n )}\n </div>\n );\n}\n\nfunction getItemId(item: AdminCollectionItem): string {\n return String(item.id ?? item._id ?? \"\");\n}\n\nfunction getItemPreview(item: AdminCollectionItem): string {\n const name = item.name ?? item.title ?? item.displayName ?? item.label;\n if (typeof name === \"string\") return name;\n const keys = Object.keys(item).filter((key) => key !== \"id\" && key !== \"_id\");\n if (keys.length === 0) return \"(empty)\";\n return keys.slice(0, 4).map((key) =>\n `${key}: ${JSON.stringify(item[key])?.slice(0, 48)}`\n ).join(\", \");\n}\n","import React from \"react\";\nimport { Activity, Search } from \"lucide-react\";\nimport type { AdminQueueEvent } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\n\nexport function eventsModule(): AdminModule {\n return {\n group: \"operate\",\n icon: Activity,\n id: \"events\",\n label: \"Events\",\n navItems: [{\n group: \"operate\",\n icon: Activity,\n id: \"events\",\n label: \"Events\",\n order: 30,\n routeId: \"events\",\n }],\n routes: [{\n id: \"events\",\n title: \"Events\",\n render: (context) => <EventsPage context={context} />,\n }],\n };\n}\n\nfunction EventsPage({ context }: { context: AdminRuntimeContext }) {\n const [threadId, setThreadId] = React.useState(\"\");\n const [status, setStatus] = React.useState(\"\");\n const [type, setType] = React.useState(\"\");\n const [traceId, setTraceId] = React.useState(\"\");\n const [event, setEvent] = React.useState<AdminQueueEvent | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [hasSearched, setHasSearched] = React.useState(false);\n\n const inspect = async () => {\n if (!threadId.trim()) return;\n setHasSearched(true);\n setError(null);\n try {\n const next = await context.client.getThreadEvent(threadId.trim());\n setEvent(next ?? null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Failed to load event\");\n setEvent(null);\n }\n };\n\n const rows = event &&\n (!status || event.status.includes(status)) &&\n (!type || event.eventType.includes(type)) &&\n (!traceId || event.traceId?.includes(traceId))\n ? [event]\n : [];\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Events\"\n description=\"Queue and event inspection. Current backend support is thread-focused; filters are ready for broader event listing.\"\n />\n <FilterBar\n actions={\n <Button\n disabled={!threadId.trim()}\n onClick={() => void inspect()}\n size=\"sm\"\n type=\"button\"\n >\n <Search className=\"size-3\" />\n Inspect\n </Button>\n }\n >\n <Input\n className=\"h-8 w-[220px]\"\n onChange={(event) => setThreadId(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") void inspect();\n }}\n placeholder=\"Thread ID\"\n value={threadId}\n />\n <Input\n className=\"h-8 w-[150px]\"\n onChange={(event) => setStatus(event.target.value)}\n placeholder=\"Status\"\n value={status}\n />\n <Input\n className=\"h-8 w-[180px]\"\n onChange={(event) => setType(event.target.value)}\n placeholder=\"Event type\"\n value={type}\n />\n <Input\n className=\"h-8 w-[180px]\"\n onChange={(event) => setTraceId(event.target.value)}\n placeholder=\"Trace ID\"\n value={traceId}\n />\n </FilterBar>\n {error ? (\n <EmptyState title=\"Unable to inspect event\" description={error} />\n ) : !hasSearched ? (\n <EmptyState\n icon={Activity}\n title=\"Choose a thread\"\n description=\"Enter a thread ID to inspect its next pending event.\"\n />\n ) : (\n <div className=\"grid gap-4 xl:grid-cols-[1fr_420px]\">\n <ResourceTable\n rows={rows}\n getRowKey={(row) => row.id}\n empty={\n <EmptyState\n title=\"No matching event\"\n description=\"No pending event matched the current filters.\"\n />\n }\n columns={[\n {\n id: \"type\",\n header: \"Type\",\n render: (row) => row.eventType,\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (row) => <StatusBadge status={row.status} />,\n },\n {\n id: \"trace\",\n header: \"Trace\",\n render: (row) => row.traceId ?? \"-\",\n },\n {\n id: \"created\",\n header: \"Created\",\n render: (row) => formatDateTime(row.createdAt),\n },\n ]}\n />\n <JsonPanel title=\"Event JSON\" value={event} minHeight={420} />\n </div>\n )}\n </div>\n );\n}\n\nfunction formatDateTime(value: string | null) {\n if (!value) return \"-\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n month: \"short\",\n });\n}\n","import React from \"react\";\nimport {\n Activity,\n AlertTriangle,\n Bot,\n MessageSquare,\n Sparkles,\n Users,\n Wallet,\n} from \"lucide-react\";\nimport type {\n AdminAgentSummary,\n AdminOverview,\n AdminThreadSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatMetricValue, formatNumber } from \"../usage/calculations\";\n\nexport function overviewModule(): AdminModule {\n return {\n group: \"operate\",\n icon: Activity,\n id: \"overview\",\n label: \"Overview\",\n navItems: [{\n group: \"operate\",\n icon: Activity,\n id: \"overview\",\n label: \"Overview\",\n order: 10,\n routeId: \"overview\",\n }],\n routes: [{\n id: \"overview\",\n title: \"Overview\",\n render: (context) => <OverviewPage context={context} />,\n }],\n };\n}\n\nfunction OverviewPage({ context }: { context: AdminRuntimeContext }) {\n const [overview, setOverview] = React.useState<AdminOverview | null>(null);\n const [threads, setThreads] = React.useState<AdminThreadSummary[]>([]);\n const [agents, setAgents] = React.useState<AdminAgentSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void Promise.all([\n context.client.getOverview({\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n }),\n context.client.listThreads({\n limit: 8,\n namespace: context.scope.namespace || undefined,\n }),\n context.client.listAgents({\n limit: 8,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n }),\n ]).then(([nextOverview, nextThreads, nextAgents]) => {\n if (!active) return;\n setOverview(nextOverview);\n setThreads(nextThreads);\n setAgents(nextAgents);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load overview\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace]);\n\n if (error) {\n return <EmptyState title=\"Unable to load overview\" description={error} />;\n }\n\n const queueFailures = (overview?.queueTotals.failed ?? 0) +\n (overview?.queueTotals.expired ?? 0);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Overview\"\n description=\"Operational health, recent activity, and cost signals for the active Copilotz scope.\"\n badges={[\n { label: context.scope.namespace || \"All namespaces\" },\n ...(isLoading ? [{ label: \"Loading\" as const }] : []),\n ]}\n />\n <MetricStrip\n items={[\n {\n detail: `${formatNumber(overview?.threadTotals.active ?? 0)} active`,\n icon: MessageSquare,\n label: \"Threads\",\n value: formatNumber(overview?.threadTotals.total ?? 0),\n },\n {\n detail: `${formatNumber(overview?.participantTotals.agents ?? 0)} agents`,\n icon: Users,\n label: \"Participants\",\n value: formatNumber(overview?.participantTotals.total ?? 0),\n },\n {\n detail: `${formatNumber(overview?.llmTotals.totalCalls ?? 0)} LLM calls`,\n icon: Wallet,\n label: \"Cost\",\n value: formatMetricValue(overview?.llmTotals.totalCostUsd ?? 0, \"cost\"),\n },\n {\n detail: `${formatNumber(queueFailures)} failures/expired`,\n icon: queueFailures > 0 ? AlertTriangle : Sparkles,\n label: \"Queue\",\n value: formatNumber(overview?.queueTotals.total ?? 0),\n },\n ]}\n />\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <section className=\"space-y-3\">\n <PageHeader title=\"Recent Threads\" />\n <ResourceTable\n rows={threads}\n getRowKey={(thread) => thread.threadId}\n onRowClick={(thread) =>\n context.navigate(\"threads.detail\", { threadId: thread.threadId })}\n columns={[\n {\n id: \"name\",\n header: \"Thread\",\n render: (thread) => (\n <div>\n <div className=\"max-w-md truncate font-medium\">\n {thread.name || thread.threadId}\n </div>\n <div className=\"max-w-md truncate text-xs text-muted-foreground\">\n {thread.summary ?? thread.lastMessagePreview ?? \"No summary\"}\n </div>\n </div>\n ),\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (thread) => <StatusBadge status={thread.status} />,\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (thread) => formatNumber(thread.messageCount),\n },\n ]}\n />\n </section>\n <section className=\"space-y-3\">\n <PageHeader title=\"Top Agents\" />\n <ResourceTable\n rows={agents}\n getRowKey={(agent) => `${agent.namespace}:${agent.agentId}`}\n onRowClick={(agent) =>\n context.navigate(\"agents.detail\", { agentId: agent.agentId })}\n columns={[\n {\n id: \"agent\",\n header: \"Agent\",\n render: (agent) => (\n <div className=\"flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <div>\n <div className=\"font-medium\">{agent.displayName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {agent.agentId}\n </div>\n </div>\n </div>\n ),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (agent) => formatNumber(agent.llmCallCount),\n },\n {\n align: \"right\",\n id: \"cost\",\n header: \"Cost\",\n render: (agent) => formatMetricValue(agent.totalCostUsd, \"cost\"),\n },\n ]}\n />\n </section>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Users } from \"lucide-react\";\nimport type {\n AdminParticipantDetail,\n AdminParticipantSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatNumber } from \"../usage/calculations\";\n\nexport function participantsModule(): AdminModule {\n return {\n group: \"data\",\n icon: Users,\n id: \"participants\",\n label: \"Participants\",\n navItems: [{\n group: \"data\",\n icon: Users,\n id: \"participants\",\n label: \"Participants\",\n order: 10,\n routeId: \"participants\",\n }],\n routes: [\n {\n id: \"participants\",\n title: \"Participants\",\n render: (context) => <ParticipantsPage context={context} />,\n },\n {\n id: \"participants.detail\",\n title: \"Participant Detail\",\n render: (context) => <ParticipantDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction ParticipantsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [participants, setParticipants] = React.useState<AdminParticipantSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setError(null);\n void context.client.listParticipants({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setParticipants(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load participants\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Participants\"\n description=\"Humans, agents, and jobs observed by Copilotz across conversations.\"\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search participants...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load participants\" description={error} />\n ) : (\n <ResourceTable\n rows={participants}\n getRowKey={(participant) =>\n `${participant.namespace}:${participant.externalId}`}\n onRowClick={(participant) =>\n context.navigate(\"participants.detail\", {\n participantId: participant.externalId,\n })}\n empty={\n <EmptyState\n icon={Users}\n title=\"No participants\"\n description=\"Participants appear after messages or jobs are processed.\"\n />\n }\n columns={[\n {\n id: \"participant\",\n header: \"Participant\",\n render: (participant) => (\n <div>\n <div className=\"max-w-md truncate font-medium\">\n {participant.displayName}\n </div>\n <div className=\"max-w-md truncate text-xs text-muted-foreground\">\n {participant.externalId}\n </div>\n </div>\n ),\n },\n {\n id: \"type\",\n header: \"Type\",\n render: (participant) => (\n <StatusBadge status={participant.participantType} />\n ),\n },\n {\n id: \"scope\",\n header: \"Scope\",\n render: (participant) =>\n participant.isGlobal ? \"Global\" : participant.namespace,\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (participant) => formatNumber(participant.messageCount),\n },\n {\n align: \"right\",\n id: \"threads\",\n header: \"Threads\",\n render: (participant) => formatNumber(participant.threadCount),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction ParticipantDetailPage({ context }: { context: AdminRuntimeContext }) {\n const participantId = context.route.params?.participantId;\n const [participant, setParticipant] = React.useState<AdminParticipantDetail | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!participantId) return;\n let active = true;\n setError(null);\n void context.client.getCollectionItem(\"participant\", participantId, {\n namespace: context.scope.namespace || undefined,\n }).then((next) => {\n if (active) setParticipant(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load participant\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, participantId]);\n\n if (!participantId) {\n return <EmptyState title=\"Participant not selected\" />;\n }\n if (error) {\n return <EmptyState title=\"Unable to load participant\" description={error} />;\n }\n\n const memories = Array.isArray(participant?.memories)\n ? participant.memories.length\n : 0;\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={String(participant?.displayName ?? participantId)}\n description=\"Participant profile, activity-ready metrics, and advanced record data.\"\n actions={\n <button\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => context.navigate(\"participants\")}\n type=\"button\"\n >\n Back to participants\n </button>\n }\n />\n <MetricStrip\n items={[\n { label: \"Type\", value: String(participant?.participantType ?? \"unknown\") },\n { label: \"Namespace\", value: String(participant?.namespace ?? context.scope.namespace ?? \"global\") },\n { label: \"Memories\", value: formatNumber(memories) },\n ]}\n />\n <JsonPanel title=\"Advanced JSON\" value={participant} minHeight={460} />\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Bot,\n ChevronUp,\n Cpu,\n Loader2,\n MessageSquare,\n User,\n Wrench,\n} from \"lucide-react\";\nimport type {\n AdminMessage,\n AdminMessagePageInfo,\n AdminThreadDetail,\n AdminThreadSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n EmptyState,\n FilterBar,\n InspectorPanel,\n JsonPanel,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatNumber } from \"../usage/calculations\";\n\nconst MESSAGE_PAGE_SIZE = 50;\n\nexport function threadsModule(): AdminModule {\n return {\n group: \"operate\",\n icon: MessageSquare,\n id: \"threads\",\n label: \"Threads\",\n navItems: [{\n group: \"operate\",\n icon: MessageSquare,\n id: \"threads\",\n label: \"Threads\",\n order: 40,\n routeId: \"threads\",\n }],\n routes: [\n {\n id: \"threads\",\n title: \"Threads\",\n render: (context) => <ThreadsPage context={context} />,\n },\n {\n id: \"threads.detail\",\n title: \"Thread Detail\",\n render: (context) => <ThreadDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction ThreadsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [threads, setThreads] = React.useState<AdminThreadSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void context.client.listThreads({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setThreads(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load threads\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Threads\"\n description=\"Search conversations, inspect participants, and drill into message timelines, tool calls, reasoning, and metadata.\"\n badges={isLoading ? [{ label: \"Loading\" }] : []}\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search threads...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load threads\" description={error} />\n ) : (\n <ResourceTable\n rows={threads}\n getRowKey={(thread) => thread.threadId}\n onRowClick={(thread) =>\n context.navigate(\"threads.detail\", { threadId: thread.threadId })}\n empty={\n <EmptyState\n icon={MessageSquare}\n title=\"No threads\"\n description=\"Threads will appear after conversations start flowing.\"\n />\n }\n columns={[\n {\n id: \"thread\",\n header: \"Thread\",\n render: (thread) => (\n <div className=\"min-w-0\">\n <div className=\"max-w-xl truncate font-medium\">\n {thread.name || thread.threadId}\n </div>\n <div className=\"max-w-xl truncate text-xs text-muted-foreground\">\n {thread.summary ?? thread.lastMessagePreview ?? \"No summary yet\"}\n </div>\n </div>\n ),\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (thread) => <StatusBadge status={thread.status} />,\n },\n {\n align: \"right\",\n id: \"participants\",\n header: \"Participants\",\n render: (thread) => formatNumber(thread.participantIds.length),\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (thread) => formatNumber(thread.messageCount),\n },\n {\n id: \"activity\",\n header: \"Last activity\",\n render: (thread) => formatDateTime(thread.lastActivityAt),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction ThreadDetailPage({ context }: { context: AdminRuntimeContext }) {\n const threadId = context.route.params?.threadId;\n if (!threadId) {\n return (\n <EmptyState\n title=\"Thread not selected\"\n description=\"Select a thread from the table to inspect its messages.\"\n />\n );\n }\n return <ThreadInspector context={context} threadId={threadId} />;\n}\n\nfunction ThreadInspector({\n context,\n threadId,\n}: {\n context: AdminRuntimeContext;\n threadId: string;\n}) {\n const [thread, setThread] = React.useState<AdminThreadDetail | null>(null);\n const [messages, setMessages] = React.useState<AdminMessage[]>([]);\n const [pageInfo, setPageInfo] = React.useState<AdminMessagePageInfo | null>(null);\n const [isLoading, setIsLoading] = React.useState(true);\n const [isLoadingMore, setIsLoadingMore] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void Promise.all([\n context.client.getThread(threadId),\n context.client.getThreadMessages(threadId, { limit: MESSAGE_PAGE_SIZE }),\n ]).then(([nextThread, page]) => {\n if (!active) return;\n setThread(nextThread);\n setMessages(page.data);\n setPageInfo(page.pageInfo);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load thread\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, threadId]);\n\n const loadMore = async () => {\n if (!pageInfo?.hasMoreBefore || !pageInfo.oldestMessageId || isLoadingMore) {\n return;\n }\n setIsLoadingMore(true);\n try {\n const page = await context.client.getThreadMessages(threadId, {\n before: pageInfo.oldestMessageId,\n limit: MESSAGE_PAGE_SIZE,\n });\n setMessages((current) => [...page.data, ...current]);\n setPageInfo(page.pageInfo);\n } finally {\n setIsLoadingMore(false);\n }\n };\n\n if (isLoading) {\n return <EmptyState icon={Loader2} title=\"Loading thread\" />;\n }\n if (error) {\n return <EmptyState title=\"Unable to load thread\" description={error} />;\n }\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={thread?.name ?? threadId}\n description={thread?.summary ?? \"Message timeline and runtime metadata.\"}\n badges={[\n { label: thread?.status ?? \"unknown\" },\n { label: `${messages.length}${pageInfo?.hasMoreBefore ? \"+\" : \"\"} messages`, variant: \"secondary\" },\n ]}\n actions={\n <Button\n onClick={() => context.navigate(\"threads\")}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Back to threads\n </Button>\n }\n />\n <InspectorPanel\n side={<JsonPanel title=\"Thread JSON\" value={thread} minHeight={420} />}\n >\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"flex items-center justify-between border-b px-4 py-2\">\n <div className=\"text-sm font-medium\">Timeline</div>\n {pageInfo?.hasMoreBefore && (\n <Button\n disabled={isLoadingMore}\n onClick={() => void loadMore()}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n {isLoadingMore\n ? <Loader2 className=\"size-3 animate-spin\" />\n : <ChevronUp className=\"size-3\" />}\n Load older\n </Button>\n )}\n </div>\n {messages.length === 0 ? (\n <EmptyState title=\"No messages\" description=\"This thread has no messages yet.\" />\n ) : (\n <div className=\"divide-y\">\n {messages.map((message) => (\n <MessageRow key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n </InspectorPanel>\n </div>\n );\n}\n\nfunction MessageRow({ message }: { message: AdminMessage }) {\n const [expanded, setExpanded] = React.useState(false);\n const hasToolCalls =\n Array.isArray(message.toolCalls) && message.toolCalls.length > 0;\n const hasReasoning = Boolean(message.reasoning);\n const hasMetadata = Boolean(message.metadata && Object.keys(message.metadata).length);\n\n return (\n <div className=\"px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <SenderIcon senderType={message.senderType} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2 text-xs\">\n <span className=\"font-medium\">\n {message.senderId ?? message.senderUserId ?? message.senderType}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {message.senderType}\n </Badge>\n {message.targetId && (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n to {message.targetId}\n </Badge>\n )}\n {message.createdAt && (\n <span className=\"text-muted-foreground\">\n {formatDateTime(message.createdAt)}\n </span>\n )}\n </div>\n {message.content && (\n <p className=\"mt-1 whitespace-pre-wrap break-words text-sm\">\n {message.content}\n </p>\n )}\n {(hasToolCalls || hasReasoning || hasMetadata) && (\n <div className=\"mt-2\">\n <button\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => setExpanded((value) => !value)}\n type=\"button\"\n >\n {hasToolCalls && <Wrench className=\"size-3\" />}\n {hasReasoning && !hasToolCalls && <Cpu className=\"size-3\" />}\n Details\n </button>\n {expanded && (\n <pre className=\"mt-2 max-h-72 overflow-auto rounded-md bg-muted p-3 text-xs\">\n {JSON.stringify({\n ...(hasToolCalls ? { toolCalls: message.toolCalls } : {}),\n ...(hasReasoning ? { reasoning: message.reasoning } : {}),\n ...(hasMetadata ? { metadata: message.metadata } : {}),\n }, null, 2)}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SenderIcon({ senderType }: { senderType: string }) {\n const base = \"flex size-7 shrink-0 items-center justify-center rounded-full\";\n switch (senderType) {\n case \"agent\":\n return <div className={cn(base, \"bg-primary/10 text-primary\")}><Bot className=\"size-3.5\" /></div>;\n case \"user\":\n return <div className={cn(base, \"bg-secondary text-secondary-foreground\")}><User className=\"size-3.5\" /></div>;\n case \"tool\":\n return <div className={cn(base, \"bg-muted text-muted-foreground\")}><Wrench className=\"size-3.5\" /></div>;\n default:\n return <div className={cn(base, \"bg-muted text-muted-foreground\")}><Cpu className=\"size-3.5\" /></div>;\n }\n}\n\nfunction formatDateTime(value: string | null) {\n if (!value) return \"No activity\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n month: \"short\",\n });\n}\n","import React from \"react\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { Activity, BarChart3, DollarSign, Sparkles } from \"lucide-react\";\nimport type {\n AdminUsageAttribution,\n AdminUsageDimension,\n AdminUsageGroupBy,\n AdminUsageInterval,\n AdminUsageMetricKind,\n AdminUsageResponse,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport {\n ChartContainer,\n ChartLegendContent,\n ChartTooltipContent,\n} from \"../../components/ui/chart\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n EmptyState,\n FilterBar,\n MetricStrip,\n PageHeader,\n ResourceTable,\n} from \"../../components/patterns\";\nimport {\n aggregateUsageRows,\n buildUsageChartState,\n EMPTY_USAGE_TOTALS,\n formatCompactMetric,\n formatMetricValue,\n formatPercent,\n getUsageDimensionLabel,\n getUsageGroupLabel,\n getUsageRange,\n getUsageTotalValue,\n} from \"./calculations\";\nimport type { AggregatedUsageRow } from \"./types\";\n\nconst USAGE_DIMENSIONS: AdminUsageDimension[] = [\n \"total\",\n \"input\",\n \"output\",\n \"reasoning\",\n \"cacheRead\",\n \"cacheWrite\",\n];\n\nexport function usageModule(): AdminModule {\n return {\n group: \"operate\",\n icon: BarChart3,\n id: \"usage\",\n label: \"Usage\",\n navItems: [{\n group: \"operate\",\n icon: BarChart3,\n id: \"usage\",\n label: \"Usage\",\n order: 20,\n routeId: \"usage\",\n }],\n routes: [{\n id: \"usage\",\n title: \"Usage\",\n render: (context) => <UsagePage context={context} />,\n }],\n };\n}\n\nfunction UsagePage({ context }: { context: AdminRuntimeContext }) {\n const [period, setPeriod] = React.useState<\"24h\" | \"7d\" | \"30d\" | \"custom\">(\n \"7d\",\n );\n const [interval, setInterval] = React.useState<AdminUsageInterval>(\"day\");\n const [metricKind, setMetricKind] = React.useState<AdminUsageMetricKind>(\n \"cost\",\n );\n const [dimension, setDimension] = React.useState<AdminUsageDimension>(\"total\");\n const [groupBy, setGroupBy] = React.useState<AdminUsageGroupBy>(\"participant\");\n const [attribution, setAttribution] = React.useState<AdminUsageAttribution>(\n \"initiatedBy\",\n );\n const [participantType, setParticipantType] = React.useState<\n \"all\" | \"human\" | \"agent\" | \"job\"\n >(\"all\");\n const [threadId, setThreadId] = React.useState(\"\");\n const [participantId, setParticipantId] = React.useState(\"\");\n const [provider, setProvider] = React.useState(\"\");\n const [model, setModel] = React.useState(\"\");\n const [customFrom, setCustomFrom] = React.useState(\"\");\n const [customTo, setCustomTo] = React.useState(\"\");\n const [usage, setUsage] = React.useState<AdminUsageResponse | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n const range = React.useMemo(\n () => getUsageRange(period, customFrom, customTo),\n [customFrom, customTo, period],\n );\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void context.client.getUsage({\n attribution,\n from: range.from,\n groupBy,\n interval,\n metric: metricKind,\n model: emptyToUndefined(model),\n namespace: context.scope.namespace || undefined,\n participantId: emptyToUndefined(participantId),\n participantType,\n provider: emptyToUndefined(provider),\n threadId: emptyToUndefined(threadId),\n to: range.to,\n }).then((next) => {\n if (active) setUsage(next);\n }).catch((cause) => {\n if (active) {\n setError(cause instanceof Error ? cause.message : \"Failed to load usage\");\n setUsage(null);\n }\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [\n attribution,\n context.client,\n context.refreshKey,\n context.scope.namespace,\n groupBy,\n interval,\n metricKind,\n model,\n participantId,\n participantType,\n provider,\n range.from,\n range.to,\n threadId,\n ]);\n\n const points = usage?.points ?? [];\n const totals = usage?.totals ?? EMPTY_USAGE_TOTALS;\n const chartState = React.useMemo(\n () => buildUsageChartState(points, metricKind, dimension, interval),\n [dimension, interval, metricKind, points],\n );\n const rows = React.useMemo(\n () => aggregateUsageRows(points, metricKind, dimension),\n [dimension, metricKind, points],\n );\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Usage\"\n description=\"Inspect cost, token, and call attribution across namespaces, models, participants, threads, and providers.\"\n badges={[\n { label: period },\n { label: getUsageGroupLabel(groupBy), variant: \"secondary\" },\n ...(isLoading ? [{ label: \"Loading\" as const }] : []),\n ]}\n />\n <FilterBar>\n <UsageSelect\n label=\"Period\"\n onValueChange={(value) => setPeriod(value as typeof period)}\n options={[\"24h\", \"7d\", \"30d\", \"custom\"]}\n value={period}\n />\n <UsageSelect\n label=\"Bucket\"\n onValueChange={(value) => setInterval(value as AdminUsageInterval)}\n options={[\"minute\", \"hour\", \"day\", \"week\", \"month\"]}\n value={interval}\n />\n <UsageSelect\n label=\"Metric\"\n onValueChange={(value) => setMetricKind(value as AdminUsageMetricKind)}\n options={[\"cost\", \"tokens\", \"calls\"]}\n value={metricKind}\n />\n <UsageSelect\n label=\"Group\"\n onValueChange={(value) => setGroupBy(value as AdminUsageGroupBy)}\n options={[\"participant\", \"thread\", \"namespace\", \"provider\", \"model\"]}\n value={groupBy}\n />\n <UsageSelect\n label=\"Attribution\"\n onValueChange={(value) =>\n setAttribution(value as AdminUsageAttribution)}\n options={[\"initiatedBy\", \"generatedBy\"]}\n value={attribution}\n />\n <UsageSelect\n label=\"Dimension\"\n onValueChange={(value) =>\n setDimension(value as AdminUsageDimension)}\n options={USAGE_DIMENSIONS}\n value={dimension}\n formatOption={getUsageDimensionLabel}\n />\n </FilterBar>\n <FilterBar>\n {period === \"custom\" && (\n <>\n <Input\n className=\"h-8 w-[190px]\"\n onChange={(event) => setCustomFrom(event.target.value)}\n type=\"datetime-local\"\n value={customFrom}\n />\n <Input\n className=\"h-8 w-[190px]\"\n onChange={(event) => setCustomTo(event.target.value)}\n type=\"datetime-local\"\n value={customTo}\n />\n </>\n )}\n <UsageSelect\n label=\"Type\"\n onValueChange={(value) =>\n setParticipantType(value as typeof participantType)}\n options={[\"all\", \"human\", \"agent\", \"job\"]}\n value={participantType}\n />\n <Input\n className=\"h-8 w-[170px]\"\n onChange={(event) => setThreadId(event.target.value)}\n placeholder=\"Thread ID\"\n value={threadId}\n />\n <Input\n className=\"h-8 w-[170px]\"\n onChange={(event) => setParticipantId(event.target.value)}\n placeholder=\"Participant ID\"\n value={participantId}\n />\n <Input\n className=\"h-8 w-[140px]\"\n onChange={(event) => setProvider(event.target.value)}\n placeholder=\"Provider\"\n value={provider}\n />\n <Input\n className=\"h-8 w-[140px]\"\n onChange={(event) => setModel(event.target.value)}\n placeholder=\"Model\"\n value={model}\n />\n </FilterBar>\n <MetricStrip\n items={[\n {\n detail: `${totals.totalCalls} calls`,\n icon: DollarSign,\n label: \"Cost\",\n value: formatMetricValue(totals.totalCostUsd, \"cost\"),\n },\n {\n detail: `${formatMetricValue(totals.inputTokens, \"tokens\")} input`,\n icon: Activity,\n label: \"Tokens\",\n value: formatMetricValue(totals.totalTokens, \"tokens\"),\n },\n {\n detail: `${formatMetricValue(totals.reasoningTokens, \"tokens\")} reasoning`,\n icon: Sparkles,\n label: \"Calls\",\n value: formatMetricValue(totals.totalCalls, \"calls\"),\n },\n ]}\n />\n {error ? (\n <EmptyState title=\"Unable to load usage\" description={error} />\n ) : chartState.data.length === 0 ? (\n <EmptyState\n title=\"No usage\"\n description=\"Usage records will appear here when provider-native usage is captured.\"\n />\n ) : (\n <>\n <Card className=\"h-[320px] py-3\">\n <CardContent className=\"h-full px-3\">\n <UsageChart chartState={chartState} metricKind={metricKind} />\n </CardContent>\n </Card>\n <UsageRowsTable\n dimension={dimension}\n groupBy={groupBy}\n metricKind={metricKind}\n rows={rows}\n totals={totals}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction UsageSelect<T extends string>({\n formatOption,\n label,\n onValueChange,\n options,\n value,\n}: {\n formatOption?: (value: T) => string;\n label: string;\n onValueChange: (value: string) => void;\n options: T[];\n value: T;\n}) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger className=\"h-8 w-[132px] text-xs\" aria-label={label}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option} value={option}>\n {formatOption ? formatOption(option) : option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction UsageChart({\n chartState,\n metricKind,\n}: {\n chartState: ReturnType<typeof buildUsageChartState>;\n metricKind: AdminUsageMetricKind;\n}) {\n return (\n <ChartContainer className=\"h-full w-full\" config={chartState.config}>\n <BarChart accessibilityLayer data={chartState.data} margin={{ left: 8, right: 8, top: 12 }}>\n <CartesianGrid vertical={false} />\n <XAxis dataKey=\"label\" tickLine={false} axisLine={false} tickMargin={10} />\n <YAxis\n axisLine={false}\n tickFormatter={(value) => formatCompactMetric(Number(value), metricKind)}\n tickLine={false}\n width={64}\n />\n <RechartsTooltip\n content={\n <ChartTooltipContent\n formatter={(value) =>\n formatMetricValue(Number(value), metricKind)}\n labelFormatter={(value) => String(value ?? \"\")}\n />\n }\n cursor={false}\n />\n <Legend content={<ChartLegendContent className=\"justify-center pt-3\" />} />\n {chartState.series.map((series) => (\n <Bar\n dataKey={series.id}\n fill={`var(--color-${series.id})`}\n key={series.id}\n radius={[4, 4, 0, 0]}\n stackId=\"usage\"\n />\n ))}\n </BarChart>\n </ChartContainer>\n );\n}\n\nfunction UsageRowsTable({\n dimension,\n groupBy,\n metricKind,\n rows,\n totals,\n}: {\n dimension: AdminUsageDimension;\n groupBy: AdminUsageGroupBy;\n metricKind: AdminUsageMetricKind;\n rows: AggregatedUsageRow[];\n totals: typeof EMPTY_USAGE_TOTALS;\n}) {\n const totalValue = getUsageTotalValue(totals, metricKind, dimension);\n return (\n <ResourceTable\n rows={rows.slice(0, 80)}\n getRowKey={(row) => row.groupKey}\n columns={[\n {\n id: \"group\",\n header: getUsageGroupLabel(groupBy),\n render: (row) => (\n <div className=\"min-w-0\">\n <div className=\"max-w-80 truncate font-medium\">{row.groupLabel}</div>\n {row.groupKey !== row.groupLabel && (\n <div className=\"max-w-80 truncate text-xs text-muted-foreground\">\n {row.groupKey}\n </div>\n )}\n </div>\n ),\n },\n {\n align: \"right\",\n id: \"value\",\n header: `${getUsageDimensionLabel(dimension)} ${metricKind}`,\n render: (row) => formatMetricValue(row.value, metricKind),\n },\n {\n align: \"right\",\n id: \"share\",\n header: \"Share\",\n render: (row) => formatPercent(totalValue > 0 ? row.value / totalValue : 0),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (row) => formatMetricValue(row.totalCalls, \"calls\"),\n },\n {\n align: \"right\",\n id: \"input\",\n header: \"Input\",\n render: (row) =>\n formatMetricValue(getUsageTotalValue(row, metricKind, \"input\"), metricKind),\n },\n {\n align: \"right\",\n id: \"output\",\n header: \"Output\",\n render: (row) =>\n formatMetricValue(getUsageTotalValue(row, metricKind, \"output\"), metricKind),\n },\n ]}\n />\n );\n}\n\nfunction emptyToUndefined(value: string): string | undefined {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n","import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type ChartConfig = Record<\n string,\n {\n label: string;\n color: string;\n }\n>;\n\nconst ChartContext = React.createContext<ChartConfig | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n if (!context) {\n throw new Error(\"useChart must be used within a ChartContainer\");\n }\n return context;\n}\n\nfunction ChartContainer({\n id,\n className,\n config,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"];\n}) {\n const uniqueId = React.useId();\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={config}>\n <div\n data-chart={chartId}\n className={cn(\n \"flex aspect-auto justify-center text-xs text-muted-foreground [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/70 [&_.recharts-cursor]:fill-muted [&_.recharts-legend-wrapper]:text-muted-foreground [&_.recharts-tooltip-cursor]:fill-muted\",\n className,\n )}\n {...props}\n >\n <style>\n {Object.entries(config)\n .map(([key, item]) => {\n return `[data-chart=${chartId}] { --color-${key}: ${item.color}; }`;\n })\n .join(\"\\n\")}\n </style>\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n formatter,\n labelFormatter,\n}: {\n active?: boolean;\n payload?: Array<{\n color?: string;\n dataKey?: string | number;\n name?: string | number;\n value?: number | string;\n }>;\n label?: string | number;\n className?: string;\n formatter?: (value: number | string) => string;\n labelFormatter?: (value: string | number | undefined) => string;\n}) {\n const config = useChart();\n if (!active || !payload?.length) return null;\n\n const total = payload.reduce((sum, item) => {\n const value = typeof item.value === \"number\"\n ? item.value\n : Number(item.value ?? 0);\n return sum + (Number.isFinite(value) ? value : 0);\n }, 0);\n\n return (\n <div\n className={cn(\n \"min-w-44 rounded-lg border bg-popover px-3 py-2 text-popover-foreground shadow-md\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center justify-between gap-4 border-b pb-2\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n {labelFormatter ? labelFormatter(label) : label}\n </p>\n <p className=\"text-xs font-semibold text-foreground\">\n {formatter ? formatter(total) : total}\n </p>\n </div>\n <div className=\"space-y-1.5\">\n {payload\n .filter((item) => Number(item.value ?? 0) > 0)\n .map((item) => {\n const key = String(item.dataKey ?? item.name ?? \"\");\n const itemConfig = config[key];\n const color = item.color ?? itemConfig?.color ?? \"currentColor\";\n return (\n <div\n className=\"grid grid-cols-[0.6rem_1fr_auto] items-center gap-2\"\n key={key}\n >\n <span\n className=\"size-2 rounded-[2px]\"\n style={{ backgroundColor: color }}\n />\n <span className=\"max-w-48 truncate text-muted-foreground\">\n {itemConfig?.label ?? item.name ?? key}\n </span>\n <span className=\"font-medium text-foreground\">\n {formatter ? formatter(item.value ?? 0) : item.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ChartLegendContent({\n payload,\n className,\n}: {\n payload?: Array<{\n color?: string;\n dataKey?: string | number;\n value?: string | number;\n }>;\n className?: string;\n}) {\n const config = useChart();\n if (!payload?.length) return null;\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", className)}>\n {payload.map((item) => {\n const key = String(item.dataKey ?? item.value ?? \"\");\n const itemConfig = config[key];\n return (\n <div className=\"flex items-center gap-2\" key={key}>\n <span\n className=\"size-2 rounded-[2px]\"\n style={{\n backgroundColor: item.color ?? itemConfig?.color ??\n \"currentColor\",\n }}\n />\n <span className=\"max-w-52 truncate text-xs text-muted-foreground\">\n {itemConfig?.label ?? item.value ?? key}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport { ChartContainer, ChartLegendContent, ChartTooltipContent };\n","import type { AdminModule } from \"../core/types\";\nimport { agentsModule } from \"./agents\";\nimport { collectionsModule } from \"./collections\";\nimport { eventsModule } from \"./events\";\nimport { overviewModule } from \"./overview\";\nimport { participantsModule } from \"./participants\";\nimport { threadsModule } from \"./threads\";\nimport { usageModule } from \"./usage\";\n\nexport function defaultCopilotzModules(): AdminModule[] {\n return [\n overviewModule(),\n usageModule(),\n eventsModule(),\n threadsModule(),\n agentsModule(),\n participantsModule(),\n collectionsModule(),\n ];\n}\n\nexport { agentsModule } from \"./agents\";\nexport { collectionsModule } from \"./collections\";\nexport { eventsModule } from \"./events\";\nexport { overviewModule } from \"./overview\";\nexport { participantsModule } from \"./participants\";\nexport { threadsModule } from \"./threads\";\nexport { usageModule } from \"./usage\";\nexport * from \"./usage/calculations\";\nexport type * from \"./usage/types\";\n","import type {\n AdminModule,\n AdminModuleGroup,\n AdminNavItem,\n AdminPermissions,\n AdminRouteDefinition,\n CollectionEditor,\n} from \"./types\";\n\nexport const ADMIN_GROUP_LABELS: Record<AdminModuleGroup, string> = {\n operate: \"Operate\",\n configure: \"Configure\",\n data: \"Data\",\n extensions: \"Extensions\",\n};\n\nexport const ADMIN_GROUP_ORDER: AdminModuleGroup[] = [\n \"operate\",\n \"configure\",\n \"data\",\n \"extensions\",\n];\n\nexport function canAccessAdminPermission(\n permissions: AdminPermissions | undefined,\n permission?: string,\n action = \"view\",\n): boolean {\n if (!permission) return true;\n return permissions?.canAccess ? permissions.canAccess(permission, action) : true;\n}\n\nexport function collectAdminRoutes(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): Map<string, AdminRouteDefinition> {\n const routes = new Map<string, AdminRouteDefinition>();\n for (const module of modules) {\n for (const route of module.routes) {\n if (!canAccessAdminPermission(permissions, route.permission)) continue;\n routes.set(route.id, route);\n }\n }\n return routes;\n}\n\nexport function collectAdminNavItems(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): AdminNavItem[] {\n const items: AdminNavItem[] = [];\n for (const module of modules) {\n const navItems = module.navItems?.length\n ? module.navItems\n : module.routes.slice(0, 1).map((route) => ({\n id: `${module.id}:default`,\n label: module.label,\n routeId: route.id,\n group: module.group,\n icon: module.icon,\n permission: route.permission,\n }));\n\n for (const item of navItems) {\n if (!canAccessAdminPermission(permissions, item.permission)) continue;\n items.push({\n ...item,\n group: item.group ?? module.group ?? \"extensions\",\n icon: item.icon ?? module.icon,\n });\n }\n }\n\n return items.sort((a, b) => {\n const groupDelta = ADMIN_GROUP_ORDER.indexOf(a.group ?? \"extensions\") -\n ADMIN_GROUP_ORDER.indexOf(b.group ?? \"extensions\");\n if (groupDelta !== 0) return groupDelta;\n return (a.order ?? 100) - (b.order ?? 100) ||\n a.label.localeCompare(b.label);\n });\n}\n\nexport function collectCollectionEditors(\n modules: AdminModule[],\n): Record<string, CollectionEditor> {\n const editors: Record<string, CollectionEditor> = {};\n for (const module of modules) {\n Object.assign(editors, module.collectionEditors ?? {});\n }\n return editors;\n}\n\nexport function firstAccessibleRoute(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): string {\n const navItem = collectAdminNavItems(modules, permissions)[0];\n if (navItem) return navItem.routeId;\n for (const module of modules) {\n const route = module.routes.find((candidate) =>\n canAccessAdminPermission(permissions, candidate.permission)\n );\n if (route) return route.id;\n }\n return \"overview\";\n}\n","import React, { createContext, useContext } from \"react\";\nimport type { AdminRuntimeContext } from \"./types\";\n\nconst AdminContext = createContext<AdminRuntimeContext | null>(null);\n\nexport function AdminProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: AdminRuntimeContext;\n}) {\n return (\n <AdminContext.Provider value={value}>\n {children}\n </AdminContext.Provider>\n );\n}\n\nexport function useAdmin(): AdminRuntimeContext {\n const context = useContext(AdminContext);\n if (!context) {\n throw new Error(\"useAdmin must be used inside CopilotzAdmin\");\n }\n return context;\n}\n","import type { LegacyAdminConfig } from \"./core/types\";\n\nexport const defaultAdminConfig: LegacyAdminConfig = {\n baseUrl: \"\",\n branding: {\n subtitle: \"Operate and configure Copilotz projects\",\n title: \"Copilotz Admin\",\n },\n namespace: \"\",\n};\n\nexport function mergeAdminConfig(\n baseConfig: LegacyAdminConfig = defaultAdminConfig,\n userConfig?: LegacyAdminConfig,\n): LegacyAdminConfig {\n return {\n ...baseConfig,\n ...(userConfig ?? {}),\n branding: {\n ...(baseConfig.branding ?? {}),\n ...(userConfig?.branding ?? {}),\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createAdminClient } from \"./api/client\";\nimport type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminDatePreset,\n AdminOverview,\n AdminParticipantSummary,\n AdminThreadSummary,\n RequestHeadersProvider,\n} from \"./api/types\";\n\nexport interface UseCopilotzAdminOptions {\n agentSearch?: string;\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n interval?: AdminActivityInterval;\n namespace?: string;\n participantSearch?: string;\n range?: AdminDatePreset;\n threadSearch?: string;\n}\n\nexport interface UseCopilotzAdminResult {\n activity: AdminActivityPoint[];\n agents: AdminAgentSummary[];\n error: Error | null;\n filters: UseCopilotzAdminOptions & {\n interval: AdminActivityInterval;\n range: AdminDatePreset;\n };\n isLoading: boolean;\n overview: AdminOverview | null;\n participants: AdminParticipantSummary[];\n refresh: () => Promise<void>;\n setInterval: (interval: AdminActivityInterval) => void;\n setRange: (range: AdminDatePreset) => void;\n threads: AdminThreadSummary[];\n}\n\n/** @deprecated Prefer the module-based CopilotzAdmin shell and createAdminClient. */\nexport function useCopilotzAdmin(\n options: UseCopilotzAdminOptions = {},\n): UseCopilotzAdminResult {\n const [range, setRange] = useState<AdminDatePreset>(options.range ?? \"7d\");\n const [interval, setInterval] = useState<AdminActivityInterval>(\n options.interval ?? \"day\",\n );\n const [overview, setOverview] = useState<AdminOverview | null>(null);\n const [activity, setActivity] = useState<AdminActivityPoint[]>([]);\n const [threads, setThreads] = useState<AdminThreadSummary[]>([]);\n const [participants, setParticipants] = useState<AdminParticipantSummary[]>([]);\n const [agents, setAgents] = useState<AdminAgentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const client = useMemo(\n () =>\n createAdminClient({\n baseUrl: options.baseUrl,\n getRequestHeaders: options.getRequestHeaders,\n }),\n [options.baseUrl, options.getRequestHeaders],\n );\n\n const fetchAll = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const [\n nextOverview,\n nextActivity,\n nextThreads,\n nextParticipants,\n nextAgents,\n ] = await Promise.all([\n client.getOverview({ namespace: options.namespace, range }),\n client.getActivity({ interval, namespace: options.namespace, range }),\n client.listThreads({\n namespace: options.namespace,\n search: options.threadSearch,\n }),\n client.listParticipants({\n namespace: options.namespace,\n search: options.participantSearch,\n }),\n client.listAgents({\n namespace: options.namespace,\n range,\n search: options.agentSearch,\n }),\n ]);\n setOverview(nextOverview);\n setActivity(nextActivity);\n setThreads(nextThreads);\n setParticipants(nextParticipants);\n setAgents(nextAgents);\n } catch (cause) {\n setError(cause instanceof Error\n ? cause\n : new Error(\"Failed to load admin data\"));\n } finally {\n setIsLoading(false);\n }\n }, [\n client,\n interval,\n options.agentSearch,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n range,\n ]);\n\n useEffect(() => {\n void fetchAll();\n }, [fetchAll]);\n\n return {\n activity,\n agents,\n error,\n filters: {\n ...options,\n interval,\n range,\n },\n isLoading,\n overview,\n participants,\n refresh: fetchAll,\n setInterval,\n setRange,\n threads,\n };\n}\n"],"mappings":"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","names":["React","useMemo","useState","Bot","Database","React","Slot","cva","jsx","jsx","React","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","open","jsx","Slot","jsx","cva","Slot","jsxs","React","jsx","jsxs","jsxs","jsx","React","jsx","jsxs","Icon","jsx","jsxs","jsx","jsxs","React","useMemo","useState","Check","jsx","jsx","jsxs","useMemo","useState","React","Check","jsx","jsx","jsx","jsxs","Icon","Slot","cva","jsx","cva","Slot","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","React","React","jsx","jsxs","React","React","Search","jsx","jsxs","React","Search","event","React","Activity","Bot","jsx","jsxs","Activity","React","Bot","React","Users","jsx","jsxs","Users","React","React","Bot","ChevronUp","MessageSquare","Wrench","jsx","jsxs","MessageSquare","React","formatDateTime","ChevronUp","Wrench","Bot","React","Activity","Sparkles","React","jsx","jsxs","Fragment","jsx","jsxs","React","Activity","Sparkles","createContext","useContext","jsx","jsx","jsxs","useMemo","useState","Bot","React","Icon","Database","useCallback","useEffect","useMemo","useState","useState","useMemo","useCallback","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/client.ts","../src/core/CopilotzAdmin.tsx","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/select.tsx","../src/modules/agents/index.tsx","../src/components/patterns/EmptyState.tsx","../src/components/patterns/FilterBar.tsx","../src/components/patterns/InspectorPanel.tsx","../src/components/patterns/JsonPanel.tsx","../src/components/ui/textarea.tsx","../src/components/ui/card.tsx","../src/components/patterns/MetricStrip.tsx","../src/components/ui/badge.tsx","../src/components/patterns/PageHeader.tsx","../src/components/ui/table.tsx","../src/components/patterns/ResourceTable.tsx","../src/components/patterns/StatusBadge.tsx","../src/modules/usage/calculations.ts","../src/modules/collections/index.tsx","../src/modules/events/index.tsx","../src/modules/overview/index.tsx","../src/modules/participants/index.tsx","../src/modules/threads/index.tsx","../src/modules/usage/index.tsx","../src/components/ui/chart.tsx","../src/modules/index.ts","../src/core/registry.ts","../src/core/scope.tsx","../src/config.ts","../src/useCopilotzAdmin.ts"],"sourcesContent":["import type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminCollectionItem,\n AdminDatePreset,\n AdminMessage,\n AdminMessagePage,\n AdminMessagePageInfo,\n AdminOverview,\n AdminParticipantDetail,\n AdminParticipantSummary,\n AdminQueueEvent,\n AdminThreadDetail,\n AdminThreadSummary,\n AdminUsageFilters,\n AdminUsageResponse,\n RequestHeadersProvider,\n} from \"./types\";\n\nexport interface AdminClientPaths {\n adminBase: string;\n collectionsBase: string;\n threadsBase: string;\n}\n\nexport interface AdminClientOptions {\n baseUrl?: string;\n paths?: Partial<AdminClientPaths>;\n getRequestHeaders?: RequestHeadersProvider;\n}\n\nexport interface AdminListOptions {\n namespace?: string;\n search?: string;\n limit?: number;\n offset?: number;\n before?: string;\n after?: string;\n filter?: Record<string, unknown>;\n sort?: Record<string, \"asc\" | \"desc\">;\n populate?: string[];\n}\n\nexport interface CopilotzAdminClient {\n paths: AdminClientPaths;\n getOverview(\n options?: { range?: AdminDatePreset; namespace?: string },\n ): Promise<AdminOverview>;\n getActivity(\n options?: {\n range?: AdminDatePreset;\n interval?: AdminActivityInterval;\n namespace?: string;\n },\n ): Promise<AdminActivityPoint[]>;\n getUsage(filters?: AdminUsageFilters): Promise<AdminUsageResponse>;\n listThreads(options?: AdminListOptions): Promise<AdminThreadSummary[]>;\n listParticipants(\n options?: AdminListOptions,\n ): Promise<AdminParticipantSummary[]>;\n listAgents(\n options?: AdminListOptions & { range?: AdminDatePreset },\n ): Promise<AdminAgentSummary[]>;\n getThread(threadId: string): Promise<AdminThreadDetail>;\n getThreadMessages(\n threadId: string,\n options?: { limit?: number; before?: string },\n ): Promise<AdminMessagePage>;\n getThreadEvent(threadId: string): Promise<AdminQueueEvent | undefined>;\n listCollections(): Promise<string[]>;\n listCollectionItems(\n collection: string,\n options?: AdminListOptions,\n ): Promise<AdminCollectionItem[]>;\n getCollectionItem(\n collection: string,\n itemId: string,\n options?: { namespace?: string; populate?: string[] },\n ): Promise<AdminCollectionItem>;\n createCollectionItem(\n collection: string,\n data: Record<string, unknown>,\n options?: { namespace?: string },\n ): Promise<AdminCollectionItem>;\n updateCollectionItem(\n collection: string,\n itemId: string,\n data: Record<string, unknown>,\n options?: { namespace?: string },\n ): Promise<AdminCollectionItem>;\n deleteCollectionItem(\n collection: string,\n itemId: string,\n options?: { namespace?: string },\n ): Promise<void>;\n}\n\nconst DEFAULT_PATHS: AdminClientPaths = {\n adminBase: \"/v1/admin\",\n collectionsBase: \"/v1/collections\",\n threadsBase: \"/v1/threads\",\n};\n\nfunction resolveBaseUrl(baseUrl?: string): string {\n const candidate = (baseUrl && baseUrl.length > 0 ? baseUrl : \"/api\")\n .replace(/\\/$/, \"\");\n return candidate.startsWith(\"http\") || candidate.startsWith(\"/\")\n ? candidate\n : `/${candidate}`;\n}\n\nfunction getRangeWindow(range: AdminDatePreset = \"7d\") {\n const to = new Date();\n const from = new Date(to);\n if (range === \"24h\") {\n from.setHours(from.getHours() - 24);\n } else if (range === \"30d\") {\n from.setDate(from.getDate() - 30);\n } else {\n from.setDate(from.getDate() - 7);\n }\n return { from: from.toISOString(), to: to.toISOString() };\n}\n\nfunction encodeJsonParam(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n return JSON.stringify(value);\n}\n\nfunction encodeListParam(value: string[] | undefined): string | undefined {\n return value && value.length > 0 ? value.join(\",\") : undefined;\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n params: Record<string, string | undefined> = {},\n): URL {\n const url = new URL(`${baseUrl}${path}`, globalThis.location?.origin);\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === \"string\" && value.length > 0) {\n url.searchParams.set(key, value);\n }\n }\n return url;\n}\n\nasync function mergeHeaders(\n headers: Record<string, string>,\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> {\n const provided = getRequestHeaders ? await getRequestHeaders() : undefined;\n return provided ? { ...headers, ...provided } : headers;\n}\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message = payload?.message ?? payload?.data?.message ??\n payload?.error?.message ??\n `Admin request failed (${response.status})`;\n throw new Error(message);\n }\n return (payload?.data ?? payload) as T;\n}\n\nasync function parseJsonEnvelopeResponse<T>(response: Response): Promise<T> {\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message = payload?.message ?? payload?.data?.message ??\n payload?.error?.message ??\n `Admin request failed (${response.status})`;\n throw new Error(message);\n }\n return payload as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeMessagePageInfo(\n value: unknown,\n messages: AdminMessage[],\n): AdminMessagePageInfo {\n const oldestFromData = messages[0]?.id ?? null;\n const newestFromData = messages[messages.length - 1]?.id ?? null;\n\n if (!isRecord(value)) {\n return {\n hasMoreBefore: false,\n oldestMessageId: oldestFromData,\n newestMessageId: newestFromData,\n };\n }\n\n return {\n hasMoreBefore: value.hasMoreBefore === true,\n oldestMessageId: typeof value.oldestMessageId === \"string\"\n ? value.oldestMessageId\n : oldestFromData,\n newestMessageId: typeof value.newestMessageId === \"string\"\n ? value.newestMessageId\n : newestFromData,\n };\n}\n\nfunction normalizeMessagePage(payload: unknown): AdminMessagePage {\n const candidate = isRecord(payload) && isRecord(payload.data) &&\n Array.isArray(payload.data.data)\n ? payload.data\n : payload;\n const data = isRecord(candidate) && Array.isArray(candidate.data)\n ? candidate.data as AdminMessage[]\n : Array.isArray(candidate)\n ? candidate as AdminMessage[]\n : [];\n const pageInfo = isRecord(candidate)\n ? normalizeMessagePageInfo(candidate.pageInfo, data)\n : normalizeMessagePageInfo(undefined, data);\n\n return { data, pageInfo };\n}\n\nexport function createAdminClient(\n options: AdminClientOptions = {},\n): CopilotzAdminClient {\n const baseUrl = resolveBaseUrl(options.baseUrl);\n const paths = { ...DEFAULT_PATHS, ...options.paths };\n\n const requestJson = async <T>(\n path: string,\n params?: Record<string, string | undefined>,\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, params);\n const response = await fetch(url.toString(), {\n headers: await mergeHeaders({}, options.getRequestHeaders),\n });\n return await parseJsonResponse<T>(response);\n };\n\n const requestEnvelopeJson = async <T>(\n path: string,\n params?: Record<string, string | undefined>,\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, params);\n const response = await fetch(url.toString(), {\n headers: await mergeHeaders({}, options.getRequestHeaders),\n });\n return await parseJsonEnvelopeResponse<T>(response);\n };\n\n const writeJson = async <T>(\n method: \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n data?: Record<string, unknown>,\n params?: Record<string, string | undefined>,\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, params);\n const response = await fetch(url.toString(), {\n method,\n headers: await mergeHeaders(\n data ? { \"Content-Type\": \"application/json\" } : {},\n options.getRequestHeaders,\n ),\n ...(data ? { body: JSON.stringify(data) } : {}),\n });\n if (response.status === 204) return undefined as T;\n return await parseJsonResponse<T>(response);\n };\n\n return {\n paths,\n getOverview: async ({ range = \"7d\", namespace } = {}) => {\n const windowRange = getRangeWindow(range);\n return await requestJson<AdminOverview>(`${paths.adminBase}/overview`, {\n namespace,\n from: windowRange.from,\n to: windowRange.to,\n });\n },\n getActivity: async ({ range = \"7d\", interval = \"day\", namespace } = {}) => {\n const windowRange = getRangeWindow(range);\n return await requestJson<AdminActivityPoint[]>(\n `${paths.adminBase}/activity`,\n {\n namespace,\n interval,\n from: windowRange.from,\n to: windowRange.to,\n },\n );\n },\n getUsage: async (filters = {}) =>\n await requestJson<AdminUsageResponse>(`${paths.adminBase}/usage`, {\n from: filters.from,\n to: filters.to,\n interval: filters.interval,\n metric: filters.metric,\n groupBy: filters.groupBy,\n attribution: filters.attribution,\n kind: filters.kind,\n threadId: filters.threadId,\n participantId: filters.participantId,\n participantType: filters.participantType,\n namespace: filters.namespace,\n provider: filters.provider,\n model: filters.model,\n resource: filters.resource,\n operation: filters.operation,\n status: filters.status,\n }),\n listThreads: async (listOptions = {}) =>\n await requestJson<AdminThreadSummary[]>(`${paths.adminBase}/threads`, {\n search: listOptions.search,\n namespace: listOptions.namespace,\n limit: String(listOptions.limit ?? 25),\n }),\n listParticipants: async (listOptions = {}) =>\n await requestJson<AdminParticipantSummary[]>(\n `${paths.adminBase}/participants`,\n {\n search: listOptions.search,\n namespace: listOptions.namespace,\n limit: String(listOptions.limit ?? 25),\n },\n ),\n listAgents: async (listOptions = {}) => {\n const windowRange = getRangeWindow(listOptions.range ?? \"7d\");\n return await requestJson<AdminAgentSummary[]>(`${paths.adminBase}/agents`, {\n search: listOptions.search,\n namespace: listOptions.namespace,\n from: windowRange.from,\n to: windowRange.to,\n limit: String(listOptions.limit ?? 25),\n });\n },\n getThread: async (threadId) =>\n await requestJson<AdminThreadDetail>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}`,\n ),\n getThreadMessages: async (threadId, messageOptions = {}) => {\n const payload = await requestEnvelopeJson<unknown>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}/messages`,\n {\n limit: messageOptions.limit ? String(messageOptions.limit) : undefined,\n before: messageOptions.before,\n },\n );\n return normalizeMessagePage(payload);\n },\n getThreadEvent: async (threadId) =>\n await requestJson<AdminQueueEvent | undefined>(\n `${paths.threadsBase}/${encodeURIComponent(threadId)}/events`,\n ),\n listCollections: async () =>\n await requestJson<string[]>(paths.collectionsBase),\n listCollectionItems: async (collection, listOptions = {}) =>\n await requestJson<AdminCollectionItem[]>(\n `${paths.collectionsBase}/${encodeURIComponent(collection)}`,\n {\n q: listOptions.search,\n namespace: listOptions.namespace,\n limit: listOptions.limit ? String(listOptions.limit) : undefined,\n offset: listOptions.offset ? String(listOptions.offset) : undefined,\n before: listOptions.before,\n after: listOptions.after,\n filter: encodeJsonParam(listOptions.filter),\n sort: encodeJsonParam(listOptions.sort),\n populate: encodeListParam(listOptions.populate),\n },\n ),\n getCollectionItem: async (collection, itemId, getOptions = {}) =>\n await requestJson<AdminCollectionItem>(\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n {\n namespace: getOptions.namespace,\n populate: encodeListParam(getOptions.populate),\n },\n ),\n createCollectionItem: async (collection, data, writeOptions = {}) =>\n await writeJson<AdminCollectionItem>(\n \"POST\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}`,\n data,\n { namespace: writeOptions.namespace },\n ),\n updateCollectionItem: async (collection, itemId, data, writeOptions = {}) =>\n await writeJson<AdminCollectionItem>(\n \"PUT\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n data,\n { namespace: writeOptions.namespace },\n ),\n deleteCollectionItem: async (collection, itemId, writeOptions = {}) => {\n await writeJson<void>(\n \"DELETE\",\n `${paths.collectionsBase}/${encodeURIComponent(collection)}/${\n encodeURIComponent(itemId)\n }`,\n undefined,\n { namespace: writeOptions.namespace },\n );\n },\n };\n}\n","import React, { useMemo, useState } from \"react\";\nimport {\n Bot,\n ChevronsUpDown,\n Database,\n LayoutDashboard,\n RefreshCw,\n} from \"lucide-react\";\nimport { createAdminClient } from \"../api/client\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../components/ui/button\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n} from \"../components/ui/sidebar\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../components/ui/select\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip\";\nimport { defaultCopilotzModules } from \"../modules\";\nimport {\n ADMIN_GROUP_LABELS,\n ADMIN_GROUP_ORDER,\n canAccessAdminPermission,\n collectAdminNavItems,\n collectAdminRoutes,\n collectCollectionEditors,\n firstAccessibleRoute,\n} from \"./registry\";\nimport { AdminProvider } from \"./scope\";\nimport type {\n AdminBranding,\n AdminModuleGroup,\n AdminNavItem,\n AdminRouteState,\n CopilotzAdminProps,\n} from \"./types\";\n\nconst DEFAULT_BRANDING: Required<AdminBranding> = {\n title: \"Copilotz Admin\",\n subtitle: \"Operate and configure Copilotz projects\",\n logo: null,\n actions: null,\n};\n\nfunction routeFromLegacyPage(page?: string): string | undefined {\n switch (page) {\n case \"dashboard\":\n return \"overview\";\n case \"thread-detail\":\n return \"threads.detail\";\n case \"participant-detail\":\n return \"participants.detail\";\n case \"agent-detail\":\n return \"agents.detail\";\n case \"collection-items\":\n return \"collections\";\n case \"collection-item-detail\":\n return \"collections.detail\";\n default:\n return page;\n }\n}\n\nexport function CopilotzAdmin({\n branding: brandingProp,\n className,\n client,\n clientConfig,\n config,\n modules: modulesProp,\n onNavigate,\n permissions = {},\n scope: scopeProp,\n}: CopilotzAdminProps) {\n const modules = useMemo(\n () => modulesProp ?? defaultCopilotzModules(),\n [modulesProp],\n );\n const adminClient = useMemo(\n () =>\n client ?? createAdminClient({\n baseUrl: clientConfig?.baseUrl ?? config?.baseUrl,\n paths: clientConfig?.paths,\n getRequestHeaders: clientConfig?.getRequestHeaders ??\n config?.getRequestHeaders,\n }),\n [client, clientConfig, config],\n );\n const branding = useMemo(\n () => ({\n ...DEFAULT_BRANDING,\n ...(config?.branding ?? {}),\n ...(brandingProp ?? {}),\n }),\n [brandingProp, config?.branding],\n );\n const [namespace, setNamespaceState] = useState(\n scopeProp?.namespace ?? config?.namespace ?? \"\",\n );\n const scope = useMemo(() => ({\n ...(scopeProp ?? {}),\n namespace,\n }), [namespace, scopeProp]);\n\n const routes = useMemo(\n () => collectAdminRoutes(modules, permissions),\n [modules, permissions],\n );\n const navItems = useMemo(\n () => collectAdminNavItems(modules, permissions),\n [modules, permissions],\n );\n const collectionEditors = useMemo(\n () => collectCollectionEditors(modules),\n [modules],\n );\n\n const initialRouteId = routeFromLegacyPage(config?.defaultPage) ??\n firstAccessibleRoute(modules, permissions);\n const [route, setRoute] = useState<AdminRouteState>({\n routeId: initialRouteId,\n });\n const [refreshKey, setRefreshKey] = useState(0);\n\n const activeRoute = routes.get(route.routeId) ??\n routes.get(firstAccessibleRoute(modules, permissions));\n\n const navigate = (routeId: string, params?: Record<string, string | undefined>) => {\n const next = { routeId, params };\n setRoute(next);\n onNavigate?.(next);\n };\n\n const runtime = {\n branding,\n canAccess: (permission?: string, action?: string) =>\n canAccessAdminPermission(permissions, permission, action),\n client: adminClient,\n collectionEditors,\n modules,\n navigate,\n permissions,\n refreshKey,\n requestRefresh: () => setRefreshKey((key) => key + 1),\n route,\n scope,\n setNamespace: setNamespaceState,\n };\n\n return (\n <AdminProvider value={runtime}>\n <TooltipProvider>\n <SidebarProvider defaultOpen>\n <div\n className={cn(\n \"flex h-[100svh] w-full overflow-hidden bg-background text-foreground\",\n className,\n )}\n >\n <AdminShellSidebar\n branding={branding}\n navItems={navItems}\n namespace={namespace}\n onNavigate={navigate}\n onNamespaceChange={setNamespaceState}\n route={route}\n scopeOptions={scope.availableNamespaces}\n />\n <SidebarInset>\n <div className=\"flex h-full min-h-0 flex-col\">\n <AdminShellHeader\n brandingActions={branding.actions}\n isRefreshable={Boolean(activeRoute)}\n onRefresh={() => setRefreshKey((key) => key + 1)}\n title={activeRoute?.title ?? \"Admin\"}\n />\n <main className=\"min-h-0 flex-1 overflow-auto bg-muted/20\">\n <div className=\"mx-auto flex w-full max-w-[1600px] flex-col gap-4 p-4 lg:p-5\">\n {activeRoute\n ? activeRoute.render(runtime)\n : (\n <div className=\"rounded-lg border bg-background p-8 text-sm text-muted-foreground\">\n No accessible admin route is configured.\n </div>\n )}\n </div>\n </main>\n </div>\n </SidebarInset>\n </div>\n </SidebarProvider>\n </TooltipProvider>\n </AdminProvider>\n );\n}\n\nfunction AdminShellSidebar({\n branding,\n navItems,\n namespace,\n onNavigate,\n onNamespaceChange,\n route,\n scopeOptions,\n}: {\n branding: Required<AdminBranding>;\n navItems: AdminNavItem[];\n namespace: string;\n onNavigate: (routeId: string) => void;\n onNamespaceChange: (namespace: string) => void;\n route: AdminRouteState;\n scopeOptions?: Array<{ id: string; label?: string }>;\n}) {\n const grouped = ADMIN_GROUP_ORDER.map((group) => ({\n group,\n items: navItems.filter((item) => (item.group ?? \"extensions\") === group),\n })).filter((entry) => entry.items.length > 0);\n\n return (\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-3 px-2 py-3\">\n <div className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-primary-foreground\">\n {branding.logo ?? <Bot className=\"size-4\" />}\n </div>\n <div className=\"min-w-0 group-data-[collapsible=icon]:hidden\">\n <div className=\"truncate text-sm font-semibold\">\n {branding.title}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {branding.subtitle}\n </div>\n </div>\n </div>\n </SidebarHeader>\n <SidebarContent>\n {grouped.map(({ group, items }, index) => (\n <React.Fragment key={group}>\n {index > 0 && <SidebarSeparator />}\n <SidebarGroup>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">\n {ADMIN_GROUP_LABELS[group as AdminModuleGroup]}\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {items.map((item) => {\n const Icon = item.icon ?? LayoutDashboard;\n return (\n <SidebarMenuItem key={item.id}>\n <SidebarMenuButton\n isActive={route.routeId === item.routeId}\n onClick={() => onNavigate(item.routeId)}\n tooltip={item.label}\n >\n <Icon />\n <span>{item.label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </React.Fragment>\n ))}\n </SidebarContent>\n <SidebarFooter>\n <div className=\"group-data-[collapsible=icon]:hidden\">\n <label className=\"mb-1 block px-2 text-xs font-medium text-muted-foreground\">\n Namespace\n </label>\n <Select\n value={namespace || \"__all__\"}\n onValueChange={(value) =>\n onNamespaceChange(value === \"__all__\" ? \"\" : value)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"All namespaces\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All namespaces</SelectItem>\n {scopeOptions?.map((option) => (\n <SelectItem key={option.id} value={option.id}>\n {option.label ?? option.id}\n </SelectItem>\n ))}\n {namespace && !scopeOptions?.some((option) => option.id === namespace) && (\n <SelectItem value={namespace}>{namespace}</SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n <div className=\"hidden justify-center group-data-[collapsible=icon]:flex\">\n <ChevronsUpDown className=\"size-4 text-muted-foreground\" />\n </div>\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n );\n}\n\nfunction AdminShellHeader({\n brandingActions,\n isRefreshable,\n onRefresh,\n title,\n}: {\n brandingActions?: React.ReactNode;\n isRefreshable: boolean;\n onRefresh: () => void;\n title: string;\n}) {\n return (\n <header className=\"flex min-h-12 shrink-0 items-center gap-2 border-b bg-background/95 px-3 backdrop-blur supports-[backdrop-filter]:bg-background/80\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>Toggle sidebar</TooltipContent>\n </Tooltip>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Database className=\"size-4 text-muted-foreground\" />\n <h1 className=\"truncate text-sm font-medium\">{title}</h1>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n className=\"size-8\"\n disabled={!isRefreshable}\n onClick={onRefresh}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <RefreshCw className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n {brandingActions}\n </header>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n \n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction cleanupBodyStyles() {\n if (typeof document !== 'undefined' && document.body.style.pointerEvents === 'none') {\n document.body.style.pointerEvents = '';\n }\n}\n\nfunction Sheet({ open, onOpenChange, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n const prevOpenRef = React.useRef(open);\n\n React.useEffect(() => {\n if (prevOpenRef.current === true && open === false) {\n const timeout = setTimeout(cleanupBodyStyles, 350);\n return () => clearTimeout(timeout);\n }\n prevOpenRef.current = open;\n }, [open]);\n\n React.useEffect(() => {\n return () => {\n cleanupBodyStyles();\n };\n }, []);\n\n return <SheetPrimitive.Root data-slot=\"sheet\" open={open} onOpenChange={onOpenChange} {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n aria-describedby={undefined}\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport { cn } from \"../../lib/utils\"\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none transition-colors placeholder:text-muted-foreground focus:ring-2 focus:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n position === \"popper\" && \"translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.ScrollUpButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectPrimitive.ScrollDownButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"absolute right-2 inline-flex items-center justify-center\">\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectItem,\n}\n","import React from \"react\";\nimport { Bot, Brain, Wrench } from \"lucide-react\";\nimport type { AdminAgentSummary } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatMetricValue, formatNumber } from \"../usage/calculations\";\n\nexport function agentsModule(): AdminModule {\n return {\n group: \"configure\",\n icon: Bot,\n id: \"agents\",\n label: \"Agents\",\n navItems: [{\n group: \"configure\",\n icon: Bot,\n id: \"agents\",\n label: \"Agents\",\n order: 10,\n routeId: \"agents\",\n }],\n routes: [\n {\n id: \"agents\",\n title: \"Agents\",\n render: (context) => <AgentsPage context={context} />,\n },\n {\n id: \"agents.detail\",\n title: \"Agent Detail\",\n render: (context) => <AgentDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction AgentsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [agents, setAgents] = React.useState<AdminAgentSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setError(null);\n void context.client.listAgents({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n search: search || undefined,\n }).then((next) => {\n if (active) setAgents(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load agents\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Agents\"\n description=\"Observed agent activity with configuration-ready detail surfaces for model, tools, memory, and instructions.\"\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search agents...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load agents\" description={error} />\n ) : (\n <ResourceTable\n rows={agents}\n getRowKey={(agent) => `${agent.namespace}:${agent.agentId}`}\n onRowClick={(agent) =>\n context.navigate(\"agents.detail\", { agentId: agent.agentId })}\n empty={\n <EmptyState\n icon={Bot}\n title=\"No agents\"\n description=\"Configured or observed agents will appear here.\"\n />\n }\n columns={[\n {\n id: \"agent\",\n header: \"Agent\",\n render: (agent) => (\n <div>\n <div className=\"font-medium\">{agent.displayName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {agent.description ?? agent.agentId}\n </div>\n </div>\n ),\n },\n {\n id: \"configured\",\n header: \"Config\",\n render: (agent) => (\n <StatusBadge\n status={agent.isConfigured ? \"configured\" : \"observed\"}\n />\n ),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (agent) => formatNumber(agent.llmCallCount),\n },\n {\n align: \"right\",\n id: \"tokens\",\n header: \"Tokens\",\n render: (agent) => formatNumber(agent.totalTokens),\n },\n {\n align: \"right\",\n id: \"cost\",\n header: \"Cost\",\n render: (agent) => formatMetricValue(agent.totalCostUsd, \"cost\"),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction AgentDetailPage({ context }: { context: AdminRuntimeContext }) {\n const agentId = context.route.params?.agentId;\n const [agent, setAgent] = React.useState<AdminAgentSummary | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!agentId) return;\n let active = true;\n setError(null);\n void context.client.listAgents({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n search: agentId,\n }).then((agents) => {\n if (active) {\n setAgent(agents.find((candidate) => candidate.agentId === agentId) ?? agents[0] ?? null);\n }\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load agent\");\n });\n return () => {\n active = false;\n };\n }, [agentId, context.client, context.refreshKey, context.scope.namespace]);\n\n if (!agentId) return <EmptyState title=\"Agent not selected\" />;\n if (error) return <EmptyState title=\"Unable to load agent\" description={error} />;\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={agent?.displayName ?? agentId}\n description={agent?.description ?? \"Runtime metrics and configuration-ready surfaces.\"}\n badges={[{ label: agent?.isConfigured ? \"Configured\" : \"Observed only\" }]}\n actions={\n <button\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => context.navigate(\"agents\")}\n type=\"button\"\n >\n Back to agents\n </button>\n }\n />\n <MetricStrip\n items={[\n { icon: Brain, label: \"LLM calls\", value: formatNumber(agent?.llmCallCount ?? 0) },\n { icon: Wrench, label: \"Tool calls\", value: formatNumber(agent?.toolCallMessageCount ?? 0) },\n { icon: Bot, label: \"Tokens\", value: formatNumber(agent?.totalTokens ?? 0) },\n { label: \"Cost\", value: formatMetricValue(agent?.totalCostUsd ?? 0, \"cost\") },\n ]}\n />\n <div className=\"grid gap-4 xl:grid-cols-[1fr_420px]\">\n <div className=\"rounded-lg border bg-background p-4\">\n <h3 className=\"text-sm font-medium\">Configuration Surface</h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Model, fallback, tool, memory, and instruction editors are exposed here for project modules to extend.\n </p>\n </div>\n <JsonPanel title=\"Advanced JSON\" value={agent} minHeight={360} />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport function EmptyState({\n action,\n description,\n icon: Icon,\n title,\n}: {\n action?: React.ReactNode;\n description?: React.ReactNode;\n icon?: LucideIcon;\n title: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-lg border border-dashed bg-background p-8 text-center\">\n {Icon && (\n <Icon className=\"mx-auto mb-3 size-8 text-muted-foreground/60\" />\n )}\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {description && (\n <p className=\"mx-auto mt-2 max-w-md text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { Search } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\n\nexport function FilterBar({\n actions,\n children,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n searchValue,\n}: {\n actions?: React.ReactNode;\n children?: React.ReactNode;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n searchValue?: string;\n}) {\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex min-w-[260px] flex-1 flex-wrap items-center gap-2\">\n {onSearchChange && (\n <div className=\"relative w-full max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"h-8 pl-9\"\n onChange={(event) => onSearchChange(event.target.value)}\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n />\n </div>\n )}\n {children}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport function InspectorPanel({\n children,\n className,\n side,\n}: {\n children: React.ReactNode;\n className?: string;\n side?: React.ReactNode;\n}) {\n return (\n <div\n className={cn(\n \"grid gap-4 xl:grid-cols-[minmax(0,1fr)_360px]\",\n className,\n )}\n >\n <div className=\"min-w-0\">{children}</div>\n {side && <aside className=\"min-w-0\">{side}</aside>}\n </div>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { AlertCircle, Check, Save } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/textarea\";\n\nexport function JsonPanel({\n minHeight = 280,\n onSave,\n title = \"JSON\",\n value,\n}: {\n minHeight?: number;\n onSave?: (value: Record<string, unknown>) => Promise<void> | void;\n title?: string;\n value: unknown;\n}) {\n const initialJson = useMemo(() => JSON.stringify(value ?? null, null, 2), [value]);\n const [draft, setDraft] = useState(initialJson);\n const [message, setMessage] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n React.useEffect(() => {\n setDraft(initialJson);\n }, [initialJson]);\n\n const handleSave = async () => {\n if (!onSave) return;\n setMessage(null);\n setIsSaving(true);\n try {\n const parsed = JSON.parse(draft) as Record<string, unknown>;\n await onSave(parsed);\n setMessage(\"Saved\");\n } catch (error) {\n setMessage(error instanceof Error ? error.message : \"Invalid JSON\");\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"flex h-10 items-center justify-between border-b px-3\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n <div className=\"flex items-center gap-2\">\n {message && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n {message === \"Saved\"\n ? <Check className=\"size-3 text-emerald-600\" />\n : <AlertCircle className=\"size-3 text-destructive\" />}\n {message}\n </span>\n )}\n {onSave && (\n <Button\n disabled={isSaving}\n onClick={() => void handleSave()}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n <Save className=\"size-3\" />\n Save\n </Button>\n )}\n </div>\n </div>\n <Textarea\n className=\"rounded-none border-0 font-mono text-xs shadow-none focus-visible:ring-0\"\n spellCheck={false}\n style={{ minHeight }}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n readOnly={!onSave}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex min-h-20 w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import React from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Card, CardContent } from \"../ui/card\";\n\nexport interface MetricStripItem {\n label: string;\n value: React.ReactNode;\n detail?: React.ReactNode;\n icon?: LucideIcon;\n}\n\nexport function MetricStrip({ items }: { items: MetricStripItem[] }) {\n return (\n <div className=\"grid gap-2 md:grid-cols-2 xl:grid-cols-4\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <Card className=\"rounded-lg py-3 shadow-xs\" key={item.label}>\n <CardContent className=\"flex items-center justify-between gap-3 px-4\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-xs text-muted-foreground\">\n {item.label}\n </p>\n <p className=\"mt-1 truncate text-xl font-semibold tracking-tight\">\n {item.value}\n </p>\n {item.detail && (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {item.detail}\n </p>\n )}\n </div>\n {Icon && (\n <div className=\"rounded-md border bg-muted/50 p-2 text-muted-foreground\">\n <Icon className=\"size-4\" />\n </div>\n )}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import React from \"react\";\nimport { Badge } from \"../ui/badge\";\n\nexport function PageHeader({\n actions,\n badges = [],\n description,\n title,\n}: {\n actions?: React.ReactNode;\n badges?: Array<{ label: string; variant?: \"default\" | \"secondary\" | \"outline\" | \"destructive\" }>;\n description?: React.ReactNode;\n title: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"truncate text-xl font-semibold tracking-tight\">\n {title}\n </h2>\n {badges.map((badge) => (\n <Badge key={badge.label} variant={badge.variant ?? \"outline\"}>\n {badge.label}\n </Badge>\n ))}\n </div>\n {description && (\n <div className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">\n {description}\n </div>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div className=\"w-full overflow-auto\">\n <table\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return <thead className={cn(\"[&_tr]:border-b\", className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n className={cn(\n \"h-9 px-3 text-left align-middle text-xs font-medium uppercase tracking-wide text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td className={cn(\"px-3 py-2 align-middle\", className)} {...props} />\n );\n}\n\nexport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow };\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { EmptyState } from \"./EmptyState\";\n\nexport interface ResourceTableColumn<T> {\n id: string;\n header: React.ReactNode;\n align?: \"left\" | \"right\";\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\nexport function ResourceTable<T>({\n columns,\n empty,\n getRowKey,\n onRowClick,\n rows,\n}: {\n columns: Array<ResourceTableColumn<T>>;\n empty?: React.ReactNode;\n getRowKey: (row: T, index: number) => string;\n onRowClick?: (row: T) => void;\n rows: T[];\n}) {\n if (rows.length === 0) {\n return (\n <>\n {empty ?? (\n <EmptyState\n title=\"No records\"\n description=\"Records will appear here when data is available.\"\n />\n )}\n </>\n );\n }\n\n return (\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {columns.map((column) => (\n <TableHead\n className={cn(\n column.align === \"right\" && \"text-right\",\n column.className,\n )}\n key={column.id}\n >\n {column.header}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n className={onRowClick ? \"cursor-pointer\" : undefined}\n key={getRowKey(row, index)}\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => (\n <TableCell\n className={cn(\n column.align === \"right\" && \"text-right\",\n column.className,\n )}\n key={column.id}\n >\n {column.render(row)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import React from \"react\";\nimport { Badge } from \"../ui/badge\";\n\nexport function StatusBadge({ status }: { status?: string | null }) {\n const value = status ?? \"unknown\";\n const variant = value === \"failed\" || value === \"expired\"\n ? \"destructive\"\n : value === \"active\" || value === \"processing\"\n ? \"default\"\n : value === \"completed\" || value === \"archived\"\n ? \"secondary\"\n : \"outline\";\n return <Badge variant={variant}>{value}</Badge>;\n}\n","import type {\n AdminUsageDimension,\n AdminUsageInterval,\n AdminUsageMetricKind,\n AdminUsagePoint,\n AdminUsageTotals,\n} from \"../../api/types\";\nimport type {\n AggregatedUsageRow,\n UsageChartState,\n} from \"./types\";\n\nexport const EMPTY_USAGE_TOTALS: AdminUsageTotals = {\n cacheCreationInputCostUsd: 0,\n cacheCreationInputTokens: 0,\n cacheReadInputCostUsd: 0,\n cacheReadInputTokens: 0,\n inputCostUsd: 0,\n inputTokens: 0,\n outputCostUsd: 0,\n outputTokens: 0,\n reasoningCostUsd: 0,\n reasoningTokens: 0,\n totalCalls: 0,\n totalCostUsd: 0,\n failedCalls: 0,\n totalCredits: 0,\n totalDurationMs: 0,\n totalTokens: 0,\n unpricedCalls: 0,\n};\n\nconst USAGE_CHART_COLORS = [\n \"hsl(var(--primary))\",\n \"hsl(var(--chart-2, 142 76% 36%))\",\n \"hsl(var(--chart-3, 38 92% 50%))\",\n \"hsl(var(--chart-4, 199 89% 48%))\",\n \"hsl(var(--chart-5, 346 77% 49%))\",\n \"hsl(var(--muted-foreground))\",\n];\n\nexport function addUsageTotals(\n target: AdminUsageTotals,\n source: AdminUsageTotals,\n) {\n target.cacheCreationInputCostUsd += safeUsageNumber(source.cacheCreationInputCostUsd);\n target.cacheCreationInputTokens += safeUsageNumber(source.cacheCreationInputTokens);\n target.cacheReadInputCostUsd += safeUsageNumber(source.cacheReadInputCostUsd);\n target.cacheReadInputTokens += safeUsageNumber(source.cacheReadInputTokens);\n target.inputCostUsd += safeUsageNumber(source.inputCostUsd);\n target.inputTokens += safeUsageNumber(source.inputTokens);\n target.outputCostUsd += safeUsageNumber(source.outputCostUsd);\n target.outputTokens += safeUsageNumber(source.outputTokens);\n target.reasoningCostUsd += safeUsageNumber(source.reasoningCostUsd);\n target.reasoningTokens += safeUsageNumber(source.reasoningTokens);\n target.totalCalls += safeUsageNumber(source.totalCalls);\n target.totalCostUsd += safeUsageNumber(source.totalCostUsd);\n target.failedCalls += safeUsageNumber(source.failedCalls);\n target.totalCredits += safeUsageNumber(source.totalCredits);\n target.totalDurationMs += safeUsageNumber(source.totalDurationMs);\n target.totalTokens += safeUsageNumber(source.totalTokens);\n target.unpricedCalls += safeUsageNumber(source.unpricedCalls);\n}\n\nfunction safeUsageNumber(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nexport function getUsageTotalValue(\n totals: AdminUsageTotals,\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n if (metricKind === \"calls\") return safeUsageNumber(totals.totalCalls);\n if (metricKind === \"duration\") {\n return safeUsageNumber(totals.totalDurationMs);\n }\n if (metricKind === \"credits\") return safeUsageNumber(totals.totalCredits);\n if (metricKind === \"failures\") return safeUsageNumber(totals.failedCalls);\n if (metricKind === \"unpriced\") return safeUsageNumber(totals.unpricedCalls);\n if (metricKind === \"cost\") {\n switch (dimension) {\n case \"input\":\n return safeUsageNumber(totals.inputCostUsd);\n case \"output\":\n return safeUsageNumber(totals.outputCostUsd);\n case \"reasoning\":\n return safeUsageNumber(totals.reasoningCostUsd);\n case \"cacheRead\":\n return safeUsageNumber(totals.cacheReadInputCostUsd);\n case \"cacheWrite\":\n return safeUsageNumber(totals.cacheCreationInputCostUsd);\n case \"total\":\n default:\n return safeUsageNumber(totals.totalCostUsd);\n }\n }\n switch (dimension) {\n case \"input\":\n return safeUsageNumber(totals.inputTokens);\n case \"output\":\n return safeUsageNumber(totals.outputTokens);\n case \"reasoning\":\n return safeUsageNumber(totals.reasoningTokens);\n case \"cacheRead\":\n return safeUsageNumber(totals.cacheReadInputTokens);\n case \"cacheWrite\":\n return safeUsageNumber(totals.cacheCreationInputTokens);\n case \"total\":\n default:\n return safeUsageNumber(totals.totalTokens);\n }\n}\n\nexport function aggregateUsageRows(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n): AggregatedUsageRow[] {\n const totals = new Map<string, AggregatedUsageRow>();\n for (const point of points) {\n const row = totals.get(point.groupKey) ?? {\n ...EMPTY_USAGE_TOTALS,\n groupKey: point.groupKey,\n groupLabel: point.groupLabel,\n value: 0,\n };\n addUsageTotals(row, point);\n row.value = getUsageTotalValue(row, metricKind, dimension);\n totals.set(point.groupKey, row);\n }\n return Array.from(totals.values()).sort((a, b) => b.value - a.value);\n}\n\nexport function buildUsageChartState(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n interval: AdminUsageInterval,\n): UsageChartState {\n const topGroups = topUsageGroups(points, metricKind, dimension);\n const groupIdByKey = new Map(\n topGroups.map((group, index) => [group.key, `series${index + 1}`]),\n );\n const series = topGroups.map((group, index) => ({\n color: USAGE_CHART_COLORS[index % USAGE_CHART_COLORS.length],\n id: groupIdByKey.get(group.key) ?? `series${index + 1}`,\n key: group.key,\n label: group.label,\n }));\n const config = Object.fromEntries(\n series.map((item) => [item.id, {\n color: item.color,\n label: item.label,\n }]),\n );\n const buckets = buildUsageBuckets(points);\n const data = buckets.map((bucket) => {\n const row: Record<string, number | string> = {\n bucket: bucket.bucket,\n label: formatUsageBucket(bucket.bucket, interval),\n };\n for (const item of series) row[item.id] = 0;\n for (const point of bucket.points) {\n const seriesId = groupIdByKey.get(point.groupKey);\n if (!seriesId) continue;\n row[seriesId] = Number(row[seriesId] ?? 0) +\n getUsageTotalValue(point, metricKind, dimension);\n }\n return row;\n });\n return { config, data, series };\n}\n\nfunction buildUsageBuckets(points: AdminUsagePoint[]) {\n const byBucket = new Map<string, AdminUsagePoint[]>();\n for (const point of points) {\n const rows = byBucket.get(point.bucket) ?? [];\n rows.push(point);\n byBucket.set(point.bucket, rows);\n }\n return Array.from(byBucket.entries())\n .map(([bucket, bucketPoints]) => ({ bucket, points: bucketPoints }))\n .sort((a, b) =>\n new Date(a.bucket).getTime() - new Date(b.bucket).getTime()\n );\n}\n\nfunction topUsageGroups(\n points: AdminUsagePoint[],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n const totals = new Map<string, { key: string; label: string; value: number }>();\n for (const point of points) {\n const existing = totals.get(point.groupKey) ?? {\n key: point.groupKey,\n label: point.groupLabel,\n value: 0,\n };\n existing.value += getUsageTotalValue(point, metricKind, dimension);\n totals.set(point.groupKey, existing);\n }\n return Array.from(totals.values())\n .sort((a, b) => b.value - a.value)\n .slice(0, 6);\n}\n\nexport function getUsageRange(\n period: \"24h\" | \"7d\" | \"30d\" | \"custom\",\n customFrom: string,\n customTo: string,\n) {\n if (period === \"custom\") {\n return {\n from: customFrom ? new Date(customFrom).toISOString() : undefined,\n to: customTo ? new Date(customTo).toISOString() : undefined,\n };\n }\n const to = new Date();\n const from = new Date(to);\n if (period === \"24h\") {\n from.setHours(from.getHours() - 24);\n } else if (period === \"30d\") {\n from.setDate(from.getDate() - 30);\n } else {\n from.setDate(from.getDate() - 7);\n }\n return { from: from.toISOString(), to: to.toISOString() };\n}\n\nexport function getUsageDimensionLabel(dimension: AdminUsageDimension) {\n switch (dimension) {\n case \"input\":\n return \"Input\";\n case \"output\":\n return \"Output\";\n case \"reasoning\":\n return \"Reasoning\";\n case \"cacheRead\":\n return \"Cache read\";\n case \"cacheWrite\":\n return \"Cache write\";\n case \"total\":\n default:\n return \"Total\";\n }\n}\n\nexport function getUsageGroupLabel(groupBy: string) {\n switch (groupBy) {\n case \"kind\":\n return \"Kind\";\n case \"resource\":\n return \"Resource\";\n case \"operation\":\n return \"Operation\";\n case \"status\":\n return \"Status\";\n case \"thread\":\n return \"Thread\";\n case \"namespace\":\n return \"Namespace\";\n case \"provider\":\n return \"Provider\";\n case \"model\":\n return \"Model\";\n case \"participant\":\n default:\n return \"Participant\";\n }\n}\n\nexport function getUsageMetricLabel(metricKind: AdminUsageMetricKind) {\n switch (metricKind) {\n case \"cost\":\n return \"Spend\";\n case \"tokens\":\n return \"Tokens\";\n case \"duration\":\n return \"Duration\";\n case \"credits\":\n return \"Credits\";\n case \"failures\":\n return \"Failures\";\n case \"unpriced\":\n return \"Unpriced\";\n case \"calls\":\n default:\n return \"Calls\";\n }\n}\n\nexport function formatUsageBucket(bucket: string, interval: AdminUsageInterval) {\n const date = new Date(bucket);\n if (Number.isNaN(date.getTime())) return bucket;\n if (interval === \"minute\" || interval === \"hour\") {\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: interval === \"minute\" ? \"2-digit\" : undefined,\n });\n }\n if (interval === \"month\") {\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n year: \"numeric\",\n });\n }\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n\nexport function formatPercent(value: number) {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 1,\n style: \"percent\",\n }).format(value);\n}\n\nexport function formatMetricValue(\n value: number,\n metricKind: AdminUsageMetricKind,\n) {\n if (metricKind === \"cost\") {\n const absoluteValue = Math.abs(value);\n const maximumFractionDigits = absoluteValue >= 1\n ? 2\n : absoluteValue >= 0.01\n ? 4\n : 6;\n return new Intl.NumberFormat(undefined, {\n currency: \"USD\",\n maximumFractionDigits,\n minimumFractionDigits: 2,\n style: \"currency\",\n }).format(value);\n }\n if (metricKind === \"duration\") {\n return formatDuration(value);\n }\n return formatNumber(value);\n}\n\nexport function formatCompactMetric(\n value: number,\n metricKind: AdminUsageMetricKind,\n) {\n if (metricKind === \"cost\") {\n return new Intl.NumberFormat(undefined, {\n compactDisplay: \"short\",\n currency: \"USD\",\n maximumFractionDigits: 1,\n notation: \"compact\",\n style: \"currency\",\n }).format(value);\n }\n if (metricKind === \"duration\") {\n if (value >= 3_600_000) return `${(value / 3_600_000).toFixed(1)}h`;\n if (value >= 60_000) return `${(value / 60_000).toFixed(1)}m`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}s`;\n return `${Math.round(value)}ms`;\n }\n return new Intl.NumberFormat(undefined, {\n compactDisplay: \"short\",\n maximumFractionDigits: 1,\n notation: \"compact\",\n }).format(value);\n}\n\nfunction formatDuration(value: number) {\n if (value >= 3_600_000) {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value / 3_600_000)} h`;\n }\n if (value >= 60_000) {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value / 60_000)} min`;\n }\n if (value >= 1_000) {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value / 1_000)} sec`;\n }\n return `${formatNumber(Math.round(value))} ms`;\n}\n","import React from \"react\";\nimport { Database, Plus, Trash2 } from \"lucide-react\";\nimport type { AdminCollectionItem } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n PageHeader,\n ResourceTable,\n} from \"../../components/patterns\";\n\nexport function collectionsModule(): AdminModule {\n return {\n group: \"data\",\n icon: Database,\n id: \"collections\",\n label: \"Collections\",\n navItems: [{\n group: \"data\",\n icon: Database,\n id: \"collections\",\n label: \"Collections\",\n order: 20,\n routeId: \"collections\",\n }],\n routes: [\n {\n id: \"collections\",\n title: \"Collections\",\n render: (context) => <CollectionsPage context={context} />,\n },\n {\n id: \"collections.detail\",\n title: \"Collection Item\",\n render: (context) => <CollectionDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction CollectionsPage({ context }: { context: AdminRuntimeContext }) {\n const [collections, setCollections] = React.useState<string[]>([]);\n const [selected, setSelected] = React.useState<string | null>(null);\n const [search, setSearch] = React.useState(\"\");\n const [items, setItems] = React.useState<AdminCollectionItem[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n void context.client.listCollections().then((names) => {\n if (!active) return;\n setCollections(names);\n setSelected((current) => current ?? names[0] ?? null);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load collections\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey]);\n\n React.useEffect(() => {\n if (!selected) return;\n let active = true;\n setError(null);\n void context.client.listCollectionItems(selected, {\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setItems(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load collection items\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search, selected]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Collections\"\n description=\"Schema-aware collection browsing with advanced JSON fallback for records that do not have custom editors.\"\n actions={\n selected && (\n <Button\n onClick={() =>\n context.navigate(\"collections.detail\", { collection: selected })}\n size=\"sm\"\n type=\"button\"\n >\n <Plus className=\"size-3\" />\n New\n </Button>\n )\n }\n />\n <div className=\"grid gap-4 lg:grid-cols-[240px_minmax(0,1fr)]\">\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"border-b px-3 py-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n Collections\n </div>\n <div className=\"max-h-[620px] overflow-auto p-1\">\n {collections.map((collection) => (\n <button\n className={`flex w-full items-center rounded-md px-2 py-1.5 text-left text-sm ${\n selected === collection ? \"bg-accent text-accent-foreground\" : \"hover:bg-muted\"\n }`}\n key={collection}\n onClick={() => setSelected(collection)}\n type=\"button\"\n >\n {collection}\n </button>\n ))}\n </div>\n </div>\n <div className=\"space-y-3\">\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder={`Search ${selected ?? \"collection\"}...`}\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load collection\" description={error} />\n ) : selected ? (\n <ResourceTable\n rows={items}\n getRowKey={(item, index) => `${getItemId(item)}:${index}`}\n onRowClick={(item) =>\n context.navigate(\"collections.detail\", {\n collection: selected,\n itemId: getItemId(item),\n })}\n empty={\n <EmptyState\n icon={Database}\n title={`No ${selected} records`}\n description=\"Create a record or adjust the current filters.\"\n />\n }\n columns={[\n {\n id: \"id\",\n header: \"ID\",\n render: (item) => (\n <div className=\"max-w-sm truncate font-mono text-xs\">\n {getItemId(item)}\n </div>\n ),\n },\n {\n id: \"preview\",\n header: \"Preview\",\n render: (item) => (\n <div className=\"max-w-xl truncate text-sm\">\n {getItemPreview(item)}\n </div>\n ),\n },\n ]}\n />\n ) : (\n <EmptyState title=\"No collections\" />\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction CollectionDetailPage({ context }: { context: AdminRuntimeContext }) {\n const collection = context.route.params?.collection;\n const itemId = context.route.params?.itemId ?? null;\n const [item, setItem] = React.useState<AdminCollectionItem | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const isNew = !itemId;\n\n React.useEffect(() => {\n if (!collection || !itemId) {\n setItem(null);\n return;\n }\n let active = true;\n setError(null);\n void context.client.getCollectionItem(collection, itemId, {\n namespace: context.scope.namespace || undefined,\n }).then((next) => {\n if (active) setItem(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load item\");\n });\n return () => {\n active = false;\n };\n }, [collection, context.client, context.refreshKey, context.scope.namespace, itemId]);\n\n if (!collection) return <EmptyState title=\"Collection not selected\" />;\n if (error) return <EmptyState title=\"Unable to load item\" description={error} />;\n\n const Editor = context.collectionEditors[collection];\n const save = async (value: Record<string, unknown>) => {\n if (isNew) {\n const created = await context.client.createCollectionItem(collection, value, {\n namespace: context.scope.namespace || undefined,\n });\n setItem(created);\n context.navigate(\"collections.detail\", {\n collection,\n itemId: getItemId(created),\n });\n return;\n }\n if (!itemId) return;\n const updated = await context.client.updateCollectionItem(collection, itemId, value, {\n namespace: context.scope.namespace || undefined,\n });\n setItem(updated);\n };\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={isNew ? `New ${collection}` : `${collection} / ${itemId}`}\n description=\"Schema-aware editors can override this view. Advanced JSON remains available as a fallback.\"\n actions={\n <div className=\"flex items-center gap-2\">\n {!isNew && itemId && (\n <Button\n onClick={() => {\n void context.client.deleteCollectionItem(collection, itemId, {\n namespace: context.scope.namespace || undefined,\n }).then(() => context.navigate(\"collections\"));\n }}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive\"\n >\n <Trash2 className=\"size-3\" />\n Delete\n </Button>\n )}\n <Button\n onClick={() => context.navigate(\"collections\")}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Back\n </Button>\n </div>\n }\n />\n {Editor\n ? (\n <Editor\n collection={collection}\n context={context}\n isNew={isNew}\n itemId={itemId}\n value={item}\n onSaved={setItem}\n onDeleted={() => context.navigate(\"collections\")}\n />\n )\n : (\n <JsonPanel\n title=\"Advanced JSON\"\n value={item ?? { id: \"\" }}\n onSave={save}\n minHeight={520}\n />\n )}\n </div>\n );\n}\n\nfunction getItemId(item: AdminCollectionItem): string {\n return String(item.id ?? item._id ?? \"\");\n}\n\nfunction getItemPreview(item: AdminCollectionItem): string {\n const name = item.name ?? item.title ?? item.displayName ?? item.label;\n if (typeof name === \"string\") return name;\n const keys = Object.keys(item).filter((key) => key !== \"id\" && key !== \"_id\");\n if (keys.length === 0) return \"(empty)\";\n return keys.slice(0, 4).map((key) =>\n `${key}: ${JSON.stringify(item[key])?.slice(0, 48)}`\n ).join(\", \");\n}\n","import React from \"react\";\nimport { Activity, Search } from \"lucide-react\";\nimport type { AdminQueueEvent } from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\n\nexport function eventsModule(): AdminModule {\n return {\n group: \"operate\",\n icon: Activity,\n id: \"events\",\n label: \"Events\",\n navItems: [{\n group: \"operate\",\n icon: Activity,\n id: \"events\",\n label: \"Events\",\n order: 30,\n routeId: \"events\",\n }],\n routes: [{\n id: \"events\",\n title: \"Events\",\n render: (context) => <EventsPage context={context} />,\n }],\n };\n}\n\nfunction EventsPage({ context }: { context: AdminRuntimeContext }) {\n const [threadId, setThreadId] = React.useState(\"\");\n const [status, setStatus] = React.useState(\"\");\n const [type, setType] = React.useState(\"\");\n const [traceId, setTraceId] = React.useState(\"\");\n const [event, setEvent] = React.useState<AdminQueueEvent | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [hasSearched, setHasSearched] = React.useState(false);\n\n const inspect = async () => {\n if (!threadId.trim()) return;\n setHasSearched(true);\n setError(null);\n try {\n const next = await context.client.getThreadEvent(threadId.trim());\n setEvent(next ?? null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Failed to load event\");\n setEvent(null);\n }\n };\n\n const rows = event &&\n (!status || event.status.includes(status)) &&\n (!type || event.eventType.includes(type)) &&\n (!traceId || event.traceId?.includes(traceId))\n ? [event]\n : [];\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Events\"\n description=\"Queue and event inspection. Current backend support is thread-focused; filters are ready for broader event listing.\"\n />\n <FilterBar\n actions={\n <Button\n disabled={!threadId.trim()}\n onClick={() => void inspect()}\n size=\"sm\"\n type=\"button\"\n >\n <Search className=\"size-3\" />\n Inspect\n </Button>\n }\n >\n <Input\n className=\"h-8 w-[220px]\"\n onChange={(event) => setThreadId(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") void inspect();\n }}\n placeholder=\"Thread ID\"\n value={threadId}\n />\n <Input\n className=\"h-8 w-[150px]\"\n onChange={(event) => setStatus(event.target.value)}\n placeholder=\"Status\"\n value={status}\n />\n <Input\n className=\"h-8 w-[180px]\"\n onChange={(event) => setType(event.target.value)}\n placeholder=\"Event type\"\n value={type}\n />\n <Input\n className=\"h-8 w-[180px]\"\n onChange={(event) => setTraceId(event.target.value)}\n placeholder=\"Trace ID\"\n value={traceId}\n />\n </FilterBar>\n {error ? (\n <EmptyState title=\"Unable to inspect event\" description={error} />\n ) : !hasSearched ? (\n <EmptyState\n icon={Activity}\n title=\"Choose a thread\"\n description=\"Enter a thread ID to inspect its next pending event.\"\n />\n ) : (\n <div className=\"grid gap-4 xl:grid-cols-[1fr_420px]\">\n <ResourceTable\n rows={rows}\n getRowKey={(row) => row.id}\n empty={\n <EmptyState\n title=\"No matching event\"\n description=\"No pending event matched the current filters.\"\n />\n }\n columns={[\n {\n id: \"type\",\n header: \"Type\",\n render: (row) => row.eventType,\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (row) => <StatusBadge status={row.status} />,\n },\n {\n id: \"trace\",\n header: \"Trace\",\n render: (row) => row.traceId ?? \"-\",\n },\n {\n id: \"created\",\n header: \"Created\",\n render: (row) => formatDateTime(row.createdAt),\n },\n ]}\n />\n <JsonPanel title=\"Event JSON\" value={event} minHeight={420} />\n </div>\n )}\n </div>\n );\n}\n\nfunction formatDateTime(value: string | null) {\n if (!value) return \"-\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n month: \"short\",\n });\n}\n","import React from \"react\";\nimport {\n Activity,\n AlertTriangle,\n Bot,\n MessageSquare,\n Sparkles,\n Users,\n Wallet,\n} from \"lucide-react\";\nimport type {\n AdminAgentSummary,\n AdminOverview,\n AdminThreadSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatMetricValue, formatNumber } from \"../usage/calculations\";\n\nexport function overviewModule(): AdminModule {\n return {\n group: \"operate\",\n icon: Activity,\n id: \"overview\",\n label: \"Overview\",\n navItems: [{\n group: \"operate\",\n icon: Activity,\n id: \"overview\",\n label: \"Overview\",\n order: 10,\n routeId: \"overview\",\n }],\n routes: [{\n id: \"overview\",\n title: \"Overview\",\n render: (context) => <OverviewPage context={context} />,\n }],\n };\n}\n\nfunction OverviewPage({ context }: { context: AdminRuntimeContext }) {\n const [overview, setOverview] = React.useState<AdminOverview | null>(null);\n const [threads, setThreads] = React.useState<AdminThreadSummary[]>([]);\n const [agents, setAgents] = React.useState<AdminAgentSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void Promise.all([\n context.client.getOverview({\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n }),\n context.client.listThreads({\n limit: 8,\n namespace: context.scope.namespace || undefined,\n }),\n context.client.listAgents({\n limit: 8,\n namespace: context.scope.namespace || undefined,\n range: \"7d\",\n }),\n ]).then(([nextOverview, nextThreads, nextAgents]) => {\n if (!active) return;\n setOverview(nextOverview);\n setThreads(nextThreads);\n setAgents(nextAgents);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load overview\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace]);\n\n if (error) {\n return <EmptyState title=\"Unable to load overview\" description={error} />;\n }\n\n const queueFailures = (overview?.queueTotals.failed ?? 0) +\n (overview?.queueTotals.expired ?? 0);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Overview\"\n description=\"Operational health, recent activity, and cost signals for the active Copilotz scope.\"\n badges={[\n { label: context.scope.namespace || \"All namespaces\" },\n ...(isLoading ? [{ label: \"Loading\" as const }] : []),\n ]}\n />\n <MetricStrip\n items={[\n {\n detail: `${formatNumber(overview?.threadTotals.active ?? 0)} active`,\n icon: MessageSquare,\n label: \"Threads\",\n value: formatNumber(overview?.threadTotals.total ?? 0),\n },\n {\n detail: `${formatNumber(overview?.participantTotals.agents ?? 0)} agents`,\n icon: Users,\n label: \"Participants\",\n value: formatNumber(overview?.participantTotals.total ?? 0),\n },\n {\n detail: `${formatNumber(overview?.llmTotals.totalCalls ?? 0)} LLM calls`,\n icon: Wallet,\n label: \"Cost\",\n value: formatMetricValue(overview?.llmTotals.totalCostUsd ?? 0, \"cost\"),\n },\n {\n detail: `${formatNumber(queueFailures)} failures/expired`,\n icon: queueFailures > 0 ? AlertTriangle : Sparkles,\n label: \"Queue\",\n value: formatNumber(overview?.queueTotals.total ?? 0),\n },\n ]}\n />\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <section className=\"space-y-3\">\n <PageHeader title=\"Recent Threads\" />\n <ResourceTable\n rows={threads}\n getRowKey={(thread) => thread.threadId}\n onRowClick={(thread) =>\n context.navigate(\"threads.detail\", { threadId: thread.threadId })}\n columns={[\n {\n id: \"name\",\n header: \"Thread\",\n render: (thread) => (\n <div>\n <div className=\"max-w-md truncate font-medium\">\n {thread.name || thread.threadId}\n </div>\n <div className=\"max-w-md truncate text-xs text-muted-foreground\">\n {thread.summary ?? thread.lastMessagePreview ?? \"No summary\"}\n </div>\n </div>\n ),\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (thread) => <StatusBadge status={thread.status} />,\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (thread) => formatNumber(thread.messageCount),\n },\n ]}\n />\n </section>\n <section className=\"space-y-3\">\n <PageHeader title=\"Top Agents\" />\n <ResourceTable\n rows={agents}\n getRowKey={(agent) => `${agent.namespace}:${agent.agentId}`}\n onRowClick={(agent) =>\n context.navigate(\"agents.detail\", { agentId: agent.agentId })}\n columns={[\n {\n id: \"agent\",\n header: \"Agent\",\n render: (agent) => (\n <div className=\"flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <div>\n <div className=\"font-medium\">{agent.displayName}</div>\n <div className=\"text-xs text-muted-foreground\">\n {agent.agentId}\n </div>\n </div>\n </div>\n ),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (agent) => formatNumber(agent.llmCallCount),\n },\n {\n align: \"right\",\n id: \"cost\",\n header: \"Cost\",\n render: (agent) => formatMetricValue(agent.totalCostUsd, \"cost\"),\n },\n ]}\n />\n </section>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Users } from \"lucide-react\";\nimport type {\n AdminParticipantDetail,\n AdminParticipantSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport {\n EmptyState,\n FilterBar,\n JsonPanel,\n MetricStrip,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatNumber } from \"../usage/calculations\";\n\nexport function participantsModule(): AdminModule {\n return {\n group: \"data\",\n icon: Users,\n id: \"participants\",\n label: \"Participants\",\n navItems: [{\n group: \"data\",\n icon: Users,\n id: \"participants\",\n label: \"Participants\",\n order: 10,\n routeId: \"participants\",\n }],\n routes: [\n {\n id: \"participants\",\n title: \"Participants\",\n render: (context) => <ParticipantsPage context={context} />,\n },\n {\n id: \"participants.detail\",\n title: \"Participant Detail\",\n render: (context) => <ParticipantDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction ParticipantsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [participants, setParticipants] = React.useState<AdminParticipantSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setError(null);\n void context.client.listParticipants({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setParticipants(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load participants\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Participants\"\n description=\"Humans, agents, and jobs observed by Copilotz across conversations.\"\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search participants...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load participants\" description={error} />\n ) : (\n <ResourceTable\n rows={participants}\n getRowKey={(participant) =>\n `${participant.namespace}:${participant.externalId}`}\n onRowClick={(participant) =>\n context.navigate(\"participants.detail\", {\n participantId: participant.externalId,\n })}\n empty={\n <EmptyState\n icon={Users}\n title=\"No participants\"\n description=\"Participants appear after messages or jobs are processed.\"\n />\n }\n columns={[\n {\n id: \"participant\",\n header: \"Participant\",\n render: (participant) => (\n <div>\n <div className=\"max-w-md truncate font-medium\">\n {participant.displayName}\n </div>\n <div className=\"max-w-md truncate text-xs text-muted-foreground\">\n {participant.externalId}\n </div>\n </div>\n ),\n },\n {\n id: \"type\",\n header: \"Type\",\n render: (participant) => (\n <StatusBadge status={participant.participantType} />\n ),\n },\n {\n id: \"scope\",\n header: \"Scope\",\n render: (participant) =>\n participant.isGlobal ? \"Global\" : participant.namespace,\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (participant) => formatNumber(participant.messageCount),\n },\n {\n align: \"right\",\n id: \"threads\",\n header: \"Threads\",\n render: (participant) => formatNumber(participant.threadCount),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction ParticipantDetailPage({ context }: { context: AdminRuntimeContext }) {\n const participantId = context.route.params?.participantId;\n const [participant, setParticipant] = React.useState<AdminParticipantDetail | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!participantId) return;\n let active = true;\n setError(null);\n void context.client.getCollectionItem(\"participant\", participantId, {\n namespace: context.scope.namespace || undefined,\n }).then((next) => {\n if (active) setParticipant(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load participant\");\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, participantId]);\n\n if (!participantId) {\n return <EmptyState title=\"Participant not selected\" />;\n }\n if (error) {\n return <EmptyState title=\"Unable to load participant\" description={error} />;\n }\n\n const memories = Array.isArray(participant?.memories)\n ? participant.memories.length\n : 0;\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={String(participant?.displayName ?? participantId)}\n description=\"Participant profile, activity-ready metrics, and advanced record data.\"\n actions={\n <button\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => context.navigate(\"participants\")}\n type=\"button\"\n >\n Back to participants\n </button>\n }\n />\n <MetricStrip\n items={[\n { label: \"Type\", value: String(participant?.participantType ?? \"unknown\") },\n { label: \"Namespace\", value: String(participant?.namespace ?? context.scope.namespace ?? \"global\") },\n { label: \"Memories\", value: formatNumber(memories) },\n ]}\n />\n <JsonPanel title=\"Advanced JSON\" value={participant} minHeight={460} />\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Bot,\n ChevronUp,\n Cpu,\n Loader2,\n MessageSquare,\n User,\n Wrench,\n} from \"lucide-react\";\nimport type {\n AdminMessage,\n AdminMessagePageInfo,\n AdminThreadDetail,\n AdminThreadSummary,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n EmptyState,\n FilterBar,\n InspectorPanel,\n JsonPanel,\n PageHeader,\n ResourceTable,\n StatusBadge,\n} from \"../../components/patterns\";\nimport { formatNumber } from \"../usage/calculations\";\n\nconst MESSAGE_PAGE_SIZE = 50;\n\nexport function threadsModule(): AdminModule {\n return {\n group: \"operate\",\n icon: MessageSquare,\n id: \"threads\",\n label: \"Threads\",\n navItems: [{\n group: \"operate\",\n icon: MessageSquare,\n id: \"threads\",\n label: \"Threads\",\n order: 40,\n routeId: \"threads\",\n }],\n routes: [\n {\n id: \"threads\",\n title: \"Threads\",\n render: (context) => <ThreadsPage context={context} />,\n },\n {\n id: \"threads.detail\",\n title: \"Thread Detail\",\n render: (context) => <ThreadDetailPage context={context} />,\n },\n ],\n };\n}\n\nfunction ThreadsPage({ context }: { context: AdminRuntimeContext }) {\n const [search, setSearch] = React.useState(\"\");\n const [threads, setThreads] = React.useState<AdminThreadSummary[]>([]);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void context.client.listThreads({\n limit: 50,\n namespace: context.scope.namespace || undefined,\n search: search || undefined,\n }).then((next) => {\n if (active) setThreads(next);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load threads\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, context.scope.namespace, search]);\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Threads\"\n description=\"Search conversations, inspect participants, and drill into message timelines, tool calls, reasoning, and metadata.\"\n badges={isLoading ? [{ label: \"Loading\" }] : []}\n />\n <FilterBar\n onSearchChange={setSearch}\n searchPlaceholder=\"Search threads...\"\n searchValue={search}\n />\n {error ? (\n <EmptyState title=\"Unable to load threads\" description={error} />\n ) : (\n <ResourceTable\n rows={threads}\n getRowKey={(thread) => thread.threadId}\n onRowClick={(thread) =>\n context.navigate(\"threads.detail\", { threadId: thread.threadId })}\n empty={\n <EmptyState\n icon={MessageSquare}\n title=\"No threads\"\n description=\"Threads will appear after conversations start flowing.\"\n />\n }\n columns={[\n {\n id: \"thread\",\n header: \"Thread\",\n render: (thread) => (\n <div className=\"min-w-0\">\n <div className=\"max-w-xl truncate font-medium\">\n {thread.name || thread.threadId}\n </div>\n <div className=\"max-w-xl truncate text-xs text-muted-foreground\">\n {thread.summary ?? thread.lastMessagePreview ?? \"No summary yet\"}\n </div>\n </div>\n ),\n },\n {\n id: \"status\",\n header: \"Status\",\n render: (thread) => <StatusBadge status={thread.status} />,\n },\n {\n align: \"right\",\n id: \"participants\",\n header: \"Participants\",\n render: (thread) =>\n formatNumber(\n Array.isArray(thread.participantIds)\n ? thread.participantIds.length\n : 0,\n ),\n },\n {\n align: \"right\",\n id: \"messages\",\n header: \"Messages\",\n render: (thread) => formatNumber(thread.messageCount),\n },\n {\n id: \"activity\",\n header: \"Last activity\",\n render: (thread) => formatDateTime(thread.lastActivityAt),\n },\n ]}\n />\n )}\n </div>\n );\n}\n\nfunction ThreadDetailPage({ context }: { context: AdminRuntimeContext }) {\n const threadId = context.route.params?.threadId;\n if (!threadId) {\n return (\n <EmptyState\n title=\"Thread not selected\"\n description=\"Select a thread from the table to inspect its messages.\"\n />\n );\n }\n return <ThreadInspector context={context} threadId={threadId} />;\n}\n\nfunction ThreadInspector({\n context,\n threadId,\n}: {\n context: AdminRuntimeContext;\n threadId: string;\n}) {\n const [thread, setThread] = React.useState<AdminThreadDetail | null>(null);\n const [messages, setMessages] = React.useState<AdminMessage[]>([]);\n const [pageInfo, setPageInfo] = React.useState<AdminMessagePageInfo | null>(null);\n const [isLoading, setIsLoading] = React.useState(true);\n const [isLoadingMore, setIsLoadingMore] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void Promise.all([\n context.client.getThread(threadId),\n context.client.getThreadMessages(threadId, { limit: MESSAGE_PAGE_SIZE }),\n ]).then(([nextThread, page]) => {\n if (!active) return;\n setThread(nextThread);\n setMessages(Array.isArray(page?.data) ? page.data : []);\n setPageInfo(page?.pageInfo ?? null);\n }).catch((cause) => {\n if (active) setError(cause instanceof Error ? cause.message : \"Failed to load thread\");\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [context.client, context.refreshKey, threadId]);\n\n const loadMore = async () => {\n if (!pageInfo?.hasMoreBefore || !pageInfo.oldestMessageId || isLoadingMore) {\n return;\n }\n setIsLoadingMore(true);\n try {\n const page = await context.client.getThreadMessages(threadId, {\n before: pageInfo.oldestMessageId,\n limit: MESSAGE_PAGE_SIZE,\n });\n setMessages((current) => [\n ...(Array.isArray(page?.data) ? page.data : []),\n ...current,\n ]);\n setPageInfo(page?.pageInfo ?? null);\n } finally {\n setIsLoadingMore(false);\n }\n };\n\n if (isLoading) {\n return <EmptyState icon={Loader2} title=\"Loading thread\" />;\n }\n if (error) {\n return <EmptyState title=\"Unable to load thread\" description={error} />;\n }\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title={thread?.name ?? threadId}\n description={thread?.summary ?? \"Message timeline and runtime metadata.\"}\n badges={[\n { label: thread?.status ?? \"unknown\" },\n { label: `${messages.length}${pageInfo?.hasMoreBefore ? \"+\" : \"\"} messages`, variant: \"secondary\" },\n ]}\n actions={\n <Button\n onClick={() => context.navigate(\"threads\")}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Back to threads\n </Button>\n }\n />\n <InspectorPanel\n side={<JsonPanel title=\"Thread JSON\" value={thread} minHeight={420} />}\n >\n <div className=\"overflow-hidden rounded-lg border bg-background\">\n <div className=\"flex items-center justify-between border-b px-4 py-2\">\n <div className=\"text-sm font-medium\">Timeline</div>\n {pageInfo?.hasMoreBefore && (\n <Button\n disabled={isLoadingMore}\n onClick={() => void loadMore()}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n {isLoadingMore\n ? <Loader2 className=\"size-3 animate-spin\" />\n : <ChevronUp className=\"size-3\" />}\n Load older\n </Button>\n )}\n </div>\n {messages.length === 0 ? (\n <EmptyState title=\"No messages\" description=\"This thread has no messages yet.\" />\n ) : (\n <div className=\"divide-y\">\n {messages.map((message) => (\n <MessageRow key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n </InspectorPanel>\n </div>\n );\n}\n\nfunction MessageRow({ message }: { message: AdminMessage }) {\n const [expanded, setExpanded] = React.useState(false);\n const hasToolCalls =\n Array.isArray(message.toolCalls) && message.toolCalls.length > 0;\n const hasReasoning = Boolean(message.reasoning);\n const hasMetadata = Boolean(message.metadata && Object.keys(message.metadata).length);\n\n return (\n <div className=\"px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <SenderIcon senderType={message.senderType} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2 text-xs\">\n <span className=\"font-medium\">\n {message.senderId ?? message.senderUserId ?? message.senderType}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {message.senderType}\n </Badge>\n {message.targetId && (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n to {message.targetId}\n </Badge>\n )}\n {message.createdAt && (\n <span className=\"text-muted-foreground\">\n {formatDateTime(message.createdAt)}\n </span>\n )}\n </div>\n {message.content && (\n <p className=\"mt-1 whitespace-pre-wrap break-words text-sm\">\n {message.content}\n </p>\n )}\n {(hasToolCalls || hasReasoning || hasMetadata) && (\n <div className=\"mt-2\">\n <button\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => setExpanded((value) => !value)}\n type=\"button\"\n >\n {hasToolCalls && <Wrench className=\"size-3\" />}\n {hasReasoning && !hasToolCalls && <Cpu className=\"size-3\" />}\n Details\n </button>\n {expanded && (\n <pre className=\"mt-2 max-h-72 overflow-auto rounded-md bg-muted p-3 text-xs\">\n {JSON.stringify({\n ...(hasToolCalls ? { toolCalls: message.toolCalls } : {}),\n ...(hasReasoning ? { reasoning: message.reasoning } : {}),\n ...(hasMetadata ? { metadata: message.metadata } : {}),\n }, null, 2)}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SenderIcon({ senderType }: { senderType: string }) {\n const base = \"flex size-7 shrink-0 items-center justify-center rounded-full\";\n switch (senderType) {\n case \"agent\":\n return <div className={cn(base, \"bg-primary/10 text-primary\")}><Bot className=\"size-3.5\" /></div>;\n case \"user\":\n return <div className={cn(base, \"bg-secondary text-secondary-foreground\")}><User className=\"size-3.5\" /></div>;\n case \"tool\":\n return <div className={cn(base, \"bg-muted text-muted-foreground\")}><Wrench className=\"size-3.5\" /></div>;\n default:\n return <div className={cn(base, \"bg-muted text-muted-foreground\")}><Cpu className=\"size-3.5\" /></div>;\n }\n}\n\nfunction formatDateTime(value: string | null) {\n if (!value) return \"No activity\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n month: \"short\",\n });\n}\n","import React from \"react\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n Activity,\n AlertTriangle,\n BarChart3,\n Clock,\n Coins,\n DollarSign,\n Sparkles,\n} from \"lucide-react\";\nimport type {\n AdminUsageAttribution,\n AdminUsageDimension,\n AdminUsageGroupBy,\n AdminUsageInterval,\n AdminUsageKind,\n AdminUsageMetricKind,\n AdminUsageResponse,\n} from \"../../api/types\";\nimport type { AdminModule, AdminRuntimeContext } from \"../../core/types\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport {\n ChartContainer,\n ChartLegendContent,\n ChartTooltipContent,\n} from \"../../components/ui/chart\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n EmptyState,\n FilterBar,\n MetricStrip,\n PageHeader,\n ResourceTable,\n} from \"../../components/patterns\";\nimport {\n aggregateUsageRows,\n buildUsageChartState,\n EMPTY_USAGE_TOTALS,\n formatCompactMetric,\n formatMetricValue,\n formatPercent,\n getUsageDimensionLabel,\n getUsageGroupLabel,\n getUsageMetricLabel,\n getUsageRange,\n getUsageTotalValue,\n} from \"./calculations\";\nimport type { AggregatedUsageRow } from \"./types\";\n\nconst USAGE_DIMENSIONS: AdminUsageDimension[] = [\n \"total\",\n \"input\",\n \"output\",\n \"reasoning\",\n \"cacheRead\",\n \"cacheWrite\",\n];\n\nconst USAGE_WORKLOADS: AdminUsageKind[] = [\n \"all\",\n \"llm\",\n \"tool\",\n \"asset\",\n \"rag\",\n \"embedding\",\n];\n\nconst STATUS_OPTIONS = [\n \"all\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n \"aborted\",\n \"error\",\n] as string[];\n\nexport function usageModule(): AdminModule {\n return {\n group: \"operate\",\n icon: BarChart3,\n id: \"usage\",\n label: \"Usage\",\n navItems: [{\n group: \"operate\",\n icon: BarChart3,\n id: \"usage\",\n label: \"Usage\",\n order: 20,\n routeId: \"usage\",\n }],\n routes: [{\n id: \"usage\",\n title: \"Usage\",\n render: (context) => <UsagePage context={context} />,\n }],\n };\n}\n\nfunction UsagePage({ context }: { context: AdminRuntimeContext }) {\n const [period, setPeriod] = React.useState<\"24h\" | \"7d\" | \"30d\" | \"custom\">(\n \"7d\",\n );\n const [interval, setInterval] = React.useState<AdminUsageInterval>(\"day\");\n const [workload, setWorkload] = React.useState<AdminUsageKind>(\"all\");\n const [metricKind, setMetricKind] = React.useState<AdminUsageMetricKind>(\n \"calls\",\n );\n const [dimension, setDimension] = React.useState<AdminUsageDimension>(\"total\");\n const [groupBy, setGroupBy] = React.useState<AdminUsageGroupBy>(\"kind\");\n const [attribution, setAttribution] = React.useState<AdminUsageAttribution>(\n \"initiatedBy\",\n );\n const [participantType, setParticipantType] = React.useState<\n \"all\" | \"human\" | \"agent\" | \"job\"\n >(\"all\");\n const [threadId, setThreadId] = React.useState(\"\");\n const [participantId, setParticipantId] = React.useState(\"\");\n const [provider, setProvider] = React.useState(\"\");\n const [model, setModel] = React.useState(\"\");\n const [resource, setResource] = React.useState(\"\");\n const [operation, setOperation] = React.useState(\"\");\n const [status, setStatus] = React.useState<(typeof STATUS_OPTIONS)[number]>(\n \"all\",\n );\n const [customFrom, setCustomFrom] = React.useState(\"\");\n const [customTo, setCustomTo] = React.useState(\"\");\n const [usage, setUsage] = React.useState<AdminUsageResponse | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n\n const range = React.useMemo(\n () => getUsageRange(period, customFrom, customTo),\n [customFrom, customTo, period],\n );\n const metricOptions = React.useMemo(\n () => getUsageMetricOptions(workload),\n [workload],\n );\n const groupOptions = React.useMemo(\n () => getUsageGroupOptions(workload),\n [workload],\n );\n const showLlmFields = workload === \"llm\";\n const showResourceFields = workload !== \"llm\";\n const showDimension =\n metricKind === \"tokens\" || (metricKind === \"cost\" && workload === \"llm\");\n\n React.useEffect(() => {\n if (!metricOptions.includes(metricKind)) {\n setMetricKind(metricOptions[0]);\n }\n }, [metricKind, metricOptions]);\n\n React.useEffect(() => {\n if (!groupOptions.includes(groupBy)) {\n setGroupBy(groupOptions[0]);\n }\n }, [groupBy, groupOptions]);\n\n React.useEffect(() => {\n if (!showDimension && dimension !== \"total\") {\n setDimension(\"total\");\n }\n }, [dimension, showDimension]);\n\n React.useEffect(() => {\n let active = true;\n setIsLoading(true);\n setError(null);\n void context.client.getUsage({\n attribution,\n from: range.from,\n groupBy,\n kind: workload,\n interval,\n metric: metricKind,\n model: showLlmFields ? emptyToUndefined(model) : undefined,\n namespace: context.scope.namespace || undefined,\n operation: showResourceFields ? emptyToUndefined(operation) : undefined,\n participantId: emptyToUndefined(participantId),\n participantType,\n provider: showLlmFields ? emptyToUndefined(provider) : undefined,\n resource: showResourceFields ? emptyToUndefined(resource) : undefined,\n status: status === \"all\" ? undefined : status,\n threadId: emptyToUndefined(threadId),\n to: range.to,\n }).then((next) => {\n if (active) setUsage(next);\n }).catch((cause) => {\n if (active) {\n setError(cause instanceof Error ? cause.message : \"Failed to load usage\");\n setUsage(null);\n }\n }).finally(() => {\n if (active) setIsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [\n attribution,\n context.client,\n context.refreshKey,\n context.scope.namespace,\n groupBy,\n interval,\n metricKind,\n model,\n operation,\n participantId,\n participantType,\n provider,\n range.from,\n range.to,\n resource,\n showLlmFields,\n showResourceFields,\n status,\n threadId,\n workload,\n ]);\n\n const points = usage?.points ?? [];\n const totals = usage?.totals ?? EMPTY_USAGE_TOTALS;\n const chartState = React.useMemo(\n () => buildUsageChartState(points, metricKind, dimension, interval),\n [dimension, interval, metricKind, points],\n );\n const rows = React.useMemo(\n () => aggregateUsageRows(points, metricKind, dimension),\n [dimension, metricKind, points],\n );\n\n return (\n <div className=\"space-y-4\">\n <PageHeader\n title=\"Usage\"\n description=\"Inspect metered LLM, tool, and resource activity by workload, actor, status, cost, duration, tokens, and credits.\"\n badges={[\n { label: workload },\n { label: getUsageMetricLabel(metricKind), variant: \"secondary\" },\n { label: getUsageGroupLabel(groupBy), variant: \"secondary\" },\n ...(isLoading ? [{ label: \"Loading\" as const }] : []),\n ]}\n />\n <FilterBar>\n <UsageSelect\n label=\"Period\"\n onValueChange={(value) => setPeriod(value as typeof period)}\n options={[\"24h\", \"7d\", \"30d\", \"custom\"]}\n value={period}\n />\n <UsageSelect\n label=\"Bucket\"\n onValueChange={(value) => setInterval(value as AdminUsageInterval)}\n options={[\"minute\", \"hour\", \"day\", \"week\", \"month\"]}\n value={interval}\n />\n <UsageSelect\n label=\"Workload\"\n onValueChange={(value) => setWorkload(value as AdminUsageKind)}\n options={USAGE_WORKLOADS}\n value={workload}\n formatOption={getUsageKindLabel}\n />\n <UsageSelect\n label=\"Measure\"\n onValueChange={(value) => setMetricKind(value as AdminUsageMetricKind)}\n options={metricOptions}\n value={metricKind}\n formatOption={getUsageMetricLabel}\n />\n <UsageSelect\n label=\"Group\"\n onValueChange={(value) => setGroupBy(value as AdminUsageGroupBy)}\n options={groupOptions}\n value={groupBy}\n formatOption={getUsageGroupLabel}\n />\n <UsageSelect\n label=\"Actor\"\n onValueChange={(value) =>\n setAttribution(value as AdminUsageAttribution)}\n options={[\"initiatedBy\", \"generatedBy\"]}\n value={attribution}\n formatOption={getUsageAttributionLabel}\n />\n {showDimension && (\n <UsageSelect\n label=\"Dimension\"\n onValueChange={(value) =>\n setDimension(value as AdminUsageDimension)}\n options={USAGE_DIMENSIONS}\n value={dimension}\n formatOption={getUsageDimensionLabel}\n />\n )}\n </FilterBar>\n <FilterBar>\n {period === \"custom\" && (\n <>\n <Input\n className=\"h-8 w-[190px]\"\n onChange={(event) => setCustomFrom(event.target.value)}\n type=\"datetime-local\"\n value={customFrom}\n />\n <Input\n className=\"h-8 w-[190px]\"\n onChange={(event) => setCustomTo(event.target.value)}\n type=\"datetime-local\"\n value={customTo}\n />\n </>\n )}\n <UsageSelect\n label=\"Actor type\"\n onValueChange={(value) =>\n setParticipantType(value as typeof participantType)}\n options={[\"all\", \"human\", \"agent\", \"job\"]}\n value={participantType}\n />\n <UsageSelect\n label=\"Status\"\n onValueChange={(value) => setStatus(value as typeof status)}\n options={STATUS_OPTIONS}\n value={status}\n />\n <Input\n className=\"h-8 w-[170px]\"\n onChange={(event) => setThreadId(event.target.value)}\n placeholder=\"Thread ID\"\n value={threadId}\n />\n <Input\n className=\"h-8 w-[170px]\"\n onChange={(event) => setParticipantId(event.target.value)}\n placeholder=\"Participant ID\"\n value={participantId}\n />\n {showResourceFields && (\n <>\n <Input\n className=\"h-8 w-[170px]\"\n onChange={(event) => setResource(event.target.value)}\n placeholder=\"Resource / tool\"\n value={resource}\n />\n <Input\n className=\"h-8 w-[150px]\"\n onChange={(event) => setOperation(event.target.value)}\n placeholder=\"Operation\"\n value={operation}\n />\n </>\n )}\n {showLlmFields && (\n <>\n <Input\n className=\"h-8 w-[140px]\"\n onChange={(event) => setProvider(event.target.value)}\n placeholder=\"Provider\"\n value={provider}\n />\n <Input\n className=\"h-8 w-[140px]\"\n onChange={(event) => setModel(event.target.value)}\n placeholder=\"Model\"\n value={model}\n />\n </>\n )}\n </FilterBar>\n <MetricStrip\n items={[\n {\n detail: `${formatMetricValue(totals.unpricedCalls, \"unpriced\")} unpriced`,\n icon: DollarSign,\n label: \"Spend\",\n value: formatMetricValue(totals.totalCostUsd, \"cost\"),\n },\n {\n detail: `${formatMetricValue(totals.failedCalls, \"failures\")} failed`,\n icon: Activity,\n label: \"Calls\",\n value: formatMetricValue(totals.totalCalls, \"calls\"),\n },\n {\n detail: \"Tool and resource runtime\",\n icon: Clock,\n label: \"Duration\",\n value: formatMetricValue(totals.totalDurationMs, \"duration\"),\n },\n {\n detail: `${formatMetricValue(totals.inputTokens, \"tokens\")} input`,\n icon: Sparkles,\n label: \"Tokens\",\n value: formatMetricValue(totals.totalTokens, \"tokens\"),\n },\n {\n detail: \"Custom metering\",\n icon: Coins,\n label: \"Credits\",\n value: formatMetricValue(totals.totalCredits, \"credits\"),\n },\n {\n detail: \"Failed or aborted work\",\n icon: AlertTriangle,\n label: \"Failures\",\n value: formatMetricValue(totals.failedCalls, \"failures\"),\n },\n ]}\n />\n {error ? (\n <EmptyState title=\"Unable to load usage\" description={error} />\n ) : chartState.data.length === 0 ? (\n <EmptyState\n title=\"No usage\"\n description=\"Metered LLM, tool, and resource records will appear here after work is captured in the usage ledger.\"\n />\n ) : (\n <>\n <Card className=\"h-[320px] py-3\">\n <CardContent className=\"h-full px-3\">\n <UsageChart chartState={chartState} metricKind={metricKind} />\n </CardContent>\n </Card>\n <UsageRowsTable\n dimension={dimension}\n groupBy={groupBy}\n metricKind={metricKind}\n rows={rows}\n totals={totals}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction UsageSelect<T extends string>({\n formatOption,\n label,\n onValueChange,\n options,\n value,\n}: {\n formatOption?: (value: T) => string;\n label: string;\n onValueChange: (value: string) => void;\n options: T[];\n value: T;\n}) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger className=\"h-8 w-[132px] text-xs\" aria-label={label}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option} value={option}>\n {formatOption ? formatOption(option) : option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction UsageChart({\n chartState,\n metricKind,\n}: {\n chartState: ReturnType<typeof buildUsageChartState>;\n metricKind: AdminUsageMetricKind;\n}) {\n return (\n <ChartContainer className=\"h-full w-full\" config={chartState.config}>\n <BarChart accessibilityLayer data={chartState.data} margin={{ left: 8, right: 8, top: 12 }}>\n <CartesianGrid vertical={false} />\n <XAxis dataKey=\"label\" tickLine={false} axisLine={false} tickMargin={10} />\n <YAxis\n axisLine={false}\n tickFormatter={(value) => formatCompactMetric(Number(value), metricKind)}\n tickLine={false}\n width={64}\n />\n <RechartsTooltip\n content={\n <ChartTooltipContent\n formatter={(value) =>\n formatMetricValue(Number(value), metricKind)}\n labelFormatter={(value) => String(value ?? \"\")}\n />\n }\n cursor={false}\n />\n <Legend content={<ChartLegendContent className=\"justify-center pt-3\" />} />\n {chartState.series.map((series) => (\n <Bar\n dataKey={series.id}\n fill={`var(--color-${series.id})`}\n key={series.id}\n radius={[4, 4, 0, 0]}\n stackId=\"usage\"\n />\n ))}\n </BarChart>\n </ChartContainer>\n );\n}\n\nfunction UsageRowsTable({\n dimension,\n groupBy,\n metricKind,\n rows,\n totals,\n}: {\n dimension: AdminUsageDimension;\n groupBy: AdminUsageGroupBy;\n metricKind: AdminUsageMetricKind;\n rows: AggregatedUsageRow[];\n totals: typeof EMPTY_USAGE_TOTALS;\n}) {\n const totalValue = getUsageTotalValue(totals, metricKind, dimension);\n const valueHeader =\n (metricKind === \"tokens\" || metricKind === \"cost\") && dimension !== \"total\"\n ? `${getUsageDimensionLabel(dimension)} ${getUsageMetricLabel(metricKind)}`\n : getUsageMetricLabel(metricKind);\n return (\n <ResourceTable\n rows={rows.slice(0, 80)}\n getRowKey={(row) => row.groupKey}\n columns={[\n {\n id: \"group\",\n header: getUsageGroupLabel(groupBy),\n render: (row) => (\n <div className=\"min-w-0\">\n <div className=\"max-w-80 truncate font-medium\">{row.groupLabel}</div>\n {row.groupKey !== row.groupLabel && (\n <div className=\"max-w-80 truncate text-xs text-muted-foreground\">\n {row.groupKey}\n </div>\n )}\n </div>\n ),\n },\n {\n align: \"right\",\n id: \"value\",\n header: valueHeader,\n render: (row) => formatMetricValue(row.value, metricKind),\n },\n {\n align: \"right\",\n id: \"share\",\n header: \"Share\",\n render: (row) => formatPercent(totalValue > 0 ? row.value / totalValue : 0),\n },\n {\n align: \"right\",\n id: \"calls\",\n header: \"Calls\",\n render: (row) => formatMetricValue(row.totalCalls, \"calls\"),\n },\n {\n align: \"right\",\n id: \"spend\",\n header: \"Spend\",\n render: (row) => formatMetricValue(row.totalCostUsd, \"cost\"),\n },\n {\n align: \"right\",\n id: \"duration\",\n header: \"Duration\",\n render: (row) =>\n formatMetricValue(row.totalDurationMs, \"duration\"),\n },\n {\n align: \"right\",\n id: \"tokens\",\n header: \"Tokens\",\n render: (row) => formatMetricValue(row.totalTokens, \"tokens\"),\n },\n {\n align: \"right\",\n id: \"failures\",\n header: \"Failures\",\n render: (row) => formatMetricValue(row.failedCalls, \"failures\"),\n },\n {\n align: \"right\",\n id: \"unpriced\",\n header: \"Unpriced\",\n render: (row) => formatMetricValue(row.unpricedCalls, \"unpriced\"),\n },\n ]}\n />\n );\n}\n\nfunction getUsageMetricOptions(\n workload: AdminUsageKind,\n): AdminUsageMetricKind[] {\n if (workload === \"llm\") {\n return [\"cost\", \"tokens\", \"calls\", \"failures\", \"unpriced\"];\n }\n if (workload === \"tool\") {\n return [\"calls\", \"duration\", \"cost\", \"credits\", \"failures\", \"unpriced\"];\n }\n return [\n \"calls\",\n \"cost\",\n \"duration\",\n \"tokens\",\n \"credits\",\n \"failures\",\n \"unpriced\",\n ];\n}\n\nfunction getUsageGroupOptions(workload: AdminUsageKind): AdminUsageGroupBy[] {\n if (workload === \"llm\") {\n return [\"participant\", \"model\", \"provider\", \"thread\", \"namespace\", \"status\"];\n }\n if (workload === \"tool\") {\n return [\n \"resource\",\n \"operation\",\n \"status\",\n \"participant\",\n \"thread\",\n \"namespace\",\n ];\n }\n return [\n \"kind\",\n \"resource\",\n \"operation\",\n \"status\",\n \"participant\",\n \"thread\",\n \"namespace\",\n ];\n}\n\nfunction getUsageKindLabel(kind: AdminUsageKind) {\n switch (kind) {\n case \"all\":\n return \"All\";\n case \"llm\":\n return \"LLM\";\n case \"tool\":\n return \"Tools\";\n case \"asset\":\n return \"Assets\";\n case \"rag\":\n return \"RAG\";\n case \"embedding\":\n return \"Embeddings\";\n default:\n return kind;\n }\n}\n\nfunction getUsageAttributionLabel(attribution: AdminUsageAttribution) {\n return attribution === \"initiatedBy\" ? \"Initiator\" : \"Performer\";\n}\n\nfunction emptyToUndefined(value: string): string | undefined {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n","import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport type ChartConfig = Record<\n string,\n {\n label: string;\n color: string;\n }\n>;\n\nconst ChartContext = React.createContext<ChartConfig | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n if (!context) {\n throw new Error(\"useChart must be used within a ChartContainer\");\n }\n return context;\n}\n\nfunction ChartContainer({\n id,\n className,\n config,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"];\n}) {\n const uniqueId = React.useId();\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={config}>\n <div\n data-chart={chartId}\n className={cn(\n \"flex aspect-auto justify-center text-xs text-muted-foreground [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/70 [&_.recharts-cursor]:fill-muted [&_.recharts-legend-wrapper]:text-muted-foreground [&_.recharts-tooltip-cursor]:fill-muted\",\n className,\n )}\n {...props}\n >\n <style>\n {Object.entries(config)\n .map(([key, item]) => {\n return `[data-chart=${chartId}] { --color-${key}: ${item.color}; }`;\n })\n .join(\"\\n\")}\n </style>\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n formatter,\n labelFormatter,\n}: {\n active?: boolean;\n payload?: Array<{\n color?: string;\n dataKey?: string | number;\n name?: string | number;\n value?: number | string;\n }>;\n label?: string | number;\n className?: string;\n formatter?: (value: number | string) => string;\n labelFormatter?: (value: string | number | undefined) => string;\n}) {\n const config = useChart();\n if (!active || !payload?.length) return null;\n\n const total = payload.reduce((sum, item) => {\n const value = typeof item.value === \"number\"\n ? item.value\n : Number(item.value ?? 0);\n return sum + (Number.isFinite(value) ? value : 0);\n }, 0);\n\n return (\n <div\n className={cn(\n \"min-w-44 rounded-lg border bg-popover px-3 py-2 text-popover-foreground shadow-md\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center justify-between gap-4 border-b pb-2\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n {labelFormatter ? labelFormatter(label) : label}\n </p>\n <p className=\"text-xs font-semibold text-foreground\">\n {formatter ? formatter(total) : total}\n </p>\n </div>\n <div className=\"space-y-1.5\">\n {payload\n .filter((item) => Number(item.value ?? 0) > 0)\n .map((item) => {\n const key = String(item.dataKey ?? item.name ?? \"\");\n const itemConfig = config[key];\n const color = item.color ?? itemConfig?.color ?? \"currentColor\";\n return (\n <div\n className=\"grid grid-cols-[0.6rem_1fr_auto] items-center gap-2\"\n key={key}\n >\n <span\n className=\"size-2 rounded-[2px]\"\n style={{ backgroundColor: color }}\n />\n <span className=\"max-w-48 truncate text-muted-foreground\">\n {itemConfig?.label ?? item.name ?? key}\n </span>\n <span className=\"font-medium text-foreground\">\n {formatter ? formatter(item.value ?? 0) : item.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ChartLegendContent({\n payload,\n className,\n}: {\n payload?: Array<{\n color?: string;\n dataKey?: string | number;\n value?: string | number;\n }>;\n className?: string;\n}) {\n const config = useChart();\n if (!payload?.length) return null;\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", className)}>\n {payload.map((item) => {\n const key = String(item.dataKey ?? item.value ?? \"\");\n const itemConfig = config[key];\n return (\n <div className=\"flex items-center gap-2\" key={key}>\n <span\n className=\"size-2 rounded-[2px]\"\n style={{\n backgroundColor: item.color ?? itemConfig?.color ??\n \"currentColor\",\n }}\n />\n <span className=\"max-w-52 truncate text-xs text-muted-foreground\">\n {itemConfig?.label ?? item.value ?? key}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport { ChartContainer, ChartLegendContent, ChartTooltipContent };\n","import type { AdminModule } from \"../core/types\";\nimport { agentsModule } from \"./agents\";\nimport { collectionsModule } from \"./collections\";\nimport { eventsModule } from \"./events\";\nimport { overviewModule } from \"./overview\";\nimport { participantsModule } from \"./participants\";\nimport { threadsModule } from \"./threads\";\nimport { usageModule } from \"./usage\";\n\nexport function defaultCopilotzModules(): AdminModule[] {\n return [\n overviewModule(),\n usageModule(),\n eventsModule(),\n threadsModule(),\n agentsModule(),\n participantsModule(),\n collectionsModule(),\n ];\n}\n\nexport { agentsModule } from \"./agents\";\nexport { collectionsModule } from \"./collections\";\nexport { eventsModule } from \"./events\";\nexport { overviewModule } from \"./overview\";\nexport { participantsModule } from \"./participants\";\nexport { threadsModule } from \"./threads\";\nexport { usageModule } from \"./usage\";\nexport * from \"./usage/calculations\";\nexport type * from \"./usage/types\";\n","import type {\n AdminModule,\n AdminModuleGroup,\n AdminNavItem,\n AdminPermissions,\n AdminRouteDefinition,\n CollectionEditor,\n} from \"./types\";\n\nexport const ADMIN_GROUP_LABELS: Record<AdminModuleGroup, string> = {\n operate: \"Operate\",\n configure: \"Configure\",\n data: \"Data\",\n extensions: \"Extensions\",\n};\n\nexport const ADMIN_GROUP_ORDER: AdminModuleGroup[] = [\n \"operate\",\n \"configure\",\n \"data\",\n \"extensions\",\n];\n\nexport function canAccessAdminPermission(\n permissions: AdminPermissions | undefined,\n permission?: string,\n action = \"view\",\n): boolean {\n if (!permission) return true;\n return permissions?.canAccess ? permissions.canAccess(permission, action) : true;\n}\n\nexport function collectAdminRoutes(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): Map<string, AdminRouteDefinition> {\n const routes = new Map<string, AdminRouteDefinition>();\n for (const module of modules) {\n for (const route of module.routes) {\n if (!canAccessAdminPermission(permissions, route.permission)) continue;\n routes.set(route.id, route);\n }\n }\n return routes;\n}\n\nexport function collectAdminNavItems(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): AdminNavItem[] {\n const items: AdminNavItem[] = [];\n for (const module of modules) {\n const navItems = module.navItems?.length\n ? module.navItems\n : module.routes.slice(0, 1).map((route) => ({\n id: `${module.id}:default`,\n label: module.label,\n routeId: route.id,\n group: module.group,\n icon: module.icon,\n permission: route.permission,\n }));\n\n for (const item of navItems) {\n if (!canAccessAdminPermission(permissions, item.permission)) continue;\n items.push({\n ...item,\n group: item.group ?? module.group ?? \"extensions\",\n icon: item.icon ?? module.icon,\n });\n }\n }\n\n return items.sort((a, b) => {\n const groupDelta = ADMIN_GROUP_ORDER.indexOf(a.group ?? \"extensions\") -\n ADMIN_GROUP_ORDER.indexOf(b.group ?? \"extensions\");\n if (groupDelta !== 0) return groupDelta;\n return (a.order ?? 100) - (b.order ?? 100) ||\n a.label.localeCompare(b.label);\n });\n}\n\nexport function collectCollectionEditors(\n modules: AdminModule[],\n): Record<string, CollectionEditor> {\n const editors: Record<string, CollectionEditor> = {};\n for (const module of modules) {\n Object.assign(editors, module.collectionEditors ?? {});\n }\n return editors;\n}\n\nexport function firstAccessibleRoute(\n modules: AdminModule[],\n permissions?: AdminPermissions,\n): string {\n const navItem = collectAdminNavItems(modules, permissions)[0];\n if (navItem) return navItem.routeId;\n for (const module of modules) {\n const route = module.routes.find((candidate) =>\n canAccessAdminPermission(permissions, candidate.permission)\n );\n if (route) return route.id;\n }\n return \"overview\";\n}\n","import React, { createContext, useContext } from \"react\";\nimport type { AdminRuntimeContext } from \"./types\";\n\nconst AdminContext = createContext<AdminRuntimeContext | null>(null);\n\nexport function AdminProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: AdminRuntimeContext;\n}) {\n return (\n <AdminContext.Provider value={value}>\n {children}\n </AdminContext.Provider>\n );\n}\n\nexport function useAdmin(): AdminRuntimeContext {\n const context = useContext(AdminContext);\n if (!context) {\n throw new Error(\"useAdmin must be used inside CopilotzAdmin\");\n }\n return context;\n}\n","import type { LegacyAdminConfig } from \"./core/types\";\n\nexport const defaultAdminConfig: LegacyAdminConfig = {\n baseUrl: \"\",\n branding: {\n subtitle: \"Operate and configure Copilotz projects\",\n title: \"Copilotz Admin\",\n },\n namespace: \"\",\n};\n\nexport function mergeAdminConfig(\n baseConfig: LegacyAdminConfig = defaultAdminConfig,\n userConfig?: LegacyAdminConfig,\n): LegacyAdminConfig {\n return {\n ...baseConfig,\n ...(userConfig ?? {}),\n branding: {\n ...(baseConfig.branding ?? {}),\n ...(userConfig?.branding ?? {}),\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createAdminClient } from \"./api/client\";\nimport type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminDatePreset,\n AdminOverview,\n AdminParticipantSummary,\n AdminThreadSummary,\n RequestHeadersProvider,\n} from \"./api/types\";\n\nexport interface UseCopilotzAdminOptions {\n agentSearch?: string;\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n interval?: AdminActivityInterval;\n namespace?: string;\n participantSearch?: string;\n range?: AdminDatePreset;\n threadSearch?: string;\n}\n\nexport interface UseCopilotzAdminResult {\n activity: AdminActivityPoint[];\n agents: AdminAgentSummary[];\n error: Error | null;\n filters: UseCopilotzAdminOptions & {\n interval: AdminActivityInterval;\n range: AdminDatePreset;\n };\n isLoading: boolean;\n overview: AdminOverview | null;\n participants: AdminParticipantSummary[];\n refresh: () => Promise<void>;\n setInterval: (interval: AdminActivityInterval) => void;\n setRange: (range: AdminDatePreset) => void;\n threads: AdminThreadSummary[];\n}\n\n/** @deprecated Prefer the module-based CopilotzAdmin shell and createAdminClient. */\nexport function useCopilotzAdmin(\n options: UseCopilotzAdminOptions = {},\n): UseCopilotzAdminResult {\n const [range, setRange] = useState<AdminDatePreset>(options.range ?? \"7d\");\n const [interval, setInterval] = useState<AdminActivityInterval>(\n options.interval ?? \"day\",\n );\n const [overview, setOverview] = useState<AdminOverview | null>(null);\n const [activity, setActivity] = useState<AdminActivityPoint[]>([]);\n const [threads, setThreads] = useState<AdminThreadSummary[]>([]);\n const [participants, setParticipants] = useState<AdminParticipantSummary[]>([]);\n const [agents, setAgents] = useState<AdminAgentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const client = useMemo(\n () =>\n createAdminClient({\n baseUrl: options.baseUrl,\n getRequestHeaders: options.getRequestHeaders,\n }),\n [options.baseUrl, options.getRequestHeaders],\n );\n\n const fetchAll = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const [\n nextOverview,\n nextActivity,\n nextThreads,\n nextParticipants,\n nextAgents,\n ] = await Promise.all([\n client.getOverview({ namespace: options.namespace, range }),\n client.getActivity({ interval, namespace: options.namespace, range }),\n client.listThreads({\n namespace: options.namespace,\n search: options.threadSearch,\n }),\n client.listParticipants({\n namespace: options.namespace,\n search: options.participantSearch,\n }),\n client.listAgents({\n namespace: options.namespace,\n range,\n search: options.agentSearch,\n }),\n ]);\n setOverview(nextOverview);\n setActivity(nextActivity);\n setThreads(nextThreads);\n setParticipants(nextParticipants);\n setAgents(nextAgents);\n } catch (cause) {\n setError(cause instanceof Error\n ? cause\n : new Error(\"Failed to load admin data\"));\n } finally {\n setIsLoading(false);\n }\n }, [\n client,\n interval,\n options.agentSearch,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n range,\n ]);\n\n useEffect(() => {\n void fetchAll();\n }, [fetchAll]);\n\n return {\n activity,\n agents,\n error,\n filters: {\n ...options,\n interval,\n range,\n },\n isLoading,\n overview,\n participants,\n refresh: fetchAll,\n setInterval,\n setRange,\n threads,\n };\n}\n"],"mappings":"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","names":["React","useMemo","useState","Bot","Database","React","Slot","cva","jsx","jsx","React","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","open","jsx","Slot","jsx","cva","Slot","jsxs","React","jsx","jsxs","jsxs","jsx","React","jsx","jsxs","Icon","jsx","jsxs","jsx","jsxs","React","useMemo","useState","Check","jsx","jsx","jsxs","useMemo","useState","React","Check","jsx","jsx","jsx","jsxs","Icon","Slot","cva","jsx","cva","Slot","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","React","React","jsx","jsxs","React","React","Search","jsx","jsxs","React","Search","event","React","Activity","Bot","jsx","jsxs","Activity","React","Bot","React","Users","jsx","jsxs","Users","React","React","Bot","ChevronUp","MessageSquare","Wrench","jsx","jsxs","MessageSquare","React","formatDateTime","ChevronUp","Wrench","Bot","React","Activity","AlertTriangle","Sparkles","React","jsx","jsxs","Fragment","jsx","jsxs","React","Activity","Sparkles","AlertTriangle","createContext","useContext","jsx","jsx","jsxs","useMemo","useState","Bot","React","Icon","Database","useCallback","useEffect","useMemo","useState","useState","useMemo","useCallback","useEffect"]}
|