@agent-native/dispatch 0.38.15 → 0.38.16-nightly-20260927213438

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.
Files changed (94) hide show
  1. package/dist/actions/create-workspace-resource.d.ts +13 -13
  2. package/dist/actions/provider-api-register.d.ts +12 -12
  3. package/dist/components/automation-create-dialog.js +4 -4
  4. package/dist/components/automation-create-dialog.js.map +1 -1
  5. package/dist/components/layout/Header.js +1 -1
  6. package/dist/components/layout/Header.js.map +1 -1
  7. package/dist/components/layout/Layout.d.ts +7 -0
  8. package/dist/components/layout/Layout.d.ts.map +1 -1
  9. package/dist/components/layout/Layout.js +19 -4
  10. package/dist/components/layout/Layout.js.map +1 -1
  11. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  12. package/dist/components/messaging-setup-panel.js +7 -28
  13. package/dist/components/messaging-setup-panel.js.map +1 -1
  14. package/dist/components/transactional-email-send-log.js +1 -1
  15. package/dist/components/transactional-email-send-log.js.map +1 -1
  16. package/dist/components/ui/alert-dialog.d.ts +1 -20
  17. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  18. package/dist/components/ui/alert-dialog.js +1 -26
  19. package/dist/components/ui/alert-dialog.js.map +1 -1
  20. package/dist/components/ui/button.d.ts +1 -11
  21. package/dist/components/ui/button.d.ts.map +1 -1
  22. package/dist/components/ui/button.js +1 -33
  23. package/dist/components/ui/button.js.map +1 -1
  24. package/dist/components/ui/carousel.d.ts +2 -2
  25. package/dist/components/ui/carousel.d.ts.map +1 -1
  26. package/dist/components/ui/input.d.ts +1 -3
  27. package/dist/components/ui/input.d.ts.map +1 -1
  28. package/dist/components/ui/input.js +1 -8
  29. package/dist/components/ui/input.js.map +1 -1
  30. package/dist/components/ui/sidebar.d.ts +4 -2
  31. package/dist/components/ui/sidebar.d.ts.map +1 -1
  32. package/dist/components/ui/switch.d.ts +1 -4
  33. package/dist/components/ui/switch.d.ts.map +1 -1
  34. package/dist/components/ui/switch.js +1 -7
  35. package/dist/components/ui/switch.js.map +1 -1
  36. package/dist/components/ui/tabs.d.ts +1 -7
  37. package/dist/components/ui/tabs.d.ts.map +1 -1
  38. package/dist/components/ui/tabs.js +1 -12
  39. package/dist/components/ui/tabs.js.map +1 -1
  40. package/dist/components/ui/toggle.d.ts +1 -12
  41. package/dist/components/ui/toggle.d.ts.map +1 -1
  42. package/dist/components/ui/toggle.js +1 -25
  43. package/dist/components/ui/toggle.js.map +1 -1
  44. package/dist/components/usage-alerts-panel.d.ts.map +1 -1
  45. package/dist/components/usage-alerts-panel.js +1 -1
  46. package/dist/components/usage-alerts-panel.js.map +1 -1
  47. package/dist/components/workspace-app-search.d.ts.map +1 -1
  48. package/dist/components/workspace-app-search.js +1 -1
  49. package/dist/components/workspace-app-search.js.map +1 -1
  50. package/dist/routes/pages/automations.d.ts.map +1 -1
  51. package/dist/routes/pages/automations.js +2 -2
  52. package/dist/routes/pages/automations.js.map +1 -1
  53. package/dist/routes/pages/metrics.d.ts.map +1 -1
  54. package/dist/routes/pages/metrics.js +1 -1
  55. package/dist/routes/pages/metrics.js.map +1 -1
  56. package/dist/routes/pages/settings.d.ts +9 -0
  57. package/dist/routes/pages/settings.d.ts.map +1 -1
  58. package/dist/routes/pages/settings.js +65 -12
  59. package/dist/routes/pages/settings.js.map +1 -1
  60. package/dist/routes/pages/thread-debug.js +1 -1
  61. package/dist/routes/pages/thread-debug.js.map +1 -1
  62. package/dist/routes/pages/vault.d.ts.map +1 -1
  63. package/dist/routes/pages/vault.js +2 -2
  64. package/dist/routes/pages/vault.js.map +1 -1
  65. package/dist/server/lib/usage-metrics-store.js +2 -3
  66. package/dist/server/lib/usage-metrics-store.js.map +1 -1
  67. package/dist/server/plugins/db.d.ts.map +1 -1
  68. package/dist/server/plugins/db.js +44 -0
  69. package/dist/server/plugins/db.js.map +1 -1
  70. package/package.json +4 -4
  71. package/src/components/automation-create-dialog.tsx +6 -6
  72. package/src/components/layout/Header.tsx +2 -2
  73. package/src/components/layout/Layout.spec.tsx +28 -0
  74. package/src/components/layout/Layout.tsx +73 -43
  75. package/src/components/messaging-setup-panel.spec.tsx +5 -1
  76. package/src/components/messaging-setup-panel.tsx +9 -45
  77. package/src/components/transactional-email-send-log.tsx +1 -1
  78. package/src/components/ui/alert-dialog.tsx +1 -139
  79. package/src/components/ui/button.tsx +1 -56
  80. package/src/components/ui/input.tsx +1 -22
  81. package/src/components/ui/switch.tsx +1 -27
  82. package/src/components/ui/tabs.tsx +1 -53
  83. package/src/components/ui/toggle.tsx +1 -43
  84. package/src/components/usage-alerts-panel.tsx +6 -12
  85. package/src/components/workspace-app-search.tsx +2 -1
  86. package/src/routes/pages/automations.tsx +4 -2
  87. package/src/routes/pages/metrics.tsx +2 -1
  88. package/src/routes/pages/settings.spec.tsx +179 -0
  89. package/src/routes/pages/settings.tsx +179 -119
  90. package/src/routes/pages/thread-debug.tsx +1 -1
  91. package/src/routes/pages/vault.tsx +3 -2
  92. package/src/server/lib/usage-metrics-store.spec.ts +1 -0
  93. package/src/server/lib/usage-metrics-store.ts +2 -2
  94. package/src/server/plugins/db.ts +49 -0
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/routes/pages/metrics.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sendToAgentChat } from \"@agent-native/core/client/agent-chat\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconActivity,\n IconAlertTriangle,\n IconArrowUpRight,\n IconApps,\n IconChartBar,\n IconCoin,\n IconMessages,\n IconUsersGroup,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { Link, useSearchParams } from \"react-router\";\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Line,\n LineChart,\n XAxis,\n YAxis,\n} from \"recharts\";\n\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../components/ui/chart\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../components/ui/tabs\";\nimport { UsageAlertsPanel } from \"../../components/usage-alerts-panel\";\nimport { cn } from \"../../lib/utils\";\n\nexport function meta() {\n return [{ title: \"Metrics — Dispatch\" }];\n}\n\ninterface UsageMetricBucket {\n key: string;\n label: string;\n costCents: number;\n calls: number;\n chatCalls: number;\n inputTokens: number;\n outputTokens: number;\n activeUsers: number;\n lastActiveAt: number | null;\n}\n\ninterface UserUsageMetric extends UsageMetricBucket {\n ownerEmail: string;\n chatThreads: number;\n chatMessages: number;\n lastChatAt: number | null;\n topApp: string | null;\n role: string | null;\n}\n\ninterface AppAdoptionActionMetric {\n key: string;\n label: string;\n calls: number;\n activeUsers: number;\n lastActiveAt: number | null;\n}\n\ninterface UsageUserOption {\n email: string;\n role: string | null;\n}\n\ninterface AppAccessMetric {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n isDispatch: boolean;\n accessLabel: string;\n accessUsers: number;\n ownerEmail: string | null;\n isOwnedByViewer: boolean;\n canViewUsage: boolean;\n usersWithUsage: number;\n dailyActiveUsers: number;\n weeklyActiveUsers: number;\n usageCalls: number;\n chatCalls: number;\n costCents: number;\n lastActiveAt: number | null;\n actionMetrics: AppAdoptionActionMetric[];\n}\n\ninterface DailyUsageMetric {\n date: string;\n costCents: number;\n calls: number;\n chatCalls: number;\n activeUsers: number;\n dailyActiveUsers: number;\n weeklyActiveUsers: number | null;\n}\n\ninterface RecentUsageMetric {\n id: number;\n createdAt: number;\n ownerEmail: string;\n app: string;\n label: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n costCents: number;\n prompt: string | null;\n promptSource: \"thread\" | \"thread-preview\" | \"not-captured\" | \"unavailable\";\n threadId: string | null;\n runId: string | null;\n taskId: string | null;\n sourcePlatform: string | null;\n sourceId: string | null;\n}\n\ninterface UsageBillingMode {\n unit: \"usd\" | \"builder-credits\";\n label: string;\n shortLabel: string;\n source: \"estimated-provider-cost\" | \"builder-agent-credits\";\n hardCostMarginMultiplier?: number;\n creditsPerUsd?: number;\n}\n\ninterface DispatchUsageMetrics {\n billing?: UsageBillingMode;\n viewScope?: \"me\" | \"workspace\" | \"app\";\n selectedUserEmail?: string | null;\n selectedAppId?: string | null;\n availableUsers?: UsageUserOption[];\n sinceDays: number;\n access: {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n scope: \"organization\" | \"solo\";\n totalUsers: number;\n };\n totals: {\n costCents: number;\n calls: number;\n chatCalls: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n activeUsers: number;\n chatThreads: number;\n chatMessages: number;\n workspaceApps: number;\n };\n byApp: UsageMetricBucket[];\n byUser: UserUsageMetric[];\n byLabel: UsageMetricBucket[];\n byModel: UsageMetricBucket[];\n daily: DailyUsageMetric[];\n dailyAvailable: boolean;\n appAccess: AppAccessMetric[];\n recent: RecentUsageMetric[];\n}\n\nconst RANGES = [7, 30, 90] as const;\n\ntype MetricsView = \"overview\" | \"adoption\" | \"details\";\n\nfunction selectedMetricsView(value: string | null): MetricsView {\n if (value === \"adoption\" || value === \"details\") return value;\n return \"overview\";\n}\n\nconst USD_BILLING: UsageBillingMode = {\n unit: \"usd\",\n label: \"Estimated spend\",\n shortLabel: \"Cost\",\n source: \"estimated-provider-cost\",\n};\n\nfunction displayAmountFromCostCents(\n cents: number,\n billing: UsageBillingMode,\n): number {\n if (billing.unit !== \"builder-credits\") return cents;\n const margin = billing.hardCostMarginMultiplier ?? 1.25;\n const creditsPerUsd = billing.creditsPerUsd ?? 20;\n const credits = (cents / 100) * margin * creditsPerUsd;\n return credits <= 0 ? 0 : Math.ceil(credits * 1000) / 1000;\n}\n\nfunction formatCredits(credits: number): string {\n if (!Number.isFinite(credits) || credits === 0) return \"0 credits\";\n const maximumFractionDigits = credits < 1 ? 3 : credits < 10 ? 2 : 1;\n const value = credits.toLocaleString(undefined, {\n maximumFractionDigits,\n });\n return `${value} ${credits === 1 ? \"credit\" : \"credits\"}`;\n}\n\nfunction formatSpend(cents: number, billing: UsageBillingMode): string {\n if (billing.unit === \"builder-credits\") {\n return formatCredits(displayAmountFromCostCents(cents, billing));\n }\n if (!Number.isFinite(cents) || cents === 0) return \"$0.00\";\n if (Math.abs(cents) < 1) return `${cents.toFixed(3)}¢`;\n if (Math.abs(cents) < 100) return `${cents.toFixed(2)}¢`;\n return (cents / 100).toLocaleString(undefined, {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: number | null | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"—\";\n return new Intl.NumberFormat(undefined, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: value >= 10_000 ? 1 : 0,\n }).format(value);\n}\n\nfunction formatTokens(value: number): string {\n return new Intl.NumberFormat(undefined, {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(value);\n}\n\nfunction timeAgo(timestamp: number | null): string {\n if (!timestamp) return \"No activity\";\n const diff = Date.now() - timestamp;\n if (diff < 60_000) return \"just now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nfunction formatTrendDate(value: string): string {\n const date = new Date(`${value}T12:00:00`);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction completeUsageTrendRows(rows: DailyUsageMetric[]): DailyUsageMetric[] {\n if (rows.length < 2) return rows;\n const byDate = new Map(rows.map((row) => [row.date, row]));\n const start = new Date(`${rows[0].date}T12:00:00`);\n const end = new Date(`${rows[rows.length - 1].date}T12:00:00`);\n const completed: DailyUsageMetric[] = [];\n for (\n const cursor = start;\n cursor <= end;\n cursor.setDate(cursor.getDate() + 1)\n ) {\n const date = cursor.toISOString().slice(0, 10);\n completed.push(\n byDate.get(date) ?? {\n date,\n costCents: 0,\n calls: 0,\n chatCalls: 0,\n activeUsers: 0,\n dailyActiveUsers: 0,\n weeklyActiveUsers: 0,\n },\n );\n }\n return completed;\n}\n\nfunction UserActivityTrend({ rows }: { rows: DailyUsageMetric[] }) {\n const chartData = rows.map((row) => ({\n ...row,\n dau: row.dailyActiveUsers,\n wau: row.weeklyActiveUsers,\n }));\n\n return (\n <Panel\n title=\"Active users trend\"\n icon={<IconUsersGroup size={16} />}\n action={\n <div className=\"hidden items-center gap-3 text-[11px] text-muted-foreground sm:flex\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-primary\" />\n DAU\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-muted-foreground\" />\n WAU\n </span>\n </div>\n }\n >\n {chartData.length === 0 ? (\n <div className=\"flex min-h-56 items-center justify-center rounded-md border border-dashed px-4 text-sm text-muted-foreground\">\n No active users in this window yet.\n </div>\n ) : (\n <ChartContainer\n config={{\n dau: {\n label: \"DAU\",\n color: \"hsl(var(--dispatch-brand-blue))\",\n },\n wau: {\n label: \"WAU\",\n color: \"hsl(var(--muted-foreground))\",\n },\n }}\n className=\"h-[240px] w-full aspect-auto\"\n >\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 8, left: 12, bottom: 0 }}\n >\n <CartesianGrid\n vertical={false}\n stroke=\"hsl(var(--border))\"\n strokeDasharray=\"3 3\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n minTickGap={28}\n tickFormatter={formatTrendDate}\n />\n <YAxis\n allowDecimals={false}\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n width={34}\n tickFormatter={(value) => formatNumber(Number(value))}\n />\n <ChartTooltip\n cursor={false}\n content={\n <ChartTooltipContent\n labelFormatter={(value) => formatTrendDate(String(value))}\n formatter={(value, name) => [\n `${formatNumber(Number(value))} users`,\n name === \"dau\" ? \"DAU\" : \"WAU\",\n ]}\n />\n }\n />\n <Line\n dataKey=\"dau\"\n type=\"monotone\"\n stroke=\"var(--color-dau)\"\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 4, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n <Line\n dataKey=\"wau\"\n type=\"monotone\"\n stroke=\"var(--color-wau)\"\n strokeWidth={1.5}\n dot={false}\n activeDot={{ r: 3, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n </LineChart>\n </ChartContainer>\n )}\n </Panel>\n );\n}\n\nfunction displayApp(value: string | null | undefined): string {\n const trimmed = value?.trim();\n if (!trimmed || trimmed === \"unattributed\") return \"Unattributed\";\n return trimmed;\n}\n\nfunction maxSpend(\n rows: Array<{ costCents: number }>,\n billing: UsageBillingMode,\n): number {\n return rows.reduce(\n (max, row) =>\n Math.max(max, displayAmountFromCostCents(row.costCents, billing)),\n 0,\n );\n}\n\nfunction barWidth(value: number, max: number): string {\n if (max <= 0 || value <= 0) return \"0%\";\n return `${Math.max(4, Math.round((value / max) * 100))}%`;\n}\n\nfunction RangeSelector({\n value,\n onChange,\n}: {\n value: number;\n onChange: (value: number) => void;\n}) {\n return (\n <div className=\"flex rounded-md bg-card p-0.5\">\n {RANGES.map((range) => (\n <Button\n key={range}\n type=\"button\"\n variant={value === range ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n onClick={() => onChange(range)}\n >\n {range}d\n </Button>\n ))}\n </div>\n );\n}\n\nfunction MetricCard({\n label,\n value,\n detail,\n icon,\n}: {\n label: string;\n value: string;\n detail: string;\n icon: ReactNode;\n}) {\n return (\n <div className=\"rounded-lg bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </span>\n <span className=\"text-muted-foreground\">{icon}</span>\n </div>\n <div className=\"text-2xl font-semibold tabular-nums text-foreground\">\n {value}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {detail}\n </div>\n </div>\n );\n}\n\nfunction Panel({\n title,\n icon,\n children,\n action,\n}: {\n title: string;\n icon: ReactNode;\n children: ReactNode;\n action?: ReactNode;\n}) {\n return (\n <section className=\"rounded-lg bg-card\">\n <div className=\"flex items-center justify-between gap-3 border-b px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"text-muted-foreground\">{icon}</span>\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n </div>\n {action}\n </div>\n <div className=\"p-4\">{children}</div>\n </section>\n );\n}\n\nfunction LoadingMetrics() {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-5\">\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"rounded-lg bg-card p-4\">\n <Skeleton className=\"mb-4 h-4 w-24\" />\n <Skeleton className=\"h-7 w-20\" />\n <Skeleton className=\"mt-3 h-3 w-28\" />\n </div>\n ))}\n </div>\n <Skeleton className=\"h-80 rounded-lg\" />\n </div>\n );\n}\n\nfunction ScopeSelector({\n value,\n onChange,\n}: {\n value: \"me\" | \"workspace\";\n onChange: (value: \"me\" | \"workspace\") => void;\n}) {\n return (\n <div className=\"flex rounded-md bg-card p-0.5\" aria-label=\"Usage scope\">\n {(\n [\n [\"me\", \"My usage\"],\n [\"workspace\", \"Workspace\"],\n ] as const\n ).map(([scope, label]) => (\n <Button\n key={scope}\n type=\"button\"\n variant={value === scope ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n aria-pressed={value === scope}\n onClick={() => onChange(scope)}\n >\n {label}\n </Button>\n ))}\n </div>\n );\n}\n\nfunction UserSelector({\n value,\n users,\n onChange,\n}: {\n value: string | null;\n users: UsageUserOption[];\n onChange: (value: string | null) => void;\n}) {\n return (\n <Select\n value={value ?? \"all\"}\n onValueChange={(nextValue) =>\n onChange(nextValue === \"all\" ? null : nextValue)\n }\n >\n <SelectTrigger\n className=\"h-8 w-[210px] text-xs\"\n aria-label=\"Filter usage by user\"\n >\n <SelectValue placeholder=\"All users\" />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n <SelectItem value=\"all\">All users</SelectItem>\n {users.map((user) => (\n <SelectItem key={user.email} value={user.email}>\n {user.email}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n );\n}\n\nfunction UsageTrend({\n rows,\n billing,\n}: {\n rows: DailyUsageMetric[];\n billing: UsageBillingMode;\n}) {\n const chartData = completeUsageTrendRows(rows).map((row) => ({\n ...row,\n spend: displayAmountFromCostCents(row.costCents, billing),\n }));\n\n return (\n <Panel\n title={\n billing.unit === \"builder-credits\"\n ? \"Credit usage trend\"\n : \"Usage trend\"\n }\n icon={<IconChartBar size={16} />}\n action={\n <div className=\"hidden items-center gap-3 text-[11px] text-muted-foreground sm:flex\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-[hsl(var(--dispatch-brand-blue))]\" />\n {billing.shortLabel}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-muted-foreground\" />\n Calls\n </span>\n </div>\n }\n >\n {chartData.length === 0 ? (\n <div className=\"flex min-h-56 items-center justify-center rounded-md border border-dashed px-4 text-sm text-muted-foreground\">\n No usage in this window yet.\n </div>\n ) : (\n <ChartContainer\n config={{\n spend: {\n label: billing.shortLabel,\n color: \"hsl(var(--dispatch-brand-blue))\",\n },\n calls: {\n label: \"Calls\",\n color: \"hsl(var(--muted-foreground))\",\n },\n }}\n className=\"h-[280px] w-full aspect-auto\"\n >\n <AreaChart\n data={chartData}\n margin={{ top: 8, right: 8, left: 12, bottom: 0 }}\n >\n <defs>\n <linearGradient id=\"usage-trend-fill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor=\"var(--color-spend)\"\n stopOpacity={0.24}\n />\n <stop\n offset=\"100%\"\n stopColor=\"var(--color-spend)\"\n stopOpacity={0}\n />\n </linearGradient>\n </defs>\n <CartesianGrid\n vertical={false}\n stroke=\"hsl(var(--border))\"\n strokeDasharray=\"3 3\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n minTickGap={28}\n tickFormatter={formatTrendDate}\n />\n <YAxis\n yAxisId=\"spend\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n width={50}\n tickFormatter={(value) =>\n billing.unit === \"builder-credits\"\n ? formatCredits(Number(value))\n : formatSpend(Number(value), billing)\n }\n />\n <YAxis yAxisId=\"calls\" orientation=\"right\" hide />\n <ChartTooltip\n cursor={false}\n content={\n <ChartTooltipContent\n labelFormatter={(value) => formatTrendDate(String(value))}\n formatter={(value, name) => [\n name === \"spend\"\n ? billing.unit === \"builder-credits\"\n ? formatCredits(Number(value))\n : formatSpend(Number(value), billing)\n : `${formatNumber(Number(value))} calls`,\n name === \"spend\" ? billing.shortLabel : \"Calls\",\n ]}\n />\n }\n />\n <Area\n yAxisId=\"spend\"\n dataKey=\"spend\"\n type=\"monotone\"\n stroke=\"var(--color-spend)\"\n strokeWidth={2}\n fill=\"url(#usage-trend-fill)\"\n fillOpacity={1}\n dot={false}\n activeDot={{ r: 4, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n <Area\n yAxisId=\"calls\"\n dataKey=\"calls\"\n type=\"monotone\"\n stroke=\"var(--color-calls)\"\n strokeWidth={1.5}\n fill=\"none\"\n dot={false}\n activeDot={{ r: 3, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n </AreaChart>\n </ChartContainer>\n )}\n </Panel>\n );\n}\n\nfunction ReviewUsageButton({\n metrics,\n billing,\n}: {\n metrics: DispatchUsageMetrics;\n billing: UsageBillingMode;\n}) {\n function reviewUsage() {\n const topApps = metrics.byApp\n .slice(0, 5)\n .map(\n (row) =>\n `${displayApp(row.key)}: ${formatSpend(row.costCents, billing)} / ${row.calls} calls`,\n )\n .join(\"; \");\n const topLabels = metrics.byLabel\n .slice(0, 5)\n .map(\n (row) =>\n `${row.label}: ${formatSpend(row.costCents, billing)} / ${row.calls} calls`,\n )\n .join(\"; \");\n const recentPrompts = metrics.recent\n .slice(0, 8)\n .map((row) => {\n const prompt = row.prompt\n ? row.prompt.slice(0, 180)\n : \"prompt not captured\";\n return `${timeAgo(row.createdAt)} | ${displayApp(row.app)} | ${row.label} | ${prompt}`;\n })\n .join(\"\\n\");\n\n sendToAgentChat({\n message:\n \"Review this LLM usage and explain where the spend is going. Identify repeated, background, or unexpectedly expensive work, cite the strongest evidence, and suggest concrete fixes. Call out missing attribution instead of guessing.\",\n context: [\n `Dispatch usage scope: ${metrics.viewScope === \"workspace\" ? \"workspace\" : \"my account\"}.`,\n `Lookback: ${metrics.sinceDays} days. Viewer: ${metrics.access.viewerEmail}.`,\n `Total: ${formatSpend(metrics.totals.costCents, billing)}, ${metrics.totals.calls} calls, ${metrics.totals.chatCalls} chat calls, ${formatTokens(metrics.totals.inputTokens + metrics.totals.outputTokens)} input/output tokens.`,\n `Top apps: ${topApps || \"none\"}.`,\n `Top work types: ${topLabels || \"none\"}.`,\n `Recent prompt evidence (bounded to the latest 8 rows):\\n${recentPrompts || \"none\"}`,\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n chatTarget: \"local\",\n });\n }\n\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={reviewUsage}>\n Ask agent\n </Button>\n );\n}\n\nfunction AppSpendRows({\n rows,\n billing,\n}: {\n rows: UsageMetricBucket[];\n billing: UsageBillingMode;\n}) {\n const max = maxSpend(rows, billing);\n if (rows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No LLM usage recorded for this window.\n </div>\n );\n }\n return (\n <div className=\"space-y-3\">\n {rows.map((row) => (\n <div key={row.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3 text-sm\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">\n {displayApp(row.key)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatNumber(row.chatCalls)} chats ·{\" \"}\n {formatNumber(row.activeUsers)} users\n </div>\n </div>\n <div className=\"shrink-0 text-right\">\n <div className=\"font-medium tabular-nums text-foreground\">\n {formatSpend(row.costCents, billing)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatNumber(row.calls)} calls\n </div>\n </div>\n </div>\n <div className=\"h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-foreground\"\n style={{\n width: barWidth(\n displayAmountFromCostCents(row.costCents, billing),\n max,\n ),\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction AppAdoptionPanel({\n rows,\n selectedAppId,\n scope,\n backScope,\n}: {\n rows: AppAccessMetric[];\n selectedAppId: string | null;\n scope: \"me\" | \"workspace\" | \"app\";\n backScope: \"me\" | \"workspace\";\n}) {\n const t = useT();\n const visibleRows = rows\n .filter((row) => !row.isDispatch)\n .sort(\n (a, b) =>\n b.usageCalls - a.usageCalls ||\n b.usersWithUsage - a.usersWithUsage ||\n (b.lastActiveAt ?? 0) - (a.lastActiveAt ?? 0) ||\n a.name.localeCompare(b.name),\n );\n const [showAll, setShowAll] = useState(false);\n const selectedRow = selectedAppId\n ? visibleRows.find((row) => row.id === selectedAppId)\n : null;\n const isDetail = !!selectedRow;\n const actionMetrics = selectedRow?.actionMetrics ?? [];\n const rowsToRender = showAll ? visibleRows : visibleRows.slice(0, 9);\n const detailStats = [\n [t(\"dispatch.pages.dailyActiveUsers\"), selectedRow?.dailyActiveUsers],\n [t(\"dispatch.pages.weeklyActiveUsers\"), selectedRow?.weeklyActiveUsers],\n [t(\"dispatch.pages.trackedActions\"), selectedRow?.usageCalls],\n ] satisfies Array<[string, number | null | undefined]>;\n const title = isDetail\n ? t(\"dispatch.pages.appAdoptionFor\", { name: selectedRow.name })\n : scope === \"workspace\"\n ? t(\"dispatch.pages.appAdoption\")\n : t(\"dispatch.pages.yourAppActivity\");\n const backHref =\n backScope === \"workspace\"\n ? \"/admin/metrics?scope=workspace&view=adoption\"\n : \"/admin/metrics?view=adoption\";\n\n if (visibleRows.length === 0) {\n return (\n <Panel title={title} icon={<IconApps size={16} />}>\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noWorkspaceApps\")}\n </div>\n </Panel>\n );\n }\n\n return (\n <Panel\n title={title}\n icon={<IconChartBar size={16} />}\n action={\n isDetail ? (\n <Link\n to={backHref}\n className=\"text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n {t(\"allApps\")}\n </Link>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.appAdoptionDefinition\")}\n </span>\n )\n }\n >\n {isDetail ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {selectedRow.name}\n </div>\n <div className=\"font-mono text-xs text-muted-foreground\">\n {selectedRow.path}\n </div>\n </div>\n <Badge variant=\"secondary\">\n {selectedRow.ownerEmail\n ? selectedRow.isOwnedByViewer\n ? t(\"dispatch.pages.appMetadataOwner\")\n : selectedRow.ownerEmail\n : t(\"dispatch.pages.ownerUnavailable\")}\n </Badge>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-3\">\n {detailStats.map(([label, value]) => (\n <div\n key={String(label)}\n className=\"rounded-md border bg-background p-3\"\n >\n <div className=\"text-xs text-muted-foreground\">{label}</div>\n <div className=\"mt-1 text-2xl font-semibold tabular-nums text-foreground\">\n {formatNumber(value)}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"border-t pt-4\">\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.pages.trackedActionBreakdown\")}\n </div>\n {actionMetrics.length === 0 ? (\n <div className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noTrackedActions\")}\n </div>\n ) : (\n <div className=\"divide-y rounded-md border\">\n {actionMetrics.slice(0, 10).map((action) => (\n <div\n key={action.key}\n className=\"flex items-center justify-between gap-3 px-3 py-2.5 text-xs\"\n >\n <span className=\"min-w-0 truncate font-medium text-foreground\">\n {action.label}\n </span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {formatNumber(action.calls)}{\" \"}\n {t(\"dispatch.pages.trackedActions\")} ·{\" \"}\n {formatNumber(action.activeUsers)}{\" \"}\n {t(\"dispatch.pages.activeUsers\")}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n ) : (\n <>\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {rowsToRender.map((row) => (\n <div key={row.id} className=\"rounded-md border bg-background p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {row.name}\n </div>\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {row.path}\n </div>\n </div>\n {row.isOwnedByViewer ? (\n <Badge variant=\"secondary\">\n {t(\"dispatch.pages.appMetadataOwner\")}\n </Badge>\n ) : null}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n <div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.dailyActiveUsers\")}\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {formatNumber(row.dailyActiveUsers)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.weeklyActiveUsers\")}\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {formatNumber(row.weeklyActiveUsers)}\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-xs text-muted-foreground\">\n {formatNumber(row.usageCalls)}{\" \"}\n {t(\"dispatch.pages.trackedActions\")}\n </div>\n {row.canViewUsage ? (\n <Link\n to={`/admin/metrics?app=${encodeURIComponent(row.id)}${scope === \"workspace\" ? \"&scope=workspace\" : \"\"}&view=adoption`}\n className=\"mt-3 inline-flex items-center gap-1 text-xs font-medium text-foreground hover:underline\"\n >\n {t(\"dispatch.pages.viewAppMetrics\")}\n <IconArrowUpRight size={13} />\n </Link>\n ) : null}\n </div>\n ))}\n </div>\n {visibleRows.length > 9 ? (\n <div className=\"mt-4 flex justify-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowAll((current) => !current)}\n >\n {showAll\n ? t(\"jobs.scheduleUnavailableFixLabelOpen\")\n : t(\"jobs.scheduleUnavailableFixLabel\")}\n </Button>\n </div>\n ) : null}\n </>\n )}\n </Panel>\n );\n}\n\nfunction AppAccessTable({\n rows,\n billing,\n}: {\n rows: AppAccessMetric[];\n billing: UsageBillingMode;\n}) {\n const visibleRows = rows.filter((row) => !row.isDispatch);\n if (visibleRows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No workspace apps discovered yet.\n </div>\n );\n }\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] text-left text-xs\">\n <thead>\n <tr className=\"border-b text-muted-foreground\">\n <th className=\"px-2 py-2 font-medium\">App</th>\n <th className=\"px-2 py-2 font-medium\">Access</th>\n <th className=\"px-2 py-2 text-right font-medium\">Users</th>\n <th className=\"px-2 py-2 text-right font-medium\">Chats</th>\n <th className=\"px-2 py-2 text-right font-medium\">\n {billing.shortLabel}\n </th>\n <th className=\"px-2 py-2 text-right font-medium\">Last activity</th>\n </tr>\n </thead>\n <tbody>\n {visibleRows.map((row) => (\n <tr key={row.id} className=\"border-b last:border-0\">\n <td className=\"px-2 py-3\">\n <div className=\"font-medium text-foreground\">{row.name}</div>\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {row.path}\n </div>\n </td>\n <td className=\"px-2 py-3\">\n <Badge\n variant=\"outline\"\n className={cn(\n row.status === \"pending\" &&\n \"border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\",\n )}\n >\n {row.status === \"pending\"\n ? row.statusLabel || \"Builder branch\"\n : row.accessLabel}\n </Badge>\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.usersWithUsage)} /{\" \"}\n {formatNumber(row.accessUsers)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatCalls)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatSpend(row.costCents, billing)}\n </td>\n <td className=\"px-2 py-3 text-right text-muted-foreground\">\n {timeAgo(row.lastActiveAt)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction UserTable({\n rows,\n billing,\n}: {\n rows: UserUsageMetric[];\n billing: UsageBillingMode;\n}) {\n if (rows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No users have triggered LLM usage in this window.\n </div>\n );\n }\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] text-left text-xs\">\n <thead>\n <tr className=\"border-b text-muted-foreground\">\n <th className=\"px-2 py-2 font-medium\">User</th>\n <th className=\"px-2 py-2 font-medium\">Role</th>\n <th className=\"px-2 py-2 font-medium\">Top app</th>\n <th className=\"px-2 py-2 text-right font-medium\">Chats</th>\n <th className=\"px-2 py-2 text-right font-medium\">Threads</th>\n <th className=\"px-2 py-2 text-right font-medium\">Tokens</th>\n <th className=\"px-2 py-2 text-right font-medium\">\n {billing.shortLabel}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, 12).map((row) => (\n <tr key={row.ownerEmail} className=\"border-b last:border-0\">\n <td className=\"max-w-64 px-2 py-3\">\n <div className=\"truncate font-medium text-foreground\">\n {row.ownerEmail}\n </div>\n <div className=\"text-muted-foreground\">\n {timeAgo(row.lastActiveAt ?? row.lastChatAt)}\n </div>\n </td>\n <td className=\"px-2 py-3\">\n <Badge variant=\"secondary\">{row.role ?? \"user\"}</Badge>\n </td>\n <td className=\"px-2 py-3 text-muted-foreground\">\n {displayApp(row.topApp)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatCalls)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatThreads)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatTokens(row.inputTokens + row.outputTokens)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatSpend(row.costCents, billing)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction CompactBreakdown({\n rows,\n empty,\n billing,\n}: {\n rows: UsageMetricBucket[];\n empty: string;\n billing: UsageBillingMode;\n}) {\n const max = maxSpend(rows, billing);\n if (rows.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">{empty}</div>;\n }\n return (\n <div className=\"space-y-3\">\n {rows.slice(0, 6).map((row) => (\n <div key={row.key} className=\"space-y-1\">\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <span className=\"truncate font-medium text-foreground\">\n {row.label}\n </span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {formatSpend(row.costCents, billing)}\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-muted-foreground\"\n style={{\n width: barWidth(\n displayAmountFromCostCents(row.costCents, billing),\n max,\n ),\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default function MetricsRoute() {\n const t = useT();\n const [sinceDays, setSinceDays] = useState(30);\n const [searchParams, setSearchParams] = useSearchParams();\n const view = selectedMetricsView(searchParams.get(\"view\"));\n const appId = searchParams.get(\"app\") || null;\n const backScope: \"me\" | \"workspace\" =\n searchParams.get(\"scope\") === \"workspace\" ? \"workspace\" : \"me\";\n const scope: \"me\" | \"workspace\" | \"app\" = appId\n ? \"app\"\n : searchParams.get(\"scope\") === \"workspace\"\n ? \"workspace\"\n : \"me\";\n const userEmail =\n scope === \"workspace\" ? searchParams.get(\"user\") || null : null;\n\n function setScope(nextScope: \"me\" | \"workspace\") {\n const next = new URLSearchParams(searchParams);\n next.delete(\"app\");\n if (nextScope === \"me\") next.delete(\"scope\");\n else next.set(\"scope\", nextScope);\n if (nextScope === \"me\") next.delete(\"user\");\n setSearchParams(next, { replace: true });\n }\n\n function setUserEmail(nextUserEmail: string | null) {\n const next = new URLSearchParams(searchParams);\n if (nextUserEmail) next.set(\"user\", nextUserEmail);\n else next.delete(\"user\");\n setSearchParams(next, { replace: true });\n }\n\n function setView(nextView: MetricsView) {\n const next = new URLSearchParams(searchParams);\n if (nextView === \"overview\") next.delete(\"view\");\n else next.set(\"view\", nextView);\n setSearchParams(next, { replace: true });\n }\n\n const { data, isLoading, error } = useActionQuery(\n \"list-dispatch-usage-metrics\",\n {\n sinceDays,\n scope,\n userEmail: userEmail ?? undefined,\n appId: appId ?? undefined,\n },\n );\n const metrics = data as DispatchUsageMetrics | undefined;\n const selectedAppName = metrics?.selectedAppId\n ? metrics.appAccess.find((row) => row.id === metrics.selectedAppId)?.name\n : null;\n const billing = metrics?.billing ?? USD_BILLING;\n const totalTokens = useMemo(() => {\n if (!metrics) return 0;\n return (\n metrics.totals.inputTokens +\n metrics.totals.outputTokens +\n metrics.totals.cacheReadTokens +\n metrics.totals.cacheWriteTokens\n );\n }, [metrics]);\n\n return (\n <DispatchShell\n title={t(\"dispatch.nav.metrics\")}\n description={\n billing.unit === \"builder-credits\"\n ? t(\"dispatch.pages.metricsDescriptionBuilder\")\n : t(\"dispatch.pages.metricsDescriptionLlm\")\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {scope === \"app\"\n ? t(\"dispatch.pages.appAdoption\")\n : metrics?.selectedUserEmail\n ? `${metrics.selectedUserEmail}'s usage`\n : scope === \"workspace\"\n ? \"Workspace usage\"\n : \"Your usage\"}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {scope === \"app\"\n ? selectedAppName || t(\"dispatch.pages.workspaceAppFallback\")\n : metrics?.selectedUserEmail\n ? \"Filtered to this workspace member\"\n : scope === \"workspace\"\n ? `${metrics?.access.totalUsers ?? 0} users with access`\n : metrics?.access.viewerEmail || \"Signed-in account\"}\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {appId ? (\n <Link\n to={\n backScope === \"workspace\"\n ? \"/admin/metrics?scope=workspace&view=adoption\"\n : \"/admin/metrics?view=adoption\"\n }\n className=\"inline-flex h-7 items-center rounded-md border px-3 text-xs font-medium text-foreground hover:bg-muted\"\n >\n {t(\"allApps\")}\n </Link>\n ) : (\n <ScopeSelector\n value={scope === \"workspace\" ? \"workspace\" : \"me\"}\n onChange={setScope}\n />\n )}\n {scope === \"workspace\" && metrics ? (\n <UserSelector\n value={metrics.selectedUserEmail ?? userEmail}\n users={metrics.availableUsers ?? []}\n onChange={setUserEmail}\n />\n ) : null}\n <RangeSelector value={sinceDays} onChange={setSinceDays} />\n </div>\n </div>\n\n {error ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"h-4 w-4\" />\n <AlertTitle>{t(\"dispatch.pages.metricsUnavailable\")}</AlertTitle>\n <AlertDescription>\n {error instanceof Error\n ? error.message\n : t(\"dispatch.pages.unableToLoadUsage\")}\n </AlertDescription>\n </Alert>\n ) : null}\n\n {isLoading && !metrics ? <LoadingMetrics /> : null}\n\n {metrics ? (\n <Tabs\n value={view}\n onValueChange={(value) => {\n if (\n value === \"overview\" ||\n value === \"adoption\" ||\n value === \"details\"\n ) {\n setView(value);\n }\n }}\n className=\"flex min-w-0 flex-col gap-5\"\n >\n <TabsList className=\"w-fit\">\n <TabsTrigger value=\"overview\">\n <IconActivity size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.overview\")}\n </TabsTrigger>\n <TabsTrigger value=\"adoption\">\n <IconApps size={15} className=\"mr-1.5\" />\n {t(\"dispatch.pages.appAdoption\")}\n </TabsTrigger>\n <TabsTrigger value=\"details\">\n <IconChartBar size={15} className=\"mr-1.5\" />\n {t(\"details\")}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"mt-0 min-w-0 space-y-4\">\n {metrics.dailyAvailable === false ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"h-4 w-4\" />\n <AlertTitle>\n {t(\"dispatch.pages.metricsUnavailable\")}\n </AlertTitle>\n <AlertDescription>\n {t(\"dispatch.pages.unableToLoadUsage\")}\n </AlertDescription>\n </Alert>\n ) : null}\n <UsageTrend rows={metrics.daily} billing={billing} />\n <UserActivityTrend rows={metrics.daily} />\n\n <div className=\"flex items-center justify-between gap-3 border-y py-3\">\n <span className=\"text-sm text-muted-foreground\">\n Review this usage with the agent\n </span>\n <ReviewUsageButton metrics={metrics} billing={billing} />\n </div>\n\n {scope !== \"app\" ? (\n <UsageAlertsPanel\n scope={scope === \"workspace\" ? \"workspace\" : \"user\"}\n appOptions={metrics.byApp\n .filter((row) => row.key && row.key !== \"unattributed\")\n .map((row) => ({\n id: row.key,\n label: displayApp(row.key),\n }))}\n />\n ) : null}\n\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-5\">\n <MetricCard\n label={billing.label}\n value={formatSpend(metrics.totals.costCents, billing)}\n detail={`${formatTokens(totalTokens)} total tokens`}\n icon={<IconCoin size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.llmCalls\")}\n value={formatNumber(metrics.totals.calls)}\n detail={`${formatNumber(metrics.totals.chatCalls)} chat turns`}\n icon={<IconActivity size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.activeUsers\")}\n value={formatNumber(metrics.totals.activeUsers)}\n detail={`${formatNumber(metrics.access.totalUsers)} users with access`}\n icon={<IconUsersGroup size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.workspaceAppsStat\")}\n value={formatNumber(metrics.totals.workspaceApps)}\n detail={`${formatNumber(metrics.byApp.length)} with usage`}\n icon={<IconApps size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.chatThreads\")}\n value={formatNumber(metrics.totals.chatThreads)}\n detail={`${formatNumber(metrics.totals.chatMessages)} messages`}\n icon={<IconMessages size={17} />}\n />\n </div>\n </TabsContent>\n\n <TabsContent value=\"adoption\" className=\"mt-0 min-w-0\">\n <AppAdoptionPanel\n rows={metrics.appAccess}\n selectedAppId={metrics.selectedAppId ?? appId}\n scope={scope}\n backScope={backScope}\n />\n </TabsContent>\n\n <TabsContent value=\"details\" className=\"mt-0 min-w-0 space-y-4\">\n <Panel\n title={\n billing.unit === \"builder-credits\"\n ? \"Credit spend by app\"\n : \"Spend by app\"\n }\n icon={<IconApps size={16} />}\n >\n <AppSpendRows rows={metrics.byApp} billing={billing} />\n </Panel>\n\n <Panel title=\"Access By App\" icon={<IconApps size={16} />}>\n <AppAccessTable rows={metrics.appAccess} billing={billing} />\n </Panel>\n\n {scope !== \"app\" ? (\n <Panel title=\"Users\" icon={<IconUsersGroup size={16} />}>\n <UserTable rows={metrics.byUser} billing={billing} />\n </Panel>\n ) : null}\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Panel title=\"Models\" icon={<IconChartBar size={16} />}>\n <CompactBreakdown\n rows={metrics.byModel}\n empty=\"No model usage in this window.\"\n billing={billing}\n />\n </Panel>\n <Panel title=\"Work Types\" icon={<IconActivity size={16} />}>\n <CompactBreakdown\n rows={metrics.byLabel}\n empty=\"No labeled usage in this window.\"\n billing={billing}\n />\n </Panel>\n </div>\n </TabsContent>\n </Tabs>\n ) : null}\n </div>\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/routes/pages/metrics.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sendToAgentChat } from \"@agent-native/core/client/agent-chat\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconActivity,\n IconAlertTriangle,\n IconArrowUpRight,\n IconApps,\n IconChartBar,\n IconCoin,\n IconMessages,\n IconUsersGroup,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { Link, useSearchParams } from \"react-router\";\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Line,\n LineChart,\n XAxis,\n YAxis,\n} from \"recharts\";\n\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../components/ui/chart\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../components/ui/tabs\";\nimport { UsageAlertsPanel } from \"../../components/usage-alerts-panel\";\nimport { cn } from \"../../lib/utils\";\n\nexport function meta() {\n return [{ title: \"Metrics — Dispatch\" }];\n}\n\ninterface UsageMetricBucket {\n key: string;\n label: string;\n costCents: number;\n calls: number;\n chatCalls: number;\n inputTokens: number;\n outputTokens: number;\n activeUsers: number;\n lastActiveAt: number | null;\n}\n\ninterface UserUsageMetric extends UsageMetricBucket {\n ownerEmail: string;\n chatThreads: number;\n chatMessages: number;\n lastChatAt: number | null;\n topApp: string | null;\n role: string | null;\n}\n\ninterface AppAdoptionActionMetric {\n key: string;\n label: string;\n calls: number;\n activeUsers: number;\n lastActiveAt: number | null;\n}\n\ninterface UsageUserOption {\n email: string;\n role: string | null;\n}\n\ninterface AppAccessMetric {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n statusLabel?: string;\n isDispatch: boolean;\n accessLabel: string;\n accessUsers: number;\n ownerEmail: string | null;\n isOwnedByViewer: boolean;\n canViewUsage: boolean;\n usersWithUsage: number;\n dailyActiveUsers: number;\n weeklyActiveUsers: number;\n usageCalls: number;\n chatCalls: number;\n costCents: number;\n lastActiveAt: number | null;\n actionMetrics: AppAdoptionActionMetric[];\n}\n\ninterface DailyUsageMetric {\n date: string;\n costCents: number;\n calls: number;\n chatCalls: number;\n activeUsers: number;\n dailyActiveUsers: number;\n weeklyActiveUsers: number | null;\n}\n\ninterface RecentUsageMetric {\n id: number;\n createdAt: number;\n ownerEmail: string;\n app: string;\n label: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n costCents: number;\n prompt: string | null;\n promptSource: \"thread\" | \"thread-preview\" | \"not-captured\" | \"unavailable\";\n threadId: string | null;\n runId: string | null;\n taskId: string | null;\n sourcePlatform: string | null;\n sourceId: string | null;\n}\n\ninterface UsageBillingMode {\n unit: \"usd\" | \"builder-credits\";\n label: string;\n shortLabel: string;\n source: \"estimated-provider-cost\" | \"builder-agent-credits\";\n hardCostMarginMultiplier?: number;\n creditsPerUsd?: number;\n}\n\ninterface DispatchUsageMetrics {\n billing?: UsageBillingMode;\n viewScope?: \"me\" | \"workspace\" | \"app\";\n selectedUserEmail?: string | null;\n selectedAppId?: string | null;\n availableUsers?: UsageUserOption[];\n sinceDays: number;\n access: {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n scope: \"organization\" | \"solo\";\n totalUsers: number;\n };\n totals: {\n costCents: number;\n calls: number;\n chatCalls: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n activeUsers: number;\n chatThreads: number;\n chatMessages: number;\n workspaceApps: number;\n };\n byApp: UsageMetricBucket[];\n byUser: UserUsageMetric[];\n byLabel: UsageMetricBucket[];\n byModel: UsageMetricBucket[];\n daily: DailyUsageMetric[];\n dailyAvailable: boolean;\n appAccess: AppAccessMetric[];\n recent: RecentUsageMetric[];\n}\n\nconst RANGES = [7, 30, 90] as const;\n\ntype MetricsView = \"overview\" | \"adoption\" | \"details\";\n\nfunction selectedMetricsView(value: string | null): MetricsView {\n if (value === \"adoption\" || value === \"details\") return value;\n return \"overview\";\n}\n\nconst USD_BILLING: UsageBillingMode = {\n unit: \"usd\",\n label: \"Estimated spend\",\n shortLabel: \"Cost\",\n source: \"estimated-provider-cost\",\n};\n\nfunction displayAmountFromCostCents(\n cents: number,\n billing: UsageBillingMode,\n): number {\n if (billing.unit !== \"builder-credits\") return cents;\n const margin = billing.hardCostMarginMultiplier ?? 1.25;\n const creditsPerUsd = billing.creditsPerUsd ?? 20;\n const credits = (cents / 100) * margin * creditsPerUsd;\n return credits <= 0 ? 0 : Math.ceil(credits * 1000) / 1000;\n}\n\nfunction formatCredits(credits: number): string {\n if (!Number.isFinite(credits) || credits === 0) return \"0 credits\";\n const maximumFractionDigits = credits < 1 ? 3 : credits < 10 ? 2 : 1;\n const value = credits.toLocaleString(undefined, {\n maximumFractionDigits,\n });\n return `${value} ${credits === 1 ? \"credit\" : \"credits\"}`;\n}\n\nfunction formatSpend(cents: number, billing: UsageBillingMode): string {\n if (billing.unit === \"builder-credits\") {\n return formatCredits(displayAmountFromCostCents(cents, billing));\n }\n if (!Number.isFinite(cents) || cents === 0) return \"$0.00\";\n if (Math.abs(cents) < 1) return `${cents.toFixed(3)}¢`;\n if (Math.abs(cents) < 100) return `${cents.toFixed(2)}¢`;\n return (cents / 100).toLocaleString(undefined, {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: number | null | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"—\";\n return new Intl.NumberFormat(undefined, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: value >= 10_000 ? 1 : 0,\n }).format(value);\n}\n\nfunction formatTokens(value: number): string {\n return new Intl.NumberFormat(undefined, {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(value);\n}\n\nfunction timeAgo(timestamp: number | null): string {\n if (!timestamp) return \"No activity\";\n const diff = Date.now() - timestamp;\n if (diff < 60_000) return \"just now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nfunction formatTrendDate(value: string): string {\n const date = new Date(`${value}T12:00:00`);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction completeUsageTrendRows(rows: DailyUsageMetric[]): DailyUsageMetric[] {\n if (rows.length < 2) return rows;\n const byDate = new Map(rows.map((row) => [row.date, row]));\n const start = new Date(`${rows[0].date}T12:00:00`);\n const end = new Date(`${rows[rows.length - 1].date}T12:00:00`);\n const completed: DailyUsageMetric[] = [];\n for (\n const cursor = start;\n cursor <= end;\n cursor.setDate(cursor.getDate() + 1)\n ) {\n const date = cursor.toISOString().slice(0, 10);\n completed.push(\n byDate.get(date) ?? {\n date,\n costCents: 0,\n calls: 0,\n chatCalls: 0,\n activeUsers: 0,\n dailyActiveUsers: 0,\n weeklyActiveUsers: 0,\n },\n );\n }\n return completed;\n}\n\nfunction UserActivityTrend({ rows }: { rows: DailyUsageMetric[] }) {\n const chartData = rows.map((row) => ({\n ...row,\n dau: row.dailyActiveUsers,\n wau: row.weeklyActiveUsers,\n }));\n\n return (\n <Panel\n title=\"Active users trend\"\n icon={<IconUsersGroup size={16} />}\n action={\n <div className=\"hidden items-center gap-3 text-[11px] text-muted-foreground sm:flex\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-primary\" />\n DAU\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-muted-foreground\" />\n WAU\n </span>\n </div>\n }\n >\n {chartData.length === 0 ? (\n <div className=\"flex min-h-56 items-center justify-center rounded-md border border-dashed px-4 text-sm text-muted-foreground\">\n No active users in this window yet.\n </div>\n ) : (\n <ChartContainer\n config={{\n dau: {\n label: \"DAU\",\n color: \"hsl(var(--dispatch-brand-blue))\",\n },\n wau: {\n label: \"WAU\",\n color: \"hsl(var(--muted-foreground))\",\n },\n }}\n className=\"h-[240px] w-full aspect-auto\"\n >\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 8, left: 12, bottom: 0 }}\n >\n <CartesianGrid\n vertical={false}\n stroke=\"hsl(var(--border))\"\n strokeDasharray=\"3 3\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n minTickGap={28}\n tickFormatter={formatTrendDate}\n />\n <YAxis\n allowDecimals={false}\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n width={34}\n tickFormatter={(value) => formatNumber(Number(value))}\n />\n <ChartTooltip\n cursor={false}\n content={\n <ChartTooltipContent\n labelFormatter={(value) => formatTrendDate(String(value))}\n formatter={(value, name) => [\n `${formatNumber(Number(value))} users`,\n name === \"dau\" ? \"DAU\" : \"WAU\",\n ]}\n />\n }\n />\n <Line\n dataKey=\"dau\"\n type=\"monotone\"\n stroke=\"var(--color-dau)\"\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 4, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n <Line\n dataKey=\"wau\"\n type=\"monotone\"\n stroke=\"var(--color-wau)\"\n strokeWidth={1.5}\n dot={false}\n activeDot={{ r: 3, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n </LineChart>\n </ChartContainer>\n )}\n </Panel>\n );\n}\n\nfunction displayApp(value: string | null | undefined): string {\n const trimmed = value?.trim();\n if (!trimmed || trimmed === \"unattributed\") return \"Unattributed\";\n return trimmed;\n}\n\nfunction maxSpend(\n rows: Array<{ costCents: number }>,\n billing: UsageBillingMode,\n): number {\n return rows.reduce(\n (max, row) =>\n Math.max(max, displayAmountFromCostCents(row.costCents, billing)),\n 0,\n );\n}\n\nfunction barWidth(value: number, max: number): string {\n if (max <= 0 || value <= 0) return \"0%\";\n return `${Math.max(4, Math.round((value / max) * 100))}%`;\n}\n\nfunction RangeSelector({\n value,\n onChange,\n}: {\n value: number;\n onChange: (value: number) => void;\n}) {\n return (\n <div className=\"flex rounded-md bg-card p-0.5\">\n {RANGES.map((range) => (\n <Button\n key={range}\n type=\"button\"\n variant={value === range ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n onClick={() => onChange(range)}\n >\n {range}d\n </Button>\n ))}\n </div>\n );\n}\n\nfunction MetricCard({\n label,\n value,\n detail,\n icon,\n}: {\n label: string;\n value: string;\n detail: string;\n icon: ReactNode;\n}) {\n return (\n <div className=\"rounded-lg bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </span>\n <span className=\"text-muted-foreground\">{icon}</span>\n </div>\n <div className=\"text-2xl font-semibold tabular-nums text-foreground\">\n {value}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {detail}\n </div>\n </div>\n );\n}\n\nfunction Panel({\n title,\n icon,\n children,\n action,\n}: {\n title: string;\n icon: ReactNode;\n children: ReactNode;\n action?: ReactNode;\n}) {\n return (\n <section className=\"rounded-lg bg-card\">\n <div className=\"flex items-center justify-between gap-3 border-b px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"text-muted-foreground\">{icon}</span>\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n </div>\n {action}\n </div>\n <div className=\"p-4\">{children}</div>\n </section>\n );\n}\n\nfunction LoadingMetrics() {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-5\">\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"rounded-lg bg-card p-4\">\n <Skeleton className=\"mb-4 h-4 w-24\" />\n <Skeleton className=\"h-7 w-20\" />\n <Skeleton className=\"mt-3 h-3 w-28\" />\n </div>\n ))}\n </div>\n <Skeleton className=\"h-80 rounded-lg\" />\n </div>\n );\n}\n\nfunction ScopeSelector({\n value,\n onChange,\n}: {\n value: \"me\" | \"workspace\";\n onChange: (value: \"me\" | \"workspace\") => void;\n}) {\n return (\n <div className=\"flex rounded-md bg-card p-0.5\" aria-label=\"Usage scope\">\n {(\n [\n [\"me\", \"My usage\"],\n [\"workspace\", \"Workspace\"],\n ] as const\n ).map(([scope, label]) => (\n <Button\n key={scope}\n type=\"button\"\n variant={value === scope ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n aria-pressed={value === scope}\n onClick={() => onChange(scope)}\n >\n {label}\n </Button>\n ))}\n </div>\n );\n}\n\nfunction UserSelector({\n value,\n users,\n onChange,\n}: {\n value: string | null;\n users: UsageUserOption[];\n onChange: (value: string | null) => void;\n}) {\n return (\n <Select\n value={value ?? \"all\"}\n onValueChange={(nextValue) =>\n onChange(nextValue === \"all\" ? null : nextValue)\n }\n >\n <SelectTrigger\n size=\"sm\"\n className=\"w-[210px] text-xs\"\n aria-label=\"Filter usage by user\"\n >\n <SelectValue placeholder=\"All users\" />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n <SelectItem value=\"all\">All users</SelectItem>\n {users.map((user) => (\n <SelectItem key={user.email} value={user.email}>\n {user.email}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n );\n}\n\nfunction UsageTrend({\n rows,\n billing,\n}: {\n rows: DailyUsageMetric[];\n billing: UsageBillingMode;\n}) {\n const chartData = completeUsageTrendRows(rows).map((row) => ({\n ...row,\n spend: displayAmountFromCostCents(row.costCents, billing),\n }));\n\n return (\n <Panel\n title={\n billing.unit === \"builder-credits\"\n ? \"Credit usage trend\"\n : \"Usage trend\"\n }\n icon={<IconChartBar size={16} />}\n action={\n <div className=\"hidden items-center gap-3 text-[11px] text-muted-foreground sm:flex\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-[hsl(var(--dispatch-brand-blue))]\" />\n {billing.shortLabel}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full bg-muted-foreground\" />\n Calls\n </span>\n </div>\n }\n >\n {chartData.length === 0 ? (\n <div className=\"flex min-h-56 items-center justify-center rounded-md border border-dashed px-4 text-sm text-muted-foreground\">\n No usage in this window yet.\n </div>\n ) : (\n <ChartContainer\n config={{\n spend: {\n label: billing.shortLabel,\n color: \"hsl(var(--dispatch-brand-blue))\",\n },\n calls: {\n label: \"Calls\",\n color: \"hsl(var(--muted-foreground))\",\n },\n }}\n className=\"h-[280px] w-full aspect-auto\"\n >\n <AreaChart\n data={chartData}\n margin={{ top: 8, right: 8, left: 12, bottom: 0 }}\n >\n <defs>\n <linearGradient id=\"usage-trend-fill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor=\"var(--color-spend)\"\n stopOpacity={0.24}\n />\n <stop\n offset=\"100%\"\n stopColor=\"var(--color-spend)\"\n stopOpacity={0}\n />\n </linearGradient>\n </defs>\n <CartesianGrid\n vertical={false}\n stroke=\"hsl(var(--border))\"\n strokeDasharray=\"3 3\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n minTickGap={28}\n tickFormatter={formatTrendDate}\n />\n <YAxis\n yAxisId=\"spend\"\n stroke=\"hsl(var(--muted-foreground))\"\n fontSize={11}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n width={50}\n tickFormatter={(value) =>\n billing.unit === \"builder-credits\"\n ? formatCredits(Number(value))\n : formatSpend(Number(value), billing)\n }\n />\n <YAxis yAxisId=\"calls\" orientation=\"right\" hide />\n <ChartTooltip\n cursor={false}\n content={\n <ChartTooltipContent\n labelFormatter={(value) => formatTrendDate(String(value))}\n formatter={(value, name) => [\n name === \"spend\"\n ? billing.unit === \"builder-credits\"\n ? formatCredits(Number(value))\n : formatSpend(Number(value), billing)\n : `${formatNumber(Number(value))} calls`,\n name === \"spend\" ? billing.shortLabel : \"Calls\",\n ]}\n />\n }\n />\n <Area\n yAxisId=\"spend\"\n dataKey=\"spend\"\n type=\"monotone\"\n stroke=\"var(--color-spend)\"\n strokeWidth={2}\n fill=\"url(#usage-trend-fill)\"\n fillOpacity={1}\n dot={false}\n activeDot={{ r: 4, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n <Area\n yAxisId=\"calls\"\n dataKey=\"calls\"\n type=\"monotone\"\n stroke=\"var(--color-calls)\"\n strokeWidth={1.5}\n fill=\"none\"\n dot={false}\n activeDot={{ r: 3, strokeWidth: 2 }}\n isAnimationActive={false}\n />\n </AreaChart>\n </ChartContainer>\n )}\n </Panel>\n );\n}\n\nfunction ReviewUsageButton({\n metrics,\n billing,\n}: {\n metrics: DispatchUsageMetrics;\n billing: UsageBillingMode;\n}) {\n function reviewUsage() {\n const topApps = metrics.byApp\n .slice(0, 5)\n .map(\n (row) =>\n `${displayApp(row.key)}: ${formatSpend(row.costCents, billing)} / ${row.calls} calls`,\n )\n .join(\"; \");\n const topLabels = metrics.byLabel\n .slice(0, 5)\n .map(\n (row) =>\n `${row.label}: ${formatSpend(row.costCents, billing)} / ${row.calls} calls`,\n )\n .join(\"; \");\n const recentPrompts = metrics.recent\n .slice(0, 8)\n .map((row) => {\n const prompt = row.prompt\n ? row.prompt.slice(0, 180)\n : \"prompt not captured\";\n return `${timeAgo(row.createdAt)} | ${displayApp(row.app)} | ${row.label} | ${prompt}`;\n })\n .join(\"\\n\");\n\n sendToAgentChat({\n message:\n \"Review this LLM usage and explain where the spend is going. Identify repeated, background, or unexpectedly expensive work, cite the strongest evidence, and suggest concrete fixes. Call out missing attribution instead of guessing.\",\n context: [\n `Dispatch usage scope: ${metrics.viewScope === \"workspace\" ? \"workspace\" : \"my account\"}.`,\n `Lookback: ${metrics.sinceDays} days. Viewer: ${metrics.access.viewerEmail}.`,\n `Total: ${formatSpend(metrics.totals.costCents, billing)}, ${metrics.totals.calls} calls, ${metrics.totals.chatCalls} chat calls, ${formatTokens(metrics.totals.inputTokens + metrics.totals.outputTokens)} input/output tokens.`,\n `Top apps: ${topApps || \"none\"}.`,\n `Top work types: ${topLabels || \"none\"}.`,\n `Recent prompt evidence (bounded to the latest 8 rows):\\n${recentPrompts || \"none\"}`,\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n chatTarget: \"local\",\n });\n }\n\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={reviewUsage}>\n Ask agent\n </Button>\n );\n}\n\nfunction AppSpendRows({\n rows,\n billing,\n}: {\n rows: UsageMetricBucket[];\n billing: UsageBillingMode;\n}) {\n const max = maxSpend(rows, billing);\n if (rows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No LLM usage recorded for this window.\n </div>\n );\n }\n return (\n <div className=\"space-y-3\">\n {rows.map((row) => (\n <div key={row.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3 text-sm\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">\n {displayApp(row.key)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatNumber(row.chatCalls)} chats ·{\" \"}\n {formatNumber(row.activeUsers)} users\n </div>\n </div>\n <div className=\"shrink-0 text-right\">\n <div className=\"font-medium tabular-nums text-foreground\">\n {formatSpend(row.costCents, billing)}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatNumber(row.calls)} calls\n </div>\n </div>\n </div>\n <div className=\"h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-foreground\"\n style={{\n width: barWidth(\n displayAmountFromCostCents(row.costCents, billing),\n max,\n ),\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction AppAdoptionPanel({\n rows,\n selectedAppId,\n scope,\n backScope,\n}: {\n rows: AppAccessMetric[];\n selectedAppId: string | null;\n scope: \"me\" | \"workspace\" | \"app\";\n backScope: \"me\" | \"workspace\";\n}) {\n const t = useT();\n const visibleRows = rows\n .filter((row) => !row.isDispatch)\n .sort(\n (a, b) =>\n b.usageCalls - a.usageCalls ||\n b.usersWithUsage - a.usersWithUsage ||\n (b.lastActiveAt ?? 0) - (a.lastActiveAt ?? 0) ||\n a.name.localeCompare(b.name),\n );\n const [showAll, setShowAll] = useState(false);\n const selectedRow = selectedAppId\n ? visibleRows.find((row) => row.id === selectedAppId)\n : null;\n const isDetail = !!selectedRow;\n const actionMetrics = selectedRow?.actionMetrics ?? [];\n const rowsToRender = showAll ? visibleRows : visibleRows.slice(0, 9);\n const detailStats = [\n [t(\"dispatch.pages.dailyActiveUsers\"), selectedRow?.dailyActiveUsers],\n [t(\"dispatch.pages.weeklyActiveUsers\"), selectedRow?.weeklyActiveUsers],\n [t(\"dispatch.pages.trackedActions\"), selectedRow?.usageCalls],\n ] satisfies Array<[string, number | null | undefined]>;\n const title = isDetail\n ? t(\"dispatch.pages.appAdoptionFor\", { name: selectedRow.name })\n : scope === \"workspace\"\n ? t(\"dispatch.pages.appAdoption\")\n : t(\"dispatch.pages.yourAppActivity\");\n const backHref =\n backScope === \"workspace\"\n ? \"/admin/metrics?scope=workspace&view=adoption\"\n : \"/admin/metrics?view=adoption\";\n\n if (visibleRows.length === 0) {\n return (\n <Panel title={title} icon={<IconApps size={16} />}>\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noWorkspaceApps\")}\n </div>\n </Panel>\n );\n }\n\n return (\n <Panel\n title={title}\n icon={<IconChartBar size={16} />}\n action={\n isDetail ? (\n <Link\n to={backHref}\n className=\"text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n {t(\"allApps\")}\n </Link>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.appAdoptionDefinition\")}\n </span>\n )\n }\n >\n {isDetail ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {selectedRow.name}\n </div>\n <div className=\"font-mono text-xs text-muted-foreground\">\n {selectedRow.path}\n </div>\n </div>\n <Badge variant=\"secondary\">\n {selectedRow.ownerEmail\n ? selectedRow.isOwnedByViewer\n ? t(\"dispatch.pages.appMetadataOwner\")\n : selectedRow.ownerEmail\n : t(\"dispatch.pages.ownerUnavailable\")}\n </Badge>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-3\">\n {detailStats.map(([label, value]) => (\n <div\n key={String(label)}\n className=\"rounded-md border bg-background p-3\"\n >\n <div className=\"text-xs text-muted-foreground\">{label}</div>\n <div className=\"mt-1 text-2xl font-semibold tabular-nums text-foreground\">\n {formatNumber(value)}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"border-t pt-4\">\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.pages.trackedActionBreakdown\")}\n </div>\n {actionMetrics.length === 0 ? (\n <div className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.noTrackedActions\")}\n </div>\n ) : (\n <div className=\"divide-y rounded-md border\">\n {actionMetrics.slice(0, 10).map((action) => (\n <div\n key={action.key}\n className=\"flex items-center justify-between gap-3 px-3 py-2.5 text-xs\"\n >\n <span className=\"min-w-0 truncate font-medium text-foreground\">\n {action.label}\n </span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {formatNumber(action.calls)}{\" \"}\n {t(\"dispatch.pages.trackedActions\")} ·{\" \"}\n {formatNumber(action.activeUsers)}{\" \"}\n {t(\"dispatch.pages.activeUsers\")}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n ) : (\n <>\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-3\">\n {rowsToRender.map((row) => (\n <div key={row.id} className=\"rounded-md border bg-background p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {row.name}\n </div>\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {row.path}\n </div>\n </div>\n {row.isOwnedByViewer ? (\n <Badge variant=\"secondary\">\n {t(\"dispatch.pages.appMetadataOwner\")}\n </Badge>\n ) : null}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n <div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.dailyActiveUsers\")}\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {formatNumber(row.dailyActiveUsers)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-muted-foreground\">\n {t(\"dispatch.pages.weeklyActiveUsers\")}\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {formatNumber(row.weeklyActiveUsers)}\n </div>\n </div>\n </div>\n <div className=\"mt-3 text-xs text-muted-foreground\">\n {formatNumber(row.usageCalls)}{\" \"}\n {t(\"dispatch.pages.trackedActions\")}\n </div>\n {row.canViewUsage ? (\n <Link\n to={`/admin/metrics?app=${encodeURIComponent(row.id)}${scope === \"workspace\" ? \"&scope=workspace\" : \"\"}&view=adoption`}\n className=\"mt-3 inline-flex items-center gap-1 text-xs font-medium text-foreground hover:underline\"\n >\n {t(\"dispatch.pages.viewAppMetrics\")}\n <IconArrowUpRight size={13} />\n </Link>\n ) : null}\n </div>\n ))}\n </div>\n {visibleRows.length > 9 ? (\n <div className=\"mt-4 flex justify-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowAll((current) => !current)}\n >\n {showAll\n ? t(\"jobs.scheduleUnavailableFixLabelOpen\")\n : t(\"jobs.scheduleUnavailableFixLabel\")}\n </Button>\n </div>\n ) : null}\n </>\n )}\n </Panel>\n );\n}\n\nfunction AppAccessTable({\n rows,\n billing,\n}: {\n rows: AppAccessMetric[];\n billing: UsageBillingMode;\n}) {\n const visibleRows = rows.filter((row) => !row.isDispatch);\n if (visibleRows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No workspace apps discovered yet.\n </div>\n );\n }\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] text-left text-xs\">\n <thead>\n <tr className=\"border-b text-muted-foreground\">\n <th className=\"px-2 py-2 font-medium\">App</th>\n <th className=\"px-2 py-2 font-medium\">Access</th>\n <th className=\"px-2 py-2 text-right font-medium\">Users</th>\n <th className=\"px-2 py-2 text-right font-medium\">Chats</th>\n <th className=\"px-2 py-2 text-right font-medium\">\n {billing.shortLabel}\n </th>\n <th className=\"px-2 py-2 text-right font-medium\">Last activity</th>\n </tr>\n </thead>\n <tbody>\n {visibleRows.map((row) => (\n <tr key={row.id} className=\"border-b last:border-0\">\n <td className=\"px-2 py-3\">\n <div className=\"font-medium text-foreground\">{row.name}</div>\n <div className=\"font-mono text-[11px] text-muted-foreground\">\n {row.path}\n </div>\n </td>\n <td className=\"px-2 py-3\">\n <Badge\n variant=\"outline\"\n className={cn(\n row.status === \"pending\" &&\n \"border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\",\n )}\n >\n {row.status === \"pending\"\n ? row.statusLabel || \"Builder branch\"\n : row.accessLabel}\n </Badge>\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.usersWithUsage)} /{\" \"}\n {formatNumber(row.accessUsers)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatCalls)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatSpend(row.costCents, billing)}\n </td>\n <td className=\"px-2 py-3 text-right text-muted-foreground\">\n {timeAgo(row.lastActiveAt)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction UserTable({\n rows,\n billing,\n}: {\n rows: UserUsageMetric[];\n billing: UsageBillingMode;\n}) {\n if (rows.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-sm text-muted-foreground\">\n No users have triggered LLM usage in this window.\n </div>\n );\n }\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] text-left text-xs\">\n <thead>\n <tr className=\"border-b text-muted-foreground\">\n <th className=\"px-2 py-2 font-medium\">User</th>\n <th className=\"px-2 py-2 font-medium\">Role</th>\n <th className=\"px-2 py-2 font-medium\">Top app</th>\n <th className=\"px-2 py-2 text-right font-medium\">Chats</th>\n <th className=\"px-2 py-2 text-right font-medium\">Threads</th>\n <th className=\"px-2 py-2 text-right font-medium\">Tokens</th>\n <th className=\"px-2 py-2 text-right font-medium\">\n {billing.shortLabel}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, 12).map((row) => (\n <tr key={row.ownerEmail} className=\"border-b last:border-0\">\n <td className=\"max-w-64 px-2 py-3\">\n <div className=\"truncate font-medium text-foreground\">\n {row.ownerEmail}\n </div>\n <div className=\"text-muted-foreground\">\n {timeAgo(row.lastActiveAt ?? row.lastChatAt)}\n </div>\n </td>\n <td className=\"px-2 py-3\">\n <Badge variant=\"secondary\">{row.role ?? \"user\"}</Badge>\n </td>\n <td className=\"px-2 py-3 text-muted-foreground\">\n {displayApp(row.topApp)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatCalls)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatNumber(row.chatThreads)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatTokens(row.inputTokens + row.outputTokens)}\n </td>\n <td className=\"px-2 py-3 text-right tabular-nums\">\n {formatSpend(row.costCents, billing)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction CompactBreakdown({\n rows,\n empty,\n billing,\n}: {\n rows: UsageMetricBucket[];\n empty: string;\n billing: UsageBillingMode;\n}) {\n const max = maxSpend(rows, billing);\n if (rows.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">{empty}</div>;\n }\n return (\n <div className=\"space-y-3\">\n {rows.slice(0, 6).map((row) => (\n <div key={row.key} className=\"space-y-1\">\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <span className=\"truncate font-medium text-foreground\">\n {row.label}\n </span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {formatSpend(row.costCents, billing)}\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-muted-foreground\"\n style={{\n width: barWidth(\n displayAmountFromCostCents(row.costCents, billing),\n max,\n ),\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default function MetricsRoute() {\n const t = useT();\n const [sinceDays, setSinceDays] = useState(30);\n const [searchParams, setSearchParams] = useSearchParams();\n const view = selectedMetricsView(searchParams.get(\"view\"));\n const appId = searchParams.get(\"app\") || null;\n const backScope: \"me\" | \"workspace\" =\n searchParams.get(\"scope\") === \"workspace\" ? \"workspace\" : \"me\";\n const scope: \"me\" | \"workspace\" | \"app\" = appId\n ? \"app\"\n : searchParams.get(\"scope\") === \"workspace\"\n ? \"workspace\"\n : \"me\";\n const userEmail =\n scope === \"workspace\" ? searchParams.get(\"user\") || null : null;\n\n function setScope(nextScope: \"me\" | \"workspace\") {\n const next = new URLSearchParams(searchParams);\n next.delete(\"app\");\n if (nextScope === \"me\") next.delete(\"scope\");\n else next.set(\"scope\", nextScope);\n if (nextScope === \"me\") next.delete(\"user\");\n setSearchParams(next, { replace: true });\n }\n\n function setUserEmail(nextUserEmail: string | null) {\n const next = new URLSearchParams(searchParams);\n if (nextUserEmail) next.set(\"user\", nextUserEmail);\n else next.delete(\"user\");\n setSearchParams(next, { replace: true });\n }\n\n function setView(nextView: MetricsView) {\n const next = new URLSearchParams(searchParams);\n if (nextView === \"overview\") next.delete(\"view\");\n else next.set(\"view\", nextView);\n setSearchParams(next, { replace: true });\n }\n\n const { data, isLoading, error } = useActionQuery(\n \"list-dispatch-usage-metrics\",\n {\n sinceDays,\n scope,\n userEmail: userEmail ?? undefined,\n appId: appId ?? undefined,\n },\n );\n const metrics = data as DispatchUsageMetrics | undefined;\n const selectedAppName = metrics?.selectedAppId\n ? metrics.appAccess.find((row) => row.id === metrics.selectedAppId)?.name\n : null;\n const billing = metrics?.billing ?? USD_BILLING;\n const totalTokens = useMemo(() => {\n if (!metrics) return 0;\n return (\n metrics.totals.inputTokens +\n metrics.totals.outputTokens +\n metrics.totals.cacheReadTokens +\n metrics.totals.cacheWriteTokens\n );\n }, [metrics]);\n\n return (\n <DispatchShell\n title={t(\"dispatch.nav.metrics\")}\n description={\n billing.unit === \"builder-credits\"\n ? t(\"dispatch.pages.metricsDescriptionBuilder\")\n : t(\"dispatch.pages.metricsDescriptionLlm\")\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {scope === \"app\"\n ? t(\"dispatch.pages.appAdoption\")\n : metrics?.selectedUserEmail\n ? `${metrics.selectedUserEmail}'s usage`\n : scope === \"workspace\"\n ? \"Workspace usage\"\n : \"Your usage\"}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {scope === \"app\"\n ? selectedAppName || t(\"dispatch.pages.workspaceAppFallback\")\n : metrics?.selectedUserEmail\n ? \"Filtered to this workspace member\"\n : scope === \"workspace\"\n ? `${metrics?.access.totalUsers ?? 0} users with access`\n : metrics?.access.viewerEmail || \"Signed-in account\"}\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {appId ? (\n <Link\n to={\n backScope === \"workspace\"\n ? \"/admin/metrics?scope=workspace&view=adoption\"\n : \"/admin/metrics?view=adoption\"\n }\n className=\"inline-flex h-7 items-center rounded-md border px-3 text-xs font-medium text-foreground hover:bg-muted\"\n >\n {t(\"allApps\")}\n </Link>\n ) : (\n <ScopeSelector\n value={scope === \"workspace\" ? \"workspace\" : \"me\"}\n onChange={setScope}\n />\n )}\n {scope === \"workspace\" && metrics ? (\n <UserSelector\n value={metrics.selectedUserEmail ?? userEmail}\n users={metrics.availableUsers ?? []}\n onChange={setUserEmail}\n />\n ) : null}\n <RangeSelector value={sinceDays} onChange={setSinceDays} />\n </div>\n </div>\n\n {error ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"h-4 w-4\" />\n <AlertTitle>{t(\"dispatch.pages.metricsUnavailable\")}</AlertTitle>\n <AlertDescription>\n {error instanceof Error\n ? error.message\n : t(\"dispatch.pages.unableToLoadUsage\")}\n </AlertDescription>\n </Alert>\n ) : null}\n\n {isLoading && !metrics ? <LoadingMetrics /> : null}\n\n {metrics ? (\n <Tabs\n value={view}\n onValueChange={(value) => {\n if (\n value === \"overview\" ||\n value === \"adoption\" ||\n value === \"details\"\n ) {\n setView(value);\n }\n }}\n className=\"flex min-w-0 flex-col gap-5\"\n >\n <TabsList className=\"w-fit\">\n <TabsTrigger value=\"overview\">\n <IconActivity size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.overview\")}\n </TabsTrigger>\n <TabsTrigger value=\"adoption\">\n <IconApps size={15} className=\"mr-1.5\" />\n {t(\"dispatch.pages.appAdoption\")}\n </TabsTrigger>\n <TabsTrigger value=\"details\">\n <IconChartBar size={15} className=\"mr-1.5\" />\n {t(\"details\")}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"mt-0 min-w-0 space-y-4\">\n {metrics.dailyAvailable === false ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"h-4 w-4\" />\n <AlertTitle>\n {t(\"dispatch.pages.metricsUnavailable\")}\n </AlertTitle>\n <AlertDescription>\n {t(\"dispatch.pages.unableToLoadUsage\")}\n </AlertDescription>\n </Alert>\n ) : null}\n <UsageTrend rows={metrics.daily} billing={billing} />\n <UserActivityTrend rows={metrics.daily} />\n\n <div className=\"flex items-center justify-between gap-3 border-y py-3\">\n <span className=\"text-sm text-muted-foreground\">\n Review this usage with the agent\n </span>\n <ReviewUsageButton metrics={metrics} billing={billing} />\n </div>\n\n {scope !== \"app\" ? (\n <UsageAlertsPanel\n scope={scope === \"workspace\" ? \"workspace\" : \"user\"}\n appOptions={metrics.byApp\n .filter((row) => row.key && row.key !== \"unattributed\")\n .map((row) => ({\n id: row.key,\n label: displayApp(row.key),\n }))}\n />\n ) : null}\n\n <div className=\"grid gap-3 md:grid-cols-2 xl:grid-cols-5\">\n <MetricCard\n label={billing.label}\n value={formatSpend(metrics.totals.costCents, billing)}\n detail={`${formatTokens(totalTokens)} total tokens`}\n icon={<IconCoin size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.llmCalls\")}\n value={formatNumber(metrics.totals.calls)}\n detail={`${formatNumber(metrics.totals.chatCalls)} chat turns`}\n icon={<IconActivity size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.activeUsers\")}\n value={formatNumber(metrics.totals.activeUsers)}\n detail={`${formatNumber(metrics.access.totalUsers)} users with access`}\n icon={<IconUsersGroup size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.workspaceAppsStat\")}\n value={formatNumber(metrics.totals.workspaceApps)}\n detail={`${formatNumber(metrics.byApp.length)} with usage`}\n icon={<IconApps size={17} />}\n />\n <MetricCard\n label={t(\"dispatch.pages.chatThreads\")}\n value={formatNumber(metrics.totals.chatThreads)}\n detail={`${formatNumber(metrics.totals.chatMessages)} messages`}\n icon={<IconMessages size={17} />}\n />\n </div>\n </TabsContent>\n\n <TabsContent value=\"adoption\" className=\"mt-0 min-w-0\">\n <AppAdoptionPanel\n rows={metrics.appAccess}\n selectedAppId={metrics.selectedAppId ?? appId}\n scope={scope}\n backScope={backScope}\n />\n </TabsContent>\n\n <TabsContent value=\"details\" className=\"mt-0 min-w-0 space-y-4\">\n <Panel\n title={\n billing.unit === \"builder-credits\"\n ? \"Credit spend by app\"\n : \"Spend by app\"\n }\n icon={<IconApps size={16} />}\n >\n <AppSpendRows rows={metrics.byApp} billing={billing} />\n </Panel>\n\n <Panel title=\"Access By App\" icon={<IconApps size={16} />}>\n <AppAccessTable rows={metrics.appAccess} billing={billing} />\n </Panel>\n\n {scope !== \"app\" ? (\n <Panel title=\"Users\" icon={<IconUsersGroup size={16} />}>\n <UserTable rows={metrics.byUser} billing={billing} />\n </Panel>\n ) : null}\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Panel title=\"Models\" icon={<IconChartBar size={16} />}>\n <CompactBreakdown\n rows={metrics.byModel}\n empty=\"No model usage in this window.\"\n billing={billing}\n />\n </Panel>\n <Panel title=\"Work Types\" icon={<IconActivity size={16} />}>\n <CompactBreakdown\n rows={metrics.byLabel}\n empty=\"No labeled usage in this window.\"\n billing={billing}\n />\n </Panel>\n </div>\n </TabsContent>\n </Tabs>\n ) : null}\n </div>\n </DispatchShell>\n );\n}\n"]}
@@ -1,5 +1,14 @@
1
1
  export declare function meta(): {
2
2
  title: string;
3
3
  }[];
