You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Talk voice defaults were split between a composer panel and Settings, while browser Talk always captured the system-default microphone. Users with USB, Bluetooth, virtual, or multiple built-in inputs could not choose which device Talk recorded.
Why This Change Was Made
This removes the duplicate composer voice/model/sensitivity override path so persistent realtime defaults have one owner in Settings → Communications → Talk. The microphone caret now enumerates browser audio inputs, keeps the device ID browser-local, and applies the exact selected device across WebRTC, Google Live, and Gateway relay capture without changing the Gateway RPC contract.
User Impact
Users can select System default or any browser-exposed microphone directly beside the Talk button. The choice persists per Gateway, remains consistent across split panes even when browser storage is unavailable, refreshes when devices change, stays usable in narrow layouts, and reports a missing selected device instead of silently recording from another input.
Evidence
Blacksmith Testbox golden-prawn (tbx_01kww7127ke6skwe951qz8cdwj): 203 focused settings/Talk unit tests passed on the exact rebased head.
Real Chromium E2E passed at a 320×720 viewport: selected the USB input, kept the picker inside viewport gutters, restored focus on selection/Escape, sent exactly { sessionKey: "main" }, and captured with { deviceId: { exact: "usb" } }.
pnpm ui:i18n:check: all 20 locale bundles clean with zero fallbacks.
pnpm check:changed: typechecks, test typechecks, lint shards, and repository guards passed.
pnpm build: production runtime and Control UI build passed.
Mandatory Codex autoreview: clean, no accepted/actionable findings.
Known proof gap: the existing-profile Chrome smoke was unavailable because that browser did not expose a remote-debugging endpoint; the repository's real Chromium E2E covered the picker, focus, responsive layout, RPC boundary, capture constraints, and resource cleanup instead.
Land-ready proof for f543f1afb733d20ae8df27f45668b2a411519919:
Before: current main keeps Voice, Model, and Sensitivity overrides in the composer and always opens browser Talk on the default input. After: realtime defaults have one owner in Settings → Communications → Talk; the microphone caret lists System default plus every browser audio input, and an explicit selection reaches all three capture transports without entering the Gateway RPC payload.
corepack pnpm test ui/src/app/settings.node.test.ts ui/src/pages/chat/chat-realtime.test.ts ui/src/pages/chat/chat-view.test.ts ui/src/pages/chat/realtime-talk-input.test.ts ui/src/pages/chat/realtime-talk.test.ts ui/src/pages/chat/realtime-talk-webrtc.test.ts ui/src/pages/chat/realtime-talk-google-live.test.ts ui/src/pages/chat/realtime-talk-gateway-relay.test.ts ui/src/pages/chat/composer-persistence.test.ts ui/src/e2e/browser-talk-start-stop.e2e.test.ts — 203 unit tests + 1 real Chromium E2E passed on the exact rebased head.
Chromium proof at 320×720 selected the USB input, kept the menu inside 8px viewport gutters, restored trigger focus on selection/Escape, sent exactly { sessionKey: "main" }, captured with { deviceId: { exact: "usb" } }, and stopped resources.
corepack pnpm ui:i18n:check — all 20 locales clean, zero fallbacks.
corepack pnpm build — production runtime and Control UI build passed.
Mandatory Codex autoreview — clean, no actionable findings.
scripts/pr review-validate-artifacts 101100 — READY FOR /prepare-pr, zero findings.
Known gap: the existing-profile Chrome smoke was unavailable because that browser exposed no remote-debugging endpoint. The repository's real Chromium E2E covers the changed UI, responsive, focus, RPC, capture, and cleanup paths.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #101046
What Problem This Solves
Talk voice defaults were split between a composer panel and Settings, while browser Talk always captured the system-default microphone. Users with USB, Bluetooth, virtual, or multiple built-in inputs could not choose which device Talk recorded.
Why This Change Was Made
This removes the duplicate composer voice/model/sensitivity override path so persistent realtime defaults have one owner in Settings → Communications → Talk. The microphone caret now enumerates browser audio inputs, keeps the device ID browser-local, and applies the exact selected device across WebRTC, Google Live, and Gateway relay capture without changing the Gateway RPC contract.
User Impact
Users can select System default or any browser-exposed microphone directly beside the Talk button. The choice persists per Gateway, remains consistent across split panes even when browser storage is unavailable, refreshes when devices change, stays usable in narrow layouts, and reports a missing selected device instead of silently recording from another input.
Evidence
golden-prawn(tbx_01kww7127ke6skwe951qz8cdwj): 203 focused settings/Talk unit tests passed on the exact rebased head.{ sessionKey: "main" }, and captured with{ deviceId: { exact: "usb" } }.pnpm ui:i18n:check: all 20 locale bundles clean with zero fallbacks.pnpm check:changed: typechecks, test typechecks, lint shards, and repository guards passed.pnpm build: production runtime and Control UI build passed.Known proof gap: the existing-profile Chrome smoke was unavailable because that browser did not expose a remote-debugging endpoint; the repository's real Chromium E2E covered the picker, focus, responsive layout, RPC boundary, capture constraints, and resource cleanup instead.