@copilotz/admin 0.3.7 → 0.3.9
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 +1565 -397
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +84 -20
- package/dist/index.d.ts +84 -20
- package/dist/index.js +1476 -314
- package/dist/index.js.map +1 -1
- package/dist/styles.css +106 -0
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/CopilotzAdmin.tsx","../src/config.ts","../src/useCopilotzAdmin.ts","../src/adminService.ts","../src/lib/utils.ts","../src/components/ui/card.tsx","../src/components/ui/button.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/input.tsx","../src/components/ui/sheet.tsx","../src/components/layout/AdminSidebar.tsx","../src/components/layout/AdminHeader.tsx","../src/components/ui/select.tsx","../src/components/ui/badge.tsx","../src/components/views/DashboardView.tsx","../src/components/views/ThreadsView.tsx","../src/components/views/ThreadDetailView.tsx"],"sourcesContent":["export { CopilotzAdmin } from \"./CopilotzAdmin\";\nexport { useCopilotzAdmin } from \"./useCopilotzAdmin\";\nexport {\n fetchAdminActivity,\n fetchAdminAgents,\n fetchAdminOverview,\n fetchAdminParticipants,\n fetchAdminThreads,\n} from \"./adminService\";\nexport { defaultAdminConfig, mergeAdminConfig } from \"./config\";\nexport type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminConfig,\n AdminDatePreset,\n AdminFilters,\n AdminMessage,\n AdminMessagePage,\n AdminMessagePageInfo,\n AdminOverview,\n AdminPage,\n AdminParticipantSummary,\n AdminRoute,\n AdminSectionState,\n AdminThreadDetail,\n AdminThreadSummary,\n RequestHeadersProvider,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n","import React, {\n useCallback,\n useDeferredValue,\n useMemo,\n useState,\n} from \"react\";\nimport { defaultAdminConfig, mergeAdminConfig } from \"./config\";\nimport { useCopilotzAdmin } from \"./useCopilotzAdmin\";\nimport { cn } from \"./lib/utils\";\nimport { Card, CardContent } from \"./components/ui/card\";\nimport { Button } from \"./components/ui/button\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { SidebarProvider, SidebarInset } from \"./components/ui/sidebar\";\nimport { AdminSidebar } from \"./components/layout/AdminSidebar\";\nimport { AdminHeader } from \"./components/layout/AdminHeader\";\nimport { DashboardView } from \"./components/views/DashboardView\";\nimport { ThreadsView } from \"./components/views/ThreadsView\";\nimport { ThreadDetailView } from \"./components/views/ThreadDetailView\";\nimport type {\n AdminConfig,\n AdminPage,\n AdminRoute,\n} from \"./types\";\n\nexport interface CopilotzAdminProps {\n config?: Partial<AdminConfig>;\n className?: string;\n}\n\nexport const CopilotzAdmin: React.FC<CopilotzAdminProps> = ({\n config: userConfig,\n className,\n}) => {\n const config = useMemo(\n () => mergeAdminConfig(defaultAdminConfig, userConfig),\n [userConfig],\n );\n\n const [route, setRoute] = useState<AdminRoute>({ page: config.defaultPage });\n\n const [threadSearch, setThreadSearch] = useState(\"\");\n const [participantSearch, setParticipantSearch] = useState(\"\");\n const [agentSearch, setAgentSearch] = useState(\"\");\n const deferredThreadSearch = useDeferredValue(threadSearch);\n const deferredParticipantSearch = useDeferredValue(participantSearch);\n const deferredAgentSearch = useDeferredValue(agentSearch);\n\n const admin = useCopilotzAdmin({\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n namespace: config.namespace,\n range: config.initialRange,\n interval: config.initialInterval,\n threadSearch: deferredThreadSearch,\n participantSearch: deferredParticipantSearch,\n agentSearch: deferredAgentSearch,\n });\n\n const navigate = useCallback(\n (next: AdminRoute) => {\n setRoute(next);\n config.onNavigate?.(next);\n },\n [config],\n );\n\n const handleSidebarNavigate = useCallback(\n (page: AdminPage) => navigate({ page }),\n [navigate],\n );\n\n const handleThreadClick = useCallback(\n (threadId: string) => navigate({ page: \"thread-detail\", resourceId: threadId }),\n [navigate],\n );\n\n const handleBackToThreads = useCallback(\n () => navigate({ page: \"threads\" }),\n [navigate],\n );\n\n // For sidebar highlighting, thread-detail maps to \"threads\"\n const sidebarPage = route.page === \"thread-detail\" ? \"threads\" : route.page;\n\n if (admin.isLoading && !admin.overview) {\n return (\n <Card className={cn(\"border-border\", className)}>\n <CardContent className=\"text-muted-foreground flex items-center justify-center min-h-[200px]\">\n {config.labels.loading}\n </CardContent>\n </Card>\n );\n }\n\n if (admin.error && !admin.overview) {\n return (\n <Card\n className={cn(\"border-destructive/50 bg-destructive/10\", className)}\n >\n <CardContent className=\"space-y-4\">\n <p className=\"text-base font-semibold text-destructive\">\n {admin.error.message}\n </p>\n <Button\n variant=\"destructive\"\n onClick={() => void admin.refresh()}\n >\n {config.labels.retry}\n </Button>\n </CardContent>\n </Card>\n );\n }\n\n const renderCurrentView = () => {\n switch (route.page) {\n case \"dashboard\":\n return (\n <DashboardView\n config={config}\n overview={admin.overview}\n activity={admin.activity}\n threads={admin.threads}\n participants={admin.participants}\n agents={admin.agents}\n interval={admin.filters.interval}\n threadSearch={threadSearch}\n participantSearch={participantSearch}\n agentSearch={agentSearch}\n onThreadSearchChange={setThreadSearch}\n onParticipantSearchChange={setParticipantSearch}\n onAgentSearchChange={setAgentSearch}\n onThreadClick={handleThreadClick}\n />\n );\n case \"threads\":\n return (\n <ThreadsView\n config={config}\n threads={admin.threads}\n searchValue={threadSearch}\n onSearchChange={setThreadSearch}\n onThreadClick={handleThreadClick}\n />\n );\n case \"thread-detail\":\n return route.resourceId ? (\n <ThreadDetailView\n threadId={route.resourceId}\n config={config}\n onBack={handleBackToThreads}\n />\n ) : null;\n case \"participants\":\n return (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">\n {config.labels.participantsTitle}\n </h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Detailed participant management coming soon.\n </p>\n </div>\n );\n case \"agents\":\n return (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">\n {config.labels.agentsTitle}\n </h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Agent configuration management coming soon.\n </p>\n </div>\n );\n case \"events\":\n return (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">\n {config.labels.eventsTitle}\n </h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Event inspector coming soon.\n </p>\n </div>\n );\n default:\n return null;\n }\n };\n\n return (\n <TooltipProvider>\n <SidebarProvider defaultOpen={config.sidebar.defaultOpen}>\n <div\n className={cn(\n \"flex h-[100svh] md:h-screen bg-background w-full overflow-hidden\",\n className,\n )}\n >\n <AdminSidebar\n config={config}\n currentPage={sidebarPage}\n onNavigate={handleSidebarNavigate}\n />\n\n <SidebarInset>\n <div className=\"flex flex-col h-full min-h-0\">\n <AdminHeader\n config={config}\n currentPage={route.page}\n range={admin.filters.range}\n interval={admin.filters.interval}\n onRangeChange={admin.setRange}\n onIntervalChange={admin.setInterval}\n onRefresh={() => void admin.refresh()}\n isLoading={admin.isLoading}\n />\n\n <div className=\"flex-1 overflow-auto p-6\">\n {renderCurrentView()}\n </div>\n </div>\n </SidebarInset>\n </div>\n </SidebarProvider>\n </TooltipProvider>\n );\n};\n","import type { AdminConfig, ResolvedAdminConfig } from \"./types\";\n\nexport const defaultAdminConfig: ResolvedAdminConfig = {\n branding: {\n title: \"Copilotz Admin\",\n subtitle: \"Operational visibility for Copilotz clients\",\n logo: null,\n actions: null,\n },\n labels: {\n overviewTitle: \"Overview\",\n activityTitle: \"Activity\",\n threadsTitle: \"Threads\",\n participantsTitle: \"Participants\",\n agentsTitle: \"Agents\",\n range24h: \"24h\",\n range7d: \"7d\",\n range30d: \"30d\",\n intervalHour: \"Hourly\",\n intervalDay: \"Daily\",\n refresh: \"Refresh\",\n retry: \"Try again\",\n loading: \"Loading admin data...\",\n emptyTitle: \"No activity yet\",\n emptyDescription: \"Admin metrics will appear after threads, events, and graph data start flowing.\",\n threadSearchPlaceholder: \"Search threads\",\n participantSearchPlaceholder: \"Search participants\",\n agentSearchPlaceholder: \"Search agents\",\n messagesCard: \"Messages\",\n activeThreadsCard: \"Active threads\",\n participantsCard: \"Participants\",\n tokensCard: \"LLM tokens\",\n queueCard: \"Queued events\",\n statusActive: \"Active\",\n statusArchived: \"Archived\",\n scopeGlobal: \"Global\",\n scopeScoped: \"Scoped\",\n configured: \"Configured\",\n unconfigured: \"Observed only\",\n noResults: \"No results\",\n eventsTitle: \"Events\",\n dashboardTitle: \"Dashboard\",\n },\n features: {\n showOverview: true,\n showActivity: true,\n showThreads: true,\n showParticipants: true,\n showAgents: true,\n showEvents: false,\n },\n ui: {\n compact: false,\n maxActivityBars: 18,\n },\n sidebar: {\n defaultOpen: true,\n collapsible: \"icon\",\n },\n baseUrl: \"\",\n getRequestHeaders: async () => ({}),\n namespace: \"\",\n initialRange: \"7d\",\n initialInterval: \"day\",\n defaultPage: \"dashboard\",\n onNavigate: null,\n};\n\nexport function mergeAdminConfig(\n _baseConfig: ResolvedAdminConfig,\n userConfig?: Partial<AdminConfig>,\n): ResolvedAdminConfig {\n if (!userConfig) return defaultAdminConfig;\n\n return {\n branding: {\n ...defaultAdminConfig.branding,\n ...userConfig.branding,\n },\n labels: {\n ...defaultAdminConfig.labels,\n ...userConfig.labels,\n },\n features: {\n ...defaultAdminConfig.features,\n ...userConfig.features,\n },\n ui: {\n ...defaultAdminConfig.ui,\n ...userConfig.ui,\n },\n sidebar: {\n ...defaultAdminConfig.sidebar,\n ...userConfig.sidebar,\n },\n baseUrl: userConfig.baseUrl ?? defaultAdminConfig.baseUrl,\n getRequestHeaders: userConfig.getRequestHeaders ??\n defaultAdminConfig.getRequestHeaders,\n namespace: userConfig.namespace ?? defaultAdminConfig.namespace,\n initialRange: userConfig.initialRange ?? defaultAdminConfig.initialRange,\n initialInterval: userConfig.initialInterval ??\n defaultAdminConfig.initialInterval,\n defaultPage: userConfig.defaultPage ?? defaultAdminConfig.defaultPage,\n onNavigate: userConfig.onNavigate ?? defaultAdminConfig.onNavigate,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n fetchAdminActivity,\n fetchAdminAgents,\n fetchAdminOverview,\n fetchAdminParticipants,\n fetchAdminThreads,\n} from \"./adminService\";\nimport type {\n AdminActivityInterval,\n AdminDatePreset,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n\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<UseCopilotzAdminResult[\"overview\"]>(\n null,\n );\n const [activity, setActivity] = useState<UseCopilotzAdminResult[\"activity\"]>(\n [],\n );\n const [threads, setThreads] = useState<UseCopilotzAdminResult[\"threads\"]>([]);\n const [participants, setParticipants] = useState<\n UseCopilotzAdminResult[\"participants\"]\n >([]);\n const [agents, setAgents] = useState<UseCopilotzAdminResult[\"agents\"]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAll = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const shared = {\n baseUrl: options.baseUrl,\n getRequestHeaders: options.getRequestHeaders,\n };\n const [\n nextOverview,\n nextActivity,\n nextThreads,\n nextParticipants,\n nextAgents,\n ] = await Promise.all([\n fetchAdminOverview(range, options.namespace, shared),\n fetchAdminActivity(range, interval, options.namespace, shared),\n fetchAdminThreads(options.threadSearch, options.namespace, shared),\n fetchAdminParticipants(\n options.participantSearch,\n options.namespace,\n shared,\n ),\n fetchAdminAgents(options.agentSearch, options.namespace, shared),\n ]);\n\n setOverview(nextOverview);\n setActivity(nextActivity);\n setThreads(nextThreads);\n setParticipants(nextParticipants);\n setAgents(nextAgents);\n } catch (nextError) {\n setError(nextError instanceof Error\n ? nextError\n : new Error(\"Failed to load admin data\"));\n } finally {\n setIsLoading(false);\n }\n }, [\n interval,\n options.agentSearch,\n options.baseUrl,\n options.getRequestHeaders,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n range,\n ]);\n\n useEffect(() => {\n void fetchAll();\n }, [fetchAll]);\n\n return useMemo(() => ({\n overview,\n activity,\n threads,\n participants,\n agents,\n filters: {\n namespace: options.namespace,\n threadSearch: options.threadSearch,\n participantSearch: options.participantSearch,\n agentSearch: options.agentSearch,\n range,\n interval,\n },\n isLoading,\n error,\n refresh: fetchAll,\n setRange,\n setInterval,\n }), [\n activity,\n agents,\n error,\n fetchAll,\n interval,\n isLoading,\n options.agentSearch,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n overview,\n participants,\n range,\n threads,\n ]);\n}\n","import type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminDatePreset,\n AdminOverview,\n AdminParticipantSummary,\n AdminThreadSummary,\n AdminThreadDetail,\n AdminMessage,\n AdminMessagePage,\n RequestHeadersProvider,\n} from \"./types\";\n\nconst rawBaseValue =\n (import.meta as { env?: Record<string, string | undefined> }).env\n ?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === \"string\" && rawBaseValue.length > 0\n ? rawBaseValue\n : \"/api\";\nconst normalizedBase = rawBase.replace(/\\/$/, \"\");\n\nconst runtimeProcess: typeof process | undefined =\n typeof process !== \"undefined\" ? process : undefined;\n\nconst API_KEY = (() => {\n const env =\n (import.meta as { env?: Record<string, string | undefined> }).env ?? {};\n const candidates = [\n env.VITE_API_KEY,\n env.VITE_COPILOTZ_API_KEY,\n runtimeProcess?.env?.COPILOTZ_API_KEY,\n runtimeProcess?.env?.API_KEY,\n ];\n return candidates.find((value) =>\n typeof value === \"string\" && value.length > 0\n );\n})();\n\nconst resolveBaseUrl = (baseUrl?: string) => {\n const candidate = (baseUrl && baseUrl.length > 0 ? baseUrl : normalizedBase)\n .replace(/\\/$/, \"\");\n return candidate.startsWith(\"http\") || candidate.startsWith(\"/\")\n ? candidate\n : `/${candidate}`;\n};\n\nconst withAuthHeaders = async (\n headers: Record<string, string> = {},\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> => {\n const providedHeaders = getRequestHeaders\n ? await getRequestHeaders()\n : undefined;\n if (providedHeaders && Object.keys(providedHeaders).length > 0) {\n return { ...headers, ...providedHeaders };\n }\n if (API_KEY) {\n return { ...headers, Authorization: `Bearer ${API_KEY}` };\n }\n return headers;\n};\n\nconst getRangeWindow = (range: AdminDatePreset) => {\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 {\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\ninterface FetchOptions {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n}\n\nasync function fetchAdminJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: FetchOptions,\n): Promise<T> {\n const url = new URL(`${resolveBaseUrl(options?.baseUrl)}${path}`, window.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\n const response = await fetch(url.toString(), {\n headers: await withAuthHeaders({}, options?.getRequestHeaders),\n });\n\n if (!response.ok) {\n throw new Error(`Admin request failed (${response.status})`);\n }\n\n const payload = await response.json() as { data?: T };\n return payload.data as T;\n}\n\nasync function fetchRawJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: FetchOptions,\n): Promise<T> {\n const url = new URL(`${resolveBaseUrl(options?.baseUrl)}${path}`, window.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\n const response = await fetch(url.toString(), {\n headers: await withAuthHeaders({}, options?.getRequestHeaders),\n });\n\n if (!response.ok) {\n throw new Error(`Admin request failed (${response.status})`);\n }\n\n return await response.json() as T;\n}\n\n// --- Admin aggregate endpoints ---\n\nexport async function fetchAdminOverview(\n range: AdminDatePreset,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminOverview> {\n const windowRange = getRangeWindow(range);\n return await fetchAdminJson<AdminOverview>(\"/v1/admin/overview\", {\n namespace,\n from: windowRange.from,\n to: windowRange.to,\n }, options);\n}\n\nexport async function fetchAdminActivity(\n range: AdminDatePreset,\n interval: AdminActivityInterval,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminActivityPoint[]> {\n const windowRange = getRangeWindow(range);\n return await fetchAdminJson<AdminActivityPoint[]>(\"/v1/admin/activity\", {\n namespace,\n interval,\n from: windowRange.from,\n to: windowRange.to,\n }, options);\n}\n\nexport async function fetchAdminThreads(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminThreadSummary[]> {\n return await fetchAdminJson<AdminThreadSummary[]>(\"/v1/admin/threads\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\nexport async function fetchAdminParticipants(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminParticipantSummary[]> {\n return await fetchAdminJson<AdminParticipantSummary[]>(\"/v1/admin/participants\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\nexport async function fetchAdminAgents(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminAgentSummary[]> {\n return await fetchAdminJson<AdminAgentSummary[]>(\"/v1/admin/agents\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\n// --- Thread detail + messages ---\n\nexport async function fetchThreadDetail(\n threadId: string,\n options?: FetchOptions,\n): Promise<AdminThreadDetail> {\n return await fetchAdminJson<AdminThreadDetail>(\n `/v1/threads/${encodeURIComponent(threadId)}`,\n {},\n options,\n );\n}\n\nexport async function fetchThreadMessages(\n threadId: string,\n messageOptions?: { limit?: number; before?: string },\n options?: FetchOptions,\n): Promise<AdminMessagePage> {\n return await fetchRawJson<AdminMessagePage>(\n `/v1/threads/${encodeURIComponent(threadId)}/messages`,\n {\n limit: messageOptions?.limit?.toString(),\n before: messageOptions?.before,\n },\n options,\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\"\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 * 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 * 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 { 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 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 React from \"react\";\nimport {\n LayoutDashboard,\n MessageSquare,\n Users,\n Bot,\n Activity,\n} from \"lucide-react\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n} from \"../ui/sidebar\";\nimport type { AdminPage, ResolvedAdminConfig } from \"../../types\";\n\ninterface NavItem {\n page: AdminPage;\n label: string;\n icon: React.ElementType;\n featureKey?: keyof ResolvedAdminConfig[\"features\"];\n}\n\nconst NAV_ITEMS: NavItem[] = [\n {\n page: \"dashboard\",\n label: \"Dashboard\",\n icon: LayoutDashboard,\n },\n {\n page: \"threads\",\n label: \"Threads\",\n icon: MessageSquare,\n featureKey: \"showThreads\",\n },\n {\n page: \"participants\",\n label: \"Participants\",\n icon: Users,\n featureKey: \"showParticipants\",\n },\n {\n page: \"agents\",\n label: \"Agents\",\n icon: Bot,\n featureKey: \"showAgents\",\n },\n {\n page: \"events\",\n label: \"Events\",\n icon: Activity,\n featureKey: \"showEvents\",\n },\n];\n\nexport interface AdminSidebarProps {\n config: ResolvedAdminConfig;\n currentPage: AdminPage;\n onNavigate: (page: AdminPage) => void;\n}\n\nexport const AdminSidebar: React.FC<AdminSidebarProps> = ({\n config,\n currentPage,\n onNavigate,\n}) => {\n const visibleItems = NAV_ITEMS.filter(\n (item) => !item.featureKey || config.features[item.featureKey],\n );\n\n return (\n <Sidebar collapsible={config.sidebar.collapsible}>\n <SidebarHeader>\n <div className=\"flex items-center gap-3 px-2 py-3\">\n <div className=\"flex items-center justify-center shrink-0\">\n {config.branding.logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground\">\n <LayoutDashboard className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n <div className=\"flex flex-col min-w-0 group-data-[collapsible=icon]:hidden\">\n <span className=\"text-sm font-semibold truncate\">\n {config.branding.title}\n </span>\n {config.branding.subtitle && (\n <span className=\"text-xs text-muted-foreground truncate\">\n {config.branding.subtitle}\n </span>\n )}\n </div>\n </div>\n </SidebarHeader>\n\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">\n Navigation\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {visibleItems.map((item) => {\n const Icon = item.icon;\n const label =\n config.labels[\n `${item.page}Title` as keyof typeof config.labels\n ] || item.label;\n return (\n <SidebarMenuItem key={item.page}>\n <SidebarMenuButton\n isActive={currentPage === item.page}\n onClick={() => onNavigate(item.page)}\n tooltip={label}\n >\n <Icon />\n <span>{label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n\n {config.namespace && (\n <SidebarFooter>\n <div className=\"px-2 py-2 text-xs text-muted-foreground group-data-[collapsible=icon]:hidden\">\n <span className=\"font-medium uppercase tracking-[0.18em]\">\n {config.namespace}\n </span>\n </div>\n </SidebarFooter>\n )}\n\n <SidebarRail />\n </Sidebar>\n );\n};\n","import React from \"react\";\nimport { RefreshCw } from \"lucide-react\";\nimport { Card, CardHeader } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { SidebarTrigger } from \"../ui/sidebar\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type {\n AdminDatePreset,\n AdminActivityInterval,\n AdminPage,\n ResolvedAdminConfig,\n} from \"../../types\";\n\nconst PAGE_TITLES: Record<AdminPage, string> = {\n dashboard: \"Dashboard\",\n threads: \"Threads\",\n \"thread-detail\": \"Thread Detail\",\n participants: \"Participants\",\n agents: \"Agents\",\n events: \"Events\",\n};\n\nexport interface AdminHeaderProps {\n config: ResolvedAdminConfig;\n currentPage: AdminPage;\n range: AdminDatePreset;\n interval: AdminActivityInterval;\n onRangeChange: (range: AdminDatePreset) => void;\n onIntervalChange: (interval: AdminActivityInterval) => void;\n onRefresh: () => void;\n isLoading?: boolean;\n}\n\nexport const AdminHeader: React.FC<AdminHeaderProps> = ({\n config,\n currentPage,\n range,\n interval,\n onRangeChange,\n onIntervalChange,\n onRefresh,\n isLoading,\n}) => {\n const pageTitle =\n config.labels[`${currentPage}Title` as keyof typeof config.labels] ||\n PAGE_TITLES[currentPage];\n\n return (\n <Card className=\"py-0 border-b rounded-none relative z-10 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80\">\n <CardHeader className=\"p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n {/* Left: sidebar trigger + page title */}\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n\n <h1 className=\"text-sm font-medium ml-2\">{pageTitle}</h1>\n </div>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right: filters + actions */}\n <div className=\"flex items-center gap-1\">\n {currentPage === \"dashboard\" && (\n <>\n <Button\n variant={range === \"24h\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"24h\")}\n >\n {config.labels.range24h}\n </Button>\n <Button\n variant={range === \"7d\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"7d\")}\n >\n {config.labels.range7d}\n </Button>\n <Button\n variant={range === \"30d\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"30d\")}\n >\n {config.labels.range30d}\n </Button>\n\n <Select\n value={interval}\n onValueChange={(v) =>\n onIntervalChange(v as AdminActivityInterval)\n }\n >\n <SelectTrigger className=\"h-7 w-[90px] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"hour\">\n {config.labels.intervalHour}\n </SelectItem>\n <SelectItem value=\"day\">\n {config.labels.intervalDay}\n </SelectItem>\n </SelectContent>\n </Select>\n </>\n )}\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onRefresh}\n disabled={isLoading}\n >\n <RefreshCw\n className={`h-4 w-4 ${isLoading ? \"animate-spin\" : \"\"}`}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config.labels.refresh}</TooltipContent>\n </Tooltip>\n\n {config.branding.actions}\n </div>\n </div>\n </CardHeader>\n </Card>\n );\n};\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 * 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 { cn } from \"../../lib/utils\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport type {\n AdminActivityPoint,\n AdminAgentSummary,\n AdminParticipantSummary,\n AdminThreadSummary,\n AdminOverview,\n ResolvedAdminConfig,\n} from \"../../types\";\n\ninterface DashboardViewProps {\n config: ResolvedAdminConfig;\n overview: AdminOverview | null;\n activity: AdminActivityPoint[];\n threads: AdminThreadSummary[];\n participants: AdminParticipantSummary[];\n agents: AdminAgentSummary[];\n interval: \"hour\" | \"day\";\n threadSearch: string;\n participantSearch: string;\n agentSearch: string;\n onThreadSearchChange: (value: string) => void;\n onParticipantSearchChange: (value: string) => void;\n onAgentSearchChange: (value: string) => void;\n onThreadClick?: (threadId: string) => void;\n}\n\nexport const DashboardView: React.FC<DashboardViewProps> = ({\n config,\n overview,\n activity,\n threads,\n participants,\n agents,\n interval,\n threadSearch,\n participantSearch,\n agentSearch,\n onThreadSearchChange,\n onParticipantSearchChange,\n onAgentSearchChange,\n onThreadClick,\n}) => {\n const cards = [\n {\n label: config.labels.messagesCard,\n value: overview?.messageTotals.total ?? 0,\n detail: `${overview?.messageTotals.toolCallMessages ?? 0} tool-call messages`,\n },\n {\n label: config.labels.activeThreadsCard,\n value: overview?.threadTotals.active ?? 0,\n detail: `${overview?.threadTotals.total ?? 0} total threads`,\n },\n {\n label: config.labels.participantsCard,\n value: overview?.participantTotals.total ?? 0,\n detail: `${overview?.participantTotals.agents ?? 0} agents`,\n },\n {\n label: config.labels.tokensCard,\n value: overview?.llmTotals.totalTokens ?? 0,\n detail: `${overview?.llmTotals.totalCalls ?? 0} calls`,\n },\n {\n label: config.labels.queueCard,\n value: overview?.queueTotals.pending ?? 0,\n detail: `${overview?.queueTotals.failed ?? 0} failed`,\n },\n ];\n\n const isEmpty =\n cards.every((card) => card.value === 0) &&\n activity.length === 0 &&\n threads.length === 0 &&\n participants.length === 0 &&\n agents.length === 0;\n\n return (\n <div className=\"space-y-6\">\n {isEmpty && (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">{config.labels.emptyTitle}</h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {config.labels.emptyDescription}\n </p>\n </div>\n )}\n\n {/* Overview Cards */}\n {config.features.showOverview && (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.overviewTitle} />\n <div className=\"grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-5\">\n {cards.map((card) => (\n <div\n className=\"rounded-xl border bg-card p-5 shadow-sm\"\n key={card.label}\n >\n <p className=\"text-sm font-medium text-muted-foreground\">\n {card.label}\n </p>\n <p className=\"mt-3 text-3xl font-semibold tracking-tight\">\n {formatNumber(card.value)}\n </p>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {card.detail}\n </p>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Activity Chart */}\n {config.features.showActivity && (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.activityTitle} />\n <ActivityChart\n interval={interval}\n labels={config.labels}\n maxBars={config.ui.maxActivityBars}\n points={activity}\n />\n </section>\n )}\n\n {/* Data Tables */}\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {config.features.showThreads && (\n <DataTable\n rows={threads}\n searchPlaceholder={config.labels.threadSearchPlaceholder}\n searchValue={threadSearch}\n setSearchValue={onThreadSearchChange}\n title={config.labels.threadsTitle}\n >\n <ThreadsTable\n rows={threads}\n labels={config.labels}\n onThreadClick={onThreadClick}\n />\n </DataTable>\n )}\n {config.features.showParticipants && (\n <DataTable\n rows={participants}\n searchPlaceholder={config.labels.participantSearchPlaceholder}\n searchValue={participantSearch}\n setSearchValue={onParticipantSearchChange}\n title={config.labels.participantsTitle}\n >\n <ParticipantsTable rows={participants} labels={config.labels} />\n </DataTable>\n )}\n {config.features.showAgents && (\n <DataTable\n rows={agents}\n searchPlaceholder={config.labels.agentSearchPlaceholder}\n searchValue={agentSearch}\n setSearchValue={onAgentSearchChange}\n title={config.labels.agentsTitle}\n >\n <AgentsTable rows={agents} labels={config.labels} />\n </DataTable>\n )}\n </div>\n </div>\n );\n};\n\nfunction SectionHeading({ title }: { title: string }) {\n return <h3 className=\"text-lg font-semibold tracking-tight\">{title}</h3>;\n}\n\nfunction ActivityChart(props: {\n points: AdminActivityPoint[];\n interval: \"hour\" | \"day\";\n maxBars: number;\n labels: ResolvedAdminConfig[\"labels\"];\n}) {\n const trimmedPoints = props.points.slice(-props.maxBars);\n const maxMessages = Math.max(\n ...trimmedPoints.map((point) => point.messageCount),\n 1,\n );\n\n return (\n <div className=\"rounded-xl border bg-card p-5 shadow-sm\">\n {trimmedPoints.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {props.labels.noResults}\n </p>\n ) : (\n <div className=\"flex min-h-48 items-end gap-2\">\n {trimmedPoints.map((point) => (\n <div\n className=\"flex min-w-0 flex-1 flex-col items-center gap-2\"\n key={point.bucket}\n >\n <div className=\"flex h-36 w-full items-end rounded-lg bg-muted px-1 pb-1\">\n <div\n className=\"w-full rounded-md bg-primary transition-all\"\n style={{\n height: `${Math.max((point.messageCount / maxMessages) * 100, 8)}%`,\n }}\n />\n </div>\n <div className=\"text-center\">\n <p className=\"text-xs font-medium\">\n {formatBucket(point.bucket, props.interval)}\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n {formatNumber(point.messageCount)} msg\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction DataTable<T>(props: {\n title: string;\n searchPlaceholder: string;\n searchValue: string;\n setSearchValue: (value: string) => void;\n rows: T[];\n children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border bg-card p-5 shadow-sm\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <SectionHeading title={props.title} />\n <Input\n className=\"h-8 w-full max-w-44\"\n onChange={(event) => props.setSearchValue(event.target.value)}\n placeholder={props.searchPlaceholder}\n value={props.searchValue}\n />\n </div>\n {props.rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No results</p>\n ) : (\n props.children\n )}\n </div>\n );\n}\n\nfunction ThreadsTable({\n rows,\n labels,\n onThreadClick,\n}: {\n rows: AdminThreadSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n onThreadClick?: (threadId: string) => void;\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((thread) => (\n <div\n className={cn(\n \"rounded-lg border bg-muted/50 p-4\",\n onThreadClick && \"cursor-pointer hover:bg-muted transition-colors\",\n )}\n key={thread.threadId}\n onClick={() => onThreadClick?.(thread.threadId)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{thread.name}</p>\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n {thread.summary ??\n thread.lastMessagePreview ??\n \"No summary yet\"}\n </p>\n </div>\n <Badge\n variant={\n thread.status === \"archived\" ? \"secondary\" : \"default\"\n }\n >\n {thread.status === \"archived\"\n ? labels.statusArchived\n : labels.statusActive}\n </Badge>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span>{formatNumber(thread.messageCount)} messages</span>\n <span>{thread.participantIds.length} participants</span>\n <span>{formatDate(thread.lastActivityAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ParticipantsTable({\n rows,\n labels,\n}: {\n rows: AdminParticipantSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((participant) => (\n <div\n className=\"rounded-lg border bg-muted/50 p-4\"\n key={`${participant.namespace}:${participant.externalId}`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{participant.displayName}</p>\n <p className=\"mt-1 text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {participant.participantType}\n </p>\n </div>\n <Badge variant=\"outline\">\n {participant.isGlobal\n ? labels.scopeGlobal\n : labels.scopeScoped}\n </Badge>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span>{formatNumber(participant.messageCount)} messages</span>\n <span>{formatNumber(participant.threadCount)} threads</span>\n <span>{formatDate(participant.lastActivityAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction AgentsTable({\n rows,\n labels,\n}: {\n rows: AdminAgentSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((agent) => (\n <div\n className=\"rounded-lg border bg-muted/50 p-4\"\n key={`${agent.namespace}:${agent.agentId}`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{agent.displayName}</p>\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n {agent.description ?? agent.agentId}\n </p>\n </div>\n <Badge variant=\"outline\">\n {agent.isConfigured\n ? labels.configured\n : labels.unconfigured}\n </Badge>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <span>{formatNumber(agent.messageCount)} messages</span>\n <span>{formatNumber(agent.llmCallCount)} LLM calls</span>\n <span>{formatNumber(agent.toolCallMessageCount)} tool calls</span>\n <span>{formatNumber(agent.totalTokens)} tokens</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction formatBucket(bucket: string, interval: \"hour\" | \"day\") {\n const date = new Date(bucket);\n if (Number.isNaN(date.getTime())) return bucket;\n return interval === \"hour\"\n ? date.toLocaleString(undefined, {\n hour: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })\n : date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction formatDate(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 month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n","import React from \"react\";\nimport { Search, MessageSquare } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport type { AdminThreadSummary, ResolvedAdminConfig } from \"../../types\";\n\ninterface ThreadsViewProps {\n config: ResolvedAdminConfig;\n threads: AdminThreadSummary[];\n searchValue: string;\n onSearchChange: (value: string) => void;\n onThreadClick?: (threadId: string) => void;\n}\n\nexport const ThreadsView: React.FC<ThreadsViewProps> = ({\n config,\n threads,\n searchValue,\n onSearchChange,\n onThreadClick,\n}) => {\n return (\n <div className=\"space-y-4\">\n {/* Search bar */}\n <div className=\"relative max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder={config.labels.threadSearchPlaceholder}\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n />\n </div>\n\n {/* Thread list */}\n {threads.length === 0 ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <MessageSquare className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {searchValue\n ? config.labels.noResults\n : config.labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {threads.map((thread) => (\n <div\n key={thread.threadId}\n className=\"flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50 cursor-pointer\"\n onClick={() => onThreadClick?.(thread.threadId)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium truncate\">{thread.name}</p>\n <Badge\n variant={\n thread.status === \"archived\" ? \"secondary\" : \"default\"\n }\n className=\"shrink-0\"\n >\n {thread.status === \"archived\"\n ? config.labels.statusArchived\n : config.labels.statusActive}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground truncate\">\n {thread.summary ??\n thread.lastMessagePreview ??\n \"No summary yet\"}\n </p>\n </div>\n <div className=\"text-right text-xs text-muted-foreground shrink-0 space-y-1\">\n <p>{formatNumber(thread.messageCount)} messages</p>\n <p>{thread.participantIds.length} participants</p>\n <p>{formatDate(thread.lastActivityAt)}</p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatDate(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 month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport {\n ArrowLeft,\n Bot,\n ChevronUp,\n Loader2,\n User,\n Wrench,\n Cpu,\n} from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport { fetchThreadDetail, fetchThreadMessages } from \"../../adminService\";\nimport type {\n AdminThreadDetail,\n AdminMessage,\n AdminMessagePageInfo,\n ResolvedAdminConfig,\n RequestHeadersProvider,\n} from \"../../types\";\n\ninterface ThreadDetailViewProps {\n threadId: string;\n config: ResolvedAdminConfig;\n onBack: () => void;\n}\n\nconst MESSAGES_PAGE_SIZE = 50;\n\nexport const ThreadDetailView: React.FC<ThreadDetailViewProps> = ({\n threadId,\n config,\n onBack,\n}) => {\n const [thread, setThread] = useState<AdminThreadDetail | null>(null);\n const [messages, setMessages] = useState<AdminMessage[]>([]);\n const [pageInfo, setPageInfo] = useState<AdminMessagePageInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const loadInitial = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const [threadData, messagesData] = await Promise.all([\n fetchThreadDetail(threadId, fetchOptions),\n fetchThreadMessages(threadId, { limit: MESSAGES_PAGE_SIZE }, fetchOptions),\n ]);\n setThread(threadData);\n setMessages(messagesData.data);\n setPageInfo(messagesData.pageInfo);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error(\"Failed to load thread\"),\n );\n } finally {\n setIsLoading(false);\n }\n }, [threadId, config.baseUrl, config.getRequestHeaders]);\n\n useEffect(() => {\n void loadInitial();\n }, [loadInitial]);\n\n const loadMore = useCallback(async () => {\n if (!pageInfo?.hasMoreBefore || !pageInfo.oldestMessageId || isLoadingMore) {\n return;\n }\n setIsLoadingMore(true);\n try {\n const older = await fetchThreadMessages(\n threadId,\n { limit: MESSAGES_PAGE_SIZE, before: pageInfo.oldestMessageId },\n fetchOptions,\n );\n setMessages((prev) => [...older.data, ...prev]);\n setPageInfo(older.pageInfo);\n } catch {\n // silently fail on pagination\n } finally {\n setIsLoadingMore(false);\n }\n }, [threadId, pageInfo, isLoadingMore, config.baseUrl, config.getRequestHeaders]);\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"space-y-4 py-10 text-center\">\n <p className=\"text-destructive font-medium\">{error.message}</p>\n <div className=\"flex justify-center gap-2\">\n <Button variant=\"outline\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n Back\n </Button>\n <Button variant=\"destructive\" onClick={() => void loadInitial()}>\n {config.labels.retry}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-start gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"mt-1 shrink-0\"\n onClick={onBack}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold truncate\">\n {thread?.name ?? threadId}\n </h2>\n <Badge\n variant={thread?.status === \"archived\" ? \"secondary\" : \"default\"}\n >\n {thread?.status === \"archived\"\n ? config.labels.statusArchived\n : config.labels.statusActive}\n </Badge>\n </div>\n {thread?.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {thread.summary}\n </p>\n )}\n <div className=\"mt-2 flex flex-wrap gap-4 text-xs text-muted-foreground\">\n {thread?.createdAt && (\n <span>Created {formatDate(thread.createdAt)}</span>\n )}\n {thread?.updatedAt && (\n <span>Updated {formatDate(thread.updatedAt)}</span>\n )}\n {thread?.participants && (\n <span>{thread.participants.length} participants</span>\n )}\n </div>\n </div>\n </div>\n\n {/* Messages */}\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Messages ({messages.length}\n {pageInfo?.hasMoreBefore ? \"+\" : \"\"})\n </h3>\n </div>\n\n {/* Load more */}\n {pageInfo?.hasMoreBefore && (\n <div className=\"flex justify-center py-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void loadMore()}\n disabled={isLoadingMore}\n >\n {isLoadingMore ? (\n <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" />\n ) : (\n <ChevronUp className=\"mr-2 h-3 w-3\" />\n )}\n Load older messages\n </Button>\n </div>\n )}\n\n {/* Message list */}\n <div className=\"rounded-lg border bg-card\">\n {messages.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-muted-foreground\">\n No messages in this thread yet.\n </p>\n ) : (\n <div className=\"divide-y\">\n {messages.map((message) => (\n <MessageRow key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nfunction MessageRow({ message }: { message: AdminMessage }) {\n const [expanded, setExpanded] = useState(false);\n const hasToolCalls =\n Array.isArray(message.toolCalls) && message.toolCalls.length > 0;\n const hasReasoning = !!message.reasoning;\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=\"flex-1 min-w-0\">\n <div className=\"flex 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] px-1.5 py-0\">\n {message.senderType}\n </Badge>\n {message.createdAt && (\n <span className=\"text-muted-foreground\">\n {formatTimestamp(message.createdAt)}\n </span>\n )}\n </div>\n\n {message.content && (\n <p className=\"mt-1 text-sm whitespace-pre-wrap break-words\">\n {message.content}\n </p>\n )}\n\n {(hasToolCalls || hasReasoning) && (\n <div className=\"mt-2 space-y-2\">\n {hasToolCalls && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Wrench className=\"h-3 w-3\" />\n {(message.toolCalls as unknown[]).length} tool call\n {(message.toolCalls as unknown[]).length > 1 ? \"s\" : \"\"}\n </button>\n )}\n {hasReasoning && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Cpu className=\"h-3 w-3\" />\n Reasoning\n </button>\n )}\n {expanded && (\n <pre className=\"mt-2 rounded-md bg-muted p-3 text-xs overflow-auto max-h-60\">\n {JSON.stringify(\n {\n ...(hasToolCalls ? { toolCalls: message.toolCalls } : {}),\n ...(hasReasoning ? { reasoning: message.reasoning } : {}),\n },\n null,\n 2,\n )}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SenderIcon({ senderType }: { senderType: string }) {\n const base =\n \"flex h-7 w-7 shrink-0 items-center justify-center rounded-full\";\n switch (senderType) {\n case \"agent\":\n return (\n <div className={cn(base, \"bg-primary/10 text-primary\")}>\n <Bot className=\"h-3.5 w-3.5\" />\n </div>\n );\n case \"user\":\n return (\n <div className={cn(base, \"bg-secondary text-secondary-foreground\")}>\n <User className=\"h-3.5 w-3.5\" />\n </div>\n );\n case \"tool\":\n return (\n <div className={cn(base, \"bg-muted text-muted-foreground\")}>\n <Wrench className=\"h-3.5 w-3.5\" />\n </div>\n );\n default:\n return (\n <div className={cn(base, \"bg-muted text-muted-foreground\")}>\n <Cpu className=\"h-3.5 w-3.5\" />\n </div>\n );\n }\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatTimestamp(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","open","import_lucide_react","import_jsx_runtime","Icon","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatNumber","formatDate","import_react","import_lucide_react","import_jsx_runtime","formatDate","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/CopilotzAdmin.tsx","../src/config.ts","../src/useCopilotzAdmin.ts","../src/adminService.ts","../src/lib/utils.ts","../src/components/ui/card.tsx","../src/components/ui/button.tsx","../src/components/ui/tooltip.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/layout/AdminSidebar.tsx","../src/components/ui/select.tsx","../src/components/layout/AdminHeader.tsx","../src/components/views/DashboardView.tsx","../src/components/ui/badge.tsx","../src/components/views/ThreadsView.tsx","../src/components/views/ThreadDetailView.tsx","../src/components/views/ParticipantsView.tsx","../src/components/views/ParticipantDetailView.tsx","../src/components/views/AgentsView.tsx","../src/components/views/AgentDetailView.tsx","../src/components/views/CollectionItemsView.tsx","../src/components/views/CollectionItemDetailView.tsx","../src/components/views/EventsView.tsx"],"sourcesContent":["export { CopilotzAdmin } from \"./CopilotzAdmin\";\nexport { useCopilotzAdmin } from \"./useCopilotzAdmin\";\nexport {\n fetchAdminActivity,\n fetchAdminAgents,\n fetchAdminOverview,\n fetchAdminParticipants,\n fetchAdminThreads,\n fetchParticipantDetail,\n updateParticipant,\n fetchCollectionNames,\n fetchCollectionItems,\n fetchCollectionItem,\n createCollectionItem,\n updateCollectionItem,\n deleteCollectionItem,\n fetchThreadEvents,\n} from \"./adminService\";\nexport { defaultAdminConfig, mergeAdminConfig } from \"./config\";\nexport type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminCollectionItem,\n AdminConfig,\n AdminDatePreset,\n AdminFilters,\n AdminMessage,\n AdminMessagePage,\n AdminMessagePageInfo,\n AdminOverview,\n AdminPage,\n AdminParticipantDetail,\n AdminParticipantSummary,\n AdminQueueEvent,\n AdminRoute,\n AdminSectionState,\n AdminThreadDetail,\n AdminThreadSummary,\n RequestHeadersProvider,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n","import React, {\n useCallback,\n useDeferredValue,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { defaultAdminConfig, mergeAdminConfig } from \"./config\";\nimport { useCopilotzAdmin } from \"./useCopilotzAdmin\";\nimport { fetchCollectionNames } from \"./adminService\";\nimport { cn } from \"./lib/utils\";\nimport { Card, CardContent } from \"./components/ui/card\";\nimport { Button } from \"./components/ui/button\";\nimport { TooltipProvider } from \"./components/ui/tooltip\";\nimport { SidebarProvider, SidebarInset } from \"./components/ui/sidebar\";\nimport { AdminSidebar } from \"./components/layout/AdminSidebar\";\nimport { AdminHeader } from \"./components/layout/AdminHeader\";\nimport { DashboardView } from \"./components/views/DashboardView\";\nimport { ThreadsView } from \"./components/views/ThreadsView\";\nimport { ThreadDetailView } from \"./components/views/ThreadDetailView\";\nimport { ParticipantsView } from \"./components/views/ParticipantsView\";\nimport { ParticipantDetailView } from \"./components/views/ParticipantDetailView\";\nimport { AgentsView } from \"./components/views/AgentsView\";\nimport { AgentDetailView } from \"./components/views/AgentDetailView\";\nimport { CollectionItemsView } from \"./components/views/CollectionItemsView\";\nimport { CollectionItemDetailView } from \"./components/views/CollectionItemDetailView\";\nimport { EventsView } from \"./components/views/EventsView\";\nimport type {\n AdminConfig,\n AdminPage,\n AdminRoute,\n} from \"./types\";\n\nexport interface CopilotzAdminProps {\n config?: Partial<AdminConfig>;\n className?: string;\n}\n\nexport const CopilotzAdmin: React.FC<CopilotzAdminProps> = ({\n config: userConfig,\n className,\n}) => {\n const config = useMemo(\n () => mergeAdminConfig(defaultAdminConfig, userConfig),\n [userConfig],\n );\n\n const [route, setRoute] = useState<AdminRoute>({ page: config.defaultPage });\n const [namespace, setNamespace] = useState(config.namespace);\n const [collections, setCollections] = useState<string[]>([]);\n\n const [threadSearch, setThreadSearch] = useState(\"\");\n const [participantSearch, setParticipantSearch] = useState(\"\");\n const [agentSearch, setAgentSearch] = useState(\"\");\n const deferredThreadSearch = useDeferredValue(threadSearch);\n const deferredParticipantSearch = useDeferredValue(participantSearch);\n const deferredAgentSearch = useDeferredValue(agentSearch);\n\n const admin = useCopilotzAdmin({\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n namespace,\n range: config.initialRange,\n interval: config.initialInterval,\n threadSearch: deferredThreadSearch,\n participantSearch: deferredParticipantSearch,\n agentSearch: deferredAgentSearch,\n });\n\n useEffect(() => {\n if (!config.features.showCollections) return;\n fetchCollectionNames({\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n })\n .then(setCollections)\n .catch(() => setCollections([]));\n }, [config.baseUrl, config.getRequestHeaders, config.features.showCollections]);\n\n const navigate = useCallback(\n (next: AdminRoute) => {\n setRoute(next);\n config.onNavigate?.(next);\n },\n [config],\n );\n\n const handleSidebarNavigate = useCallback(\n (page: AdminPage) => navigate({ page }),\n [navigate],\n );\n\n const handleSidebarRouteNavigate = useCallback(\n (r: AdminRoute) => navigate(r),\n [navigate],\n );\n\n // --- Navigation helpers ---\n const handleThreadClick = useCallback(\n (threadId: string) => navigate({ page: \"thread-detail\", resourceId: threadId }),\n [navigate],\n );\n const handleBackToThreads = useCallback(() => navigate({ page: \"threads\" }), [navigate]);\n\n const handleParticipantClick = useCallback(\n (id: string) => navigate({ page: \"participant-detail\", resourceId: id }),\n [navigate],\n );\n const handleBackToParticipants = useCallback(() => navigate({ page: \"participants\" }), [navigate]);\n\n const handleAgentClick = useCallback(\n (id: string) => navigate({ page: \"agent-detail\", resourceId: id }),\n [navigate],\n );\n const handleBackToAgents = useCallback(() => navigate({ page: \"agents\" }), [navigate]);\n\n const handleCollectionItemClick = useCallback(\n (itemId: string) => navigate({ page: \"collection-item-detail\", resourceId: itemId, collection: route.collection }),\n [navigate, route.collection],\n );\n const handleCollectionCreateNew = useCallback(\n () => navigate({ page: \"collection-item-detail\", resourceId: undefined, collection: route.collection }),\n [navigate, route.collection],\n );\n const handleBackToCollectionItems = useCallback(\n () => navigate({ page: \"collection-items\", collection: route.collection }),\n [navigate, route.collection],\n );\n\n // Sidebar highlighting — detail pages highlight their parent\n const sidebarPage = (() => {\n switch (route.page) {\n case \"thread-detail\": return \"threads\" as AdminPage;\n case \"participant-detail\": return \"participants\" as AdminPage;\n case \"agent-detail\": return \"agents\" as AdminPage;\n case \"collection-item-detail\": return \"collection-items\" as AdminPage;\n default: return route.page;\n }\n })();\n\n if (admin.isLoading && !admin.overview) {\n return (\n <Card className={cn(\"border-border\", className)}>\n <CardContent className=\"text-muted-foreground flex items-center justify-center min-h-[200px]\">\n {config.labels.loading}\n </CardContent>\n </Card>\n );\n }\n\n if (admin.error && !admin.overview) {\n return (\n <Card className={cn(\"border-destructive/50 bg-destructive/10\", className)}>\n <CardContent className=\"space-y-4\">\n <p className=\"text-base font-semibold text-destructive\">{admin.error.message}</p>\n <Button variant=\"destructive\" onClick={() => void admin.refresh()}>\n {config.labels.retry}\n </Button>\n </CardContent>\n </Card>\n );\n }\n\n const renderCurrentView = () => {\n switch (route.page) {\n case \"dashboard\":\n return (\n <DashboardView\n config={config}\n overview={admin.overview}\n activity={admin.activity}\n threads={admin.threads}\n participants={admin.participants}\n agents={admin.agents}\n interval={admin.filters.interval}\n threadSearch={threadSearch}\n participantSearch={participantSearch}\n agentSearch={agentSearch}\n onThreadSearchChange={setThreadSearch}\n onParticipantSearchChange={setParticipantSearch}\n onAgentSearchChange={setAgentSearch}\n onThreadClick={handleThreadClick}\n />\n );\n\n case \"threads\":\n return (\n <ThreadsView\n config={config}\n threads={admin.threads}\n searchValue={threadSearch}\n onSearchChange={setThreadSearch}\n onThreadClick={handleThreadClick}\n />\n );\n\n case \"thread-detail\":\n return route.resourceId ? (\n <ThreadDetailView threadId={route.resourceId} config={config} onBack={handleBackToThreads} />\n ) : null;\n\n case \"participants\":\n return (\n <ParticipantsView\n config={config}\n participants={admin.participants}\n searchValue={participantSearch}\n onSearchChange={setParticipantSearch}\n onParticipantClick={handleParticipantClick}\n />\n );\n\n case \"participant-detail\":\n return route.resourceId ? (\n <ParticipantDetailView participantId={route.resourceId} config={config} onBack={handleBackToParticipants} />\n ) : null;\n\n case \"agents\":\n return (\n <AgentsView\n config={config}\n agents={admin.agents}\n searchValue={agentSearch}\n onSearchChange={setAgentSearch}\n onAgentClick={handleAgentClick}\n />\n );\n\n case \"agent-detail\":\n return route.resourceId ? (\n <AgentDetailView agentId={route.resourceId} config={config} agents={admin.agents} onBack={handleBackToAgents} />\n ) : null;\n\n case \"collection-items\":\n return route.collection ? (\n <CollectionItemsView\n collection={route.collection}\n config={config}\n namespace={namespace}\n onItemClick={handleCollectionItemClick}\n onCreateNew={handleCollectionCreateNew}\n />\n ) : null;\n\n case \"collection-item-detail\":\n return route.collection ? (\n <CollectionItemDetailView\n collection={route.collection}\n itemId={route.resourceId ?? null}\n config={config}\n namespace={namespace}\n onBack={handleBackToCollectionItems}\n />\n ) : null;\n\n case \"events\":\n return <EventsView config={config} />;\n\n default:\n return null;\n }\n };\n\n return (\n <TooltipProvider>\n <SidebarProvider defaultOpen={config.sidebar.defaultOpen}>\n <div\n className={cn(\n \"flex h-[100svh] md:h-screen bg-background w-full overflow-hidden\",\n className,\n )}\n >\n <AdminSidebar\n config={config}\n currentPage={sidebarPage}\n currentRoute={route}\n onNavigate={handleSidebarNavigate}\n onNavigateRoute={handleSidebarRouteNavigate}\n collections={collections}\n namespace={namespace}\n onNamespaceChange={setNamespace}\n />\n\n <SidebarInset>\n <div className=\"flex flex-col h-full min-h-0\">\n <AdminHeader\n config={config}\n currentRoute={route}\n range={admin.filters.range}\n interval={admin.filters.interval}\n onRangeChange={admin.setRange}\n onIntervalChange={admin.setInterval}\n onRefresh={() => void admin.refresh()}\n isLoading={admin.isLoading}\n />\n\n <div className=\"flex-1 overflow-auto p-6\">\n {renderCurrentView()}\n </div>\n </div>\n </SidebarInset>\n </div>\n </SidebarProvider>\n </TooltipProvider>\n );\n};\n","import type { AdminConfig, ResolvedAdminConfig } from \"./types\";\n\nexport const defaultAdminConfig: ResolvedAdminConfig = {\n branding: {\n title: \"Copilotz Admin\",\n subtitle: \"Operational visibility for Copilotz clients\",\n logo: null,\n actions: null,\n },\n labels: {\n overviewTitle: \"Overview\",\n activityTitle: \"Activity\",\n threadsTitle: \"Threads\",\n participantsTitle: \"Participants\",\n agentsTitle: \"Agents\",\n range24h: \"24h\",\n range7d: \"7d\",\n range30d: \"30d\",\n intervalHour: \"Hourly\",\n intervalDay: \"Daily\",\n refresh: \"Refresh\",\n retry: \"Try again\",\n loading: \"Loading admin data...\",\n emptyTitle: \"No activity yet\",\n emptyDescription: \"Admin metrics will appear after threads, events, and graph data start flowing.\",\n threadSearchPlaceholder: \"Search threads\",\n participantSearchPlaceholder: \"Search participants\",\n agentSearchPlaceholder: \"Search agents\",\n messagesCard: \"Messages\",\n activeThreadsCard: \"Active threads\",\n participantsCard: \"Participants\",\n tokensCard: \"LLM tokens\",\n costCard: \"LLM cost\",\n queueCard: \"Queued events\",\n llmUsageTitle: \"LLM Usage\",\n usageMetricLabel: \"Metric\",\n usageDimensionLabel: \"Usage type\",\n usageMetricTokens: \"Tokens\",\n usageMetricCost: \"Cost\",\n usageTotal: \"Total\",\n usageInput: \"Input\",\n usageOutput: \"Output\",\n usageReasoning: \"Reasoning\",\n usageCacheRead: \"Cache read\",\n usageCacheWrite: \"Cache write\",\n usageCallsDetail: \"LLM calls\",\n usageUnavailableDetail: \"Available when provider-native usage exists\",\n statusActive: \"Active\",\n statusArchived: \"Archived\",\n scopeGlobal: \"Global\",\n scopeScoped: \"Scoped\",\n configured: \"Configured\",\n unconfigured: \"Observed only\",\n noResults: \"No results\",\n eventsTitle: \"Events\",\n dashboardTitle: \"Dashboard\",\n collectionsTitle: \"Collections\",\n collectionsEndpoint: \"/v1/collections\",\n },\n features: {\n showOverview: true,\n showActivity: true,\n showThreads: true,\n showParticipants: true,\n showAgents: true,\n showEvents: true,\n showCollections: true,\n },\n ui: {\n compact: false,\n maxActivityBars: 18,\n },\n sidebar: {\n defaultOpen: true,\n collapsible: \"icon\",\n },\n baseUrl: \"\",\n getRequestHeaders: async () => ({}),\n namespace: \"\",\n initialRange: \"7d\",\n initialInterval: \"day\",\n defaultPage: \"dashboard\",\n onNavigate: null,\n};\n\nexport function mergeAdminConfig(\n _baseConfig: ResolvedAdminConfig,\n userConfig?: Partial<AdminConfig>,\n): ResolvedAdminConfig {\n if (!userConfig) return defaultAdminConfig;\n\n return {\n branding: {\n ...defaultAdminConfig.branding,\n ...userConfig.branding,\n },\n labels: {\n ...defaultAdminConfig.labels,\n ...userConfig.labels,\n },\n features: {\n ...defaultAdminConfig.features,\n ...userConfig.features,\n },\n ui: {\n ...defaultAdminConfig.ui,\n ...userConfig.ui,\n },\n sidebar: {\n ...defaultAdminConfig.sidebar,\n ...userConfig.sidebar,\n },\n baseUrl: userConfig.baseUrl ?? defaultAdminConfig.baseUrl,\n getRequestHeaders: userConfig.getRequestHeaders ??\n defaultAdminConfig.getRequestHeaders,\n namespace: userConfig.namespace ?? defaultAdminConfig.namespace,\n initialRange: userConfig.initialRange ?? defaultAdminConfig.initialRange,\n initialInterval: userConfig.initialInterval ??\n defaultAdminConfig.initialInterval,\n defaultPage: userConfig.defaultPage ?? defaultAdminConfig.defaultPage,\n onNavigate: userConfig.onNavigate ?? defaultAdminConfig.onNavigate,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n fetchAdminActivity,\n fetchAdminAgents,\n fetchAdminOverview,\n fetchAdminParticipants,\n fetchAdminThreads,\n} from \"./adminService\";\nimport type {\n AdminActivityInterval,\n AdminDatePreset,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n\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<UseCopilotzAdminResult[\"overview\"]>(\n null,\n );\n const [activity, setActivity] = useState<UseCopilotzAdminResult[\"activity\"]>(\n [],\n );\n const [threads, setThreads] = useState<UseCopilotzAdminResult[\"threads\"]>([]);\n const [participants, setParticipants] = useState<\n UseCopilotzAdminResult[\"participants\"]\n >([]);\n const [agents, setAgents] = useState<UseCopilotzAdminResult[\"agents\"]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAll = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const shared = {\n baseUrl: options.baseUrl,\n getRequestHeaders: options.getRequestHeaders,\n };\n const [\n nextOverview,\n nextActivity,\n nextThreads,\n nextParticipants,\n nextAgents,\n ] = await Promise.all([\n fetchAdminOverview(range, options.namespace, shared),\n fetchAdminActivity(range, interval, options.namespace, shared),\n fetchAdminThreads(options.threadSearch, options.namespace, shared),\n fetchAdminParticipants(\n options.participantSearch,\n options.namespace,\n shared,\n ),\n fetchAdminAgents(options.agentSearch, options.namespace, shared),\n ]);\n\n setOverview(nextOverview);\n setActivity(nextActivity);\n setThreads(nextThreads);\n setParticipants(nextParticipants);\n setAgents(nextAgents);\n } catch (nextError) {\n setError(nextError instanceof Error\n ? nextError\n : new Error(\"Failed to load admin data\"));\n } finally {\n setIsLoading(false);\n }\n }, [\n interval,\n options.agentSearch,\n options.baseUrl,\n options.getRequestHeaders,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n range,\n ]);\n\n useEffect(() => {\n void fetchAll();\n }, [fetchAll]);\n\n return useMemo(() => ({\n overview,\n activity,\n threads,\n participants,\n agents,\n filters: {\n namespace: options.namespace,\n threadSearch: options.threadSearch,\n participantSearch: options.participantSearch,\n agentSearch: options.agentSearch,\n range,\n interval,\n },\n isLoading,\n error,\n refresh: fetchAll,\n setRange,\n setInterval,\n }), [\n activity,\n agents,\n error,\n fetchAll,\n interval,\n isLoading,\n options.agentSearch,\n options.namespace,\n options.participantSearch,\n options.threadSearch,\n overview,\n participants,\n range,\n threads,\n ]);\n}\n","import type {\n AdminActivityInterval,\n AdminActivityPoint,\n AdminAgentSummary,\n AdminCollectionItem,\n AdminDatePreset,\n AdminOverview,\n AdminParticipantDetail,\n AdminParticipantSummary,\n AdminQueueEvent,\n AdminThreadSummary,\n AdminThreadDetail,\n AdminMessage,\n AdminMessagePage,\n RequestHeadersProvider,\n} from \"./types\";\n\nconst rawBaseValue =\n (import.meta as { env?: Record<string, string | undefined> }).env\n ?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === \"string\" && rawBaseValue.length > 0\n ? rawBaseValue\n : \"/api\";\nconst normalizedBase = rawBase.replace(/\\/$/, \"\");\n\nconst runtimeProcess: typeof process | undefined =\n typeof process !== \"undefined\" ? process : undefined;\n\nconst API_KEY = (() => {\n const env =\n (import.meta as { env?: Record<string, string | undefined> }).env ?? {};\n const candidates = [\n env.VITE_API_KEY,\n env.VITE_COPILOTZ_API_KEY,\n runtimeProcess?.env?.COPILOTZ_API_KEY,\n runtimeProcess?.env?.API_KEY,\n ];\n return candidates.find((value) =>\n typeof value === \"string\" && value.length > 0\n );\n})();\n\nconst resolveBaseUrl = (baseUrl?: string) => {\n const candidate = (baseUrl && baseUrl.length > 0 ? baseUrl : normalizedBase)\n .replace(/\\/$/, \"\");\n return candidate.startsWith(\"http\") || candidate.startsWith(\"/\")\n ? candidate\n : `/${candidate}`;\n};\n\nconst withAuthHeaders = async (\n headers: Record<string, string> = {},\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> => {\n const providedHeaders = getRequestHeaders\n ? await getRequestHeaders()\n : undefined;\n if (providedHeaders && Object.keys(providedHeaders).length > 0) {\n return { ...headers, ...providedHeaders };\n }\n if (API_KEY) {\n return { ...headers, Authorization: `Bearer ${API_KEY}` };\n }\n return headers;\n};\n\nconst getRangeWindow = (range: AdminDatePreset) => {\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 {\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\ninterface FetchOptions {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n}\n\nasync function fetchAdminJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: FetchOptions,\n): Promise<T> {\n const url = new URL(`${resolveBaseUrl(options?.baseUrl)}${path}`, window.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\n const response = await fetch(url.toString(), {\n headers: await withAuthHeaders({}, options?.getRequestHeaders),\n });\n\n if (!response.ok) {\n throw new Error(`Admin request failed (${response.status})`);\n }\n\n const payload = await response.json() as { data?: T };\n return payload.data as T;\n}\n\nasync function fetchRawJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: FetchOptions,\n): Promise<T> {\n const url = new URL(`${resolveBaseUrl(options?.baseUrl)}${path}`, window.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\n const response = await fetch(url.toString(), {\n headers: await withAuthHeaders({}, options?.getRequestHeaders),\n });\n\n if (!response.ok) {\n throw new Error(`Admin request failed (${response.status})`);\n }\n\n return await response.json() as T;\n}\n\n// --- Admin aggregate endpoints ---\n\nexport async function fetchAdminOverview(\n range: AdminDatePreset,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminOverview> {\n const windowRange = getRangeWindow(range);\n return await fetchAdminJson<AdminOverview>(\"/v1/admin/overview\", {\n namespace,\n from: windowRange.from,\n to: windowRange.to,\n }, options);\n}\n\nexport async function fetchAdminActivity(\n range: AdminDatePreset,\n interval: AdminActivityInterval,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminActivityPoint[]> {\n const windowRange = getRangeWindow(range);\n return await fetchAdminJson<AdminActivityPoint[]>(\"/v1/admin/activity\", {\n namespace,\n interval,\n from: windowRange.from,\n to: windowRange.to,\n }, options);\n}\n\nexport async function fetchAdminThreads(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminThreadSummary[]> {\n return await fetchAdminJson<AdminThreadSummary[]>(\"/v1/admin/threads\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\nexport async function fetchAdminParticipants(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminParticipantSummary[]> {\n return await fetchAdminJson<AdminParticipantSummary[]>(\"/v1/admin/participants\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\nexport async function fetchAdminAgents(\n search?: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminAgentSummary[]> {\n return await fetchAdminJson<AdminAgentSummary[]>(\"/v1/admin/agents\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n\n// --- Thread detail + messages ---\n\nexport async function fetchThreadDetail(\n threadId: string,\n options?: FetchOptions,\n): Promise<AdminThreadDetail> {\n return await fetchAdminJson<AdminThreadDetail>(\n `/v1/threads/${encodeURIComponent(threadId)}`,\n {},\n options,\n );\n}\n\nexport async function fetchThreadMessages(\n threadId: string,\n messageOptions?: { limit?: number; before?: string },\n options?: FetchOptions,\n): Promise<AdminMessagePage> {\n return await fetchRawJson<AdminMessagePage>(\n `/v1/threads/${encodeURIComponent(threadId)}/messages`,\n {\n limit: messageOptions?.limit?.toString(),\n before: messageOptions?.before,\n },\n options,\n );\n}\n\n// --- Participant detail ---\n\nexport async function fetchParticipantDetail(\n participantId: string,\n options?: FetchOptions,\n): Promise<AdminParticipantDetail | null> {\n return await fetchAdminJson<AdminParticipantDetail | null>(\n `/v1/participants/${encodeURIComponent(participantId)}`,\n {},\n options,\n );\n}\n\nexport async function updateParticipant(\n participantId: string,\n data: Record<string, unknown>,\n options?: FetchOptions,\n): Promise<AdminParticipantDetail> {\n const url = new URL(\n `${resolveBaseUrl(options?.baseUrl)}/v1/participants/${encodeURIComponent(participantId)}`,\n window.location.origin,\n );\n const response = await fetch(url.toString(), {\n method: \"PUT\",\n headers: await withAuthHeaders(\n { \"Content-Type\": \"application/json\" },\n options?.getRequestHeaders,\n ),\n body: JSON.stringify(data),\n });\n if (!response.ok) {\n throw new Error(`Update participant failed (${response.status})`);\n }\n const payload = await response.json() as { data?: AdminParticipantDetail };\n return payload.data as AdminParticipantDetail;\n}\n\n// --- Collections ---\n\nexport async function fetchCollectionNames(\n options?: FetchOptions,\n): Promise<string[]> {\n return await fetchAdminJson<string[]>(\"/v1/collections\", {}, options);\n}\n\nexport async function fetchCollectionItems(\n collection: string,\n queryOptions?: { search?: string; namespace?: string; limit?: number; offset?: number },\n options?: FetchOptions,\n): Promise<AdminCollectionItem[]> {\n const params: Record<string, string | undefined> = {\n namespace: queryOptions?.namespace,\n limit: queryOptions?.limit?.toString(),\n };\n if (queryOptions?.search) {\n params.q = queryOptions.search;\n } else {\n params.offset = queryOptions?.offset?.toString();\n }\n return await fetchAdminJson<AdminCollectionItem[]>(\n `/v1/collections/${encodeURIComponent(collection)}`,\n params,\n options,\n );\n}\n\nexport async function fetchCollectionItem(\n collection: string,\n itemId: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminCollectionItem> {\n return await fetchAdminJson<AdminCollectionItem>(\n `/v1/collections/${encodeURIComponent(collection)}/${encodeURIComponent(itemId)}`,\n { namespace },\n options,\n );\n}\n\nexport async function createCollectionItem(\n collection: string,\n data: Record<string, unknown>,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminCollectionItem> {\n const url = new URL(\n `${resolveBaseUrl(options?.baseUrl)}/v1/collections/${encodeURIComponent(collection)}`,\n window.location.origin,\n );\n if (namespace) url.searchParams.set(\"namespace\", namespace);\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: await withAuthHeaders(\n { \"Content-Type\": \"application/json\" },\n options?.getRequestHeaders,\n ),\n body: JSON.stringify(data),\n });\n if (!response.ok) {\n throw new Error(`Create collection item failed (${response.status})`);\n }\n const payload = await response.json() as Record<string, unknown>;\n if (\"body\" in payload && payload.body && typeof payload.body === \"object\") {\n return payload.body as AdminCollectionItem;\n }\n return payload as AdminCollectionItem;\n}\n\nexport async function updateCollectionItem(\n collection: string,\n itemId: string,\n data: Record<string, unknown>,\n namespace?: string,\n options?: FetchOptions,\n): Promise<AdminCollectionItem> {\n const url = new URL(\n `${resolveBaseUrl(options?.baseUrl)}/v1/collections/${encodeURIComponent(collection)}/${encodeURIComponent(itemId)}`,\n window.location.origin,\n );\n if (namespace) url.searchParams.set(\"namespace\", namespace);\n const response = await fetch(url.toString(), {\n method: \"PUT\",\n headers: await withAuthHeaders(\n { \"Content-Type\": \"application/json\" },\n options?.getRequestHeaders,\n ),\n body: JSON.stringify(data),\n });\n if (!response.ok) {\n throw new Error(`Update collection item failed (${response.status})`);\n }\n const payload = await response.json() as { data?: AdminCollectionItem };\n return payload.data as AdminCollectionItem;\n}\n\nexport async function deleteCollectionItem(\n collection: string,\n itemId: string,\n namespace?: string,\n options?: FetchOptions,\n): Promise<void> {\n const url = new URL(\n `${resolveBaseUrl(options?.baseUrl)}/v1/collections/${encodeURIComponent(collection)}/${encodeURIComponent(itemId)}`,\n window.location.origin,\n );\n if (namespace) url.searchParams.set(\"namespace\", namespace);\n const response = await fetch(url.toString(), {\n method: \"DELETE\",\n headers: await withAuthHeaders({}, options?.getRequestHeaders),\n });\n if (!response.ok) {\n throw new Error(`Delete collection item failed (${response.status})`);\n }\n}\n\n// --- Thread events ---\n\nexport async function fetchThreadEvents(\n threadId: string,\n options?: FetchOptions,\n): Promise<AdminQueueEvent | undefined> {\n return await fetchAdminJson<AdminQueueEvent | undefined>(\n `/v1/threads/${encodeURIComponent(threadId)}/events`,\n {},\n options,\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\"\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 * 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 * 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 { 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 React from \"react\";\nimport {\n LayoutDashboard,\n MessageSquare,\n Users,\n Bot,\n Activity,\n Database,\n ChevronsUpDown,\n} from \"lucide-react\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n SidebarSeparator,\n} from \"../ui/sidebar\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type { AdminPage, AdminRoute, ResolvedAdminConfig } from \"../../types\";\n\ninterface NavItem {\n page: AdminPage;\n label: string;\n icon: React.ElementType;\n featureKey?: keyof ResolvedAdminConfig[\"features\"];\n}\n\nconst NAV_ITEMS: NavItem[] = [\n { page: \"dashboard\", label: \"Dashboard\", icon: LayoutDashboard },\n { page: \"threads\", label: \"Threads\", icon: MessageSquare, featureKey: \"showThreads\" },\n { page: \"participants\", label: \"Participants\", icon: Users, featureKey: \"showParticipants\" },\n { page: \"agents\", label: \"Agents\", icon: Bot, featureKey: \"showAgents\" },\n { page: \"events\", label: \"Events\", icon: Activity, featureKey: \"showEvents\" },\n];\n\nexport interface AdminSidebarProps {\n config: ResolvedAdminConfig;\n currentPage: AdminPage;\n currentRoute: AdminRoute;\n onNavigate: (page: AdminPage) => void;\n onNavigateRoute: (route: AdminRoute) => void;\n collections: string[];\n namespace: string;\n onNamespaceChange: (namespace: string) => void;\n}\n\nexport const AdminSidebar: React.FC<AdminSidebarProps> = ({\n config,\n currentPage,\n currentRoute,\n onNavigate,\n onNavigateRoute,\n collections,\n namespace,\n onNamespaceChange,\n}) => {\n const visibleItems = NAV_ITEMS.filter(\n (item) => !item.featureKey || config.features[item.featureKey],\n );\n\n const showCollections = config.features.showCollections && collections.length > 0;\n\n return (\n <Sidebar collapsible={config.sidebar.collapsible}>\n <SidebarHeader>\n <div className=\"flex items-center gap-3 px-2 py-3\">\n <div className=\"flex items-center justify-center shrink-0\">\n {config.branding.logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground\">\n <LayoutDashboard className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n <div className=\"flex flex-col min-w-0 group-data-[collapsible=icon]:hidden\">\n <span className=\"text-sm font-semibold truncate\">\n {config.branding.title}\n </span>\n {config.branding.subtitle && (\n <span className=\"text-xs text-muted-foreground truncate\">\n {config.branding.subtitle}\n </span>\n )}\n </div>\n </div>\n </SidebarHeader>\n\n <SidebarContent>\n {/* Main navigation */}\n <SidebarGroup>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">\n Navigation\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {visibleItems.map((item) => {\n const Icon = item.icon;\n const label =\n config.labels[`${item.page}Title` as keyof typeof config.labels] ||\n item.label;\n return (\n <SidebarMenuItem key={item.page}>\n <SidebarMenuButton\n isActive={currentPage === item.page}\n onClick={() => onNavigate(item.page)}\n tooltip={label}\n >\n <Icon />\n <span>{label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n\n {/* Dynamic collections */}\n {showCollections && (\n <>\n <SidebarSeparator />\n <SidebarGroup>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">\n {config.labels.collectionsTitle}\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {collections.map((col) => (\n <SidebarMenuItem key={col}>\n <SidebarMenuButton\n isActive={\n currentRoute.page === \"collection-items\" &&\n currentRoute.collection === col\n }\n onClick={() =>\n onNavigateRoute({ page: \"collection-items\", collection: col })\n }\n tooltip={col}\n >\n <Database />\n <span className=\"capitalize\">{col}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </>\n )}\n </SidebarContent>\n\n <SidebarFooter>\n {/* Namespace selector */}\n <div className=\"group-data-[collapsible=icon]:hidden\">\n <label className=\"text-xs font-medium text-muted-foreground mb-1 block px-2\">\n Namespace\n </label>\n <Select value={namespace || \"__all__\"} onValueChange={(v) => onNamespaceChange(v === \"__all__\" ? \"\" : v)}>\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"All namespaces\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">All namespaces</SelectItem>\n {config.namespace && (\n <SelectItem value={config.namespace}>{config.namespace}</SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n <div className=\"hidden group-data-[collapsible=icon]:flex justify-center\">\n <ChevronsUpDown className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n </SidebarFooter>\n\n <SidebarRail />\n </Sidebar>\n );\n};\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 { RefreshCw } from \"lucide-react\";\nimport { Card, CardHeader } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { SidebarTrigger } from \"../ui/sidebar\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type {\n AdminDatePreset,\n AdminActivityInterval,\n AdminPage,\n AdminRoute,\n ResolvedAdminConfig,\n} from \"../../types\";\n\nconst PAGE_TITLES: Record<string, string> = {\n dashboard: \"Dashboard\",\n threads: \"Threads\",\n \"thread-detail\": \"Thread Detail\",\n participants: \"Participants\",\n \"participant-detail\": \"Participant Detail\",\n agents: \"Agents\",\n \"agent-detail\": \"Agent Detail\",\n \"collection-items\": \"Collection\",\n \"collection-item-detail\": \"Item Detail\",\n events: \"Events\",\n};\n\nexport interface AdminHeaderProps {\n config: ResolvedAdminConfig;\n currentRoute: AdminRoute;\n range: AdminDatePreset;\n interval: AdminActivityInterval;\n onRangeChange: (range: AdminDatePreset) => void;\n onIntervalChange: (interval: AdminActivityInterval) => void;\n onRefresh: () => void;\n isLoading?: boolean;\n}\n\nexport const AdminHeader: React.FC<AdminHeaderProps> = ({\n config,\n currentRoute,\n range,\n interval,\n onRangeChange,\n onIntervalChange,\n onRefresh,\n isLoading,\n}) => {\n let pageTitle =\n config.labels[`${currentRoute.page}Title` as keyof typeof config.labels] ||\n PAGE_TITLES[currentRoute.page] ||\n currentRoute.page;\n\n if (currentRoute.page === \"collection-items\" && currentRoute.collection) {\n pageTitle = currentRoute.collection.charAt(0).toUpperCase() + currentRoute.collection.slice(1);\n }\n\n return (\n <Card className=\"py-0 border-b rounded-none relative z-10 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80\">\n <CardHeader className=\"p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <h1 className=\"text-sm font-medium ml-2\">{pageTitle}</h1>\n </div>\n\n <div className=\"flex-1\" />\n\n <div className=\"flex items-center gap-1\">\n {currentRoute.page === \"dashboard\" && (\n <>\n <Button\n variant={range === \"24h\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"24h\")}\n >\n {config.labels.range24h}\n </Button>\n <Button\n variant={range === \"7d\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"7d\")}\n >\n {config.labels.range7d}\n </Button>\n <Button\n variant={range === \"30d\" ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => onRangeChange(\"30d\")}\n >\n {config.labels.range30d}\n </Button>\n\n <Select\n value={interval}\n onValueChange={(v) =>\n onIntervalChange(v as AdminActivityInterval)\n }\n >\n <SelectTrigger className=\"h-7 w-[90px] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"hour\">\n {config.labels.intervalHour}\n </SelectItem>\n <SelectItem value=\"day\">\n {config.labels.intervalDay}\n </SelectItem>\n </SelectContent>\n </Select>\n </>\n )}\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onRefresh}\n disabled={isLoading}\n >\n <RefreshCw\n className={`h-4 w-4 ${isLoading ? \"animate-spin\" : \"\"}`}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config.labels.refresh}</TooltipContent>\n </Tooltip>\n\n {config.branding.actions}\n </div>\n </div>\n </CardHeader>\n </Card>\n );\n};\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type {\n AdminActivityPoint,\n AdminAgentSummary,\n AdminParticipantSummary,\n AdminThreadSummary,\n AdminOverview,\n AdminUsageDimension,\n AdminUsageMetricKind,\n ResolvedAdminConfig,\n} from \"../../types\";\n\ninterface DashboardViewProps {\n config: ResolvedAdminConfig;\n overview: AdminOverview | null;\n activity: AdminActivityPoint[];\n threads: AdminThreadSummary[];\n participants: AdminParticipantSummary[];\n agents: AdminAgentSummary[];\n interval: \"hour\" | \"day\";\n threadSearch: string;\n participantSearch: string;\n agentSearch: string;\n onThreadSearchChange: (value: string) => void;\n onParticipantSearchChange: (value: string) => void;\n onAgentSearchChange: (value: string) => void;\n onThreadClick?: (threadId: string) => void;\n}\n\nexport const DashboardView: React.FC<DashboardViewProps> = ({\n config,\n overview,\n activity,\n threads,\n participants,\n agents,\n interval,\n threadSearch,\n participantSearch,\n agentSearch,\n onThreadSearchChange,\n onParticipantSearchChange,\n onAgentSearchChange,\n onThreadClick,\n}) => {\n const [usageMetricKind, setUsageMetricKind] = React.useState<AdminUsageMetricKind>(\n \"tokens\",\n );\n const [usageDimension, setUsageDimension] = React.useState<AdminUsageDimension>(\n \"total\",\n );\n\n const llmSummaryValue = overview\n ? getOverviewUsageValue(overview, usageMetricKind, usageDimension)\n : 0;\n const llmSummaryLabel = getUsageSummaryLabel(\n config.labels,\n usageMetricKind,\n usageDimension,\n );\n const usageBreakdownCards = USAGE_DIMENSIONS.map((dimension) => ({\n dimension,\n label: getUsageDimensionLabel(config.labels, dimension),\n value: overview\n ? getOverviewUsageValue(overview, usageMetricKind, dimension)\n : 0,\n }));\n\n const cards = [\n {\n label: config.labels.messagesCard,\n value: overview?.messageTotals.total ?? 0,\n detail: `${overview?.messageTotals.toolCallMessages ?? 0} tool-call messages`,\n },\n {\n label: config.labels.activeThreadsCard,\n value: overview?.threadTotals.active ?? 0,\n detail: `${overview?.threadTotals.total ?? 0} total threads`,\n },\n {\n label: config.labels.participantsCard,\n value: overview?.participantTotals.total ?? 0,\n detail: `${overview?.participantTotals.agents ?? 0} agents`,\n },\n {\n label: llmSummaryLabel,\n value: llmSummaryValue,\n detail: `${overview?.llmTotals.totalCalls ?? 0} ${config.labels.usageCallsDetail}`,\n metricKind: usageMetricKind,\n },\n {\n label: config.labels.queueCard,\n value: overview?.queueTotals.pending ?? 0,\n detail: `${overview?.queueTotals.failed ?? 0} failed`,\n },\n ];\n\n const isEmpty =\n cards.every((card) => card.value === 0) &&\n activity.length === 0 &&\n threads.length === 0 &&\n participants.length === 0 &&\n agents.length === 0;\n\n return (\n <div className=\"space-y-6\">\n {isEmpty && (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">{config.labels.emptyTitle}</h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {config.labels.emptyDescription}\n </p>\n </div>\n )}\n\n {/* Overview Cards */}\n {config.features.showOverview && (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.overviewTitle} />\n <div className=\"grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-5\">\n {cards.map((card) => (\n <div\n className=\"rounded-xl border bg-card p-5 shadow-sm\"\n key={card.label}\n >\n <p className=\"text-sm font-medium text-muted-foreground\">\n {card.label}\n </p>\n <p className=\"mt-3 text-3xl font-semibold tracking-tight\">\n {formatMetricValue(\n card.value,\n card.metricKind ?? \"tokens\",\n )}\n </p>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {card.detail}\n </p>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {config.features.showOverview && (\n <section className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <SectionHeading title={config.labels.llmUsageTitle} />\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground\">\n {config.labels.usageMetricLabel}\n </p>\n <Select\n value={usageMetricKind}\n onValueChange={(value) =>\n setUsageMetricKind(value as AdminUsageMetricKind)}\n >\n <SelectTrigger className=\"h-9 w-full min-w-[160px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"tokens\">\n {config.labels.usageMetricTokens}\n </SelectItem>\n <SelectItem value=\"cost\">\n {config.labels.usageMetricCost}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground\">\n {config.labels.usageDimensionLabel}\n </p>\n <Select\n value={usageDimension}\n onValueChange={(value) =>\n setUsageDimension(value as AdminUsageDimension)}\n >\n <SelectTrigger className=\"h-9 w-full min-w-[160px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {USAGE_DIMENSIONS.map((dimension) => (\n <SelectItem key={dimension} value={dimension}>\n {getUsageDimensionLabel(config.labels, dimension)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n {usageBreakdownCards.map((card) => {\n const isSelected = card.dimension === usageDimension;\n return (\n <div\n className={cn(\n \"rounded-xl border bg-card p-5 shadow-sm transition-colors\",\n isSelected && \"border-primary/60 ring-1 ring-primary/15\",\n )}\n key={card.dimension}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {card.label}\n </p>\n <p className=\"mt-3 text-2xl font-semibold tracking-tight\">\n {formatMetricValue(card.value, usageMetricKind)}\n </p>\n </div>\n {isSelected && (\n <Badge variant=\"outline\">\n {config.labels.usageDimensionLabel}\n </Badge>\n )}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {overview?.llmTotals.totalCalls ?? 0} {config.labels.usageCallsDetail}\n </p>\n </div>\n );\n })}\n </div>\n </section>\n )}\n\n {/* Activity Chart */}\n {config.features.showActivity && (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.activityTitle} />\n <ActivityChart\n interval={interval}\n labels={config.labels}\n maxBars={config.ui.maxActivityBars}\n points={activity}\n usageDimension={usageDimension}\n usageMetricKind={usageMetricKind}\n />\n </section>\n )}\n\n {/* Data Tables */}\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {config.features.showThreads && (\n <DataTable\n rows={threads}\n searchPlaceholder={config.labels.threadSearchPlaceholder}\n searchValue={threadSearch}\n setSearchValue={onThreadSearchChange}\n title={config.labels.threadsTitle}\n >\n <ThreadsTable\n rows={threads}\n labels={config.labels}\n onThreadClick={onThreadClick}\n />\n </DataTable>\n )}\n {config.features.showParticipants && (\n <DataTable\n rows={participants}\n searchPlaceholder={config.labels.participantSearchPlaceholder}\n searchValue={participantSearch}\n setSearchValue={onParticipantSearchChange}\n title={config.labels.participantsTitle}\n >\n <ParticipantsTable rows={participants} labels={config.labels} />\n </DataTable>\n )}\n {config.features.showAgents && (\n <DataTable\n rows={agents}\n searchPlaceholder={config.labels.agentSearchPlaceholder}\n searchValue={agentSearch}\n setSearchValue={onAgentSearchChange}\n title={config.labels.agentsTitle}\n >\n <AgentsTable\n rows={agents}\n labels={config.labels}\n usageMetricKind={usageMetricKind}\n usageDimension={usageDimension}\n />\n </DataTable>\n )}\n </div>\n </div>\n );\n};\n\nfunction SectionHeading({ title }: { title: string }) {\n return <h3 className=\"text-lg font-semibold tracking-tight\">{title}</h3>;\n}\n\nfunction ActivityChart(props: {\n points: AdminActivityPoint[];\n interval: \"hour\" | \"day\";\n maxBars: number;\n labels: ResolvedAdminConfig[\"labels\"];\n usageMetricKind: AdminUsageMetricKind;\n usageDimension: AdminUsageDimension;\n}) {\n const trimmedPoints = props.points.slice(-props.maxBars);\n const maxUsageValue = Math.max(\n ...trimmedPoints.map((point) =>\n getActivityUsageValue(\n point,\n props.usageMetricKind,\n props.usageDimension,\n )\n ),\n 1,\n );\n\n return (\n <div className=\"rounded-xl border bg-card p-5 shadow-sm\">\n {trimmedPoints.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {props.labels.noResults}\n </p>\n ) : (\n <div className=\"flex min-h-48 items-end gap-2\">\n {trimmedPoints.map((point) => {\n const usageValue = getActivityUsageValue(\n point,\n props.usageMetricKind,\n props.usageDimension,\n );\n return (\n <div\n className=\"flex min-w-0 flex-1 flex-col items-center gap-2\"\n key={point.bucket}\n >\n <div className=\"flex h-36 w-full items-end rounded-lg bg-muted px-1 pb-1\">\n <div\n className=\"w-full rounded-md bg-primary transition-all\"\n style={{\n height: `${Math.max((usageValue / maxUsageValue) * 100, 8)}%`,\n }}\n />\n </div>\n <div className=\"text-center\">\n <p className=\"text-xs font-medium\">\n {formatBucket(point.bucket, props.interval)}\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n {formatMetricValue(usageValue, props.usageMetricKind)}\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n {formatNumber(point.totalCalls)} {props.labels.usageCallsDetail}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction DataTable<T>(props: {\n title: string;\n searchPlaceholder: string;\n searchValue: string;\n setSearchValue: (value: string) => void;\n rows: T[];\n children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border bg-card p-5 shadow-sm\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <SectionHeading title={props.title} />\n <Input\n className=\"h-8 w-full max-w-44\"\n onChange={(event) => props.setSearchValue(event.target.value)}\n placeholder={props.searchPlaceholder}\n value={props.searchValue}\n />\n </div>\n {props.rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No results</p>\n ) : (\n props.children\n )}\n </div>\n );\n}\n\nfunction ThreadsTable({\n rows,\n labels,\n onThreadClick,\n}: {\n rows: AdminThreadSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n onThreadClick?: (threadId: string) => void;\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((thread) => (\n <div\n className={cn(\n \"rounded-lg border bg-muted/50 p-4\",\n onThreadClick && \"cursor-pointer hover:bg-muted transition-colors\",\n )}\n key={thread.threadId}\n onClick={() => onThreadClick?.(thread.threadId)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{thread.name}</p>\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n {thread.summary ??\n thread.lastMessagePreview ??\n \"No summary yet\"}\n </p>\n </div>\n <Badge\n variant={\n thread.status === \"archived\" ? \"secondary\" : \"default\"\n }\n >\n {thread.status === \"archived\"\n ? labels.statusArchived\n : labels.statusActive}\n </Badge>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span>{formatNumber(thread.messageCount)} messages</span>\n <span>{thread.participantIds.length} participants</span>\n <span>{formatDate(thread.lastActivityAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ParticipantsTable({\n rows,\n labels,\n}: {\n rows: AdminParticipantSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((participant) => (\n <div\n className=\"rounded-lg border bg-muted/50 p-4\"\n key={`${participant.namespace}:${participant.externalId}`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{participant.displayName}</p>\n <p className=\"mt-1 text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {participant.participantType}\n </p>\n </div>\n <Badge variant=\"outline\">\n {participant.isGlobal\n ? labels.scopeGlobal\n : labels.scopeScoped}\n </Badge>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span>{formatNumber(participant.messageCount)} messages</span>\n <span>{formatNumber(participant.threadCount)} threads</span>\n <span>{formatDate(participant.lastActivityAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction AgentsTable({\n rows,\n labels,\n usageMetricKind,\n usageDimension,\n}: {\n rows: AdminAgentSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n usageMetricKind: AdminUsageMetricKind;\n usageDimension: AdminUsageDimension;\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((agent) => (\n <div\n className=\"rounded-lg border bg-muted/50 p-4\"\n key={`${agent.namespace}:${agent.agentId}`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{agent.displayName}</p>\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n {agent.description ?? agent.agentId}\n </p>\n </div>\n <Badge variant=\"outline\">\n {agent.isConfigured\n ? labels.configured\n : labels.unconfigured}\n </Badge>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs\">\n {[\n {\n label: \"Messages\",\n value: formatNumber(agent.messageCount),\n },\n {\n label: \"LLM calls\",\n value: formatNumber(agent.llmCallCount),\n },\n {\n label: \"Tool calls\",\n value: formatNumber(agent.toolCallMessageCount),\n },\n {\n label: getUsageSummaryLabel(labels, usageMetricKind, usageDimension),\n value: formatMetricValue(\n getAgentUsageValue(agent, usageMetricKind, usageDimension),\n usageMetricKind,\n ),\n },\n ].map((item) => (\n <div key={item.label}>\n <p className=\"font-medium text-foreground\">{item.value}</p>\n <p className=\"text-muted-foreground\">{item.label}</p>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction formatBucket(bucket: string, interval: \"hour\" | \"day\") {\n const date = new Date(bucket);\n if (Number.isNaN(date.getTime())) return bucket;\n return interval === \"hour\"\n ? date.toLocaleString(undefined, {\n hour: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })\n : date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction formatDate(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 month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n\nconst USAGE_DIMENSIONS: AdminUsageDimension[] = [\n \"total\",\n \"input\",\n \"output\",\n \"reasoning\",\n \"cacheRead\",\n \"cacheWrite\",\n];\n\nfunction getUsageDimensionLabel(\n labels: ResolvedAdminConfig[\"labels\"],\n dimension: AdminUsageDimension,\n) {\n switch (dimension) {\n case \"input\":\n return labels.usageInput;\n case \"output\":\n return labels.usageOutput;\n case \"reasoning\":\n return labels.usageReasoning;\n case \"cacheRead\":\n return labels.usageCacheRead;\n case \"cacheWrite\":\n return labels.usageCacheWrite;\n case \"total\":\n default:\n return labels.usageTotal;\n }\n}\n\nfunction getUsageSummaryLabel(\n labels: ResolvedAdminConfig[\"labels\"],\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n const metricLabel = metricKind === \"cost\"\n ? labels.usageMetricCost\n : labels.usageMetricTokens;\n return `${getUsageDimensionLabel(labels, dimension)} ${metricLabel}`;\n}\n\nfunction getOverviewUsageValue(\n overview: AdminOverview,\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n const llmTotals = overview.llmTotals;\n if (metricKind === \"cost\") {\n switch (dimension) {\n case \"input\":\n return llmTotals.inputCostUsd;\n case \"output\":\n return llmTotals.outputCostUsd;\n case \"reasoning\":\n return llmTotals.reasoningCostUsd;\n case \"cacheRead\":\n return llmTotals.cacheReadInputCostUsd;\n case \"cacheWrite\":\n return llmTotals.cacheCreationInputCostUsd;\n case \"total\":\n default:\n return llmTotals.totalCostUsd;\n }\n }\n\n switch (dimension) {\n case \"input\":\n return llmTotals.inputTokens;\n case \"output\":\n return llmTotals.outputTokens;\n case \"reasoning\":\n return llmTotals.reasoningTokens;\n case \"cacheRead\":\n return llmTotals.cacheReadInputTokens;\n case \"cacheWrite\":\n return llmTotals.cacheCreationInputTokens;\n case \"total\":\n default:\n return llmTotals.totalTokens;\n }\n}\n\nfunction getAgentUsageValue(\n agent: AdminAgentSummary,\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n if (metricKind === \"cost\") {\n switch (dimension) {\n case \"input\":\n return agent.inputCostUsd;\n case \"output\":\n return agent.outputCostUsd;\n case \"reasoning\":\n return agent.reasoningCostUsd;\n case \"cacheRead\":\n return agent.cacheReadInputCostUsd;\n case \"cacheWrite\":\n return agent.cacheCreationInputCostUsd;\n case \"total\":\n default:\n return agent.totalCostUsd;\n }\n }\n\n switch (dimension) {\n case \"input\":\n return agent.inputTokens;\n case \"output\":\n return agent.outputTokens;\n case \"reasoning\":\n return agent.reasoningTokens;\n case \"cacheRead\":\n return agent.cacheReadInputTokens;\n case \"cacheWrite\":\n return agent.cacheCreationInputTokens;\n case \"total\":\n default:\n return agent.totalTokens;\n }\n}\n\nfunction getActivityUsageValue(\n point: AdminActivityPoint,\n metricKind: AdminUsageMetricKind,\n dimension: AdminUsageDimension,\n) {\n if (metricKind === \"cost\") {\n switch (dimension) {\n case \"input\":\n return point.inputCostUsd;\n case \"output\":\n return point.outputCostUsd;\n case \"reasoning\":\n return point.reasoningCostUsd;\n case \"cacheRead\":\n return point.cacheReadInputCostUsd;\n case \"cacheWrite\":\n return point.cacheCreationInputCostUsd;\n case \"total\":\n default:\n return point.totalCostUsd;\n }\n }\n\n switch (dimension) {\n case \"input\":\n return point.inputTokens;\n case \"output\":\n return point.outputTokens;\n case \"reasoning\":\n return point.reasoningTokens;\n case \"cacheRead\":\n return point.cacheReadInputTokens;\n case \"cacheWrite\":\n return point.cacheCreationInputTokens;\n case \"total\":\n default:\n return point.totalTokens;\n }\n}\n\nfunction 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 style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits,\n }).format(value);\n }\n\n return formatNumber(value);\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 { Search, MessageSquare } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport type { AdminThreadSummary, ResolvedAdminConfig } from \"../../types\";\n\ninterface ThreadsViewProps {\n config: ResolvedAdminConfig;\n threads: AdminThreadSummary[];\n searchValue: string;\n onSearchChange: (value: string) => void;\n onThreadClick?: (threadId: string) => void;\n}\n\nexport const ThreadsView: React.FC<ThreadsViewProps> = ({\n config,\n threads,\n searchValue,\n onSearchChange,\n onThreadClick,\n}) => {\n return (\n <div className=\"space-y-4\">\n {/* Search bar */}\n <div className=\"relative max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder={config.labels.threadSearchPlaceholder}\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n />\n </div>\n\n {/* Thread list */}\n {threads.length === 0 ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <MessageSquare className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {searchValue\n ? config.labels.noResults\n : config.labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {threads.map((thread) => (\n <div\n key={thread.threadId}\n className=\"flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50 cursor-pointer\"\n onClick={() => onThreadClick?.(thread.threadId)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium truncate\">{thread.name}</p>\n <Badge\n variant={\n thread.status === \"archived\" ? \"secondary\" : \"default\"\n }\n className=\"shrink-0\"\n >\n {thread.status === \"archived\"\n ? config.labels.statusArchived\n : config.labels.statusActive}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground truncate\">\n {thread.summary ??\n thread.lastMessagePreview ??\n \"No summary yet\"}\n </p>\n </div>\n <div className=\"text-right text-xs text-muted-foreground shrink-0 space-y-1\">\n <p>{formatNumber(thread.messageCount)} messages</p>\n <p>{thread.participantIds.length} participants</p>\n <p>{formatDate(thread.lastActivityAt)}</p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatDate(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 month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport {\n ArrowLeft,\n Bot,\n ChevronUp,\n Loader2,\n User,\n Wrench,\n Cpu,\n} from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../lib/utils\";\nimport { fetchThreadDetail, fetchThreadMessages } from \"../../adminService\";\nimport type {\n AdminThreadDetail,\n AdminMessage,\n AdminMessagePageInfo,\n ResolvedAdminConfig,\n RequestHeadersProvider,\n} from \"../../types\";\n\ninterface ThreadDetailViewProps {\n threadId: string;\n config: ResolvedAdminConfig;\n onBack: () => void;\n}\n\nconst MESSAGES_PAGE_SIZE = 50;\n\nexport const ThreadDetailView: React.FC<ThreadDetailViewProps> = ({\n threadId,\n config,\n onBack,\n}) => {\n const [thread, setThread] = useState<AdminThreadDetail | null>(null);\n const [messages, setMessages] = useState<AdminMessage[]>([]);\n const [pageInfo, setPageInfo] = useState<AdminMessagePageInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const loadInitial = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const [threadData, messagesData] = await Promise.all([\n fetchThreadDetail(threadId, fetchOptions),\n fetchThreadMessages(threadId, { limit: MESSAGES_PAGE_SIZE }, fetchOptions),\n ]);\n setThread(threadData);\n setMessages(messagesData.data);\n setPageInfo(messagesData.pageInfo);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error(\"Failed to load thread\"),\n );\n } finally {\n setIsLoading(false);\n }\n }, [threadId, config.baseUrl, config.getRequestHeaders]);\n\n useEffect(() => {\n void loadInitial();\n }, [loadInitial]);\n\n const loadMore = useCallback(async () => {\n if (!pageInfo?.hasMoreBefore || !pageInfo.oldestMessageId || isLoadingMore) {\n return;\n }\n setIsLoadingMore(true);\n try {\n const older = await fetchThreadMessages(\n threadId,\n { limit: MESSAGES_PAGE_SIZE, before: pageInfo.oldestMessageId },\n fetchOptions,\n );\n setMessages((prev) => [...older.data, ...prev]);\n setPageInfo(older.pageInfo);\n } catch {\n // silently fail on pagination\n } finally {\n setIsLoadingMore(false);\n }\n }, [threadId, pageInfo, isLoadingMore, config.baseUrl, config.getRequestHeaders]);\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"space-y-4 py-10 text-center\">\n <p className=\"text-destructive font-medium\">{error.message}</p>\n <div className=\"flex justify-center gap-2\">\n <Button variant=\"outline\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n Back\n </Button>\n <Button variant=\"destructive\" onClick={() => void loadInitial()}>\n {config.labels.retry}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-start gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"mt-1 shrink-0\"\n onClick={onBack}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold truncate\">\n {thread?.name ?? threadId}\n </h2>\n <Badge\n variant={thread?.status === \"archived\" ? \"secondary\" : \"default\"}\n >\n {thread?.status === \"archived\"\n ? config.labels.statusArchived\n : config.labels.statusActive}\n </Badge>\n </div>\n {thread?.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {thread.summary}\n </p>\n )}\n <div className=\"mt-2 flex flex-wrap gap-4 text-xs text-muted-foreground\">\n {thread?.createdAt && (\n <span>Created {formatDate(thread.createdAt)}</span>\n )}\n {thread?.updatedAt && (\n <span>Updated {formatDate(thread.updatedAt)}</span>\n )}\n {thread?.participants && (\n <span>{thread.participants.length} participants</span>\n )}\n </div>\n </div>\n </div>\n\n {/* Messages */}\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Messages ({messages.length}\n {pageInfo?.hasMoreBefore ? \"+\" : \"\"})\n </h3>\n </div>\n\n {/* Load more */}\n {pageInfo?.hasMoreBefore && (\n <div className=\"flex justify-center py-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void loadMore()}\n disabled={isLoadingMore}\n >\n {isLoadingMore ? (\n <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" />\n ) : (\n <ChevronUp className=\"mr-2 h-3 w-3\" />\n )}\n Load older messages\n </Button>\n </div>\n )}\n\n {/* Message list */}\n <div className=\"rounded-lg border bg-card\">\n {messages.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-muted-foreground\">\n No messages in this thread yet.\n </p>\n ) : (\n <div className=\"divide-y\">\n {messages.map((message) => (\n <MessageRow key={message.id} message={message} />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nfunction MessageRow({ message }: { message: AdminMessage }) {\n const [expanded, setExpanded] = useState(false);\n const hasToolCalls =\n Array.isArray(message.toolCalls) && message.toolCalls.length > 0;\n const hasReasoning = !!message.reasoning;\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=\"flex-1 min-w-0\">\n <div className=\"flex 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] px-1.5 py-0\">\n {message.senderType}\n </Badge>\n {message.createdAt && (\n <span className=\"text-muted-foreground\">\n {formatTimestamp(message.createdAt)}\n </span>\n )}\n </div>\n\n {message.content && (\n <p className=\"mt-1 text-sm whitespace-pre-wrap break-words\">\n {message.content}\n </p>\n )}\n\n {(hasToolCalls || hasReasoning) && (\n <div className=\"mt-2 space-y-2\">\n {hasToolCalls && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Wrench className=\"h-3 w-3\" />\n {(message.toolCalls as unknown[]).length} tool call\n {(message.toolCalls as unknown[]).length > 1 ? \"s\" : \"\"}\n </button>\n )}\n {hasReasoning && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Cpu className=\"h-3 w-3\" />\n Reasoning\n </button>\n )}\n {expanded && (\n <pre className=\"mt-2 rounded-md bg-muted p-3 text-xs overflow-auto max-h-60\">\n {JSON.stringify(\n {\n ...(hasToolCalls ? { toolCalls: message.toolCalls } : {}),\n ...(hasReasoning ? { reasoning: message.reasoning } : {}),\n },\n null,\n 2,\n )}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SenderIcon({ senderType }: { senderType: string }) {\n const base =\n \"flex h-7 w-7 shrink-0 items-center justify-center rounded-full\";\n switch (senderType) {\n case \"agent\":\n return (\n <div className={cn(base, \"bg-primary/10 text-primary\")}>\n <Bot className=\"h-3.5 w-3.5\" />\n </div>\n );\n case \"user\":\n return (\n <div className={cn(base, \"bg-secondary text-secondary-foreground\")}>\n <User className=\"h-3.5 w-3.5\" />\n </div>\n );\n case \"tool\":\n return (\n <div className={cn(base, \"bg-muted text-muted-foreground\")}>\n <Wrench className=\"h-3.5 w-3.5\" />\n </div>\n );\n default:\n return (\n <div className={cn(base, \"bg-muted text-muted-foreground\")}>\n <Cpu className=\"h-3.5 w-3.5\" />\n </div>\n );\n }\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatTimestamp(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n","import React from \"react\";\nimport { Search, Users } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport type { AdminParticipantSummary, ResolvedAdminConfig } from \"../../types\";\n\ninterface ParticipantsViewProps {\n config: ResolvedAdminConfig;\n participants: AdminParticipantSummary[];\n searchValue: string;\n onSearchChange: (value: string) => void;\n onParticipantClick?: (externalId: string) => void;\n}\n\nexport const ParticipantsView: React.FC<ParticipantsViewProps> = ({\n config,\n participants,\n searchValue,\n onSearchChange,\n onParticipantClick,\n}) => {\n return (\n <div className=\"space-y-4\">\n <div className=\"relative max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder={config.labels.participantSearchPlaceholder}\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n />\n </div>\n\n {participants.length === 0 ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <Users className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {searchValue ? config.labels.noResults : config.labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {participants.map((p) => (\n <div\n key={`${p.namespace}:${p.externalId}`}\n className=\"flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50 cursor-pointer\"\n onClick={() => onParticipantClick?.(p.externalId)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium truncate\">{p.displayName}</p>\n <Badge variant=\"outline\" className=\"shrink-0 text-xs\">\n {p.participantType}\n </Badge>\n <Badge variant={p.isGlobal ? \"default\" : \"secondary\"} className=\"shrink-0 text-xs\">\n {p.isGlobal ? config.labels.scopeGlobal : config.labels.scopeScoped}\n </Badge>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {p.externalId}\n </p>\n </div>\n <div className=\"text-right text-xs text-muted-foreground shrink-0 space-y-1\">\n <p>{formatNumber(p.messageCount)} messages</p>\n <p>{formatNumber(p.threadCount)} threads</p>\n <p>{formatDate(p.lastActivityAt)}</p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatDate(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, { month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport { ArrowLeft, Loader2, Save } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { fetchParticipantDetail, updateParticipant } from \"../../adminService\";\nimport type { AdminParticipantDetail, ResolvedAdminConfig } from \"../../types\";\n\ninterface ParticipantDetailViewProps {\n participantId: string;\n config: ResolvedAdminConfig;\n onBack: () => void;\n}\n\nexport const ParticipantDetailView: React.FC<ParticipantDetailViewProps> = ({\n participantId,\n config,\n onBack,\n}) => {\n const [data, setData] = useState<AdminParticipantDetail | null>(null);\n const [editJson, setEditJson] = useState(\"\");\n const [isLoading, setIsLoading] = useState(true);\n const [isSaving, setIsSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveMessage, setSaveMessage] = useState<string | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const load = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await fetchParticipantDetail(participantId, fetchOptions);\n setData(result);\n setEditJson(JSON.stringify(result, null, 2));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load participant\");\n } finally {\n setIsLoading(false);\n }\n }, [participantId, config.baseUrl, config.getRequestHeaders]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleSave = async () => {\n setIsSaving(true);\n setError(null);\n setSaveMessage(null);\n try {\n const parsed = JSON.parse(editJson) as Record<string, unknown>;\n const updated = await updateParticipant(participantId, parsed, fetchOptions);\n setData(updated);\n setEditJson(JSON.stringify(updated, null, 2));\n setSaveMessage(\"Saved successfully\");\n setTimeout(() => setSaveMessage(null), 3000);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to save\");\n } finally {\n setIsSaving(false);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-xl font-semibold truncate\">{participantId}</h2>\n <p className=\"text-sm text-muted-foreground\">Participant Detail</p>\n </div>\n <div className=\"flex items-center gap-2\">\n {saveMessage && (\n <span className=\"text-xs text-emerald-600\">{saveMessage}</span>\n )}\n <Button size=\"sm\" onClick={() => void handleSave()} disabled={isSaving}>\n {isSaving ? (\n <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-3 w-3\" />\n )}\n Save\n </Button>\n </div>\n </div>\n\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n <div className=\"rounded-lg border bg-card\">\n <textarea\n className=\"w-full min-h-[400px] p-4 font-mono text-sm bg-transparent resize-y focus:outline-none\"\n value={editJson}\n onChange={(e) => setEditJson(e.target.value)}\n spellCheck={false}\n />\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { Search, Bot } from \"lucide-react\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport type { AdminAgentSummary, ResolvedAdminConfig } from \"../../types\";\n\ninterface AgentsViewProps {\n config: ResolvedAdminConfig;\n agents: AdminAgentSummary[];\n searchValue: string;\n onSearchChange: (value: string) => void;\n onAgentClick?: (agentId: string) => void;\n}\n\nexport const AgentsView: React.FC<AgentsViewProps> = ({\n config,\n agents,\n searchValue,\n onSearchChange,\n onAgentClick,\n}) => {\n return (\n <div className=\"space-y-4\">\n <div className=\"relative max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder={config.labels.agentSearchPlaceholder}\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n />\n </div>\n\n {agents.length === 0 ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <Bot className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {searchValue ? config.labels.noResults : config.labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {agents.map((agent) => (\n <div\n key={`${agent.namespace}:${agent.agentId}`}\n className=\"rounded-lg border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer\"\n onClick={() => onAgentClick?.(agent.agentId)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"font-medium truncate\">{agent.displayName}</p>\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n {agent.description ?? agent.agentId}\n </p>\n </div>\n <Badge variant=\"outline\" className=\"shrink-0\">\n {agent.isConfigured ? config.labels.configured : config.labels.unconfigured}\n </Badge>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <span>{formatNumber(agent.messageCount)} messages</span>\n <span>{formatNumber(agent.llmCallCount)} LLM calls</span>\n <span>{formatNumber(agent.toolCallMessageCount)} tool calls</span>\n <span>{formatNumber(agent.totalTokens)} tokens</span>\n </div>\n <p className=\"mt-3 text-xs text-muted-foreground\">\n {formatDate(agent.lastActivityAt)}\n </p>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatDate(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, { month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" });\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n","import React from \"react\";\nimport { ArrowLeft, Bot } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport type { AdminAgentSummary, ResolvedAdminConfig } from \"../../types\";\n\ninterface AgentDetailViewProps {\n agentId: string;\n config: ResolvedAdminConfig;\n agents: AdminAgentSummary[];\n onBack: () => void;\n}\n\nexport const AgentDetailView: React.FC<AgentDetailViewProps> = ({\n agentId,\n config,\n agents,\n onBack,\n}) => {\n const agent = agents.find((a) => a.agentId === agentId);\n\n if (!agent) {\n return (\n <div className=\"space-y-4 py-10 text-center\">\n <p className=\"text-muted-foreground\">Agent not found: {agentId}</p>\n <Button variant=\"outline\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 h-4 w-4\" /> Back\n </Button>\n </div>\n );\n }\n\n const stats = [\n { label: \"Messages\", value: agent.messageCount },\n { label: \"LLM Calls\", value: agent.llmCallCount },\n { label: \"Tool Calls\", value: agent.toolCallMessageCount },\n { label: \"Input Tokens\", value: agent.inputTokens },\n { label: \"Output Tokens\", value: agent.outputTokens },\n { label: \"Reasoning Tokens\", value: agent.reasoningTokens },\n { label: \"Cache Read\", value: agent.cacheReadInputTokens },\n { label: \"Cache Created\", value: agent.cacheCreationInputTokens },\n { label: \"Total Tokens\", value: agent.totalTokens },\n ];\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start gap-4\">\n <Button variant=\"ghost\" size=\"icon\" className=\"mt-1 shrink-0\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Bot className=\"h-5 w-5\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-semibold\">{agent.displayName}</h2>\n <Badge variant=\"outline\">\n {agent.isConfigured ? config.labels.configured : config.labels.unconfigured}\n </Badge>\n </div>\n {agent.description && (\n <p className=\"text-sm text-muted-foreground\">{agent.description}</p>\n )}\n </div>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-4 text-xs text-muted-foreground\">\n <span>ID: {agent.agentId}</span>\n <span>Namespace: {agent.namespace}</span>\n {agent.lastActivityAt && <span>Last active: {formatDate(agent.lastActivityAt)}</span>}\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-3 lg:grid-cols-3\">\n {stats.map((stat) => (\n <div key={stat.label} className=\"rounded-xl border bg-card p-5 shadow-sm\">\n <p className=\"text-sm font-medium text-muted-foreground\">{stat.label}</p>\n <p className=\"mt-2 text-2xl font-semibold tracking-tight\">\n {new Intl.NumberFormat().format(stat.value)}\n </p>\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, { month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" });\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport { ArrowLeft, Loader2, Plus, Search, Database } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { fetchCollectionItems } from \"../../adminService\";\nimport type { AdminCollectionItem, ResolvedAdminConfig } from \"../../types\";\n\ninterface CollectionItemsViewProps {\n collection: string;\n config: ResolvedAdminConfig;\n namespace?: string;\n onItemClick?: (itemId: string) => void;\n onCreateNew?: () => void;\n}\n\nexport const CollectionItemsView: React.FC<CollectionItemsViewProps> = ({\n collection,\n config,\n namespace,\n onItemClick,\n onCreateNew,\n}) => {\n const [items, setItems] = useState<AdminCollectionItem[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [search, setSearch] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const load = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await fetchCollectionItems(\n collection,\n { search: search || undefined, namespace, limit: 50 },\n fetchOptions,\n );\n setItems(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load items\");\n } finally {\n setIsLoading(false);\n }\n }, [collection, search, namespace, config.baseUrl, config.getRequestHeaders]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const getItemId = (item: AdminCollectionItem): string => {\n return String(item.id ?? item._id ?? JSON.stringify(item).slice(0, 40));\n };\n\n const getItemPreview = (item: AdminCollectionItem): string => {\n const { id, _id, ...rest } = item as Record<string, unknown>;\n const name = item.name ?? item.title ?? item.displayName ?? item.label;\n if (typeof name === \"string\") return name;\n const keys = Object.keys(rest);\n if (keys.length === 0) return \"(empty)\";\n return keys.slice(0, 3).map((k) => `${k}: ${JSON.stringify(rest[k])?.slice(0, 30)}`).join(\", \");\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-4\">\n <h2 className=\"text-lg font-semibold capitalize\">{collection}</h2>\n {onCreateNew && (\n <Button size=\"sm\" onClick={onCreateNew}>\n <Plus className=\"mr-2 h-3 w-3\" /> New\n </Button>\n )}\n </div>\n\n <div className=\"relative max-w-sm\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder={`Search ${collection}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n {isLoading ? (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : items.length === 0 ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <Database className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {search ? config.labels.noResults : `No items in ${collection}`}\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {items.map((item, idx) => {\n const itemId = getItemId(item);\n return (\n <div\n key={itemId + idx}\n className=\"flex items-center gap-4 rounded-lg border bg-card p-4 transition-colors hover:bg-muted/50 cursor-pointer\"\n onClick={() => onItemClick?.(itemId)}\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium font-mono text-sm truncate\">{itemId}</p>\n <p className=\"mt-1 text-xs text-muted-foreground truncate\">\n {getItemPreview(item)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport { ArrowLeft, Loader2, Save, Trash2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n fetchCollectionItem,\n createCollectionItem,\n updateCollectionItem,\n deleteCollectionItem,\n} from \"../../adminService\";\nimport type { AdminCollectionItem, ResolvedAdminConfig } from \"../../types\";\n\ninterface CollectionItemDetailViewProps {\n collection: string;\n itemId: string | null;\n config: ResolvedAdminConfig;\n namespace?: string;\n onBack: () => void;\n onDeleted?: () => void;\n}\n\nexport const CollectionItemDetailView: React.FC<CollectionItemDetailViewProps> = ({\n collection,\n itemId,\n config,\n namespace,\n onBack,\n onDeleted,\n}) => {\n const isNew = !itemId;\n const [editJson, setEditJson] = useState(isNew ? \"{\\n \\n}\" : \"\");\n const [isLoading, setIsLoading] = useState(!isNew);\n const [isSaving, setIsSaving] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveMessage, setSaveMessage] = useState<string | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const load = useCallback(async () => {\n if (!itemId) return;\n setIsLoading(true);\n setError(null);\n try {\n const result = await fetchCollectionItem(collection, itemId, namespace, fetchOptions);\n setEditJson(JSON.stringify(result, null, 2));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load item\");\n } finally {\n setIsLoading(false);\n }\n }, [collection, itemId, namespace, config.baseUrl, config.getRequestHeaders]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleSave = async () => {\n setIsSaving(true);\n setError(null);\n setSaveMessage(null);\n try {\n const parsed = JSON.parse(editJson) as Record<string, unknown>;\n if (isNew) {\n const created = await createCollectionItem(collection, parsed, namespace, fetchOptions);\n setEditJson(JSON.stringify(created, null, 2));\n setSaveMessage(\"Created successfully\");\n } else {\n const updated = await updateCollectionItem(collection, itemId!, parsed, namespace, fetchOptions);\n setEditJson(JSON.stringify(updated, null, 2));\n setSaveMessage(\"Saved successfully\");\n }\n setTimeout(() => setSaveMessage(null), 3000);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to save\");\n } finally {\n setIsSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (!itemId) return;\n if (!window.confirm(`Delete this item from ${collection}?`)) return;\n setIsDeleting(true);\n setError(null);\n try {\n await deleteCollectionItem(collection, itemId, namespace, fetchOptions);\n onDeleted?.();\n onBack();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete\");\n } finally {\n setIsDeleting(false);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-xl font-semibold truncate capitalize\">\n {isNew ? `New ${collection} item` : `${collection} / ${itemId}`}\n </h2>\n </div>\n <div className=\"flex items-center gap-2\">\n {saveMessage && (\n <span className=\"text-xs text-emerald-600\">{saveMessage}</span>\n )}\n {!isNew && (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => void handleDelete()}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" />\n ) : (\n <Trash2 className=\"mr-2 h-3 w-3\" />\n )}\n Delete\n </Button>\n )}\n <Button size=\"sm\" onClick={() => void handleSave()} disabled={isSaving}>\n {isSaving ? (\n <Loader2 className=\"mr-2 h-3 w-3 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-3 w-3\" />\n )}\n {isNew ? \"Create\" : \"Save\"}\n </Button>\n </div>\n </div>\n\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n <div className=\"rounded-lg border bg-card\">\n <textarea\n className=\"w-full min-h-[400px] p-4 font-mono text-sm bg-transparent resize-y focus:outline-none\"\n value={editJson}\n onChange={(e) => setEditJson(e.target.value)}\n spellCheck={false}\n />\n </div>\n </div>\n );\n};\n","import React, { useCallback, useState } from \"react\";\nimport { Activity, Loader2, Search } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport { fetchThreadEvents } from \"../../adminService\";\nimport type { AdminQueueEvent, ResolvedAdminConfig } from \"../../types\";\n\ninterface EventsViewProps {\n config: ResolvedAdminConfig;\n}\n\nconst STATUS_VARIANTS: Record<string, \"default\" | \"secondary\" | \"destructive\" | \"outline\"> = {\n pending: \"outline\",\n processing: \"default\",\n completed: \"secondary\",\n failed: \"destructive\",\n expired: \"secondary\",\n overwritten: \"secondary\",\n};\n\nexport const EventsView: React.FC<EventsViewProps> = ({ config }) => {\n const [threadId, setThreadId] = useState(\"\");\n const [event, setEvent] = useState<AdminQueueEvent | null>(null);\n const [hasSearched, setHasSearched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchOptions = {\n baseUrl: config.baseUrl,\n getRequestHeaders: config.getRequestHeaders,\n };\n\n const handleSearch = useCallback(async () => {\n if (!threadId.trim()) return;\n setIsLoading(true);\n setError(null);\n setHasSearched(true);\n try {\n const result = await fetchThreadEvents(threadId.trim(), fetchOptions);\n setEvent(result ?? null);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load events\");\n } finally {\n setIsLoading(false);\n }\n }, [threadId, config.baseUrl, config.getRequestHeaders]);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-end gap-3 max-w-lg\">\n <div className=\"flex-1\">\n <label className=\"text-sm font-medium mb-1 block\">Thread ID</label>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"pl-9\"\n placeholder=\"Enter thread ID to inspect events...\"\n value={threadId}\n onChange={(e) => setThreadId(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && void handleSearch()}\n />\n </div>\n </div>\n <Button onClick={() => void handleSearch()} disabled={isLoading || !threadId.trim()}>\n {isLoading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n Inspect\n </Button>\n </div>\n\n {error && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n {!hasSearched ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <Activity className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n Enter a thread ID to inspect its next pending queue event.\n </p>\n </div>\n ) : isLoading ? (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : !event ? (\n <div className=\"rounded-xl border border-dashed p-10 text-center\">\n <Activity className=\"mx-auto h-8 w-8 text-muted-foreground/50\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">\n No pending events found for this thread.\n </p>\n </div>\n ) : (\n <div className=\"rounded-lg border bg-card p-5 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">{event.eventType}</p>\n <p className=\"text-xs text-muted-foreground font-mono mt-1\">{event.id}</p>\n </div>\n <Badge variant={STATUS_VARIANTS[event.status] ?? \"outline\"}>\n {event.status}\n </Badge>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 text-sm\">\n {event.traceId && (\n <div>\n <span className=\"text-muted-foreground\">Trace:</span>{\" \"}\n <span className=\"font-mono text-xs\">{event.traceId}</span>\n </div>\n )}\n {event.parentEventId && (\n <div>\n <span className=\"text-muted-foreground\">Parent:</span>{\" \"}\n <span className=\"font-mono text-xs\">{event.parentEventId}</span>\n </div>\n )}\n {event.priority != null && (\n <div>\n <span className=\"text-muted-foreground\">Priority:</span> {event.priority}\n </div>\n )}\n {event.createdAt && (\n <div>\n <span className=\"text-muted-foreground\">Created:</span> {formatTimestamp(event.createdAt)}\n </div>\n )}\n </div>\n\n {event.payload != null && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Payload</p>\n <pre className=\"rounded-md bg-muted p-3 text-xs overflow-auto max-h-60\">\n {JSON.stringify(event.payload, null, 2)}\n </pre>\n </div>\n )}\n\n {event.metadata != null && Object.keys(event.metadata).length > 0 && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Metadata</p>\n <pre className=\"rounded-md bg-muted p-3 text-xs overflow-auto max-h-40\">\n {JSON.stringify(event.metadata, null, 2)}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatTimestamp(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString(undefined, {\n month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\",\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_lucide_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","open","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Icon","import_lucide_react","import_jsx_runtime","import_react","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","formatNumber","formatDate","import_react","import_lucide_react","import_jsx_runtime","formatDate","import_lucide_react","import_jsx_runtime","formatNumber","formatDate","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatNumber","formatDate","import_lucide_react","import_jsx_runtime","formatDate","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","formatTimestamp","import_jsx_runtime"]}
|