4
+ export interface DispatchSettingsPageProps {
5
+ /** Raw CHANGELOG.md behind What's new. */
6
+ changelog: string;
7
+ }
8
+ /**
9
+ * Dispatch's Settings. The template route renders it with the app's own
10
+ * changelog; `dispatchRoutes` consumers get the default export.
11
+ */
12
+ export declare function DispatchSettingsPage({ changelog }: DispatchSettingsPageProps): import("node_modules/@types/react").JSX.Element;
4
13
  export default function SettingsRoute(): import("node_modules/@types/react").JSX.Element;
5
14
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,oDAiKpC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"AAkDA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE,yBAAyB,mDA4L5E;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,oDAEpC"}
@@ -1,31 +1,51 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { CHAT_FIRST_MODE_CHANGED_EVENT, readChatFirstModeState, writeChatFirstMode, } from "@agent-native/core/client/agent-chat";
3
3
  import { ChangelogSettingsCard } from "@agent-native/core/client/changelog";
4
+ import { useFeatureFlag, useFeatureFlagState, } from "@agent-native/core/client/feature-flags";
4
5
  import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
5
- import { TeamPage } from "@agent-native/core/client/org";
6
- import { SettingsTabsPage, useAgentSettingsTabs, } from "@agent-native/core/client/settings";
6
+ import { OrgMembersPage, TeamPage } from "@agent-native/core/client/org";
7
+ import { AccountSettingsCard, CORE_SETTINGS_PAGES, registerSettingsPages, SettingsGroup, SettingsRow, SettingsTabsPage, useAgentSettingsTabs, } from "@agent-native/core/client/settings";
8
+ import { SETTINGS_REDESIGN_FLAG } from "@agent-native/core/feature-flags/registry";
7
9
  import { IconShield } from "@tabler/icons-react";
