Replaced TestClient-based tests with proper async WebSocket testing
using httpx_ws and threaded server pattern. TestClient has event loop
issues with WebSocket connections that were causing all tests to fail.
Changes:
- Rewrote all WebSocket tests to use aconnect_ws from httpx_ws
- Added chat_appserver fixture using threaded Uvicorn server
- Tests now use separate event loop in server thread
- All 6 tests now pass without asyncio/event loop errors
- Matches existing pattern from test_transcripts_rtc_ws.py
Tests validate:
- WebSocket connection and echo behavior
- Error handling for non-existent transcripts
- Multiple sequential messages
- Graceful disconnection
- WebVTT context generation
- Unknown message type handling
Closes fn-1.8 (End-to-end testing)
Task 3: LLM Streaming Integration
- Import Settings, ChatMessage, MessageRole from llama-index
- Configure LLM with temperature 0.7 on connection
- Build system message with WebVTT transcript context (max 15k chars)
- Initialize conversation history with system message
- Handle 'message' type from client to trigger LLM streaming
- Stream LLM response using Settings.llm.astream_chat()
- Send tokens incrementally via 'token' messages
- Send 'done' message when streaming completes
- Maintain conversation history across multiple messages
- Add error handling with 'error' message type
- Add message protocol validation test
Implements Tasks 3 & 4 from TASKS.md
- Import topics_to_webvtt_named and recordings controller
- Add _get_is_multitrack helper function
- Generate WebVTT context on WebSocket connection
- Add get_context message type to retrieve WebVTT
- Maintain backward compatibility with echo for other messages
- Add test fixture and test for WebVTT context generation
Implements task fn-1.2: WebVTT context generation for transcript chat
* progress track for some hatchet tasks
* remove inline imports / type fixes
* progress callback for mixdown - move to a function
---------
Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com>
* Revert "fix: Skip mixdown for multitrack (#760)"
This reverts commit b51b7aa917.
* multitrack mixdown optimisation
* return the "good" ui part of "skip mixdown"
---------
Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com>
* Switch platform ui
* Update room settings based on platform
* Add local and none recording options to daily
* Don't create tokens for unauthentikated users
* Enable knocking for private rooms
* Create new meeting on room settings change
* Always use 2-200 option for daily
* Show recording start trigger for daily
* Fix broken test
* feat: add transcript format parameter to GET endpoint
Add transcript_format query parameter to /v1/transcripts/{id} endpoint
with support for multiple output formats using discriminated unions.
Formats supported:
- text: Plain speaker dialogue (default)
- text-timestamped: Dialogue with [MM:SS] timestamps
- webvtt-named: WebVTT subtitles with participant names
- json: Structured segments with full metadata
Response models use Pydantic discriminated unions with transcript_format
as discriminator field. POST/PATCH endpoints return GetTranscriptWithParticipants
for minimal responses. GET endpoint returns format-specific models.
* Copy transcript format
* Regenerate types
* Fix transcript formats
* Don't throw inside try
* Remove any type
* Toast share copy errors
* transcript_format exhaustiveness and python idiomatic assert_never
* format_timestamp_mmss clear type definition
* Rename seconds_to_timestamp
* Test transcript format with overlapping speakers
* exact match for vtt multispeaker test
---------
Co-authored-by: Sergey Mankovsky <sergey@monadical.com>
Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com>
* Sync authentik users
* Migrate user_id from uid to id
* Fix auth user id
* Fix ci migration test
* Fix meeting token creation
* Move user id migration to a script
* Add user on first login
* Fix migration chain
* Rename uid column to authentik_uid
* Fix broken ws test
* feat: add API key management UI
- Created settings page for users to create, view, and delete API keys
- Added Settings link to app navigation header
- Fixed delete operation return value handling in backend to properly handle asyncpg's None response
* feat: replace browser confirm with dialog for API key deletion
- Added Chakra UI Dialog component for better UX when confirming API key deletion
- Implemented proper focus management with cancelRef for accessibility
- Replaced native browser confirm() with controlled dialog state
* style: format API keys page with consistent line breaks
* feat: auto-select API key text for easier copying
- Added automatic text selection after API key creation to streamline the copy workflow
- Applied className to Code component for DOM targeting
* feat: improve API keys page layout and responsiveness
- Reduced max width from 1200px to 800px for better readability
- Added explicit width constraint to ensure consistent sizing across viewports
* refactor: remove redundant comments from API keys page
* search date filter
* search date filter
* search date filter
* search date filter
* pr comment
---------
Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com>