FE-1749: Add Brunch voice selection, previews, and device routing - #9768
kostandinang wants to merge 17 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
Co-authored-by: Kostandin Angjellari <ka@hash.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
75792fa to
8cabbd0
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 8cabbd0. Configure here.
| this.#releaseMeterResources(); | ||
| } | ||
| } | ||
| }, |
There was a problem hiding this comment.
Meter dies after microphone switch
Medium Severity
replaceMicrophone calls #syncMicrophoneTrack before destroying the meter, then rebuilds the AudioContext without starting sampling again. After a device switch while the mic is live, #startMeter never runs, so microphoneLevel stays at 0 and the dock waveform freezes until a later turn-state change.
Reviewed by Cursor Bugbot for commit 8cabbd0. Configure here.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the Brunch implementation stacked on the Petrinaut controls while preserving the existing pull request history.


Note
Depends on #9774, which contains the generic Petrinaut voice-audio controls. This PR contains the Brunch and website implementation.
🌟 What is the purpose of this PR?
Implement extended Brunch/Petrinaut Voice settings without crowding the conversation. Keep microphone mute separate from app-output mute and volume, and provide provider-specific voice selection, static previews, browser-device routing, and persistence through Petrinaut's Audio options.
🔍 What does this change?
getUserMedia/replaceTrackand speakers withsetSinkId/selectAudioOutputwhere supported.🔗 Related links
🚫 Blocked by
NODE_OPTIONS=--no-experimental-webstoragebecause Node 26's built-in storage otherwise overrides jsdom storage.🛡 What tests cover this?
@apps/petrinaut-websiteTypeScript checks.❓ How to test this?
For manual validation, configure Brunch Voice, start a Live session, and open Audio options. Mute the microphone before selecting a voice preview; verify output mute/volume, device selection and fallback, status visibility, and next-session voice application. Repeat with the Realtime provider and verify that speed changes affect the next response.
Pre-Merge Checklist 🚀
📹 Demo
live-demo.mp4
Live mode mixer controls demo
live-mixer-controls-demo.mp4