@copilotz/admin 0.3.5 → 0.3.6

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 CHANGED
@@ -594,10 +594,10 @@ var CopilotzAdmin = ({
594
594
  }
595
595
  ];
596
596
  if (admin.isLoading && !admin.overview) {
597
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: cn("p-8", className), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CardContent, { className: "p-0 text-muted-foreground", children: config.labels.loading }) });
597
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: cn("border-border", className), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CardContent, { className: "text-muted-foreground", children: config.labels.loading }) });
598
598
  }
599
599
  if (admin.error && !admin.overview) {
600
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: cn("border-destructive/50 bg-destructive/10 p-8", className), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "p-0 space-y-4", children: [
600
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: cn("border-destructive/50 bg-destructive/10", className), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "space-y-4", children: [
601
601
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-base font-semibold text-destructive", children: admin.error.message }),
602
602
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
603
603
  Button,
@@ -610,11 +610,11 @@ var CopilotzAdmin = ({
610
610
  ] }) });
611
611
  }
612
612
  const isEmpty = cards.every((card) => card.value === 0) && admin.activity.length === 0 && admin.threads.length === 0 && admin.participants.length === 0 && admin.agents.length === 0;
613
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: cn("space-y-6 text-foreground", className), children: [
613
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: cn("gap-0 overflow-hidden py-0", className), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "space-y-6 p-6", children: [
614
614
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between", children: [
615
615
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "space-y-1", children: [
616
616
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-3", children: [
617
- config.branding.logo ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl border bg-card shadow-sm", children: config.branding.logo }) : null,
617
+ config.branding.logo ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl border bg-background shadow-sm", children: config.branding.logo }) : null,
618
618
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
619
619
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-2xl font-semibold tracking-tight", children: config.branding.title }),
620
620
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: config.branding.subtitle })
@@ -659,7 +659,7 @@ var CopilotzAdmin = ({
659
659
  value: admin.filters.interval,
660
660
  onValueChange: (v) => admin.setInterval(v),
661
661
  children: [
662
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectTrigger, { className: "w-[110px] h-8", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectValue, {}) }),
662
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectTrigger, { className: "h-8 w-[110px]", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectValue, {}) }),
663
663
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(SelectContent, { children: [
664
664
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectItem, { value: "hour", children: config.labels.intervalHour }),
665
665
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SelectItem, { value: "day", children: config.labels.intervalDay })
@@ -679,17 +679,24 @@ var CopilotzAdmin = ({
679
679
  config.branding.actions
680
680
  ] })
681
681
  ] }),
682
- isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: "border-dashed py-10 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "p-0", children: [
682
+ isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-xl border border-dashed p-10 text-center", children: [
683
683
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "text-lg font-semibold", children: config.labels.emptyTitle }),
684
684
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-sm text-muted-foreground", children: config.labels.emptyDescription })
685
- ] }) }) : null,
685
+ ] }) : null,
686
686
  config.features.showOverview ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "space-y-4", children: [
687
687
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SectionHeading, { title: config.labels.overviewTitle }),
688
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-5", children: cards.map((card) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "p-5", children: [
689
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm font-medium text-muted-foreground", children: card.label }),
690
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-3 text-3xl font-semibold tracking-tight", children: formatNumber(card.value) }),
691
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-xs text-muted-foreground", children: card.detail })
692
- ] }) }, card.label)) })
688
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-5", children: cards.map((card) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
689
+ "div",
690
+ {
691
+ className: "rounded-xl border bg-background p-5 shadow-sm",
692
+ children: [
693
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm font-medium text-muted-foreground", children: card.label }),
694
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-3 text-3xl font-semibold tracking-tight", children: formatNumber(card.value) }),
695
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-xs text-muted-foreground", children: card.detail })
696
+ ]
697
+ },
698
+ card.label
699
+ )) })
693
700
  ] }) : null,
694
701
  config.features.showActivity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "space-y-4", children: [
695
702
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SectionHeading, { title: config.labels.activityTitle }),
@@ -703,7 +710,7 @@ var CopilotzAdmin = ({
703
710
  }
704
711
  )
705
712
  ] }) : null,
706
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-6 xl:grid-cols-3", children: [
713
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-6 lg:grid-cols-3", children: [
707
714
  config.features.showThreads ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
708
715
  DataTable,
709
716
  {
@@ -744,7 +751,7 @@ var CopilotzAdmin = ({
744
751
  }
745
752
  ) : null
746
753
  ] })
747
- ] });
754
+ ] }) });
748
755
  };
749
756
  function SectionHeading({ title }) {
750
757
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "text-lg font-semibold tracking-tight", children: title });
@@ -755,15 +762,15 @@ function ActivityChart(props) {
755
762
  ...trimmedPoints.map((point) => point.messageCount),
756
763
  1
757
764
  );
758
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CardContent, { className: "p-5", children: trimmedPoints.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: props.labels.noResults }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex min-h-56 items-end gap-2", children: trimmedPoints.map((point) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
765
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "rounded-xl border bg-background p-5 shadow-sm", children: trimmedPoints.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: props.labels.noResults }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex min-h-48 items-end gap-2", children: trimmedPoints.map((point) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
759
766
  "div",
760
767
  {
761
768
  className: "flex min-w-0 flex-1 flex-col items-center gap-2",
762
769
  children: [
763
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex h-40 w-full items-end rounded-lg bg-muted px-1 pb-1", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
770
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex h-36 w-full items-end rounded-lg bg-muted px-1 pb-1", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
764
771
  "div",
765
772
  {
766
- className: "w-full rounded-md bg-primary",
773
+ className: "w-full rounded-md bg-primary transition-all",
767
774
  style: {
768
775
  height: `${Math.max(point.messageCount / maxMessages * 100, 8)}%`
769
776
  }
@@ -779,16 +786,16 @@ function ActivityChart(props) {
779
786
  ]
780
787
  },
781
788
  point.bucket
782
- )) }) }) });
789
+ )) }) });
783
790
  }
784
791
  function DataTable(props) {
785
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(CardContent, { className: "p-5", children: [
792
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-xl border bg-background p-5 shadow-sm", children: [
786
793
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mb-4 flex items-center justify-between gap-3", children: [
787
794
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SectionHeading, { title: props.title }),
788
795
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
789
796
  Input,
790
797
  {
791
- className: "w-full max-w-44 h-8",
798
+ className: "h-8 w-full max-w-44",
792
799
  onChange: (event) => props.setSearchValue(event.target.value),
793
800
  placeholder: props.searchPlaceholder,
794
801
  value: props.searchValue
@@ -796,7 +803,7 @@ function DataTable(props) {
796
803
  )
797
804
  ] }),
798
805
  props.rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: "No results" }) : props.children
