$ the-wire · showcase
Codex voice-host ships real-time microphone audio; openai-node fixes streaming hangs
By RepoJournal · Filed · About OpenAI
Codex wires processed microphone audio into voice-host peer connections, while openai-node patches an SSE iterator hang and a stale terminal message snapshot.
Codex voice-host now transmits captured audio to the remote peer instead of draining it locally [1]. Capture and render references are resampled to 48 kHz with Rubato, run through Sonora echo cancellation, noise suppression, and gain control, then encoded as 20 ms mono Opus packets and attached as an Opus track to the WebRTC peer. Audio devices are opt-in via new `openDevices` and `setAudioControls` protocol methods, opening the default microphone and speaker after transport negotiation, initially muted and suppressed, with CPAL support on macOS, GNU Linux, and MSVC Windows [2].
Codex also preserved the resolved multi-agent version when reverting paginated threads, so a model-selected V2 thread keeps its collaboration tools after reload or server restart [3]. Guardian tickets were replaced with parent response IDs captured from `response.created`, ensuring tool reviews cannot inherit a failed response's ID and passing `guardian_credits_requested` on eligible parent requests [4]. `--worktree` now supports interactive sessions and forks behind the `worktrees` feature, restricted to local sessions [5].
openai-node fixed a response-backed SSE iterator lifecycle hang: breaking from `for await` after an event could wait indefinitely for body cancellation before the request controller was aborted [6]. Aborting before nested cleanup reuses the existing abort-aware cleanup. `AssistantStream.finalMessages()` now retains the authoritative `thread.message.completed` or `thread.message.incomplete` message instead of the earlier snapshot, fixing streams that reported `status: 'in_progress'` with null completion timestamps [7]. Docs fixes, meanwhile, make the function-tool examples compile under TypeScript 4.9 by adding an explicit type predicate and remove an undefined `main()` call [8][9].
Action items
- → Review openai-node SSE iterator usage for the abort-before-cleanup fix and upgrade to the patched release openai/openai-node [immediate]
- → Check how your app consumes AssistantStream.finalMessages() and verify terminal status after upgrade openai/openai-node [plan]
- → Watch for voice-host audio device support reaching your platform openai/codex [monitor]
References
- [1] Send processed microphone audio over RTP in voice-host ↗ openai/codex
- [2] Add opt-in local audio devices to the voice helper ↗ openai/codex
- [3] Preserve the resolved multi-agent version when reverting threads (#43000) ↗ openai/codex
- [4] Replace Guardian tickets with parent response IDs (#43002) ↗ openai/codex
- [5] Support managed worktrees for interactive sessions and forks ↗ openai/codex
- [6] fix(streaming): abort before early-exit cleanup (#2613) ↗ openai/openai-node
- [7] fix(assistants): retain terminal message snapshots (#2650) ↗ openai/openai-node
- [8] docs(tools): support TypeScript 4.9 in the function loop (#2649) ↗ openai/openai-node
- [9] docs(helpers): remove undefined main call from parsing example (#2648) ↗ openai/openai-node