The camera drawer now offers a select of available video input devices
instead of a cycle button. "使用摄像头" starts the chosen camera and
changing the dropdown switches the live stream; the list is populated
from enumerateDevices (real labels after permission is granted).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Grid layout for source controls: camera + switch on top row (equal
width), upload full-width below; preview area uses aspect-ratio 4/3
- "使用摄像头" no longer changes label text; uses is-active highlight only
- "切换摄像头" now actually cycles through real video devices via
enumerateDevices(); falls back to facingMode flip on mobile/single-cam;
button disabled until camera is active and ≥2 devices are detected
- Default-selects first sample image when drawer opens so "拍摄完成"
is immediately pressable without requiring a capture/upload first
- Fix: camera prompt text is now locked to CAMERA_STATE_PROMPTS[state]
and no longer overwritten by assistant replies
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Expandable groups keep protocol and text events readable while still allowing per-frame inspection when debugging audio traffic.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Introduced new state properties for audio send logging.
- Implemented functions to flush audio send logs and handle binary data sending.
- Updated WebSocket logging to differentiate between send and receive actions.
- Enhanced UI layout and styles for better responsiveness and usability.
- Improved overall structure and readability of the code.