--- phase: 03-operator-experience plan: 04 type: execute wave: 2 depends_on: ["03-01"] files_modified: - packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx - packages/portal/components/usage-chart.tsx - packages/portal/components/provider-cost-chart.tsx - packages/portal/components/budget-alert-badge.tsx - packages/portal/components/message-volume-chart.tsx - packages/portal/lib/queries.ts autonomous: false requirements: - AGNT-07 - PRTA-06 must_haves: truths: - "Operator can see token usage per agent in a chart" - "Operator can see cost breakdown by LLM provider" - "Operator can see message volume per channel" - "Operator can filter usage data by time range" - "Budget alerts are visible when an agent approaches or exceeds its budget limit" - "Dashboard answers 'how much is this employee costing me?' at a glance" artifacts: - path: "packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx" provides: "Cost tracking and usage metrics dashboard page" - path: "packages/portal/components/usage-chart.tsx" provides: "Bar chart of token usage per agent (Recharts)" - path: "packages/portal/components/provider-cost-chart.tsx" provides: "Pie or bar chart of cost breakdown by LLM provider (Recharts)" - path: "packages/portal/components/budget-alert-badge.tsx" provides: "Colored badge showing budget status (ok/warning/exceeded)" - path: "packages/portal/components/message-volume-chart.tsx" provides: "Bar chart of message volume per channel (Recharts)" key_links: - from: "packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx" to: "/api/portal/usage/{tenantId}/summary" via: "TanStack Query hook fetching usage data" pattern: "usage.*summary" - from: "packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx" to: "/api/portal/usage/{tenantId}/budget-alerts" via: "TanStack Query hook fetching budget alert statuses" pattern: "usage.*budget-alerts" - from: "packages/portal/components/usage-chart.tsx" to: "recharts" via: "BarChart, ResponsiveContainer components" pattern: "import.*recharts" --- Cost tracking dashboard with per-agent token usage, provider cost breakdown, message volume, time range filtering, and budget alert indicators. Purpose: Operators can see "how much is this employee costing me?" at a glance -- like a payroll view. Budget alerts warn when agents approach or exceed their configured limits. Output: Usage dashboard page with Recharts visualizations, budget alert badges, and time range selector. @/home/adelorenzo/.claude/get-shit-done/workflows/execute-plan.md @/home/adelorenzo/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/03-operator-experience/03-CONTEXT.md @.planning/phases/03-operator-experience/03-RESEARCH.md @.planning/phases/03-operator-experience/03-01-SUMMARY.md From packages/shared/shared/api/usage.py (created in Plan 01): ```python # GET /api/portal/usage/{tenant_id}/summary?start_date={}&end_date={} # Returns: [{ agent_id, agent_name, prompt_tokens, completion_tokens, total_tokens, cost_usd, llm_call_count }] # GET /api/portal/usage/{tenant_id}/by-provider?start_date={}&end_date={} # Returns: [{ provider, cost_usd, call_count }] # GET /api/portal/usage/{tenant_id}/message-volume?start_date={}&end_date={} # Returns: [{ channel, message_count }] # GET /api/portal/usage/{tenant_id}/budget-alerts # Returns: [{ agent_id, agent_name, budget_limit_usd, current_cost_usd, status: "ok"|"warning"|"exceeded" }] ``` Established portal patterns: - shadcn/ui components (Card, Badge, Select) - TanStack Query for data fetching - Recharts installed in Plan 01 (npm install recharts) Task 1: Cost dashboard page with Recharts visualizations and budget alerts packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx, packages/portal/components/usage-chart.tsx, packages/portal/components/provider-cost-chart.tsx, packages/portal/components/message-volume-chart.tsx, packages/portal/components/budget-alert-badge.tsx, packages/portal/lib/queries.ts 1. Create `packages/portal/components/budget-alert-badge.tsx`: - Colored badge based on status: - "ok" -> green (or no badge if usage is low) - "warning" -> amber with "80%+ budget used" text - "exceeded" -> red with "Budget exceeded" text - Null budget_limit_usd -> gray "No limit set" text (not a warning) - Uses shadcn/ui Badge 2. Create `packages/portal/components/usage-chart.tsx`: - Recharts BarChart showing total_tokens per agent - ResponsiveContainer for adaptive sizing - XAxis: agent name, YAxis: token count - Tooltip showing prompt_tokens, completion_tokens, total_tokens, cost_usd - Color: indigo-500 (#6366f1) for consistency - Handles empty state: "No usage data for this period" message 3. Create `packages/portal/components/provider-cost-chart.tsx`: - Recharts BarChart (horizontal) showing cost_usd per provider - Each provider gets a distinct color (openai=green, anthropic=orange, ollama=blue) - Tooltip: provider name, cost, call count - Handles empty state 4. Create `packages/portal/components/message-volume-chart.tsx`: - Recharts BarChart showing message_count per channel (slack, whatsapp) - Channel-specific colors (slack=purple, whatsapp=green) - Handles empty state 5. Create `packages/portal/app/(dashboard)/usage/[tenantId]/page.tsx`: - Time range selector at top: simple