@copilotz/admin 0.3.4 → 0.3.5

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CopilotzAdmin.tsx","../src/config.ts","../src/useCopilotzAdmin.ts","../src/adminService.ts"],"sourcesContent":["import React, {\n useDeferredValue,\n useMemo,\n useState,\n} from \"react\";\nimport { defaultAdminConfig, mergeAdminConfig } from \"./config\";\nimport { useCopilotzAdmin } from \"./useCopilotzAdmin\";\nimport type {\n AdminActivityPoint,\n AdminAgentSummary,\n AdminConfig,\n AdminParticipantSummary,\n ResolvedAdminConfig,\n AdminThreadSummary,\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 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 cards = [\n {\n label: config.labels.messagesCard,\n value: admin.overview?.messageTotals.total ?? 0,\n detail: `${admin.overview?.messageTotals.toolCallMessages ?? 0} tool-call messages`,\n },\n {\n label: config.labels.activeThreadsCard,\n value: admin.overview?.threadTotals.active ?? 0,\n detail: `${admin.overview?.threadTotals.total ?? 0} total threads`,\n },\n {\n label: config.labels.participantsCard,\n value: admin.overview?.participantTotals.total ?? 0,\n detail: `${admin.overview?.participantTotals.agents ?? 0} agents`,\n },\n {\n label: config.labels.tokensCard,\n value: admin.overview?.llmTotals.totalTokens ?? 0,\n detail: `${admin.overview?.llmTotals.totalCalls ?? 0} calls`,\n },\n {\n label: config.labels.queueCard,\n value: admin.overview?.queueTotals.pending ?? 0,\n detail: `${admin.overview?.queueTotals.failed ?? 0} failed`,\n },\n ];\n\n if (admin.isLoading && !admin.overview) {\n return (\n <div className={joinClassNames(\"rounded-3xl border border-slate-200 bg-white p-8 text-slate-700 shadow-sm\", className)}>\n {config.labels.loading}\n </div>\n );\n }\n\n if (admin.error && !admin.overview) {\n return (\n <div className={joinClassNames(\"rounded-3xl border border-rose-200 bg-rose-50 p-8 text-rose-700 shadow-sm\", className)}>\n <p className=\"text-base font-semibold\">{admin.error.message}</p>\n <button\n className=\"mt-4 rounded-xl bg-rose-600 px-4 py-2 text-sm font-medium text-white\"\n onClick={() => void admin.refresh()}\n type=\"button\"\n >\n {config.labels.retry}\n </button>\n </div>\n );\n }\n\n const isEmpty = cards.every((card) => card.value === 0) &&\n admin.activity.length === 0 &&\n admin.threads.length === 0 &&\n admin.participants.length === 0 &&\n admin.agents.length === 0;\n\n return (\n <div className={joinClassNames(\"space-y-6 rounded-[28px] border border-slate-200 bg-[linear-gradient(180deg,#ffffff_0%,#f8fafc_100%)] p-6 text-slate-900 shadow-sm\", className)}>\n <header className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-3\">\n {config.branding.logo ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-2xl border border-slate-200 bg-white shadow-sm\">\n {config.branding.logo}\n </div>\n ) : null}\n <div>\n <h2 className=\"text-2xl font-semibold tracking-tight\">\n {config.branding.title}\n </h2>\n <p className=\"text-sm text-slate-500\">{config.branding.subtitle}</p>\n </div>\n </div>\n {config.namespace ? (\n <p className=\"text-xs font-medium uppercase tracking-[0.18em] text-slate-400\">\n Namespace: {config.namespace}\n </p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <RangeButton\n active={admin.filters.range === \"24h\"}\n label={config.labels.range24h}\n onClick={() => admin.setRange(\"24h\")}\n />\n <RangeButton\n active={admin.filters.range === \"7d\"}\n label={config.labels.range7d}\n onClick={() => admin.setRange(\"7d\")}\n />\n <RangeButton\n active={admin.filters.range === \"30d\"}\n label={config.labels.range30d}\n onClick={() => admin.setRange(\"30d\")}\n />\n <select\n className=\"rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm\"\n onChange={(event) => admin.setInterval(event.target.value as \"hour\" | \"day\")}\n value={admin.filters.interval}\n >\n <option value=\"hour\">{config.labels.intervalHour}</option>\n <option value=\"day\">{config.labels.intervalDay}</option>\n </select>\n <button\n className=\"rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-700\"\n onClick={() => void admin.refresh()}\n type=\"button\"\n >\n {config.labels.refresh}\n </button>\n {config.branding.actions}\n </div>\n </header>\n\n {isEmpty ? (\n <section className=\"rounded-3xl border border-dashed border-slate-300 bg-white/70 p-10 text-center\">\n <h3 className=\"text-lg font-semibold\">{config.labels.emptyTitle}</h3>\n <p className=\"mt-2 text-sm text-slate-500\">{config.labels.emptyDescription}</p>\n </section>\n ) : null}\n\n {config.features.showOverview ? (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.overviewTitle} />\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-5\">\n {cards.map((card) => (\n <div\n className=\"rounded-3xl border border-slate-200 bg-white p-5 shadow-sm\"\n key={card.label}\n >\n <p className=\"text-sm font-medium text-slate-500\">{card.label}</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-slate-400\">{card.detail}</p>\n </div>\n ))}\n </div>\n </section>\n ) : null}\n\n {config.features.showActivity ? (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.activityTitle} />\n <ActivityChart\n compact={config.ui.compact}\n interval={admin.filters.interval}\n labels={config.labels}\n maxBars={config.ui.maxActivityBars}\n points={admin.activity}\n />\n </section>\n ) : null}\n\n <div className=\"grid gap-6 xl:grid-cols-3\">\n {config.features.showThreads ? (\n <DataTable\n rows={admin.threads}\n searchPlaceholder={config.labels.threadSearchPlaceholder}\n searchValue={threadSearch}\n setSearchValue={setThreadSearch}\n title={config.labels.threadsTitle}\n >\n <ThreadsTable rows={admin.threads} labels={config.labels} />\n </DataTable>\n ) : null}\n {config.features.showParticipants ? (\n <DataTable\n rows={admin.participants}\n searchPlaceholder={config.labels.participantSearchPlaceholder}\n searchValue={participantSearch}\n setSearchValue={setParticipantSearch}\n title={config.labels.participantsTitle}\n >\n <ParticipantsTable rows={admin.participants} labels={config.labels} />\n </DataTable>\n ) : null}\n {config.features.showAgents ? (\n <DataTable\n rows={admin.agents}\n searchPlaceholder={config.labels.agentSearchPlaceholder}\n searchValue={agentSearch}\n setSearchValue={setAgentSearch}\n title={config.labels.agentsTitle}\n >\n <AgentsTable rows={admin.agents} labels={config.labels} />\n </DataTable>\n ) : null}\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 RangeButton(\n { active, label, onClick }: { active: boolean; label: string; onClick: () => void },\n) {\n return (\n <button\n className={joinClassNames(\n \"rounded-xl px-3 py-2 text-sm font-medium transition\",\n active\n ? \"bg-slate-900 text-white\"\n : \"border border-slate-200 bg-white text-slate-600\",\n )}\n onClick={onClick}\n type=\"button\"\n >\n {label}\n </button>\n );\n}\n\nfunction ActivityChart(\n props: {\n points: AdminActivityPoint[];\n interval: \"hour\" | \"day\";\n maxBars: number;\n compact: boolean;\n labels: ResolvedAdminConfig[\"labels\"];\n },\n) {\n const trimmedPoints = props.points.slice(-props.maxBars);\n const maxMessages = Math.max(...trimmedPoints.map((point) => point.messageCount), 1);\n\n return (\n <div className=\"rounded-3xl border border-slate-200 bg-white p-5 shadow-sm\">\n {trimmedPoints.length === 0 ? (\n <p className=\"text-sm text-slate-500\">{props.labels.noResults}</p>\n ) : (\n <div className=\"flex min-h-56 items-end gap-2\">\n {trimmedPoints.map((point) => (\n <div className=\"flex min-w-0 flex-1 flex-col items-center gap-2\" key={point.bucket}>\n <div className=\"flex h-40 w-full items-end rounded-2xl bg-slate-100/80 px-1 pb-1\">\n <div\n className=\"w-full rounded-xl bg-slate-900\"\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 text-slate-700\">\n {formatBucket(point.bucket, props.interval)}\n </p>\n <p className=\"text-[11px] text-slate-400\">\n {formatNumber(point.messageCount)} msg\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction DataTable<T>(\n props: {\n title: string;\n searchPlaceholder: string;\n searchValue: string;\n setSearchValue: (value: string) => void;\n rows: T[];\n children: React.ReactNode;\n },\n) {\n return (\n <section className=\"rounded-3xl border border-slate-200 bg-white 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=\"w-full max-w-44 rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm outline-none ring-0\"\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-slate-500\">No results</p>\n ) : props.children}\n </section>\n );\n}\n\nfunction ThreadsTable(\n { rows, labels }: { rows: AdminThreadSummary[]; labels: ResolvedAdminConfig[\"labels\"] },\n) {\n return (\n <div className=\"space-y-3\">\n {rows.map((thread) => (\n <div className=\"rounded-2xl border border-slate-200 bg-slate-50/70 p-4\" key={thread.threadId}>\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium text-slate-900\">{thread.name}</p>\n <p className=\"mt-1 text-xs text-slate-500\">{thread.summary ?? thread.lastMessagePreview ?? \"No summary yet\"}</p>\n </div>\n <span className=\"rounded-full bg-slate-900 px-2.5 py-1 text-[11px] font-semibold text-white\">\n {thread.status === \"archived\" ? labels.statusArchived : labels.statusActive}\n </span>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-slate-500\">\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, labels }: { rows: AdminParticipantSummary[]; labels: ResolvedAdminConfig[\"labels\"] },\n) {\n return (\n <div className=\"space-y-3\">\n {rows.map((participant) => (\n <div className=\"rounded-2xl border border-slate-200 bg-slate-50/70 p-4\" key={`${participant.namespace}:${participant.externalId}`}>\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium text-slate-900\">{participant.displayName}</p>\n <p className=\"mt-1 text-xs uppercase tracking-[0.18em] text-slate-400\">\n {participant.participantType}\n </p>\n </div>\n <span className=\"rounded-full border border-slate-200 bg-white px-2.5 py-1 text-[11px] font-semibold text-slate-600\">\n {participant.isGlobal ? labels.scopeGlobal : labels.scopeScoped}\n </span>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-slate-500\">\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, labels }: { rows: AdminAgentSummary[]; labels: ResolvedAdminConfig[\"labels\"] },\n) {\n return (\n <div className=\"space-y-3\">\n {rows.map((agent) => (\n <div className=\"rounded-2xl border border-slate-200 bg-slate-50/70 p-4\" key={`${agent.namespace}:${agent.agentId}`}>\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium text-slate-900\">{agent.displayName}</p>\n <p className=\"mt-1 text-xs text-slate-500\">\n {agent.description ?? agent.agentId}\n </p>\n </div>\n <span className=\"rounded-full border border-slate-200 bg-white px-2.5 py-1 text-[11px] font-semibold text-slate-600\">\n {agent.isConfigured ? labels.configured : labels.unconfigured}\n </span>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs text-slate-500\">\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, { hour: \"numeric\", month: \"short\", day: \"numeric\" })\n : date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\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\nfunction joinClassNames(...values: Array<string | undefined | null | false>) {\n return values.filter(Boolean).join(\" \");\n}\n","import type { AdminConfig, ResolvedAdminConfig } from \"./types\";\n\nexport const defaultAdminConfig: ResolvedAdminConfig = {\n branding: {\n title: \"Copilotz Admin\",\n subtitle: \"Read-only 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 },\n features: {\n showOverview: true,\n showActivity: true,\n showThreads: true,\n showParticipants: true,\n showAgents: true,\n },\n ui: {\n compact: false,\n maxActivityBars: 18,\n },\n baseUrl: \"\",\n getRequestHeaders: async () => ({}),\n namespace: \"\",\n initialRange: \"7d\",\n initialInterval: \"day\",\n};\n\nexport function mergeAdminConfig(\n _baseConfig: AdminConfig,\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 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 };\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 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\nasync function fetchAdminJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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\nexport async function fetchAdminOverview(\n range: AdminDatePreset,\n namespace?: string,\n options?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\n): Promise<AdminAgentSummary[]> {\n return await fetchAdminJson<AdminAgentSummary[]>(\"/v1/admin/agents\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\n}\n"],"mappings":"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","names":["useMemo","useState","useMemo","useState"]}
1
+ {"version":3,"sources":["../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/input.tsx","../src/components/ui/badge.tsx","../src/components/ui/select.tsx"],"sourcesContent":["import React, {\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 { Input } from \"./components/ui/input\";\nimport { Badge } from \"./components/ui/badge\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./components/ui/select\";\nimport type {\n AdminActivityPoint,\n AdminAgentSummary,\n AdminConfig,\n AdminParticipantSummary,\n ResolvedAdminConfig,\n AdminThreadSummary,\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 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 cards = [\n {\n label: config.labels.messagesCard,\n value: admin.overview?.messageTotals.total ?? 0,\n detail: `${admin.overview?.messageTotals.toolCallMessages ?? 0} tool-call messages`,\n },\n {\n label: config.labels.activeThreadsCard,\n value: admin.overview?.threadTotals.active ?? 0,\n detail: `${admin.overview?.threadTotals.total ?? 0} total threads`,\n },\n {\n label: config.labels.participantsCard,\n value: admin.overview?.participantTotals.total ?? 0,\n detail: `${admin.overview?.participantTotals.agents ?? 0} agents`,\n },\n {\n label: config.labels.tokensCard,\n value: admin.overview?.llmTotals.totalTokens ?? 0,\n detail: `${admin.overview?.llmTotals.totalCalls ?? 0} calls`,\n },\n {\n label: config.labels.queueCard,\n value: admin.overview?.queueTotals.pending ?? 0,\n detail: `${admin.overview?.queueTotals.failed ?? 0} failed`,\n },\n ];\n\n if (admin.isLoading && !admin.overview) {\n return (\n <Card className={cn(\"p-8\", className)}>\n <CardContent className=\"p-0 text-muted-foreground\">\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 p-8\", className)}>\n <CardContent className=\"p-0 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 isEmpty =\n cards.every((card) => card.value === 0) &&\n admin.activity.length === 0 &&\n admin.threads.length === 0 &&\n admin.participants.length === 0 &&\n admin.agents.length === 0;\n\n return (\n <div className={cn(\"space-y-6 text-foreground\", className)}>\n <header className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-3\">\n {config.branding.logo ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl border bg-card shadow-sm\">\n {config.branding.logo}\n </div>\n ) : null}\n <div>\n <h2 className=\"text-2xl font-semibold tracking-tight\">\n {config.branding.title}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {config.branding.subtitle}\n </p>\n </div>\n </div>\n {config.namespace ? (\n <p className=\"text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground\">\n Namespace: {config.namespace}\n </p>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant={admin.filters.range === \"24h\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => admin.setRange(\"24h\")}\n >\n {config.labels.range24h}\n </Button>\n <Button\n variant={admin.filters.range === \"7d\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => admin.setRange(\"7d\")}\n >\n {config.labels.range7d}\n </Button>\n <Button\n variant={admin.filters.range === \"30d\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => admin.setRange(\"30d\")}\n >\n {config.labels.range30d}\n </Button>\n\n <Select\n value={admin.filters.interval}\n onValueChange={(v) =>\n admin.setInterval(v as \"hour\" | \"day\")\n }\n >\n <SelectTrigger className=\"w-[110px] h-8\">\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 <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void admin.refresh()}\n >\n {config.labels.refresh}\n </Button>\n {config.branding.actions}\n </div>\n </header>\n\n {isEmpty ? (\n <Card className=\"border-dashed py-10 text-center\">\n <CardContent className=\"p-0\">\n <h3 className=\"text-lg font-semibold\">\n {config.labels.emptyTitle}\n </h3>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {config.labels.emptyDescription}\n </p>\n </CardContent>\n </Card>\n ) : null}\n\n {config.features.showOverview ? (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.overviewTitle} />\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-5\">\n {cards.map((card) => (\n <Card key={card.label} className=\"gap-0 py-0\">\n <CardContent className=\"p-5\">\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 </CardContent>\n </Card>\n ))}\n </div>\n </section>\n ) : null}\n\n {config.features.showActivity ? (\n <section className=\"space-y-4\">\n <SectionHeading title={config.labels.activityTitle} />\n <ActivityChart\n interval={admin.filters.interval}\n labels={config.labels}\n maxBars={config.ui.maxActivityBars}\n points={admin.activity}\n />\n </section>\n ) : null}\n\n <div className=\"grid gap-6 xl:grid-cols-3\">\n {config.features.showThreads ? (\n <DataTable\n rows={admin.threads}\n searchPlaceholder={config.labels.threadSearchPlaceholder}\n searchValue={threadSearch}\n setSearchValue={setThreadSearch}\n title={config.labels.threadsTitle}\n >\n <ThreadsTable rows={admin.threads} labels={config.labels} />\n </DataTable>\n ) : null}\n {config.features.showParticipants ? (\n <DataTable\n rows={admin.participants}\n searchPlaceholder={config.labels.participantSearchPlaceholder}\n searchValue={participantSearch}\n setSearchValue={setParticipantSearch}\n title={config.labels.participantsTitle}\n >\n <ParticipantsTable\n rows={admin.participants}\n labels={config.labels}\n />\n </DataTable>\n ) : null}\n {config.features.showAgents ? (\n <DataTable\n rows={admin.agents}\n searchPlaceholder={config.labels.agentSearchPlaceholder}\n searchValue={agentSearch}\n setSearchValue={setAgentSearch}\n title={config.labels.agentsTitle}\n >\n <AgentsTable rows={admin.agents} labels={config.labels} />\n </DataTable>\n ) : null}\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 <Card className=\"gap-0 py-0\">\n <CardContent className=\"p-5\">\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-56 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-40 w-full items-end rounded-lg bg-muted px-1 pb-1\">\n <div\n className=\"w-full rounded-md bg-primary\"\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 </CardContent>\n </Card>\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 <Card className=\"gap-0 py-0\">\n <CardContent className=\"p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <SectionHeading title={props.title} />\n <Input\n className=\"w-full max-w-44 h-8\"\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 </CardContent>\n </Card>\n );\n}\n\nfunction ThreadsTable({\n rows,\n labels,\n}: {\n rows: AdminThreadSummary[];\n labels: ResolvedAdminConfig[\"labels\"];\n}) {\n return (\n <div className=\"space-y-3\">\n {rows.map((thread) => (\n <div\n className=\"rounded-lg border bg-muted/50 p-4\"\n key={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 text-xs text-muted-foreground truncate\">\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>\n {formatNumber(participant.messageCount)} messages\n </span>\n <span>\n {formatNumber(participant.threadCount)} threads\n </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 text-xs text-muted-foreground truncate\">\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>\n {formatNumber(agent.toolCallMessageCount)} tool calls\n </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 type { AdminConfig, ResolvedAdminConfig } from \"./types\";\n\nexport const defaultAdminConfig: ResolvedAdminConfig = {\n branding: {\n title: \"Copilotz Admin\",\n subtitle: \"Read-only 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 },\n features: {\n showOverview: true,\n showActivity: true,\n showThreads: true,\n showParticipants: true,\n showAgents: true,\n },\n ui: {\n compact: false,\n maxActivityBars: 18,\n },\n baseUrl: \"\",\n getRequestHeaders: async () => ({}),\n namespace: \"\",\n initialRange: \"7d\",\n initialInterval: \"day\",\n};\n\nexport function mergeAdminConfig(\n _baseConfig: AdminConfig,\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 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 };\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 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\nasync function fetchAdminJson<T>(\n path: string,\n params: Record<string, string | undefined>,\n options?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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\nexport async function fetchAdminOverview(\n range: AdminDatePreset,\n namespace?: string,\n options?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\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?: {\n baseUrl?: string;\n getRequestHeaders?: RequestHeadersProvider;\n },\n): Promise<AdminAgentSummary[]> {\n return await fetchAdminJson<AdminAgentSummary[]>(\"/v1/admin/agents\", {\n search,\n namespace,\n limit: \"8\",\n }, options);\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\"\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 { 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 * 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"],"mappings":"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","names":["useMemo","useState","jsx","jsx","Slot","cva","jsx","cva","Slot","jsx","jsx","jsx","jsxs","useMemo","useState"]}