Skip to content

feat(ui): select microphones from the Talk control#101100

Merged
steipete merged 1 commit into
mainfrom
codex/web-voice-settings-inputs
Jul 6, 2026
Merged

feat(ui): select microphones from the Talk control#101100
steipete merged 1 commit into
mainfrom
codex/web-voice-settings-inputs

Conversation

@steipete

@steipete steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

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

  • 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.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: web-ui App: web-ui size: XL maintainer Maintainer-authored PR labels Jul 6, 2026
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

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.

Blacksmith Testbox golden-prawn (tbx_01kww7127ke6skwe951qz8cdwj):

  • 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.
  • env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed — repository guards, production/test typechecks, and lint passed.
  • 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.

@steipete
steipete merged commit 92cfcea into main Jul 6, 2026
153 of 160 checks passed
@steipete
steipete deleted the codex/web-voice-settings-inputs branch July 6, 2026 18:40
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui docs Improvements or additions to documentation maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Select microphones from Talk control and centralize voice settings

1 participant