Restrict MI data so only meeting attendees can access their meetings.
Each meeting gets a unique access_token generated at creation time.
Attendees discover their token via conference_id (room name) lookup.
Backend:
- New auth.py with Bearer token validation and multi-token extraction
- Token generation in create_meeting(), backfill on startup
- All endpoints gated: list_meetings filters by X-MI-Tokens header,
per-meeting endpoints require Authorization: Bearer <token>
- New GET /meetings/token?conference_id=<room> discovery endpoint
Frontend:
- tokenStorage.ts manages tokens in localStorage keyed by room name
- middleware.ts auto-fetches token on CONFERENCE_JOINED
- All API calls in actions.ts now include auth headers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Also add tooltip to Meeting Intelligence button explaining that
recordings are transcribed by self-hosted AI post-recording.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds the Meeting Intelligence dashboard UI with:
- Toolbar button to open side panel during meetings
- Recordings list showing past meeting recordings
- Transcript viewer with speaker diarization colors
- AI summary panel with key points, action items, decisions
- Search panel for searching across all transcripts
- Export functionality (Markdown, PDF, JSON)
Frontend components:
- MeetingIntelligenceButton (toolbar integration)
- MeetingIntelligenceDashboard (side panel container)
- RecordingsList, TranscriptViewer, SummaryPanel, SearchPanel
Integrations:
- Redux state management via ReducerRegistry
- Config support via meetingIntelligence settings
- SCSS styles matching Jitsi design system
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>