- New POST /api/auth/microsoft endpoint validates Azure ID token via JWKS
- Removed POST /api/auth/login and /change-password
- Added azure_oid + nullable password_hash to users (migration 0007)
- Auto-provisions all @oliver.agency accounts on first SSO login
- Case-insensitive email matching links existing vadymsamoilenko@ account
- DEV_AUTH_BYPASS flag for local development without MSAL
- Frontend: MSAL loginPopup replaces email/password form
- Added scripts/grant_admin.py for role management
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Dashboard charts: use pixel heights (not %) and items-end so bars align
to bottom correctly and are visible at proper scale
- logout(): remove non-existent POST /api/auth/logout call; JWT is stateless,
client-side token clear is sufficient
- Include rebuilt src/static/ assets so server serves updated frontend bundle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TaskForm: add start_time/end_time fields; on save emits optional
block payload so PlannerView creates a PlannedBlock automatically
- PlannerView: handleSave accepts block param, calls createBlock after
task creation when time is provided
- CalendarBlock: planned blocks with task_id get draggable="true" +
@dragstart emitting blockDragStart event
- CalendarGrid: forward blockDragStart to useCalendarDnD
- useCalendarDnD: onBlockDragStart stores block_id + duration in
dataTransfer; onDrop handles both move-existing-block and
create-new-block paths
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Design:
- Replace purple SaaS theme with operational dark navy (#0b1020) + cyan (#57c7ff)
- Satoshi + JetBrains Mono fonts via CSS @import
- KpiCard: hero variant for Total Hours, tabular-nums for all values
- Sidebar: cyan active state instead of amber, dimmer inactive icons
- Dashboard: skeleton loading states for all charts, polished empty states
- TopBar: cyan user avatar consistent with sidebar
Fixes:
- Live Feed: SSE URL was /api/events/stream (wrong) → /api/events; pass JWT as ?token= query param
- Dashboard: default preset changed to 'today' instead of '30d'
- index.html: Cache-Control: no-cache to prevent stale asset issues
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TaskForm: change project_id/azure_work_item_id form state from null to undefined
- CalendarView/PlannerView: accept TaskCreatePayload | TaskUpdatePayload from @save emit
- Rebuild: web assets with AssistantWidget included
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Sidebar: Add Sign Out button below user info
- Keys API: split revoke (PATCH /{id}/revoke) and delete (DELETE /{id})
- Keys page: Revoke + Delete buttons per key; delete removes from DB
- New key flow: after creation show download setup script step
- Script embeds API key, asks for projects root folder
- Downloads cc-collector.py, merges Claude Code hook into settings.json
- Tests connection and reports result
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Full CSS redesign: OLED black (#0a0a0a), #FFC407 accent, Montserrat 400–900
- Bold high-contrast typography (900 weight values, -0.04em tracking)
- No glassmorphism — flat sharp surfaces with subtle borders
- KPI cards: 2px yellow top accent bar on hover + lift shadow
- Login: centered card with yellow top bar + subtle grid bg pattern
- Modals: yellow top accent line
- Active nav: solid yellow bg, black text
- Buttons: yellow CTA with glow, ghost with yellow hover
- Badges: pill with yellow tint
- Favicon: dark card with yellow CC
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Full CSS rewrite: deep dark bg (#060714), glass cards with backdrop-filter,
Fira Sans/Code fonts, indigo/violet accent palette replacing yellow
- Add animated orb background to index.html
- Update favicon to indigo gradient
- Wrap admin/settings forms in <form> tags with autocomplete attributes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>