8
- import { useState } from "react";
10
+ import { useMemo, useState } from "react";
9
11
  import { Link } from "react-router";
10
- import changelog from "../../../CHANGELOG.md?raw";
11
- import { DispatchShell } from "../../components/dispatch-shell.js";
12
+ import packageChangelog from "../../../CHANGELOG.md?raw";
12
13
  import { Button } from "../../components/ui/button.js";
13
- import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "../../components/ui/card.js";
14
- import { Label } from "../../components/ui/label.js";
15
14
  import { Switch } from "../../components/ui/switch.js";
16
15
  import { dispatchAccessDescriptor } from "../../shared/app-roles.js";
16
+ import { DISPATCH_CONNECT_APPS_FLAG } from "../../shared/feature-flags.js";
17
+ const coreMembersPage = CORE_SETTINGS_PAGES.find((page) => page.id === "members");
18
+ if (!coreMembersPage) {
19
+ throw new Error("Core Settings has no members page for Dispatch app roles");
20
+ }
21
+ function DispatchMembersSettingsPage() {
22
+ return _jsx(OrgMembersPage, { appRoles: dispatchAccessDescriptor });
23
+ }
24
+ // The redesigned Settings shows Members from core; Dispatch's replaces it so
25
+ // the app-role column stays.
26
+ registerSettingsPages([
27
+ { ...coreMembersPage, component: DispatchMembersSettingsPage },
28
+ ]);
17
29
  export function meta() {
18
30
  return [{ title: "Settings - Dispatch" }];
19
31
  }
