Uh oh!
There was an error while loading. Please reload this page.
feat(codex): add provider-native voice mode - #8324
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
There was a problem hiding this comment.
One consistency issue found in apps/web/src/components/chat/ComposerVoiceControl.tsx: the call-site text colors never reach the lucide icons because Button's ghost variant pins --control-icon-color, so the error/destructive tones (including the red microphone documented in docs/user/providers-codex.md) render as muted foreground. See inline comments.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Reviewed the new Codex realtime voice service surface (contracts, ProviderService, CodexAdapter, CodexSessionRuntime, ws handlers, client atoms) against the Effect service conventions. Imports, service wiring, dependency acquisition, and the new ProviderRealtimeVoiceError (multi-value operation discriminator with a message derived from structural attributes) all look consistent. Two error-modeling findings below.
Posted via Macroscope — Effect Service Conventions
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Reviewed the new composer voice control and its call site. The icon-color indirection flagged on the previous run is now fixed ([--control-icon-color:currentColor] is applied on all three buttons). Two remaining findings below: a control that renders enabled but is inert on draft routes, and a status dot bypassing the semantic color token.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR introduces a substantial live voice workflow across browser microphone/WebRTC handling, new authenticated RPCs, provider routing, and Codex session lifecycle coordination. It also changes an authentication package and handles sensitive microphone/audio flows, so the production blast radius warrants human review. You can add or adjust custom eligibility rules. Learn more. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 3 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit ac1563e. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding: the new realtime-voice RPC boundary discards the underlying failure instead of preserving it as cause. Everything else in the changed Effect service scope (namespace subpath imports, Schema.TaggedErrorClass failures with structured attributes and attribute-derived messages, the requireSession + mapCodexRuntimeError pass-through pattern in CodexAdapter, and dependency acquisition in makeCodexSessionRuntime / makeProviderService) follows the conventions.
Posted via Macroscope — Effect Service Conventions
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding: the live voice control can be unmounted while the session is still streaming. See the inline comment.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the new composer voice placement logic. The earlier icon-color, bg-success token, and route-gate items from previous runs look addressed.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Reviewed the web UI changes (ComposerVoiceControl, its ChatComposer mount points, and useCodexRealtimeVoice). Icon-color indirection, the bg-success token, the render gate, and the duplicate live-control case from earlier rounds all look resolved. One layout nit remains on the new fallback row.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
t3dotgg
commented
Aug 28, 2026
Note 🤖 GPT-5.6 Sol responding on behalf of Theo We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together. We are not adding provider-native voice mode. The provider protocol and client support cost is too high for this path in the current product set. If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. |

What Changed
Why
Codex now exposes provider-native realtime voice, but T3 Code had no way to start it from the current thread. This adds the smallest provider-bound path: the existing Codex process owns the realtime session, T3 routes signaling, and clients own ephemeral media. Raw audio is neither proxied through the T3 WebSocket nor persisted by T3.
This is distinct from global prompt dictation in #5213: voice here is a live two-way Codex session attached to the current thread. Signed macOS builds also need the microphone entitlement tracked in #5321; this PR intentionally does not duplicate that contributor's separate platform change.
UI Changes
Before — persisted Codex thread composer
After — idle microphone action
Rendered live control — connection, mute, and end controls
The control has no animation or timing behavior. The live-state screenshot renders the real composer component without capturing microphone audio.
Surface Decisions
Verification
vp test runon 6 focused files: 141 tests passedChecklist
Built with Codex (gpt-5.6-sol) in the Codex harness through T3 Code.
Note
Add provider-native voice mode to Codex
startRealtimeVoiceandstopRealtimeVoicetoCodexSessionRuntimeto manage WebRTC SDP negotiation with Codex via JSON-RPC, including concurrent-start protection, timeouts, and error handling.useCodexRealtimeVoicehook andComposerVoiceControlUI component to manage microphone access, ICE gathering, and connection state for server-backed Codex threads.provider.realtimeVoice.startandprovider.realtimeVoice.stopto ws.ts withAuthOrchestrationOperateScoperequired.CodexSessionRuntimenow defaultsrealtimeVoiceNegotiationTimeoutMsto 20000ms andrealtimeVoiceStopTimeoutMsto 3000ms; failure to meet these time bounds will result in timeout errors.Macroscope summarized 5ff77a9.
Note
Medium Risk
Introduces a new authenticated RPC path and substantial Codex runtime concurrency/cleanup logic around realtime negotiation; audio bypasses T3 but mis-handled stop/start races could leave stale sessions or block retries.
Overview
Adds live Codex voice for web/desktop: the composer gets a microphone control that runs a WebRTC session (mic +
oai-eventsdata channel) while only SDP goes through newprovider.realtimeVoice.start/stopRPCs with orchestration operate scope.On the server, Codex-only optional adapter hooks route through
ProviderService(session recovery on start, no-op stop when inactive).CodexSessionRuntimenegotiates Codex realtime v3 (thread/realtime/start/stop) with guarded concurrent starts, answer/stop timeouts, notification handling, and cleanup on stop, interrupt, or runtime close.The web
useCodexRealtimeVoicehook owns peer connection, ICE gathering, mute, and autoplay recovery;ComposerVoiceControlis wired fromChatComposerfor Codex threads (version ≥ 0.145.0). Contracts bound SDP size; docs note direct client↔OpenAI audio and no native mobile UI yet.Reviewed by Cursor Bugbot for commit 5ff77a9. Bugbot is set up for automated code reviews on this repo. Configure here.