## 1. Nav Button - [ ] 1.1 Add "Token Analytics" button in `apps/web/src/components/ProjectSidebar.tsx` above the Settings button, using `BarChart3` icon from lucide-react, linking to `/analytics` - [ ] 1.2 Add active route background styling matching the Settings button pattern - [ ] 1.2 On mobile, close the sidebar drawer after navigation (same as Settings button behavior) ## 2. API Layer - [ ] 2.1 Verify existing `GET /api/tools/cost_stats` endpoint returns adequate data for the per-tool breakdown section - [ ] 2.2 Verify `GET /api/coder/sessions/:id/agent-sessions` returns `input_tokens`/`output_tokens`/`cost` fields - [ ] 2.3 Add `GET /api/coder/analytics/summary` endpoint returning aggregate totals (total_input, total_output, total_cost, session_count) OR plan to aggregate on the client side from session list data - [ ] 2.4 Add new API client methods in `apps/web/src/api/client.ts` for any new endpoints ## 3. Token Analytics Page - [ ] 3.1 Create `apps/web/src/pages/Analytics.tsx` with summary cards section (total input/output tokens, total cost, sessions tracked) fetching from API - [ ] 3.2 Add per-session token breakdown table reusing `AgentSessionInfo` type, with columns: session, agent, input tokens, output tokens, cost - [ ] 3.3 Add per-tool cost breakdown table section reusing `ToolCostStat` type from `/api/tools/cost_stats` - [ ] 3.4 Add token category breakdown section using CSS stacked bar for `token_breakdown` data where available - [ ] 3.5 Add loading skeleton states and error handling with retry for each section independently - [ ] 3.6 Add empty states for each section when data is not available ## 4. Routing - [ ] 4.1 Register the `/analytics` route in `apps/web/src/App.tsx` - [ ] 4.2 Verify navigation works from sidebar button and direct URL access ## 5. Verify - [ ] 5.1 `pnpm typecheck` passes - [ ] 5.2 `pnpm -F web build` passes - [ ] 5.3 Visual: nav button renders correctly above Settings, analytics page loads with data, all sections handle loading/empty states