20
- export default function SettingsRoute() {
32
+ /**
33
+ * Dispatch's Settings. The template route renders it with the app's own
34
+ * changelog; `dispatchRoutes` consumers get the default export.
35
+ */
36
+ export function DispatchSettingsPage({ changelog }) {
21
37
  const t = useT();
38
+ const connectAppsEnabled = useFeatureFlag(DISPATCH_CONNECT_APPS_FLAG.key);
39
+ // Core Preferences owns the interface language in the redesigned Settings,
40
+ // whose Dispatch General page shows `generalGroups` instead of `general`.
41
+ const redesign = useFeatureFlagState(SETTINGS_REDESIGN_FLAG.key).enabled;
22
42
  const agentSettingsTabs = useAgentSettingsTabs({
23
43
  usageAppId: "dispatch",
24
44
  usageViewAllHref: "/admin/metrics",
25
45
  organizationContent: (_jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(TeamPage, { showTitle: false, appRoles: dispatchAccessDescriptor, createOrgDescription: "Set up a team to share dispatch destinations and approvals with your colleagues." }) })),
26
46
  });
27
47
  const settingsTabs = [
28
- ...agentSettingsTabs.filter((tab) => tab.id !== "integrations"),
48
+ ...agentSettingsTabs,
29
49
  {
30
50
  id: "admin",
31
51
  label: t("dispatch.nav.admin", { defaultValue: "Admin" }),
@@ -38,12 +58,12 @@ export default function SettingsRoute() {
38
58
  const [chatFirstModeState] = useState(() => readChatFirstModeState());
39
59
  const [chatFirstMode, setChatFirstMode] = useState(() => chatFirstModeState.enabled);
40
60
  const [chatFirstStorageNotice, setChatFirstStorageNotice] = useState(chatFirstModeState.availability === "unavailable"
41
- ? "This browser is not allowing local preferences, so Chat-first mode cannot be persisted."
61
+ ? t("settings.chatFirstStorageUnavailable")
42
62
  : null);
43
63
  function updateChatFirstMode(enabled) {
44
64
  const result = writeChatFirstMode(enabled);
45
65
  if (!result.ok) {
46
- setChatFirstStorageNotice("This browser blocked local preferences, so Chat-first mode was not changed.");
66
+ setChatFirstStorageNotice(t("settings.chatFirstStorageBlocked"));
47
67
  return;
48
68
  }
49
69
  setChatFirstStorageNotice(null);
@@ -52,6 +72,39 @@ export default function SettingsRoute() {
52
72
  detail: { enabled },
53
73
  }));
54
74
  }
55
- return (_jsx(DispatchShell, { title: t("settings.title"), description: t("settings.description"), children: _jsx(SettingsTabsPage, { extraTabs: settingsTabs, general: _jsxs("div", { className: "mx-auto w-full max-w-3xl space-y-6", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.languageTitle") }), _jsx(CardDescription, { children: t("settings.languageDescription") })] }), _jsxs(CardContent, { className: "max-w-xs space-y-1.5", children: [_jsx(Label, { children: t("settings.languageLabel") }), _jsx(LanguagePicker, { label: t("settings.languageLabel") })] })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: "Chat-first workspace" }), _jsx(CardDescription, { children: "Keep chats at the center and open workspace apps in a contextual pane beside them." })] }), _jsxs(CardContent, { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "dispatch-chat-first-mode", children: "Use chat-first navigation" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "This preference only changes your local Dispatch shell." }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Session watch and follow-up messaging work in this browser pane too. Local CLI subscription detection stays in the Electron app; Dispatch uses workspace/provider credentials." })] }), _jsx(Switch, { id: "dispatch-chat-first-mode", checked: chatFirstMode, onCheckedChange: updateChatFirstMode })] }), chatFirstStorageNotice ? (_jsx("p", { className: "px-6 pb-4 text-sm text-destructive", role: "alert", children: chatFirstStorageNotice })) : null] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.workspaceTitle") }), _jsx(CardDescription, { children: t("settings.workspaceDescription") })] }), _jsx(CardContent, { children: _jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/admin/workspace", children: t("settings.openResourceSettings") }) }) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: t("settings.deliveryTitle") }), _jsx(CardDescription, { children: t("settings.deliveryDescription") })] }), _jsx(CardContent, { children: _jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/admin/destinations", children: t("settings.openDelivery") }) }) })] })] }), whatsNew: _jsx("div", { className: "mx-auto w-full max-w-3xl", children: _jsx(ChangelogSettingsCard, { markdown: changelog }) }) }) }));
75
+ const generalSearchEntries = useMemo(() => [
76
+ ...(redesign
77
+ ? []
78
+ : [
79
+ {
80
+ id: "dispatch-language",
81
+ label: t("settings.languageTitle"),
82
+ keywords: "language locale translation i18n",
83
+ hash: "language",
84
+ },
85
+ ]),
86
+ {
87
+ id: "dispatch-workspace",
88
+ label: redesign
89
+ ? t("settings.resourcesTitle")
90
+ : t("settings.workspaceTitle"),
91
+ keywords: "workspace resources integrations vault destinations",
92
+ hash: "workspace-resources",
93
+ },
94
+ {
95
+ id: "dispatch-chat-first",
96
+ label: t("settings.chatFirstTitle"),
97
+ keywords: "chat first codex t3 apps pane navigation",
98
+ hash: "chat-first",
99
+ },
100
+ ], [redesign, t]);
101
+ const chatFirstSwitch = (_jsx(Switch, { "aria-label": t("settings.chatFirstAriaLabel"), checked: chatFirstMode, onCheckedChange: updateChatFirstMode }));
102
+ const chatFirstStorageAlert = chatFirstStorageNotice ? (_jsx("p", { className: "text-sm text-destructive", role: "alert", children: chatFirstStorageNotice })) : null;
103
+ const connectAppsRow = connectAppsEnabled ? (_jsx(SettingsRow, { id: "connect-apps", label: t("settings.connectApps"), description: t("settings.connectAppsDescription"), control: _jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/connect", children: t("settings.openConnectApps") }) }) })) : null;
104
+ const resourceSettingsButton = (_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { to: "/workspace", children: t("settings.openResourceSettings") }) }));
105
+ return (_jsx(SettingsTabsPage, { account: _jsx(AccountSettingsCard, {}), extraTabs: settingsTabs, generalSearchEntries: generalSearchEntries, general: _jsxs("div", { className: "mx-auto w-full max-w-2xl space-y-6", children: [_jsx("p", { className: "text-sm leading-6 text-muted-foreground", children: t("settings.description") }), _jsxs(SettingsGroup, { children: [_jsx(SettingsRow, { id: "language", label: t("settings.languageTitle"), description: t("settings.languageDescription"), control: _jsx("div", { className: "w-56", children: _jsx(LanguagePicker, { label: t("settings.languageLabel") }) }) }), _jsx(SettingsRow, { id: "workspace-resources", label: t("settings.workspaceTitle"), description: t("settings.workspaceDescription"), control: resourceSettingsButton }), connectAppsRow] }), _jsx(SettingsGroup, { id: "chat-first", children: _jsxs(SettingsRow, { label: t("settings.chatFirstTitle"), description: t("settings.chatFirstDescription"), control: chatFirstSwitch, children: [_jsx("p", { className: "text-sm leading-6 text-muted-foreground", children: t("settings.chatFirstSessionWatchDescription") }), chatFirstStorageAlert] }) })] }), generalGroups: _jsxs(SettingsGroup, { id: "workspace", title: t("settings.workspaceTitle"), children: [_jsx(SettingsRow, { id: "chat-first", label: t("settings.chatFirstTitle"), description: t("settings.chatFirstDescription"), control: chatFirstSwitch, children: chatFirstStorageAlert }), _jsx(SettingsRow, { id: "workspace-resources", label: t("settings.resourcesTitle"), description: t("settings.workspaceDescription"), control: resourceSettingsButton }), connectAppsRow] }), whatsNew: _jsx("div", { className: "mx-auto w-full max-w-2xl", children: _jsx(ChangelogSettingsCard, { markdown: changelog }) }) }));
106
+ }
107
+ export default function SettingsRoute() {
108
+ return _jsx(DispatchSettingsPage, { changelog: packageChangelog });
56
109
  }
57
110
  //# sourceMappingURL=settings.js.map