7caa880ebd
- All Alpine.js pages now use shared api.js for JWT auto-refresh (9 pages) - Dashboard uses /servers/stats endpoint instead of fetching all servers - Replaced all raw dict params with Pydantic models (agent, settings, presets) - Added AgentHeartbeat, AgentExec, SettingUpdatePayload, DbCredentialCreate schemas - JWT decode now requires exp+sub claims; better error logging - ServerService.push_to_servers delegates to SyncService.batch_push - SyncService handles None audit_repo/retry_repo gracefully - Branding: web/app.js + web/style.css MultiSync→Nexus Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>