Merge feature/agent-detail-view (#444) and resolve conflicts, keeping the
PR's backend-driven detail page (API endpoint, audit scoping, tests) and
our enhanced agents list view (search, card headers, claim badges).
Also fixes three review issues:
- Add 403 guard for non-admin audit identity filter (prevents querying
events for identities the caller does not own)
- Add idx_audit_events_identity index via migration v2
- Update test assertions for new 403 behavior and migration count
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The skip-link was participating in the sidebar flex row because sr-only
was not applied via @apply, and settings pages were centered inside a
max-width wrapper that pushed the sub-sidebar away from the main nav.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add theme provider, dark mode toggle, and typography components.
Update globals.css with refined color palette and enterprise-grade
table/card/badge density overrides. Improve authenticated layout,
settings layout, dashboard shell, overview views, auth flow pages,
page states, and section headers with consistent styling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Redesign connections list with provider logos, filter counts, grouped
global section with left-border accent, and confirmation dialogs.
Restructure connection detail into grouped cards (Identity, Token,
Endpoints, Secrets) with status badges and copyable fields. Add filter
chips (OAuth/API Key, Connected/Available) to providers list. Improve
provider cards with inline logo+name+tag layout. Refactor provider
detail with DetailField pattern, copyable callback URL, separated
revoke card, and better empty states.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move all authenticated pages into an (authenticated) route group so
sidebar and breadcrumbs are provided once by layout.tsx rather than
repeated in every page. The layout handles the SWR fetch, 401
redirect, and loading state centrally; each page is now a thin client
component that reads from the SWR cache.
Also adds the shadcn breadcrumb component and fixes the
SidebarMenuSkeleton hydration mismatch caused by Math.random() via
suppressHydrationWarning.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove all Button render={<Link>} / render={<a>} patterns — Base UI's
Button sets nativeButton=true by default, which injects role/tabIndex
onto the rendered <a> element server-side but not client-side, causing
the React hydration tree mismatch. Using Link/a directly (styled via
buttonVariants) removes the wrapper entirely and fixes the mismatch.
- Three <img> logo tags → <Image> (size-11→44px, size-9→36px, size-5→20px)
- Verification page open link → <Link>
- Sidebar footer external links: <a> → <Link> via SidebarMenuButton render prop
- Import buttonVariants alongside Button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Make entire provider card clickable via router.push; stopPropagation
on the Connect button keeps the form action independent
- Fix --accent in dark mode: was emerald (#10B981), now neutral
surface-container-high (#2a2a2c) — fixes green hover bleed on every
shadcn component that uses bg-accent (sidebar items, dropdowns, cards)
- Align --sidebar-accent to match the corrected --accent token
- Remove Back button and title from DashboardDetailShell; shell now
only owns the sidebar + topbar + scroll container
- Provider detail: logo/name/description in a borderline page header,
"New connection" button pinned top-right; redundant Connect card removed
- Connection detail: provider label + connection h1 in page header;
Set-as-default / View-provider / Logout actions inline top-right;
Actions card removed; layout tightened to two flat content cards
- DashboardDetailShell gains h-svh / overflow-y-auto scroll containment
matching the main dashboard shell (detail pages were the outlier)
- Document --accent token rules in DESIGN.md to prevent regression
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Calling setActiveView/setConnectionFilter inside useEffect body triggered
the react-hooks/set-state-in-effect lint error. Initialise both states
directly from URL params via lazy useState initialisers so no effect is
needed, and remove the now-unused useEffect import.
Also scope Docker build to version tags only (release-please triggers),
and restrict Python Tests to push/PR against main.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
After OAuth completes, the return_url now points to
/?view=connections&provider=<name> instead of /. On load, the dashboard
reads those query params to activate the connections view and pre-populate
the search filter with the provider name, landing the user on a page that
confirms their new connection.
Fixes#355
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Build Next.js app and populate src/authsome/ui/web/ so GET / is served
from the static bundle rather than a Python f-string page
- Apply DESIGN.md (Deep Emerald + Obsidian, dark-first) to the Next.js
app: update globals.css tokens, switch fonts to Hanken Grotesk +
JetBrains Mono, add dark class to <html>, replace all hardcoded
bg-white/bg-slate-* with semantic CSS-variable classes
- Redesign Python interstitial pages (claim, device-code, OAuth input,
error) using the same DESIGN.md tokens in web_theme.py
- Remove Python GET / route and dashboard_page() — Next.js AuthGate
handles unauthenticated state; no Python fallback needed
- Remove the GET / special-case from _resolve_ui_auth
- Move DESIGN.md to ui/ (the Next.js root, the correct home)
- Delete test_ui_sessions.py and test_ui_dashboard.py; server-rendered
dashboard UI no longer exists as Python code
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>