799
- ] }) });
806
+ ] });
800
807
  }
801
808
  function ThreadsTable({
802
809
  rows,
@@ -810,7 +817,7 @@ function ThreadsTable({
810
817
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
811
818
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "min-w-0", children: [
812
819
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-medium", children: thread.name }),
813
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-xs text-muted-foreground truncate", children: thread.summary ?? thread.lastMessagePreview ?? "No summary yet" })
820
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 truncate text-xs text-muted-foreground", children: thread.summary ?? thread.lastMessagePreview ?? "No summary yet" })
814
821
  ] }),
815
822
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
816
823
  Badge,
@@ -880,7 +887,7 @@ function AgentsTable({
880
887
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
881
888
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "min-w-0", children: [
882
889
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-medium", children: agent.displayName }),
883
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-xs text-muted-foreground truncate", children: agent.description ?? agent.agentId })
890
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 truncate text-xs text-muted-foreground", children: agent.description ?? agent.agentId })
884
891
  ] }),
885
892
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { variant: "outline", children: agent.isConfigured ? labels.configured : labels.unconfigured })
886
893
  ] }),
@@ -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/input.tsx","../src/components/ui/badge.tsx","../src/components/ui/select.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 AdminOverview,\n AdminParticipantSummary,\n AdminSectionState,\n AdminThreadSummary,\n RequestHeadersProvider,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n","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":["import_react","import_jsx_runtime","import_jsx_runtime","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","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/input.tsx","../src/components/ui/badge.tsx","../src/components/ui/select.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 AdminOverview,\n AdminParticipantSummary,\n AdminSectionState,\n AdminThreadSummary,\n RequestHeadersProvider,\n UseCopilotzAdminOptions,\n UseCopilotzAdminResult,\n} from \"./types\";\n","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(\"border-border\", className)}>\n <CardContent className=\"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\", className)}>\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 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 <Card className={cn(\"gap-0 overflow-hidden py-0\", className)}>\n <CardContent className=\"space-y-6 p-6\">\n {/* Header */}\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-background 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=\"h-8 w-[110px]\">\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 <div className=\"rounded-xl border border-dashed p-10 text-center\">\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 </div>\n ) : null}\n\n {/* Overview */}\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-background 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 ) : null}\n\n {/* Activity */}\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 {/* Data Tables */}\n <div className=\"grid gap-6 lg: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 </CardContent>\n </Card>\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-background 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-background 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}: {\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 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>\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 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>\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":["import_react","import_jsx_runtime","import_jsx_runtime","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.js CHANGED
@@ -558,10 +558,10 @@ var CopilotzAdmin = ({
558
558
  }
559
559
  ];
560
560
  if (admin.isLoading && !admin.overview) {
561
- return /* @__PURE__ */ jsx6(Card, { className: cn("p-8", className), children: /* @__PURE__ */ jsx6(CardContent, { className: "p-0 text-muted-foreground", children: config.labels.loading }) });
561
+ return /* @__PURE__ */ jsx6(Card, { className: cn("border-border", className), children: /* @__PURE__ */ jsx6(CardContent, { className: "text-muted-foreground", children: config.labels.loading }) });
562
562
  }
563
563
  if (admin.error && !admin.overview) {
564
- return /* @__PURE__ */ jsx6(Card, { className: cn("border-destructive/50 bg-destructive/10 p-8", className), children: /* @__PURE__ */ jsxs2(CardContent, { className: "p-0 space-y-4", children: [
564
+ return /* @__PURE__ */ jsx6(Card, { className: cn("border-destructive/50 bg-destructive/10", className), children: /* @__PURE__ */ jsxs2(CardContent, { className: "space-y-4", children: [
565
565
  /* @__PURE__ */ jsx6("p", { className: "text-base font-semibold text-destructive", children: admin.error.message }),
566
566
  /* @__PURE__ */ jsx6(
567
567
  Button,
@@ -574,11 +574,11 @@ var CopilotzAdmin = ({
574
574
  ] }) });
575
575
  }
576
576
  const isEmpty = cards.every((card) => card.value === 0) && admin.activity.length === 0 && admin.threads.length === 0 && admin.participants.length === 0 && admin.agents.length === 0;
577
- return /* @__PURE__ */ jsxs2("div", { className: cn("space-y-6 text-foreground", className), children: [
577
+ return /* @__PURE__ */ jsx6(Card, { className: cn("gap-0 overflow-hidden py-0", className), children: /* @__PURE__ */ jsxs2(CardContent, { className: "space-y-6 p-6", children: [
578
578
  /* @__PURE__ */ jsxs2("header", { className: "flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between", children: [
579
579
  /* @__PURE__ */ jsxs2("div", { className: "space-y-1", children: [
580
580
  /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-3", children: [
581
- config.branding.logo ? /* @__PURE__ */ jsx6("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl border bg-card shadow-sm", children: config.branding.logo }) : null,
581
+ config.branding.logo ? /* @__PURE__ */ jsx6("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl border bg-background shadow-sm", children: config.branding.logo }) : null,
582
582
  /* @__PURE__ */ jsxs2("div", { children: [
583
583
  /* @__PURE__ */ jsx6("h2", { className: "text-2xl font-semibold tracking-tight", children: config.branding.title }),
584
584
  /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: config.branding.subtitle })
@@ -623,7 +623,7 @@ var CopilotzAdmin = ({
623
623
  value: admin.filters.interval,
624
624
  onValueChange: (v) => admin.setInterval(v),
625
625
  children: [
626
- /* @__PURE__ */ jsx6(SelectTrigger, { className: "w-[110px] h-8", children: /* @__PURE__ */ jsx6(SelectValue, {}) }),
626
+ /* @__PURE__ */ jsx6(SelectTrigger, { className: "h-8 w-[110px]", children: /* @__PURE__ */ jsx6(SelectValue, {}) }),
627
627
  /* @__PURE__ */ jsxs2(SelectContent, { children: [
628
628
  /* @__PURE__ */ jsx6(SelectItem, { value: "hour", children: config.labels.intervalHour }),
629
629
  /* @__PURE__ */ jsx6(SelectItem, { value: "day", children: config.labels.intervalDay })
@@ -643,17 +643,24 @@ var CopilotzAdmin = ({
643
643
  config.branding.actions
644
644
  ] })
645
645
  ] }),
646
- isEmpty ? /* @__PURE__ */ jsx6(Card, { className: "border-dashed py-10 text-center", children: /* @__PURE__ */ jsxs2(CardContent, { className: "p-0", children: [
646
+ isEmpty ? /* @__PURE__ */ jsxs2("div", { className: "rounded-xl border border-dashed p-10 text-center", children: [
647
647
  /* @__PURE__ */ jsx6("h3", { className: "text-lg font-semibold", children: config.labels.emptyTitle }),
648
648
  /* @__PURE__ */ jsx6("p", { className: "mt-2 text-sm text-muted-foreground", children: config.labels.emptyDescription })
649
- ] }) }) : null,
649
+ ] }) : null,
650
650
  config.features.showOverview ? /* @__PURE__ */ jsxs2("section", { className: "space-y-4", children: [
651
651
  /* @__PURE__ */ jsx6(SectionHeading, { title: config.labels.overviewTitle }),
652
- /* @__PURE__ */ jsx6("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-5", children: cards.map((card) => /* @__PURE__ */ jsx6(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ jsxs2(CardContent, { className: "p-5", children: [
653
- /* @__PURE__ */ jsx6("p", { className: "text-sm font-medium text-muted-foreground", children: card.label }),
654
- /* @__PURE__ */ jsx6("p", { className: "mt-3 text-3xl font-semibold tracking-tight", children: formatNumber(card.value) }),
655
- /* @__PURE__ */ jsx6("p", { className: "mt-2 text-xs text-muted-foreground", children: card.detail })
656
- ] }) }, card.label)) })
652
+ /* @__PURE__ */ jsx6("div", { className: "grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-5", children: cards.map((card) => /* @__PURE__ */ jsxs2(
653
+ "div",
654
+ {
655
+ className: "rounded-xl border bg-background p-5 shadow-sm",
656
+ children: [
657
+ /* @__PURE__ */ jsx6("p", { className: "text-sm font-medium text-muted-foreground", children: card.label }),
658
+ /* @__PURE__ */ jsx6("p", { className: "mt-3 text-3xl font-semibold tracking-tight", children: formatNumber(card.value) }),
659
+ /* @__PURE__ */ jsx6("p", { className: "mt-2 text-xs text-muted-foreground", children: card.detail })
660
+ ]
661
+ },
662
+ card.label
663
+ )) })
657
664
  ] }) : null,
658
665
  config.features.showActivity ? /* @__PURE__ */ jsxs2("section", { className: "space-y-4", children: [
659
666
  /* @__PURE__ */ jsx6(SectionHeading, { title: config.labels.activityTitle }),
@@ -667,7 +674,7 @@ var CopilotzAdmin = ({
667
674
  }
668
675
  )
669
676
  ] }) : null,
670
- /* @__PURE__ */ jsxs2("div", { className: "grid gap-6 xl:grid-cols-3", children: [
677
+ /* @__PURE__ */ jsxs2("div", { className: "grid gap-6 lg:grid-cols-3", children: [
671
678
  config.features.showThreads ? /* @__PURE__ */ jsx6(
672
679
  DataTable,
673
680
  {
@@ -708,7 +715,7 @@ var CopilotzAdmin = ({
708
715
  }
709
716
  ) : null
710
717
  ] })
711
- ] });
718
+ ] }) });
712
719
  };
713
720
  function SectionHeading({ title }) {
714
721
  return /* @__PURE__ */ jsx6("h3", { className: "text-lg font-semibold tracking-tight", children: title });
@@ -719,15 +726,15 @@ function ActivityChart(props) {
719
726
  ...trimmedPoints.map((point) => point.messageCount),
720
727
  1
721
728
  );
722
- return /* @__PURE__ */ jsx6(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ jsx6(CardContent, { className: "p-5", children: trimmedPoints.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: props.labels.noResults }) : /* @__PURE__ */ jsx6("div", { className: "flex min-h-56 items-end gap-2", children: trimmedPoints.map((point) => /* @__PURE__ */ jsxs2(
729
+ return /* @__PURE__ */ jsx6("div", { className: "rounded-xl border bg-background p-5 shadow-sm", children: trimmedPoints.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: props.labels.noResults }) : /* @__PURE__ */ jsx6("div", { className: "flex min-h-48 items-end gap-2", children: trimmedPoints.map((point) => /* @__PURE__ */ jsxs2(
723
730
  "div",
724
731
  {
725
732
  className: "flex min-w-0 flex-1 flex-col items-center gap-2",
726
733
  children: [
727
- /* @__PURE__ */ jsx6("div", { className: "flex h-40 w-full items-end rounded-lg bg-muted px-1 pb-1", children: /* @__PURE__ */ jsx6(
734
+ /* @__PURE__ */ jsx6("div", { className: "flex h-36 w-full items-end rounded-lg bg-muted px-1 pb-1", children: /* @__PURE__ */ jsx6(
728
735
  "div",
729
736
  {
730
- className: "w-full rounded-md bg-primary",
737
+ className: "w-full rounded-md bg-primary transition-all",
731
738
  style: {
732
739
  height: `${Math.max(point.messageCount / maxMessages * 100, 8)}%`
733
740
  }
@@ -743,16 +750,16 @@ function ActivityChart(props) {
743
750
  ]
744
751
  },
745
752
  point.bucket
746
- )) }) }) });
753
+ )) }) });
747
754
  }
748
755
  function DataTable(props) {
749
- return /* @__PURE__ */ jsx6(Card, { className: "gap-0 py-0", children: /* @__PURE__ */ jsxs2(CardContent, { className: "p-5", children: [
756
+ return /* @__PURE__ */ jsxs2("div", { className: "rounded-xl border bg-background p-5 shadow-sm", children: [
750
757
  /* @__PURE__ */ jsxs2("div", { className: "mb-4 flex items-center justify-between gap-3", children: [
751
758
  /* @__PURE__ */ jsx6(SectionHeading, { title: props.title }),
752
759
  /* @__PURE__ */ jsx6(
753
760
  Input,
754
761
  {
755
- className: "w-full max-w-44 h-8",
762
+ className: "h-8 w-full max-w-44",
756
763
  onChange: (event) => props.setSearchValue(event.target.value),
757
764
  placeholder: props.searchPlaceholder,
758
765
  value: props.searchValue
@@ -760,7 +767,7 @@ function DataTable(props) {
760
767
  )
761
768
  ] }),
762
769
  props.rows.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: "No results" }) : props.children
763
- ] }) });
770
+ ] });
764
771
  }
765
772
  function ThreadsTable({
766
773
  rows,
@@ -774,7 +781,7 @@ function ThreadsTable({
774
781
  /* @__PURE__ */ jsxs2("div", { className: "flex items-start justify-between gap-3", children: [
775
782
  /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
776
783
  /* @__PURE__ */ jsx6("p", { className: "font-medium", children: thread.name }),
777
- /* @__PURE__ */ jsx6("p", { className: "mt-1 text-xs text-muted-foreground truncate", children: thread.summary ?? thread.lastMessagePreview ?? "No summary yet" })
784
+ /* @__PURE__ */ jsx6("p", { className: "mt-1 truncate text-xs text-muted-foreground", children: thread.summary ?? thread.lastMessagePreview ?? "No summary yet" })
778
785
  ] }),
779
786
  /* @__PURE__ */ jsx6(
780
787
  Badge,
@@ -844,7 +851,7 @@ function AgentsTable({
844
851
  /* @__PURE__ */ jsxs2("div", { className: "flex items-start justify-between gap-3", children: [
845
852
  /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
846
853
  /* @__PURE__ */ jsx6("p", { className: "font-medium", children: agent.displayName }),
847
- /* @__PURE__ */ jsx6("p", { className: "mt-1 text-xs text-muted-foreground truncate", children: agent.description ?? agent.agentId })
854
+ /* @__PURE__ */ jsx6("p", { className: "mt-1 truncate text-xs text-muted-foreground", children: agent.description ?? agent.agentId })
848
855
  ] }),
849
856
  /* @__PURE__ */ jsx6(Badge, { variant: "outline", children: agent.isConfigured ? labels.configured : labels.unconfigured })
850
857
  ] }),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"]}
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(\"border-border\", className)}>\n <CardContent className=\"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\", className)}>\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 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 <Card className={cn(\"gap-0 overflow-hidden py-0\", className)}>\n <CardContent className=\"space-y-6 p-6\">\n {/* Header */}\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-background 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=\"h-8 w-[110px]\">\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 <div className=\"rounded-xl border border-dashed p-10 text-center\">\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 </div>\n ) : null}\n\n {/* Overview */}\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-background 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 ) : null}\n\n {/* Activity */}\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 {/* Data Tables */}\n <div className=\"grid gap-6 lg: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 </CardContent>\n </Card>\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-background 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-background 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}: {\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 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>\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 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>\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":";AAAA;AAAA,EACE;AAAA,EACA,WAAAA;AAAA,EACA,YAAAC;AAAA,OACK;;;ACFA,IAAM,qBAA0C;AAAA,EACrD,UAAU;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACR,cAAc;AAAA,IACd,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,YAAY;AAAA,EACd;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,EACT,mBAAmB,aAAa,CAAC;AAAA,EACjC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AACnB;AAEO,SAAS,iBACd,aACA,YACqB;AACrB,MAAI,CAAC,WAAY,QAAO;AAExB,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG,mBAAmB;AAAA,MACtB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,mBAAmB;AAAA,MACtB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,UAAU;AAAA,MACR,GAAG,mBAAmB;AAAA,MACtB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,IAAI;AAAA,MACF,GAAG,mBAAmB;AAAA,MACtB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,SAAS,WAAW,WAAW,mBAAmB;AAAA,IAClD,mBAAmB,WAAW,qBAC5B,mBAAmB;AAAA,IACrB,WAAW,WAAW,aAAa,mBAAmB;AAAA,IACtD,cAAc,WAAW,gBAAgB,mBAAmB;AAAA,IAC5D,iBAAiB,WAAW,mBAC1B,mBAAmB;AAAA,EACvB;AACF;;;AC1FA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACMP,IAAM,eACH,YAA6D,KAC1D;AACN,IAAM,UAAU,OAAO,iBAAiB,YAAY,aAAa,SAAS,IACtE,eACA;AACJ,IAAM,iBAAiB,QAAQ,QAAQ,OAAO,EAAE;AAEhD,IAAM,iBACJ,OAAO,YAAY,cAAc,UAAU;AAE7C,IAAM,WAAW,MAAM;AACrB,QAAM,MACH,YAA6D,OAAO,CAAC;AACxE,QAAM,aAAa;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,gBAAgB,KAAK;AAAA,IACrB,gBAAgB,KAAK;AAAA,EACvB;AACA,SAAO,WAAW;AAAA,IAAK,CAAC,UACtB,OAAO,UAAU,YAAY,MAAM,SAAS;AAAA,EAC9C;AACF,GAAG;AAEH,IAAM,iBAAiB,CAAC,YAAqB;AAC3C,QAAM,aAAa,WAAW,QAAQ,SAAS,IAAI,UAAU,gBAC1D,QAAQ,OAAO,EAAE;AACpB,SAAO,UAAU,WAAW,MAAM,KAAK,UAAU,WAAW,GAAG,IAC3D,YACA,IAAI,SAAS;AACnB;AAEA,IAAM,kBAAkB,OACtB,UAAkC,CAAC,GACnC,sBACoC;AACpC,QAAM,kBAAkB,oBACpB,MAAM,kBAAkB,IACxB;AACJ,MAAI,mBAAmB,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAC9D,WAAO,EAAE,GAAG,SAAS,GAAG,gBAAgB;AAAA,EAC1C;AACA,MAAI,SAAS;AACX,WAAO,EAAE,GAAG,SAAS,eAAe,UAAU,OAAO,GAAG;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,UAA2B;AACjD,QAAM,KAAK,oBAAI,KAAK;AACpB,QAAM,OAAO,IAAI,KAAK,EAAE;AACxB,MAAI,UAAU,OAAO;AACnB,SAAK,SAAS,KAAK,SAAS,IAAI,EAAE;AAAA,EACpC,WAAW,UAAU,OAAO;AAC1B,SAAK,QAAQ,KAAK,QAAQ,IAAI,EAAE;AAAA,EAClC,OAAO;AACL,SAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAAA,EACjC;AACA,SAAO;AAAA,IACL,MAAM,KAAK,YAAY;AAAA,IACvB,IAAI,GAAG,YAAY;AAAA,EACrB;AACF;AAEA,eAAe,eACb,MACA,QACA,SAIY;AACZ,QAAM,MAAM,IAAI,IAAI,GAAG,eAAe,SAAS,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,SAAS,MAAM;AACxF,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,UAAI,aAAa,IAAI,KAAK,KAAK;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,IAC3C,SAAS,MAAM,gBAAgB,CAAC,GAAG,SAAS,iBAAiB;AAAA,EAC/D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,GAAG;AAAA,EAC7D;AAEA,QAAM,UAAU,MAAM,SAAS,KAAK;AACpC,SAAO,QAAQ;AACjB;AAEA,eAAsB,mBACpB,OACA,WACA,SAIwB;AACxB,QAAM,cAAc,eAAe,KAAK;AACxC,SAAO,MAAM,eAA8B,sBAAsB;AAAA,IAC/D;AAAA,IACA,MAAM,YAAY;AAAA,IAClB,IAAI,YAAY;AAAA,EAClB,GAAG,OAAO;AACZ;AAEA,eAAsB,mBACpB,OACA,UACA,WACA,SAI+B;AAC/B,QAAM,cAAc,eAAe,KAAK;AACxC,SAAO,MAAM,eAAqC,sBAAsB;AAAA,IACtE;AAAA,IACA;AAAA,IACA,MAAM,YAAY;AAAA,IAClB,IAAI,YAAY;AAAA,EAClB,GAAG,OAAO;AACZ;AAEA,eAAsB,kBACpB,QACA,WACA,SAI+B;AAC/B,SAAO,MAAM,eAAqC,qBAAqB;AAAA,IACrE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,GAAG,OAAO;AACZ;AAEA,eAAsB,uBACpB,QACA,WACA,SAIoC;AACpC,SAAO,MAAM,eAA0C,0BAA0B;AAAA,IAC/E;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,GAAG,OAAO;AACZ;AAEA,eAAsB,iBACpB,QACA,WACA,SAI8B;AAC9B,SAAO,MAAM,eAAoC,oBAAoB;AAAA,IACnE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,GAAG,OAAO;AACZ;;;ADhKO,SAAS,iBACd,UAAmC,CAAC,GACZ;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA0B,QAAQ,SAAS,IAAI;AACzE,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAC9B,QAAQ,YAAY;AAAA,EACtB;AACA,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,QAAM,CAAC,SAAS,UAAU,IAAI,SAA4C,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAEtC,CAAC,CAAC;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,CAAC,CAAC;AACzE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AAErD,QAAM,WAAW,YAAY,YAAY;AACvC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB,mBAAmB,QAAQ;AAAA,MAC7B;AACA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpB,mBAAmB,OAAO,QAAQ,WAAW,MAAM;AAAA,QACnD,mBAAmB,OAAO,UAAU,QAAQ,WAAW,MAAM;AAAA,QAC7D,kBAAkB,QAAQ,cAAc,QAAQ,WAAW,MAAM;AAAA,QACjE;AAAA,UACE,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,QACA,iBAAiB,QAAQ,aAAa,QAAQ,WAAW,MAAM;AAAA,MACjE,CAAC;AAED,kBAAY,YAAY;AACxB,kBAAY,YAAY;AACxB,iBAAW,WAAW;AACtB,sBAAgB,gBAAgB;AAChC,gBAAU,UAAU;AAAA,IACtB,SAAS,WAAW;AAClB,eAAS,qBAAqB,QAC1B,YACA,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC5C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,SAAK,SAAS;AAAA,EAChB,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,QAAQ,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,WAAW,QAAQ;AAAA,MACnB,cAAc,QAAQ;AAAA,MACtB,mBAAmB,QAAQ;AAAA,MAC3B,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,IAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AEjIA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACCI;AAFJ,SAAS,KAAK,EAAE,WAAW,GAAG,MAAM,GAAgC;AAClE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAgDA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,QAAQ,SAAS;AAAA,MAC9B,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACtEA,SAAS,YAAY;AACrB,SAAS,WAA8B;AAgDnC,gBAAAC,YAAA;AA5CJ,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAGK;AACH,QAAM,OAAO,UAAU,OAAO;AAE9B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;;;AClDI,gBAAAC,YAAA;AAFJ,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAkC;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACjBA,SAAS,QAAAC,aAAY;AACrB,SAAS,OAAAC,YAA8B;AAmCnC,gBAAAC,YAAA;AA/BJ,IAAM,gBAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAC8D;AAC5D,QAAM,OAAO,UAAUC,QAAO;AAE9B,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC3CA,YAAY,WAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,OAAO,aAAa,iBAAiB;AAW5C,SAUI,OAAAG,MAVJ;AARF,IAAM,SAAyB;AAE/B,IAAM,cAA8B;AAEpC,IAAM,gBAAsB,iBAG1B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEH;AAAA;AAAA,MACD,gBAAAC,KAAiB,sBAAhB,EAAqB,SAAO,MAC3B,0BAAAA,KAAC,eAAY,WAAU,sBAAqB,GAC9C;AAAA;AAAA;AACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,gBAAsB,iBAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,MAAM,GAAG,QACzD,gBAAAA,KAAiB,wBAAhB,EACC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,aAAa,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAA,KAAiB,gCAAhB,EAA+B,WAAU,wDACxC,0BAAAA,KAAC,aAAU,WAAU,WAAU,GACjC;AAAA,MACA,gBAAAA;AAAA,QAAiB;AAAA,QAAhB;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,YACX;AAAA,UACJ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA,KAAiB,kCAAhB,EAAiC,WAAU,wDAC1C,0BAAAA,KAAC,eAAY,WAAU,WAAU,GACnC;AAAA;AAAA;AACF,GACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,aAAmB,iBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAA,KAAiB,0BAAhB,EAA0B,UAAS;AAAA,MACpC,gBAAAA,KAAiB,+BAAhB,EAA8B,WAAU,4DACvC,0BAAAA,KAAC,SAAM,WAAU,WAAU,GAC7B;AAAA;AAAA;AACF,CACD;AACD,WAAW,cAA8B,qBAAK;;;ATQtC,gBAAAC,MAUA,QAAAC,aAVA;AAzDD,IAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,SAASC;AAAA,IACb,MAAM,iBAAiB,oBAAoB,UAAU;AAAA,IACrD,CAAC,UAAU;AAAA,EACb;AACA,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,EAAE;AACnD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,EAAE;AAC7D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,uBAAuB,iBAAiB,YAAY;AAC1D,QAAM,4BAA4B,iBAAiB,iBAAiB;AACpE,QAAM,sBAAsB,iBAAiB,WAAW;AAExD,QAAM,QAAQ,iBAAiB;AAAA,IAC7B,SAAS,OAAO;AAAA,IAChB,mBAAmB,OAAO;AAAA,IAC1B,WAAW,OAAO;AAAA,IAClB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf,CAAC;AAED,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,OAAO,OAAO,OAAO;AAAA,MACrB,OAAO,MAAM,UAAU,cAAc,SAAS;AAAA,MAC9C,QAAQ,GAAG,MAAM,UAAU,cAAc,oBAAoB,CAAC;AAAA,IAChE;AAAA,IACA;AAAA,MACE,OAAO,OAAO,OAAO;AAAA,MACrB,OAAO,MAAM,UAAU,aAAa,UAAU;AAAA,MAC9C,QAAQ,GAAG,MAAM,UAAU,aAAa,SAAS,CAAC;AAAA,IACpD;AAAA,IACA;AAAA,MACE,OAAO,OAAO,OAAO;AAAA,MACrB,OAAO,MAAM,UAAU,kBAAkB,SAAS;AAAA,MAClD,QAAQ,GAAG,MAAM,UAAU,kBAAkB,UAAU,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,MACE,OAAO,OAAO,OAAO;AAAA,MACrB,OAAO,MAAM,UAAU,UAAU,eAAe;AAAA,MAChD,QAAQ,GAAG,MAAM,UAAU,UAAU,cAAc,CAAC;AAAA,IACtD;AAAA,IACA;AAAA,MACE,OAAO,OAAO,OAAO;AAAA,MACrB,OAAO,MAAM,UAAU,YAAY,WAAW;AAAA,MAC9C,QAAQ,GAAG,MAAM,UAAU,YAAY,UAAU,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,CAAC,MAAM,UAAU;AACtC,WACE,gBAAAH,KAAC,QAAK,WAAW,GAAG,iBAAiB,SAAS,GAC5C,0BAAAA,KAAC,eAAY,WAAU,yBACpB,iBAAO,OAAO,SACjB,GACF;AAAA,EAEJ;AAEA,MAAI,MAAM,SAAS,CAAC,MAAM,UAAU;AAClC,WACE,gBAAAA,KAAC,QAAK,WAAW,GAAG,2CAA2C,SAAS,GACtE,0BAAAC,MAAC,eAAY,WAAU,aACrB;AAAA,sBAAAD,KAAC,OAAE,WAAU,4CACV,gBAAM,MAAM,SACf;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,KAAK,MAAM,QAAQ;AAAA,UAEjC,iBAAO,OAAO;AAAA;AAAA,MACjB;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,QAAM,UACJ,MAAM,MAAM,CAAC,SAAS,KAAK,UAAU,CAAC,KACtC,MAAM,SAAS,WAAW,KAC1B,MAAM,QAAQ,WAAW,KACzB,MAAM,aAAa,WAAW,KAC9B,MAAM,OAAO,WAAW;AAE1B,SACE,gBAAAA,KAAC,QAAK,WAAW,GAAG,8BAA8B,SAAS,GACzD,0BAAAC,MAAC,eAAY,WAAU,iBAErB;AAAA,oBAAAA,MAAC,YAAO,WAAU,sEAChB;AAAA,sBAAAA,MAAC,SAAI,WAAU,aACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,2BACZ;AAAA,iBAAO,SAAS,OACf,gBAAAD,KAAC,SAAI,WAAU,wFACZ,iBAAO,SAAS,MACnB,IACE;AAAA,UACJ,gBAAAC,MAAC,SACC;AAAA,4BAAAD,KAAC,QAAG,WAAU,yCACX,iBAAO,SAAS,OACnB;AAAA,YACA,gBAAAA,KAAC,OAAE,WAAU,iCACV,iBAAO,SAAS,UACnB;AAAA,aACF;AAAA,WACF;AAAA,QACC,OAAO,YACN,gBAAAC,MAAC,OAAE,WAAU,yEAAwE;AAAA;AAAA,UACvE,OAAO;AAAA,WACrB,IACE;AAAA,SACN;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,qCACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,QAAQ,UAAU,QAAQ,YAAY;AAAA,YACrD,MAAK;AAAA,YACL,SAAS,MAAM,MAAM,SAAS,KAAK;AAAA,YAElC,iBAAO,OAAO;AAAA;AAAA,QACjB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,QAAQ,UAAU,OAAO,YAAY;AAAA,YACpD,MAAK;AAAA,YACL,SAAS,MAAM,MAAM,SAAS,IAAI;AAAA,YAEjC,iBAAO,OAAO;AAAA;AAAA,QACjB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,QAAQ,UAAU,QAAQ,YAAY;AAAA,YACrD,MAAK;AAAA,YACL,SAAS,MAAM,MAAM,SAAS,KAAK;AAAA,YAElC,iBAAO,OAAO;AAAA;AAAA,QACjB;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,QAAQ;AAAA,YACrB,eAAe,CAAC,MACd,MAAM,YAAY,CAAmB;AAAA,YAGvC;AAAA,8BAAAD,KAAC,iBAAc,WAAU,iBACvB,0BAAAA,KAAC,eAAY,GACf;AAAA,cACA,gBAAAC,MAAC,iBACC;AAAA,gCAAAD,KAAC,cAAW,OAAM,QACf,iBAAO,OAAO,cACjB;AAAA,gBACA,gBAAAA,KAAC,cAAW,OAAM,OACf,iBAAO,OAAO,aACjB;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,KAAK,MAAM,QAAQ;AAAA,YAEjC,iBAAO,OAAO;AAAA;AAAA,QACjB;AAAA,QACC,OAAO,SAAS;AAAA,SACnB;AAAA,OACF;AAAA,IAEC,UACC,gBAAAC,MAAC,SAAI,WAAU,oDACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,yBACX,iBAAO,OAAO,YACjB;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,sCACV,iBAAO,OAAO,kBACjB;AAAA,OACF,IACE;AAAA,IAGH,OAAO,SAAS,eACf,gBAAAC,MAAC,aAAQ,WAAU,aACjB;AAAA,sBAAAD,KAAC,kBAAe,OAAO,OAAO,OAAO,eAAe;AAAA,MACpD,gBAAAA,KAAC,SAAI,WAAU,wDACZ,gBAAM,IAAI,CAAC,SACV,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UAGV;AAAA,4BAAAD,KAAC,OAAE,WAAU,6CACV,eAAK,OACR;AAAA,YACA,gBAAAA,KAAC,OAAE,WAAU,8CACV,uBAAa,KAAK,KAAK,GAC1B;AAAA,YACA,gBAAAA,KAAC,OAAE,WAAU,sCACV,eAAK,QACR;AAAA;AAAA;AAAA,QAVK,KAAK;AAAA,MAWZ,CACD,GACH;AAAA,OACF,IACE;AAAA,IAGH,OAAO,SAAS,eACf,gBAAAC,MAAC,aAAQ,WAAU,aACjB;AAAA,sBAAAD,KAAC,kBAAe,OAAO,OAAO,OAAO,eAAe;AAAA,MACpD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM,QAAQ;AAAA,UACxB,QAAQ,OAAO;AAAA,UACf,SAAS,OAAO,GAAG;AAAA,UACnB,QAAQ,MAAM;AAAA;AAAA,MAChB;AAAA,OACF,IACE;AAAA,IAGJ,gBAAAC,MAAC,SAAI,WAAU,6BACZ;AAAA,aAAO,SAAS,cACf,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,mBAAmB,OAAO,OAAO;AAAA,UACjC,aAAa;AAAA,UACb,gBAAgB;AAAA,UAChB,OAAO,OAAO,OAAO;AAAA,UAErB,0BAAAA,KAAC,gBAAa,MAAM,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAAA;AAAA,MAC5D,IACE;AAAA,MACH,OAAO,SAAS,mBACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,mBAAmB,OAAO,OAAO;AAAA,UACjC,aAAa;AAAA,UACb,gBAAgB;AAAA,UAChB,OAAO,OAAO,OAAO;AAAA,UAErB,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,MAAM;AAAA,cACZ,QAAQ,OAAO;AAAA;AAAA,UACjB;AAAA;AAAA,MACF,IACE;AAAA,MACH,OAAO,SAAS,aACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,mBAAmB,OAAO,OAAO;AAAA,UACjC,aAAa;AAAA,UACb,gBAAgB;AAAA,UAChB,OAAO,OAAO,OAAO;AAAA,UAErB,0BAAAA,KAAC,eAAY,MAAM,MAAM,QAAQ,QAAQ,OAAO,QAAQ;AAAA;AAAA,MAC1D,IACE;AAAA,OACN;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,eAAe,EAAE,MAAM,GAAsB;AACpD,SAAO,gBAAAA,KAAC,QAAG,WAAU,wCAAwC,iBAAM;AACrE;AAEA,SAAS,cAAc,OAKpB;AACD,QAAM,gBAAgB,MAAM,OAAO,MAAM,CAAC,MAAM,OAAO;AACvD,QAAM,cAAc,KAAK;AAAA,IACvB,GAAG,cAAc,IAAI,CAAC,UAAU,MAAM,YAAY;AAAA,IAClD;AAAA,EACF;AAEA,SACE,gBAAAA,KAAC,SAAI,WAAU,iDACZ,wBAAc,WAAW,IACxB,gBAAAA,KAAC,OAAE,WAAU,iCACV,gBAAM,OAAO,WAChB,IAEA,gBAAAA,KAAC,SAAI,WAAU,iCACZ,wBAAc,IAAI,CAAC,UAClB,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MAGV;AAAA,wBAAAD,KAAC,SAAI,WAAU,4DACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,QAAQ,GAAG,KAAK,IAAK,MAAM,eAAe,cAAe,KAAK,CAAC,CAAC;AAAA,YAClE;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,uBACV,uBAAa,MAAM,QAAQ,MAAM,QAAQ,GAC5C;AAAA,UACA,gBAAAC,MAAC,OAAE,WAAU,qCACV;AAAA,yBAAa,MAAM,YAAY;AAAA,YAAE;AAAA,aACpC;AAAA,WACF;AAAA;AAAA;AAAA,IAjBK,MAAM;AAAA,EAkBb,CACD,GACH,GAEJ;AAEJ;AAEA,SAAS,UAAa,OAOnB;AACD,SACE,gBAAAA,MAAC,SAAI,WAAU,iDACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,gDACb;AAAA,sBAAAD,KAAC,kBAAe,OAAO,MAAM,OAAO;AAAA,MACpC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,UAAU,CAAC,UAAU,MAAM,eAAe,MAAM,OAAO,KAAK;AAAA,UAC5D,aAAa,MAAM;AAAA,UACnB,OAAO,MAAM;AAAA;AAAA,MACf;AAAA,OACF;AAAA,IACC,MAAM,KAAK,WAAW,IACrB,gBAAAA,KAAC,OAAE,WAAU,iCAAgC,wBAAU,IAEvD,MAAM;AAAA,KAEV;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,KAAC,SAAI,WAAU,aACZ,eAAK,IAAI,CAAC,WACT,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MAGV;AAAA,wBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,WACb;AAAA,4BAAAD,KAAC,OAAE,WAAU,eAAe,iBAAO,MAAK;AAAA,YACxC,gBAAAA,KAAC,OAAE,WAAU,+CACV,iBAAO,WACN,OAAO,sBACP,kBACJ;AAAA,aACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SACE,OAAO,WAAW,aAAa,cAAc;AAAA,cAG9C,iBAAO,WAAW,aACf,OAAO,iBACP,OAAO;AAAA;AAAA,UACb;AAAA,WACF;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,2DACb;AAAA,0BAAAA,MAAC,UAAM;AAAA,yBAAa,OAAO,YAAY;AAAA,YAAE;AAAA,aAAS;AAAA,UAClD,gBAAAA,MAAC,UAAM;AAAA,mBAAO,eAAe;AAAA,YAAO;AAAA,aAAa;AAAA,UACjD,gBAAAD,KAAC,UAAM,qBAAW,OAAO,cAAc,GAAE;AAAA,WAC3C;AAAA;AAAA;AAAA,IAzBK,OAAO;AAAA,EA0Bd,CACD,GACH;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,KAAC,SAAI,WAAU,aACZ,eAAK,IAAI,CAAC,gBACT,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MAGV;AAAA,wBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,WACb;AAAA,4BAAAD,KAAC,OAAE,WAAU,eAAe,sBAAY,aAAY;AAAA,YACpD,gBAAAA,KAAC,OAAE,WAAU,kEACV,sBAAY,iBACf;AAAA,aACF;AAAA,UACA,gBAAAA,KAAC,SAAM,SAAQ,WACZ,sBAAY,WACT,OAAO,cACP,OAAO,aACb;AAAA,WACF;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,2DACb;AAAA,0BAAAA,MAAC,UACE;AAAA,yBAAa,YAAY,YAAY;AAAA,YAAE;AAAA,aAC1C;AAAA,UACA,gBAAAA,MAAC,UACE;AAAA,yBAAa,YAAY,WAAW;AAAA,YAAE;AAAA,aACzC;AAAA,UACA,gBAAAD,KAAC,UAAM,qBAAW,YAAY,cAAc,GAAE;AAAA,WAChD;AAAA;AAAA;AAAA,IAvBK,GAAG,YAAY,SAAS,IAAI,YAAY,UAAU;AAAA,EAwBzD,CACD,GACH;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,KAAC,SAAI,WAAU,aACZ,eAAK,IAAI,CAAC,UACT,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MAGV;AAAA,wBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,WACb;AAAA,4BAAAD,KAAC,OAAE,WAAU,eAAe,gBAAM,aAAY;AAAA,YAC9C,gBAAAA,KAAC,OAAE,WAAU,+CACV,gBAAM,eAAe,MAAM,SAC9B;AAAA,aACF;AAAA,UACA,gBAAAA,KAAC,SAAM,SAAQ,WACZ,gBAAM,eACH,OAAO,aACP,OAAO,cACb;AAAA,WACF;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,6DACb;AAAA,0BAAAA,MAAC,UAAM;AAAA,yBAAa,MAAM,YAAY;AAAA,YAAE;AAAA,aAAS;AAAA,UACjD,gBAAAA,MAAC,UAAM;AAAA,yBAAa,MAAM,YAAY;AAAA,YAAE;AAAA,aAAU;AAAA,UAClD,gBAAAA,MAAC,UACE;AAAA,yBAAa,MAAM,oBAAoB;AAAA,YAAE;AAAA,aAC5C;AAAA,UACA,gBAAAA,MAAC,UAAM;AAAA,yBAAa,MAAM,WAAW;AAAA,YAAE;AAAA,aAAO;AAAA,WAChD;AAAA;AAAA;AAAA,IAtBK,GAAG,MAAM,SAAS,IAAI,MAAM,OAAO;AAAA,EAuB1C,CACD,GACH;AAEJ;AAEA,SAAS,aAAa,QAAgB,UAA0B;AAC9D,QAAM,OAAO,IAAI,KAAK,MAAM;AAC5B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,aAAa,SAChB,KAAK,eAAe,QAAW;AAAA,IAC7B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC,IACD,KAAK,mBAAmB,QAAW;AAAA,IACjC,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AACP;AAEA,SAAS,WAAW,OAAsB;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,KAAK,eAAe,QAAW;AAAA,IACpC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,aAAa,OAAe;AACnC,SAAO,IAAI,KAAK,aAAa,EAAE,OAAO,KAAK;AAC7C;","names":["useMemo","useState","jsx","jsx","Slot","cva","jsx","cva","Slot","jsx","jsx","jsx","jsxs","useMemo","useState"]}
package/dist/styles.css CHANGED
@@ -263,14 +263,14 @@
263
263
  .h-10 {
264
264
  height: calc(var(--spacing) * 10);
265
265
  }
266
- .h-40 {
267
- height: calc(var(--spacing) * 40);
266
+ .h-36 {
267
+ height: calc(var(--spacing) * 36);
268
268
  }
269
269
  .h-\[var\(--radix-select-trigger-height\)\] {
270
270
  height: var(--radix-select-trigger-height);
271
271
  }
272
- .min-h-56 {
273
- min-height: calc(var(--spacing) * 56);
272
+ .min-h-48 {
273
+ min-height: calc(var(--spacing) * 48);
274
274
  }
275
275
  .w-4 {
276
276
  width: calc(var(--spacing) * 4);
@@ -425,6 +425,9 @@
425
425
  --tw-border-style: dashed;
426
426
  border-style: dashed;
427
427
  }
428
+ .border-border {
429
+ border-color: var(--color-border);
430
+ }
428
431
  .border-destructive\/50 {
429
432
  border-color: color-mix(in srgb, hsl(var(--destructive)) 50%, transparent);
430
433
  @supports (color: color-mix(in lab, red, red)) {
@@ -473,9 +476,6 @@
473
476
  .bg-transparent {
474
477
  background-color: transparent;
475
478
  }
476
- .p-0 {
477
- padding: calc(var(--spacing) * 0);
478
- }
479
479
  .p-1 {
480
480
  padding: calc(var(--spacing) * 1);
481
481
  }
@@ -485,8 +485,11 @@
485
485
  .p-5 {
486
486
  padding: calc(var(--spacing) * 5);
487
487
  }
488
- .p-8 {
489
- padding: calc(var(--spacing) * 8);
488
+ .p-6 {
489
+ padding: calc(var(--spacing) * 6);
490
+ }
491
+ .p-10 {
492
+ padding: calc(var(--spacing) * 10);
490
493
  }
491
494
  .px-1 {
492
495
  padding-inline: calc(var(--spacing) * 1);
@@ -521,9 +524,6 @@
521
524
  .py-6 {
522
525
  padding-block: calc(var(--spacing) * 6);
523
526
  }
524
- .py-10 {
525
- padding-block: calc(var(--spacing) * 10);
526
- }
527
527
  .pr-8 {
528
528
  padding-right: calc(var(--spacing) * 8);
529
529
  }
@@ -880,9 +880,9 @@
880
880
  opacity: 50%;
881
881
  }
882
882
  }
883
- .md\:grid-cols-2 {
883
+ .md\:grid-cols-3 {
884
884
  @media (width >= 48rem) {
885
- grid-template-columns: repeat(2, minmax(0, 1fr));
885
+ grid-template-columns: repeat(3, minmax(0, 1fr));
886
886
  }
887
887
  }
888
888
  .md\:text-sm {
@@ -891,6 +891,16 @@
891
891
  line-height: var(--tw-leading, var(--text-sm--line-height));
892
892
  }
893
893
  }
894
+ .lg\:grid-cols-3 {
895
+ @media (width >= 64rem) {
896
+ grid-template-columns: repeat(3, minmax(0, 1fr));
897
+ }
898
+ }
899
+ .lg\:grid-cols-5 {
900
+ @media (width >= 64rem) {
901
+ grid-template-columns: repeat(5, minmax(0, 1fr));
902
+ }
903
+ }
894
904
  .lg\:flex-row {
895
905
  @media (width >= 64rem) {
896
906
  flex-direction: row;
@@ -906,16 +916,6 @@
906
916
  justify-content: space-between;
907
917
  }
908
918
  }
909
- .xl\:grid-cols-3 {
910
- @media (width >= 80rem) {
911
- grid-template-columns: repeat(3, minmax(0, 1fr));
912
- }
913
- }
914
- .xl\:grid-cols-5 {
915
- @media (width >= 80rem) {
916
- grid-template-columns: repeat(5, minmax(0, 1fr));
917
- }
918
- }
919
919
  .dark\:border-input {
920
920
  &:is(.dark *) {
921
921
  border-color: var(--color-input);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@copilotz/admin",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "Copilotz admin dashboard components",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",