@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 +30 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +30 -23
- package/dist/index.js.map +1 -1
- package/dist/styles.css +24 -24
- package/package.json +1 -1
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("
|
|
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
|
|
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.
|
|
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-
|
|
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]
|
|
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.
|
|
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
|
-
] })
|
|
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-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
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
|
|
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)(
|
|
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-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
] }),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/CopilotzAdmin.tsx","../src/config.ts","../src/useCopilotzAdmin.ts","../src/adminService.ts","../src/lib/utils.ts","../src/components/ui/card.tsx","../src/components/ui/button.tsx","../src/components/ui/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("
|
|
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
|
|
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__ */
|
|
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-
|
|
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]
|
|
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__ */
|
|
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
|
-
] })
|
|
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-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
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
|
|
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(
|
|
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-
|
|
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__ */
|
|
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
|
|
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
|
|
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
|
|
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":"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","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-
|
|
267
|
-
height: calc(var(--spacing) *
|
|
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-
|
|
273
|
-
min-height: calc(var(--spacing) *
|
|
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-
|
|
489
|
-
padding: calc(var(--spacing) *
|
|
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-
|
|
883
|
+
.md\:grid-cols-3 {
|
|
884
884
|
@media (width >= 48rem) {
|
|
885
|
-
grid-template-columns: repeat(
|
|
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);
|