From fc81a7154bc6b53f0f2e2b9ecdb33504e0b38f5d Mon Sep 17 00:00:00 2001 From: Benjamin Carlsson Date: Wed, 30 Sep 2026 01:45:47 +0000 Subject: [PATCH 01/11] Add local audio device selection to TUI voice settings (#49437) ## Why Voice conversations previously opened the system-default microphone and speaker. Users need to choose which local devices to use, including when connected to a remote app server. ## What changed - Add input and output device pickers alongside voice selection, with back navigation and a System default option. - Persist selections as `audio.microphone` and `audio.speaker` on the TUI's machine, excluding project configuration layers. Apply them to the next voice conversation. - Enumerate devices without opening audio streams and pass the selected names to the voice helper at startup. - Disable ambiguous device names in the picker and use the same eligibility filtering for discovery and named-device startup. ## Testing Add tests for device preference persistence across project and remote transitions, picker navigation and duplicate names, discovery without capture, and forwarding selected devices to the helper. GitOrigin-RevId: d48fb3a09fa9b982a408f5a7c96bdd81776af21d --- codex-rs/realtime-webrtc/src/client.rs | 24 ++- codex-rs/realtime-webrtc/src/lib.rs | 3 + codex-rs/realtime-webrtc/src/protocol.rs | 29 +++- codex-rs/realtime-webrtc/src/session.rs | 11 +- codex-rs/realtime-webrtc/tests/common/mod.rs | 17 +- .../realtime-webrtc/tests/session_actor.rs | 49 +++++- codex-rs/tui/src/app/event_dispatch.rs | 16 +- codex-rs/tui/src/app/realtime_settings.rs | 113 +++++++++++- .../tui/src/app/tests/realtime_requests.rs | 127 +++++++++++++- ...s__remote_voice_picker_server_default.snap | 1 + codex-rs/tui/src/app_event.rs | 14 ++ codex-rs/tui/src/chatwidget/realtime.rs | 11 +- .../tui/src/chatwidget/realtime_settings.rs | 141 ++++++++++++++- .../src/chatwidget/realtime_settings_tests.rs | 161 +++++++++++++++++- ..._tests__voice_ambiguous_input_devices.snap | 14 ++ ...altime_settings__tests__voice_choices.snap | 18 ++ ...sts__voice_multichannel_input_devices.snap | 14 ++ ...e_multichannel_selected_input_devices.snap | 14 ++ ...settings__tests__voice_output_devices.snap | 14 ++ ...ltime_settings__tests__voice_settings.snap | 15 +- ...__tests__voice_settings_input_channel.snap | 13 ++ ..._tests__voice_settings_server_catalog.snap | 1 + ...gs__tests__voice_stereo_input_devices.snap | 14 ++ codex-rs/tui/src/local_settings.rs | 13 ++ codex-rs/voice-host/src/devices.rs | 86 +++++++++- codex-rs/voice-host/src/devices_tests.rs | 33 ++++ .../voice-host/src/devices_unavailable.rs | 18 +- codex-rs/voice-host/src/main.rs | 12 +- 28 files changed, 941 insertions(+), 55 deletions(-) create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_ambiguous_input_devices.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_choices.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_input_devices.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_selected_input_devices.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_output_devices.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_input_channel.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_stereo_input_devices.snap diff --git a/codex-rs/realtime-webrtc/src/client.rs b/codex-rs/realtime-webrtc/src/client.rs index ed2f50e37fa3..d6ef6af2072b 100644 --- a/codex-rs/realtime-webrtc/src/client.rs +++ b/codex-rs/realtime-webrtc/src/client.rs @@ -12,6 +12,9 @@ use codex_utils_pty::SpawnedProcess; use tokio::sync::oneshot; use tokio::time::timeout; +use crate::AudioDevice; +use crate::AudioDeviceKind; +use crate::AudioDeviceSelection; use crate::HelperExitStage; use crate::Message; use crate::encode_frame; @@ -63,12 +66,27 @@ pub struct VoiceHost { impl VoiceHost { /// Open local devices only after answer negotiation. They initially remain muted/suppressed. - pub async fn open_devices(mut self) -> Result { - self.exchange(Message::OpenDevices {}, Message::DevicesOpened {}, DEADLINE) - .await?; + pub async fn open_devices(mut self, selection: AudioDeviceSelection) -> Result { + self.exchange( + Message::OpenDevices { selection }, + Message::DevicesOpened {}, + DEADLINE, + ) + .await?; Ok(self) } + /// Enumerate local devices without opening streams. + pub async fn list_devices(&mut self, kind: AudioDeviceKind) -> Result> { + match self + .request(Message::ListDevices { kind }, DEADLINE) + .await? + { + Message::DeviceList { devices } => Ok(devices), + _ => anyhow::bail!("unexpected voice helper response"), + } + } + /// Acknowledgement follows invalidation of the helper's previous capture/render generations. pub async fn set_audio_controls(&mut self, controls: crate::AudioControls) -> Result<()> { self.exchange( diff --git a/codex-rs/realtime-webrtc/src/lib.rs b/codex-rs/realtime-webrtc/src/lib.rs index d4776cfcdda1..988365628cd1 100644 --- a/codex-rs/realtime-webrtc/src/lib.rs +++ b/codex-rs/realtime-webrtc/src/lib.rs @@ -10,6 +10,9 @@ pub use client::ConnectionError; pub use client::VoiceHost; pub use helper_exit::HelperExitStage; pub use protocol::AudioControls; +pub use protocol::AudioDevice; +pub use protocol::AudioDeviceKind; +pub use protocol::AudioDeviceSelection; pub use protocol::AudioState; pub use protocol::MAX_FRAME_BYTES; pub use protocol::Message; diff --git a/codex-rs/realtime-webrtc/src/protocol.rs b/codex-rs/realtime-webrtc/src/protocol.rs index 2859aaea870f..6c067243b485 100644 --- a/codex-rs/realtime-webrtc/src/protocol.rs +++ b/codex-rs/realtime-webrtc/src/protocol.rs @@ -23,6 +23,31 @@ pub struct AudioState { pub speaker_peak: u16, } +/// Direction of a local audio device, shared by enumeration and capture/playback selection. +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum AudioDeviceKind { + Input, + Output, +} + +/// Local device preferences fixed for the lifetime of a voice conversation. +#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct AudioDeviceSelection { + pub microphone: Option, + pub speaker: Option, +} + +/// Local device metadata; enumeration never opens streams. +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct AudioDevice { + pub name: String, + pub channels: u16, + pub is_default: bool, +} + /// SDP contains ICE credentials. Bound it at construction and never expose it in diagnostics. #[derive(Deserialize, PartialEq, Serialize)] #[serde(try_from = "String")] @@ -82,7 +107,9 @@ pub enum Message { ApplyAnswer { sdp: SessionDescription }, TransportReady {}, TransportTimedOut {}, - OpenDevices {}, + ListDevices { kind: AudioDeviceKind }, + DeviceList { devices: Vec }, + OpenDevices { selection: AudioDeviceSelection }, DevicesOpened {}, SetAudioControls { controls: AudioControls }, AudioControlsApplied {}, diff --git a/codex-rs/realtime-webrtc/src/session.rs b/codex-rs/realtime-webrtc/src/session.rs index fee0c3966971..badbf41e388e 100644 --- a/codex-rs/realtime-webrtc/src/session.rs +++ b/codex-rs/realtime-webrtc/src/session.rs @@ -16,6 +16,7 @@ use futures::future::Abortable; use tokio::sync::mpsc; use crate::AudioControls; +use crate::AudioDeviceSelection; use crate::ConnectionError; use crate::SessionDescription; use crate::VoiceHost; @@ -93,7 +94,10 @@ impl RealtimeWebrtcSession { } /// Called off the UI thread. Cancellation also owns startup before a handle is returned. - pub fn start(abort: AbortRegistration) -> Result { + pub fn start( + abort: AbortRegistration, + selection: AudioDeviceSelection, + ) -> Result { let package = codex_install_context::InstallContext::current() .package_layout .clone() @@ -147,7 +151,7 @@ impl RealtimeWebrtcSession { offer .send(Ok(sdp.into_sdp())) .map_err(|_| anyhow::anyhow!("voice startup cancelled"))?; - run(host, receiver, &state, &controls).await + run(host, receiver, &state, &controls, selection).await }; let result = runtime.block_on(Abortable::new(Abortable::new(task, abort), stopped)); if let Ok(Ok(Err(error))) = result { @@ -266,6 +270,7 @@ async fn run( mut commands: mpsc::Receiver, state: &State, controls: &Mutex, + selection: AudioDeviceSelection, ) -> Result<()> { let mut connected = false; let mut poll = tokio::time::interval(Duration::from_millis(/*millis*/ 50)); @@ -277,7 +282,7 @@ async fn run( Some(Command::Answer(sdp, complete)) if !connected => { let startup = async { let mut host = report_failure(ConnectionError::Transport, host.apply_answer(sdp).await)?; - host = report_failure(ConnectionError::AudioDevices, host.open_devices().await)?; + host = report_failure(ConnectionError::AudioDevices, host.open_devices(selection.clone()).await)?; let applied = startup_controls(&mut commands, controls, |initial| { host.begin_audio_controls(initial) }); diff --git a/codex-rs/realtime-webrtc/tests/common/mod.rs b/codex-rs/realtime-webrtc/tests/common/mod.rs index 63f8884b48eb..137012d28cae 100644 --- a/codex-rs/realtime-webrtc/tests/common/mod.rs +++ b/codex-rs/realtime-webrtc/tests/common/mod.rs @@ -148,6 +148,17 @@ fn helper() -> Result<()> { stage = Stage::Initialize; Message::Ready {} } + Message::ListDevices { kind } if stage == Stage::Initialize => Message::DeviceList { + devices: vec![codex_realtime_webrtc::AudioDevice { + name: match kind { + codex_realtime_webrtc::AudioDeviceKind::Input => "Interface", + codex_realtime_webrtc::AudioDeviceKind::Output => "Headphones", + } + .into(), + channels: 16, + is_default: true, + }], + }, Message::InitializeRuntime {} if stage == Stage::Initialize => { fs::write(root.join("initializing"), [])?; if root.join("hold-initialization").exists() { @@ -178,7 +189,11 @@ fn helper() -> Result<()> { stage = Stage::Devices; Message::TransportReady {} } - Message::OpenDevices {} if stage == Stage::Devices => { + Message::OpenDevices { selection } if stage == Stage::Devices => { + fs::write( + root.join("input-selection"), + serde_json::to_vec(&selection)?, + )?; if root.join("fail-devices").exists() { anyhow::bail!("synthetic private device diagnostic"); } diff --git a/codex-rs/realtime-webrtc/tests/session_actor.rs b/codex-rs/realtime-webrtc/tests/session_actor.rs index ded26288cefa..524f5ded1424 100644 --- a/codex-rs/realtime-webrtc/tests/session_actor.rs +++ b/codex-rs/realtime-webrtc/tests/session_actor.rs @@ -4,6 +4,8 @@ mod common; use anyhow::Result; use codex_realtime_webrtc::AudioControls; +use codex_realtime_webrtc::AudioDeviceKind; +use codex_realtime_webrtc::AudioDeviceSelection; use codex_realtime_webrtc::RealtimeWebrtcSession; use futures::future::AbortHandle; use pretty_assertions::assert_eq; @@ -24,7 +26,13 @@ fn startup_controls_meters_and_helper_loss() -> Result<()> { assert!(RealtimeWebrtcSession::is_supported()); } let (_abort, registration) = AbortHandle::new_pair(); - let started = RealtimeWebrtcSession::start(registration)?; + let started = RealtimeWebrtcSession::start( + registration, + AudioDeviceSelection { + microphone: Some("Zen Go Synergy Core Playback".into()), + speaker: Some("Headphones".into()), + }, + )?; assert_eq!(started.offer_sdp, "synthetic-offer"); let handle = started.handle; handle.set_microphone_muted(/*muted*/ true)?; @@ -34,6 +42,10 @@ fn startup_controls_meters_and_helper_loss() -> Result<()> { handle.set_speaker_suppressed(/*suppressed*/ true); fs::write(root.join("release"), [])?; answer.join().expect("answer thread")?; + assert_eq!( + serde_json::from_slice::(&fs::read(root.join("input-selection"))?)?, + serde_json::json!({"microphone": "Zen Go Synergy Core Playback", "speaker": "Headphones"}) + ); let initial: Vec = serde_json::from_slice(&fs::read(root.join("controls"))?)?; assert_eq!( initial, @@ -84,7 +96,10 @@ fn external_cancellation_interrupts_startup() -> Result<()> { let (abort, registration) = AbortHandle::new_pair(); let (result, received) = std::sync::mpsc::sync_channel(/*bound*/ 1); let startup = thread::spawn(move || { - let _ = result.send(RealtimeWebrtcSession::start(registration)); + let _ = result.send(RealtimeWebrtcSession::start( + registration, + AudioDeviceSelection::default(), + )); }); common::wait_for(|| root.join("initializing").exists())?; abort.abort(); @@ -106,7 +121,7 @@ fn last_owner_drop_reaps_helper() -> Result<()> { return Ok(()); }; let (_abort, registration) = AbortHandle::new_pair(); - let started = RealtimeWebrtcSession::start(registration)?; + let started = RealtimeWebrtcSession::start(registration, AudioDeviceSelection::default())?; drop(started); common::wait_for_helper_reaped(&root) } @@ -121,7 +136,7 @@ fn device_failure_reaches_startup_completion_without_duplicate_error() -> Result fs::write(root.join("fail-devices"), [])?; fs::write(root.join("release"), [])?; let (_abort, registration) = AbortHandle::new_pair(); - let started = RealtimeWebrtcSession::start(registration)?; + let started = RealtimeWebrtcSession::start(registration, AudioDeviceSelection::default())?; assert_eq!( started.handle.apply_answer_sdp("synthetic-answer".into()), Err(codex_realtime_webrtc::ConnectionError::AudioDevices) @@ -141,7 +156,8 @@ fn runtime_failure_reaches_offer_caller_without_native_error_text() -> Result<() }; fs::write(root.join("fail-initialization"), [])?; let (_abort, registration) = AbortHandle::new_pair(); - let error = RealtimeWebrtcSession::start(registration).unwrap_err(); + let error = + RealtimeWebrtcSession::start(registration, AudioDeviceSelection::default()).unwrap_err(); assert_eq!( error.downcast_ref::(), Some(&codex_realtime_webrtc::ConnectionError::RuntimeInitialization) @@ -154,3 +170,26 @@ fn runtime_failure_reaches_offer_caller_without_native_error_text() -> Result<() common::wait_for_helper_reaped(&root)?; Ok(()) } + +#[tokio::test] +async fn device_discovery_does_not_start_capture() -> Result<()> { + let Some(root) = common::package("device_discovery_does_not_start_capture")? else { + return Ok(()); + }; + let package = codex_install_context::InstallContext::current() + .package_layout + .as_ref() + .unwrap(); + let mut host = codex_realtime_webrtc::VoiceHost::connect(package, common::BUILD_COMMIT).await?; + assert_eq!( + host.list_devices(AudioDeviceKind::Input).await?, + vec![codex_realtime_webrtc::AudioDevice { + name: "Interface".into(), + channels: 16, + is_default: true, + }] + ); + host.close().await?; + assert!(!root.join("initializing").exists()); + Ok(()) +} diff --git a/codex-rs/tui/src/app/event_dispatch.rs b/codex-rs/tui/src/app/event_dispatch.rs index f8fd11d57bfd..da47c0f7e955 100644 --- a/codex-rs/tui/src/app/event_dispatch.rs +++ b/codex-rs/tui/src/app/event_dispatch.rs @@ -2451,8 +2451,20 @@ impl App { } self.chat_widget.on_plugin_mentions_loaded(plugins); } - AppEvent::OpenRealtimeSettings => { - self.open_realtime_settings(app_server).await; + AppEvent::OpenRealtimeSettings => self.chat_widget.open_realtime_settings(), + AppEvent::OpenRealtimeSoundDevices => self.chat_widget.open_realtime_sound_devices(), + AppEvent::OpenRealtimeVoices => self.open_realtime_voices(app_server).await, + AppEvent::OpenRealtimeDevicePicker { kind } => self.list_realtime_devices(kind), + AppEvent::RealtimeDevicesListed { origin, kind, result } => { + if origin == self.active_thread_id { + match result { + Ok(devices) => self.chat_widget.open_realtime_device_picker(kind, devices), + Err(error) => self.chat_widget.add_error_message(error), + } + } + } + AppEvent::PersistRealtimeDevice { kind, name } => { + self.persist_realtime_device(kind, name).await; } AppEvent::PersistRealtimeVoiceSelection { voice } => { self.persist_realtime_voice(app_server, voice).await; diff --git a/codex-rs/tui/src/app/realtime_settings.rs b/codex-rs/tui/src/app/realtime_settings.rs index 2f31148ee65f..92e301bd133c 100644 --- a/codex-rs/tui/src/app/realtime_settings.rs +++ b/codex-rs/tui/src/app/realtime_settings.rs @@ -1,12 +1,14 @@ -//! Resolve and persist voice preferences through the owning server before updating the UI. +//! Persist server voice preferences and machine-local audio selections before updating the UI. use super::*; +use crate::legacy_core::config::edit::ConfigEdit; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::RequestId; use codex_app_server_protocol::ThreadRealtimeListVoicesParams; use codex_app_server_protocol::ThreadRealtimeListVoicesResponse; use codex_protocol::protocol::RealtimeVoice; use codex_protocol::protocol::RealtimeVoicesList; +use codex_realtime_webrtc::AudioDeviceKind; use uuid::Uuid; /// Unknown voices belong to newer servers; omit the override instead of blocking audio. @@ -29,6 +31,111 @@ fn configured_voice( } impl App { + pub(super) async fn persist_realtime_device( + &mut self, + kind: AudioDeviceKind, + name: Option, + ) { + let key = match kind { + AudioDeviceKind::Input => "microphone", + AudioDeviceKind::Output => "speaker", + }; + self.persist_realtime_audio(key, name.map(Into::into)).await; + self.list_realtime_devices(kind); + } + + async fn persist_realtime_audio(&mut self, key: &str, value: Option) { + // Audio runs on the TUI's machine, even when the app server is remote. + let segments = vec!["audio".to_string(), key.to_string()]; + let edits = vec![match &value { + Some(toml::Value::String(value)) => ConfigEdit::SetPath { + segments, + value: value.clone().into(), + }, + Some(_) => unreachable!("audio device settings are names"), + None => ConfigEdit::ClearPath { segments }, + }]; + if let Err(error) = + ConfigEditsBuilder::for_config_path(self.local_settings.user_config_path.as_path()) + .with_edits(edits) + .apply() + .await + { + self.chat_widget + .add_error_message(format!("Failed to save audio setting: {error}")); + return; + } + match crate::legacy_core::config::load_config_toml_with_layer_stack( + self.local_settings.codex_home.as_path(), + /*cwd*/ None, + self.cli_kv_overrides.clone(), + codex_config::ConfigLoadOptions { + loader_overrides: self.loader_overrides.clone(), + cloud_config_bundle: self.cloud_config_bundle.clone(), + ..Default::default() + }, + ) + .await + { + Ok(config) => { + self.config.config_layer_stack = self + .config + .config_layer_stack + .with_user_layer_from(&config.config_layer_stack); + let audio = config.config_toml.audio.unwrap_or_default(); + let effective = toml::Value::try_from(&audio) + .ok() + .and_then(|audio| audio.get(key).cloned()); + self.local_settings.audio = Ok(audio); + self.chat_widget.local_settings.audio = self.local_settings.audio.clone(); + if effective == value { + self.chat_widget.add_info_message( + "Audio setting saved. Applies to your next voice conversation.".to_string(), + /*hint*/ None, + ); + } else { + self.chat_widget.add_error_message( + "Audio setting was saved but is overridden by another configuration layer." + .to_string(), + ); + } + } + Err(error) => self.chat_widget.add_error_message(format!( + "Audio setting was saved, but effective settings could not be read: {error}" + )), + } + } + + pub(super) fn list_realtime_devices(&self, kind: AudioDeviceKind) { + let tx = self.app_event_tx.clone(); + let origin = self.active_thread_id; + tokio::spawn(async move { + let result = async { + let package = codex_install_context::InstallContext::current() + .package_layout + .as_ref() + .ok_or_else(|| anyhow::anyhow!("voice package unavailable"))?; + let mut host = codex_realtime_webrtc::VoiceHost::connect( + package, + codex_build_info::BuildInfo::get().build_commit(), + ) + .await?; + let result = host.list_devices(kind).await; + host.close().await?; + result + } + .await; + tx.send(AppEvent::RealtimeDevicesListed { + origin, + kind, + result: result.map_err(|_| { + "Could not list audio devices. Check your audio device and voice package." + .to_owned() + }), + }); + }); + } + pub(super) async fn realtime_voices( &self, app_server: &AppServerSession, @@ -63,7 +170,7 @@ impl App { .map(Option::flatten) } - pub(super) async fn open_realtime_settings(&mut self, app_server: &AppServerSession) { + pub(super) async fn open_realtime_voices(&mut self, app_server: &AppServerSession) { let voices = match self.realtime_voices(app_server).await { Ok(voices) => voices, Err(error) => { @@ -73,7 +180,7 @@ impl App { } }; match self.effective_realtime_voice(app_server, &voices).await { - Ok(voice) => self.chat_widget.open_realtime_settings(voice, voices), + Ok(voice) => self.chat_widget.open_realtime_voices(voice, voices), Err(error) => self .chat_widget .add_error_message(format!("Failed to read voice settings: {error}")), diff --git a/codex-rs/tui/src/app/tests/realtime_requests.rs b/codex-rs/tui/src/app/tests/realtime_requests.rs index 16c81ceecf88..57bcbf2ea6a5 100644 --- a/codex-rs/tui/src/app/tests/realtime_requests.rs +++ b/codex-rs/tui/src/app/tests/realtime_requests.rs @@ -7,6 +7,7 @@ use crate::app::tests::session_lifecycle_requests::start_recording_realtime_spee use crate::app::tests::session_lifecycle_requests::start_recording_remote_app_server; use crate::chatwidget::commit_realtime_history_events; use crate::chatwidget::tests::make_chatwidget_manual_with_sender; +use crate::local_settings::LocalSettings; use codex_app_server_protocol::ItemCompletedNotification; use codex_app_server_protocol::ItemStartedNotification; use codex_app_server_protocol::ServerNotification; @@ -1832,7 +1833,7 @@ async fn embedded_voice_settings_follow_project_after_thread_switch() -> Result< ), ); Box::pin(app.select_agent_thread(&mut tui, &mut server, thread_id)).await?; - app.open_realtime_settings(&server).await; + app.open_realtime_voices(&server).await; let popup = crate::chatwidget::tests::helpers::render_bottom_popup( &app.chat_widget, /*width*/ 80, @@ -1872,7 +1873,7 @@ async fn remote_voice_picker_reads_server_preference() -> Result<()> { app.chat_widget .set_realtime_voice(Some(codex_protocol::protocol::RealtimeVoice::Maple)); let (server, requests, proxy) = start_recording_remote_app_server(&app.config).await?; - app.open_realtime_settings(&server).await; + app.open_realtime_voices(&server).await; assert_eq!( recorded_params(&requests, "thread/realtime/listVoices").len(), 1 @@ -1906,7 +1907,7 @@ async fn remote_voice_catalog_success_and_failure() -> Result<()> { ) .await?; while events.try_recv().is_ok() {} - app.open_realtime_settings(&server).await; + app.open_realtime_voices(&server).await; let popup = crate::chatwidget::tests::helpers::render_bottom_popup( &app.chat_widget, /*width*/ 80, @@ -2078,3 +2079,123 @@ async fn overridden_voice_save_keeps_effective_voice() -> Result<()> { } Ok(()) } + +#[tokio::test] +async fn audio_devices_are_persisted() -> Result<()> { + use codex_realtime_webrtc::AudioDeviceKind; + let mut app = make_test_app().await; + app.persist_realtime_device(AudioDeviceKind::Output, Some("Headphones".into())) + .await; + app.persist_realtime_device(AudioDeviceKind::Input, Some("Interface".into())) + .await; + let expected = codex_config::config_toml::RealtimeAudioToml { + microphone: Some("Interface".into()), + speaker: Some("Headphones".into()), + }; + assert_eq!(app.local_settings.audio.as_ref().unwrap(), &expected); + assert_eq!(LocalSettings::from(&app.config).audio, Ok(expected)); + app.persist_realtime_device(AudioDeviceKind::Input, /*name*/ None) + .await; + app.persist_realtime_device(AudioDeviceKind::Output, /*name*/ None) + .await; + assert_eq!(app.local_settings.audio, Ok(Default::default())); + assert_eq!( + app.chat_widget.local_settings.audio, + app.local_settings.audio + ); + Ok(()) +} + +#[tokio::test] +async fn audio_device_is_machine_local_across_project_and_remote_transitions() -> Result<()> { + let mut app = make_test_app().await; + let project = tempfile::tempdir()?; + let remote = tempfile::tempdir()?; + std::fs::create_dir_all(project.path().join(".codex"))?; + std::fs::write( + project.path().join(".codex/config.toml"), + "default_permissions = \"work\"\n[audio]\nmicrophone = \"Project mic\"\n[permissions.work]\nextends = \":workspace\"\n", + )?; + crate::legacy_core::config::set_project_trust_level( + &app.config.codex_home, + project.path(), + codex_protocol::config_types::TrustLevel::Trusted, + ) + .map_err(|error| color_eyre::eyre::eyre!(error.to_string()))?; + app.cli_kv_overrides = vec![("default_permissions".into(), "work".into())]; + app.config = app.rebuild_config_for_cwd(project.path().into()).await?; + app.app_server_target = AppServerTarget::Remote { + endpoint: crate::resolve_remote_addr("ws://127.0.0.1:9")?, + }; + app.chat_widget + .handle_thread_session_quiet(test_thread_session( + ThreadId::new(), + remote.path().to_path_buf(), + )); + app.persist_realtime_device( + codex_realtime_webrtc::AudioDeviceKind::Input, + Some("Machine mic".into()), + ) + .await; + app.cli_kv_overrides.clear(); + assert_eq!( + LocalSettings::from(&app.config).audio, + app.local_settings.audio + ); + for cwd in [project.path(), remote.path()] { + let config = app.rebuild_config_for_cwd(cwd.to_path_buf()).await?; + let reloaded = app.local_settings.reloaded(&config); + assert_eq!(reloaded.audio, app.chat_widget.local_settings.audio); + assert_eq!( + reloaded.audio.as_ref().unwrap().microphone.as_deref(), + Some("Machine mic") + ); + } + // A project value must not hide invalid machine audio. + std::fs::write( + app.local_settings.user_config_path.as_path(), + std::fs::read_to_string(app.local_settings.user_config_path.as_path())? + .replace("microphone = \"Machine mic\"", "microphone = 0"), + )?; + let config = app + .rebuild_config_for_cwd(project.path().to_path_buf()) + .await?; + app.chat_widget.local_settings = app.local_settings.reloaded(&config); + assert!(app.chat_widget.local_settings.audio.is_err()); + app.chat_widget.open_realtime_sound_devices(); + assert!(!app.chat_widget.has_active_view()); + + Ok(()) +} + +#[tokio::test] +async fn microphone_discovery_ignores_another_threads_completion() -> Result<()> { + let (mut app, _events, _ops) = make_test_app_with_channels().await; + let (mut server, _requests, proxy) = start_recording_remote_app_server(&app.config).await?; + let mut tui = crate::tui::test_support::make_test_tui()?; + app.active_thread_id = Some(ThreadId::new()); + for origin in [Some(ThreadId::new()), app.active_thread_id] { + let result = Ok(vec![codex_realtime_webrtc::AudioDevice { + name: "Interface".into(), + channels: 16, + is_default: true, + }]); + Box::pin(app.handle_event( + &mut tui, + &mut server, + AppEvent::RealtimeDevicesListed { + origin, + kind: codex_realtime_webrtc::AudioDeviceKind::Input, + result, + }, + )) + .await?; + assert_eq!( + app.chat_widget.has_active_view(), + origin == app.active_thread_id + ); + } + server.shutdown().await?; + proxy.await??; + Ok(()) +} diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__remote_voice_picker_server_default.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__remote_voice_picker_server_default.snap index 7c6af54461a0..b4792ba8f45b 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__remote_voice_picker_server_default.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__remote_voice_picker_server_default.snap @@ -9,5 +9,6 @@ expression: popup › 1. maple (current) 2. cove 3. juniper + 4. Back enter select · esc back diff --git a/codex-rs/tui/src/app_event.rs b/codex-rs/tui/src/app_event.rs index 9e3a2beb7545..dfedc7973384 100644 --- a/codex-rs/tui/src/app_event.rs +++ b/codex-rs/tui/src/app_event.rs @@ -1220,6 +1220,20 @@ pub(crate) enum AppEvent { /// Read the owning server preference before showing the voice picker. OpenRealtimeSettings, + OpenRealtimeSoundDevices, + OpenRealtimeVoices, + OpenRealtimeDevicePicker { + kind: codex_realtime_webrtc::AudioDeviceKind, + }, + RealtimeDevicesListed { + origin: Option, + kind: codex_realtime_webrtc::AudioDeviceKind, + result: Result, String>, + }, + PersistRealtimeDevice { + kind: codex_realtime_webrtc::AudioDeviceKind, + name: Option, + }, /// Save the voice for subsequent conversations through the app server. PersistRealtimeVoiceSelection { diff --git a/codex-rs/tui/src/chatwidget/realtime.rs b/codex-rs/tui/src/chatwidget/realtime.rs index ccda3290f413..95e4c90cfba2 100644 --- a/codex-rs/tui/src/chatwidget/realtime.rs +++ b/codex-rs/tui/src/chatwidget/realtime.rs @@ -312,6 +312,9 @@ impl ChatWidget { } fn start_realtime_conversation(&mut self, thread_id: ThreadId) { + let Some(audio) = self.realtime_audio_settings() else { + return; + }; self.realtime_conversation.recover_late_transcripts = false; self.realtime_conversation.attempt_id = NEXT_REALTIME_ATTEMPT_ID.fetch_add(1, Ordering::Relaxed); @@ -322,9 +325,13 @@ impl ChatWidget { self.realtime_conversation.phase = RealtimeConversationPhase::Starting; self.update_realtime_footer(); let app_event_tx = self.app_event_tx.clone(); + let selection = codex_realtime_webrtc::AudioDeviceSelection { + microphone: audio.microphone, + speaker: audio.speaker, + }; std::thread::spawn(move || { - let result = - RealtimeWebrtcSession::start(abort_registration).map_err(|error| error.to_string()); + let result = RealtimeWebrtcSession::start(abort_registration, selection) + .map_err(|error| error.to_string()); app_event_tx.send(AppEvent::RealtimeWebrtcOfferCreated { thread_id, attempt_id, diff --git a/codex-rs/tui/src/chatwidget/realtime_settings.rs b/codex-rs/tui/src/chatwidget/realtime_settings.rs index 3057764af5a7..e0ff65679135 100644 --- a/codex-rs/tui/src/chatwidget/realtime_settings.rs +++ b/codex-rs/tui/src/chatwidget/realtime_settings.rs @@ -1,17 +1,62 @@ -//! Voice selection for subsequent conversations; saving never interrupts live audio. +//! Voice settings hierarchy with parent navigation; selections apply to subsequent conversations. use super::*; use codex_protocol::protocol::RealtimeVoice; use codex_protocol::protocol::RealtimeVoicesList; +use codex_realtime_webrtc::AudioDevice; +use codex_realtime_webrtc::AudioDeviceKind; + +fn back_item(parent: fn() -> AppEvent) -> SelectionItem { + SelectionItem { + name: "Back".to_string(), + actions: vec![Box::new(move |tx| tx.send(parent()))], + dismiss_on_select: true, + ..Default::default() + } +} impl ChatWidget { - pub(crate) fn open_realtime_settings( + pub(super) fn realtime_audio_settings( + &mut self, + ) -> Option { + match self.local_settings.audio.clone() { + Ok(audio) => Some(audio), + Err(error) => { + self.add_error_message(error); + None + } + } + } + + pub(crate) fn open_realtime_settings(&mut self) { + self.bottom_pane.show_selection_view(SelectionViewParams { + title: Some("Voice settings".to_string()), + items: vec![ + SelectionItem { + name: "Set sound devices".to_string(), + actions: vec![Box::new(|tx| tx.send(AppEvent::OpenRealtimeSoundDevices))], + dismiss_on_select: true, + ..Default::default() + }, + SelectionItem { + name: "Choose a voice".to_string(), + actions: vec![Box::new(|tx| tx.send(AppEvent::OpenRealtimeVoices))], + dismiss_on_select: true, + ..Default::default() + }, + ], + footer_hint: Some(standard_popup_hint_line()), + ..SelectionViewParams::picker() + }); + } + + pub(crate) fn open_realtime_voices( &mut self, current: Option, voices: RealtimeVoicesList, ) { // The TUI uses V3, which shares the V1 voice catalog. - let items = voices + let mut items: Vec = voices .v1 .into_iter() .map(|voice| SelectionItem { @@ -24,11 +69,101 @@ impl ChatWidget { ..Default::default() }) .collect(); + items.push(back_item(|| AppEvent::OpenRealtimeSettings)); self.bottom_pane.show_selection_view(SelectionViewParams { title: Some("Select voice".to_string()), subtitle: Some("Applies to your next voice conversation.".to_string()), footer_hint: Some(standard_popup_hint_line()), items, + on_cancel: Some(Box::new(|tx| tx.send(AppEvent::OpenRealtimeSettings))), + ..SelectionViewParams::picker() + }); + } + + pub(crate) fn open_realtime_sound_devices(&mut self) { + let Some(audio) = self.realtime_audio_settings() else { + return; + }; + let mut items = Vec::new(); + for (kind, label, selected) in [ + (AudioDeviceKind::Input, "Input device", audio.microphone), + (AudioDeviceKind::Output, "Output device", audio.speaker), + ] { + items.push(SelectionItem { + name: label.into(), + description: Some(selected.unwrap_or_else(|| "System default".into())), + actions: vec![Box::new(move |tx| { + tx.send(AppEvent::OpenRealtimeDevicePicker { kind }) + })], + dismiss_on_select: true, + ..Default::default() + }); + } + items.push(back_item(|| AppEvent::OpenRealtimeSettings)); + self.bottom_pane.show_selection_view(SelectionViewParams { + title: Some("Sound devices".to_string()), + subtitle: Some("Applies to your next voice conversation.".into()), + footer_hint: Some(standard_popup_hint_line()), + items, + on_cancel: Some(Box::new(|tx| tx.send(AppEvent::OpenRealtimeSettings))), + ..SelectionViewParams::picker() + }); + } + + pub(crate) fn open_realtime_device_picker( + &mut self, + kind: AudioDeviceKind, + devices: Vec, + ) { + let Some(audio) = self.realtime_audio_settings() else { + return; + }; + let (title, current) = match kind { + AudioDeviceKind::Input => ("Input device", audio.microphone), + AudioDeviceKind::Output => ("Output device", audio.speaker), + }; + let ambiguous: std::collections::HashSet<_> = devices + .iter() + .filter(|device| { + devices + .iter() + .filter(|other| other.name == device.name) + .count() + > 1 + }) + .map(|device| device.name.clone()) + .collect(); + let mut items: Vec = std::iter::once(/*value*/ None) + .chain(devices.into_iter().map(Some)) + .map(|device| { + let name = device.map(|device| device.name); + let is_current = name == current; + let disabled_reason = name + .as_ref() + .filter(|name| ambiguous.contains(*name)) + .map(|_| "Identical device names; use System default.".into()); + SelectionItem { + name: name.clone().unwrap_or_else(|| "System default".into()), + is_current, + disabled_reason, + actions: vec![Box::new(move |tx| { + tx.send(AppEvent::PersistRealtimeDevice { + kind, + name: name.clone(), + }) + })], + dismiss_on_select: true, + ..Default::default() + } + }) + .collect(); + items.push(back_item(|| AppEvent::OpenRealtimeSoundDevices)); + self.bottom_pane.show_selection_view(SelectionViewParams { + title: Some(title.into()), + subtitle: Some("Applies to your next voice conversation.".into()), + items, + footer_hint: Some(standard_popup_hint_line()), + on_cancel: Some(Box::new(|tx| tx.send(AppEvent::OpenRealtimeSoundDevices))), ..SelectionViewParams::picker() }); } diff --git a/codex-rs/tui/src/chatwidget/realtime_settings_tests.rs b/codex-rs/tui/src/chatwidget/realtime_settings_tests.rs index 84657da2bd55..846b0f693415 100644 --- a/codex-rs/tui/src/chatwidget/realtime_settings_tests.rs +++ b/codex-rs/tui/src/chatwidget/realtime_settings_tests.rs @@ -1,4 +1,4 @@ -//! Voice picker rendering and selection routing without audio hardware. +//! Voice settings hierarchy, parent navigation and selection routing without audio hardware. use super::*; use crate::chatwidget::tests::make_chatwidget_manual_with_sender; @@ -21,8 +21,18 @@ async fn voice_settings_selects_a_voice_without_starting_audio() { std::iter::from_fn(|| events.try_recv().ok()) .any(|event| matches!(event, AppEvent::OpenRealtimeSettings)) ); - chat.open_realtime_settings(Some(RealtimeVoice::Maple), RealtimeVoicesList::builtin()); + chat.open_realtime_settings(); insta::assert_snapshot!("voice_settings", render_bottom_popup(&chat, /*width*/ 80)); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Down, KeyModifiers::NONE)); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); + assert!( + std::iter::from_fn(|| events.try_recv().ok()) + .any(|event| matches!(event, AppEvent::OpenRealtimeVoices)) + ); + chat.open_realtime_voices(Some(RealtimeVoice::Maple), RealtimeVoicesList::builtin()); + insta::assert_snapshot!("voice_choices", render_bottom_popup(&chat, /*width*/ 80)); chat.bottom_pane .handle_key_event(KeyEvent::new(KeyCode::Home, KeyModifiers::NONE)); chat.bottom_pane @@ -57,7 +67,7 @@ async fn saved_voice_confirmation_snapshot() { #[tokio::test] async fn voice_settings_uses_server_catalog() { let (mut chat, _sender, _events, _ops) = make_chatwidget_manual_with_sender().await; - chat.open_realtime_settings( + chat.open_realtime_voices( Some(RealtimeVoice::Cove), RealtimeVoicesList { v1: vec![RealtimeVoice::Cove, RealtimeVoice::Maple], @@ -69,3 +79,148 @@ async fn voice_settings_uses_server_catalog() { render_bottom_popup(&chat, /*width*/ 80) ); } + +#[tokio::test] +async fn sound_devices_picker_routes_selection_without_starting_audio() { + let (mut chat, _sender, mut events, mut ops) = make_chatwidget_manual_with_sender().await; + chat.local_settings.audio.as_mut().unwrap().microphone = + Some("Zen Go Synergy Core Playback".to_string()); + chat.open_realtime_settings(); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); + assert!( + std::iter::from_fn(|| events.try_recv().ok()) + .any(|event| matches!(event, AppEvent::OpenRealtimeSoundDevices)) + ); + chat.open_realtime_sound_devices(); + insta::assert_snapshot!( + "voice_settings_input_channel", + render_bottom_popup(&chat, /*width*/ 90) + ); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Home, KeyModifiers::NONE)); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); + assert!( + std::iter::from_fn(|| events.try_recv().ok()).any(|event| matches!( + event, + AppEvent::OpenRealtimeDevicePicker { + kind: AudioDeviceKind::Input + } + )) + ); + assert!(ops.try_recv().is_err()); + assert!(!chat.realtime_conversation_is_running()); +} + +#[tokio::test] +async fn submenus_return_to_their_parent_with_back_or_escape() { + let (mut chat, _sender, mut events, mut ops) = make_chatwidget_manual_with_sender().await; + type OpenMenu = fn(&mut ChatWidget); + let menus: [OpenMenu; 2] = [ + |chat| chat.open_realtime_voices(/*current*/ None, RealtimeVoicesList::builtin()), + ChatWidget::open_realtime_sound_devices, + ]; + for open in menus { + for key in [KeyCode::Esc, KeyCode::Enter] { + while events.try_recv().is_ok() {} + open(&mut chat); + if key == KeyCode::Enter { + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::End, KeyModifiers::NONE)); + } + chat.bottom_pane + .handle_key_event(KeyEvent::new(key, KeyModifiers::NONE)); + assert!( + std::iter::from_fn(|| events.try_recv().ok()) + .any(|event| matches!(event, AppEvent::OpenRealtimeSettings)) + ); + } + } + assert!(ops.try_recv().is_err()); + assert!(!chat.realtime_conversation_is_running()); +} + +#[tokio::test] +async fn device_pickers_route_selection() { + let (mut chat, _sender, mut events, mut ops) = make_chatwidget_manual_with_sender().await; + for (kind, channels, microphone, snapshot) in [ + ( + AudioDeviceKind::Input, + 2, + None, + "voice_stereo_input_devices", + ), + ( + AudioDeviceKind::Input, + 4, + None, + "voice_multichannel_input_devices", + ), + ( + AudioDeviceKind::Input, + 4, + Some("Audio interface".into()), + "voice_multichannel_selected_input_devices", + ), + (AudioDeviceKind::Output, 4, None, "voice_output_devices"), + ] { + chat.local_settings.audio.as_mut().unwrap().microphone = microphone; + let device = AudioDevice { + name: "Audio interface".into(), + channels, + is_default: true, + }; + let devices = vec![ + device.clone(), + AudioDevice { + name: "Other device".into(), + channels: 2, + is_default: false, + }, + ]; + chat.open_realtime_device_picker(kind, devices.clone()); + insta::assert_snapshot!(snapshot, render_bottom_popup(&chat, /*width*/ 80)); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Char('2'), KeyModifiers::NONE)); + let selected = + std::iter::from_fn(|| events.try_recv().ok()).find_map(|event| match event { + AppEvent::PersistRealtimeDevice { kind, name } => Some((kind, name)), + _ => None, + }); + assert_eq!(selected, Some((kind, Some(device.name.clone())))); + chat.open_realtime_device_picker(kind, devices); + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Char('4'), KeyModifiers::NONE)); + assert!( + std::iter::from_fn(|| events.try_recv().ok()) + .any(|event| matches!(event, AppEvent::OpenRealtimeSoundDevices)) + ); + } + assert!(ops.try_recv().is_err()); + assert!(!chat.realtime_conversation_is_running()); +} + +#[tokio::test] +async fn ambiguous_device_names_cannot_select_the_wrong_device() { + let (mut chat, _sender, mut events, _ops) = make_chatwidget_manual_with_sender().await; + let devices = [2, 4] + .map(|channels| AudioDevice { + name: "USB microphone".into(), + channels, + is_default: false, + }) + .to_vec(); + chat.open_realtime_device_picker(AudioDeviceKind::Input, devices); + insta::assert_snapshot!( + "voice_ambiguous_input_devices", + render_bottom_popup(&chat, /*width*/ 80) + ); + while events.try_recv().is_ok() {} + chat.bottom_pane + .handle_key_event(KeyEvent::new(KeyCode::Char('2'), KeyModifiers::NONE)); + assert!( + !std::iter::from_fn(|| events.try_recv().ok()) + .any(|event| matches!(event, AppEvent::PersistRealtimeDevice { .. })) + ); +} diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_ambiguous_input_devices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_ambiguous_input_devices.snap new file mode 100644 index 000000000000..c6ca4fa34c94 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_ambiguous_input_devices.snap @@ -0,0 +1,14 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Input device + Applies to your next voice conversation. + + +› 1. System default (current) + USB microphone (disabled) Identical device names; use System default. + USB microphone (disabled) Identical device names; use System default. + 2. Back + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_choices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_choices.snap new file mode 100644 index 000000000000..531afad01ac5 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_choices.snap @@ -0,0 +1,18 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Select voice + Applies to your next voice conversation. + + + 1. juniper +› 2. maple (current) + 3. spruce + 4. ember + 5. vale + 6. breeze + 7. arbor + 8. sol +↓ + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_input_devices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_input_devices.snap new file mode 100644 index 000000000000..1ecf80725776 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_input_devices.snap @@ -0,0 +1,14 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Input device + Applies to your next voice conversation. + + +› 1. System default (current) + 2. Audio interface + 3. Other device + 4. Back + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_selected_input_devices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_selected_input_devices.snap new file mode 100644 index 000000000000..919bf1677947 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_multichannel_selected_input_devices.snap @@ -0,0 +1,14 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Input device + Applies to your next voice conversation. + + + 1. System default +› 2. Audio interface (current) + 3. Other device + 4. Back + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_output_devices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_output_devices.snap new file mode 100644 index 000000000000..4f820944cc1b --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_output_devices.snap @@ -0,0 +1,14 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Output device + Applies to your next voice conversation. + + +› 1. System default (current) + 2. Audio interface + 3. Other device + 4. Back + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings.snap index 531afad01ac5..f42fc409e2a1 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings.snap @@ -2,17 +2,10 @@ source: tui/src/chatwidget/realtime_settings_tests.rs expression: "render_bottom_popup(&chat, 80)" --- - Select voice - Applies to your next voice conversation. + Voice settings - 1. juniper -› 2. maple (current) - 3. spruce - 4. ember - 5. vale - 6. breeze - 7. arbor - 8. sol -↓ +› 1. Set sound devices + 2. Choose a voice + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_input_channel.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_input_channel.snap new file mode 100644 index 000000000000..b5c6594671a9 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_input_channel.snap @@ -0,0 +1,13 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 90)" +--- + Sound devices + Applies to your next voice conversation. + + +› 1. Input device Zen Go Synergy Core Playback + 2. Output device System default + 3. Back + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_server_catalog.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_server_catalog.snap index a78990f3dd17..938025893fd3 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_server_catalog.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_settings_server_catalog.snap @@ -8,5 +8,6 @@ expression: "render_bottom_popup(&chat, 80)" › 1. cove (current) 2. maple + 3. Back enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_stereo_input_devices.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_stereo_input_devices.snap new file mode 100644 index 000000000000..1ecf80725776 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__realtime_settings__tests__voice_stereo_input_devices.snap @@ -0,0 +1,14 @@ +--- +source: tui/src/chatwidget/realtime_settings_tests.rs +expression: "render_bottom_popup(&chat, 80)" +--- + Input device + Applies to your next voice conversation. + + +› 1. System default (current) + 2. Audio interface + 3. Other device + 4. Back + + enter select · esc back diff --git a/codex-rs/tui/src/local_settings.rs b/codex-rs/tui/src/local_settings.rs index 4eb78a510c34..8669f967505c 100644 --- a/codex-rs/tui/src/local_settings.rs +++ b/codex-rs/tui/src/local_settings.rs @@ -3,6 +3,7 @@ //! The resolved core config is a temporary input at local load/reload boundaries. Server thread //! responses must never refresh these values; live preference changes belong here. The remaining //! Config-based lifecycle adapters also use this conversion until their interfaces are migrated. +//! Audio preferences exclude project layers so thread cwd cannot route local capture. //! Effective animations also respect the TUI host's launch-time accessibility preference. //! The selected transcript ownership and alternate-screen restrictions survive local reloads. @@ -20,6 +21,7 @@ use codex_utils_absolute_path::AbsolutePathBuf; #[derive(Clone, Debug, PartialEq)] pub(crate) struct LocalSettings { + pub(crate) audio: Result, pub(crate) tui: Tui, pub(crate) transcript_mode: TranscriptMode, pub(crate) history: History, @@ -56,7 +58,18 @@ impl LocalSettings { } else { config.animations }; + let mut audio = toml::Value::Table(Default::default()); + for layer in config.config_layer_stack.layers_low_to_high() { + if !matches!(layer.name, codex_config::ConfigLayerSource::Project { .. }) + && let Some(value) = layer.config.get("audio") + { + codex_config::merge_toml_values(&mut audio, value); + } + } Self { + audio: audio.try_into().map_err(|error: toml::de::Error| { + format!("Invalid machine audio settings: {error}") + }), transcript_mode: TranscriptMode::resolve( config.tui_fullscreen_transcript, config.tui_alternate_screen != codex_config::types::AltScreenMode::Never, diff --git a/codex-rs/voice-host/src/devices.rs b/codex-rs/voice-host/src/devices.rs index a26e4aa7d57c..4d5a88c0c265 100644 --- a/codex-rs/voice-host/src/devices.rs +++ b/codex-rs/voice-host/src/devices.rs @@ -23,6 +23,7 @@ use std::sync::atomic::Ordering; use std::time::Duration; use std::time::Instant; +use codex_realtime_webrtc::AudioDeviceKind; use cpal::FromSample; use cpal::Sample; use cpal::SampleFormat; @@ -41,6 +42,77 @@ use buffers::Playback; use buffers::QUEUE_CAPACITY; use playback::PlaybackPort; +fn device( + host: &cpal::Host, + kind: AudioDeviceKind, + name: Option<&str>, +) -> io::Result { + let selected = match (kind, name) { + (AudioDeviceKind::Input, None) => host.default_input_device(), + (AudioDeviceKind::Output, None) => host.default_output_device(), + (kind, Some(name)) => { + let devices = match kind { + AudioDeviceKind::Input => host.input_devices(), + AudioDeviceKind::Output => host.output_devices(), + } + .map_err(io::Error::other)?; + eligible_devices(devices, |device| device_description(device, kind)) + .find(|(_, candidate, _)| candidate == name) + .map(|(device, _, _)| device) + } + }; + selected.ok_or_else(|| io::Error::other("selected audio device unavailable")) +} + +pub(super) fn list_devices( + kind: AudioDeviceKind, +) -> io::Result> { + let host = cpal::default_host(); + let default_id = device(&host, kind, /*name*/ None) + .ok() + .and_then(|device| device.id().ok()); + let devices = match kind { + AudioDeviceKind::Input => host.input_devices(), + AudioDeviceKind::Output => host.output_devices(), + } + .map_err(io::Error::other)?; + Ok( + eligible_devices(devices, |device| device_description(device, kind)) + .map( + |(device, name, channels)| codex_realtime_webrtc::AudioDevice { + name, + channels, + is_default: default_id.is_some() && device.id().ok() == default_id, + }, + ) + .collect(), + ) +} + +fn device_description( + device: &cpal::Device, + kind: AudioDeviceKind, +) -> Option<(String, cpal::SupportedStreamConfig)> { + let config = match kind { + AudioDeviceKind::Input => device.default_input_config(), + AudioDeviceKind::Output => device.default_output_config(), + } + .ok()?; + Some((device.description().ok()?.name().to_owned(), config)) +} + +// Listing and named startup must agree on which endpoints can be selected. +fn eligible_devices( + devices: impl Iterator, + mut describe: impl FnMut(&D) -> Option<(String, cpal::SupportedStreamConfig)>, +) -> impl Iterator { + devices.take(/*n*/ 64).filter_map(move |device| { + let (name, config) = describe(&device)?; + bounded_stream_config(&config).ok()?; + (name.chars().count() <= 256).then(|| (device, name, config.channels())) + }) +} + const MAX_CAPTURE_AGE: Duration = Duration::from_secs(/*secs*/ 1); pub(super) struct Devices { @@ -76,14 +148,14 @@ impl Devices { self.worker.buffers.take_state() } - pub(super) fn open() -> io::Result { + pub(super) fn open(selection: codex_realtime_webrtc::AudioDeviceSelection) -> io::Result { let host = cpal::default_host(); - let input = host - .default_input_device() - .ok_or_else(|| io::Error::other("microphone unavailable"))?; - let output = host - .default_output_device() - .ok_or_else(|| io::Error::other("speaker unavailable"))?; + let input = device( + &host, + AudioDeviceKind::Input, + selection.microphone.as_deref(), + )?; + let output = device(&host, AudioDeviceKind::Output, selection.speaker.as_deref())?; let input_config = input .default_input_config() .map_err(|_| io::Error::other("microphone configuration unavailable"))?; diff --git a/codex-rs/voice-host/src/devices_tests.rs b/codex-rs/voice-host/src/devices_tests.rs index e9f7b40dab41..ac1e1c9e4775 100644 --- a/codex-rs/voice-host/src/devices_tests.rs +++ b/codex-rs/voice-host/src/devices_tests.rs @@ -423,3 +423,36 @@ fn stream_xruns_recover_without_clearing_device_failure() { handle_stream_error(&buffers, cpal::ErrorKind::Xrun.into()); assert!(buffers.failed.load(Ordering::Acquire)); } + +#[test] +fn named_startup_skips_same_name_devices_omitted_from_discovery() { + let name = "USB interface"; + let supported = |channels| { + cpal::SupportedStreamConfig::new( + channels, + /*sample_rate*/ 48_000, + cpal::SupportedBufferSize::Range { min: 1, max: 4_096 }, + cpal::SampleFormat::F32, + ) + }; + // A missing default configuration and a configuration outside our bounds + // must not shadow the later selectable endpoint with the same name. + let descriptions = [None, Some(supported(64)), Some(supported(2))]; + let candidates = || { + eligible_devices(0..descriptions.len(), |index| { + descriptions[*index].map(|config| (name.into(), config)) + }) + }; + assert_eq!( + candidates().collect::>(), + vec![(2, name.to_string(), 2)] + ); + assert_eq!( + candidates().find(|(_, candidate, _)| candidate == name), + Some((2, name.to_string(), 2)) + ); + assert_eq!( + candidates().find(|(_, candidate, _)| candidate == "Unavailable"), + None + ); +} diff --git a/codex-rs/voice-host/src/devices_unavailable.rs b/codex-rs/voice-host/src/devices_unavailable.rs index 03af795eb185..238b5f385e52 100644 --- a/codex-rs/voice-host/src/devices_unavailable.rs +++ b/codex-rs/voice-host/src/devices_unavailable.rs @@ -2,31 +2,39 @@ use std::io; +pub(super) fn list_devices( + _: codex_realtime_webrtc::AudioDeviceKind, +) -> io::Result> { + Err(io::Error::other( + "audio devices unavailable for this helper target", + )) +} + pub(super) struct Devices; impl Devices { pub(super) fn receive(&self, _: crate::incoming::ReceivedRtp) -> io::Result<()> { - Self::open().map(|_| ()) + Self::open(Default::default()).map(|_| ()) } pub(super) fn take_state(&self) -> io::Result { - Self::open().map(|_| codex_realtime_webrtc::AudioState::default()) + Self::open(Default::default()).map(|_| codex_realtime_webrtc::AudioState::default()) } - pub(super) fn open() -> io::Result { + pub(super) fn open(_: codex_realtime_webrtc::AudioDeviceSelection) -> io::Result { Err(io::Error::other( "audio devices unavailable for this helper target", )) } pub(super) fn set_controls(&self, _: codex_realtime_webrtc::AudioControls) -> io::Result<()> { - Self::open().map(|_| ()) + Self::open(Default::default()).map(|_| ()) } pub(super) async fn service( &mut self, _: &mut crate::audio_track::AudioTrack, ) -> io::Result { - Self::open().map(|_| 0) + Self::open(Default::default()).map(|_| 0) } } diff --git a/codex-rs/voice-host/src/main.rs b/codex-rs/voice-host/src/main.rs index 709521aa0e1e..cd40fddf562f 100644 --- a/codex-rs/voice-host/src/main.rs +++ b/codex-rs/voice-host/src/main.rs @@ -168,9 +168,14 @@ fn run( .unwrap_or_default(), } } - Ok(Message::OpenDevices {}) if devices.is_none() && runtime.is_some() && answered => { + Ok(Message::ListDevices { kind }) => Message::DeviceList { + devices: devices::list_devices(kind)?, + }, + Ok(Message::OpenDevices { selection }) + if devices.is_none() && runtime.is_some() && answered => + { phase.set(HelperExitStage::OpenDevices); - devices = Some(devices::Devices::open()?); + devices = Some(devices::Devices::open(selection)?); Message::DevicesOpened {} } Ok(Message::SetAudioControls { controls }) => { @@ -248,7 +253,8 @@ fn run( | Message::Offer { .. } | Message::TransportReady {} | Message::TransportTimedOut {} - | Message::OpenDevices {} + | Message::DeviceList { .. } + | Message::OpenDevices { .. } | Message::DevicesOpened {} | Message::AudioControlsApplied {} | Message::AudioState { .. } From 6ba4bf9e647cf8bc17eb9005af5ca9498bd7e654 Mon Sep 17 00:00:00 2001 From: "Adam Perry @ OpenAI" Date: Wed, 30 Sep 2026 02:01:14 +0000 Subject: [PATCH 02/11] Honor server retry advice across Responses retries and fallback (#49441) ## Why Responses overload and exhausted-request errors could terminate despite server retry advice, and WebSocket-to-HTTP fallback could issue a request before the advised deadline. ## What changed - Allow `ServerOverloaded` and `RetryLimit` errors to retry when server advice is present, within the configured retry budgets. - Preserve `Retry-After` headers from rejected WebSocket upgrades and wait for the server deadline before falling back to HTTP. - Keep quota, usage-limit, and policy failures terminal even when they include retry advice. ## Testing Add coverage for HTTP overload and rate-limit recovery, WebSocket upgrade rejection and fallback timing, retry deadline preservation through error mapping, and retry limits for sampling and manual and automatic compaction. GitOrigin-RevId: 72d30a9f078652664754dfa971fd7dc7a78f20e8 --- codex-rs/codex-api/src/api_bridge_tests.rs | 50 +++++ .../src/endpoint/responses_websocket.rs | 4 +- codex-rs/core/src/responses_retry.rs | 6 +- codex-rs/core/tests/suite/compact.rs | 188 ++++++++++++++++ codex-rs/core/tests/suite/retry_after.rs | 207 ++++++++++++++++-- codex-rs/protocol/src/error.rs | 5 +- 6 files changed, 434 insertions(+), 26 deletions(-) diff --git a/codex-rs/codex-api/src/api_bridge_tests.rs b/codex-rs/codex-api/src/api_bridge_tests.rs index 56c4838ef670..9c4cd1be080d 100644 --- a/codex-rs/codex-api/src/api_bridge_tests.rs +++ b/codex-rs/codex-api/src/api_bridge_tests.rs @@ -74,6 +74,56 @@ async fn map_api_error_preserves_retry_delay() { } } +/// Mapping a new error category preserves elapsed advice without making hard failures retryable. +#[tokio::test(start_paused = true)] +async fn http_retry_deadline_survives_mapping_and_respects_terminal_errors() { + use std::time::Duration; + + let advice = RetryAfter::from_delay(Duration::from_secs(10)).expect("retry advice"); + tokio::time::advance(Duration::from_secs(4)).await; + for (status, code, retryable) in [ + (503, "server_is_overloaded", true), + (429, "rate_limit_exceeded", true), + (429, "insufficient_quota", false), + (429, "usage_limit_reached", false), + (400, "cyber_policy", false), + ] { + let error = map_api_error(ApiError::Transport(TransportError::Http { + status: http::StatusCode::from_u16(status).unwrap(), + url: None, + headers: None, + body: Some(serde_json::json!({"error": {"type": code, "code": code, "message": "sensitive upstream detail"}}).to_string()), + retry_after: Some(advice), + })); + assert_eq!( + (error.retry_after(), error.server_retry_delay()), + (Some(advice), Some(Duration::from_secs(6))), + "{code}", + ); + assert_eq!( + error.retry_delay(/*retry_count*/ 1), + retryable.then_some(Duration::from_secs(6)), + "{code}", + ); + if status == 429 && retryable { + assert_eq!( + ( + error.to_codex_protocol_error(), + error.http_status_code_value(), + error.to_string() + ), + ( + CodexErrorInfo::ResponseTooManyFailedAttempts { + http_status_code: Some(429), + }, + Some(429), + "exceeded retry limit, last status: 429 Too Many Requests".to_string(), + ), + ); + } + } +} + #[test] fn map_api_error_distinguishes_capacity_from_slow_down() { for (code, expected, retryable) in [ diff --git a/codex-rs/codex-api/src/endpoint/responses_websocket.rs b/codex-rs/codex-api/src/endpoint/responses_websocket.rs index 7f3ebd7aac30..b4463500b997 100644 --- a/codex-rs/codex-api/src/endpoint/responses_websocket.rs +++ b/codex-rs/codex-api/src/endpoint/responses_websocket.rs @@ -14,6 +14,7 @@ use crate::sse::process_responses_event; use crate::telemetry::WebsocketTelemetry; use codex_client::TransportError; use codex_http_client::HttpClientFactory; +use codex_http_client::RetryAfter; use codex_websocket_client::WebSocketConnection; use codex_websocket_client::WebSocketConnector; use futures::FutureExt; @@ -570,6 +571,7 @@ fn map_ws_error(err: WsError, url: &Url) -> ApiError { WsError::Http(response) => { let status = response.status(); let headers = response.headers().clone(); + let retry_after = RetryAfter::from_headers(&headers); let body = response .body() .as_ref() @@ -579,7 +581,7 @@ fn map_ws_error(err: WsError, url: &Url) -> ApiError { url: Some(url.to_string()), headers: Some(headers), body, - retry_after: None, + retry_after, }) } WsError::ConnectionClosed | WsError::AlreadyClosed => { diff --git a/codex-rs/core/src/responses_retry.rs b/codex-rs/core/src/responses_retry.rs index c8edc8b9d4fb..048a68bfc9bc 100644 --- a/codex-rs/core/src/responses_retry.rs +++ b/codex-rs/core/src/responses_retry.rs @@ -1,5 +1,6 @@ //! Shared retry and transport fallback decisions for Responses requests. //! Content-filter guidance is recorded for sampling requests before retry decisions. +//! Server advice controls timing without extending configured retry limits. use std::time::Duration; @@ -116,13 +117,16 @@ pub(crate) async fn handle_response_stream_error( return Ok(()); } - // TODO(anp): Respect server retry advice before issuing the fallback HTTP request. if retry_state.retries >= max_retries && client_session.try_switch_fallback_transport( &turn_context.session_telemetry, turn_context.model_info(), ) { + // Changing transport must not bypass the server's retry deadline. + if let Some(retry_after) = retry_after { + tokio::time::sleep_until(retry_after.deadline()).await; + } sess.send_event( turn_context, EventMsg::Warning(WarningEvent { diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 7455ff786f03..2dced3650df9 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -23,6 +23,7 @@ use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelServiceTier; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HookEventName; use codex_protocol::protocol::HookRunStatus; @@ -3074,6 +3075,193 @@ async fn pre_sampling_compact_falls_back_after_previous_model_stream_retries_are ); } +/// Both compaction models keep the configured retry budget when the server supplies advice, +/// including the selected model's final attempt. +#[test_case::test_case(2; "selected_model_recovers")] +#[test_case::test_case(3; "selected_model_exhausts_retries")] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn pre_sampling_compact_advised_errors_fall_back_then_retry_on_selected_model( + selected_model_failures: usize, +) { + skip_if_no_network!(); + + let server = MockServer::start().await; + let previous_model = "gpt-5.4"; + let selected_model = "gpt-5.2"; + let _models_mock = mount_models_once( + &server, + ModelsResponse { + models: vec![ + model_info_with_context_window(previous_model, /*context_window*/ 273_000), + model_info_with_context_window(selected_model, /*context_window*/ 125_000), + ], + }, + ) + .await; + let overload = wiremock::ResponseTemplate::new(/*s*/ 503) + .insert_header("Retry-After", "0") + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })); + let mut responses = vec![ + sse_response(sse(vec![ + ev_assistant_message("m1", "before switch"), + ev_completed_with_tokens("r1", /*total_tokens*/ 120_000), + ])), + overload.clone(), // Old model: initial attempt and two retries. + overload.clone(), + overload.clone(), + ]; + responses.extend(vec![overload; selected_model_failures]); + if selected_model_failures < 3 { + responses.extend([ + sse_response(remote_v2_compaction_response()), + sse_response(sse(vec![ + ev_assistant_message("m3", "after switch"), + ev_completed_with_tokens("r3", /*total_tokens*/ 100), + ])), + ]); + } + let request_log = mount_response_sequence(&server, responses).await; + let mut model_provider = openai_model_provider(&server); + model_provider.request_max_retries = Some(0); + model_provider.stream_max_retries = Some(2); + let test = test_codex() + .with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()) + .with_model(previous_model) + .with_config(move |config| { + config.model_provider = model_provider; + set_test_compact_prompt(config); + }) + .build_with_auto_env(&server) + .await + .expect("build codex"); + test.codex + .start_or_steer_turn(disabled_permission_user_turn( + "before switch", + test.cwd.path().to_path_buf(), + previous_model.to_string(), + )) + .await + .expect("submit first turn"); + wait_for_event(&test.codex, |event| { + matches!(event, EventMsg::TurnComplete(_)) + }) + .await; + test.codex + .start_or_steer_turn(disabled_permission_user_turn( + "after switch", + test.cwd.path().to_path_buf(), + selected_model.to_string(), + )) + .await + .expect("submit selected-model turn"); + if selected_model_failures < 3 { + assert_compaction_uses_turn_lifecycle_id(&test.codex).await; + } else { + let mut errors = Vec::new(); + loop { + match wait_for_event(&test.codex, |_| true).await { + EventMsg::Error(error) => errors.push(error.codex_error_info), + EventMsg::TurnComplete(event) => { + assert_eq!( + event.error.and_then(|error| error.codex_error_info), + Some(CodexErrorInfo::ServerOverloaded) + ); + break; + } + _ => {} + } + } + assert_eq!(errors, vec![Some(CodexErrorInfo::ServerOverloaded)]); + } + let actual_models = request_log + .requests() + .iter() + .map(|request| { + request.body_json()["model"] + .as_str() + .expect("request model") + .to_string() + }) + .collect::>(); + let mut expected_models = vec![ + previous_model, // First turn. + previous_model, // Old-model compaction attempt and retries. + previous_model, + previous_model, + selected_model, // Selected-model compaction attempt and retries. + selected_model, + selected_model, + ]; + if selected_model_failures < 3 { + expected_models.push(selected_model); // Sampling after compaction succeeds. + } + assert_eq!(actual_models, expected_models); +} + +/// Manual compaction keeps the configured retry limit even when the server supplies advice. +#[test_case::test_case(0; "no_retries")] +#[test_case::test_case(2; "two_retries")] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn manual_remote_compact_advice_respects_retry_limit(max_retries: u64) { + skip_if_no_network!(); + + let server = start_mock_server().await; + let overload = wiremock::ResponseTemplate::new(/*s*/ 503) + .insert_header("Retry-After", "0") + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })); + let request_log = + mount_response_sequence(&server, vec![overload; (max_retries + 1) as usize]).await; + let mut model_provider = openai_model_provider(&server); + model_provider.request_max_retries = Some(0); + model_provider.stream_max_retries = Some(max_retries); + let test = test_codex() + .with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()) + .with_model("gpt-5.4") + .with_config(move |config| { + config.model_provider = model_provider; + set_test_compact_prompt(config); + }) + .build_with_auto_env(&server) + .await + .expect("build codex"); + + test.codex.submit(Op::Compact).await.expect("run /compact"); + let mut errors = Vec::new(); + let mut reconnect_messages = Vec::new(); + loop { + match wait_for_event(&test.codex, |_| true).await { + EventMsg::Error(error) => errors.push(error.codex_error_info), + EventMsg::StreamError(error) => reconnect_messages.push(error.message), + EventMsg::TurnComplete(event) => { + assert_eq!( + event.error.and_then(|error| error.codex_error_info), + Some(CodexErrorInfo::ServerOverloaded) + ); + break; + } + _ => {} + } + } + assert_eq!(errors, vec![Some(CodexErrorInfo::ServerOverloaded)]); + assert_eq!( + reconnect_messages, + (1..=max_retries) + .map(|retry| format!("Reconnecting... {retry}/{max_retries}")) + .collect::>() + ); + let models = request_log + .requests() + .iter() + .map(|request| { + request.body_json()["model"] + .as_str() + .expect("request model") + .to_string() + }) + .collect::>(); + assert_eq!(models, vec!["gpt-5.4"; (max_retries + 1) as usize]); +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn pre_sampling_compact_keeps_unknown_previous_model_for_api_key_auth_and_custom_provider() { skip_if_no_network!(); diff --git a/codex-rs/core/tests/suite/retry_after.rs b/codex-rs/core/tests/suite/retry_after.rs index 4bb5da9a8d14..f69caf5208be 100644 --- a/codex-rs/core/tests/suite/retry_after.rs +++ b/codex-rs/core/tests/suite/retry_after.rs @@ -51,11 +51,11 @@ const SECOND_RETRY_MIN_DELAY: Duration = Duration::from_millis(360); const SECOND_RETRY_MAX_DELAY: Duration = Duration::from_millis(440); #[derive(Debug, PartialEq, Eq)] -struct RetryTelemetryEvent { +pub(super) struct RetryTelemetryEvent { attempt: u64, - delay: Duration, - layer: String, - operation: String, + pub(super) delay: Duration, + pub(super) layer: String, + pub(super) operation: String, } #[derive(Default)] @@ -193,7 +193,7 @@ where } } -struct RetryTelemetryCapture { +pub(super) struct RetryTelemetryCapture { events: mpsc::UnboundedReceiver, resumptions: mpsc::UnboundedReceiver, _subscriber: DefaultGuard, @@ -201,7 +201,7 @@ struct RetryTelemetryCapture { } impl RetryTelemetryCapture { - fn install() -> Self { + pub(super) fn install() -> Self { let (sender, events) = mpsc::unbounded_channel(); let (resumptions_sender, resumptions) = mpsc::unbounded_channel(); // Avoid caching no interest when another test first reaches a shared callsite. @@ -225,7 +225,7 @@ impl RetryTelemetryCapture { } } - async fn next_retry(&mut self) -> RetryTelemetryEvent { + pub(super) async fn next_retry(&mut self) -> RetryTelemetryEvent { tokio::time::timeout(Duration::from_secs(10), self.events.recv()) .await .expect("timed out waiting for retry telemetry") @@ -275,7 +275,7 @@ async fn wait_for_turn_completion(test: &TestCodex) { assert_eq!(completed.error, None, "turn should complete successfully"); } -/// HTTP overloads use the upstream header before another HTTP request. +/// HTTP overloads use server advice within the request and stream retry budgets. #[tokio::test(flavor = "current_thread")] async fn responses_http_uses_retry_after() -> Result<()> { skip_if_no_network!(Ok(())); @@ -285,6 +285,9 @@ async fn responses_http_uses_retry_after() -> Result<()> { let response_mock = responses::mount_response_sequence( &server, vec![ + ResponseTemplate::new(503) + .insert_header("Retry-After", "1") + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })), ResponseTemplate::new(503) .insert_header("Retry-After", "1") .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })), @@ -298,7 +301,7 @@ async fn responses_http_uses_retry_after() -> Result<()> { let test = test_codex() .with_config(|config| { config.model_provider.request_max_retries = Some(1); - config.model_provider.stream_max_retries = Some(0); + config.model_provider.stream_max_retries = Some(1); }) .build_with_auto_env(&server) .await?; @@ -316,8 +319,79 @@ async fn responses_http_uses_retry_after() -> Result<()> { } ); assert!(wait_for_retry(&mut telemetry, &retry).await >= Duration::from_secs(1)); + let retry = telemetry.next_retry().await; + assert!(retry.delay <= Duration::from_secs(1)); + assert_eq!( + retry, + RetryTelemetryEvent { + attempt: 1, + delay: retry.delay, + layer: "stream".into(), + operation: "sampling".into(), + } + ); + assert!(wait_for_retry(&mut telemetry, &retry).await >= Duration::from_secs(1)); wait_for_turn_completion(&test).await; + assert_eq!(response_mock.requests().len(), 3); + assert_eq!( + telemetry.events.try_recv(), + Err(mpsc::error::TryRecvError::Empty) + ); + Ok(()) +} + +/// A 429 with server advice retries in the sampling loop and completes without a terminal error. +#[tokio::test(flavor = "current_thread")] +async fn responses_http_429_uses_retry_after() -> Result<()> { + skip_if_no_network!(Ok(())); + + let mut telemetry = RetryTelemetryCapture::install(); + let server = responses::start_mock_server().await; + let response_mock = responses::mount_response_sequence( + &server, + vec![ + ResponseTemplate::new(429) + .insert_header("Retry-After", "1") + .set_body_json(json!({ "error": { "code": "rate_limit_exceeded" } })), + responses::sse_response(responses::sse(vec![ + responses::ev_response_created("recovered"), + responses::ev_completed("recovered"), + ])), + ], + ) + .await; + let test = test_codex() + .with_config(|config| { + config.model_provider.request_max_retries = Some(0); + config.model_provider.stream_max_retries = Some(1); + }) + .build_with_auto_env(&server) + .await?; + + submit_user_input(&test, "retry the rate-limited request").await?; + let retry = telemetry.next_retry().await; + assert!(retry.delay <= Duration::from_secs(1)); + assert_eq!( + retry, + RetryTelemetryEvent { + attempt: 1, + delay: retry.delay, + layer: "stream".into(), + operation: "sampling".into(), + } + ); + assert!(wait_for_retry(&mut telemetry, &retry).await >= Duration::from_secs(1)); + loop { + match wait_for_event(&test.codex, |_| true).await { + EventMsg::Error(error) => panic!("unexpected terminal error: {error:?}"), + EventMsg::TurnComplete(completed) => { + assert_eq!(completed.error, None); + break; + } + _ => {} + } + } assert_eq!(response_mock.requests().len(), 2); assert_eq!( telemetry.events.try_recv(), @@ -425,31 +499,40 @@ async fn exhausted_http_retries_preserve_deadline_through_error_mapping() { assert_eq!(outer_error.server_retry_delay(), Some(Duration::ZERO)); } -/// Headerless HTTP overloads currently exhaust request retries before emitting one terminal error. +/// Retry advice changes delays but never extends either retry budget or its displayed count. +#[test_case::test_case(None, 2, 3; "without_advice")] +#[test_case::test_case(Some("0"), 0, 3; "advice_without_stream_retries")] +#[test_case::test_case(Some("0"), 2, 9; "advice_with_stream_retries")] #[tokio::test(flavor = "current_thread")] -async fn responses_http_overload_without_retry_after_exhausts_request_retries() -> Result<()> { +async fn responses_http_overload_respects_retry_limits( + retry_after: Option<&str>, + stream_max_retries: u64, + expected_requests: usize, +) -> Result<()> { skip_if_no_network!(Ok(())); let server = responses::start_mock_server().await; + let mut overload = ResponseTemplate::new(503) + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })); + if let Some(retry_after) = retry_after { + overload = overload.insert_header("Retry-After", retry_after); + } Mock::given(method("POST")) .and(path("/v1/responses")) - .respond_with( - ResponseTemplate::new(503) - .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })), - ) + .respond_with(overload) .mount(&server) .await; let test = test_codex() - .with_config(|config| { + .with_config(move |config| { config.model_provider.request_max_retries = Some(2); - config.model_provider.stream_max_retries = Some(2); + config.model_provider.stream_max_retries = Some(stream_max_retries); }) .build_with_auto_env(&server) .await?; submit_user_input(&test, "reject the disabled model").await?; let mut error_events = 0; - let mut stream_error_events = 0; + let mut reconnect_messages = Vec::new(); tokio::time::timeout(Duration::from_secs(10), async { loop { match wait_for_event(&test.codex, |_| true).await { @@ -464,7 +547,7 @@ async fn responses_http_overload_without_retry_after_exhausts_request_retries() "Selected model is at capacity. Please try a different model." ); } - EventMsg::StreamError(_) => stream_error_events += 1, + EventMsg::StreamError(error) => reconnect_messages.push(error.message), EventMsg::TurnComplete(event) => { assert_eq!( event.error.and_then(|error| error.codex_error_info), @@ -480,7 +563,14 @@ async fn responses_http_overload_without_retry_after_exhausts_request_retries() .expect("overload retries should finish the turn within 10 seconds"); assert_eq!(error_events, 1); - assert_eq!(stream_error_events, 0); + let expected_messages = if retry_after.is_some() { + (1..=stream_max_retries) + .map(|retry| format!("Reconnecting... {retry}/{stream_max_retries}")) + .collect::>() + } else { + Vec::new() + }; + assert_eq!(reconnect_messages, expected_messages); let request_count = server .received_requests() .await @@ -489,8 +579,8 @@ async fn responses_http_overload_without_retry_after_exhausts_request_retries() .filter(|request| request.url.path() == "/v1/responses") .count(); assert_eq!( - request_count, 3, - "headerless overload should exhaust the configured request retries" + request_count, expected_requests, + "overload should exhaust the configured retry budgets" ); Ok(()) @@ -1709,6 +1799,79 @@ async fn websocket_connection_limit_retries_with_local_backoff() -> Result<()> { Ok(()) } +/// Advised WebSocket failures reach HTTP after the existing retry budget. HTTP +/// recovery uses its own retry budget and honors the preceding advice deadlines. +#[tokio::test(flavor = "current_thread")] +async fn websocket_upgrade_rejection_uses_retry_after() -> Result<()> { + skip_if_no_network!(Ok(())); + + let server = responses::start_mock_server().await; + let prewarm_rejection = Mock::given(method("GET")) + .and(path("/v1/responses")) + .respond_with(ResponseTemplate::new(/*s*/ 503)) + .up_to_n_times(/*n*/ 1) + .expect(/*r*/ 1) + .mount_as_scoped(&server) + .await; + Mock::given(method("GET")) + .and(path("/v1/responses")) + .respond_with( + ResponseTemplate::new(/*s*/ 503) + .insert_header("Retry-After", "1") + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })), + ) + .mount(&server) + .await; + let http_overload = ResponseTemplate::new(/*s*/ 503) + .insert_header("Retry-After", "0") + .set_body_json(json!({ "error": { "code": "server_is_overloaded" } })); + let response_mock = responses::mount_response_sequence( + &server, + vec![ + http_overload, + ResponseTemplate::new(/*s*/ 200) + .insert_header("content-type", "text/event-stream") + .set_body_string(responses::sse(vec![ + responses::ev_response_created("recovered"), + responses::ev_completed("recovered"), + ])), + ], + ) + .await; + let test = test_codex() + .with_config(|config| { + config.model_catalog = Some(bundled_models_response().expect("bundled models")); + config.model_provider.supports_websockets = true; + config.model_provider.request_max_retries = Some(0); + config.model_provider.stream_max_retries = Some(1); + }) + .build_with_auto_env(&server) + .await?; + + // Prewarm is best effort; start the advised failures in the sampling retry loop. + tokio::time::timeout( + Duration::from_secs(10), + prewarm_rejection.wait_until_satisfied(), + ) + .await?; + drop(prewarm_rejection); + let start = Instant::now(); + submit_user_input(&test, "retry the rejected websocket upgrade").await?; + wait_for_turn_completion(&test).await; + + // Both WebSocket advice deadlines apply, including the one before transport fallback. + assert!(start.elapsed() >= Duration::from_secs(2)); + let requests = server.received_requests().await.unwrap_or_default(); + let methods = requests + .iter() + .filter(|request| request.url.path() == "/v1/responses") + .map(|request| request.method.as_str()) + .collect::>(); + assert_eq!(methods, vec!["GET", "GET", "GET", "POST", "POST"]); + assert_eq!(response_mock.requests().len(), 2); + Ok(()) +} + // TODO(anp) respect Retry-After /// Nested websocket retry headers are currently ignored, leaving rate-limit errors terminal. #[tokio::test(flavor = "current_thread")] diff --git a/codex-rs/protocol/src/error.rs b/codex-rs/protocol/src/error.rs index d0dad844bd54..19134d6f3e59 100644 --- a/codex-rs/protocol/src/error.rs +++ b/codex-rs/protocol/src/error.rs @@ -403,18 +403,19 @@ impl CodexErr { | CodexErrorDetails::UnsupportedOperation(_) | CodexErrorDetails::Sandbox(_) | CodexErrorDetails::LandlockSandboxExecutableNotProvided - | CodexErrorDetails::RetryLimit(_) | CodexErrorDetails::ContextWindowExceeded | CodexErrorDetails::ThreadNotFound(_) | CodexErrorDetails::AgentLimitReached { .. } | CodexErrorDetails::Spawn | CodexErrorDetails::SessionConfiguredNotFirstEvent | CodexErrorDetails::UsageLimitReached(_) - | CodexErrorDetails::ServerOverloaded | CodexErrorDetails::FlexUnavailable | CodexErrorDetails::CyberPolicy { .. } | CodexErrorDetails::BioPolicy { .. } | CodexErrorDetails::MisalignmentPolicyViolation { .. } => None, + CodexErrorDetails::ServerOverloaded | CodexErrorDetails::RetryLimit(_) => { + self.server_retry_delay() + } CodexErrorDetails::Stream(..) | CodexErrorDetails::ContentFilter | CodexErrorDetails::RateLimitExceeded(_) From 8c3612fb638d356579c446de68421288164484dc Mon Sep 17 00:00:00 2001 From: Brent Traut Date: Wed, 30 Sep 2026 02:04:12 +0000 Subject: [PATCH 03/11] Use `memrchr` to find newlines in reverse JSONL scans (#49444) Replace the byte-by-byte reverse newline search with `memchr::memrchr` and add `memchr` as a dependency of `codex-rollout`. GitOrigin-RevId: b07e42e15efb0d63d7b00ee9a2ee29c446f4cf59 --- codex-rs/Cargo.lock | 1 + codex-rs/rollout/Cargo.toml | 1 + codex-rs/rollout/src/reverse_jsonl_scanner.rs | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index a26f2fd61e6f..10a8c44279d3 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -4432,6 +4432,7 @@ dependencies = [ "codex-utils-absolute-path", "codex-utils-path", "codex-utils-process", + "memchr", "pretty_assertions", "regex", "serde", diff --git a/codex-rs/rollout/Cargo.toml b/codex-rs/rollout/Cargo.toml index 8981dd966269..fb2b5b39e438 100644 --- a/codex-rs/rollout/Cargo.toml +++ b/codex-rs/rollout/Cargo.toml @@ -25,6 +25,7 @@ codex-protocol = { workspace = true } codex-state = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-path = { workspace = true } +memchr = { workspace = true } regex = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } diff --git a/codex-rs/rollout/src/reverse_jsonl_scanner.rs b/codex-rs/rollout/src/reverse_jsonl_scanner.rs index 9e0a836bee80..ed0daed295f4 100644 --- a/codex-rs/rollout/src/reverse_jsonl_scanner.rs +++ b/codex-rs/rollout/src/reverse_jsonl_scanner.rs @@ -95,7 +95,7 @@ where } let chunk = &self.chunk[..self.chunk_position]; - if let Some(newline_position) = chunk.iter().rposition(|byte| *byte == b'\n') { + if let Some(newline_position) = memchr::memrchr(b'\n', chunk) { let fragment = &chunk[newline_position + 1..]; if !self.discarding_oversized_record { if self.max_record_bytes.is_some_and(|max_record_bytes| { From 76a6e55d5ac69e3ba6b0481f8f3b94256f46dfa7 Mon Sep 17 00:00:00 2001 From: "Adam Perry @ OpenAI" Date: Wed, 30 Sep 2026 03:10:00 +0000 Subject: [PATCH 04/11] Restore executor tool paths after login shell startup (#49467) ## Why Login shell startup can reset `PATH`, preventing commands and their children from finding bundled tools such as `rg` in executor-reported directories. ## What changed When `login_shell_package_path` is enabled, prepend missing executor-reported directories to `PATH` inside the POSIX login shell before running the requested command. Preserve existing entries and the order of newly added directories, and export `PATH` for child commands. Respect explicit `PATH` overrides and preserve the requested login mode when directories are unusable or `PATH` is read-only. Keep shell diagnostics and `$LINENO` aligned with the original script, including when directory names contain newlines. The feature remains disabled by default. ## Testing Add shell tests for nested tool lookup, existing entries, quoting, line numbers, and read-only `PATH`. Extend remote execution tests to cover feature gating, explicit overrides, unusable directories, and preservation of the original command in execution events. GitOrigin-RevId: 301aa34e72cc6292293693250e190c19903f390a --- codex-rs/core/src/shell.rs | 57 ++++++ codex-rs/core/src/shell_tests.rs | 63 +++++++ .../src/tools/handlers/unified_exec_tests.rs | 177 ++++++++++++++++++ .../core/src/tools/runtimes/unified_exec.rs | 28 ++- .../suite/unified_exec_process_events.rs | 142 ++++++++++++-- 5 files changed, 447 insertions(+), 20 deletions(-) diff --git a/codex-rs/core/src/shell.rs b/codex-rs/core/src/shell.rs index c253383610fa..da0fbbea1f70 100644 --- a/codex-rs/core/src/shell.rs +++ b/codex-rs/core/src/shell.rs @@ -1,5 +1,7 @@ use codex_exec_server::ShellInfo; use codex_shell_command::shell_detect::DetectedShell; +use codex_utils_path_uri::PathConvention; +use codex_utils_path_uri::PathUri; use serde::Deserialize; use serde::Serialize; use std::path::PathBuf; @@ -91,6 +93,61 @@ impl ShellInvocation { ShellType::Bash | ShellType::Zsh | ShellType::Sh ) } + + /// Builds launch arguments that try to restore the executor's directories to `PATH` + /// after login startup, so `command` and its children can find them. + /// + /// Call this for the POSIX login shell started by Codex when the executor reports + /// directories and the user has not explicitly configured `PATH`. The request's login + /// mode is unchanged, even if startup makes `PATH` read-only. Returns `None` if no + /// directories are reported or the shell or any path cannot use this setup; keep the + /// original arguments in that case. + pub(crate) fn derive_exec_args_with_path_prepends( + &self, + command: &str, + paths: &[PathUri], + ) -> Option> { + if !self.is_posix_login() || paths.is_empty() { + return None; + } + let mut setup = Vec::with_capacity(paths.len()); + // Prepend backwards so newly added directories retain the executor's order. + for path in paths.iter().rev() { + if path.infer_path_convention() != Some(PathConvention::Posix) { + return None; + } + let path = path.inferred_native_path_string(); + // POSIX PATH has no way to escape a colon inside a single directory. + if path.contains(':') { + return None; + } + let path = shlex::try_quote(&path).ok()?; + // Padding `${PATH-}` with colons makes `case` match whole entries, even at the ends; + // `-` also handles an unset PATH. Re-export a match so child commands inherit it; + // otherwise probe in a subshell: assigning a read-only PATH can exit the login shell + // before the user's command runs. `${PATH:+...}` adds `:` only when PATH is nonempty, + // so we don't make the shell search the current directory. + setup.push(format!( + "case \":${{PATH-}}:\" in *:{path}:*) export PATH ;; \ + *) if (export PATH=) 2>/dev/null; then \ + export PATH={path}${{PATH:+:\"$PATH\"}}; fi ;; esac" + )); + } + let setup = setup.join("; "); + // Keep setup on the first input line so shell diagnostics and $LINENO still refer to + // the original script. If the quoted path contains literal newlines, decode only the + // setup with eval in the current shell; the trailing `esac` keeps command substitution + // from trimming any newlines in the path. + let setup = if setup.contains('\n') { + let escaped = setup.replace('\\', "\\\\").replace('\n', "\\n"); + let escaped = shlex::try_quote(&escaped).ok()?; + format!("eval \"$(command -p printf '%b' {escaped})\"") + } else { + setup + }; + let command = format!("{setup}; {command}"); + Some(self.shell.derive_exec_args(&command, self.use_login_shell)) + } } #[cfg(all(test, unix))] diff --git a/codex-rs/core/src/shell_tests.rs b/codex-rs/core/src/shell_tests.rs index 0963ef83645f..1077aba2b656 100644 --- a/codex-rs/core/src/shell_tests.rs +++ b/codex-rs/core/src/shell_tests.rs @@ -1,4 +1,5 @@ use super::*; +use pretty_assertions::assert_eq; use std::path::PathBuf; use std::process::Command; @@ -143,6 +144,68 @@ fn derive_exec_args() { ); } +/// Diagnostics and `$LINENO` must refer to the original script, even with newlines in the package path. +#[test] +fn codex_path_setup_preserves_shell_script_line_numbers() -> anyhow::Result<()> { + let temp_dir = tempfile::tempdir()?; + let run = |argv: &[String]| { + Command::new(&argv[0]) + .args(&argv[1..]) + .env("ZDOTDIR", temp_dir.path()) + .env("HOME", temp_dir.path()) + .env_remove("BASH_ENV") + .output() + }; + for shell_type in [ShellType::Bash, ShellType::Zsh, ShellType::Sh] { + let Some(shell) = get_shell(shell_type) else { + assert_eq!(shell_type, ShellType::Zsh, "only zsh may be unavailable"); + continue; + }; + let invocation = ShellInvocation { + shell, + use_login_shell: true, + }; + for directory in [ + "codex-path", + "codex '\\c[*]$(printf bad)`printf bad`\npath\n", + ] { + let directory = temp_dir.path().join(directory); + let path = PathUri::from_host_native_path(&directory)?; + let commands = [ + ":\nif then", + "printf '%s\\n' \"$LINENO\"\nprintf '%s\\n' \"$LINENO\"", + ]; + for command in commands { + if command.contains("LINENO") && shell_type == ShellType::Sh { + continue; // dash does not implement LINENO. + } + let original = invocation + .shell + .derive_exec_args(command, /*use_login_shell*/ true); + let wrapped = invocation + .derive_exec_args_with_path_prepends(command, std::slice::from_ref(&path)) + .expect("a POSIX package path should be usable"); + assert_eq!( + run(&wrapped)?, + run(&original)?, + "{shell_type:?}: {directory:?}" + ); + assert_eq!(wrapped[2].lines().count(), command.lines().count()); + } + + let command = "printf '%s' \"$PATH\""; + let wrapped = invocation + .derive_exec_args_with_path_prepends(command, std::slice::from_ref(&path)) + .expect("a POSIX package path should be usable"); + let output = run(&wrapped)?; + assert!(output.status.success()); + let actual_path = String::from_utf8(output.stdout)?; + assert_eq!(actual_path.split(':').next(), directory.to_str()); + } + } + Ok(()) +} + #[tokio::test] async fn test_current_shell_detects_zsh() { let shell = Command::new("sh") diff --git a/codex-rs/core/src/tools/handlers/unified_exec_tests.rs b/codex-rs/core/src/tools/handlers/unified_exec_tests.rs index 4657b64fbcb1..98b879583911 100644 --- a/codex-rs/core/src/tools/handlers/unified_exec_tests.rs +++ b/codex-rs/core/src/tools/handlers/unified_exec_tests.rs @@ -7,6 +7,7 @@ use codex_tools::UnifiedExecShellMode; use codex_tools::ZshForkConfig; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_output_truncation::TruncationPolicy; +use codex_utils_path_uri::PathUri; use pretty_assertions::assert_eq; use std::sync::Arc; @@ -95,6 +96,182 @@ fn test_get_command_respects_explicit_bash_shell() -> anyhow::Result<()> { Ok(()) } +/// Nested commands must find the first reported tool directory after login startup without duplicating existing entries. +#[cfg(unix)] +#[test] +fn test_get_command_keeps_path_prepends_after_login_startup() -> anyhow::Result<()> { + use std::os::unix::fs::PermissionsExt; + + let temp_dir = tempfile::tempdir()?; + let path_dir = temp_dir.path().join("codex '[*] path"); + let extra_path_dir = temp_dir.path().join("extra tools"); + for directory in [&path_dir, &extra_path_dir] { + std::fs::create_dir(directory)?; + let rg = directory.join("rg"); + std::fs::write(&rg, "#!/bin/sh\n")?; + std::fs::set_permissions(&rg, std::fs::Permissions::from_mode(0o755))?; + } + let rg = path_dir.join("rg"); + let startup = temp_dir.path().join("startup"); + std::fs::write( + &startup, + "export PATH=\"$CODEX_TEST_LOGIN_PATH\" CODEX_TEST_LOGIN_PATH_RESET=1\n", + )?; + let path_dirs = [ + PathUri::from_host_native_path(&path_dir)?, + PathUri::from_host_native_path(&extra_path_dir)?, + ]; + let args: ExecCommandArgs = parse_arguments( + r#"{"cmd":"sh -c 'test \"$CODEX_TEST_LOGIN_PATH_RESET\" = 1 && printf \"%s\\n\" \"$PATH\" && command -v rg'"}"#, + )?; + let shell = Arc::new(get_shell(ShellType::Bash).expect("bash should be available")); + let resolved = get_command( + &args, + Arc::clone(&shell), + &UnifiedExecShellMode::Direct, + /*allow_login_shell*/ true, + ) + .map_err(anyhow::Error::msg)?; + assert_eq!( + resolved.command, + shell.derive_exec_args(&args.cmd, /*use_login_shell*/ true) + ); + + let execution_command = resolved + .shell + .derive_exec_args_with_path_prepends(&args.cmd, &path_dirs) + .expect("login shell should restore PATH"); + let path_dir = path_dirs[0].inferred_native_path_string(); + let extra_path_dir = path_dirs[1].inferred_native_path_string(); + let already_present = format!( + "{}:{path_dir}:{extra_path_dir}:/usr/bin:/bin", + temp_dir.path().display() + ); + for (login_path, expected_path) in [ + ( + "/usr/bin:/bin".to_string(), + format!("{path_dir}:{extra_path_dir}:/usr/bin:/bin"), + ), + (already_present.clone(), already_present), + ] { + let output = std::process::Command::new(&execution_command[0]) + .args(&execution_command[1..]) + .env("BASH_ENV", &startup) + .env("CODEX_TEST_LOGIN_PATH", login_path) + .env_remove("CODEX_TEST_LOGIN_PATH_RESET") + .env("PATH", &path_dir) + .output()?; + assert!( + output.status.success(), + "{}", + String::from_utf8_lossy(&output.stderr) + ); + assert_eq!( + String::from_utf8(output.stdout)?, + format!("{expected_path}\n{}\n", rg.display()) + ); + } + Ok(()) +} + +/// The requested login shell and its command still run when startup forbids changing PATH. +#[cfg(unix)] +#[test] +fn test_get_command_runs_login_shell_when_path_is_readonly() -> anyhow::Result<()> { + let temp_dir = tempfile::tempdir()?; + let startup = temp_dir.path().join("startup"); + // An explicit exit from a login Bash runs ~/.bash_logout; keep the runner's file out of the test. + std::fs::write(temp_dir.path().join(".bash_logout"), ":\n")?; + std::fs::write( + &startup, + "if shopt -q login_shell; then\n export HOME=\"$CODEX_TEST_LOGIN_HOME\"\n export PATH=/usr/bin:/bin\n readonly PATH\n set -e\nfi\n", + )?; + let path_dir = PathUri::from_host_native_path(temp_dir.path().join("codex-path"))?; + let args: ExecCommandArgs = parse_arguments( + r#"{"cmd":"shopt -q login_shell || exit 90; case $- in *e*) ;; *) exit 91 ;; esac; /bin/sh -c 'printf \"%s\\n\" \"$PATH\"'; exit 23","login":true}"#, + )?; + let shell = Arc::new(get_shell(ShellType::Bash).expect("bash should be available")); + let resolved = get_command( + &args, + shell, + &UnifiedExecShellMode::Direct, + /*allow_login_shell*/ true, + ) + .map_err(anyhow::Error::msg)?; + let command = resolved + .shell + .derive_exec_args_with_path_prepends(&args.cmd, &[path_dir]) + .expect("the reported directory can be put on PATH"); + let output = std::process::Command::new(&command[0]) + .args(&command[1..]) + .env("BASH_ENV", startup) + .env("CODEX_TEST_LOGIN_HOME", temp_dir.path()) + .env_remove("SHLVL") + .output()?; + + assert_eq!( + ( + output.status.code(), + String::from_utf8(output.stdout)?, + String::from_utf8(output.stderr)? + ), + (Some(23), "/usr/bin:/bin\n".to_string(), String::new()) + ); + Ok(()) +} + +/// The package path only affects Codex's own POSIX login shells when the executor reports a POSIX path. +#[test] +fn test_get_command_does_not_change_nested_login_or_powershell() -> anyhow::Result<()> { + for (shell_type, shell_path, arguments, use_login_shell, path) in [ + ( + ShellType::Bash, + "/bin/bash", + r#"{"cmd":"bash -lc 'command -v rg'","login":false}"#, + false, + "file:///executor/codex-path", + ), + ( + ShellType::PowerShell, + "pwsh", + r#"{"cmd":"Get-Command rg"}"#, + true, + "file:///executor/codex-path", + ), + ( + ShellType::Bash, + "/bin/bash", + r#"{"cmd":"command -v rg"}"#, + true, + "file:///C:/executor/codex-path", + ), + ] { + let args: ExecCommandArgs = parse_arguments(arguments)?; + let path_dir = PathUri::parse(path)?; + let shell = Arc::new(Shell { + shell_type, + shell_path: PathBuf::from(shell_path), + }); + let resolved = get_command( + &args, + Arc::clone(&shell), + &UnifiedExecShellMode::Direct, + /*allow_login_shell*/ true, + ) + .map_err(anyhow::Error::msg)?; + assert_eq!( + ( + resolved.command, + resolved + .shell + .derive_exec_args_with_path_prepends(&args.cmd, &[path_dir]) + ), + (shell.derive_exec_args(&args.cmd, use_login_shell), None) + ); + } + Ok(()) +} + #[test] fn test_get_command_resolves_powershell_by_type() -> anyhow::Result<()> { let temp_dir = tempfile::tempdir()?; diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index c6ef29c606e7..82a76ded4c24 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -45,6 +45,7 @@ use crate::unified_exec::UnifiedExecError; use crate::unified_exec::UnifiedExecProcess; use crate::unified_exec::UnifiedExecProcessManager; use codex_core_plugins::PluginMetricsSidecar; +use codex_features::Feature; use codex_network_proxy::CREDENTIAL_BROKER_ACTIVE_ENV_KEY; use codex_network_proxy::ManagedNetworkSandboxContext; use codex_network_proxy::NetworkProxy; @@ -511,18 +512,31 @@ impl<'a> ToolRuntime for UnifiedExecRunt }; #[cfg(not(unix))] let runtime_path_prepends = RuntimePathPrepends::default(); - let mut command = if environment_is_remote { - base_command.to_vec() - } else { - maybe_wrap_shell_lc_with_snapshot( - base_command, + // Restore the executor's PATH directories inside the shell so nested commands can + // still find bundled tools even if login startup clears the inherited PATH. + // `base_command` already carries the requested login mode; keep it if setup is unavailable. + // `hook_command` is the raw script the helper needs to prepend setup inside that same shell. + let mut command = base_command.to_vec(); + if ctx.session.enabled(Feature::LoginShellPackagePath) + && req.shell.is_posix_login() + && !explicit_env_overrides.contains_key("PATH") + && let Ok(info) = req.turn_environment.environment.info().await + && let Some(command_with_path_prepends) = req + .shell + .derive_exec_args_with_path_prepends(&req.hook_command, &info.prepend_path_dirs) + { + command = command_with_path_prepends; + } + if !environment_is_remote { + command = maybe_wrap_shell_lc_with_snapshot( + &command, shell, shell_snapshot_location.as_ref(), &explicit_env_overrides, &env, &runtime_path_prepends, - ) - }; + ); + } let brokered_shell_snapshot_missing = !environment_is_remote && managed_network.is_some() && env diff --git a/codex-rs/core/tests/suite/unified_exec_process_events.rs b/codex-rs/core/tests/suite/unified_exec_process_events.rs index 39d8db419093..983fc2ded343 100644 --- a/codex-rs/core/tests/suite/unified_exec_process_events.rs +++ b/codex-rs/core/tests/suite/unified_exec_process_events.rs @@ -5,6 +5,7 @@ use base64::engine::general_purpose::STANDARD as BASE64_STANDARD; use codex_config::test_support::CloudConfigBundleFixture; use codex_core::TurnInputRequest; use codex_exec_server::ExecParams; +use codex_features::Feature; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ModeKind; @@ -71,6 +72,11 @@ const REPLAY_RETAINED_OUTPUT_SEQ: u64 = 800; #[cfg_attr(windows, allow(dead_code))] enum PushedExecScenario { Complete, + CodexPath, + CodexPathDefaultFeature, + CodexPathDisabledFeature, + CodexPathWithExplicitOverride, + UnusableCodexPath, DirectDenied, DenyWin, DenyWinUnchanged, @@ -196,18 +202,29 @@ async fn respond_environment_info( if matches!(scenario, PushedExecScenario::DenyLinux) { capabilities["linuxApprovedRootWritePreservesRestrictions"] = json!(true); } - send_exec_server_json( - websocket, - json!({ - "id": id, - "result": { - "shell": shell, - "platformOs": platform_os, - "capabilities": capabilities, - } - }), - ) - .await; + let mut response = json!({ + "id": id, + "result": { + "shell": shell, + "platformOs": platform_os, + "capabilities": capabilities, + } + }); + if matches!( + scenario, + PushedExecScenario::CodexPath + | PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature + | PushedExecScenario::CodexPathWithExplicitOverride + ) { + response["result"]["prependPathDirs"] = json!([ + "file:///executor/codex-path", + "file:///executor/extra-tools", + ]); + } else if matches!(scenario, PushedExecScenario::UnusableCodexPath) { + response["result"]["prependPathDirs"] = json!(["file:///executor/codex%3Apath"]); + } + send_exec_server_json(websocket, response).await; } async fn serve_exec_with_pushed_events( @@ -410,6 +427,11 @@ async fn serve_exec_with_pushed_events( | PushedExecScenario::DenyOldLinux | PushedExecScenario::DenyOldLinuxWithRoot(_) | PushedExecScenario::DenyLinux + | PushedExecScenario::CodexPath + | PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature + | PushedExecScenario::CodexPathWithExplicitOverride + | PushedExecScenario::UnusableCodexPath | PushedExecScenario::ElevatedPowerShell => { let encoded_output = BASE64_STANDARD.encode(COMPLETE_OUTPUT); for message in [ @@ -491,7 +513,12 @@ async fn serve_exec_with_pushed_events( Some("process/read") => { process_read_requests += 1; let result = match scenario { - PushedExecScenario::Complete => json!({ + PushedExecScenario::Complete + | PushedExecScenario::CodexPath + | PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature + | PushedExecScenario::CodexPathWithExplicitOverride + | PushedExecScenario::UnusableCodexPath => json!({ "chunks": [{ "seq": 1, "stream": "stdout", @@ -606,6 +633,11 @@ async fn serve_exec_with_pushed_events( } #[test_case(PushedExecScenario::Complete, ManagedNetworkScenario::None, false ; "complete_event_stream")] +#[test_case(PushedExecScenario::CodexPath, ManagedNetworkScenario::None, false ; "codex_path_is_exported_before_nested_command")] +#[test_case(PushedExecScenario::CodexPathDefaultFeature, ManagedNetworkScenario::None, false ; "codex_path_is_not_exported_by_default")] +#[test_case(PushedExecScenario::CodexPathDisabledFeature, ManagedNetworkScenario::None, false ; "disabled_codex_path_preserves_original_login_command")] +#[test_case(PushedExecScenario::CodexPathWithExplicitOverride, ManagedNetworkScenario::None, false ; "explicit_path_override_preserves_original_login_command")] +#[test_case(PushedExecScenario::UnusableCodexPath, ManagedNetworkScenario::None, false ; "unusable_codex_path_preserves_requested_login_shell")] #[test_case(PushedExecScenario::DirectDenied, ManagedNetworkScenario::None, false ; "direct_sandbox_denial")] #[test_case(PushedExecScenario::LegacyExit, ManagedNetworkScenario::None, false ; "legacy_exit_metadata")] #[test_case(PushedExecScenario::ReplayGap, ManagedNetworkScenario::None, false ; "truncated_event_replay")] @@ -634,6 +666,7 @@ async fn exec_command_consumes_pushed_remote_process_events( managed_network: ManagedNetworkScenario, foreign_cwd: bool, ) -> Result<()> { + let explicit_path = "/user/configured/bin:/user/other/bin"; let managed_network_configured = !matches!(managed_network, ManagedNetworkScenario::None); let managed_network_enabled = matches!(managed_network, ManagedNetworkScenario::Enabled { .. }); let policy_callbacks = matches!( @@ -669,6 +702,16 @@ async fn exec_command_consumes_pushed_remote_process_events( CALL_ID, "*** Begin Patch\n*** Update File: secret.txt\n@@\n-old\n+new\n*** End Patch", ), + PushedExecScenario::CodexPathWithExplicitOverride | PushedExecScenario::UnusableCodexPath => ev_function_call( + CALL_ID, + "exec_command", + &json!({ + "cmd": "sh -c 'command -v rg'", + "login": true, + "yield_time_ms": 1_000, + }) + .to_string(), + ), _ => ev_function_call( CALL_ID, "exec_command", @@ -685,6 +728,9 @@ async fn exec_command_consumes_pushed_remote_process_events( "Remove-Item test -Force; {}", "Write-Output filler; ".repeat(2_000) ), + PushedExecScenario::CodexPath + | PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature => "sh -c 'command -v rg'".to_string(), _ => "pwd".to_string(), }, "yield_time_ms": 1_000, @@ -777,6 +823,24 @@ timeout = 900 } let mut builder = builder.with_config(move |config| { config.project_doc_max_bytes = 0; + if matches!(scenario, PushedExecScenario::CodexPathDisabledFeature) { + config + .features + .disable(Feature::LoginShellPackagePath) + .expect("disable login shell package PATH"); + } else if !matches!(scenario, PushedExecScenario::CodexPathDefaultFeature) { + config + .features + .enable(Feature::LoginShellPackagePath) + .expect("enable login shell package PATH"); + } + if matches!(scenario, PushedExecScenario::CodexPathWithExplicitOverride) { + config + .permissions + .shell_environment_policy + .r#set + .insert("PATH".to_string(), explicit_path.to_string()); + } if matches!(scenario, PushedExecScenario::ElevatedPowerShell) || (foreign_cwd && deny_read) { config.set_windows_elevated_sandbox_enabled(/*value*/ true); @@ -930,6 +994,7 @@ timeout = 900 ) .await?; let mut saw_exec_command_begin = false; + let mut exec_command_begin_command = None; let mut saw_patch_denial_approval = false; if !managed_network_enabled { loop { @@ -940,6 +1005,7 @@ timeout = 900 match event { EventMsg::ExecCommandBegin(event) if event.call_id == CALL_ID => { saw_exec_command_begin = true; + exec_command_begin_command = Some(event.command); } EventMsg::ExecApprovalRequest(approval) if deny_read => { assert_eq!(approval.call_id, CALL_ID); @@ -1169,6 +1235,51 @@ timeout = 900 "#); } } + if matches!(scenario, PushedExecScenario::CodexPath) { + let argv = &exec_server_result.process_start["params"]["argv"]; + assert_eq!(argv[0], "/bin/zsh"); + assert_eq!(argv[1], "-lc"); + let script = argv[2] + .as_str() + .context("shell command should contain a script")?; + assert!(script.contains("export PATH=/executor/codex-path")); + assert!(script.contains("export PATH=/executor/extra-tools")); + assert!(script.ends_with("; sh -c 'command -v rg'")); + assert_eq!(script.lines().count(), 1); + assert_eq!( + exec_command_begin_command, + Some(vec![ + "/bin/zsh".to_string(), + "-lc".to_string(), + "sh -c 'command -v rg'".to_string() + ]) + ); + } else if matches!( + scenario, + PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature + | PushedExecScenario::CodexPathWithExplicitOverride + | PushedExecScenario::UnusableCodexPath + ) { + let params = &exec_server_result.process_start["params"]; + let expected = vec!["/bin/zsh", "-lc", "sh -c 'command -v rg'"]; + assert_eq!(params["argv"], json!(expected)); + assert_eq!( + exec_command_begin_command, + Some(expected.into_iter().map(str::to_string).collect()) + ); + if matches!(scenario, PushedExecScenario::CodexPathWithExplicitOverride) { + assert_eq!(params["envPolicy"]["set"]["PATH"], explicit_path); + } + } else if matches!(scenario, PushedExecScenario::Complete) + && !foreign_cwd + && !managed_network_configured + { + assert_eq!( + exec_server_result.process_start["params"]["argv"], + json!(["/bin/zsh", "-lc", "pwd"]) + ); + } if foreign_cwd { let params = &exec_server_result.process_start["params"]; assert_eq!(params["cwd"], "file:///C:/workspace"); @@ -1263,6 +1374,11 @@ timeout = 900 | PushedExecScenario::DenyOldLinux | PushedExecScenario::DenyOldLinuxWithRoot(_) | PushedExecScenario::DenyLinux + | PushedExecScenario::CodexPath + | PushedExecScenario::CodexPathDefaultFeature + | PushedExecScenario::CodexPathDisabledFeature + | PushedExecScenario::CodexPathWithExplicitOverride + | PushedExecScenario::UnusableCodexPath | PushedExecScenario::ElevatedPowerShell => { assert_ne!(success, Some(false)); assert!(saw_exec_command_begin); From b588812e8cc82f88a3141ab6bcdf654cbb18361d Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Wed, 30 Sep 2026 03:13:09 +0000 Subject: [PATCH 05/11] Use server-authoritative permissions in the TUI (#49472) ## Why Client permission definitions and constraints can differ from those on the connected app server. Accepted permission changes also need to survive task transitions before their settings notifications arrive. ## What changed - Discover permission profiles and availability from the connected server and apply selections through `thread/settings/update`, including custom profiles. - Adopt the server's effective permission settings instead of reapplying local definitions or constraints. - Retain accepted selections and effective approval settings across new tasks, forks, side conversations, directory changes, reconnects, and safety retries without blocking navigation on a settings notification. - Recognize the current built-in permission preset when the server supplies an unnamed profile. ## Testing Add regression coverage for conflicting client/server profile definitions, rejected and unchanged selections, consecutive requests with omitted approval settings, and permission carryover before confirmation. Extend discovery and menu tests to verify server-provided availability and unnamed-profile highlighting. GitOrigin-RevId: bcd767b58dc92dc4f945189078e51e6e5fce6d24 --- codex-rs/tui/src/app/agents_overview.rs | 11 + codex-rs/tui/src/app/agents_overview_new.rs | 7 + .../tui/src/app/agents_overview_threads.rs | 10 + codex-rs/tui/src/app/config_persistence.rs | 120 +++++--- codex-rs/tui/src/app/event_dispatch.rs | 5 +- codex-rs/tui/src/app/reconnect.rs | 9 +- codex-rs/tui/src/app/safety_buffering.rs | 10 +- codex-rs/tui/src/app/session_lifecycle.rs | 14 + codex-rs/tui/src/app/side.rs | 11 +- codex-rs/tui/src/app/tests.rs | 103 +++++-- .../src/app/tests/active_reconnect_tests.rs | 3 +- .../tests/background_task_defaults_tests.rs | 70 ++++- .../app/tests/permission_selection_tests.rs | 264 +++++++++++++++++- .../app/tests/permission_shortcuts_tests.rs | 6 +- .../tui/src/app/tests/safety_buffering.rs | 47 ++++ .../app/tests/session_lifecycle_requests.rs | 22 +- ...and_center_pending_server_permissions.snap | 11 - codex-rs/tui/src/app/thread_routing.rs | 57 ++-- codex-rs/tui/src/app/thread_settings.rs | 28 +- codex-rs/tui/src/app/working_directory.rs | 50 +++- codex-rs/tui/src/app_server_session.rs | 33 ++- .../rollout_history_tests.rs | 17 +- .../workspace_roots_tests.rs | 7 +- .../src/chatwidget/permission_discovery.rs | 3 - .../tui/src/chatwidget/permission_popups.rs | 3 +- .../tui/src/chatwidget/permissions_menu.rs | 21 +- codex-rs/tui/src/chatwidget/settings.rs | 12 +- ...s__permissions_unnamed_server_profile.snap | 15 + .../tui/src/chatwidget/tests/app_server.rs | 2 + .../tui/src/chatwidget/tests/permissions.rs | 36 ++- codex-rs/tui/src/permission_discovery.rs | 48 +--- .../tui/src/permission_discovery_tests.rs | 27 +- 32 files changed, 833 insertions(+), 249 deletions(-) delete mode 100644 codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_task_defaults_tests__command_center_pending_server_permissions.snap create mode 100644 codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_unnamed_server_profile.snap diff --git a/codex-rs/tui/src/app/agents_overview.rs b/codex-rs/tui/src/app/agents_overview.rs index 89db4ec2dd4e..6d6f80c9236b 100644 --- a/codex-rs/tui/src/app/agents_overview.rs +++ b/codex-rs/tui/src/app/agents_overview.rs @@ -59,6 +59,8 @@ pub(super) struct AgentsOverviewState { Arc>, /// Explicit permission-profile choices for new-session carryover, retained across navigation. pub(super) selected_permission_profiles: HashMap, + /// Accepted menu requests; unchanged settings may never produce a notification. + pub(super) requested_permission_profiles: HashMap, /// Keep new tasks subscribed and reusable until a first turn makes them resumable. pub(super) blank_sessions: HashMap, pub(super) input_states: HashMap, @@ -956,6 +958,15 @@ impl App { .active_permission_profile .as_ref() .is_some_and(|active| !active.id.starts_with(':')) + && self.chat_widget.thread_id().is_none_or(|thread_id| { + self.agents_overview + .selected_permission_profiles + .get(&thread_id) + != profile + .active_permission_profile + .as_ref() + .map(|active| &active.id) + }) && (!profile.matches_config(&config) || config.permissions.profile_workspace_roots() != self.config.permissions.profile_workspace_roots()) diff --git a/codex-rs/tui/src/app/agents_overview_new.rs b/codex-rs/tui/src/app/agents_overview_new.rs index d422598d5a91..7f7fd04ffce3 100644 --- a/codex-rs/tui/src/app/agents_overview_new.rs +++ b/codex-rs/tui/src/app/agents_overview_new.rs @@ -121,6 +121,13 @@ impl App { return Ok(AppRunControl::Continue); }; let selected_profile = self.chat_widget.thread_id().and_then(|thread_id| { + if let Some(selection) = self + .agents_overview + .requested_permission_profiles + .get(&thread_id) + { + return Some(selection.clone()); + } let source = self.chat_widget.config_ref(); let active = source.permissions.active_permission_profile()?; (self diff --git a/codex-rs/tui/src/app/agents_overview_threads.rs b/codex-rs/tui/src/app/agents_overview_threads.rs index fbe2ae575a89..d8186f20223c 100644 --- a/codex-rs/tui/src/app/agents_overview_threads.rs +++ b/codex-rs/tui/src/app/agents_overview_threads.rs @@ -119,6 +119,9 @@ impl App { self.agents_overview.threads.insert(thread_id, Some(thread)); } ServerNotification::ThreadArchived(_) | ServerNotification::ThreadDeleted(_) => { + self.agents_overview + .requested_permission_profiles + .remove(&thread_id); self.agents_overview .selected_permission_profiles .remove(&thread_id); @@ -132,6 +135,9 @@ impl App { self.agents_overview.removed_threads.remove(&thread_id); } ServerNotification::ThreadClosed(_) => { + self.agents_overview + .requested_permission_profiles + .remove(&thread_id); self.agents_overview.activity.remove(&thread_id); if let Some(usage) = self.agents_overview.usage.get_mut(&thread_id) { usage.tokens = None; @@ -160,6 +166,10 @@ impl App { } ServerNotification::ThreadSettingsUpdated(settings) => { if !self.pending_server_profiles.contains_key(&thread_id) + && !self + .agents_overview + .requested_permission_profiles + .contains_key(&thread_id) && self .agents_overview .selected_permission_profiles diff --git a/codex-rs/tui/src/app/config_persistence.rs b/codex-rs/tui/src/app/config_persistence.rs index 00d2794e3248..d563aa2326ce 100644 --- a/codex-rs/tui/src/app/config_persistence.rs +++ b/codex-rs/tui/src/app/config_persistence.rs @@ -113,6 +113,7 @@ impl App { .await } + #[cfg(test)] pub(super) async fn rebuild_config_for_permission_profile( &self, profile_id: &str, @@ -136,6 +137,8 @@ impl App { .await } + // Local setup for startup fixtures; connected selections always use the server below. + #[cfg(test)] pub(super) async fn apply_permission_profile_selection( &mut self, selection: PermissionProfileSelection, @@ -266,25 +269,11 @@ impl App { pub(super) async fn select_permission_profile( &mut self, app_server: &mut AppServerSession, - selection: PermissionProfileSelection, + mut selection: PermissionProfileSelection, ) { if self.reject_pending_permission_change() { return; } - if (self.chat_widget.thread_id().is_none() && selection.profile_id.starts_with(':')) - || (app_server.thread_params_mode() - == crate::app_server_session::ThreadParamsMode::Embedded - && self - .config - .custom_permission_profiles - .iter() - .any(|profile| profile.id == selection.profile_id)) - { - if self.apply_permission_profile_selection(selection).await { - self.chat_widget.submit_initial_user_message_if_pending(); - } - return; - } let Some(thread_id) = self.chat_widget.thread_id() else { self.chat_widget .retain_input_after_failed_permission_selection(); @@ -293,21 +282,16 @@ impl App { ); return; }; - if !selection.profile_id.starts_with(':') - && self.chat_widget.is_user_turn_pending_or_running() - { - self.chat_widget - .retain_input_after_failed_permission_selection(); - self.chat_widget.add_error_message( - "Wait for the current turn to finish before changing permissions.".into(), - ); - return; - } let config = self.chat_widget.config_ref(); - if config - .permissions - .active_permission_profile() - .is_some_and(|profile| profile.id == selection.profile_id) + if !self + .agents_overview + .requested_permission_profiles + .contains_key(&thread_id) + && selection.profile_id.starts_with(':') + && config + .permissions + .active_permission_profile() + .is_some_and(|profile| profile.id == selection.profile_id) && selection .approval_policy .is_none_or(|policy| config.permissions.approval_policy.value() == policy.to_core()) @@ -330,10 +314,25 @@ impl App { }; match app_server.thread_settings_update(params).await { Ok(true) => { + // Omission preserves the active value on update, but uses defaults on start. + // Retain effective intent across consecutive requests before confirmation. + let previous = self + .agents_overview + .requested_permission_profiles + .get(&thread_id); + selection.approval_policy = selection + .approval_policy + .or_else(|| previous.and_then(|profile| profile.approval_policy)) + .or(Some(config.permissions.approval_policy.value().into())); + selection.approvals_reviewer = selection + .approvals_reviewer + .or_else(|| previous.and_then(|profile| profile.approvals_reviewer)) + .or(Some(config.approvals_reviewer)); self.agents_overview .selected_permission_profiles .insert(thread_id, selection.profile_id.clone()); - self.pending_server_profiles + self.agents_overview + .requested_permission_profiles .insert(thread_id, selection.clone()); self.chat_widget.add_info_message( format!( @@ -386,18 +385,35 @@ impl App { true } - pub(super) fn confirmed_server_profile( + pub(super) fn selected_server_profile( &self, thread_id: ThreadId, ) -> Option { if self.chat_widget.thread_id() != Some(thread_id) { return None; } + if let Some(selection) = self + .agents_overview + .requested_permission_profiles + .get(&thread_id) + { + return Some(selection.clone()); + } + if self.app_server_target.thread_params_mode() + == crate::app_server_session::ThreadParamsMode::Remote + { + return None; + } let config = self.chat_widget.config_ref(); let active = config.permissions.active_permission_profile()?; if active.id.starts_with(':') - || (self.app_server_target.thread_params_mode() - == crate::app_server_session::ThreadParamsMode::Embedded + || (self + .agents_overview + .selected_permission_profiles + .get(&thread_id) + != Some(&active.id) + && self.app_server_target.thread_params_mode() + == crate::app_server_session::ThreadParamsMode::Embedded && self .config .custom_permission_profiles @@ -414,6 +430,44 @@ impl App { }) } + /// Adopt authoritative widget settings before deriving overrides for subsequent turns. + pub(super) fn adopt_server_permissions(&mut self) { + self.chat_widget.set_permission_network(/*network*/ None); + self.config.permissions = self.chat_widget.config_ref().permissions.clone(); + self.config.approvals_reviewer = self.chat_widget.config_ref().approvals_reviewer; + self.runtime_approval_policy_override = Some(RuntimeApprovalPolicyOverride::Explicit( + self.config.permissions.approval_policy.value().into(), + )); + self.runtime_approvals_reviewer_override = if self + .config + .permissions + .active_permission_profile() + .is_some_and(|profile| profile.id.starts_with(':')) + { + Some(self.config.approvals_reviewer) + } else { + self.runtime_approvals_reviewer_override + .filter(|reviewer| *reviewer == self.config.approvals_reviewer) + }; + self.runtime_permission_profile_override = + Some(RuntimePermissionProfileOverride::from_config(&self.config)); + } + + pub(super) fn adopt_inherited_server_selection(&mut self) { + if let Some(thread_id) = self.chat_widget.thread_id() + && let Some(active) = self + .chat_widget + .config_ref() + .permissions + .active_permission_profile() + { + self.agents_overview + .selected_permission_profiles + .insert(thread_id, active.id); + } + self.adopt_server_permissions(); + } + pub(super) async fn refresh_in_memory_config_from_disk(&mut self) -> Result<()> { let mut config = self .rebuild_config_for_cwd(self.chat_widget.config_ref().cwd.to_path_buf()) diff --git a/codex-rs/tui/src/app/event_dispatch.rs b/codex-rs/tui/src/app/event_dispatch.rs index da47c0f7e955..01c9626029b6 100644 --- a/codex-rs/tui/src/app/event_dispatch.rs +++ b/codex-rs/tui/src/app/event_dispatch.rs @@ -533,7 +533,7 @@ impl App { fork_config.model = Some(self.chat_widget.current_model().to_string()); fork_config.model_reasoning_effort = self.chat_widget.current_reasoning_effort(); - let selected_profile = self.confirmed_server_profile(thread_id); + let selected_profile = self.selected_server_profile(thread_id); match app_server.fork_thread_at( &self.local_settings, fork_config, @@ -574,6 +574,9 @@ impl App { .await { Ok(()) => { + if selected_profile.is_some() { + self.adopt_inherited_server_selection(); + } // Keep local input without replacing the fork's running state. self.chat_widget.restore_reconnected_input(retained_input, &[]); if let Some(err) = name_error { diff --git a/codex-rs/tui/src/app/reconnect.rs b/codex-rs/tui/src/app/reconnect.rs index a0e8f9b1a53a..0656ba6e3876 100644 --- a/codex-rs/tui/src/app/reconnect.rs +++ b/codex-rs/tui/src/app/reconnect.rs @@ -327,8 +327,13 @@ impl App { self.pending_app_server_requests.clear(); // The displayed task was resumed above. Keep offscreen selections pending until those // tasks can be resumed from the server too; their old confirmations cannot arrive. - let pending_displayed_profile = - displayed.and_then(|id| self.pending_server_profiles.remove(&id)); + let pending_displayed_profile = displayed.and_then(|id| { + self.pending_server_profiles.remove(&id).or_else(|| { + self.agents_overview + .requested_permission_profiles + .remove(&id) + }) + }); if let Some(selection) = &pending_displayed_profile { self.runtime_approval_policy_override = None; if selection.approvals_reviewer.is_some() { diff --git a/codex-rs/tui/src/app/safety_buffering.rs b/codex-rs/tui/src/app/safety_buffering.rs index edab48f29b8e..705a0fe0e90d 100644 --- a/codex-rs/tui/src/app/safety_buffering.rs +++ b/codex-rs/tui/src/app/safety_buffering.rs @@ -60,6 +60,8 @@ impl App { items, cwd, active_permission_profile, + approval_policy, + approvals_reviewer, model: turn_model, effort, collaboration_mode, @@ -180,7 +182,7 @@ impl App { let retry_display = ChatWidget::user_message_display_from_inputs(items); self.config = retry_config.clone(); - let selected_profile = self.confirmed_server_profile(thread_id); + let selected_profile = self.selected_server_profile(thread_id); let started = app_server .fork_thread_at( &self.local_settings, @@ -200,6 +202,9 @@ impl App { } }; let retry_thread_id = started.session.thread_id; + *approval_policy = started.session.approval_policy; + *approvals_reviewer = Some(started.session.approvals_reviewer); + *active_permission_profile = started.session.active_permission_profile.clone(); self.detach_current_thread_for_navigation(app_server, Some(retry_thread_id)) .await; @@ -216,6 +221,9 @@ impl App { return; } + if selected_profile.is_some() { + self.adopt_inherited_server_selection(); + } let failure_input_state = input_state.clone(); self.chat_widget.restore_thread_input_state( input_state, diff --git a/codex-rs/tui/src/app/session_lifecycle.rs b/codex-rs/tui/src/app/session_lifecycle.rs index 4723dec35306..1516cba09856 100644 --- a/codex-rs/tui/src/app/session_lifecycle.rs +++ b/codex-rs/tui/src/app/session_lifecycle.rs @@ -757,6 +757,20 @@ impl App { self.app_event_tx .send(AppEvent::ResetTranscriptForThreadSwitch); self.replay_thread_snapshot(snapshot, resume_restored_queue); + if let Some(thread_id) = self.chat_widget.thread_id() + && let Some(active) = self + .chat_widget + .config_ref() + .permissions + .active_permission_profile() + && self + .agents_overview + .selected_permission_profiles + .get(&thread_id) + == Some(&active.id) + { + self.adopt_server_permissions(); + } if external_writer { self.chat_widget.show_external_writer_thread(); } diff --git a/codex-rs/tui/src/app/side.rs b/codex-rs/tui/src/app/side.rs index f4006ba36ae5..e55aeb8892dd 100644 --- a/codex-rs/tui/src/app/side.rs +++ b/codex-rs/tui/src/app/side.rs @@ -722,8 +722,14 @@ impl App { .await; let fork_config = self.side_fork_config(); + let selected_profile = self.selected_server_profile(parent_thread_id); match app_server - .fork_side_thread(&self.local_settings, fork_config, parent_thread_id) + .fork_side_thread( + &self.local_settings, + fork_config, + parent_thread_id, + selected_profile.as_ref(), + ) .await { Ok(forked) => { @@ -779,6 +785,9 @@ impl App { return Ok(AppRunControl::Continue); } if self.active_thread_id == Some(child_thread_id) { + if selected_profile.is_some() { + self.adopt_inherited_server_selection(); + } if let Some(user_message) = user_message.take() { let _ = self .chat_widget diff --git a/codex-rs/tui/src/app/tests.rs b/codex-rs/tui/src/app/tests.rs index 8d54e52e558b..34e83eab49ff 100644 --- a/codex-rs/tui/src/app/tests.rs +++ b/codex-rs/tui/src/app/tests.rs @@ -2862,6 +2862,20 @@ async fn handle_start_side_seeds_navigation_before_thread_started() -> Result<() while app_event_rx.try_recv().is_ok() {} let mut tui = crate::tui::test_support::make_test_tui()?; + app.runtime_permission_profile_override = Some(RuntimePermissionProfileOverride::from_config( + app.chat_widget.config_ref(), + )); + app.select_permission_profile( + &mut app_server, + PermissionProfileSelection { + profile_id: ":read-only".into(), + approval_policy: Some(AskForApproval::OnRequest), + approvals_reviewer: Some(ApprovalsReviewer::User), + display_label: "Read Only".into(), + }, + ) + .await; + let control = Box::pin(app.handle_start_side( &mut tui, &mut app_server, @@ -2903,6 +2917,53 @@ async fn handle_start_side_seeds_navigation_before_thread_started() -> Result<() } assert!(saw_thread_started); + assert_eq!( + app.config.permissions.permission_profile(), + &PermissionProfile::read_only() + ); + assert_eq!( + app.runtime_permission_profile_override, + Some(RuntimePermissionProfileOverride::from_config( + app.chat_widget.config_ref() + )) + ); + app.select_agent_thread(&mut tui, &mut app_server, parent_thread_id) + .await?; + app.select_permission_profile( + &mut app_server, + PermissionProfileSelection { + profile_id: ":workspace".into(), + approval_policy: Some(AskForApproval::OnRequest), + approvals_reviewer: Some(ApprovalsReviewer::User), + display_label: "Workspace".into(), + }, + ) + .await; + app.select_agent_thread(&mut tui, &mut app_server, side_thread_id) + .await?; + let settings = next_thread_settings_updated(&mut app_server, parent_thread_id).await; + app.enqueue_thread_notification( + parent_thread_id, + ServerNotification::ThreadSettingsUpdated(settings), + ) + .await?; + app.select_agent_thread(&mut tui, &mut app_server, parent_thread_id) + .await?; + assert_eq!( + app.config + .permissions + .active_permission_profile() + .unwrap() + .id, + ":workspace" + ); + assert_eq!( + app.runtime_permission_profile_override, + Some(RuntimePermissionProfileOverride::from_config( + app.chat_widget.config_ref() + )) + ); + app_server.shutdown().await?; Ok(()) } @@ -3112,23 +3173,6 @@ async fn server_only_profile_selection_keeps_turns_on_the_selected_profile() -> @"• Permission selection requested: server-only" ); let mut tui = crate::tui::test_support::make_test_tui()?; - app.select_permission_profile(&mut server, selection.clone()) - .await; - insta::assert_snapshot!( - next_history_message(&mut events), - @"■ Wait for permissions to update before changing permissions." - ); - app.handle_event( - &mut tui, - &mut server, - AppEvent::ForkCurrentSession { name: None }, - ) - .await?; - let _ = next_history_message(&mut events); - insta::assert_snapshot!( - next_history_message(&mut events), - @"■ Wait for permissions to update before forking." - ); app.chat_widget .restore_user_message_to_composer("use the selected profile".into()); app.chat_widget @@ -3171,6 +3215,7 @@ async fn server_only_profile_selection_keeps_turns_on_the_selected_profile() -> ); let endpoint = crate::resolve_remote_addr("ws://127.0.0.1:8765")?; app.app_server_target = crate::AppServerTarget::Remote { endpoint }; + assert!(app.selected_server_profile(thread_id).is_none()); while events.try_recv().is_ok() {} app.change_working_directory(&mut tui, &mut server, home.path().abs()) .await; @@ -3206,20 +3251,24 @@ async fn server_only_profile_selection_keeps_turns_on_the_selected_profile() -> .restore_user_message_to_composer("queued follow-up".into()); app.chat_widget .handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); - let selection = app - .confirmed_server_profile(thread_id) - .expect("server profile"); + let selection = PermissionProfileSelection { + profile_id: "server-only".into(), + approval_policy: None, + approvals_reviewer: None, + display_label: "server-only".into(), + }; app.select_permission_profile(&mut server, selection).await; insta::assert_snapshot!( next_history_message(&mut events), - @"■ Wait for the current turn to finish before changing permissions." + @"• Permission selection requested: server-only" ); app.handle_event(&mut tui, &mut server, AppEvent::SettingsSelectionSettled) .await?; app.handle_thread_event_now(ThreadBufferedEvent::Notification(Box::new( turn_completed_notification(thread_id, "second", TurnStatus::Completed), ))); - assert!(app.chat_widget.has_queued_follow_up_messages()); + assert!(!app.chat_widget.has_queued_follow_up_messages()); + let _ = next_user_turn_op(&mut ops); server.shutdown().await?; Ok(()) } @@ -9232,7 +9281,10 @@ async fn selecting_cyber_model_defaults_active_thread_to_auto_review() { .await .expect("pending permission selection should block the cyber model"); assert_eq!(app.chat_widget.current_model(), previous_model); - app.pending_server_profiles.remove(&thread_id); + let previous_selection = app.pending_server_profiles.remove(&thread_id).unwrap(); + app.agents_overview + .requested_permission_profiles + .insert(thread_id, previous_selection); app.handle_event( &mut tui, &mut app_server, @@ -9242,6 +9294,11 @@ async fn selecting_cyber_model_defaults_active_thread_to_auto_review() { .expect("model selection should succeed"); assert!(app.pending_server_profiles.contains_key(&thread_id)); + assert!( + !app.agents_overview + .requested_permission_profiles + .contains_key(&thread_id) + ); let notification = next_thread_settings_updated(&mut app_server, thread_id).await; assert_eq!( notification.thread_settings.approval_policy, diff --git a/codex-rs/tui/src/app/tests/active_reconnect_tests.rs b/codex-rs/tui/src/app/tests/active_reconnect_tests.rs index 8f9c54761834..de130ba8d305 100644 --- a/codex-rs/tui/src/app/tests/active_reconnect_tests.rs +++ b/codex-rs/tui/src/app/tests/active_reconnect_tests.rs @@ -206,7 +206,7 @@ async fn reconnect_restores_history_permissions_and_resumes_unsent_input() -> Re let mut tui = crate::tui::test_support::make_test_tui()?; if pending_profile { app.runtime_approvals_reviewer_override = Some(ApprovalsReviewer::User); - app.pending_server_profiles.insert( + app.agents_overview.requested_permission_profiles.insert( id, PermissionProfileSelection { profile_id: "server-only".into(), @@ -303,6 +303,7 @@ async fn reconnect_restores_history_permissions_and_resumes_unsent_input() -> Re ); } assert!(app.pending_server_profiles.is_empty()); + assert!(app.agents_overview.requested_permission_profiles.is_empty()); if pending_profile { assert_eq!( app.resume_permission_overrides(&app.config), diff --git a/codex-rs/tui/src/app/tests/background_task_defaults_tests.rs b/codex-rs/tui/src/app/tests/background_task_defaults_tests.rs index 0162d1e1a655..16862db0fa3b 100644 --- a/codex-rs/tui/src/app/tests/background_task_defaults_tests.rs +++ b/codex-rs/tui/src/app/tests/background_task_defaults_tests.rs @@ -23,7 +23,12 @@ async fn confirm_permission_selection( ServerNotification::ThreadSettingsUpdated(settings), ) .await?; - if !app.pending_server_profiles.contains_key(&thread_id) { + if !app.pending_server_profiles.contains_key(&thread_id) + && !app + .agents_overview + .requested_permission_profiles + .contains_key(&thread_id) + { return Ok(()); } } @@ -659,7 +664,7 @@ async fn command_center_new_preserves_only_selected_server_profiles() -> Result< let home = tempdir()?; std::fs::write( home.path().join("config.toml"), - "default_permissions = \":workspace\"\n[permissions.server-only]\nextends = \":read-only\"\n", + "approval_policy = \"never\"\napprovals_reviewer = \"auto_review\"\ndefault_permissions = \":workspace\"\n[permissions.server-only]\nextends = \":read-only\"\n", )?; let server_config = ConfigBuilder::default() .codex_home(home.path().into()) @@ -729,16 +734,53 @@ async fn command_center_new_preserves_only_selected_server_profiles() -> Result< "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "saved history"}] }))?]).await?; } - app.select_permission_profile(&mut server, selection.clone()) - .await; + // Omitted custom-profile fields must preserve the preceding accepted choice, + // even before either settings notification reaches the TUI. + app.select_permission_profile( + &mut server, + PermissionProfileSelection { + profile_id: ":read-only".into(), + ..selection.clone() + }, + ) + .await; + // Drain without applying it: confirmation is still pending in the TUI, but + // the server cannot coalesce both updates into one latest snapshot. + let _ = next_thread_settings_updated(&mut server, thread_id).await; + app.select_permission_profile( + &mut server, + PermissionProfileSelection { + approval_policy: None, + approvals_reviewer: None, + ..selection.clone() + }, + ) + .await; let view = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); app.chat_widget.show_bottom_pane_view(Box::new(view)); app.new_agents_overview_session(&mut tui, &mut server, /*cwd*/ None) .await?; - assert_eq!(app.chat_widget.thread_id(), Some(thread_id)); - insta::assert_snapshot!( - "command_center_pending_server_permissions", - crate::chatwidget::tests::helpers::render_bottom_popup(&app.chat_widget, /*width*/ 80) + assert_ne!(app.chat_widget.thread_id(), Some(thread_id)); + assert_eq!( + app.chat_widget + .config_ref() + .permissions + .active_permission_profile(), + Some(ActivePermissionProfile { + id: "server-only".into(), + extends: Some(":read-only".into()) + }), + ); + assert_eq!( + ( + app.chat_widget + .config_ref() + .permissions + .approval_policy + .value(), + app.chat_widget.config_ref().approvals_reviewer, + ), + (AskForApproval::OnRequest.to_core(), ApprovalsReviewer::User) ); let settings = next_thread_settings_updated(&mut server, thread_id).await; app.enqueue_thread_notification( @@ -786,6 +828,7 @@ async fn command_center_new_preserves_only_selected_server_profiles() -> Result< .remove(&app.chat_widget.thread_id().unwrap()); app.select_permission_profile(&mut server, selection.clone()) .await; + assert!(!app.reject_pending_permission_change()); } } server.shutdown().await?; @@ -1133,6 +1176,17 @@ async fn command_center_new_checkout_and_worktree_preserve_source_and_default_br app.chat_widget .set_feature_enabled(Feature::GuardianApproval, /*enabled*/ true); Box::pin(app.handle_event(&mut tui, &mut server, AppEvent::OpenPermissionsPopup)).await?; + tokio::time::timeout(Duration::from_secs(3), async { + while let Some(event) = events.recv().await { + let loaded = matches!(&event, AppEvent::PermissionProfilesLoaded { .. }); + Box::pin(app.handle_event(&mut tui, &mut server, event)).await?; + if loaded { + return Ok::<_, color_eyre::Report>(()); + } + } + color_eyre::eyre::bail!("permissions menu event stream closed") + }) + .await??; app.chat_widget.handle_key_event(KeyCode::Up.into()); app.chat_widget.handle_key_event(KeyCode::Enter.into()); while let Ok(event) = events.try_recv() { diff --git a/codex-rs/tui/src/app/tests/permission_selection_tests.rs b/codex-rs/tui/src/app/tests/permission_selection_tests.rs index 2c66fdfe4492..d24946fa30ba 100644 --- a/codex-rs/tui/src/app/tests/permission_selection_tests.rs +++ b/codex-rs/tui/src/app/tests/permission_selection_tests.rs @@ -11,7 +11,6 @@ async fn builtin_permission_selection_adopts_server_settings() -> Result<()> { let thread_id = started.session.thread_id; app.enqueue_primary_thread_session(started.session, started.turns) .await?; - let other = server.start_thread(&app.config).await?.session.thread_id; // A previously selected custom profile may have left a profile-specific proxy cached. let home = tempdir()?; std::fs::write( @@ -65,17 +64,12 @@ proxy_url = "http://127.0.0.1:43128" RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), before, ); - assert!(app.pending_server_profiles.contains_key(&thread_id)); + assert!( + app.agents_overview + .requested_permission_profiles + .contains_key(&thread_id) + ); insta::assert_snapshot!(next_history_message(&mut events).replace(profile_id, ""), @"• Permission selection requested: "); - while events.try_recv().is_ok() {} - let mut tui = crate::tui::test_support::make_test_tui()?; - app.handle_event(&mut tui, &mut server, AppEvent::NewSession { name: None }) - .await?; - assert_eq!(app.chat_widget.thread_id(), Some(thread_id)); - insta::assert_snapshot!(next_history_message(&mut events), @"■ Wait for permissions to update before switching tasks."); - app.select_agents_overview_thread(&mut tui, &mut server, other) - .await?; - assert_eq!(app.chat_widget.thread_id(), Some(thread_id)); let settings = next_thread_settings_updated(&mut server, thread_id).await; app.enqueue_thread_notification( thread_id, @@ -139,3 +133,251 @@ async fn matching_builtin_permission_selection_submits_pending_prompt() -> Resul server.shutdown().await?; Ok(()) } + +#[tokio::test] +async fn custom_permission_selection_uses_server_definition_and_preserves_state_on_rejection() +-> Result<()> { + let (mut app, mut events, _ops) = make_test_app_with_channels().await; + app.config.ephemeral = false; + let home = tempdir()?; + std::fs::write( + home.path().join("config.toml"), + "default_permissions = \":workspace\"\n[permissions.shared]\nextends = \":workspace\"\n", + )?; + let server_config = ConfigBuilder::default() + .codex_home(home.path().into()) + .build() + .await?; + let mut server = crate::start_embedded_app_server_for_picker(&server_config).await?; + let started = server.start_thread(&app.config).await?; + let thread_id = started.session.thread_id; + app.enqueue_primary_thread_session(started.session, started.turns) + .await?; + let client_home = tempdir()?; + std::fs::write( + client_home.path().join("config.toml"), + "default_permissions = \":workspace\"\n[permissions.shared]\nextends = \":danger-full-access\"\n", + )?; + let client_config = ConfigBuilder::default() + .codex_home(client_home.path().into()) + .build() + .await?; + app.config.codex_home = client_config.codex_home; + app.config.custom_permission_profiles = client_config.custom_permission_profiles; + let selection = PermissionProfileSelection { + profile_id: "shared".into(), + approval_policy: Some(AskForApproval::Never), + approvals_reviewer: None, + display_label: "shared".into(), + }; + app.chat_widget.handle_server_notification( + turn_started_notification(thread_id, "turn-1"), + /*replay_kind*/ None, + ); + assert!(app.chat_widget.is_user_turn_pending_or_running()); + let before = RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()); + app.select_permission_profile(&mut server, selection.clone()) + .await; + assert_eq!( + RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), + before + ); + let settings = next_thread_settings_updated(&mut server, thread_id).await; + let expected = PermissionProfile::from_legacy_sandbox_policy_for_cwd( + &settings.thread_settings.sandbox_policy.to_core(), + settings.thread_settings.cwd.as_path(), + ); + assert!(matches!( + settings.thread_settings.sandbox_policy, + codex_app_server_protocol::SandboxPolicy::WorkspaceWrite { .. } + )); + app.enqueue_thread_notification( + thread_id, + ServerNotification::ThreadSettingsUpdated(settings), + ) + .await?; + assert_eq!( + ( + app.chat_widget + .config_ref() + .permissions + .permission_profile(), + app.chat_widget + .config_ref() + .permissions + .approval_policy + .value() + ), + (&expected, AskForApproval::Never.to_core()) + ); + std::fs::write( + home.path().join("config.toml"), + "default_permissions = \":workspace\"\n[permissions.shared]\nextends = \":read-only\"\n", + )?; + app.select_permission_profile( + &mut server, + PermissionProfileSelection { + approval_policy: None, + ..selection.clone() + }, + ) + .await; + let settings = next_thread_settings_updated(&mut server, thread_id).await; + assert!(matches!( + settings.thread_settings.sandbox_policy, + codex_app_server_protocol::SandboxPolicy::ReadOnly { .. } + )); + app.enqueue_thread_notification( + thread_id, + ServerNotification::ThreadSettingsUpdated(settings), + ) + .await?; + app.chat_widget.handle_server_notification( + turn_completed_notification(thread_id, "turn-1", TurnStatus::Completed), + /*replay_kind*/ None, + ); + // Unchanged re-selection is accepted without requiring a notification. + app.select_permission_profile(&mut server, selection.clone()) + .await; + assert!(!app.reject_pending_permission_change()); + let confirmed = RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()); + let confirmed_config = app.config.clone(); + app.select_permission_profile( + &mut server, + PermissionProfileSelection { + profile_id: "missing-on-server".into(), + ..selection + }, + ) + .await; + assert_eq!( + RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), + confirmed + ); + assert!(!app.pending_server_profiles.contains_key(&thread_id)); + assert_eq!(app.config, confirmed_config); + assert_eq!( + app.agents_overview + .selected_permission_profiles + .get(&thread_id) + .map(String::as_str), + Some("shared") + ); + // Materialize the task so /fork exercises persisted history with the confirmed profile. + server.thread_inject_items(thread_id, vec![serde_json::from_value(serde_json::json!({ + "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "saved history"}] + }))?]).await?; + let mut tui = crate::tui::test_support::make_test_tui()?; + while events.try_recv().is_ok() {} + app.change_working_directory(&mut tui, &mut server, client_home.path().abs()) + .await; + assert_eq!(app.chat_widget.thread_id(), Some(thread_id)); + insta::assert_snapshot!(next_history_message(&mut events), @"■ Changing directories with an unconfirmed named profile is not supported."); + let side = server + .fork_side_thread( + &app.local_settings, + app.config.clone(), + thread_id, + app.agents_overview + .requested_permission_profiles + .get(&thread_id), + ) + .await?; + assert_eq!( + ( + side.session.permission_profile, + side.session.approval_policy + ), + (PermissionProfile::read_only(), AskForApproval::Never) + ); + app.cli_kv_overrides.push(( + "permissions.shared.extends".into(), + TomlValue::String(":danger-full-access".into()), + )); + // Both the accepted request and its confirmed descendant remain server-owned. + for _ in 0..2 { + let previous_thread_id = app.chat_widget.thread_id(); + app.handle_event( + &mut tui, + &mut server, + AppEvent::ForkCurrentSession { name: None }, + ) + .await?; + assert_ne!(app.chat_widget.thread_id(), previous_thread_id); + assert_eq!( + RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), + confirmed + ); + } + server.shutdown().await?; + Ok(()) +} + +#[tokio::test] +async fn accepted_permissions_survive_directory_change_before_notification() -> Result<()> { + for preserve_history in [false, true] { + let (mut app, _events, _ops) = make_test_app_with_channels().await; + app.config.ephemeral = false; + app.config + .permissions + .set_permission_profile(PermissionProfile::Disabled)?; + let destination = app.config.codex_home.join("destination"); + std::fs::create_dir(&destination)?; + crate::legacy_core::config::set_project_trust_level( + app.config.codex_home.as_path(), + &destination, + codex_protocol::config_types::TrustLevel::Trusted, + ) + .map_err(|err| color_eyre::eyre::eyre!(err.to_string()))?; + let mut server = crate::start_embedded_app_server_for_picker(&app.config).await?; + let started = server.start_thread(&app.config).await?; + let source = started.session.thread_id; + app.enqueue_primary_thread_session(started.session, started.turns) + .await?; + app.runtime_permission_profile_override = + Some(RuntimePermissionProfileOverride::from_config(&app.config)); + if preserve_history { + server.thread_inject_items(source, vec![serde_json::from_value(serde_json::json!({ + "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "saved history"}] + }))?]).await?; + } + app.select_permission_profile( + &mut server, + PermissionProfileSelection { + profile_id: ":read-only".into(), + approval_policy: Some(AskForApproval::OnRequest), + approvals_reviewer: Some(ApprovalsReviewer::User), + display_label: "Read Only".into(), + }, + ) + .await; + assert!( + app.agents_overview + .requested_permission_profiles + .contains_key(&source), + "selection must be unconfirmed" + ); + // Destination constraints belong to the client; the server's result is authoritative. + let requirements = app.config.codex_home.join("client-requirements.toml"); + std::fs::write(&requirements, "allowed_approval_policies = [\"never\"]")?; + app.loader_overrides.system_requirements_path = Some(requirements.to_path_buf()); + let mut tui = crate::tui::test_support::make_test_tui()?; + app.change_working_directory(&mut tui, &mut server, destination.clone()) + .await; + assert_ne!(app.chat_widget.thread_id(), Some(source)); + assert_eq!( + (&app.config.cwd, app.config.permissions.permission_profile()), + (&destination, &PermissionProfile::read_only()) + ); + assert_eq!( + app.config.permissions.approval_policy.value(), + AskForApproval::OnRequest.to_core() + ); + assert_eq!( + app.runtime_permission_profile_override, + Some(RuntimePermissionProfileOverride::from_config(&app.config)) + ); + server.shutdown().await?; + } + Ok(()) +} diff --git a/codex-rs/tui/src/app/tests/permission_shortcuts_tests.rs b/codex-rs/tui/src/app/tests/permission_shortcuts_tests.rs index 111ff663b6da..7076d8997b46 100644 --- a/codex-rs/tui/src/app/tests/permission_shortcuts_tests.rs +++ b/codex-rs/tui/src/app/tests/permission_shortcuts_tests.rs @@ -105,7 +105,11 @@ async fn permission_shortcut_confirms_without_persisting() -> Result<()> { RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), before ); - assert!(app.pending_server_profiles.contains_key(&thread_id)); + assert!( + app.agents_overview + .requested_permission_profiles + .contains_key(&thread_id) + ); insta::assert_snapshot!( next_history_message(&mut events), @"• Permission selection requested: Read Only" diff --git a/codex-rs/tui/src/app/tests/safety_buffering.rs b/codex-rs/tui/src/app/tests/safety_buffering.rs index ca516eda0f9b..f366341c79c5 100644 --- a/codex-rs/tui/src/app/tests/safety_buffering.rs +++ b/codex-rs/tui/src/app/tests/safety_buffering.rs @@ -40,6 +40,7 @@ const SAFETY_RETRY_THREAD_NAME: &str = "Safety retry source"; enum SafetyRetryScenario { Once, RetryTwice, + PendingPermissions, InterruptedPrevious, UnsupportedPermissions, } @@ -569,6 +570,16 @@ goals = true .enable(Feature::Goals) .expect("test config should allow goals"); + if scenario == SafetyRetryScenario::PendingPermissions { + app.config + .permissions + .set_permission_profile_from_session_snapshot( + PermissionProfileSnapshot::from_session_snapshot( + PermissionProfile::Disabled, + Some(ActivePermissionProfile::new(":danger-full-access")), + ), + )?; + } let mut tui = crate::tui::test_support::make_test_tui()?; let mut app_server = Box::pin(crate::start_embedded_app_server_for_picker(&app.config)).await?; let mut started = app_server.start_thread(&app.config).await?; @@ -783,6 +794,22 @@ goals = true } } + if scenario == SafetyRetryScenario::PendingPermissions { + app.runtime_permission_profile_override = Some( + RuntimePermissionProfileOverride::from_config(app.chat_widget.config_ref()), + ); + app.select_permission_profile( + &mut app_server, + PermissionProfileSelection { + profile_id: ":read-only".into(), + approval_policy: Some(AskForApproval::OnRequest), + approvals_reviewer: Some(ApprovalsReviewer::User), + display_label: "Read Only".into(), + }, + ) + .await; + } + Box::pin(app.retry_safety_buffered_turn( &mut tui, &mut app_server, @@ -923,6 +950,15 @@ goals = true let retry_thread_id = app.chat_widget.thread_id().expect("retry thread id"); // Capture the completed retry before processing its automatic goal continuation. wait_for_turn_completed(&mut app, &mut app_server, retry_thread_id).await; + if scenario == SafetyRetryScenario::PendingPermissions { + assert_eq!( + app.chat_widget + .config_ref() + .permissions + .permission_profile(), + &PermissionProfile::read_only() + ); + } let mut replayed_history = String::new(); while let Ok(event) = app_event_rx.try_recv() { if let AppEvent::InsertHistoryCell(cell) = event { @@ -1165,3 +1201,14 @@ async fn safety_retry_rejects_unsupported_permissions_before_interrupting() -> R ) .await } + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn safety_retry_preserves_unconfirmed_permissions_on_its_first_turn() -> Result<()> { + run_safety_retry( + /*previous_prompt*/ None, + /*failing_draft*/ None, + /*committed_steer*/ None, + SafetyRetryScenario::PendingPermissions, + ) + .await +} diff --git a/codex-rs/tui/src/app/tests/session_lifecycle_requests.rs b/codex-rs/tui/src/app/tests/session_lifecycle_requests.rs index bb74f6c17cc3..4c788dc0f7a7 100644 --- a/codex-rs/tui/src/app/tests/session_lifecycle_requests.rs +++ b/codex-rs/tui/src/app/tests/session_lifecycle_requests.rs @@ -725,7 +725,12 @@ async fn delete_current_thread_navigates_only_after_success() -> Result<()> { let mut side_config = app.config.clone(); side_config.ephemeral = true; let side = server - .fork_side_thread(&app.local_settings, side_config.clone(), thread_id) + .fork_side_thread( + &app.local_settings, + side_config.clone(), + thread_id, + /*selected_profile*/ None, + ) .await?; let side_id = side.session.thread_id; app.side_threads @@ -735,7 +740,12 @@ async fn delete_current_thread_navigates_only_after_success() -> Result<()> { side_config.cwd = side_config.cwd.join("failure"); assert!( server - .fork_side_thread(&app.local_settings, side_config, thread_id) + .fork_side_thread( + &app.local_settings, + side_config, + thread_id, + /*selected_profile*/ None + ) .await .is_err() ); @@ -1013,7 +1023,12 @@ async fn archive_current_thread_returns_shared_servers_to_agents() -> Result<()> let mut side_config = app.config.clone(); side_config.ephemeral = true; let side = server - .fork_side_thread(&app.local_settings, side_config, thread_id) + .fork_side_thread( + &app.local_settings, + side_config, + thread_id, + /*selected_profile*/ None, + ) .await?; let side_id = side.session.thread_id; app.side_threads @@ -2822,6 +2837,7 @@ async fn paginated_workflows_never_request_full_thread_history() -> Result<()> { &crate::local_settings::LocalSettings::from(&side_config), side_config, paginated_thread_id, + /*selected_profile*/ None, )) .await?; diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_task_defaults_tests__command_center_pending_server_permissions.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_task_defaults_tests__command_center_pending_server_permissions.snap deleted file mode 100644 index bd7838ae7ced..000000000000 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_task_defaults_tests__command_center_pending_server_permissions.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tui/src/app/tests/background_task_defaults_tests.rs -expression: "crate::chatwidget::tests::helpers::render_bottom_popup(&app.chat_widget, 80)" ---- - Unable to complete action - Wait for permissions to update before starting a session. - - -› 1. Return to command center - - enter select · esc back diff --git a/codex-rs/tui/src/app/thread_routing.rs b/codex-rs/tui/src/app/thread_routing.rs index 341eaa057c79..188d971ed537 100644 --- a/codex-rs/tui/src/app/thread_routing.rs +++ b/codex-rs/tui/src/app/thread_routing.rs @@ -827,7 +827,12 @@ impl App { } if should_start_turn { let config = self.chat_widget.config_ref(); - let selected_profile = self.pending_server_profiles.get(&thread_id); + let selected_profile = + self.pending_server_profiles.get(&thread_id).or_else(|| { + self.agents_overview + .requested_permission_profiles + .get(&thread_id) + }); let selected_active = selected_profile .map(|profile| ActivePermissionProfile::new(profile.profile_id.clone())); let (turn_approval_policy, turn_approvals_reviewer) = @@ -1196,6 +1201,11 @@ impl App { if self .pending_server_profiles .get(&thread_id) + .or_else(|| { + self.agents_overview + .requested_permission_profiles + .get(&thread_id) + }) .is_some_and(|selected| { notification .thread_settings @@ -1210,7 +1220,11 @@ impl App { }) }) { - confirmed_profile = self.pending_server_profiles.remove(&thread_id); + confirmed_profile = self.pending_server_profiles.remove(&thread_id).or_else(|| { + self.agents_overview + .requested_permission_profiles + .remove(&thread_id) + }); } } let inferred_session = if let ServerNotification::ThreadStarted(started) = ¬ification @@ -1298,41 +1312,9 @@ impl App { .on_thread_settings_updated(settings.clone()); notification = None; } - if let Some(selected) = confirmed_profile { + if confirmed_profile.is_some() { if self.chat_widget.thread_id() == Some(thread_id) { - if selected.approvals_reviewer.is_some() { - self.runtime_approvals_reviewer_override = None; - } - self.runtime_permission_profile_override = None; - } - if self.chat_widget.thread_id() == Some(thread_id) - && let Some(profile) = self - .chat_widget - .config_ref() - .permissions - .active_permission_profile() - && profile.id.starts_with(':') - { - let config = self.chat_widget.config_ref(); - let network = config - .network_proxy_spec_for_active_permission_profile( - &profile, - config.permissions.permission_profile(), - ) - .unwrap_or_else(|err| { - tracing::warn!(%err, "failed to refresh local permission network settings"); - None - }); - self.chat_widget.set_permission_network(network); - self.config.permissions = self.chat_widget.config_ref().permissions.clone(); - self.config.approvals_reviewer = self.chat_widget.config_ref().approvals_reviewer; - self.runtime_approval_policy_override = - Some(RuntimeApprovalPolicyOverride::Explicit( - self.config.permissions.approval_policy.value().into(), - )); - self.runtime_approvals_reviewer_override = Some(self.config.approvals_reviewer); - self.runtime_permission_profile_override = - Some(RuntimePermissionProfileOverride::from_config(&self.config)); + self.adopt_server_permissions(); } self.app_event_tx.send(AppEvent::SettingsSelectionSettled); } @@ -1574,6 +1556,9 @@ impl App { let thread_id = session.thread_id; self.pending_server_profiles.remove(&thread_id); + self.agents_overview + .requested_permission_profiles + .remove(&thread_id); if self.primary_thread_id != Some(thread_id) { self.recap.reset_for_new_thread(Instant::now()); } diff --git a/codex-rs/tui/src/app/thread_settings.rs b/codex-rs/tui/src/app/thread_settings.rs index 2a3eae013fab..66c7b4e64ea3 100644 --- a/codex-rs/tui/src/app/thread_settings.rs +++ b/codex-rs/tui/src/app/thread_settings.rs @@ -218,19 +218,29 @@ impl App { if !thread_settings_update_has_changes(¶ms) { return false; } - if ThreadId::from_string(¶ms.thread_id) - .ok() - .is_some_and(|thread_id| self.pending_server_profiles.contains_key(&thread_id)) - && (params.cwd.is_some() - || params.approval_policy.is_some() - || params.approvals_reviewer.is_some() - || params.sandbox_policy.is_some() - || params.permissions.is_some()) + let thread_id = ThreadId::from_string(¶ms.thread_id).ok(); + let changes_permissions = params.cwd.is_some() + || params.approval_policy.is_some() + || params.approvals_reviewer.is_some() + || params.sandbox_policy.is_some() + || params.permissions.is_some(); + if changes_permissions + && thread_id.is_some_and(|id| self.pending_server_profiles.contains_key(&id)) { return false; } match app_server.thread_settings_update(params).await { - Ok(settings_updated) => settings_updated, + Ok(settings_updated) => { + if settings_updated + && changes_permissions + && let Some(thread_id) = thread_id + { + self.agents_overview + .requested_permission_profiles + .remove(&thread_id); + } + settings_updated + } Err(err) => { tracing::warn!("failed to update app-server thread settings from TUI: {err}"); self.chat_widget diff --git a/codex-rs/tui/src/app/working_directory.rs b/codex-rs/tui/src/app/working_directory.rs index 76187b34a36a..db28e72c92b6 100644 --- a/codex-rs/tui/src/app/working_directory.rs +++ b/codex-rs/tui/src/app/working_directory.rs @@ -22,6 +22,7 @@ pub(super) struct ManagedWorktreeAttach { keymap: RuntimeKeymap, cwd: AbsolutePathBuf, name_error: Option, + selected_profile: Option, } /// A /cd request awaiting a fresh event-loop iteration. @@ -177,6 +178,19 @@ impl App { "Changing directories with a named profile is not supported.", ); } + let selected_profile = self + .agents_overview + .requested_permission_profiles + .get(&thread_id) + .cloned(); + if selected_profile + .as_ref() + .is_some_and(|profile| !profile.profile_id.starts_with(':')) + { + return self.working_directory_error( + "Changing directories with an unconfirmed named profile is not supported.", + ); + } let cells = &self.transcript_cells; if cells.iter().any(|cell| cell.as_any().is::()) { return self.working_directory_error("MCP inventory is still loading."); @@ -330,6 +344,7 @@ impl App { let profile = self .runtime_permission_profile_override .as_ref() + .filter(|_| selected_profile.is_none()) .filter(|profile| { scope == RuntimePolicyOverrideScope::All || profile.turn_override == RuntimePermissionProfileTurnOverride::LegacySandbox @@ -356,12 +371,15 @@ impl App { { return self.working_directory_error("Permission profile cannot be preserved by /cd."); } - if let Err(error) = self.apply_runtime_policy_overrides(&mut config, scope) { + if selected_profile.is_none() + && let Err(error) = self.apply_runtime_policy_overrides(&mut config, scope) + { return self.working_directory_error(format!("{error:#}")); } let actual = config.permissions.approval_policy.value(); let approval = self .runtime_approval_policy_override + .filter(|_| selected_profile.is_none()) .filter(|value| { scope == RuntimePolicyOverrideScope::All || matches!(value, RuntimeApprovalPolicyOverride::Explicit(_)) @@ -436,7 +454,7 @@ impl App { /*last_turn_id*/ None, /*before_turn_id*/ None, DeferUntilNextTurn, - /*selected_profile*/ None, + selected_profile.as_ref(), ) .await } else { @@ -446,7 +464,7 @@ impl App { &config, /*session_start_source*/ None, /*remote_cwd_override*/ None, - /*selected_profile*/ None, + selected_profile.as_ref(), ) .await }; @@ -455,12 +473,27 @@ impl App { Err(e) => return self.working_directory_error(format!("Failed to change: {e}")), }; let session = &transitioned.session; + let permissions_match = if let Some(selected) = &selected_profile { + session + .active_permission_profile + .as_ref() + .is_some_and(|active| active.id == selected.profile_id) + && selected + .approval_policy + .is_none_or(|policy| session.approval_policy == policy) + && selected + .approvals_reviewer + .is_none_or(|reviewer| session.approvals_reviewer == reviewer) + } else { + session.approval_policy.to_core() == config.permissions.approval_policy.value() + && session.approvals_reviewer == config.approvals_reviewer + && session.active_permission_profile + == config.permissions.active_permission_profile() + }; if session.thread_id == thread_id || crate::session_resume::cwds_differ(session.cwd.as_path(), cwd.as_path()) || session.runtime_workspace_roots != config.workspace_roots - || session.approval_policy.to_core() != config.permissions.approval_policy.value() - || session.approvals_reviewer != config.approvals_reviewer - || session.active_permission_profile != config.permissions.active_permission_profile() + || !permissions_match { if session.thread_id != thread_id { let _ = app_server.thread_unsubscribe(session.thread_id).await; @@ -520,6 +553,7 @@ impl App { keymap, cwd, name_error, + selected_profile, }; if managed_worktree.is_some() { // Let the large synchronous ChatWidget constructor run on a fresh event-loop stack. @@ -544,6 +578,7 @@ impl App { keymap, cwd, name_error, + selected_profile, } = attach; self.local_settings = local_settings; self.refresh_server_version_overview_notice(CODEX_CLI_VERSION); @@ -560,6 +595,9 @@ impl App { if let Err(error) = attach_widget(self, tui, started, lineage, message).await { return self.working_directory_error(format!("Could not restore session: {error}")); } + if selected_profile.is_some() { + self.adopt_inherited_server_selection(); + } if matches!( self.runtime_approval_policy_override, Some(RuntimeApprovalPolicyOverride::Restored(_)) diff --git a/codex-rs/tui/src/app_server_session.rs b/codex-rs/tui/src/app_server_session.rs index f45e2b12640b..f9c6f5fd7793 100644 --- a/codex-rs/tui/src/app_server_session.rs +++ b/codex-rs/tui/src/app_server_session.rs @@ -793,6 +793,13 @@ impl AppServerSession { if history_support == ThreadHistorySupport::LegacyOnly { self.history_support = ThreadHistorySupport::LegacyOnly; } + // An explicit server selection must not reuse the client's local display policy. + let selected_permissions = selected_profile.map(|_| { + PermissionProfile::from_legacy_sandbox_policy_for_cwd( + &response.sandbox.to_core(), + response.cwd.as_path(), + ) + }); let mut started = started_thread_from_start_response( response, local_settings, @@ -800,6 +807,9 @@ impl AppServerSession { self.thread_params_mode(), ) .await?; + if let Some(permissions) = selected_permissions { + started.session.permission_profile = permissions; + } started.task_tools_available = task_tools_available; if task_tools_available { self.remember_task_tool_thread(started.session.thread_id); @@ -879,6 +889,7 @@ impl AppServerSession { local_settings: &LocalSettings, config: Config, thread_id: ThreadId, + selected_profile: Option<&PermissionProfileSelection>, ) -> Result { self.fork_thread_at_with_presentation( local_settings, @@ -888,7 +899,7 @@ impl AppServerSession { /*before_turn_id*/ None, ForkGoalContinuation::StartIfIdle, ForkPresentation::SideConversation, - /*selected_profile*/ None, + selected_profile, ForkPermissionMode::InheritSaved, ForkConfigSource::Session, ) @@ -957,6 +968,7 @@ impl AppServerSession { } if self.thread_params_mode() == ThreadParamsMode::Remote && permission_mode == ForkPermissionMode::InheritSaved + && selected_profile.is_none() { params.approval_policy = None; params.approvals_reviewer = None; @@ -1022,6 +1034,13 @@ impl AppServerSession { "preserving the created fork after bounded history hydration failed" ); } + // Explicit selections use the server's effective policy, including on local daemons. + let selected_permissions = selected_profile.map(|_| { + PermissionProfile::from_legacy_sandbox_policy_for_cwd( + &response.sandbox.to_core(), + response.cwd.as_path(), + ) + }); let mut started = started_thread_from_fork_response( response, local_settings, @@ -1029,6 +1048,9 @@ impl AppServerSession { self.thread_params_mode(), ) .await?; + if let Some(permissions) = selected_permissions { + started.session.permission_profile = permissions; + } started.session.fork_parent_title = fork_parent.and_then(|thread| thread.name); if self.task_tools_available(thread_id) { started.task_tools_available = true; @@ -3660,6 +3682,7 @@ mod tests { &LocalSettings::from(&ephemeral_config), ephemeral_config, source_thread_id, + /*selected_profile*/ None, ) .await?; @@ -3786,6 +3809,7 @@ mod tests { &LocalSettings::from(&side_config), side_config, source_thread_id, + /*selected_profile*/ None, ) .await?; @@ -3917,7 +3941,12 @@ mod tests { .fork_thread(&LocalSettings::from(&config), config.clone(), thread_id) .await?; let side = app_server - .fork_side_thread(&LocalSettings::from(&config), config, thread_id) + .fork_side_thread( + &LocalSettings::from(&config), + config, + thread_id, + /*selected_profile*/ None, + ) .await?; assert_eq!(regular.turns.len(), 1); diff --git a/codex-rs/tui/src/app_server_session/rollout_history_tests.rs b/codex-rs/tui/src/app_server_session/rollout_history_tests.rs index 0a6cd18c9279..ecce710de8a6 100644 --- a/codex-rs/tui/src/app_server_session/rollout_history_tests.rs +++ b/codex-rs/tui/src/app_server_session/rollout_history_tests.rs @@ -130,13 +130,7 @@ async fn remote_resume_restores_saved_server_profile_without_permission_override ), ); } - // A locally remembered profile may have been removed since selection. - let stale_selection = crate::app_event::PermissionProfileSelection { - profile_id: "removed-profile".into(), - approval_policy: None, - approvals_reviewer: None, - display_label: "removed-profile".into(), - }; + // With no new selection, remote forks retain the saved profile. let forked = server .fork_thread_at( &local_settings, @@ -145,7 +139,7 @@ async fn remote_resume_restores_saved_server_profile_without_permission_override /*last_turn_id*/ None, /*before_turn_id*/ None, ForkGoalContinuation::StartIfIdle, - Some(&stale_selection), + /*selected_profile*/ None, ) .await?; assert_eq!( @@ -165,7 +159,12 @@ async fn remote_resume_restores_saved_server_profile_without_permission_override codex_protocol::config_types::ApprovalsReviewer::AutoReview ); let side = server - .fork_side_thread(&local_settings, client_config, thread_id) + .fork_side_thread( + &local_settings, + client_config, + thread_id, + /*selected_profile*/ None, + ) .await?; assert_eq!( side.session.active_permission_profile.unwrap().id, diff --git a/codex-rs/tui/src/app_server_session/workspace_roots_tests.rs b/codex-rs/tui/src/app_server_session/workspace_roots_tests.rs index ee2dcef069d8..644a0a3f57fe 100644 --- a/codex-rs/tui/src/app_server_session/workspace_roots_tests.rs +++ b/codex-rs/tui/src/app_server_session/workspace_roots_tests.rs @@ -150,7 +150,12 @@ stream_max_retries = 0 .await?; assert_eq!(forked.session.runtime_workspace_roots, expected_roots); let side = app_server - .fork_side_thread(&local_settings, session_config, thread_id) + .fork_side_thread( + &local_settings, + session_config, + thread_id, + /*selected_profile*/ None, + ) .await?; assert_eq!(side.session.runtime_workspace_roots, expected_roots); diff --git a/codex-rs/tui/src/chatwidget/permission_discovery.rs b/codex-rs/tui/src/chatwidget/permission_discovery.rs index 09f7f418d5e3..42ee1b5fa1b8 100644 --- a/codex-rs/tui/src/chatwidget/permission_discovery.rs +++ b/codex-rs/tui/src/chatwidget/permission_discovery.rs @@ -56,9 +56,6 @@ impl ChatWidget { return; } match result { - Ok(discovery) if !discovery.explicit_profile_mode => { - self.open_legacy_permissions_popup() - } Ok(discovery) => { self.permission_profiles_menu_opened = true; self.open_permission_profiles_popup(discovery); diff --git a/codex-rs/tui/src/chatwidget/permission_popups.rs b/codex-rs/tui/src/chatwidget/permission_popups.rs index fc98703f7e7c..6b4ee9332943 100644 --- a/codex-rs/tui/src/chatwidget/permission_popups.rs +++ b/codex-rs/tui/src/chatwidget/permission_popups.rs @@ -17,7 +17,8 @@ impl ChatWidget { /// Open a popup to choose the permissions mode. pub(crate) fn open_permissions_popup(&mut self) { - if self.config.explicit_permission_profile_mode + if self.thread_id.is_some() + || self.config.explicit_permission_profile_mode || self.permission_profiles_menu_opened || self .config diff --git a/codex-rs/tui/src/chatwidget/permissions_menu.rs b/codex-rs/tui/src/chatwidget/permissions_menu.rs index ed653846f097..5ebd1dbf7c23 100644 --- a/codex-rs/tui/src/chatwidget/permissions_menu.rs +++ b/codex-rs/tui/src/chatwidget/permissions_menu.rs @@ -215,8 +215,17 @@ impl ChatWidget { SelectionItem { name: label.to_string(), description: Some(description), - is_current: active_profile_id.as_deref() == Some(id) - && current_approval == approval_policy + is_current: active_profile_id.as_deref().map_or_else( + || { + Self::preset_matches_current( + current_approval, + self.config.permissions.permission_profile(), + self.config.cwd.as_path(), + preset, + ) + }, + |active| active == id, + ) && current_approval == approval_policy && current_reviewer == approvals_reviewer, actions: self.permission_mode_actions( preset, @@ -226,9 +235,11 @@ impl ChatWidget { /*return_to_permissions*/ true, ), dismiss_on_select: true, - disabled_reason: discovery - .disabled_reason(id, Some(approval_policy), Some(approvals_reviewer.into())) - .or_else(|| self.permission_mode_disabled_reason(preset, approval_policy)), + disabled_reason: discovery.disabled_reason( + id, + Some(approval_policy), + Some(approvals_reviewer.into()), + ), ..Default::default() } } diff --git a/codex-rs/tui/src/chatwidget/settings.rs b/codex-rs/tui/src/chatwidget/settings.rs index a9c2d1932d7e..5e2e21f328b5 100644 --- a/codex-rs/tui/src/chatwidget/settings.rs +++ b/codex-rs/tui/src/chatwidget/settings.rs @@ -31,6 +31,7 @@ impl ChatWidget { Ok(()) } + #[cfg(test)] pub(crate) fn set_permission_profile_with_active_profile( &mut self, profile: PermissionProfile, @@ -449,7 +450,16 @@ impl ChatWidget { self.apply_thread_settings_cwd(settings.cwd.clone()); self.config.model_provider_id = settings.model_provider.clone(); self.set_service_tier(settings.service_tier.clone()); - self.set_approval_policy(settings.approval_policy); + if let Err(err) = self + .config + .permissions + .approval_policy + .set(settings.approval_policy.to_core()) + { + tracing::warn!(%err, "failed to sync approval_policy from ThreadSettingsUpdated"); + self.config.permissions.approval_policy = + Constrained::allow_only(settings.approval_policy.to_core()); + } self.set_approvals_reviewer(settings.approvals_reviewer.to_core()); self.config.personality = settings.personality; diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_unnamed_server_profile.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_unnamed_server_profile.snap new file mode 100644 index 000000000000..3d4667183677 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_unnamed_server_profile.snap @@ -0,0 +1,15 @@ +--- +source: tui/src/chatwidget/tests/permissions.rs +expression: popup +--- + Update Model Permissions + + + 1. Ask for approval Read and edit workspace files and run commands, with approval required for internet + access or edits outside the workspace +› 2. Approve for me (current) Only ask for actions detected as potentially unsafe + 3. Full Access Use with caution: Codex can edit files outside this workspace and access the internet + without approval + 4. Read Only Read workspace files, with approval required for edits or internet access + + enter select · esc back diff --git a/codex-rs/tui/src/chatwidget/tests/app_server.rs b/codex-rs/tui/src/chatwidget/tests/app_server.rs index e03e997d8502..b19aa7b8c598 100644 --- a/codex-rs/tui/src/chatwidget/tests/app_server.rs +++ b/codex-rs/tui/src/chatwidget/tests/app_server.rs @@ -625,6 +625,8 @@ async fn thread_settings_updated_updates_visible_state_without_transcript() { let mut session = configured_thread_session(thread_id); session.cwd = test_path_buf("/tmp/original-workspace").abs(); chat.handle_thread_session(session); + chat.config.permissions.approval_policy = + Constrained::allow_only(AskForApproval::Never.to_core()); let previous_generation = chat.connector_scope_generation(); let old_app = serde_json::from_str(r#"{"id":"old","name":"Old","isAccessible":true}"#) .expect("valid app"); diff --git a/codex-rs/tui/src/chatwidget/tests/permissions.rs b/codex-rs/tui/src/chatwidget/tests/permissions.rs index b20599a43d9d..bc607196739f 100644 --- a/codex-rs/tui/src/chatwidget/tests/permissions.rs +++ b/codex-rs/tui/src/chatwidget/tests/permissions.rs @@ -60,7 +60,13 @@ async fn permission_discovery_uses_server_catalog_for_remote_custom_selection() })) .unwrap(), ); - chat.request_permission_profiles(); + // Conflicting local availability must not disable server-provided choices. + chat.config.config_layer_stack = requirements_stack(codex_config::ConfigRequirementsToml { + allowed_sandbox_modes: Some(vec![codex_config::SandboxModeRequirement::ReadOnly]), + ..Default::default() + }); + chat.thread_id = Some(ThreadId::new()); + chat.open_permissions_popup(); let request_id = chat.permission_popup_request_id.unwrap(); rx.try_recv().unwrap(); assert_chatwidget_snapshot!( @@ -79,16 +85,6 @@ async fn permission_discovery_uses_server_catalog_for_remote_custom_selection() AppEvent::SelectPermissionProfile(PermissionProfileSelection { profile_id, .. }) if profile_id == "server-only" )); - chat.handle_key_event(KeyEvent::from(KeyCode::Esc)); - chat.open_permissions_popup(); - rx.try_recv().unwrap(); - let request_id = chat.permission_popup_request_id.unwrap(); - let mut legacy = Discovery::local(&chat.config); - legacy.explicit_profile_mode = false; - chat.on_permission_profiles_loaded(request_id, Ok(legacy)); - let actual = render_bottom_popup(&chat, /*width*/ 110); - chat.open_legacy_permissions_popup(); - assert_eq!(actual, render_bottom_popup(&chat, /*width*/ 110)); } #[tokio::test] @@ -265,7 +261,14 @@ async fn profile_permissions_selection_popup_with_disallowed_full_access_snapsho ..Default::default() }); - chat.open_permission_profiles_popup(Discovery::local(&chat.config)); + let mut discovery = Discovery::local(&chat.config); + discovery + .profiles + .iter_mut() + .find(|profile| profile.id == ":danger-full-access") + .unwrap() + .allowed = false; + chat.open_permission_profiles_popup(discovery); assert_chatwidget_snapshot!( "profile_permissions_selection_popup_with_disallowed_full_access", @@ -1234,8 +1237,13 @@ async fn permissions_selection_marks_auto_review_current_after_session_configure }); chat.open_permissions_popup(); + chat.on_permission_profiles_loaded( + chat.permission_popup_request_id.unwrap(), + Ok(Discovery::local(&chat.config)), + ); let popup = render_bottom_popup(&chat, /*width*/ 120); + assert_chatwidget_snapshot!("permissions_unnamed_server_profile", popup); assert!( popup.contains("Approve for me (current)"), "expected Approve for me to be current after SessionConfigured sync: {popup}" @@ -1283,6 +1291,10 @@ async fn permissions_selection_marks_auto_review_current_with_custom_workspace_w }); chat.open_permissions_popup(); + chat.on_permission_profiles_loaded( + chat.permission_popup_request_id.unwrap(), + Ok(Discovery::local(&chat.config)), + ); let popup = render_bottom_popup(&chat, /*width*/ 120); assert!( diff --git a/codex-rs/tui/src/permission_discovery.rs b/codex-rs/tui/src/permission_discovery.rs index c40ada989ce3..2579fc6e9bd1 100644 --- a/codex-rs/tui/src/permission_discovery.rs +++ b/codex-rs/tui/src/permission_discovery.rs @@ -1,5 +1,5 @@ //! Bounded discovery for permission pickers; fixed request IDs bound abandoned RPCs. -//! This never applies a profile; the app chooses local or server-owned selection. +//! Discovery and availability come from the connected server; selection uses its settings API. use crate::app_event::AppEvent; use crate::app_event_sender::AppEventSender; @@ -10,14 +10,13 @@ use codex_app_server_client::TypedRequestError; use codex_app_server_protocol::ApprovalsReviewer; use codex_app_server_protocol::AskForApproval; use codex_app_server_protocol::ClientRequest; -use codex_app_server_protocol::ConfigReadParams; -use codex_app_server_protocol::ConfigReadResponse; use codex_app_server_protocol::ConfigRequirements; use codex_app_server_protocol::ConfigRequirementsReadResponse; use codex_app_server_protocol::PermissionProfileListParams; use codex_app_server_protocol::PermissionProfileListResponse; use codex_app_server_protocol::PermissionProfileSummary; use codex_app_server_protocol::RequestId; +#[cfg(test)] use codex_utils_approval_presets::builtin_approval_presets; use std::collections::HashSet; use std::time::Duration; @@ -27,10 +26,10 @@ use uuid::Uuid; pub(crate) struct PermissionDiscovery { pub(crate) profiles: Vec, pub(crate) requirements: Option, - pub(crate) explicit_profile_mode: bool, } impl PermissionDiscovery { + #[cfg(test)] pub(crate) fn local(config: &Config) -> Self { let mut profiles = builtin_approval_presets() .into_iter() @@ -50,7 +49,6 @@ impl PermissionDiscovery { Self { profiles, requirements: None, - explicit_profile_mode: true, } } @@ -96,47 +94,8 @@ pub(crate) fn fetch( ThreadParamsMode::Remote => app_server.remote_cwd_override(), }) .map(|cwd| cwd.to_string_lossy().into_owned()); - // The daemon's catalog cannot see permission definitions from this invocation. - let local_discovery = (!app_server.uses_embedded_app_server() - && mode == ThreadParamsMode::Embedded - && config.config_layer_stack.layers_low_to_high().any(|layer| { - matches!(layer.name, codex_config::ConfigLayerSource::SessionFlags) - && layer.config.get("permissions").is_some() - })) - .then(|| PermissionDiscovery::local(config)); - let active_custom_profile = config - .permissions - .active_permission_profile() - .is_some_and(|profile| !profile.id.starts_with(':')); tokio::spawn(async move { let request = async { - if let Some(discovery) = local_discovery { - return Ok(discovery); - } - if mode == ThreadParamsMode::Remote && !active_custom_profile { - let config: ConfigReadResponse = handle - .request_typed(ClientRequest::ConfigRead { - request_id: RequestId::String("tui-permission-config".to_string()), - params: ConfigReadParams { - include_layers: false, - cwd: cwd.clone(), - }, - }) - .await - .map_err(discovery_error)?; - if !config - .config - .additional - .get("default_permissions") - .is_some_and(serde_json::Value::is_string) - { - return Ok(PermissionDiscovery { - profiles: Vec::new(), - requirements: None, - explicit_profile_mode: false, - }); - } - } let requirements: ConfigRequirementsReadResponse = handle .request_typed(ClientRequest::ConfigRequirementsRead { request_id: RequestId::String("tui-permission-requirements".to_string()), @@ -174,7 +133,6 @@ pub(crate) fn fetch( return Ok(PermissionDiscovery { profiles, requirements: requirements.requirements, - explicit_profile_mode: true, }); }; if !cursors.insert(next.clone()) { diff --git a/codex-rs/tui/src/permission_discovery_tests.rs b/codex-rs/tui/src/permission_discovery_tests.rs index 27f29bf0dff7..f40cbb2390ac 100644 --- a/codex-rs/tui/src/permission_discovery_tests.rs +++ b/codex-rs/tui/src/permission_discovery_tests.rs @@ -76,14 +76,7 @@ async fn discovery_preserves_config_scope_and_bounds_server_requests() { json!({"result": {"data": [data[1]], "nextCursor": null}}), ], }); - if mode == ThreadParamsMode::Remote { - replies.insert( - /*index*/ 0, - json!({"result": {"config": { - "default_permissions": (case != "legacy").then_some(":workspace") - }, "origins": {}}}), - ); - } else if case == "timeout" { + if case == "timeout" { replies = vec![Value::Null]; } let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); @@ -151,15 +144,7 @@ async fn discovery_preserves_config_scope_and_bounds_server_requests() { continue; } let discovery = result.unwrap(); - assert_eq!(discovery.explicit_profile_mode, case != "legacy"); - if case == "session-only" { - assert!( - discovery - .profiles - .iter() - .any(|profile| profile.id == "session-only" && profile.allowed) - ); - } else if matches!(case, "empty" | "legacy") { + if case == "empty" { assert!(discovery.profiles.is_empty()); } else { assert_eq!(serde_json::to_value(&discovery.profiles).unwrap(), data); @@ -172,9 +157,8 @@ async fn discovery_preserves_config_scope_and_bounds_server_requests() { session.shutdown().await.unwrap(); let requests = server.await.unwrap(); match case { - "session-only" => assert!(requests.is_empty()), - "timeout" | "legacy" => assert_eq!(requests.len(), 1), - "local" | "remote" | "remote-default" | "thread" => { + "timeout" => assert_eq!(requests.len(), 1), + "local" | "session-only" | "remote" | "remote-default" | "thread" | "legacy" => { let pages: Vec<_> = requests .iter() .filter(|request| request["method"] == "permissionProfile/list") @@ -187,9 +171,6 @@ async fn discovery_preserves_config_scope_and_bounds_server_requests() { json!({"cwd": cwd, "limit": 100, "cursor": "second"}) ] ); - if mode == ThreadParamsMode::Remote { - assert_eq!(requests[0]["params"]["cwd"], json!(cwd)); - } } _ => {} } From c9b3924a623fbe5ac932ed9b898ad18eeed665dd Mon Sep 17 00:00:00 2001 From: Nick Steele Date: Wed, 30 Sep 2026 03:21:48 +0000 Subject: [PATCH 06/11] Use the rmcp SDK for enterprise-managed token exchanges (#49473) ## What changed Upgrade `rmcp` to a pinned Git revision of version `3.3.0` and enable `auth-enterprise-managed`. Delegate the two-stage ID-JAG exchange and token validation to the SDK, replacing the local implementation while retaining Codex HTTP routing and credential lifecycle policy. Map SDK errors by exchange stage so `invalid_grant` distinguishes enterprise identity failures from resource authorization failures, and preserve handling of `insufficient_user_authentication`. ## Testing Update exchange tests to verify rejection of unsupported `authorization_details` and malformed signed scopes. Exercise errors from both token endpoints to check credential policy, prevent credential reflection in diagnostics, and ensure rejected grants are not retried. GitOrigin-RevId: a56034aa3fd70002754ea552fd2da70bdcd85b31 --- MODULE.bazel.lock | 6 +- codex-rs/Cargo.lock | 16 +- codex-rs/Cargo.toml | 3 +- codex-rs/deny.toml | 1 + codex-rs/rmcp-client/Cargo.toml | 2 +- codex-rs/rmcp-client/src/ema_auth_policy.rs | 20 - codex-rs/rmcp-client/src/ema_claims.rs | 162 +------- codex-rs/rmcp-client/src/ema_exchange.rs | 218 +++-------- .../rmcp-client/src/ema_exchange_tests.rs | 357 +++++++----------- 9 files changed, 218 insertions(+), 567 deletions(-) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index ea12d29eead6..b0077619b602 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1085,6 +1085,8 @@ "git+https://github.com/microsoft/mxc?rev=6cd3d58f05d3447e67109cfb75e042803b843ca4#6cd3d58f05d3447e67109cfb75e042803b843ca4_process_security_environment_spec": "{\"dependencies\":[{\"name\":\"flatbuffers\",\"req\":\"25\"}],\"features\":{},\"strip_prefix\":\"core/generated/process_security_environment_specification\"}", "git+https://github.com/microsoft/mxc?rev=6cd3d58f05d3447e67109cfb75e042803b843ca4#6cd3d58f05d3447e67109cfb75e042803b843ca4_sandbox_spec": "{\"dependencies\":[{\"name\":\"flatbuffers\",\"req\":\"25\"}],\"features\":{},\"strip_prefix\":\"core/generated/base_container_specification\"}", "git+https://github.com/microsoft/mxc?rev=6cd3d58f05d3447e67109cfb75e042803b843ca4#6cd3d58f05d3447e67109cfb75e042803b843ca4_wxc_common": "{\"dependencies\":[{\"name\":\"base64\",\"req\":\"0.22\"},{\"name\":\"cidr\",\"req\":\"0.3.2\"},{\"name\":\"getrandom\",\"req\":\"0.2\"},{\"default_features\":true,\"features\":[],\"name\":\"mxc_config_contract\",\"optional\":false},{\"default_features\":true,\"features\":[],\"name\":\"mxc_schema_support\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"mxc_telemetry\",\"optional\":false},{\"default_features\":true,\"features\":[],\"name\":\"nanvix_common\",\"optional\":true},{\"name\":\"schemars\",\"optional\":true,\"req\":\"0.8\"},{\"name\":\"semver\",\"req\":\"1\"},{\"default_features\":true,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":false,\"req\":\"1\"},{\"features\":[\"raw_value\"],\"name\":\"serde_json\",\"req\":\"1\"},{\"name\":\"serde_path_to_error\",\"req\":\"0.1\"},{\"name\":\"thiserror\",\"req\":\"2\"},{\"name\":\"unicode-general-category\",\"req\":\"1\"},{\"name\":\"url\",\"req\":\"2\"},{\"default_features\":true,\"features\":[\"v4\"],\"name\":\"uuid\",\"optional\":true,\"req\":\"1\"},{\"name\":\"widestring\",\"req\":\"1\",\"target\":\"cfg(target_os = \\\"windows\\\")\"},{\"default_features\":true,\"features\":[\"Win32_Foundation\",\"Win32_Globalization\",\"Win32_NetworkManagement_WindowsFirewall\",\"Win32_Networking_WinSock\",\"Win32_Security\",\"Win32_Security_Authorization\",\"Win32_Security_Credentials\",\"Win32_Security_Isolation\",\"Win32_Storage_FileSystem\",\"Win32_System_Com\",\"Win32_System_Console\",\"Win32_System_Diagnostics_Debug\",\"Win32_System_Diagnostics_Etw\",\"Win32_System_Diagnostics_ToolHelp\",\"Win32_System_Environment\",\"Win32_System_IO\",\"Win32_System_JobObjects\",\"Win32_System_LibraryLoader\",\"Win32_System_Memory\",\"Win32_System_Ole\",\"Win32_System_Pipes\",\"Win32_System_ProcessStatus\",\"Win32_System_Registry\",\"Win32_System_SystemInformation\",\"Win32_System_SystemServices\",\"Win32_System_Threading\",\"Win32_System_Time\",\"Win32_System_Variant\",\"Win32_System_WindowsProgramming\",\"Win32_UI_Shell\"],\"name\":\"windows\",\"optional\":false,\"req\":\"0.62\",\"target\":\"cfg(target_os = \\\"windows\\\")\"},{\"name\":\"windows-core\",\"req\":\"0.62\",\"target\":\"cfg(target_os = \\\"windows\\\")\"},{\"name\":\"winreg\",\"req\":\"0.55\",\"target\":\"cfg(target_os = \\\"windows\\\")\"},{\"name\":\"libc\",\"req\":\"0.2\",\"target\":\"cfg(unix)\"}],\"features\":{\"microvm\":[\"dep:nanvix_common\",\"dep:uuid\"],\"schema-gen\":[\"dep:mxc_schema_support\",\"dep:schemars\"]},\"strip_prefix\":\"core/wxc_common\"}", + "git+https://github.com/modelcontextprotocol/rust-sdk?rev=3e636cab26c013eca5131103c03d20237f12c4df#3e636cab26c013eca5131103c03d20237f12c4df_rmcp": "{\"dependencies\":[{\"default_features\":true,\"features\":[],\"name\":\"async-trait\",\"optional\":true,\"req\":\"0.1.89\"},{\"default_features\":true,\"features\":[],\"name\":\"base64\",\"optional\":true,\"req\":\"0.23\"},{\"default_features\":true,\"features\":[],\"name\":\"bytes\",\"optional\":true,\"req\":\"1\"},{\"name\":\"futures\",\"req\":\"0.3\"},{\"default_features\":true,\"features\":[],\"name\":\"hmac\",\"optional\":true,\"req\":\"0.13\"},{\"default_features\":true,\"features\":[],\"name\":\"http\",\"optional\":true,\"req\":\"1\"},{\"default_features\":true,\"features\":[],\"name\":\"http-body\",\"optional\":true,\"req\":\"1\"},{\"default_features\":true,\"features\":[],\"name\":\"http-body-util\",\"optional\":true,\"req\":\"0.1\"},{\"default_features\":true,\"features\":[\"client\",\"http1\"],\"name\":\"hyper\",\"optional\":true,\"req\":\"1\"},{\"default_features\":true,\"features\":[\"tokio\"],\"name\":\"hyper-util\",\"optional\":true,\"req\":\"0.1\"},{\"default_features\":true,\"features\":[\"serde\"],\"name\":\"indexmap\",\"optional\":false,\"req\":\"2\"},{\"default_features\":true,\"features\":[\"aws_lc_rs\"],\"name\":\"jsonwebtoken\",\"optional\":true,\"req\":\"11\"},{\"default_features\":false,\"features\":[],\"name\":\"oauth2\",\"optional\":true,\"req\":\"5.0\"},{\"default_features\":true,\"features\":[],\"name\":\"pastey\",\"optional\":true,\"req\":\"0.2.0\"},{\"name\":\"pin-project-lite\",\"req\":\"0.2\"},{\"default_features\":true,\"features\":[\"tokio1\"],\"name\":\"process-wrap\",\"optional\":true,\"req\":\"10.0\"},{\"default_features\":true,\"features\":[],\"name\":\"rand\",\"optional\":true,\"req\":\"0.10\"},{\"default_features\":false,\"features\":[\"json\",\"stream\"],\"name\":\"reqwest\",\"optional\":true,\"req\":\"0.13.2\"},{\"default_features\":true,\"features\":[],\"name\":\"rmcp-macros\",\"optional\":true,\"req\":\"3.3.0\"},{\"default_features\":true,\"features\":[\"chrono04\"],\"name\":\"schemars\",\"optional\":true,\"req\":\"1.0\"},{\"default_features\":true,\"features\":[\"derive\",\"rc\"],\"name\":\"serde\",\"optional\":false,\"req\":\"1.0\"},{\"name\":\"serde_json\",\"req\":\"1.0\"},{\"default_features\":true,\"features\":[],\"name\":\"sha2\",\"optional\":true,\"req\":\"0.11\"},{\"default_features\":true,\"features\":[],\"name\":\"sse-stream\",\"optional\":true,\"req\":\"0.2.4\"},{\"name\":\"thiserror\",\"req\":\"2\"},{\"default_features\":true,\"features\":[\"sync\",\"macros\",\"rt\",\"time\"],\"name\":\"tokio\",\"optional\":false,\"req\":\"1\"},{\"default_features\":true,\"features\":[],\"name\":\"tokio-stream\",\"optional\":true,\"req\":\"0.1\"},{\"default_features\":true,\"features\":[],\"name\":\"tokio-util\",\"optional\":false,\"req\":\"0.7\"},{\"default_features\":true,\"features\":[],\"name\":\"tower-service\",\"optional\":true,\"req\":\"0.3\"},{\"default_features\":true,\"features\":[],\"name\":\"tracing\",\"optional\":false,\"req\":\"0.1\"},{\"default_features\":true,\"features\":[],\"name\":\"url\",\"optional\":true,\"req\":\"2.4\"},{\"default_features\":true,\"features\":[\"v4\"],\"name\":\"uuid\",\"optional\":true,\"req\":\"1\"},{\"default_features\":true,\"features\":[],\"name\":\"which\",\"optional\":true,\"req\":\"8\"},{\"default_features\":true,\"features\":[],\"name\":\"zeroize\",\"optional\":true,\"req\":\"1\"},{\"default_features\":false,\"features\":[\"serde\",\"clock\",\"std\",\"oldtime\"],\"name\":\"chrono\",\"optional\":false,\"req\":\"0.4.38\",\"target\":\"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\"},{\"default_features\":false,\"features\":[\"serde\",\"now\"],\"name\":\"chrono\",\"optional\":false,\"req\":\"0.4.38\",\"target\":\"cfg(not(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\")))\"}],\"features\":{\"__reqwest\":[\"dep:reqwest\"],\"auth\":[\"dep:async-trait\",\"dep:oauth2\",\"__reqwest\",\"dep:url\"],\"auth-client-credentials-jwt\":[\"auth\",\"dep:jsonwebtoken\",\"uuid\"],\"auth-enterprise-managed\":[\"auth\",\"base64\"],\"client\":[\"dep:tokio-stream\"],\"client-side-sse\":[\"dep:sse-stream\",\"dep:http\",\"dep:bytes\",\"base64\"],\"default\":[\"base64\",\"macros\",\"server\"],\"elicitation\":[\"dep:url\"],\"local\":[\"rmcp-macros?/local\"],\"macros\":[\"dep:rmcp-macros\",\"dep:pastey\"],\"request-state\":[\"dep:hmac\",\"dep:sha2\",\"dep:zeroize\",\"base64\"],\"reqwest\":[\"__reqwest\",\"reqwest?/rustls\"],\"reqwest-native-tls\":[\"__reqwest\",\"reqwest?/native-tls\"],\"reqwest-tls-no-provider\":[\"__reqwest\",\"reqwest?/rustls-no-provider\"],\"schemars\":[\"dep:schemars\"],\"server\":[\"transport-async-rw\",\"schemars\",\"dep:pastey\",\"uuid\"],\"server-side-http\":[\"uuid\",\"dep:rand\",\"dep:tokio-stream\",\"dep:http\",\"dep:http-body\",\"dep:http-body-util\",\"dep:bytes\",\"dep:sse-stream\",\"tower\",\"base64\"],\"tower\":[\"dep:tower-service\"],\"transport-async-rw\":[\"tokio/io-util\",\"tokio-util/codec\"],\"transport-child-process\":[\"transport-async-rw\",\"tokio/process\",\"dep:process-wrap\"],\"transport-io\":[\"transport-async-rw\",\"tokio/io-std\"],\"transport-streamable-http-client\":[\"client-side-sse\",\"transport-worker\"],\"transport-streamable-http-client-reqwest\":[\"transport-streamable-http-client\",\"__reqwest\"],\"transport-streamable-http-client-unix-socket\":[\"transport-streamable-http-client\",\"dep:hyper\",\"dep:hyper-util\",\"dep:http-body-util\",\"dep:http\",\"dep:bytes\",\"tokio/net\"],\"transport-streamable-http-server\":[\"transport-streamable-http-server-session\",\"server-side-http\",\"transport-worker\"],\"transport-streamable-http-server-session\":[\"transport-async-rw\",\"dep:async-trait\",\"dep:tokio-stream\"],\"transport-worker\":[\"dep:tokio-stream\"],\"which-command\":[\"transport-child-process\",\"dep:which\"]},\"strip_prefix\":\"./crates/rmcp\"}", + "git+https://github.com/modelcontextprotocol/rust-sdk?rev=3e636cab26c013eca5131103c03d20237f12c4df#3e636cab26c013eca5131103c03d20237f12c4df_rmcp-macros": "{\"dependencies\":[{\"default_features\":true,\"features\":[],\"name\":\"darling\",\"optional\":false,\"req\":\"0.24\"},{\"name\":\"proc-macro2\",\"req\":\"1\"},{\"name\":\"quote\",\"req\":\"1\"},{\"name\":\"serde_json\",\"req\":\"1.0\"},{\"default_features\":true,\"features\":[\"full\"],\"name\":\"syn\",\"optional\":false,\"req\":\"3\"}],\"features\":{\"local\":[]},\"strip_prefix\":\"./crates/rmcp-macros\"}", "git+https://github.com/openai-oss-forks/crossterm?rev=efa177859fd9623d57b9fe7ae9bf491ae1ac6ec4#efa177859fd9623d57b9fe7ae9bf491ae1ac6ec4_crossterm": "{\"dependencies\":[{\"default_features\":true,\"features\":[],\"name\":\"base64\",\"optional\":true,\"req\":\"0.22\"},{\"default_features\":true,\"features\":[],\"name\":\"bitflags\",\"optional\":false,\"req\":\"2.9\"},{\"default_features\":true,\"features\":[\"is_variant\"],\"name\":\"derive_more\",\"optional\":true,\"req\":\"2.0.0\"},{\"name\":\"document-features\",\"req\":\"0.2.11\"},{\"default_features\":false,\"features\":[],\"name\":\"futures-core\",\"optional\":true,\"req\":\"0.3\"},{\"name\":\"parking_lot\",\"req\":\"0.12\"},{\"default_features\":true,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"1.0\"},{\"default_features\":true,\"features\":[],\"name\":\"filedescriptor\",\"optional\":true,\"req\":\"0.8\",\"target\":\"cfg(unix)\"},{\"default_features\":false,\"features\":[],\"name\":\"libc\",\"optional\":true,\"req\":\"0.2\",\"target\":\"cfg(unix)\"},{\"default_features\":true,\"features\":[\"os-poll\"],\"name\":\"mio\",\"optional\":true,\"req\":\"1.0\",\"target\":\"cfg(unix)\"},{\"default_features\":false,\"features\":[\"std\",\"stdio\",\"termios\"],\"name\":\"rustix\",\"optional\":false,\"req\":\"1\",\"target\":\"cfg(unix)\"},{\"default_features\":true,\"features\":[],\"name\":\"signal-hook\",\"optional\":true,\"req\":\"0.3.17\",\"target\":\"cfg(unix)\"},{\"default_features\":true,\"features\":[\"support-v1_0\"],\"name\":\"signal-hook-mio\",\"optional\":true,\"req\":\"0.2.4\",\"target\":\"cfg(unix)\"},{\"default_features\":true,\"features\":[],\"name\":\"crossterm_winapi\",\"optional\":true,\"req\":\"0.9.1\",\"target\":\"cfg(windows)\"},{\"default_features\":true,\"features\":[\"winuser\",\"winerror\"],\"name\":\"winapi\",\"optional\":true,\"req\":\"0.3.9\",\"target\":\"cfg(windows)\"}],\"features\":{\"bracketed-paste\":[],\"default\":[\"bracketed-paste\",\"events\",\"windows\",\"derive-more\"],\"derive-more\":[\"dep:derive_more\"],\"event-stream\":[\"dep:futures-core\",\"events\"],\"events\":[\"dep:mio\",\"dep:signal-hook\",\"dep:signal-hook-mio\"],\"osc52\":[\"dep:base64\"],\"serde\":[\"dep:serde\",\"bitflags/serde\"],\"use-dev-tty\":[\"filedescriptor\",\"rustix/process\"],\"windows\":[\"dep:winapi\",\"dep:crossterm_winapi\"]},\"strip_prefix\":\"\"}", "git+https://github.com/openai-oss-forks/tokio-tungstenite?rev=0e5b2d73aa18dd9f0a50ee9ff199d5aef7594186#0e5b2d73aa18dd9f0a50ee9ff199d5aef7594186_tokio-tungstenite": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"sink\",\"std\"],\"name\":\"futures-util\",\"optional\":false},{\"name\":\"log\"},{\"default_features\":true,\"features\":[],\"name\":\"native-tls-crate\",\"optional\":true,\"package\":\"native-tls\"},{\"default_features\":false,\"features\":[],\"name\":\"rustls\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"rustls-native-certs\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"rustls-pki-types\",\"optional\":true},{\"default_features\":false,\"features\":[\"io-util\"],\"name\":\"tokio\",\"optional\":false},{\"default_features\":true,\"features\":[],\"name\":\"tokio-native-tls\",\"optional\":true},{\"default_features\":false,\"features\":[],\"name\":\"tokio-rustls\",\"optional\":true},{\"default_features\":false,\"features\":[],\"name\":\"tungstenite\",\"optional\":false},{\"default_features\":true,\"features\":[],\"name\":\"webpki-roots\",\"optional\":true}],\"features\":{\"__rustls-tls\":[\"rustls\",\"rustls-pki-types\",\"tokio-rustls\",\"stream\",\"tungstenite/__rustls-tls\",\"handshake\"],\"connect\":[\"stream\",\"tokio/net\",\"tokio/time\",\"handshake\"],\"default\":[\"connect\",\"handshake\"],\"handshake\":[\"tungstenite/handshake\"],\"native-tls\":[\"native-tls-crate\",\"tokio-native-tls\",\"stream\",\"tungstenite/native-tls\",\"handshake\"],\"native-tls-vendored\":[\"native-tls\",\"native-tls-crate/vendored\",\"tungstenite/native-tls-vendored\"],\"proxy\":[\"tungstenite/proxy\",\"tokio/net\",\"handshake\"],\"rustls-tls-native-roots\":[\"__rustls-tls\",\"rustls-native-certs\"],\"rustls-tls-webpki-roots\":[\"__rustls-tls\",\"webpki-roots\"],\"stream\":[],\"url\":[\"tungstenite/url\"]},\"strip_prefix\":\"\"}", "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=4fffad30fe373adbdcffab9545e9e9bf4f2fc19f#4fffad30fe373adbdcffab9545e9e9bf4f2fc19f_tungstenite": "{\"dependencies\":[{\"name\":\"bytes\"},{\"default_features\":true,\"features\":[],\"name\":\"data-encoding\",\"optional\":true},{\"default_features\":false,\"features\":[\"zlib-rs\"],\"name\":\"flate2\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"headers\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"http\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"httparse\",\"optional\":true},{\"name\":\"log\"},{\"default_features\":true,\"features\":[],\"name\":\"native-tls-crate\",\"optional\":true,\"package\":\"native-tls\"},{\"name\":\"rand\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"rustls\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"rustls-native-certs\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"rustls-pki-types\",\"optional\":true},{\"default_features\":true,\"features\":[],\"name\":\"sha1\",\"optional\":true},{\"name\":\"thiserror\"},{\"default_features\":true,\"features\":[],\"name\":\"url\",\"optional\":true},{\"name\":\"utf-8\"},{\"default_features\":true,\"features\":[],\"name\":\"webpki-roots\",\"optional\":true}],\"features\":{\"__rustls-tls\":[\"rustls\",\"rustls-pki-types\"],\"default\":[\"handshake\"],\"deflate\":[\"headers\",\"flate2\"],\"handshake\":[\"data-encoding\",\"headers\",\"httparse\",\"sha1\"],\"headers\":[\"http\",\"dep:headers\"],\"native-tls\":[\"native-tls-crate\"],\"native-tls-vendored\":[\"native-tls\",\"native-tls-crate/vendored\"],\"proxy\":[\"handshake\"],\"rustls-tls-native-roots\":[\"__rustls-tls\",\"rustls-native-certs\"],\"rustls-tls-webpki-roots\":[\"__rustls-tls\",\"webpki-roots\"],\"url\":[\"dep:url\"]},\"strip_prefix\":\"\"}", @@ -1508,7 +1510,7 @@ "proc-macro-error-attr2_2.0.0": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"}],\"features\":{}}", "proc-macro-error2_2.0.1": "{\"dependencies\":[{\"name\":\"proc-macro-error-attr2\",\"req\":\"=2.0.0\"},{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"syn\",\"optional\":true,\"req\":\"^2\"},{\"features\":[\"full\"],\"kind\":\"dev\",\"name\":\"syn\",\"req\":\"^2\"},{\"features\":[\"diff\"],\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.99\"}],\"features\":{\"default\":[\"syn-error\"],\"nightly\":[],\"syn-error\":[\"dep:syn\"]}}", "proc-macro2_1.0.106": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"flate2\",\"req\":\"^1.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quote\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rayon\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tar\",\"req\":\"^0.4\"},{\"name\":\"unicode-ident\",\"req\":\"^1.0\"}],\"features\":{\"default\":[\"proc-macro\"],\"nightly\":[],\"proc-macro\":[],\"span-locations\":[]}}", - "process-wrap_9.0.1": "{\"dependencies\":[{\"name\":\"futures\",\"optional\":true,\"req\":\"^0.3.30\"},{\"name\":\"indexmap\",\"req\":\"^2.9.0\"},{\"default_features\":false,\"features\":[\"fs\",\"poll\",\"signal\"],\"name\":\"nix\",\"optional\":true,\"req\":\"^0.30.1\",\"target\":\"cfg(unix)\"},{\"kind\":\"dev\",\"name\":\"remoteprocess\",\"req\":\"^0.5.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.20.0\"},{\"features\":[\"io-util\",\"macros\",\"process\",\"rt\"],\"name\":\"tokio\",\"optional\":true,\"req\":\"^1.38.2\"},{\"features\":[\"io-util\",\"macros\",\"process\",\"rt\",\"rt-multi-thread\",\"time\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1.38.2\"},{\"name\":\"tracing\",\"optional\":true,\"req\":\"^0.1.40\"},{\"name\":\"windows\",\"optional\":true,\"req\":\"^0.62.2\",\"target\":\"cfg(windows)\"}],\"features\":{\"creation-flags\":[\"dep:windows\",\"windows/Win32_System_Threading\"],\"default\":[\"creation-flags\",\"job-object\",\"kill-on-drop\",\"process-group\",\"process-session\",\"tracing\"],\"job-object\":[\"dep:windows\",\"windows/Win32_Security\",\"windows/Win32_System_Diagnostics_ToolHelp\",\"windows/Win32_System_IO\",\"windows/Win32_System_JobObjects\",\"windows/Win32_System_Threading\"],\"kill-on-drop\":[],\"process-group\":[],\"process-session\":[\"process-group\"],\"reset-sigmask\":[],\"std\":[\"dep:nix\"],\"tokio1\":[\"dep:nix\",\"dep:futures\",\"dep:tokio\"],\"tracing\":[\"dep:tracing\"]}}", + "process-wrap_10.0.0": "{\"dependencies\":[{\"name\":\"futures\",\"optional\":true,\"req\":\"^0.3.30\"},{\"name\":\"indexmap\",\"req\":\"^2.9.0\"},{\"default_features\":false,\"features\":[\"fs\",\"poll\",\"signal\"],\"name\":\"nix\",\"optional\":true,\"req\":\"^0.31.1\",\"target\":\"cfg(unix)\"},{\"kind\":\"dev\",\"name\":\"remoteprocess\",\"req\":\"^0.5.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.20.0\"},{\"features\":[\"io-util\",\"macros\",\"process\",\"rt\"],\"name\":\"tokio\",\"optional\":true,\"req\":\"^1.38.2\"},{\"features\":[\"io-util\",\"macros\",\"process\",\"rt\",\"rt-multi-thread\",\"time\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1.38.2\"},{\"name\":\"tracing\",\"optional\":true,\"req\":\"^0.1.40\"},{\"name\":\"windows\",\"optional\":true,\"req\":\"^0.62.2\",\"target\":\"cfg(windows)\"}],\"features\":{\"creation-flags\":[\"dep:windows\",\"windows/Win32_System_Threading\"],\"default\":[\"creation-flags\",\"job-object\",\"kill-on-drop\",\"process-group\",\"process-session\",\"tracing\"],\"job-object\":[\"dep:windows\",\"windows/Win32_Security\",\"windows/Win32_System_Diagnostics_ToolHelp\",\"windows/Win32_System_IO\",\"windows/Win32_System_JobObjects\",\"windows/Win32_System_Threading\"],\"kill-on-drop\":[],\"process-group\":[],\"process-session\":[\"process-group\"],\"reset-sigmask\":[],\"std\":[\"dep:nix\"],\"tokio1\":[\"dep:nix\",\"dep:futures\",\"dep:tokio\"],\"tracing\":[\"dep:tracing\"]}}", "prodash_31.0.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"argh\",\"req\":\"^0.1.3\"},{\"kind\":\"dev\",\"name\":\"async-executor\",\"req\":\"^1.1.0\"},{\"name\":\"async-io\",\"optional\":true,\"req\":\"^2.2.1\"},{\"kind\":\"dev\",\"name\":\"async-io\",\"req\":\"^2.2.1\"},{\"kind\":\"dev\",\"name\":\"blocking\",\"req\":\"^1.0.0\"},{\"name\":\"bytesize\",\"optional\":true,\"req\":\"^2.0.1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.8.1\"},{\"default_features\":false,\"name\":\"crosstermion\",\"optional\":true,\"req\":\"^0.16.0\"},{\"default_features\":false,\"features\":[\"termination\"],\"name\":\"ctrlc\",\"optional\":true,\"req\":\"^3.1.4\"},{\"default_features\":false,\"name\":\"dashmap\",\"optional\":true,\"req\":\"^6.0.1\"},{\"default_features\":false,\"features\":[\"humantime\"],\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.11.0\"},{\"kind\":\"dev\",\"name\":\"futures\",\"req\":\"^0.3.5\"},{\"default_features\":false,\"name\":\"futures-core\",\"optional\":true,\"req\":\"^0.3.4\"},{\"name\":\"futures-lite\",\"optional\":true,\"req\":\"^2.1.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"futures-util\",\"req\":\"^0.3.4\"},{\"name\":\"human_format\",\"optional\":true,\"req\":\"^1.0.3\"},{\"name\":\"is-terminal\",\"optional\":true,\"req\":\"^0.4.9\"},{\"kind\":\"dev\",\"name\":\"is-terminal\",\"req\":\"^0.4.9\"},{\"name\":\"jiff\",\"optional\":true,\"req\":\"^0.2.4\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.8\"},{\"kind\":\"dev\",\"name\":\"once_cell\",\"req\":\"^1.4.0\"},{\"default_features\":false,\"name\":\"parking_lot\",\"optional\":true,\"req\":\"^0.12.1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.1\"},{\"default_features\":false,\"name\":\"signal-hook\",\"optional\":true,\"req\":\"^0.4.1\"},{\"default_features\":false,\"name\":\"tui\",\"optional\":true,\"package\":\"ratatui\",\"req\":\"^0.30.0\"},{\"name\":\"tui-react\",\"optional\":true,\"req\":\"^0.24.0\"},{\"name\":\"unicode-segmentation\",\"optional\":true,\"req\":\"^1.6.0\"},{\"name\":\"unicode-width\",\"optional\":true,\"req\":\"^0.2.2\"}],\"features\":{\"default\":[\"progress-tree\"],\"local-time\":[\"jiff\"],\"progress-log\":[\"log\"],\"progress-tree\":[\"parking_lot\"],\"progress-tree-hp-hashmap\":[\"dashmap\"],\"progress-tree-log\":[\"log\"],\"render-line\":[\"crosstermion/color\",\"jiff\",\"unicode-width\"],\"render-line-autoconfigure\":[\"is-terminal\"],\"render-line-crossterm\":[\"crosstermion/crossterm\"],\"render-tui\":[\"tui\",\"unicode-segmentation\",\"unicode-width\",\"crosstermion/input-async\",\"tui-react\",\"futures-lite\",\"futures-core\",\"async-io\",\"jiff\"],\"render-tui-crossterm\":[\"crosstermion/tui-react-crossterm\",\"crosstermion/input-async-crossterm\"],\"unit-bytes\":[\"bytesize\"],\"unit-duration\":[\"jiff\"],\"unit-human\":[\"human_format\"]}}", "proptest_1.9.0": "{\"dependencies\":[{\"name\":\"bit-set\",\"optional\":true,\"req\":\"^0.8.0\"},{\"name\":\"bit-vec\",\"optional\":true,\"req\":\"^0.8.0\"},{\"name\":\"bitflags\",\"req\":\"^2.9\"},{\"default_features\":false,\"name\":\"num-traits\",\"req\":\"^0.2.15\"},{\"name\":\"proptest-macro\",\"optional\":true,\"req\":\"^0.4.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"rand\",\"req\":\"^0.9\"},{\"default_features\":false,\"name\":\"rand_chacha\",\"req\":\"^0.9\"},{\"name\":\"rand_xorshift\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"regex\",\"req\":\"^1.0\"},{\"name\":\"regex-syntax\",\"optional\":true,\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"rusty-fork\",\"optional\":true,\"req\":\"^0.3.0\"},{\"name\":\"tempfile\",\"optional\":true,\"req\":\"^3.0\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"=1.0.112\"},{\"name\":\"unarray\",\"req\":\"^0.1.4\"},{\"name\":\"x86\",\"optional\":true,\"req\":\"^0.52.0\"}],\"features\":{\"alloc\":[],\"atomic64bit\":[],\"attr-macro\":[\"proptest-macro\"],\"bit-set\":[\"dep:bit-set\",\"dep:bit-vec\"],\"default\":[\"std\",\"fork\",\"timeout\",\"bit-set\"],\"default-code-coverage\":[\"std\",\"fork\",\"timeout\",\"bit-set\"],\"fork\":[\"std\",\"rusty-fork\",\"tempfile\"],\"handle-panics\":[\"std\"],\"hardware-rng\":[\"x86\"],\"no_std\":[\"num-traits/libm\"],\"std\":[\"rand/std\",\"rand/os_rng\",\"regex-syntax\",\"num-traits/std\"],\"timeout\":[\"fork\",\"rusty-fork/timeout\"],\"unstable\":[]}}", "prost-build_0.14.3": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.11\"},{\"name\":\"heck\",\"req\":\">=0.4, <=0.5\"},{\"default_features\":false,\"features\":[\"use_alloc\"],\"name\":\"itertools\",\"req\":\">=0.10, <=0.14\"},{\"name\":\"log\",\"req\":\"^0.4.4\"},{\"default_features\":false,\"name\":\"multimap\",\"req\":\">=0.8, <=0.10\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"petgraph\",\"req\":\"^0.8\"},{\"name\":\"prettyplease\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"prost\",\"req\":\"^0.14.3\"},{\"default_features\":false,\"name\":\"prost-types\",\"req\":\"^0.14.3\"},{\"default_features\":false,\"name\":\"pulldown-cmark\",\"optional\":true,\"req\":\"^0.13\"},{\"name\":\"pulldown-cmark-to-cmark\",\"optional\":true,\"req\":\"^22\"},{\"default_features\":false,\"features\":[\"std\",\"unicode-bool\"],\"name\":\"regex\",\"req\":\"^1.8.1\"},{\"features\":[\"full\"],\"name\":\"syn\",\"optional\":true,\"req\":\"^2\"},{\"name\":\"tempfile\",\"req\":\"^3\"}],\"features\":{\"cleanup-markdown\":[\"dep:pulldown-cmark\",\"dep:pulldown-cmark-to-cmark\"],\"default\":[\"format\"],\"format\":[\"dep:prettyplease\",\"dep:syn\"]}}", @@ -1615,8 +1617,6 @@ "ring_0.17.14": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"build\",\"name\":\"cc\",\"req\":\"^1.2.8\"},{\"default_features\":false,\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"getrandom\",\"req\":\"^0.2.10\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.155\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(any(unix, windows, target_os = \\\"wasi\\\"))\"},{\"name\":\"untrusted\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"std\"],\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3.37\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"features\":[\"Win32_Foundation\",\"Win32_System_Threading\"],\"name\":\"windows-sys\",\"req\":\"^0.52\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\"}],\"features\":{\"alloc\":[],\"default\":[\"alloc\",\"dev_urandom_fallback\"],\"dev_urandom_fallback\":[],\"less-safe-getrandom-custom-or-rdrand\":[],\"less-safe-getrandom-espidf\":[],\"slow_tests\":[],\"std\":[\"alloc\"],\"test_logging\":[],\"unstable-testing-arm-no-hw\":[],\"unstable-testing-arm-no-neon\":[],\"wasm32_unknown_unknown_js\":[\"getrandom/js\"]}}", "rkyv_0.8.18": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"ahash\",\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"arrayvec-0_7\",\"optional\":true,\"package\":\"arrayvec\",\"req\":\"^0.7\"},{\"default_features\":false,\"features\":[\"simdutf8\"],\"name\":\"bytecheck\",\"optional\":true,\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"bytes-1\",\"optional\":true,\"package\":\"bytes\",\"req\":\"^1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"divan\",\"req\":\"^0.1\"},{\"default_features\":false,\"name\":\"hashbrown\",\"optional\":true,\"req\":\"^0.17\"},{\"default_features\":false,\"name\":\"hashbrown-0_14\",\"optional\":true,\"package\":\"hashbrown\",\"req\":\"^0.14\"},{\"default_features\":false,\"name\":\"hashbrown-0_15\",\"optional\":true,\"package\":\"hashbrown\",\"req\":\"^0.15\"},{\"default_features\":false,\"name\":\"hashbrown-0_16\",\"optional\":true,\"package\":\"hashbrown\",\"req\":\"^0.16\"},{\"default_features\":false,\"name\":\"indexmap-2\",\"optional\":true,\"package\":\"indexmap\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"munge\",\"req\":\"^0.4\"},{\"default_features\":false,\"name\":\"ptr_meta\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"rancor\",\"req\":\"^0.1\"},{\"default_features\":false,\"name\":\"rend\",\"req\":\"^0.5\"},{\"default_features\":false,\"name\":\"rkyv_derive\",\"req\":\"=0.8.18\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"smallvec-1\",\"optional\":true,\"package\":\"smallvec\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"smol_str-0_2\",\"optional\":true,\"package\":\"smol_str\",\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"smol_str-0_3\",\"optional\":true,\"package\":\"smol_str\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"thin-vec-0_2\",\"optional\":true,\"package\":\"thin-vec\",\"req\":\"^0.2.12\"},{\"default_features\":false,\"name\":\"tinyvec-1\",\"optional\":true,\"package\":\"tinyvec\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"triomphe-0_1\",\"optional\":true,\"package\":\"triomphe\",\"req\":\"^0.1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"uuid-1\",\"optional\":true,\"package\":\"uuid\",\"req\":\"^1\"}],\"features\":{\"aligned\":[],\"alloc\":[\"dep:hashbrown\",\"tinyvec-1?/alloc\",\"rancor/alloc\"],\"big_endian\":[],\"bytecheck\":[\"dep:bytecheck\",\"rend/bytecheck\",\"rkyv_derive/bytecheck\"],\"default\":[\"std\",\"bytecheck\"],\"hashbrown-0_17\":[\"dep:hashbrown\"],\"indexmap-2\":[\"dep:indexmap-2\",\"alloc\"],\"little_endian\":[],\"pointer_width_16\":[],\"pointer_width_32\":[],\"pointer_width_64\":[],\"std\":[\"alloc\",\"bytes-1?/std\",\"indexmap-2?/std\",\"ptr_meta/std\",\"uuid-1?/std\"],\"triomphe-0_1\":[\"dep:triomphe-0_1\",\"alloc\"],\"unaligned\":[],\"uuid-1\":[\"dep:uuid-1\",\"bytecheck?/uuid-1\"]}}", "rkyv_derive_0.8.18": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"proc-macro\"],\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"proc-macro\"],\"name\":\"quote\",\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"clone-impls\",\"derive\",\"parsing\",\"printing\",\"proc-macro\"],\"name\":\"syn\",\"req\":\"^3.0\"}],\"features\":{\"bytecheck\":[],\"default\":[]}}", - "rmcp-macros_3.2.0": "{\"dependencies\":[{\"name\":\"darling\",\"req\":\"^0.24\"},{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"},{\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"features\":[\"full\"],\"name\":\"syn\",\"req\":\"^3\"}],\"features\":{\"local\":[]}}", - "rmcp_3.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0\"},{\"name\":\"async-trait\",\"optional\":true,\"req\":\"^0.1.89\"},{\"kind\":\"dev\",\"name\":\"async-trait\",\"req\":\"^0.1\"},{\"default_features\":false,\"features\":[\"http1\",\"tokio\"],\"kind\":\"dev\",\"name\":\"axum\",\"req\":\"^0.8\"},{\"name\":\"base64\",\"optional\":true,\"req\":\"^0.23\"},{\"name\":\"bytes\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"serde\",\"clock\",\"std\",\"oldtime\"],\"name\":\"chrono\",\"req\":\"^0.4.38\",\"target\":\"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\"},{\"default_features\":false,\"features\":[\"serde\",\"now\"],\"name\":\"chrono\",\"req\":\"^0.4.38\",\"target\":\"cfg(not(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\")))\"},{\"name\":\"futures\",\"req\":\"^0.3\"},{\"name\":\"hmac\",\"optional\":true,\"req\":\"^0.13\"},{\"name\":\"http\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"http-body\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"http-body-util\",\"optional\":true,\"req\":\"^0.1\"},{\"features\":[\"client\",\"http1\"],\"name\":\"hyper\",\"optional\":true,\"req\":\"^1\"},{\"features\":[\"server\",\"http1\"],\"kind\":\"dev\",\"name\":\"hyper\",\"req\":\"^1\"},{\"features\":[\"tokio\"],\"name\":\"hyper-util\",\"optional\":true,\"req\":\"^0.1\"},{\"features\":[\"tokio\"],\"kind\":\"dev\",\"name\":\"hyper-util\",\"req\":\"^0.1\"},{\"features\":[\"serde\"],\"name\":\"indexmap\",\"req\":\"^2\"},{\"features\":[\"aws_lc_rs\"],\"name\":\"jsonwebtoken\",\"optional\":true,\"req\":\"^11\"},{\"default_features\":false,\"name\":\"oauth2\",\"optional\":true,\"req\":\"^5.0\"},{\"name\":\"pastey\",\"optional\":true,\"req\":\"^0.2.0\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2\"},{\"features\":[\"tokio1\"],\"name\":\"process-wrap\",\"optional\":true,\"req\":\"^9.0\"},{\"name\":\"rand\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"features\":[\"json\",\"stream\"],\"name\":\"reqwest\",\"optional\":true,\"req\":\"^0.13.2\"},{\"name\":\"rmcp-macros\",\"optional\":true,\"req\":\"^3.2.0\"},{\"kind\":\"dev\",\"name\":\"rstest\",\"req\":\"^0.26.1\"},{\"features\":[\"chrono04\"],\"name\":\"schemars\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"chrono04\"],\"kind\":\"dev\",\"name\":\"schemars\",\"req\":\"^1.1.0\"},{\"features\":[\"derive\",\"rc\"],\"name\":\"serde\",\"req\":\"^1.0\"},{\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"name\":\"sha2\",\"optional\":true,\"req\":\"^0.11\"},{\"name\":\"sse-stream\",\"optional\":true,\"req\":\"^0.2.4\"},{\"name\":\"thiserror\",\"req\":\"^2\"},{\"features\":[\"sync\",\"macros\",\"rt\",\"time\"],\"name\":\"tokio\",\"req\":\"^1\"},{\"features\":[\"full\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"name\":\"tokio-stream\",\"optional\":true,\"req\":\"^0.1\"},{\"name\":\"tokio-util\",\"req\":\"^0.7\"},{\"name\":\"tower-service\",\"optional\":true,\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"tower-service\",\"req\":\"^0.3\"},{\"name\":\"tracing\",\"req\":\"^0.1\"},{\"features\":[\"env-filter\",\"std\",\"fmt\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3\"},{\"name\":\"url\",\"optional\":true,\"req\":\"^2.4\"},{\"kind\":\"dev\",\"name\":\"url\",\"req\":\"^2.4\"},{\"features\":[\"v4\"],\"name\":\"uuid\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"which\",\"optional\":true,\"req\":\"^8\"},{\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"__reqwest\":[\"dep:reqwest\"],\"auth\":[\"dep:async-trait\",\"dep:oauth2\",\"__reqwest\",\"dep:url\"],\"auth-client-credentials-jwt\":[\"auth\",\"dep:jsonwebtoken\",\"uuid\"],\"client\":[\"dep:tokio-stream\"],\"client-side-sse\":[\"dep:sse-stream\",\"dep:http\",\"dep:bytes\",\"base64\"],\"default\":[\"base64\",\"macros\",\"server\"],\"elicitation\":[\"dep:url\"],\"local\":[\"rmcp-macros?/local\"],\"macros\":[\"dep:rmcp-macros\",\"dep:pastey\"],\"request-state\":[\"dep:hmac\",\"dep:sha2\",\"dep:zeroize\",\"base64\"],\"reqwest\":[\"__reqwest\",\"reqwest?/rustls\"],\"reqwest-native-tls\":[\"__reqwest\",\"reqwest?/native-tls\"],\"reqwest-tls-no-provider\":[\"__reqwest\",\"reqwest?/rustls-no-provider\"],\"schemars\":[\"dep:schemars\"],\"server\":[\"transport-async-rw\",\"schemars\",\"dep:pastey\",\"uuid\"],\"server-side-http\":[\"uuid\",\"dep:rand\",\"dep:tokio-stream\",\"dep:http\",\"dep:http-body\",\"dep:http-body-util\",\"dep:bytes\",\"dep:sse-stream\",\"tower\",\"base64\"],\"tower\":[\"dep:tower-service\"],\"transport-async-rw\":[\"tokio/io-util\",\"tokio-util/codec\"],\"transport-child-process\":[\"transport-async-rw\",\"tokio/process\",\"dep:process-wrap\"],\"transport-io\":[\"transport-async-rw\",\"tokio/io-std\"],\"transport-streamable-http-client\":[\"client-side-sse\",\"transport-worker\"],\"transport-streamable-http-client-reqwest\":[\"transport-streamable-http-client\",\"__reqwest\"],\"transport-streamable-http-client-unix-socket\":[\"transport-streamable-http-client\",\"dep:hyper\",\"dep:hyper-util\",\"dep:http-body-util\",\"dep:http\",\"dep:bytes\",\"tokio/net\"],\"transport-streamable-http-server\":[\"transport-streamable-http-server-session\",\"server-side-http\",\"transport-worker\"],\"transport-streamable-http-server-session\":[\"transport-async-rw\",\"dep:async-trait\",\"dep:tokio-stream\"],\"transport-worker\":[\"dep:tokio-stream\"],\"which-command\":[\"transport-child-process\",\"dep:which\"]}}", "rouille_3.6.2": "{\"dependencies\":[{\"name\":\"base64\",\"req\":\"^0.13\"},{\"name\":\"brotli\",\"optional\":true,\"req\":\"^3.3.2\"},{\"default_features\":false,\"features\":[\"clock\"],\"name\":\"chrono\",\"req\":\"^0.4.19\"},{\"features\":[\"gzip\"],\"name\":\"deflate\",\"optional\":true,\"req\":\"^1.0.0\"},{\"name\":\"filetime\",\"req\":\"^0.2.0\"},{\"kind\":\"dev\",\"name\":\"log\",\"req\":\"^0.4\"},{\"default_features\":false,\"features\":[\"server\"],\"name\":\"multipart\",\"req\":\"^0.18\"},{\"name\":\"percent-encoding\",\"req\":\"^2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"postgres\",\"req\":\"^0.19\"},{\"name\":\"rand\",\"req\":\"^0.8\"},{\"name\":\"serde\",\"req\":\"^1\"},{\"name\":\"serde_derive\",\"req\":\"^1\"},{\"name\":\"serde_json\",\"req\":\"^1\"},{\"name\":\"sha1_smol\",\"req\":\"^1.0.0\"},{\"name\":\"threadpool\",\"req\":\"^1\"},{\"features\":[\"local-offset\"],\"name\":\"time\",\"req\":\"^0.3.15\"},{\"default_features\":false,\"name\":\"tiny_http\",\"req\":\"^0.12.0\"},{\"name\":\"url\",\"req\":\"^2\"}],\"features\":{\"default\":[\"gzip\",\"brotli\"],\"gzip\":[\"deflate\"],\"rustls\":[\"tiny_http/ssl-rustls\"],\"ssl\":[\"tiny_http/ssl\"]}}", "rtc-datachannel_0.20.3": "{\"dependencies\":[{\"name\":\"bytes\",\"req\":\"^1.12.0\"},{\"kind\":\"dev\",\"name\":\"chrono\",\"req\":\"^0.4.45\"},{\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.11.11\"},{\"name\":\"log\",\"req\":\"^0.4.33\"},{\"name\":\"sansio\",\"req\":\"^1\"},{\"name\":\"sctp\",\"package\":\"rtc-sctp\",\"req\":\"^0.20.3\"},{\"default_features\":false,\"features\":[\"marshal\"],\"name\":\"shared\",\"package\":\"rtc-shared\",\"req\":\"^0.20.3\"}],\"features\":{}}", "rtc-dtls_0.20.3": "{\"dependencies\":[{\"name\":\"aes\",\"req\":\"^0.8.4\"},{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0.80\"},{\"default_features\":false,\"features\":[\"aws-lc-sys\"],\"name\":\"aws-lc-rs\",\"optional\":true,\"req\":\"^1.17.3\"},{\"name\":\"bytecheck\",\"req\":\"^0.8\"},{\"name\":\"byteorder\",\"req\":\"^1.5.0\"},{\"name\":\"bytes\",\"req\":\"^1.12.0\"},{\"features\":[\"block-padding\",\"alloc\"],\"name\":\"cbc\",\"req\":\"^0.1.2\"},{\"name\":\"ccm\",\"req\":\"^0.5.0\"},{\"name\":\"chacha20poly1305\",\"req\":\"^0.10.1\"},{\"kind\":\"dev\",\"name\":\"chrono\",\"req\":\"^0.4.45\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"clap\",\"req\":\"^4.6.1\"},{\"kind\":\"dev\",\"name\":\"core_affinity\",\"req\":\"^0.8.1\"},{\"kind\":\"dev\",\"name\":\"ctrlc\",\"req\":\"^3.5.2\"},{\"name\":\"der-parser\",\"req\":\"^9.0.0\"},{\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.11.11\"},{\"kind\":\"dev\",\"name\":\"futures\",\"req\":\"^0.3.30\"},{\"name\":\"hmac\",\"req\":\"^0.12.1\"},{\"kind\":\"dev\",\"name\":\"local-sync\",\"req\":\"^0.1.1\"},{\"name\":\"log\",\"req\":\"^0.4.33\"},{\"features\":[\"default\",\"ecdh\",\"ecdsa\"],\"name\":\"p256\",\"req\":\"^0.13.2\"},{\"name\":\"p384\",\"req\":\"^0.13.0\"},{\"name\":\"pem\",\"optional\":true,\"req\":\"^3.0.3\"},{\"name\":\"rand\",\"req\":\"^0.10.1\"},{\"name\":\"rand_core\",\"req\":\"^0.6.4\"},{\"default_features\":false,\"features\":[\"pem\"],\"name\":\"rcgen\",\"req\":\"^0.14.8\"},{\"name\":\"ring\",\"optional\":true,\"req\":\"^0.17.14\"},{\"name\":\"rkyv\",\"req\":\"^0.8.17\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"rustls\",\"req\":\"^0.23.27\"},{\"features\":[\"std\"],\"name\":\"sec1\",\"req\":\"^0.7\"},{\"name\":\"sha1\",\"req\":\"^0.10.6\"},{\"name\":\"sha2\",\"req\":\"^0.10.8\"},{\"default_features\":false,\"features\":[\"crypto\",\"replay\"],\"name\":\"shared\",\"package\":\"rtc-shared\",\"req\":\"^0.20.3\"},{\"name\":\"subtle\",\"req\":\"^2.5.0\"},{\"features\":[\"static_secrets\"],\"name\":\"x25519-dalek\",\"req\":\"^2.0.1\"},{\"name\":\"x509-parser\",\"req\":\"^0.16.0\"}],\"features\":{\"aws-lc-rs\":[\"dep:aws-lc-rs\",\"rustls/aws-lc-rs\",\"rcgen/aws_lc_rs\"],\"default\":[\"ring\"],\"pem\":[\"dep:pem\"],\"ring\":[\"dep:ring\",\"rustls/ring\",\"rcgen/ring\"]}}", diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 10a8c44279d3..ea897239537d 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -11829,13 +11829,13 @@ dependencies = [ [[package]] name = "process-wrap" -version = "9.0.1" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1395947e69c07400ef4d43db0051d6f773c21f647ad8b97382fc01f0204c60" +checksum = "0e3f4237d0e4741eb50bc5584db701f1299c85fa31ff0274dd6445e79dc42d12" dependencies = [ "futures", "indexmap 2.14.0", - "nix 0.30.1", + "nix 0.31.3", "tokio", "tracing", "windows 0.62.2", @@ -13028,9 +13028,8 @@ dependencies = [ [[package]] name = "rmcp" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42b6914fac0be956fe704a38239c3f44a9f841d1b06a5713d2f638065593f5b5" +version = "3.3.0" +source = "git+https://github.com/modelcontextprotocol/rust-sdk?rev=3e636cab26c013eca5131103c03d20237f12c4df#3e636cab26c013eca5131103c03d20237f12c4df" dependencies = [ "async-trait", "base64 0.23.0", @@ -13064,9 +13063,8 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf1c49bd4d52014b94db0877410db273c2008f01628b0252a2e9460ad9b7fda" +version = "3.3.0" +source = "git+https://github.com/modelcontextprotocol/rust-sdk?rev=3e636cab26c013eca5131103c03d20237f12c4df#3e636cab26c013eca5131103c03d20237f12c4df" dependencies = [ "darling 0.24.0", "proc-macro2", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index 0e01c4534be3..fc1becc762f6 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -446,7 +446,8 @@ regex-automata = { version = "0.4.13", default-features = false, features = ["st regex-lite = "0.1.8" regex-syntax = "0.8.8" reqwest = { version = "0.12", features = ["cookies"] } -rmcp = { version = "=3.2.0", default-features = false } +# rmcp-v3.3.0 includes enterprise authorization helpers (rust-sdk#1234). +rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", rev = "3e636cab26c013eca5131103c03d20237f12c4df", version = "=3.3.0", default-features = false } runfiles = { git = "https://github.com/dzbarsky/rules_rust", rev = "b56cbaa8465e74127f1ea216f813cd377295ad81" } rustix = { version = "1.1.4", features = ["net"] } rustls = { version = "0.23.45", default-features = false, features = [ diff --git a/codex-rs/deny.toml b/codex-rs/deny.toml index 71617b49188b..082ad982464b 100644 --- a/codex-rs/deny.toml +++ b/codex-rs/deny.toml @@ -317,6 +317,7 @@ allow-git = [ "https://github.com/hyperium/h3", "https://github.com/juberti-oai/rust-sdks.git", "https://github.com/microsoft/mxc", + "https://github.com/modelcontextprotocol/rust-sdk", "https://github.com/openai-oss-forks/crossterm", "https://github.com/openai-oss-forks/tokio-tungstenite", "https://github.com/openai-oss-forks/tungstenite-rs", diff --git a/codex-rs/rmcp-client/Cargo.toml b/codex-rs/rmcp-client/Cargo.toml index 671bfd9ecc97..d44f91328d98 100644 --- a/codex-rs/rmcp-client/Cargo.toml +++ b/codex-rs/rmcp-client/Cargo.toml @@ -34,7 +34,7 @@ keyring = { workspace = true, features = ["crypto-rust"] } memchr = { workspace = true } oauth2 = "5" rmcp = { workspace = true, default-features = false, features = [ - "auth", + "auth-enterprise-managed", "base64", "client", "macros", diff --git a/codex-rs/rmcp-client/src/ema_auth_policy.rs b/codex-rs/rmcp-client/src/ema_auth_policy.rs index 42057b1f7873..ddedfe1333da 100644 --- a/codex-rs/rmcp-client/src/ema_auth_policy.rs +++ b/codex-rs/rmcp-client/src/ema_auth_policy.rs @@ -29,26 +29,6 @@ pub(crate) fn ema_reauthentication_required(message: &'static str) -> anyhow::Er anyhow::Error::new(EmaAuthFailure::ReauthenticationRequired).context(message) } -pub(crate) fn safe_oauth_error_code(code: Option<&str>) -> &str { - code.filter(|code| { - matches!( - *code, - "invalid_request" - | "invalid_client" - | "invalid_grant" - | "invalid_scope" - | "invalid_target" - | "unauthorized_client" - | "unsupported_grant_type" - | "access_denied" - | "temporarily_unavailable" - | "server_error" - | "insufficient_user_authentication" - ) - }) - .unwrap_or("OAuth token request rejected") -} - pub(crate) fn validate_ema_public_client_auth( advertised_methods: Option<&Value>, issuer_description: &str, diff --git a/codex-rs/rmcp-client/src/ema_claims.rs b/codex-rs/rmcp-client/src/ema_claims.rs index 886f148a32a4..e70490047d01 100644 --- a/codex-rs/rmcp-client/src/ema_claims.rs +++ b/codex-rs/rmcp-client/src/ema_claims.rs @@ -1,7 +1,5 @@ -//! Validate token routing and signed authorization before forwarding an ID-JAG. +//! Validate OIDC identity assertion bindings before storing enterprise credentials. -use std::collections::HashSet; -use std::time::Duration; use std::time::SystemTime; use std::time::UNIX_EPOCH; @@ -13,14 +11,11 @@ use base64::engine::general_purpose::URL_SAFE_NO_PAD; use serde::Deserialize; use serde::de::DeserializeOwned; -use crate::ema_exchange::EmaAccessToken; - pub(crate) const ID_JAG_TOKEN_TYPE: &str = "urn:ietf:params:oauth:token-type:id-jag"; #[derive(Deserialize)] struct JwtHeader { alg: String, - typ: Option, } #[derive(Deserialize)] @@ -30,16 +25,7 @@ enum OAuthResource { Multiple(Vec), } -impl OAuthResource { - fn is_exact(&self, expected: &str) -> bool { - match self { - Self::Single(value) => value == expected, - Self::Multiple(values) => values.as_slice() == [expected], - } - } -} - -fn signed_jwt(token: &str) -> Result<(JwtHeader, T)> { +fn signed_jwt(token: &str) -> Result { let mut parts = token.split('.'); let (Some(header), Some(payload), Some(signature), None) = (parts.next(), parts.next(), parts.next(), parts.next()) @@ -56,7 +42,7 @@ fn signed_jwt(token: &str) -> Result<(JwtHeader, T)> { } let claims = serde_json::from_slice(&URL_SAFE_NO_PAD.decode(payload)?) .map_err(|_| anyhow!("invalid identity assertion JWT claims"))?; - Ok((header, claims)) + Ok(claims) } #[derive(Deserialize)] @@ -73,7 +59,7 @@ pub(crate) fn oidc_identity( expected_issuer: &str, expected_audience: &str, ) -> Result { - let (_, claims): (_, OidcClaims) = signed_jwt(assertion)?; + let claims: OidcClaims = signed_jwt(assertion)?; if claims.iss != expected_issuer || claims.sub.trim().is_empty() { bail!("OIDC identity assertion issuer or subject does not match the enterprise IdP"); } @@ -108,143 +94,3 @@ pub fn validate_oidc_identity_assertion( } Ok(()) } - -#[derive(Deserialize)] -struct IdJagClaims { - iss: String, - sub: String, - aud: OAuthResource, - client_id: String, - jti: String, - exp: u64, - iat: u64, - resource: OAuthResource, - scope: Option, -} - -pub(crate) struct IdJagBinding<'a> { - pub issuer: &'a str, - pub audience: &'a str, - pub client_id: &'a str, - pub resource: &'a str, - /// Empty means the scope parameter was omitted, not an empty authorization ceiling. - pub requested_scopes: &'a HashSet<&'a str>, -} - -#[derive(Deserialize)] -pub(crate) struct IdJagResponse { - pub access_token: String, - issued_token_type: String, - token_type: String, - resource: Option, - scope: Option, - refresh_token: Option, -} - -impl IdJagResponse { - pub(crate) fn validate(&self, binding: IdJagBinding<'_>) -> Result> { - if self.issued_token_type != ID_JAG_TOKEN_TYPE - || self.token_type != "N_A" - || self.refresh_token.is_some() - { - bail!("enterprise IdP returned an unsupported ID-JAG token type or refresh token"); - } - let (header, claims): (_, IdJagClaims) = signed_jwt(&self.access_token)?; - if header.typ.as_deref() != Some("oauth-id-jag+jwt") - || claims.iss != binding.issuer - || !claims.aud.is_exact(binding.audience) - || claims.client_id != binding.client_id - || claims.sub.trim().is_empty() - || claims.jti.trim().is_empty() - { - bail!("ID-JAG type, issuer, audience, client, subject, or JWT ID is invalid"); - } - let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); - if claims.exp <= now || claims.iat > now.saturating_add(60) { - bail!("enterprise IdP returned an expired or future-issued ID-JAG"); - } - if !claims.resource.is_exact(binding.resource) - || self - .resource - .as_ref() - .is_some_and(|value| !value.is_exact(binding.resource)) - { - bail!("ID-JAG must authorize exactly the configured MCP resource"); - } - let granted = match claims.scope.as_deref() { - Some(scope) => parse_scope(scope)?, - None if binding.requested_scopes.is_empty() => HashSet::new(), - None => bail!("ID-JAG is missing the requested scope authorization"), - }; - if !binding.requested_scopes.is_empty() && !granted.is_subset(binding.requested_scopes) { - bail!("ID-JAG contains a scope outside the enterprise authorization request"); - } - match self.scope.as_deref() { - Some(scope) if parse_scope(scope)? != granted => { - bail!("enterprise IdP token response scope does not match the signed ID-JAG") - } - None if !binding.requested_scopes.is_empty() - && granted != *binding.requested_scopes => - { - bail!("enterprise IdP token response omitted its narrowed scope") - } - _ => {} - } - Ok(granted.into_iter().map(str::to_string).collect()) - } -} - -fn parse_scope(scope: &str) -> Result> { - let scopes = scope.split_ascii_whitespace().collect::>(); - if scopes.is_empty() || scopes.len() != scope.split_ascii_whitespace().count() { - bail!("enterprise authorization contains malformed or duplicate scopes"); - } - Ok(scopes) -} - -#[derive(Deserialize)] -pub(crate) struct McpAccessTokenResponse { - access_token: String, - token_type: String, - expires_in: Option, - resource: Option, - scope: Option, - refresh_token: Option, -} - -impl McpAccessTokenResponse { - pub(crate) fn validate( - self, - resource: &str, - id_jag_scopes: &HashSet, - ) -> Result { - if !self.token_type.eq_ignore_ascii_case("bearer") || self.access_token.trim().is_empty() { - bail!("MCP authorization server returned an invalid bearer token"); - } - if self.refresh_token.is_some() || self.expires_in == Some(0) { - bail!("MCP authorization server returned a refresh token or zero token lifetime"); - } - // The stable EMA response does not require the resource to be echoed; - // when present, it must agree with the resource bound in the ID-JAG. - if self - .resource - .as_ref() - .is_some_and(|returned| !returned.is_exact(resource)) - { - bail!("MCP access token must authorize exactly the configured MCP resource"); - } - // RFC 6749 defines an omitted scope as unchanged from the request. Here - // that authority is the scope carried by the validated ID-JAG. - if let Some(scope) = self.scope.as_deref() - && !parse_scope(scope)? - .iter() - .all(|scope| id_jag_scopes.contains(*scope)) - { - bail!("MCP authorization server granted a scope outside the ID-JAG authorization"); - } - Ok(EmaAccessToken { - access_token: self.access_token, - expires_in: self.expires_in.map(Duration::from_secs), - }) - } -} diff --git a/codex-rs/rmcp-client/src/ema_exchange.rs b/codex-rs/rmcp-client/src/ema_exchange.rs index 7b6131653a97..243a05c94d46 100644 --- a/codex-rs/rmcp-client/src/ema_exchange.rs +++ b/codex-rs/rmcp-client/src/ema_exchange.rs @@ -1,31 +1,25 @@ -//! Non-interactive ID-JAG exchange against explicitly trusted OAuth endpoints. +//! Adapt the SDK enterprise exchange to Codex HTTP routing and credential lifecycle errors. -use std::collections::HashSet; use std::sync::Arc; use std::time::Duration; use anyhow::Result; -use anyhow::anyhow; -use anyhow::bail; use codex_exec_server::HttpClient; -use rmcp::transport::auth::OAuthHttpRedirectPolicy; -use serde::Deserialize; -use serde::de::DeserializeOwned; +use oauth2::RefreshToken; +use rmcp::transport::auth::enterprise::EmaAuthorizationServer; +use rmcp::transport::auth::enterprise::EmaError; +use rmcp::transport::auth::enterprise::EmaExchangeRequest; +use rmcp::transport::auth::enterprise::EmaExchangeStage; use crate::ema_auth_policy::EmaAuthFailure; use crate::ema_auth_policy::EmaInvalidGrantSource; -use crate::ema_auth_policy::safe_oauth_error_code; -use crate::ema_auth_policy::validate_ema_oauth_endpoint; -use crate::ema_claims::ID_JAG_TOKEN_TYPE; -use crate::ema_claims::IdJagBinding; -use crate::ema_claims::IdJagResponse; -use crate::ema_claims::McpAccessTokenResponse; use crate::http_client_adapter::StreamableHttpRedirectMode; use crate::oauth_http_client::OAuthHttpClientAdapter; use crate::utils::build_default_headers; pub(crate) const TOKEN_EXCHANGE_GRANT_TYPE: &str = "urn:ietf:params:oauth:grant-type:token-exchange"; +#[cfg(test)] pub(crate) const JWT_BEARER_GRANT_TYPE: &str = "urn:ietf:params:oauth:grant-type:jwt-bearer"; /// A resource-bound bearer and its server-reported lifetime, with redacted diagnostics. @@ -63,155 +57,67 @@ pub struct EmaIdJagExchangeRequest<'a> { /// Exchanges an enterprise IdP credential for a resource-bound MCP bearer token. pub async fn exchange_id_jag(request: EmaIdJagExchangeRequest<'_>) -> Result { - for (endpoint, description) in [ - (request.resource, "enterprise MCP resource"), - ( - request.authorization_server_issuer, - "MCP authorization server issuer", - ), - ( - request.authorization_server_token_endpoint, - "MCP token endpoint", - ), - (request.idp_issuer, "enterprise IdP issuer"), - (request.idp_token_endpoint, "enterprise IdP token endpoint"), - ] { - validate_ema_oauth_endpoint(endpoint, description)?; - } - if request.authorization_server_issuer == request.idp_issuer { - bail!("enterprise IdP and MCP authorization server issuers must be different for ID-JAG"); - } - if request.mcp_client_id.trim().is_empty() || request.idp_client_id.trim().is_empty() { - bail!("enterprise authorization requires the registered IdP and MCP client IDs"); - } - if request.refresh_token.trim().is_empty() { - bail!("enterprise IdP refresh token must not be empty"); - } - let requested_scopes = request - .scopes - .iter() - .map(String::as_str) - .collect::>(); - if requested_scopes.len() != request.scopes.len() - || request - .scopes - .iter() - .any(|scope| scope.is_empty() || scope.chars().any(char::is_whitespace)) - { - bail!("enterprise MCP authorization scopes must be distinct, non-empty scope tokens"); - } - let scope = (!request.scopes.is_empty()).then(|| request.scopes.join(" ")); - let mut params = vec![ - ("grant_type", TOKEN_EXCHANGE_GRANT_TYPE), - ("requested_token_type", ID_JAG_TOKEN_TYPE), - ("audience", request.authorization_server_issuer), - ("resource", request.resource), - ("subject_token", request.refresh_token.as_str()), - ( - "subject_token_type", - "urn:ietf:params:oauth:token-type:refresh_token", - ), - ]; - if let Some(scope) = scope.as_deref() { - params.push(("scope", scope)); - } - let id_jag: IdJagResponse = post_form( - &request.idp_http_client, + let idp_http = OAuthHttpClientAdapter::new_with_redirect_mode( + request.idp_http_client, + build_default_headers(/*http_headers*/ None, /*env_http_headers*/ None)?, request.idp_token_endpoint, - ¶ms, - request.idp_client_id, - EmaInvalidGrantSource::EnterpriseIdentity, - "enterprise IdP ID-JAG exchange", - ) - .await?; - let granted_scopes = id_jag.validate(IdJagBinding { - issuer: request.idp_issuer, - audience: request.authorization_server_issuer, - client_id: request.mcp_client_id, - resource: request.resource, - requested_scopes: &requested_scopes, - })?; - // Only the signed assertion carries authority to the Resource AS. Repeating - // the requested resource or scopes could undo enterprise policy narrowing. - let access_token: McpAccessTokenResponse = post_form( - &request.resource_http_client, - request.authorization_server_token_endpoint, - &[ - ("grant_type", JWT_BEARER_GRANT_TYPE), - ("assertion", id_jag.access_token.as_str()), - ], - request.mcp_client_id, - EmaInvalidGrantSource::ResourceAuthorization, - "MCP JWT bearer exchange", - ) - .await?; - access_token.validate(request.resource, &granted_scopes) -} - -#[derive(Deserialize)] -struct OAuthErrorResponse { - error: Option, -} - -pub(crate) async fn post_form( - http_client: &Arc, - url: &str, - params: &[(&str, &str)], - client_id: &str, - invalid_grant_source: EmaInvalidGrantSource, - operation: &str, -) -> Result { - let client = OAuthHttpClientAdapter::new_with_redirect_mode( - Arc::clone(http_client), + /*has_configured_headers*/ false, + StreamableHttpRedirectMode::Legacy, + )?; + let resource_http = OAuthHttpClientAdapter::new_with_redirect_mode( + request.resource_http_client, build_default_headers(/*http_headers*/ None, /*env_http_headers*/ None)?, - url, + request.authorization_server_token_endpoint, /*has_configured_headers*/ false, StreamableHttpRedirectMode::Legacy, )?; - let body = { - let mut form = url::form_urlencoded::Serializer::new(String::new()); - form.extend_pairs(params.iter().copied()); - form.append_pair("client_id", client_id); - form.finish().into_bytes() - }; - let builder = oauth2::http::Request::builder() - .method("POST") - .uri(url) - .header("content-type", "application/x-www-form-urlencoded") - .header("accept", "application/json"); - let response = client - .execute_request( - builder.body(body)?, - OAuthHttpRedirectPolicy::Stop, - Some(Duration::from_secs(30)), - ) - .await - .map_err(|error| anyhow!("{operation} request failed: {error}"))?; - if !response.status().is_success() { - let error = serde_json::from_slice::(response.body()).ok(); - // Provider-controlled text may reflect the submitted assertion or secret. - // Only known OAuth codes may reach callers. - let code = safe_oauth_error_code(error.as_ref().and_then(|error| error.error.as_deref())); - if code == "invalid_grant" { - return Err(anyhow::Error::new(EmaAuthFailure::InvalidGrant { - grant_source: invalid_grant_source, - }) - .context(format!( - "{operation} returned HTTP {}: invalid_grant", - response.status() - ))); - } - if code == "insufficient_user_authentication" { - return Err( - anyhow::Error::new(EmaAuthFailure::InsufficientUserAuthentication).context( - format!("{operation} returned HTTP {}: {code}", response.status()), - ), - ); + let refresh_token = RefreshToken::new(request.refresh_token); + // Discovery has already verified both public-client registrations. The SDK owns + // token validation and the two exchanges; Codex retains routing and credential policy. + let token = EmaExchangeRequest::new( + EmaAuthorizationServer::new( + request.idp_issuer, + request.idp_token_endpoint, + request.idp_client_id, + ), + EmaAuthorizationServer::new( + request.authorization_server_issuer, + request.authorization_server_token_endpoint, + request.mcp_client_id, + ), + request.resource, + &refresh_token, + ) + .with_scopes(request.scopes.iter().cloned()) + .exchange(&idp_http, &resource_http) + .await + .map_err(|error| { + let failure = match &error { + EmaError::InvalidGrant(EmaExchangeStage::IdentityProvider) => { + Some(EmaAuthFailure::InvalidGrant { + grant_source: EmaInvalidGrantSource::EnterpriseIdentity, + }) + } + EmaError::InvalidGrant(EmaExchangeStage::ResourceAuthorizationServer) => { + Some(EmaAuthFailure::InvalidGrant { + grant_source: EmaInvalidGrantSource::ResourceAuthorization, + }) + } + EmaError::InsufficientUserAuthentication(_) => { + Some(EmaAuthFailure::InsufficientUserAuthentication) + } + // Future SDK stages must not invalidate the shared enterprise credential. + _ => None, + }; + match failure { + Some(failure) => anyhow::Error::new(failure).context(error), + None => anyhow::Error::new(error), } - bail!("{operation} returned HTTP {}: {code}", response.status()); - } - serde_json::from_slice(response.body()) - .map_err(|_| anyhow!("failed to parse {operation} response")) + })?; + Ok(EmaAccessToken { + access_token: token.access_token.secret().to_owned(), + expires_in: token.expires_in, + }) } #[cfg(test)] diff --git a/codex-rs/rmcp-client/src/ema_exchange_tests.rs b/codex-rs/rmcp-client/src/ema_exchange_tests.rs index 46717907108c..1e7e1a386285 100644 --- a/codex-rs/rmcp-client/src/ema_exchange_tests.rs +++ b/codex-rs/rmcp-client/src/ema_exchange_tests.rs @@ -19,6 +19,8 @@ use wiremock::matchers::method; use wiremock::matchers::path; use super::*; +use crate::ema_auth_policy::validate_ema_oauth_endpoint; +use crate::ema_claims::ID_JAG_TOKEN_TYPE; use crate::ema_claims::validate_oidc_identity_assertion; fn http_client() -> Arc { @@ -42,7 +44,7 @@ fn unique_form_fields(body: &[u8]) -> HashMap { fn jwt(claims: &Value) -> String { format!( - "{}.{}.signature", + "{}.{}.c2lnbmF0dXJl", URL_SAFE_NO_PAD.encode(br#"{"alg":"ES256","typ":"oauth-id-jag+jwt"}"#), URL_SAFE_NO_PAD.encode(serde_json::to_vec(claims).expect("serialize claims")) ) @@ -70,6 +72,25 @@ fn token_response() -> Value { json!({"access_token":"resource-token","token_type":"Bearer","expires_in":300}) } +async fn exchange(server: &MockServer, refresh_token: &str) -> Result { + let issuer = format!("{}/idp", server.uri()); + let audience = format!("{}/as", server.uri()); + exchange_id_jag(EmaIdJagExchangeRequest { + resource: &format!("{}/mcp", server.uri()), + scopes: &[], + mcp_client_id: "mcp-client", + authorization_server_issuer: &audience, + authorization_server_token_endpoint: &format!("{audience}/token"), + idp_token_endpoint: &format!("{issuer}/token"), + idp_issuer: &issuer, + idp_client_id: "idp-client", + refresh_token: refresh_token.to_string(), + idp_http_client: http_client(), + resource_http_client: http_client(), + }) + .await +} + #[tokio::test] async fn public_client_round_trip_preserves_signed_narrowing() -> Result<()> { let requested_scopes = ["files.read".to_string(), "files.write".to_string()]; @@ -185,168 +206,73 @@ async fn public_client_round_trip_preserves_signed_narrowing() -> Result<()> { Ok(()) } -#[test] -fn signed_claims_and_resource_tokens_cannot_widen_authority() -> Result<()> { - let requested = HashSet::from(["files.read", "files.write"]); - let original = claims( - "https://idp.example", - "https://as.example", - "https://mcp.example", - ); - let binding = || IdJagBinding { - issuer: "https://idp.example", - audience: "https://as.example", - client_id: "mcp-client", - resource: "https://mcp.example", - requested_scopes: &requested, - }; - let valid: IdJagResponse = serde_json::from_value(jag_response(&original))?; - let granted = valid.validate(binding())?; - assert_eq!(granted, HashSet::from(["files.read".to_string()])); - for (requested_scopes, signed_scope, response_scope, valid) in [ - ("", Some("files.read"), Some("files.read"), true), - ("", Some("files.read"), None, true), - ("", None, None, true), - ("files.read", Some("files.read"), None, true), - ("files.read files.write", Some("files.read"), None, false), - ( - "files.read", - Some("files.read files.write"), - Some("files.read files.write"), - false, - ), - ("files.read", None, None, false), - ("", Some("files.read"), Some("files.write"), false), - ("", Some(" \t"), None, false), - ("", Some("files.read files.read"), Some("files.read"), false), - ("", Some("files.read"), Some(" \t"), false), - ("", Some("files.read"), Some("files.read files.read"), false), +#[tokio::test] +async fn sdk_validation_rejects_unsupported_authorization_before_returning_a_bearer() { + for location in [ + "signed claims", + "IdP response", + "resource response", + "signed scope", ] { - let requested_scopes = requested_scopes.split_ascii_whitespace().collect(); - let mut scoped_claims = original.clone(); - scoped_claims - .as_object_mut() - .expect("ID-JAG claims") - .remove("scope"); - if let Some(scope) = signed_scope { - scoped_claims["scope"] = json!(scope); - } - let mut response = jag_response(&scoped_claims); - response - .as_object_mut() - .expect("ID-JAG response") - .remove("scope"); - if let Some(scope) = response_scope { - response["scope"] = json!(scope); - } - let response: IdJagResponse = serde_json::from_value(response)?; - let result = response.validate(IdJagBinding { - requested_scopes: &requested_scopes, - ..binding() - }); - assert_eq!( - result.is_ok(), - valid, - "requested {requested_scopes:?}, signed {signed_scope:?}, response {response_scope:?}" + let server = MockServer::builder().start().await; + let original = claims( + &format!("{}/idp", server.uri()), + &format!("{}/as", server.uri()), + &format!("{}/mcp", server.uri()), ); - if let Ok(granted) = result { - assert_eq!( - granted, - signed_scope - .into_iter() - .map(str::to_string) - .collect::>() - ); - for (scope, valid_token) in [ - (None, true), - (Some("files.read"), signed_scope.is_some()), - (Some("files.read files.write"), false), - ] { - let mut response = token_response(); - if let Some(scope) = scope { - response["scope"] = json!(scope); + let mut jag = jag_response(&original); + let mut bearer = token_response(); + let details = json!([{"type": "payment_initiation"}]); + match location { + "signed claims" | "signed scope" => { + let mut changed = original; + if location == "signed claims" { + changed["authorization_details"] = details; + } else { + changed["scope"] = json!("files.read\tfiles.write"); } - let response: McpAccessTokenResponse = serde_json::from_value(response)?; - assert_eq!( - response.validate("https://mcp.example", &granted).is_ok(), - valid_token, - "ID-JAG {signed_scope:?}, bearer {scope:?}" - ); + jag = jag_response(&changed); } + "IdP response" => jag["authorization_details"] = details, + "resource response" => bearer["authorization_details"] = details, + _ => unreachable!(), } - } - let mut rotated = jag_response(&original); - rotated["refresh_token"] = json!("unsupported-jag-refresh-token"); - let response: IdJagResponse = serde_json::from_value(rotated)?; - assert!(response.validate(binding()).is_err()); - for header in [ - json!({"alg": "ES256", "typ": "JWT"}), - json!({"alg": "ES256"}), - json!({"alg": "none", "typ": "oauth-id-jag+jwt"}), - ] { - let mut changed = jag_response(&original); - changed["access_token"] = json!(format!( - "{}.{}.signature", - URL_SAFE_NO_PAD.encode(serde_json::to_vec(&header)?), - URL_SAFE_NO_PAD.encode(serde_json::to_vec(&original)?), - )); - let response: IdJagResponse = serde_json::from_value(changed)?; - assert!( - response.validate(binding()).is_err(), - "accepted invalid ID-JAG header {header}" - ); - } - for (field, value) in [ - ("iss", json!("https://attacker.example")), - ("aud", json!("https://attacker.example")), - ("client_id", json!("other-client")), - ("sub", json!("")), - ("jti", json!("")), - ("exp", json!(0)), - ("iat", json!(u64::MAX)), - ("scope", json!("files.admin")), - ( - "resource", - json!(["https://mcp.example", "https://other.example"]), - ), - ] { - let mut changed = original.clone(); - changed[field] = value; - let response: IdJagResponse = serde_json::from_value(jag_response(&changed))?; - assert!( - response.validate(binding()).is_err(), - "accepted changed {field}" + let resource_requested = location == "resource response"; + for (endpoint, response, count) in [ + ("/idp/token", jag, 1), + ("/as/token", bearer, u64::from(resource_requested)), + ] { + Mock::given(method("POST")) + .and(path(endpoint)) + .respond_with(ResponseTemplate::new(200).set_body_json(response)) + .expect(count) + .mount(&server) + .await; + } + let error = exchange(&server, "refresh-token") + .await + .expect_err("SDK must reject unsupported authorization"); + assert_eq!( + error.downcast_ref::(), + Some(&EmaError::InvalidResponse { + stage: if resource_requested { + EmaExchangeStage::ResourceAuthorizationServer + } else { + EmaExchangeStage::IdentityProvider + }, + message: if location == "signed scope" { + "malformed or duplicate scopes" + } else { + "authorization_details is not supported" + }, + }), + "{location}" ); - } - for (field, value) in [ - ("scope", json!("files.read files.write")), - ("scope", json!("files.read files.read")), - ("resource", json!("https://other.example")), - ("expires_in", json!(0)), - ("refresh_token", json!("refresh")), - ("token_type", json!("N_A")), - ("access_token", json!("")), - ] { - let mut changed = token_response(); - changed[field] = value; - let response: McpAccessTokenResponse = serde_json::from_value(changed)?; - assert!( - response.validate("https://mcp.example", &granted).is_err(), - "accepted changed {field}" + assert_eq!( + server.received_requests().await.expect("requests").len(), + if resource_requested { 2 } else { 1 } ); } - let mut explicit_binding = token_response(); - explicit_binding["resource"] = json!("https://mcp.example"); - explicit_binding["scope"] = json!("files.read"); - let response: McpAccessTokenResponse = serde_json::from_value(explicit_binding)?; - assert_eq!( - response.validate("https://mcp.example", &granted)?, - EmaAccessToken { - access_token: "resource-token".to_string(), - expires_in: Some(Duration::from_secs(300)), - } - ); - Ok(()) } #[test] @@ -384,72 +310,65 @@ fn identity_and_credential_destinations_are_bound() { } #[tokio::test] -async fn provider_errors_cannot_reflect_credentials() { +async fn provider_errors_preserve_credential_policy_without_reflecting_credentials() { const SENTINEL: &str = "secret-assertion-sentinel"; - for (code, expected) in [ - (SENTINEL, "OAuth token request rejected"), - ("invalid_grant", "invalid_grant"), - ( - "insufficient_user_authentication", - "insufficient_user_authentication", - ), + for (endpoint, grant_source) in [ + ("/idp/token", EmaInvalidGrantSource::EnterpriseIdentity), + ("/as/token", EmaInvalidGrantSource::ResourceAuthorization), ] { - let server = MockServer::start().await; - Mock::given(method("POST")) - .and(path("/token")) - .respond_with(ResponseTemplate::new(400).set_body_json(json!({ - "error":code,"error_description":SENTINEL, - }))) - .mount(&server) - .await; - let error = post_form::( - &http_client(), - &format!("{}/token", server.uri()), - &[("subject_token", SENTINEL)], - "test-client", - EmaInvalidGrantSource::EnterpriseIdentity, - "test token exchange", - ) - .await - .expect_err("provider error should fail"); - match code { - "invalid_grant" => assert_eq!( - error.downcast_ref::(), - Some(&EmaAuthFailure::InvalidGrant { - grant_source: EmaInvalidGrantSource::EnterpriseIdentity, - }) - ), - "insufficient_user_authentication" => assert_eq!( - error.downcast_ref::(), - Some(&EmaAuthFailure::InsufficientUserAuthentication) - ), - _ => assert_eq!(error.downcast_ref::(), None), + for code in [ + SENTINEL, + "invalid_grant", + "insufficient_user_authentication", + "malformed", + ] { + let server = MockServer::builder().start().await; + if endpoint == "/as/token" { + let jag = jag_response(&claims( + &format!("{}/idp", server.uri()), + &format!("{}/as", server.uri()), + &format!("{}/mcp", server.uri()), + )); + Mock::given(method("POST")) + .and(path("/idp/token")) + .respond_with(ResponseTemplate::new(200).set_body_json(jag)) + .expect(1) + .mount(&server) + .await; + } + let response = if code == "malformed" { + ResponseTemplate::new(200).set_body_json(json!({"expires_in": SENTINEL})) + } else { + ResponseTemplate::new(400).set_body_json(json!({ + "error":code,"error_description":SENTINEL, + })) + }; + Mock::given(method("POST")) + .and(path(endpoint)) + .respond_with(response) + .expect(1) + .mount(&server) + .await; + let error = exchange(&server, SENTINEL) + .await + .expect_err("provider error should fail"); + let expected = match code { + "invalid_grant" => Some(EmaAuthFailure::InvalidGrant { grant_source }), + "insufficient_user_authentication" => { + Some(EmaAuthFailure::InsufficientUserAuthentication) + } + _ => None, + }; + assert_eq!(error.downcast_ref::(), expected.as_ref()); + assert!( + !format!("{error:#?}").contains(SENTINEL), + "provider reflected a credential" + ); + assert_eq!( + server.received_requests().await.expect("requests").len(), + if endpoint == "/as/token" { 2 } else { 1 }, + "exchange must not retry a rejected grant" + ); } - let error = error.to_string(); - assert!(!error.contains(SENTINEL), "provider reflected a credential"); - assert!(error.ends_with(expected), "{error}"); } - let server = MockServer::start().await; - let mut malformed = token_response(); - malformed["expires_in"] = json!(SENTINEL); - Mock::given(method("POST")) - .and(path("/token")) - .respond_with(ResponseTemplate::new(200).set_body_json(malformed)) - .mount(&server) - .await; - let error = post_form::( - &http_client(), - &format!("{}/token", server.uri()), - &[], - "test-client", - EmaInvalidGrantSource::EnterpriseIdentity, - "test token exchange", - ) - .await - .err() - .expect("malformed response should fail"); - assert!( - !format!("{error:#}").contains(SENTINEL), - "parser reflected a credential" - ); } From 9ef9cb1d9fc6013f6c1994346e0ee93ad9e6f986 Mon Sep 17 00:00:00 2001 From: Ruslan Nigmatullin Date: Wed, 30 Sep 2026 03:33:25 +0000 Subject: [PATCH 07/11] Complete turn abort callbacks before emitting terminal events (#49475) ## Why `TurnAborted` could be emitted before extension abort callbacks finished, allowing consumers to observe a terminal event while lifecycle cleanup was still pending. ## What changed Await `on_turn_abort` within task abort handling before emitting `TurnAborted`, retaining callback delivery for already-cancelled tasks. Document that `on_turn_stop` and `on_turn_abort` complete before their corresponding terminal events, if emitted. ## Testing Add regression coverage for interrupt, conditional interrupt, and shutdown. Hold the abort callback open to verify that `TurnAborted` waits for completion, then verify that the callback runs exactly once with the expected turn ID and abort reason. GitOrigin-RevId: f34d7e94d04c02544178dc445b85abc65a6ce499 --- codex-rs/core/src/tasks/mod.rs | 15 +- codex-rs/core/tests/suite/abort_lifecycle.rs | 150 ++++++++++++++++++ codex-rs/core/tests/suite/mod.rs | 1 + .../ext/extension-api/src/contributors.rs | 2 + 4 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 codex-rs/core/tests/suite/abort_lifecycle.rs diff --git a/codex-rs/core/src/tasks/mod.rs b/codex-rs/core/src/tasks/mod.rs index 4666142887a7..5ace22c811bc 100644 --- a/codex-rs/core/src/tasks/mod.rs +++ b/codex-rs/core/src/tasks/mod.rs @@ -537,11 +537,9 @@ impl Session { pub async fn abort_all_tasks(self: &Arc, reason: TurnAbortReason) { let mut aborted_turn = false; let mut active_turn_to_clear = None; - let mut turn_context = None; if let Some(mut active_turn) = self.take_active_turn(&reason).await { let task = active_turn.task.take(); aborted_turn = task.is_some(); - turn_context = task.as_ref().map(|task| Arc::clone(&task.turn_context)); if let Some(task) = task { self.handle_task_abort( task, @@ -556,10 +554,6 @@ impl Session { } } - if let Some(turn_context) = turn_context.as_deref() { - self.emit_turn_abort_lifecycle(reason.clone(), turn_context.extension_data.as_ref()) - .await; - } if let Some(active_turn) = active_turn_to_clear { // Let interrupted tasks observe cancellation before dropping pending approvals, or an // in-flight approval wait can surface as a model-visible rejection before TurnAborted. @@ -609,15 +603,10 @@ impl Session { error: Option, ) { let task = active_turn.task.take(); - let turn_context = task.as_ref().map(|task| Arc::clone(&task.turn_context)); if let Some(task) = task { self.handle_task_abort(task, reason.clone(), &active_turn.turn_state, error) .await; } - if let Some(turn_context) = turn_context.as_deref() { - self.emit_turn_abort_lifecycle(reason.clone(), turn_context.extension_data.as_ref()) - .await; - } // Let interrupted tasks observe cancellation before dropping pending approvals, or an // in-flight approval wait can surface as a model-visible rejection before TurnAborted. self.input_queue.clear_pending(&active_turn).await; @@ -928,6 +917,8 @@ impl Session { ) { let sub_id = task.turn_context.sub_id.clone(); if task.cancellation_token.is_cancelled() { + self.emit_turn_abort_lifecycle(reason, task.turn_context.extension_data.as_ref()) + .await; return; } @@ -1005,6 +996,8 @@ impl Session { turn_id: task.turn_context.sub_id.clone(), profile, }); + self.emit_turn_abort_lifecycle(reason.clone(), task.turn_context.extension_data.as_ref()) + .await; let event = EventMsg::TurnAborted(TurnAbortedEvent { turn_id: Some(task.turn_context.sub_id.clone()), reason, diff --git a/codex-rs/core/tests/suite/abort_lifecycle.rs b/codex-rs/core/tests/suite/abort_lifecycle.rs new file mode 100644 index 000000000000..296094d2c178 --- /dev/null +++ b/codex-rs/core/tests/suite/abort_lifecycle.rs @@ -0,0 +1,150 @@ +//! Verifies abort callbacks finish exactly once before the terminal event is published. + +use std::sync::Arc; +use std::sync::Mutex; +use std::time::Duration; + +use codex_core::StartThreadOptions; +use codex_core::TurnInputRequest; +use codex_extension_api::ExtensionFuture; +use codex_extension_api::ExtensionRegistryBuilder; +use codex_extension_api::TurnAbortInput; +use codex_extension_api::TurnLifecycleContributor; +use codex_protocol::dynamic_tools::DynamicToolFunctionSpec; +use codex_protocol::dynamic_tools::DynamicToolSpec; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::Op; +use codex_protocol::protocol::TurnAbortReason; +use codex_protocol::user_input::UserInput; +use core_test_support::responses; +use core_test_support::test_codex::test_codex; +use core_test_support::wait_for_event; +use pretty_assertions::assert_eq; +use test_case::test_case; +use tokio::sync::Notify; + +#[derive(Default)] +struct AbortGate { + entered: Notify, + release: Notify, + completed: Mutex>, +} + +impl TurnLifecycleContributor for AbortGate { + fn on_turn_abort<'a>(&'a self, input: TurnAbortInput<'a>) -> ExtensionFuture<'a, ()> { + Box::pin(async move { + self.entered.notify_one(); + self.release.notified().await; + self.completed + .lock() + .expect("abort callback records") + .push((input.turn_store.level_id().to_string(), input.reason)); + }) + } +} + +#[derive(Clone, Copy)] +enum AbortOperation { + Interrupt, + ConditionalInterrupt, + Shutdown, +} + +#[test_case(AbortOperation::Interrupt; "interrupt")] +#[test_case(AbortOperation::ConditionalInterrupt; "conditional_interrupt")] +#[test_case(AbortOperation::Shutdown; "shutdown")] +#[tokio::test] +async fn abort_lifecycle_finishes_before_terminal_event( + operation: AbortOperation, +) -> anyhow::Result<()> { + let server = responses::start_mock_server().await; + let request = responses::mount_sse_once( + &server, + responses::sse(vec![ + responses::ev_response_created("response"), + responses::ev_function_call("gate-call", "gate", "{}"), + responses::ev_completed("response"), + ]), + ) + .await; + let gate = Arc::new(AbortGate::default()); + let mut extensions = ExtensionRegistryBuilder::new(); + extensions.turn_lifecycle_contributor(gate.clone()); + let mut builder = test_codex().with_extensions(Arc::new(extensions.build())); + let test = builder.build_with_auto_env(&server).await?; + let thread = test + .thread_manager + .start_thread(StartThreadOptions { + environments: Some(vec![test.executor_environment().selection().clone()]), + dynamic_tools: vec![DynamicToolSpec::Function(DynamicToolFunctionSpec { + name: "gate".to_string(), + description: "Wait for the host.".to_string(), + input_schema: serde_json::json!({"type": "object", "properties": {}}), + defer_loading: false, + })], + ..StartThreadOptions::new(test.config.clone()) + }) + .await? + .thread; + thread + .start_or_steer_turn(TurnInputRequest::user_input(vec![UserInput::Text { + text: "Call gate.".to_string(), + text_elements: Vec::new(), + }])) + .await?; + let EventMsg::DynamicToolCallRequest(call) = wait_for_event(&thread, |event| { + matches!(event, EventMsg::DynamicToolCallRequest(_)) + }) + .await + else { + unreachable!(); + }; + request.single_request(); + + match operation { + AbortOperation::Interrupt => { + thread.submit(Op::Interrupt).await?; + } + AbortOperation::ConditionalInterrupt => { + let (reply, received) = tokio::sync::oneshot::channel(); + thread + .submit(Op::InterruptIfNoPendingInput { + turn_id: call.turn_id.clone(), + reply, + }) + .await?; + assert!(received.await?); + } + AbortOperation::Shutdown => { + thread.submit(Op::Shutdown).await?; + } + } + tokio::time::timeout(Duration::from_secs(10), gate.entered.notified()).await?; + // Keep the callback suspended: scheduling alone must not hide an early event. + let early_event = tokio::time::timeout( + Duration::from_millis(100), + wait_for_event(&thread, |event| matches!(event, EventMsg::TurnAborted(_))), + ) + .await; + gate.release.notify_one(); + assert!( + early_event.is_err(), + "TurnAborted arrived before its lifecycle callback finished" + ); + let EventMsg::TurnAborted(aborted) = + wait_for_event(&thread, |event| matches!(event, EventMsg::TurnAborted(_))).await + else { + unreachable!(); + }; + assert_eq!(aborted.turn_id, Some(call.turn_id.clone())); + assert_eq!(aborted.reason, TurnAbortReason::Interrupted); + if !matches!(operation, AbortOperation::Shutdown) { + thread.submit(Op::Shutdown).await?; + } + wait_for_event(&thread, |event| matches!(event, EventMsg::ShutdownComplete)).await; + assert_eq!( + *gate.completed.lock().expect("abort callback records"), + vec![(call.turn_id, TurnAbortReason::Interrupted)], + ); + Ok(()) +} diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index 1be4f9710fd0..2971b1201d79 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -36,6 +36,7 @@ pub static CODEX_ALIASES_TEMP_DIR: Option = { }) }; +mod abort_lifecycle; #[cfg(not(target_os = "windows"))] mod abort_tasks; mod additional_context; diff --git a/codex-rs/ext/extension-api/src/contributors.rs b/codex-rs/ext/extension-api/src/contributors.rs index bb2b162ce0ae..09892600d7e8 100644 --- a/codex-rs/ext/extension-api/src/contributors.rs +++ b/codex-rs/ext/extension-api/src/contributors.rs @@ -247,6 +247,7 @@ pub trait TurnLifecycleContributor: Send + Sync { } /// Called before the host drops the completed turn runtime and turn store. + /// The callback completes before the host emits the turn-complete event. fn on_turn_stop<'a>(&'a self, input: TurnStopInput<'a>) -> ExtensionFuture<'a, ()> { Box::pin(async move { let _self = self; @@ -255,6 +256,7 @@ pub trait TurnLifecycleContributor: Send + Sync { } /// Called after the host aborts a running turn. + /// The callback completes before the host emits the turn-aborted event, if any. fn on_turn_abort<'a>(&'a self, input: TurnAbortInput<'a>) -> ExtensionFuture<'a, ()> { Box::pin(async move { let _self = self; From 15fd656ddb55bd82a208fb9f00681880523f5260 Mon Sep 17 00:00:00 2001 From: Nick Steele Date: Wed, 30 Sep 2026 04:17:44 +0000 Subject: [PATCH 08/11] Discover and validate MCP authorization servers before ID-JAG exchange (#49478) ## What changed Add `exchange_ema_auth_token` to discover and validate the MCP resource's authorization server before resolving enterprise identity credentials and performing the ID-JAG token exchange. Keep the lower-level exchange primitive private. - Probe `server/discover` with the enterprise-managed authorization extension, support recognized legacy discovery rejections, and follow protected-resource metadata challenges or well-known fallbacks. - Match configured resource and issuer constraints, require advertised public-client JWT bearer support, and validate token endpoint metadata without requiring an authorization endpoint. - Bound discovery with a shared timeout, redirect and authorization-server limits, reject cross-origin metadata redirects, and restrict private authorization-server destinations while allowing local loopback discovery. ## Testing Add tests covering resource and issuer mismatches before identity access, metadata capability validation, query preservation, modern challenges, JSON and SSE legacy fallback behavior, cross-origin redirect rejection, and private or malformed issuer destinations. GitOrigin-RevId: 9a55233a20ff42c293f9bd8175e01141ac2d8576 --- codex-rs/network-proxy/src/lib.rs | 1 + codex-rs/network-proxy/src/policy.rs | 1 + codex-rs/protocol/src/mcp.rs | 3 + codex-rs/rmcp-client/src/ema_auth.rs | 205 +++++++++ codex-rs/rmcp-client/src/ema_auth_tests.rs | 377 ++++++++++++++++ codex-rs/rmcp-client/src/ema_claims.rs | 2 +- codex-rs/rmcp-client/src/ema_exchange.rs | 7 +- codex-rs/rmcp-client/src/ema_identity.rs | 1 - codex-rs/rmcp-client/src/ema_resource.rs | 411 ++++++++++++++++++ .../rmcp-client/src/http_client_adapter.rs | 2 +- codex-rs/rmcp-client/src/lib.rs | 7 +- 11 files changed, 1008 insertions(+), 9 deletions(-) create mode 100644 codex-rs/rmcp-client/src/ema_auth.rs create mode 100644 codex-rs/rmcp-client/src/ema_auth_tests.rs create mode 100644 codex-rs/rmcp-client/src/ema_resource.rs diff --git a/codex-rs/network-proxy/src/lib.rs b/codex-rs/network-proxy/src/lib.rs index df310c58c2e0..559ec0a9b184 100644 --- a/codex-rs/network-proxy/src/lib.rs +++ b/codex-rs/network-proxy/src/lib.rs @@ -78,6 +78,7 @@ pub use network_policy::NetworkPolicyDecision; pub use network_policy::NetworkPolicyRequest; pub use network_policy::NetworkPolicyRequestArgs; pub use network_policy::NetworkProtocol; +pub use policy::is_non_public_ip; pub use policy::normalize_host; pub use process_log_metadata::ExecutorLogIdentity; pub use process_log_metadata::NetworkProxyProcessLogMetadata; diff --git a/codex-rs/network-proxy/src/policy.rs b/codex-rs/network-proxy/src/policy.rs index 0cfd7c04c7c5..3b2486be1fa2 100644 --- a/codex-rs/network-proxy/src/policy.rs +++ b/codex-rs/network-proxy/src/policy.rs @@ -52,6 +52,7 @@ pub(crate) fn is_default_proxy_bypass_host(host: &str) -> bool { } } +/// Classifies IP literals excluded from public network destinations; does not resolve DNS. pub fn is_non_public_ip(ip: IpAddr) -> bool { match ip { IpAddr::V4(ip) => is_non_public_ipv4(ip), diff --git a/codex-rs/protocol/src/mcp.rs b/codex-rs/protocol/src/mcp.rs index 3e5c62e74121..1a409c4931c6 100644 --- a/codex-rs/protocol/src/mcp.rs +++ b/codex-rs/protocol/src/mcp.rs @@ -34,6 +34,9 @@ pub const OPENAI_STANDARD_FORM_INPUT_EXTENSION_ID: &str = "openai/standard-form- pub const MCP_APP_UI_EXTENSION_ID: &str = "io.modelcontextprotocol/ui"; /// Host-supplied confirmation-policy documents for Node REPL-backed actor calls. pub const CONFIRMATION_POLICIES_META_KEY: &str = "openai/confirmation_policies"; +/// Extension ID for enterprise-managed MCP authorization via ID-JAG. +pub const ENTERPRISE_MANAGED_AUTHORIZATION_EXTENSION_ID: &str = + "io.modelcontextprotocol/enterprise-managed-authorization"; /// Returns whether a raw MCP server name identifies a Node REPL-backed server. pub fn is_node_repl_backed_server(server: &str) -> bool { diff --git a/codex-rs/rmcp-client/src/ema_auth.rs b/codex-rs/rmcp-client/src/ema_auth.rs new file mode 100644 index 000000000000..5d5f5de64b79 --- /dev/null +++ b/codex-rs/rmcp-client/src/ema_auth.rs @@ -0,0 +1,205 @@ +//! Select the resource authorization server before polling identity or exchanging credentials. + +use std::collections::HashMap; +use std::sync::Arc; + +use anyhow::Context; +use anyhow::Result; +use anyhow::anyhow; +use anyhow::bail; +use codex_exec_server::HttpClient; +use futures::future::BoxFuture; +use http::StatusCode; +use serde::Deserialize; +use serde_json::Value; +use url::Url; + +use crate::ema_auth_policy::advertised_capability; +use crate::ema_auth_policy::validate_ema_auth_resource; +use crate::ema_auth_policy::validate_ema_oauth_endpoint; +use crate::ema_auth_policy::validate_ema_public_client_auth; +use crate::ema_exchange::EmaAccessToken; +use crate::ema_exchange::EmaIdJagExchangeRequest; +use crate::ema_exchange::JWT_BEARER_GRANT_TYPE; +use crate::ema_exchange::exchange_id_jag; +use crate::ema_identity::EmaIdpIdentity; +use crate::ema_resource::EmaDiscoveryRequest; +use crate::ema_resource::EmaResource; +use crate::ema_resource::discover_ema_resource; +use crate::ema_resource::validate_ema_metadata_issuer; + +const ID_JAG_GRANT_PROFILE: &str = "urn:ietf:params:oauth:grant-profile:id-jag"; + +/// Token-only Resource AS metadata must not require an unused authorization endpoint. +#[derive(Deserialize)] +struct EmaAuthorizationMetadata { + issuer: Option, + token_endpoint: String, + #[serde(flatten)] + additional_fields: HashMap, +} + +/// Inputs for non-interactive enterprise-managed MCP authorization. +pub struct EmaAuthTokenExchangeRequest<'a> { + pub server_url: &'a str, + pub resource: Option<&'a str>, + pub scopes: &'a [String], + pub mcp_client_id: Option<&'a str>, + pub expected_authorization_server_issuer: Option<&'a str>, + pub idp_issuer: &'a str, + pub idp_client_id: &'a str, + pub idp_identity: BoxFuture<'a, Result>, + pub idp_http_client: Arc, + pub resource_http_client: Arc, +} + +impl<'a> From<&EmaAuthTokenExchangeRequest<'a>> for EmaDiscoveryRequest<'a> { + fn from(request: &EmaAuthTokenExchangeRequest<'a>) -> Self { + Self { + server_url: request.server_url, + resource: request.resource, + expected_issuer: request.expected_authorization_server_issuer, + http_client: Arc::clone(&request.resource_http_client), + } + } +} + +/// Discover the resource's authorization server, then perform the ID-JAG flow. +pub async fn exchange_ema_auth_token( + request: EmaAuthTokenExchangeRequest<'_>, +) -> Result { + validate_ema_auth_resource(request.server_url, request.resource)?; + let client_id = request + .mcp_client_id + .filter(|value| !value.trim().is_empty()) + .ok_or_else(|| { + anyhow!( + "ema_auth requires the OAuth client ID registered with the MCP authorization server" + ) + })?; + let (metadata, resource) = + discover_ema_authorization_metadata(EmaDiscoveryRequest::from(&request)).await?; + let issuer = metadata + .issuer + .as_deref() + .ok_or_else(|| anyhow!("MCP authorization metadata is missing an issuer"))?; + let EmaIdpIdentity { + token_endpoint, + refresh_token, + credential_lock, + } = request.idp_identity.await?; + let result = exchange_id_jag(EmaIdJagExchangeRequest { + resource: &resource, + scopes: request.scopes, + mcp_client_id: client_id, + authorization_server_issuer: issuer, + authorization_server_token_endpoint: &metadata.token_endpoint, + idp_token_endpoint: &token_endpoint, + idp_issuer: request.idp_issuer, + idp_client_id: request.idp_client_id, + refresh_token, + idp_http_client: request.idp_http_client, + resource_http_client: request.resource_http_client, + }) + .await; + drop(credential_lock); + result +} + +async fn discover_ema_authorization_metadata( + request: EmaDiscoveryRequest<'_>, +) -> Result<(EmaAuthorizationMetadata, String)> { + let expected_issuer = request.expected_issuer; + let EmaResource { + server_url: server, + resource, + authorization_servers: issuers, + client, + } = discover_ema_resource(request).await?; + for issuer in issuers { + let issuer_url = match Url::parse(&issuer) { + Ok(url) => url, + Err(error) if expected_issuer.is_some() => { + return Err(error) + .context("configured enterprise authorization server issuer is invalid"); + } + Err(_) => continue, + }; + if let Err(error) = validate_ema_metadata_issuer(&server, &issuer_url) { + if expected_issuer.is_some() { + return Err(error); + } + continue; + } + let path = issuer_url.path().trim_matches('/'); + let suffix = if path.is_empty() { + String::new() + } else { + format!("/{path}") + }; + let mut urls = vec![ + issuer_url.join(&format!("/.well-known/oauth-authorization-server{suffix}"))?, + issuer_url.join(&format!("/.well-known/openid-configuration{suffix}"))?, + ]; + if !path.is_empty() { + urls.push(issuer_url.join(&format!("/{path}/.well-known/openid-configuration"))?); + urls.push(issuer_url.join("/.well-known/oauth-authorization-server")?); + } + for url in urls { + let response = client.get(url).await?; + if response.status() != StatusCode::OK { + continue; + } + let Ok(metadata) = serde_json::from_slice::(response.body()) + else { + continue; + }; + if metadata.issuer.as_deref() != Some(issuer.as_str()) { + bail!( + "enterprise authorization metadata issuer does not match its advertised issuer" + ); + } + validate_ema_oauth_endpoint( + &metadata.token_endpoint, + "MCP authorization server token endpoint", + )?; + if expected_issuer.is_some() + && issuer_url.origin() != Url::parse(&metadata.token_endpoint)?.origin() + { + bail!("enterprise MCP authorization server token endpoint changed origin"); + } + let profile = advertised_capability( + metadata + .additional_fields + .get("authorization_grant_profiles_supported"), + ID_JAG_GRANT_PROFILE, + "MCP authorization grant profiles", + )?; + let grant = advertised_capability( + metadata.additional_fields.get("grant_types_supported"), + JWT_BEARER_GRANT_TYPE, + "MCP authorization grant types", + )?; + if profile == Some(false) || grant != Some(true) { + break; + } + match validate_ema_public_client_auth( + metadata + .additional_fields + .get("token_endpoint_auth_methods_supported"), + "MCP authorization server", + ) { + Ok(()) => return Ok((metadata, resource)), + Err(error) if expected_issuer.is_some() => return Err(error), + Err(_) => break, + } + } + } + bail!( + "enterprise MCP discovery found no authorization server advertising public-client JWT bearer support for ID-JAG" + ) +} + +#[cfg(test)] +#[path = "ema_auth_tests.rs"] +mod tests; diff --git a/codex-rs/rmcp-client/src/ema_auth_tests.rs b/codex-rs/rmcp-client/src/ema_auth_tests.rs new file mode 100644 index 000000000000..d327ae34c299 --- /dev/null +++ b/codex-rs/rmcp-client/src/ema_auth_tests.rs @@ -0,0 +1,377 @@ +//! Bound metadata selection and HTTP confinement run before enterprise credential access. + +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering; + +use codex_exec_server::RouteAwareHttpClient; +use codex_http_client::HttpClientFactory; +use codex_http_client::OutboundProxyPolicy; +use pretty_assertions::assert_eq; +use serde_json::json; +use wiremock::Mock; +use wiremock::MockServer; +use wiremock::ResponseTemplate; +use wiremock::matchers::method; +use wiremock::matchers::path; + +use super::*; + +fn request<'a>(resource: &'a str, issuer: Option<&'a str>) -> EmaAuthTokenExchangeRequest<'a> { + let client: Arc = Arc::new(RouteAwareHttpClient::new(HttpClientFactory::new( + OutboundProxyPolicy::ReqwestDefault, + ))); + EmaAuthTokenExchangeRequest { + server_url: resource, + resource: Some(resource), + scopes: &[], + mcp_client_id: Some("resource-client"), + expected_authorization_server_issuer: issuer, + idp_issuer: "https://idp.example", + idp_client_id: "enterprise-client", + idp_identity: Box::pin(async { bail!("identity resolver reached") }), + idp_http_client: Arc::clone(&client), + resource_http_client: client, + } +} + +#[tokio::test] +async fn discovery_pins_resource_issuer_and_public_jwt_bearer_before_identity() -> Result<()> { + let metadata_cases = [ + (true, true, json!({}), true), + (false, true, json!({}), false), + (true, false, json!({}), false), + ] + .into_iter() + .chain( + [ + json!({"issuer": null}), + json!({"issuer": "https://other.example"}), + json!({"token_endpoint": "https://other.example/token"}), + json!({"token_endpoint": "http://as.example/token"}), + json!({"grant_types_supported": null}), + json!({"grant_types_supported": ["authorization_code"]}), + json!({"authorization_grant_profiles_supported": ["other"]}), + json!({"token_endpoint_auth_methods_supported": ["private_key_jwt"]}), + ] + .into_iter() + .map(|invalid| (true, true, invalid, false)), + ); + let fallback_paths = [ + "/.well-known/oauth-protected-resource/enterprise", + "/enterprise/.well-known/oauth-protected-resource", + "/.well-known/oauth-protected-resource", + ]; + let fallback_cases = fallback_paths.into_iter().flat_map(|path| { + [true, false].map(move |valid| ("GET", path, valid, true, json!({}), valid)) + }); + for (metadata_method, metadata_path, resource_matches, issuer_matches, additions, valid) in + metadata_cases + .map(|(resource, issuer, additions, valid)| { + ( + "POST", + "/enterprise/tools", + resource, + issuer, + additions, + valid, + ) + }) + .chain(fallback_cases) + { + let server = MockServer::start().await; + let query = "tenant=one%2Ftwo&tenant=three+four&flag=&encoded=%2f"; + let resource = format!("{}/enterprise?{query}", server.uri()); + let transport = format!("{}/enterprise/tools?{query}", server.uri()); + let issuer = format!("{}/as", server.uri()); + // A query-only resource change must not be accepted as the same resource. + let advertised_resource = if resource_matches { + resource.clone() + } else { + resource.replace("one", "two") + }; + Mock::given(method(metadata_method)) + .and(path(metadata_path)) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "resource": advertised_resource, + "authorization_servers": [format!("{}/unused", server.uri()), issuer], + }))) + .mount(&server) + .await; + let mut metadata = json!({"issuer": issuer, "token_endpoint": format!("{issuer}/token"), + "grant_types_supported": [JWT_BEARER_GRANT_TYPE], + "token_endpoint_auth_methods_supported": ["none"]}); + metadata + .as_object_mut() + .expect("metadata") + .extend(additions.as_object().expect("overrides").clone()); + Mock::given(method("GET")) + .and(path("/.well-known/oauth-authorization-server/as")) + .respond_with(ResponseTemplate::new(200).set_body_json(metadata)) + .mount(&server) + .await; + let polled = AtomicBool::new(false); + let mut exchange = request( + &resource, + Some(if issuer_matches { + &issuer + } else { + "https://other.example" + }), + ); + exchange.server_url = &transport; + exchange.idp_identity = Box::pin(async { + polled.store(true, Ordering::SeqCst); + bail!("identity resolver reached") + }); + exchange_ema_auth_token(exchange) + .await + .expect_err("stop before token exchange"); + assert_eq!(polled.load(Ordering::SeqCst), valid, "{additions}"); + let requests = server.received_requests().await.expect("requests"); + let resource_requests = requests + .iter() + .filter(|request| request.url.path() != "/.well-known/oauth-authorization-server/as") + .collect::>(); + assert!( + resource_requests + .iter() + .all(|request| request.url.query() == Some(query)) + ); + assert!( + resource_requests + .iter() + .all(|request| request.url.path() == "/enterprise/tools" + || (metadata_method == "GET" && fallback_paths.contains(&request.url.path()))) + ); + assert_eq!( + resource_requests + .last() + .expect("resource metadata request") + .url + .path(), + metadata_path + ); + } + Ok(()) +} + +#[tokio::test] +async fn modern_challenge_confines_metadata_redirects() -> Result<()> { + let server = MockServer::start().await; + let authorization = MockServer::start().await; + let attacker = MockServer::start().await; + let resource = format!("{}/mcp", server.uri()); + let issuer = authorization.uri(); + let prm = format!("{}/enterprise/resource", server.uri()); + Mock::given(method("POST")) + .and(path("/mcp")) + .respond_with(move |request: &wiremock::Request| { + assert_eq!(request.headers["mcp-protocol-version"], "2026-07-28"); + assert_eq!( + request.body_json::().expect("discovery")["method"], + "server/discover" + ); + ResponseTemplate::new(401).insert_header( + "www-authenticate", + format!("Bearer resource_metadata=\"{prm}\""), + ) + }) + .mount(&server) + .await; + Mock::given(method("GET")) + .and(path("/enterprise/resource")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"resource": resource, "authorization_servers": [issuer]})), + ) + .mount(&server) + .await; + let metadata = json!({"issuer": issuer, "token_endpoint": format!("{issuer}/token"), + "grant_types_supported": [JWT_BEARER_GRANT_TYPE], + "token_endpoint_auth_methods_supported": ["none"]}); + Mock::given(method("GET")) + .and(path("/.well-known/oauth-authorization-server")) + .respond_with(move |request: &wiremock::Request| { + assert!(!request.headers.contains_key("authorization")); + ResponseTemplate::new(200).set_body_json(metadata.clone()) + }) + .mount(&authorization) + .await; + let exchange = request(&resource, Some(&issuer)); + let (metadata, actual_resource) = + discover_ema_authorization_metadata(EmaDiscoveryRequest::from(&exchange)).await?; + assert_eq!( + (metadata.issuer, metadata.token_endpoint, actual_resource), + ( + Some(issuer.clone()), + format!("{issuer}/token"), + resource.clone() + ) + ); + Mock::given(method("GET")) + .and(path("/.well-known/oauth-authorization-server")) + .respond_with( + ResponseTemplate::new(307) + .insert_header("location", format!("{}/capture", attacker.uri())), + ) + .with_priority(1) + .mount(&authorization) + .await; + let error = discover_ema_authorization_metadata(EmaDiscoveryRequest::from(&exchange)) + .await + .err() + .context("cross-origin redirect must fail")?; + assert!(error.to_string().contains("cross-origin redirect")); + assert!( + attacker + .received_requests() + .await + .expect("requests") + .is_empty() + ); + Ok(()) +} + +#[tokio::test] +async fn legacy_challenges_require_a_recognized_discovery_rejection() -> Result<()> { + for (status, id, code, message, legacy) in [ + (404, json!(null), -1, "", true), + (405, json!(null), -1, "", true), + ( + 200, + json!("ema-auth-discover"), + -32601, + "Method not found", + true, + ), + ( + 400, + json!("ema-auth-discover"), + -32022, + "Unsupported protocol version: 2026-07-28", + true, + ), + ( + 400, + json!(null), + -32000, + "Bad Request: No valid session ID provided", + true, + ), + (200, json!("unrelated"), -32601, "Method not found", false), + (400, json!(null), -32000, "Unrecognized rejection", false), + (503, json!(null), -1, "", false), + ] { + for (sse, get_status) in [ + (false, 401), + (false, 400), + (false, 404), + (false, 405), + (false, 406), + (true, 401), + (true, 405), + ] { + let initialize = get_status != 401; + let server = MockServer::start().await; + let resource = format!("{}/mcp", server.uri()); + let prm = format!("{}/custom/metadata", server.uri()); + let rejection = if code == -1 { + ResponseTemplate::new(status) + } else { + let body = json!({ + "jsonrpc": "2.0", "id": id, "error": {"code": code, "message": message}, + }); + if sse { + ResponseTemplate::new(status).set_body_raw( + format!(": keepalive\n\nevent: message\ndata: {body}\n\n"), + "text/event-stream", + ) + } else { + ResponseTemplate::new(status).set_body_json(body) + } + }; + let challenge = ResponseTemplate::new(401).insert_header( + "www-authenticate", + format!("Bearer resource_metadata=\"{prm}\""), + ); + let post_challenge = challenge.clone(); + Mock::given(method("POST")) + .and(path("/mcp")) + .respond_with(move |request: &wiremock::Request| { + let body = request.body_json::().expect("probe"); + if body["method"] == "server/discover" { + return rejection.clone(); + } + assert!(legacy && initialize); + assert_eq!(body["method"], "initialize"); + assert_eq!(body["params"]["protocolVersion"], "2025-06-18"); + assert!(!request.headers.contains_key("authorization")); + post_challenge.clone() + }) + .mount(&server) + .await; + Mock::given(method("GET")) + .and(path("/mcp")) + .and(wiremock::matchers::header("accept", "text/event-stream")) + .respond_with(if initialize { + ResponseTemplate::new(get_status) + } else { + challenge + }) + .expect(u64::from(legacy)) + .mount(&server) + .await; + Mock::given(method("GET")) + .and(path("/custom/metadata")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "resource": resource, "authorization_servers": [server.uri()], + }))) + .expect(u64::from(legacy)) + .mount(&server) + .await; + let exchange = request(&resource, /*issuer*/ None); + let discovered = discover_ema_resource(EmaDiscoveryRequest::from(&exchange)).await; + assert_eq!( + discovered.is_ok(), + legacy, + "{status} {message}, sse={sse}, get_status={get_status}" + ); + server.verify().await; + } + } + Ok(()) +} + +#[test] +fn discovery_rejects_private_or_ambiguous_issuer_destinations() -> Result<()> { + let resource = Url::parse("https://mcp.example/mcp")?; + for issuer in [ + "http://issuer.example", + "https://10.0.0.1", + "https://127.0.0.1", + "https://169.254.169.254", + "https://100.64.0.1", + "https://198.19.0.1", + "https://192.0.2.1", + "https://[::ffff:192.0.2.1]", + "https://[fd00::1]", + "https://[::ffff:169.254.169.254]", + "https://metadata.google.internal", + "https://metadata.azure.internal", + "https://test.localhost", + "https://issuer.example?query=1", + "https://issuer.example#fragment", + "https://credentials@issuer.example", + ] { + assert!( + validate_ema_metadata_issuer(&resource, &Url::parse(issuer)?).is_err(), + "{issuer}" + ); + } + validate_ema_metadata_issuer(&resource, &Url::parse("https://issuer.example/tenant")?)?; + validate_ema_metadata_issuer( + &Url::parse("http://127.0.0.1/mcp")?, + &Url::parse("http://[::1]:1234")?, + )?; + Ok(()) +} diff --git a/codex-rs/rmcp-client/src/ema_claims.rs b/codex-rs/rmcp-client/src/ema_claims.rs index e70490047d01..61a65cc34edc 100644 --- a/codex-rs/rmcp-client/src/ema_claims.rs +++ b/codex-rs/rmcp-client/src/ema_claims.rs @@ -82,7 +82,7 @@ pub(crate) fn oidc_identity( Ok(claims) } -pub fn validate_oidc_identity_assertion( +pub(crate) fn validate_oidc_identity_assertion( assertion: &str, expected_issuer: &str, expected_audience: &str, diff --git a/codex-rs/rmcp-client/src/ema_exchange.rs b/codex-rs/rmcp-client/src/ema_exchange.rs index 243a05c94d46..afe5252b116f 100644 --- a/codex-rs/rmcp-client/src/ema_exchange.rs +++ b/codex-rs/rmcp-client/src/ema_exchange.rs @@ -19,7 +19,6 @@ use crate::utils::build_default_headers; pub(crate) const TOKEN_EXCHANGE_GRANT_TYPE: &str = "urn:ietf:params:oauth:grant-type:token-exchange"; -#[cfg(test)] pub(crate) const JWT_BEARER_GRANT_TYPE: &str = "urn:ietf:params:oauth:grant-type:jwt-bearer"; /// A resource-bound bearer and its server-reported lifetime, with redacted diagnostics. @@ -41,7 +40,7 @@ impl std::fmt::Debug for EmaAccessToken { /// The caller supplies trusted authorization-server metadata and an IdP credential. /// This primitive does not perform resource discovery or interactive login. -pub struct EmaIdJagExchangeRequest<'a> { +pub(crate) struct EmaIdJagExchangeRequest<'a> { pub resource: &'a str, pub scopes: &'a [String], pub mcp_client_id: &'a str, @@ -56,7 +55,9 @@ pub struct EmaIdJagExchangeRequest<'a> { } /// Exchanges an enterprise IdP credential for a resource-bound MCP bearer token. -pub async fn exchange_id_jag(request: EmaIdJagExchangeRequest<'_>) -> Result { +pub(crate) async fn exchange_id_jag( + request: EmaIdJagExchangeRequest<'_>, +) -> Result { let idp_http = OAuthHttpClientAdapter::new_with_redirect_mode( request.idp_http_client, build_default_headers(/*http_headers*/ None, /*env_http_headers*/ None)?, diff --git a/codex-rs/rmcp-client/src/ema_identity.rs b/codex-rs/rmcp-client/src/ema_identity.rs index f906e553f7a0..b320c8855edb 100644 --- a/codex-rs/rmcp-client/src/ema_identity.rs +++ b/codex-rs/rmcp-client/src/ema_identity.rs @@ -38,7 +38,6 @@ pub struct EmaIdpIdentityRequest<'a> { } /// An opaque IdP refresh token whose credential lock is held through token exchange. -#[allow(dead_code)] pub struct EmaIdpIdentity { pub(crate) token_endpoint: String, pub(crate) refresh_token: String, diff --git a/codex-rs/rmcp-client/src/ema_resource.rs b/codex-rs/rmcp-client/src/ema_resource.rs new file mode 100644 index 000000000000..19ba91b2fd9a --- /dev/null +++ b/codex-rs/rmcp-client/src/ema_resource.rs @@ -0,0 +1,411 @@ +//! Bound resource discovery and its HTTP safety policy before enterprise credential use. +//! The returned client keeps one deadline across resource and authorization-server discovery. + +use std::net::IpAddr; +use std::sync::Arc; +use std::time::Duration; +use std::time::Instant; + +use anyhow::Result; +use anyhow::anyhow; +use anyhow::bail; +use codex_exec_server::HttpClient; +use codex_network_proxy::is_non_public_ip; +use codex_protocol::mcp::ENTERPRISE_MANAGED_AUTHORIZATION_EXTENSION_ID; +use futures::StreamExt; +use http::Method; +use http::StatusCode; +use http::header::ACCEPT; +use http::header::CONTENT_TYPE; +use http::header::LOCATION; +use http::header::WWW_AUTHENTICATE; +use rmcp::model::ClientCapabilities; +use rmcp::model::ClientJsonRpcMessage; +use rmcp::model::ClientRequest; +use rmcp::model::DiscoverRequest; +use rmcp::model::DiscoverRequestParams; +use rmcp::model::ErrorCode; +use rmcp::model::Implementation; +use rmcp::model::InitializeRequest; +use rmcp::model::InitializeRequestParams; +use rmcp::model::JsonRpcMessage; +use rmcp::model::JsonRpcRequest; +use rmcp::model::ProtocolVersion; +use rmcp::model::RequestId; +use rmcp::model::RequestMetaObject; +use rmcp::model::ServerJsonRpcMessage; +use rmcp::transport::auth::OAuthHttpRedirectPolicy; +use rmcp::transport::auth::WWWAuthenticateParams; +use rmcp::transport::common::http_header::HEADER_MCP_METHOD; +use rmcp::transport::common::http_header::HEADER_MCP_PROTOCOL_VERSION; +use serde::Deserialize; +use sse_stream::SseStream; +use url::Host; +use url::Url; + +use crate::ema_auth_policy::validate_ema_auth_resource; +use crate::ema_auth_policy::validate_ema_oauth_endpoint; +use crate::http_client_adapter::StreamableHttpRedirectMode; +use crate::http_client_adapter::legacy_discovery_fallback_response; +use crate::oauth_http_client::OAuthHttpClientAdapter; +use crate::utils::build_default_headers; + +const MAX_EMA_AUTHORIZATION_SERVERS: usize = 16; +const MAX_EMA_DISCOVERY_REDIRECTS: usize = 10; +const EMA_DISCOVERY_TIMEOUT: Duration = Duration::from_secs(30); + +#[derive(Deserialize)] +struct EmaResourceMetadata { + resource: String, + authorization_server: Option, + #[serde(default)] + authorization_servers: Vec, +} + +/// EMA discovery retains its own resource/issuer context while sharing the HTTP safety policy. +pub(super) struct EmaDiscoveryClient { + inner: OAuthHttpClientAdapter, + deadline: Instant, +} + +impl EmaDiscoveryClient { + pub(super) async fn get(&self, url: Url) -> Result { + self.execute( + oauth2::http::Request::builder() + .uri(url.as_str()) + .body(Vec::new())?, + ) + .await + } + + async fn post( + &self, + url: &Url, + request: &JsonRpcRequest, + version: ProtocolVersion, + ) -> Result { + self.execute( + oauth2::http::Request::builder() + .method(Method::POST) + .uri(url.as_str()) + .header(ACCEPT, "application/json, text/event-stream") + .header(CONTENT_TYPE, "application/json") + .header(HEADER_MCP_PROTOCOL_VERSION, version.as_str()) + .header(HEADER_MCP_METHOD, request.request.method()) + .body(serde_json::to_vec(request)?)?, + ) + .await + } + + async fn execute(&self, request: oauth2::HttpRequest) -> Result { + let (parts, body) = request.into_parts(); + let mut url = Url::parse(&parts.uri.to_string())?; + for _ in 0..MAX_EMA_DISCOVERY_REDIRECTS { + validate_ema_oauth_endpoint(url.as_str(), "enterprise metadata URL")?; + let remaining = self + .deadline + .checked_duration_since(Instant::now()) + .ok_or_else(|| anyhow!("enterprise metadata discovery timed out"))?; + let mut request = oauth2::http::Request::builder() + .method(parts.method.clone()) + .uri(url.as_str()) + .body(body.clone())?; + *request.headers_mut() = parts.headers.clone(); + let response = self + .inner + .execute_request(request, OAuthHttpRedirectPolicy::Stop, Some(remaining)) + .await + .map_err(|error| { + anyhow!("enterprise metadata discovery request failed: {error}") + })?; + if response.status().is_server_error() + || matches!( + response.status(), + StatusCode::REQUEST_TIMEOUT + | StatusCode::TOO_EARLY + | StatusCode::TOO_MANY_REQUESTS + ) + { + bail!( + "enterprise metadata discovery returned HTTP {}", + response.status() + ); + } + if !response.status().is_redirection() || parts.method != Method::GET { + return Ok(response); + } + let Some(location) = response.headers().get(LOCATION) else { + return Ok(response); + }; + let next = url.join(location.to_str()?)?; + if next.origin() != url.origin() { + bail!("enterprise metadata discovery refused a cross-origin redirect"); + } + url = next; + } + bail!("enterprise metadata discovery exceeded its redirect limit") + } +} + +// Discovery responses use the same JSON or SSE framing as ordinary MCP requests. +// The HTTP adapter has already bounded this body; only a terminal RPC message matters. +async fn discovery_response_message( + response: &oauth2::HttpResponse, +) -> Option { + if !response + .headers() + .get(CONTENT_TYPE) + .and_then(|value| value.to_str().ok()) + .is_some_and(|value| value.starts_with("text/event-stream")) + { + return serde_json::from_slice(response.body()).ok(); + } + let mut events = + SseStream::from_bytes_stream(futures::stream::iter([Ok::<_, std::convert::Infallible>( + response.body().as_slice(), + )])); + while let Some(event) = events.next().await { + let event = event.ok()?; + if !matches!(event.event.as_deref(), None | Some("") | Some("message")) { + continue; + } + let Some(data) = event.data.filter(|data| !data.trim().is_empty()) else { + continue; + }; + let message = serde_json::from_str(&data).ok()?; + if matches!( + message, + JsonRpcMessage::Response(_) | JsonRpcMessage::Error(_) + ) { + return Some(message); + } + } + None +} + +/// Retain rmcp's denial of metadata endpoints on private addresses and cloud-metadata hosts. +pub(super) fn validate_ema_metadata_issuer(resource: &Url, issuer: &Url) -> Result<()> { + validate_ema_oauth_endpoint(issuer.as_str(), "enterprise authorization server issuer")?; + if issuer.query().is_some() { + bail!("enterprise authorization server issuer must not contain a query"); + } + let loopback = |url: &Url| match url.host() { + Some(Host::Domain(host)) => { + let host = host.trim_end_matches('.'); + host == "localhost" || host.ends_with(".localhost") + } + Some(Host::Ipv4(ip)) => ip.is_loopback(), + Some(Host::Ipv6(ip)) => ip.is_loopback(), + None => false, + }; + if loopback(resource) && loopback(issuer) { + return Ok(()); + } + let disallowed = match issuer.host() { + Some(Host::Domain(host)) => { + let host = host.trim_end_matches('.').to_ascii_lowercase(); + matches!( + host.as_str(), + "localhost" | "metadata" | "metadata.google.internal" | "metadata.azure.internal" + ) || host.ends_with(".localhost") + } + Some(Host::Ipv4(ip)) => is_non_public_ip(IpAddr::V4(ip)), + Some(Host::Ipv6(ip)) => is_non_public_ip(IpAddr::V6(ip)), + None => true, + }; + if disallowed { + bail!("enterprise discovery refused a private authorization-server metadata destination"); + } + Ok(()) +} + +pub(super) struct EmaDiscoveryRequest<'a> { + pub(super) server_url: &'a str, + pub(super) resource: Option<&'a str>, + pub(super) expected_issuer: Option<&'a str>, + pub(super) http_client: Arc, +} + +/// A validated resource and candidate list, with the discovery deadline still in force. +pub(super) struct EmaResource { + pub(super) server_url: Url, + pub(super) resource: String, + pub(super) authorization_servers: Vec, + pub(super) client: EmaDiscoveryClient, +} + +pub(super) async fn discover_ema_resource(request: EmaDiscoveryRequest<'_>) -> Result { + let client = EmaDiscoveryClient { + inner: OAuthHttpClientAdapter::new_with_redirect_mode( + request.http_client, + build_default_headers(/*http_headers*/ None, /*env_http_headers*/ None)?, + request.server_url, + /*has_configured_headers*/ false, + StreamableHttpRedirectMode::Legacy, + )?, + deadline: Instant::now() + EMA_DISCOVERY_TIMEOUT, + }; + let server = Url::parse(request.server_url)?; + let resource = Url::parse(request.resource.unwrap_or(request.server_url))?; + let path = resource.path().trim_matches('/'); + let mut resource_urls = vec![server.clone()]; + let metadata_url = |path: &str| { + let mut url = resource.clone(); + url.set_path(path); + url + }; + if !path.is_empty() { + resource_urls.push(metadata_url(&format!( + "/.well-known/oauth-protected-resource/{path}" + ))); + resource_urls.push(metadata_url(&format!( + "/{path}/.well-known/oauth-protected-resource" + ))); + } + resource_urls.push(metadata_url("/.well-known/oauth-protected-resource")); + let mut resource_metadata = None; + for url in resource_urls { + let mut response = if url == server { + // Modern MCP servers need not serve GET. Probe a read-only RPC to receive + // their authentication challenge before resolving enterprise credentials. + let mut discover = DiscoverRequest::new(DiscoverRequestParams {}); + discover + .extensions + .insert(RequestMetaObject::with_client_context( + ProtocolVersion::V_2026_07_28, + Implementation::new("codex", env!("CARGO_PKG_VERSION")), + ClientCapabilities::builder() + .enable_extensions_with( + [( + ENTERPRISE_MANAGED_AUTHORIZATION_EXTENSION_ID.to_string(), + Default::default(), + )] + .into(), + ) + .build(), + )); + let discover = JsonRpcRequest::new( + RequestId::String("ema-auth-discover".into()), + discover.into(), + ); + let mut response = client + .post(&server, &discover, ProtocolVersion::V_2026_07_28) + .await?; + let legacy = response.status() != StatusCode::UNAUTHORIZED + && match discovery_response_message(&response).await { + Some(message) => matches!( + legacy_discovery_fallback_response( + &ClientJsonRpcMessage::Request(discover), + message, + response.status() == StatusCode::BAD_REQUEST, + ), + JsonRpcMessage::Error(error) if error.error.code == ErrorCode::METHOD_NOT_FOUND + ), + None => matches!( + response.status(), + StatusCode::NOT_FOUND | StatusCode::METHOD_NOT_ALLOWED + ), + }; + if legacy { + // Preserve legacy custom metadata challenges without exchanging credentials + // or retrying application operations. All probes share the same deadline. + response = client + .execute( + oauth2::http::Request::builder() + .uri(server.as_str()) + .header(ACCEPT, "text/event-stream") + .body(Vec::new())?, + ) + .await?; + if matches!( + response.status(), + StatusCode::BAD_REQUEST + | StatusCode::NOT_FOUND + | StatusCode::METHOD_NOT_ALLOWED + | StatusCode::NOT_ACCEPTABLE + ) { + response = client + .post( + &server, + &JsonRpcRequest::new( + RequestId::String("ema-auth-initialize".into()), + InitializeRequest::new( + InitializeRequestParams::new( + ClientCapabilities::default(), + Implementation::new("codex", env!("CARGO_PKG_VERSION")), + ) + .with_protocol_version(ProtocolVersion::V_2025_06_18), + ) + .into(), + ), + ProtocolVersion::V_2025_06_18, + ) + .await?; + } + } + response + } else { + client.get(url).await? + }; + if response.status() == StatusCode::UNAUTHORIZED { + let challenge_url = response + .headers() + .get_all(WWW_AUTHENTICATE) + .iter() + .filter_map(|value| value.to_str().ok()) + .find_map(|value| { + WWWAuthenticateParams::parse(value, &server).resource_metadata_url + }); + if let Some(url) = challenge_url { + response = client.get(url).await?; + } + } + if response.status() == StatusCode::OK + && let Ok(metadata) = serde_json::from_slice::(response.body()) + { + resource_metadata = Some(metadata); + break; + } + } + let Some(EmaResourceMetadata { + resource, + authorization_server, + authorization_servers, + }) = resource_metadata + else { + bail!("enterprise MCP protected-resource metadata is missing or invalid"); + }; + if resource.trim().is_empty() { + bail!("enterprise MCP protected-resource identifier is empty"); + } + validate_ema_auth_resource(request.server_url, Some(&resource))?; + if request + .resource + .is_some_and(|expected| expected != resource) + { + bail!( + "configured enterprise MCP resource does not match the RFC 9728 protected-resource metadata" + ); + } + let mut issuers = authorization_server + .into_iter() + .chain(authorization_servers) + .collect::>(); + if issuers.len() > MAX_EMA_AUTHORIZATION_SERVERS { + bail!( + "enterprise MCP protected-resource metadata advertises too many authorization servers" + ); + } + if let Some(expected) = request.expected_issuer { + issuers.retain(|issuer| issuer == expected); + if issuers.is_empty() { + bail!("enterprise MCP authorization server issuer does not match configured issuer"); + } + } + Ok(EmaResource { + server_url: server, + resource, + authorization_servers: issuers, + client, + }) +} diff --git a/codex-rs/rmcp-client/src/http_client_adapter.rs b/codex-rs/rmcp-client/src/http_client_adapter.rs index bc49bd06c593..aa1239e0a443 100644 --- a/codex-rs/rmcp-client/src/http_client_adapter.rs +++ b/codex-rs/rmcp-client/src/http_client_adapter.rs @@ -796,7 +796,7 @@ fn mcp_redirect_policy( // rmcp's automatic lifecycle does not yet recognize deployed legacy discovery // rejection shapes. Remove this compatibility shim once the SDK does: // https://github.com/modelcontextprotocol/rust-sdk/issues/1040 -fn legacy_discovery_fallback_response( +pub(super) fn legacy_discovery_fallback_response( request: &ClientJsonRpcMessage, response: ServerJsonRpcMessage, allow_uncorrelated_http_rejection: bool, diff --git a/codex-rs/rmcp-client/src/lib.rs b/codex-rs/rmcp-client/src/lib.rs index 3a4a2b0f1c98..b4d65067ecc1 100644 --- a/codex-rs/rmcp-client/src/lib.rs +++ b/codex-rs/rmcp-client/src/lib.rs @@ -1,10 +1,12 @@ mod auth_status; mod bounded_stdio_transport; mod elicitation_client_service; +mod ema_auth; mod ema_auth_policy; mod ema_claims; mod ema_exchange; mod ema_identity; +mod ema_resource; mod enterprise_oauth_login; mod event_notification_transport; mod executor_process_transport; @@ -41,13 +43,12 @@ pub use auth_status::determine_streamable_http_auth_status; pub use auth_status::determine_streamable_http_auth_status_from_credentials; pub use auth_status::discover_streamable_http_oauth; pub use codex_protocol::protocol::McpAuthStatus; +pub use ema_auth::EmaAuthTokenExchangeRequest; +pub use ema_auth::exchange_ema_auth_token; pub use ema_auth_policy::EmaAuthFailure; pub use ema_auth_policy::EmaInvalidGrantSource; pub use ema_auth_policy::validate_ema_auth_resource; -pub use ema_claims::validate_oidc_identity_assertion; pub use ema_exchange::EmaAccessToken; -pub use ema_exchange::EmaIdJagExchangeRequest; -pub use ema_exchange::exchange_id_jag; pub use ema_identity::EmaIdpIdentity; pub use ema_identity::EmaIdpIdentityRequest; pub use ema_identity::resolve_ema_idp_identity; From 90abcfac02665ad882853a04155591cd863b2ca7 Mon Sep 17 00:00:00 2001 From: Keyan Zhang <2268452+keyz@users.noreply.github.com> Date: Wed, 30 Sep 2026 04:39:29 +0000 Subject: [PATCH 09/11] Add experimental thread prediction protocol types (#49480) ## What changed Define `thread/prediction/request` with `threadId` and `sourceTurnId`, and `thread/prediction/updated` with a `completed` result containing optional text or a `failed` result. Update generated JSON schemas, TypeScript types, and Python notification models. Route prediction notifications to their thread in the TUI and ignore them in the chat widget. The request remains unimplemented and returns a method-not-found error. GitOrigin-RevId: 09922f583d5c56f808d018121c651dcd92734515 --- .../schema/json/ServerNotification.json | 81 +++++++++++++++++ .../codex_app_server_protocol.schemas.json | 83 ++++++++++++++++++ .../codex_app_server_protocol.v2.schemas.json | 83 ++++++++++++++++++ .../ThreadPredictionUpdatedNotification.json | 65 ++++++++++++++ .../app-server-exports-experimental.json.zst | Bin 160155 -> 160624 bytes .../app-server-exports-stable.json.zst | Bin 155851 -> 156251 bytes .../schema/typescript/ServerNotification.ts | 3 +- .../typescript/ServerNotificationEnvelope.ts | 3 +- .../typescript/v2/ThreadPredictionResult.ts | 5 ++ .../v2/ThreadPredictionUpdatedNotification.ts | 6 ++ .../schema/typescript/v2/index.ts | 2 + .../src/protocol/common.rs | 8 ++ .../src/protocol/v2/mod.rs | 2 + .../src/protocol/v2/thread_prediction.rs | 35 ++++++++ codex-rs/app-server/src/message_processor.rs | 4 + codex-rs/app-server/src/notification_media.rs | 1 + .../tui/src/app/app_server_event_targets.rs | 3 + codex-rs/tui/src/chatwidget/protocol.rs | 1 + .../generated/notification_registry.py | 3 + .../src/openai_codex/generated/v2_all.py | 53 +++++++++++ 20 files changed, 439 insertions(+), 2 deletions(-) create mode 100644 codex-rs/app-server-protocol/schema/json/v2/ThreadPredictionUpdatedNotification.json create mode 100644 codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionResult.ts create mode 100644 codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionUpdatedNotification.ts create mode 100644 codex-rs/app-server-protocol/src/protocol/v2/thread_prediction.rs diff --git a/codex-rs/app-server-protocol/schema/json/ServerNotification.json b/codex-rs/app-server-protocol/schema/json/ServerNotification.json index 4ae27cf806ba..3c65020a322a 100644 --- a/codex-rs/app-server-protocol/schema/json/ServerNotification.json +++ b/codex-rs/app-server-protocol/schema/json/ServerNotification.json @@ -5474,6 +5474,67 @@ ], "type": "object" }, + "ThreadPredictionResult": { + "oneOf": [ + { + "properties": { + "text": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "completed" + ], + "title": "CompletedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "CompletedThreadPredictionResult", + "type": "object" + }, + { + "properties": { + "type": { + "enum": [ + "failed" + ], + "title": "FailedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "FailedThreadPredictionResult", + "type": "object" + } + ] + }, + "ThreadPredictionUpdatedNotification": { + "properties": { + "result": { + "$ref": "#/definitions/ThreadPredictionResult" + }, + "sourceTurnId": { + "type": "string" + }, + "threadId": { + "type": "string" + } + }, + "required": [ + "result", + "sourceTurnId", + "threadId" + ], + "type": "object" + }, "ThreadProjectUpdatedNotification": { "properties": { "projectId": { @@ -7153,6 +7214,26 @@ "title": "Thread/goal/updatedNotification", "type": "object" }, + { + "properties": { + "method": { + "enum": [ + "thread/prediction/updated" + ], + "title": "Thread/prediction/updatedNotificationMethod", + "type": "string" + }, + "params": { + "$ref": "#/definitions/ThreadPredictionUpdatedNotification" + } + }, + "required": [ + "method", + "params" + ], + "title": "Thread/prediction/updatedNotification", + "type": "object" + }, { "properties": { "method": { diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json index fb7684cabf94..663cc473da03 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json @@ -4839,6 +4839,26 @@ "title": "Thread/goal/updatedNotification", "type": "object" }, + { + "properties": { + "method": { + "enum": [ + "thread/prediction/updated" + ], + "title": "Thread/prediction/updatedNotificationMethod", + "type": "string" + }, + "params": { + "$ref": "#/definitions/v2/ThreadPredictionUpdatedNotification" + } + }, + "required": [ + "method", + "params" + ], + "title": "Thread/prediction/updatedNotification", + "type": "object" + }, { "properties": { "method": { @@ -23019,6 +23039,69 @@ "title": "ThreadNameUpdatedNotification", "type": "object" }, + "ThreadPredictionResult": { + "oneOf": [ + { + "properties": { + "text": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "completed" + ], + "title": "CompletedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "CompletedThreadPredictionResult", + "type": "object" + }, + { + "properties": { + "type": { + "enum": [ + "failed" + ], + "title": "FailedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "FailedThreadPredictionResult", + "type": "object" + } + ] + }, + "ThreadPredictionUpdatedNotification": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "result": { + "$ref": "#/definitions/v2/ThreadPredictionResult" + }, + "sourceTurnId": { + "type": "string" + }, + "threadId": { + "type": "string" + } + }, + "required": [ + "result", + "sourceTurnId", + "threadId" + ], + "title": "ThreadPredictionUpdatedNotification", + "type": "object" + }, "ThreadProjectUpdatedNotification": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json index acdc575506b7..8856accc957b 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json @@ -16281,6 +16281,26 @@ "title": "Thread/goal/updatedNotification", "type": "object" }, + { + "properties": { + "method": { + "enum": [ + "thread/prediction/updated" + ], + "title": "Thread/prediction/updatedNotificationMethod", + "type": "string" + }, + "params": { + "$ref": "#/definitions/ThreadPredictionUpdatedNotification" + } + }, + "required": [ + "method", + "params" + ], + "title": "Thread/prediction/updatedNotification", + "type": "object" + }, { "properties": { "method": { @@ -20733,6 +20753,69 @@ "title": "ThreadNameUpdatedNotification", "type": "object" }, + "ThreadPredictionResult": { + "oneOf": [ + { + "properties": { + "text": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "completed" + ], + "title": "CompletedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "CompletedThreadPredictionResult", + "type": "object" + }, + { + "properties": { + "type": { + "enum": [ + "failed" + ], + "title": "FailedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "FailedThreadPredictionResult", + "type": "object" + } + ] + }, + "ThreadPredictionUpdatedNotification": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "result": { + "$ref": "#/definitions/ThreadPredictionResult" + }, + "sourceTurnId": { + "type": "string" + }, + "threadId": { + "type": "string" + } + }, + "required": [ + "result", + "sourceTurnId", + "threadId" + ], + "title": "ThreadPredictionUpdatedNotification", + "type": "object" + }, "ThreadProjectUpdatedNotification": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadPredictionUpdatedNotification.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadPredictionUpdatedNotification.json new file mode 100644 index 000000000000..9c644fd5adaf --- /dev/null +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadPredictionUpdatedNotification.json @@ -0,0 +1,65 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "ThreadPredictionResult": { + "oneOf": [ + { + "properties": { + "text": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "completed" + ], + "title": "CompletedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "CompletedThreadPredictionResult", + "type": "object" + }, + { + "properties": { + "type": { + "enum": [ + "failed" + ], + "title": "FailedThreadPredictionResultType", + "type": "string" + } + }, + "required": [ + "type" + ], + "title": "FailedThreadPredictionResult", + "type": "object" + } + ] + } + }, + "properties": { + "result": { + "$ref": "#/definitions/ThreadPredictionResult" + }, + "sourceTurnId": { + "type": "string" + }, + "threadId": { + "type": "string" + } + }, + "required": [ + "result", + "sourceTurnId", + "threadId" + ], + "title": "ThreadPredictionUpdatedNotification", + "type": "object" +} \ No newline at end of file diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst index 6aa5e5bfed28d06a71ed127d174ec16efd8a3b27..2c53aa1783082ceb9a0eb20967f1bf2d7301d26f 100644 GIT binary patch literal 160624 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 literal 160155 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≪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 diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-stable.json.zst index 72fe29bf62f8c0255b548aa355b40c9596a9bbcc..1efda781c923bc7d4860149cbf22f96f39b7a447 100644 GIT binary patch literal 156251 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%0AS$}0?w1qE!h6tO${OWgEQdT1k(a3r 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 literal 155851 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

YUjtppz}1f= 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 nH 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 KZ)l|nc2)wi$|g$y diff --git a/codex-rs/app-server-protocol/schema/typescript/ServerNotification.ts b/codex-rs/app-server-protocol/schema/typescript/ServerNotification.ts index 360f97186269..50cc33acf3c5 100644 --- a/codex-rs/app-server-protocol/schema/typescript/ServerNotification.ts +++ b/codex-rs/app-server-protocol/schema/typescript/ServerNotification.ts @@ -57,6 +57,7 @@ import type { ThreadDeletedNotification } from "./v2/ThreadDeletedNotification"; import type { ThreadGoalClearedNotification } from "./v2/ThreadGoalClearedNotification"; import type { ThreadGoalUpdatedNotification } from "./v2/ThreadGoalUpdatedNotification"; import type { ThreadNameUpdatedNotification } from "./v2/ThreadNameUpdatedNotification"; +import type { ThreadPredictionUpdatedNotification } from "./v2/ThreadPredictionUpdatedNotification"; import type { ThreadProjectUpdatedNotification } from "./v2/ThreadProjectUpdatedNotification"; import type { ThreadQueueChangedNotification } from "./v2/ThreadQueueChangedNotification"; import type { ThreadRealtimeClosedNotification } from "./v2/ThreadRealtimeClosedNotification"; @@ -88,4 +89,4 @@ import type { WindowsWorldWritableWarningNotification } from "./v2/WindowsWorldW /** * Notification sent from the server to the client. */ -export type ServerNotification = { "method": "error", "params": ErrorNotification } | { "method": "thread/started", "params": ThreadStartedNotification } | { "method": "thread/status/changed", "params": ThreadStatusChangedNotification } | { "method": "thread/archived", "params": ThreadArchivedNotification } | { "method": "thread/deleted", "params": ThreadDeletedNotification } | { "method": "thread/unarchived", "params": ThreadUnarchivedNotification } | { "method": "thread/closed", "params": ThreadClosedNotification } | { "method": "thread/reverted", "params": ThreadRevertedNotification } | { "method": "skills/changed", "params": SkillsChangedNotification } | { "method": "thread/name/updated", "params": ThreadNameUpdatedNotification } | { "method": "thread/attachment/updated", "params": ThreadAttachmentUpdatedNotification } | { "method": "thread/goal/updated", "params": ThreadGoalUpdatedNotification } | { "method": "thread/goal/cleared", "params": ThreadGoalClearedNotification } | { "method": "thread/queue/changed", "params": ThreadQueueChangedNotification } | { "method": "project/changed", "params": ProjectChangedNotification } | { "method": "thread/project/updated", "params": ThreadProjectUpdatedNotification } | { "method": "thread/environment/connected", "params": EnvironmentConnectionNotification } | { "method": "thread/environment/disconnected", "params": EnvironmentConnectionNotification } | { "method": "thread/settings/updated", "params": ThreadSettingsUpdatedNotification } | { "method": "thread/tokenUsage/updated", "params": ThreadTokenUsageUpdatedNotification } | { "method": "turn/started", "params": TurnStartedNotification } | { "method": "hook/started", "params": HookStartedNotification } | { "method": "turn/completed", "params": TurnCompletedNotification } | { "method": "hook/completed", "params": HookCompletedNotification } | { "method": "turn/diff/updated", "params": TurnDiffUpdatedNotification } | { "method": "turn/plan/updated", "params": TurnPlanUpdatedNotification } | { "method": "item/started", "params": ItemStartedNotification } | { "method": "item/autoApprovalReview/started", "params": ItemGuardianApprovalReviewStartedNotification } | { "method": "item/autoApprovalReview/completed", "params": ItemGuardianApprovalReviewCompletedNotification } | { "method": "autoApprovalReview/strictReviewRequired", "params": StrictReviewRequiredNotification } | { "method": "item/completed", "params": ItemCompletedNotification } | { "method": "rawResponseItem/completed", "params": RawResponseItemCompletedNotification } | { "method": "rawResponse/completed", "params": RawResponseCompletedNotification } | { "method": "item/agentMessage/delta", "params": AgentMessageDeltaNotification } | { "method": "item/plan/delta", "params": PlanDeltaNotification } | { "method": "command/exec/outputDelta", "params": CommandExecOutputDeltaNotification } | { "method": "process/outputDelta", "params": ProcessOutputDeltaNotification } | { "method": "process/exited", "params": ProcessExitedNotification } | { "method": "item/commandExecution/outputDelta", "params": CommandExecutionOutputDeltaNotification } | { "method": "item/commandExecution/terminalInteraction", "params": TerminalInteractionNotification } | { "method": "item/fileChange/outputDelta", "params": FileChangeOutputDeltaNotification } | { "method": "item/fileChange/patchUpdated", "params": FileChangePatchUpdatedNotification } | { "method": "serverRequest/resolved", "params": ServerRequestResolvedNotification } | { "method": "item/mcpToolCall/progress", "params": McpToolCallProgressNotification } | { "method": "mcpServer/oauthLogin/completed", "params": McpServerOauthLoginCompletedNotification } | { "method": "mcpServer/startupStatus/updated", "params": McpServerStatusUpdatedNotification } | { "method": "mcpServer/event/stream/notification", "params": McpServerEventStreamNotification } | { "method": "account/updated", "params": AccountUpdatedNotification } | { "method": "account/gatewayOAuth/changed", "params": GatewayOAuthChangedNotification } | { "method": "account/rateLimits/updated", "params": AccountRateLimitsUpdatedNotification } | { "method": "app/list/updated", "params": AppListUpdatedNotification } | { "method": "remoteControl/status/changed", "params": RemoteControlStatusChangedNotification } | { "method": "externalAgentConfig/import/progress", "params": ExternalAgentConfigImportProgressNotification } | { "method": "externalAgentConfig/import/completed", "params": ExternalAgentConfigImportCompletedNotification } | { "method": "fs/changed", "params": FsChangedNotification } | { "method": "item/reasoning/summaryTextDelta", "params": ReasoningSummaryTextDeltaNotification } | { "method": "item/reasoning/summaryPartAdded", "params": ReasoningSummaryPartAddedNotification } | { "method": "item/reasoning/textDelta", "params": ReasoningTextDeltaNotification } | { "method": "thread/compacted", "params": ContextCompactedNotification } | { "method": "model/rerouted", "params": ModelReroutedNotification } | { "method": "model/verification", "params": ModelVerificationNotification } | { "method": "modelProvider/authRecoveryStarted", "params": AuthRecoveryNotification } | { "method": "modelProvider/authRecoveryCompleted", "params": AuthRecoveryNotification } | { "method": "turn/moderationMetadata", "params": TurnModerationMetadataNotification } | { "method": "model/safetyBuffering/updated", "params": ModelSafetyBufferingUpdatedNotification } | { "method": "warning", "params": WarningNotification } | { "method": "guardianWarning", "params": GuardianWarningNotification } | { "method": "deprecationNotice", "params": DeprecationNoticeNotification } | { "method": "configWarning", "params": ConfigWarningNotification } | { "method": "fuzzyFileSearch/sessionUpdated", "params": FuzzyFileSearchSessionUpdatedNotification } | { "method": "fuzzyFileSearch/sessionCompleted", "params": FuzzyFileSearchSessionCompletedNotification } | { "method": "thread/realtime/started", "params": ThreadRealtimeStartedNotification } | { "method": "thread/realtime/itemAdded", "params": ThreadRealtimeItemAddedNotification } | { "method": "thread/realtime/item/started", "params": ThreadRealtimeItemStartedNotification } | { "method": "thread/realtime/item/transcript/delta", "params": ThreadRealtimeItemTranscriptDeltaNotification } | { "method": "thread/realtime/item/completed", "params": ThreadRealtimeItemCompletedNotification } | { "method": "thread/realtime/transcript/delta", "params": ThreadRealtimeTranscriptDeltaNotification } | { "method": "thread/realtime/transcript/done", "params": ThreadRealtimeTranscriptDoneNotification } | { "method": "thread/realtime/outputAudio/delta", "params": ThreadRealtimeOutputAudioDeltaNotification } | { "method": "thread/realtime/sdp", "params": ThreadRealtimeSdpNotification } | { "method": "thread/realtime/error", "params": ThreadRealtimeErrorNotification } | { "method": "thread/realtime/closed", "params": ThreadRealtimeClosedNotification } | { "method": "windows/worldWritableWarning", "params": WindowsWorldWritableWarningNotification } | { "method": "windowsSandbox/setupCompleted", "params": WindowsSandboxSetupCompletedNotification } | { "method": "account/login/completed", "params": AccountLoginCompletedNotification }; +export type ServerNotification = { "method": "error", "params": ErrorNotification } | { "method": "thread/started", "params": ThreadStartedNotification } | { "method": "thread/status/changed", "params": ThreadStatusChangedNotification } | { "method": "thread/archived", "params": ThreadArchivedNotification } | { "method": "thread/deleted", "params": ThreadDeletedNotification } | { "method": "thread/unarchived", "params": ThreadUnarchivedNotification } | { "method": "thread/closed", "params": ThreadClosedNotification } | { "method": "thread/reverted", "params": ThreadRevertedNotification } | { "method": "skills/changed", "params": SkillsChangedNotification } | { "method": "thread/name/updated", "params": ThreadNameUpdatedNotification } | { "method": "thread/attachment/updated", "params": ThreadAttachmentUpdatedNotification } | { "method": "thread/goal/updated", "params": ThreadGoalUpdatedNotification } | { "method": "thread/prediction/updated", "params": ThreadPredictionUpdatedNotification } | { "method": "thread/goal/cleared", "params": ThreadGoalClearedNotification } | { "method": "thread/queue/changed", "params": ThreadQueueChangedNotification } | { "method": "project/changed", "params": ProjectChangedNotification } | { "method": "thread/project/updated", "params": ThreadProjectUpdatedNotification } | { "method": "thread/environment/connected", "params": EnvironmentConnectionNotification } | { "method": "thread/environment/disconnected", "params": EnvironmentConnectionNotification } | { "method": "thread/settings/updated", "params": ThreadSettingsUpdatedNotification } | { "method": "thread/tokenUsage/updated", "params": ThreadTokenUsageUpdatedNotification } | { "method": "turn/started", "params": TurnStartedNotification } | { "method": "hook/started", "params": HookStartedNotification } | { "method": "turn/completed", "params": TurnCompletedNotification } | { "method": "hook/completed", "params": HookCompletedNotification } | { "method": "turn/diff/updated", "params": TurnDiffUpdatedNotification } | { "method": "turn/plan/updated", "params": TurnPlanUpdatedNotification } | { "method": "item/started", "params": ItemStartedNotification } | { "method": "item/autoApprovalReview/started", "params": ItemGuardianApprovalReviewStartedNotification } | { "method": "item/autoApprovalReview/completed", "params": ItemGuardianApprovalReviewCompletedNotification } | { "method": "autoApprovalReview/strictReviewRequired", "params": StrictReviewRequiredNotification } | { "method": "item/completed", "params": ItemCompletedNotification } | { "method": "rawResponseItem/completed", "params": RawResponseItemCompletedNotification } | { "method": "rawResponse/completed", "params": RawResponseCompletedNotification } | { "method": "item/agentMessage/delta", "params": AgentMessageDeltaNotification } | { "method": "item/plan/delta", "params": PlanDeltaNotification } | { "method": "command/exec/outputDelta", "params": CommandExecOutputDeltaNotification } | { "method": "process/outputDelta", "params": ProcessOutputDeltaNotification } | { "method": "process/exited", "params": ProcessExitedNotification } | { "method": "item/commandExecution/outputDelta", "params": CommandExecutionOutputDeltaNotification } | { "method": "item/commandExecution/terminalInteraction", "params": TerminalInteractionNotification } | { "method": "item/fileChange/outputDelta", "params": FileChangeOutputDeltaNotification } | { "method": "item/fileChange/patchUpdated", "params": FileChangePatchUpdatedNotification } | { "method": "serverRequest/resolved", "params": ServerRequestResolvedNotification } | { "method": "item/mcpToolCall/progress", "params": McpToolCallProgressNotification } | { "method": "mcpServer/oauthLogin/completed", "params": McpServerOauthLoginCompletedNotification } | { "method": "mcpServer/startupStatus/updated", "params": McpServerStatusUpdatedNotification } | { "method": "mcpServer/event/stream/notification", "params": McpServerEventStreamNotification } | { "method": "account/updated", "params": AccountUpdatedNotification } | { "method": "account/gatewayOAuth/changed", "params": GatewayOAuthChangedNotification } | { "method": "account/rateLimits/updated", "params": AccountRateLimitsUpdatedNotification } | { "method": "app/list/updated", "params": AppListUpdatedNotification } | { "method": "remoteControl/status/changed", "params": RemoteControlStatusChangedNotification } | { "method": "externalAgentConfig/import/progress", "params": ExternalAgentConfigImportProgressNotification } | { "method": "externalAgentConfig/import/completed", "params": ExternalAgentConfigImportCompletedNotification } | { "method": "fs/changed", "params": FsChangedNotification } | { "method": "item/reasoning/summaryTextDelta", "params": ReasoningSummaryTextDeltaNotification } | { "method": "item/reasoning/summaryPartAdded", "params": ReasoningSummaryPartAddedNotification } | { "method": "item/reasoning/textDelta", "params": ReasoningTextDeltaNotification } | { "method": "thread/compacted", "params": ContextCompactedNotification } | { "method": "model/rerouted", "params": ModelReroutedNotification } | { "method": "model/verification", "params": ModelVerificationNotification } | { "method": "modelProvider/authRecoveryStarted", "params": AuthRecoveryNotification } | { "method": "modelProvider/authRecoveryCompleted", "params": AuthRecoveryNotification } | { "method": "turn/moderationMetadata", "params": TurnModerationMetadataNotification } | { "method": "model/safetyBuffering/updated", "params": ModelSafetyBufferingUpdatedNotification } | { "method": "warning", "params": WarningNotification } | { "method": "guardianWarning", "params": GuardianWarningNotification } | { "method": "deprecationNotice", "params": DeprecationNoticeNotification } | { "method": "configWarning", "params": ConfigWarningNotification } | { "method": "fuzzyFileSearch/sessionUpdated", "params": FuzzyFileSearchSessionUpdatedNotification } | { "method": "fuzzyFileSearch/sessionCompleted", "params": FuzzyFileSearchSessionCompletedNotification } | { "method": "thread/realtime/started", "params": ThreadRealtimeStartedNotification } | { "method": "thread/realtime/itemAdded", "params": ThreadRealtimeItemAddedNotification } | { "method": "thread/realtime/item/started", "params": ThreadRealtimeItemStartedNotification } | { "method": "thread/realtime/item/transcript/delta", "params": ThreadRealtimeItemTranscriptDeltaNotification } | { "method": "thread/realtime/item/completed", "params": ThreadRealtimeItemCompletedNotification } | { "method": "thread/realtime/transcript/delta", "params": ThreadRealtimeTranscriptDeltaNotification } | { "method": "thread/realtime/transcript/done", "params": ThreadRealtimeTranscriptDoneNotification } | { "method": "thread/realtime/outputAudio/delta", "params": ThreadRealtimeOutputAudioDeltaNotification } | { "method": "thread/realtime/sdp", "params": ThreadRealtimeSdpNotification } | { "method": "thread/realtime/error", "params": ThreadRealtimeErrorNotification } | { "method": "thread/realtime/closed", "params": ThreadRealtimeClosedNotification } | { "method": "windows/worldWritableWarning", "params": WindowsWorldWritableWarningNotification } | { "method": "windowsSandbox/setupCompleted", "params": WindowsSandboxSetupCompletedNotification } | { "method": "account/login/completed", "params": AccountLoginCompletedNotification }; diff --git a/codex-rs/app-server-protocol/schema/typescript/ServerNotificationEnvelope.ts b/codex-rs/app-server-protocol/schema/typescript/ServerNotificationEnvelope.ts index 3c306f005ffc..f3c6d2c2e6a7 100644 --- a/codex-rs/app-server-protocol/schema/typescript/ServerNotificationEnvelope.ts +++ b/codex-rs/app-server-protocol/schema/typescript/ServerNotificationEnvelope.ts @@ -57,6 +57,7 @@ import type { ThreadDeletedNotification } from "./v2/ThreadDeletedNotification"; import type { ThreadGoalClearedNotification } from "./v2/ThreadGoalClearedNotification"; import type { ThreadGoalUpdatedNotification } from "./v2/ThreadGoalUpdatedNotification"; import type { ThreadNameUpdatedNotification } from "./v2/ThreadNameUpdatedNotification"; +import type { ThreadPredictionUpdatedNotification } from "./v2/ThreadPredictionUpdatedNotification"; import type { ThreadProjectUpdatedNotification } from "./v2/ThreadProjectUpdatedNotification"; import type { ThreadQueueChangedNotification } from "./v2/ThreadQueueChangedNotification"; import type { ThreadRealtimeClosedNotification } from "./v2/ThreadRealtimeClosedNotification"; @@ -98,4 +99,4 @@ export type ServerNotificationEnvelope = { * Optional so clients can decode notifications from older app-server * versions. Current app-server versions always populate it. */ -emittedAtMs?: number, } & ({ "method": "error", "params": ErrorNotification } | { "method": "thread/started", "params": ThreadStartedNotification } | { "method": "thread/status/changed", "params": ThreadStatusChangedNotification } | { "method": "thread/archived", "params": ThreadArchivedNotification } | { "method": "thread/deleted", "params": ThreadDeletedNotification } | { "method": "thread/unarchived", "params": ThreadUnarchivedNotification } | { "method": "thread/closed", "params": ThreadClosedNotification } | { "method": "thread/reverted", "params": ThreadRevertedNotification } | { "method": "skills/changed", "params": SkillsChangedNotification } | { "method": "thread/name/updated", "params": ThreadNameUpdatedNotification } | { "method": "thread/attachment/updated", "params": ThreadAttachmentUpdatedNotification } | { "method": "thread/goal/updated", "params": ThreadGoalUpdatedNotification } | { "method": "thread/goal/cleared", "params": ThreadGoalClearedNotification } | { "method": "thread/queue/changed", "params": ThreadQueueChangedNotification } | { "method": "project/changed", "params": ProjectChangedNotification } | { "method": "thread/project/updated", "params": ThreadProjectUpdatedNotification } | { "method": "thread/environment/connected", "params": EnvironmentConnectionNotification } | { "method": "thread/environment/disconnected", "params": EnvironmentConnectionNotification } | { "method": "thread/settings/updated", "params": ThreadSettingsUpdatedNotification } | { "method": "thread/tokenUsage/updated", "params": ThreadTokenUsageUpdatedNotification } | { "method": "turn/started", "params": TurnStartedNotification } | { "method": "hook/started", "params": HookStartedNotification } | { "method": "turn/completed", "params": TurnCompletedNotification } | { "method": "hook/completed", "params": HookCompletedNotification } | { "method": "turn/diff/updated", "params": TurnDiffUpdatedNotification } | { "method": "turn/plan/updated", "params": TurnPlanUpdatedNotification } | { "method": "item/started", "params": ItemStartedNotification } | { "method": "item/autoApprovalReview/started", "params": ItemGuardianApprovalReviewStartedNotification } | { "method": "item/autoApprovalReview/completed", "params": ItemGuardianApprovalReviewCompletedNotification } | { "method": "autoApprovalReview/strictReviewRequired", "params": StrictReviewRequiredNotification } | { "method": "item/completed", "params": ItemCompletedNotification } | { "method": "rawResponseItem/completed", "params": RawResponseItemCompletedNotification } | { "method": "rawResponse/completed", "params": RawResponseCompletedNotification } | { "method": "item/agentMessage/delta", "params": AgentMessageDeltaNotification } | { "method": "item/plan/delta", "params": PlanDeltaNotification } | { "method": "command/exec/outputDelta", "params": CommandExecOutputDeltaNotification } | { "method": "process/outputDelta", "params": ProcessOutputDeltaNotification } | { "method": "process/exited", "params": ProcessExitedNotification } | { "method": "item/commandExecution/outputDelta", "params": CommandExecutionOutputDeltaNotification } | { "method": "item/commandExecution/terminalInteraction", "params": TerminalInteractionNotification } | { "method": "item/fileChange/outputDelta", "params": FileChangeOutputDeltaNotification } | { "method": "item/fileChange/patchUpdated", "params": FileChangePatchUpdatedNotification } | { "method": "serverRequest/resolved", "params": ServerRequestResolvedNotification } | { "method": "item/mcpToolCall/progress", "params": McpToolCallProgressNotification } | { "method": "mcpServer/oauthLogin/completed", "params": McpServerOauthLoginCompletedNotification } | { "method": "mcpServer/startupStatus/updated", "params": McpServerStatusUpdatedNotification } | { "method": "mcpServer/event/stream/notification", "params": McpServerEventStreamNotification } | { "method": "account/updated", "params": AccountUpdatedNotification } | { "method": "account/gatewayOAuth/changed", "params": GatewayOAuthChangedNotification } | { "method": "account/rateLimits/updated", "params": AccountRateLimitsUpdatedNotification } | { "method": "app/list/updated", "params": AppListUpdatedNotification } | { "method": "remoteControl/status/changed", "params": RemoteControlStatusChangedNotification } | { "method": "externalAgentConfig/import/progress", "params": ExternalAgentConfigImportProgressNotification } | { "method": "externalAgentConfig/import/completed", "params": ExternalAgentConfigImportCompletedNotification } | { "method": "fs/changed", "params": FsChangedNotification } | { "method": "item/reasoning/summaryTextDelta", "params": ReasoningSummaryTextDeltaNotification } | { "method": "item/reasoning/summaryPartAdded", "params": ReasoningSummaryPartAddedNotification } | { "method": "item/reasoning/textDelta", "params": ReasoningTextDeltaNotification } | { "method": "thread/compacted", "params": ContextCompactedNotification } | { "method": "model/rerouted", "params": ModelReroutedNotification } | { "method": "model/verification", "params": ModelVerificationNotification } | { "method": "modelProvider/authRecoveryStarted", "params": AuthRecoveryNotification } | { "method": "modelProvider/authRecoveryCompleted", "params": AuthRecoveryNotification } | { "method": "turn/moderationMetadata", "params": TurnModerationMetadataNotification } | { "method": "model/safetyBuffering/updated", "params": ModelSafetyBufferingUpdatedNotification } | { "method": "warning", "params": WarningNotification } | { "method": "guardianWarning", "params": GuardianWarningNotification } | { "method": "deprecationNotice", "params": DeprecationNoticeNotification } | { "method": "configWarning", "params": ConfigWarningNotification } | { "method": "fuzzyFileSearch/sessionUpdated", "params": FuzzyFileSearchSessionUpdatedNotification } | { "method": "fuzzyFileSearch/sessionCompleted", "params": FuzzyFileSearchSessionCompletedNotification } | { "method": "thread/realtime/started", "params": ThreadRealtimeStartedNotification } | { "method": "thread/realtime/itemAdded", "params": ThreadRealtimeItemAddedNotification } | { "method": "thread/realtime/item/started", "params": ThreadRealtimeItemStartedNotification } | { "method": "thread/realtime/item/transcript/delta", "params": ThreadRealtimeItemTranscriptDeltaNotification } | { "method": "thread/realtime/item/completed", "params": ThreadRealtimeItemCompletedNotification } | { "method": "thread/realtime/transcript/delta", "params": ThreadRealtimeTranscriptDeltaNotification } | { "method": "thread/realtime/transcript/done", "params": ThreadRealtimeTranscriptDoneNotification } | { "method": "thread/realtime/outputAudio/delta", "params": ThreadRealtimeOutputAudioDeltaNotification } | { "method": "thread/realtime/sdp", "params": ThreadRealtimeSdpNotification } | { "method": "thread/realtime/error", "params": ThreadRealtimeErrorNotification } | { "method": "thread/realtime/closed", "params": ThreadRealtimeClosedNotification } | { "method": "windows/worldWritableWarning", "params": WindowsWorldWritableWarningNotification } | { "method": "windowsSandbox/setupCompleted", "params": WindowsSandboxSetupCompletedNotification } | { "method": "account/login/completed", "params": AccountLoginCompletedNotification }); +emittedAtMs?: number, } & ({ "method": "error", "params": ErrorNotification } | { "method": "thread/started", "params": ThreadStartedNotification } | { "method": "thread/status/changed", "params": ThreadStatusChangedNotification } | { "method": "thread/archived", "params": ThreadArchivedNotification } | { "method": "thread/deleted", "params": ThreadDeletedNotification } | { "method": "thread/unarchived", "params": ThreadUnarchivedNotification } | { "method": "thread/closed", "params": ThreadClosedNotification } | { "method": "thread/reverted", "params": ThreadRevertedNotification } | { "method": "skills/changed", "params": SkillsChangedNotification } | { "method": "thread/name/updated", "params": ThreadNameUpdatedNotification } | { "method": "thread/attachment/updated", "params": ThreadAttachmentUpdatedNotification } | { "method": "thread/goal/updated", "params": ThreadGoalUpdatedNotification } | { "method": "thread/prediction/updated", "params": ThreadPredictionUpdatedNotification } | { "method": "thread/goal/cleared", "params": ThreadGoalClearedNotification } | { "method": "thread/queue/changed", "params": ThreadQueueChangedNotification } | { "method": "project/changed", "params": ProjectChangedNotification } | { "method": "thread/project/updated", "params": ThreadProjectUpdatedNotification } | { "method": "thread/environment/connected", "params": EnvironmentConnectionNotification } | { "method": "thread/environment/disconnected", "params": EnvironmentConnectionNotification } | { "method": "thread/settings/updated", "params": ThreadSettingsUpdatedNotification } | { "method": "thread/tokenUsage/updated", "params": ThreadTokenUsageUpdatedNotification } | { "method": "turn/started", "params": TurnStartedNotification } | { "method": "hook/started", "params": HookStartedNotification } | { "method": "turn/completed", "params": TurnCompletedNotification } | { "method": "hook/completed", "params": HookCompletedNotification } | { "method": "turn/diff/updated", "params": TurnDiffUpdatedNotification } | { "method": "turn/plan/updated", "params": TurnPlanUpdatedNotification } | { "method": "item/started", "params": ItemStartedNotification } | { "method": "item/autoApprovalReview/started", "params": ItemGuardianApprovalReviewStartedNotification } | { "method": "item/autoApprovalReview/completed", "params": ItemGuardianApprovalReviewCompletedNotification } | { "method": "autoApprovalReview/strictReviewRequired", "params": StrictReviewRequiredNotification } | { "method": "item/completed", "params": ItemCompletedNotification } | { "method": "rawResponseItem/completed", "params": RawResponseItemCompletedNotification } | { "method": "rawResponse/completed", "params": RawResponseCompletedNotification } | { "method": "item/agentMessage/delta", "params": AgentMessageDeltaNotification } | { "method": "item/plan/delta", "params": PlanDeltaNotification } | { "method": "command/exec/outputDelta", "params": CommandExecOutputDeltaNotification } | { "method": "process/outputDelta", "params": ProcessOutputDeltaNotification } | { "method": "process/exited", "params": ProcessExitedNotification } | { "method": "item/commandExecution/outputDelta", "params": CommandExecutionOutputDeltaNotification } | { "method": "item/commandExecution/terminalInteraction", "params": TerminalInteractionNotification } | { "method": "item/fileChange/outputDelta", "params": FileChangeOutputDeltaNotification } | { "method": "item/fileChange/patchUpdated", "params": FileChangePatchUpdatedNotification } | { "method": "serverRequest/resolved", "params": ServerRequestResolvedNotification } | { "method": "item/mcpToolCall/progress", "params": McpToolCallProgressNotification } | { "method": "mcpServer/oauthLogin/completed", "params": McpServerOauthLoginCompletedNotification } | { "method": "mcpServer/startupStatus/updated", "params": McpServerStatusUpdatedNotification } | { "method": "mcpServer/event/stream/notification", "params": McpServerEventStreamNotification } | { "method": "account/updated", "params": AccountUpdatedNotification } | { "method": "account/gatewayOAuth/changed", "params": GatewayOAuthChangedNotification } | { "method": "account/rateLimits/updated", "params": AccountRateLimitsUpdatedNotification } | { "method": "app/list/updated", "params": AppListUpdatedNotification } | { "method": "remoteControl/status/changed", "params": RemoteControlStatusChangedNotification } | { "method": "externalAgentConfig/import/progress", "params": ExternalAgentConfigImportProgressNotification } | { "method": "externalAgentConfig/import/completed", "params": ExternalAgentConfigImportCompletedNotification } | { "method": "fs/changed", "params": FsChangedNotification } | { "method": "item/reasoning/summaryTextDelta", "params": ReasoningSummaryTextDeltaNotification } | { "method": "item/reasoning/summaryPartAdded", "params": ReasoningSummaryPartAddedNotification } | { "method": "item/reasoning/textDelta", "params": ReasoningTextDeltaNotification } | { "method": "thread/compacted", "params": ContextCompactedNotification } | { "method": "model/rerouted", "params": ModelReroutedNotification } | { "method": "model/verification", "params": ModelVerificationNotification } | { "method": "modelProvider/authRecoveryStarted", "params": AuthRecoveryNotification } | { "method": "modelProvider/authRecoveryCompleted", "params": AuthRecoveryNotification } | { "method": "turn/moderationMetadata", "params": TurnModerationMetadataNotification } | { "method": "model/safetyBuffering/updated", "params": ModelSafetyBufferingUpdatedNotification } | { "method": "warning", "params": WarningNotification } | { "method": "guardianWarning", "params": GuardianWarningNotification } | { "method": "deprecationNotice", "params": DeprecationNoticeNotification } | { "method": "configWarning", "params": ConfigWarningNotification } | { "method": "fuzzyFileSearch/sessionUpdated", "params": FuzzyFileSearchSessionUpdatedNotification } | { "method": "fuzzyFileSearch/sessionCompleted", "params": FuzzyFileSearchSessionCompletedNotification } | { "method": "thread/realtime/started", "params": ThreadRealtimeStartedNotification } | { "method": "thread/realtime/itemAdded", "params": ThreadRealtimeItemAddedNotification } | { "method": "thread/realtime/item/started", "params": ThreadRealtimeItemStartedNotification } | { "method": "thread/realtime/item/transcript/delta", "params": ThreadRealtimeItemTranscriptDeltaNotification } | { "method": "thread/realtime/item/completed", "params": ThreadRealtimeItemCompletedNotification } | { "method": "thread/realtime/transcript/delta", "params": ThreadRealtimeTranscriptDeltaNotification } | { "method": "thread/realtime/transcript/done", "params": ThreadRealtimeTranscriptDoneNotification } | { "method": "thread/realtime/outputAudio/delta", "params": ThreadRealtimeOutputAudioDeltaNotification } | { "method": "thread/realtime/sdp", "params": ThreadRealtimeSdpNotification } | { "method": "thread/realtime/error", "params": ThreadRealtimeErrorNotification } | { "method": "thread/realtime/closed", "params": ThreadRealtimeClosedNotification } | { "method": "windows/worldWritableWarning", "params": WindowsWorldWritableWarningNotification } | { "method": "windowsSandbox/setupCompleted", "params": WindowsSandboxSetupCompletedNotification } | { "method": "account/login/completed", "params": AccountLoginCompletedNotification }); diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionResult.ts b/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionResult.ts new file mode 100644 index 000000000000..0b9678f128ba --- /dev/null +++ b/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionResult.ts @@ -0,0 +1,5 @@ +// GENERATED CODE! DO NOT MODIFY BY HAND! + +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type ThreadPredictionResult = { "type": "completed", text: string | null, } | { "type": "failed" }; diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionUpdatedNotification.ts b/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionUpdatedNotification.ts new file mode 100644 index 000000000000..8a33a5089f66 --- /dev/null +++ b/codex-rs/app-server-protocol/schema/typescript/v2/ThreadPredictionUpdatedNotification.ts @@ -0,0 +1,6 @@ +// GENERATED CODE! DO NOT MODIFY BY HAND! + +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ThreadPredictionResult } from "./ThreadPredictionResult"; + +export type ThreadPredictionUpdatedNotification = { threadId: string, sourceTurnId: string, result: ThreadPredictionResult, }; diff --git a/codex-rs/app-server-protocol/schema/typescript/v2/index.ts b/codex-rs/app-server-protocol/schema/typescript/v2/index.ts index d0c9fea6d0be..b96f29ce44bb 100644 --- a/codex-rs/app-server-protocol/schema/typescript/v2/index.ts +++ b/codex-rs/app-server-protocol/schema/typescript/v2/index.ts @@ -526,6 +526,8 @@ export type { ThreadMetadataGitInfoUpdateParams } from "./ThreadMetadataGitInfoU export type { ThreadMetadataUpdateParams } from "./ThreadMetadataUpdateParams"; export type { ThreadMetadataUpdateResponse } from "./ThreadMetadataUpdateResponse"; export type { ThreadNameUpdatedNotification } from "./ThreadNameUpdatedNotification"; +export type { ThreadPredictionResult } from "./ThreadPredictionResult"; +export type { ThreadPredictionUpdatedNotification } from "./ThreadPredictionUpdatedNotification"; export type { ThreadProjectUpdatedNotification } from "./ThreadProjectUpdatedNotification"; export type { ThreadQueueChangedNotification } from "./ThreadQueueChangedNotification"; export type { ThreadReadParams } from "./ThreadReadParams"; diff --git a/codex-rs/app-server-protocol/src/protocol/common.rs b/codex-rs/app-server-protocol/src/protocol/common.rs index c37c4956f1c3..c6d6fad791b8 100644 --- a/codex-rs/app-server-protocol/src/protocol/common.rs +++ b/codex-rs/app-server-protocol/src/protocol/common.rs @@ -605,6 +605,12 @@ client_request_definitions! { serialization: thread_id(params.thread_id), response: v2::ThreadSetNameResponse, }, + #[experimental("thread/prediction/request")] + ThreadPredictionRequest => "thread/prediction/request" { + params: v2::ThreadPredictionRequestParams, + serialization: thread_id(params.thread_id), + response: v2::ThreadPredictionRequestResponse, + }, ThreadGoalSet => "thread/goal/set" { params: v2::ThreadGoalSetParams, serialization: thread_id(params.thread_id), @@ -1927,6 +1933,8 @@ server_notification_definitions! { ThreadNameUpdated => "thread/name/updated" (v2::ThreadNameUpdatedNotification), ThreadAttachmentUpdated => "thread/attachment/updated" (v2::ThreadAttachmentUpdatedNotification), ThreadGoalUpdated => "thread/goal/updated" (v2::ThreadGoalUpdatedNotification), + #[experimental("thread/prediction/updated")] + ThreadPredictionUpdated => "thread/prediction/updated" (v2::ThreadPredictionUpdatedNotification), ThreadGoalCleared => "thread/goal/cleared" (v2::ThreadGoalClearedNotification), #[experimental("thread/queue/changed")] ThreadQueueChanged => "thread/queue/changed" (v2::ThreadQueueChangedNotification), diff --git a/codex-rs/app-server-protocol/src/protocol/v2/mod.rs b/codex-rs/app-server-protocol/src/protocol/v2/mod.rs index 5bc7d96f0071..1c1432dfbde1 100644 --- a/codex-rs/app-server-protocol/src/protocol/v2/mod.rs +++ b/codex-rs/app-server-protocol/src/protocol/v2/mod.rs @@ -34,6 +34,7 @@ mod rollout; mod thread; mod thread_attachment; mod thread_data; +mod thread_prediction; mod thread_usage; mod turn; mod user_verification; @@ -74,6 +75,7 @@ pub use shared::*; pub use thread::*; pub use thread_attachment::*; pub use thread_data::*; +pub use thread_prediction::*; pub use thread_usage::*; pub use turn::*; pub use user_verification::*; diff --git a/codex-rs/app-server-protocol/src/protocol/v2/thread_prediction.rs b/codex-rs/app-server-protocol/src/protocol/v2/thread_prediction.rs new file mode 100644 index 000000000000..6fc5c495af21 --- /dev/null +++ b/codex-rs/app-server-protocol/src/protocol/v2/thread_prediction.rs @@ -0,0 +1,35 @@ +//! App-server API types for predictions. + +use crate::JsonSchema; +use crate::TS; +use serde::Deserialize; +use serde::Serialize; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct ThreadPredictionRequestParams { + pub thread_id: String, + pub source_turn_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[ts(export_to = "v2/")] +pub struct ThreadPredictionRequestResponse {} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export_to = "v2/")] +pub struct ThreadPredictionUpdatedNotification { + pub thread_id: String, + pub source_turn_id: String, + pub result: ThreadPredictionResult, +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)] +#[serde(tag = "type", rename_all = "camelCase")] +#[ts(tag = "type", rename_all = "camelCase", export_to = "v2/")] +pub enum ThreadPredictionResult { + Completed { text: Option }, + Failed, +} diff --git a/codex-rs/app-server/src/message_processor.rs b/codex-rs/app-server/src/message_processor.rs index f5a9a65425ae..796ecf2fc86a 100644 --- a/codex-rs/app-server/src/message_processor.rs +++ b/codex-rs/app-server/src/message_processor.rs @@ -11,6 +11,7 @@ use crate::current_time::app_server_time_provider; use crate::error_code::internal_error; use crate::error_code::invalid_params; use crate::error_code::invalid_request; +use crate::error_code::method_not_found; use crate::extensions::ThreadExtensionDependencies; use crate::extensions::app_server_extension_event_sink; use crate::extensions::thread_extensions; @@ -1443,6 +1444,9 @@ impl MessageProcessor { .thread_unarchive(request_id.clone(), params) .await } + ClientRequest::ThreadPredictionRequest { .. } => Err(method_not_found( + "thread/prediction/request is not implemented yet", + )), ClientRequest::ThreadCompactStart { params, .. } => { self.thread_processor .thread_compact_start(&request_id, params) diff --git a/codex-rs/app-server/src/notification_media.rs b/codex-rs/app-server/src/notification_media.rs index a3bb780b36dd..4223ea796d28 100644 --- a/codex-rs/app-server/src/notification_media.rs +++ b/codex-rs/app-server/src/notification_media.rs @@ -66,6 +66,7 @@ pub(crate) fn without_notification_media(notification: ServerNotification) -> Se | ServerNotification::ThreadNameUpdated(_) | ServerNotification::ThreadAttachmentUpdated(_) | ServerNotification::ThreadGoalUpdated(_) + | ServerNotification::ThreadPredictionUpdated(_) | ServerNotification::ThreadGoalCleared(_) | ServerNotification::ThreadQueueChanged(_) | ServerNotification::ProjectChanged(_) diff --git a/codex-rs/tui/src/app/app_server_event_targets.rs b/codex-rs/tui/src/app/app_server_event_targets.rs index cc63496e9ef9..9e5b60bd83e7 100644 --- a/codex-rs/tui/src/app/app_server_event_targets.rs +++ b/codex-rs/tui/src/app/app_server_event_targets.rs @@ -71,6 +71,9 @@ pub(super) fn server_notification_thread_target( ServerNotification::ThreadGoalUpdated(notification) => { Some(notification.thread_id.as_str()) } + ServerNotification::ThreadPredictionUpdated(notification) => { + Some(notification.thread_id.as_str()) + } ServerNotification::ThreadGoalCleared(notification) => { Some(notification.thread_id.as_str()) } diff --git a/codex-rs/tui/src/chatwidget/protocol.rs b/codex-rs/tui/src/chatwidget/protocol.rs index 51ac5f09b37f..d4aa343b7511 100644 --- a/codex-rs/tui/src/chatwidget/protocol.rs +++ b/codex-rs/tui/src/chatwidget/protocol.rs @@ -361,6 +361,7 @@ impl ChatWidget { | ServerNotification::ThreadStatusChanged(_) | ServerNotification::ThreadReverted(_) | ServerNotification::ThreadQueueChanged(_) + | ServerNotification::ThreadPredictionUpdated(_) | ServerNotification::ThreadArchived(_) | ServerNotification::ThreadDeleted(_) | ServerNotification::ThreadUnarchived(_) diff --git a/sdk/python/src/openai_codex/generated/notification_registry.py b/sdk/python/src/openai_codex/generated/notification_registry.py index b30783706dae..af2d3590abe7 100644 --- a/sdk/python/src/openai_codex/generated/notification_registry.py +++ b/sdk/python/src/openai_codex/generated/notification_registry.py @@ -61,6 +61,7 @@ from .v2_all import ThreadGoalClearedNotification from .v2_all import ThreadGoalUpdatedNotification from .v2_all import ThreadNameUpdatedNotification +from .v2_all import ThreadPredictionUpdatedNotification from .v2_all import ThreadProjectUpdatedNotification from .v2_all import ThreadQueueChangedNotification from .v2_all import ThreadRealtimeClosedNotification @@ -144,6 +145,7 @@ | ThreadGoalClearedNotification | ThreadGoalUpdatedNotification | ThreadNameUpdatedNotification + | ThreadPredictionUpdatedNotification | ThreadProjectUpdatedNotification | ThreadQueueChangedNotification | ThreadRealtimeClosedNotification @@ -230,6 +232,7 @@ "thread/goal/cleared": ThreadGoalClearedNotification, "thread/goal/updated": ThreadGoalUpdatedNotification, "thread/name/updated": ThreadNameUpdatedNotification, + "thread/prediction/updated": ThreadPredictionUpdatedNotification, "thread/project/updated": ThreadProjectUpdatedNotification, "thread/queue/changed": ThreadQueueChangedNotification, "thread/realtime/closed": ThreadRealtimeClosedNotification, diff --git a/sdk/python/src/openai_codex/generated/v2_all.py b/sdk/python/src/openai_codex/generated/v2_all.py index f9ee2be07fd6..6a2edc47255b 100644 --- a/sdk/python/src/openai_codex/generated/v2_all.py +++ b/sdk/python/src/openai_codex/generated/v2_all.py @@ -5613,6 +5613,39 @@ class ThreadNameUpdatedNotification(BaseModel): thread_name: Annotated[str | None, Field(alias="threadName")] = None +class CompletedThreadPredictionResult(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + text: str | None = None + type: Annotated[Literal["completed"], Field(title="CompletedThreadPredictionResultType")] + + +class FailedThreadPredictionResult(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + type: Annotated[Literal["failed"], Field(title="FailedThreadPredictionResultType")] + + +class ThreadPredictionResult( + RootModel[CompletedThreadPredictionResult | FailedThreadPredictionResult] +): + model_config = ConfigDict( + populate_by_name=True, + ) + root: CompletedThreadPredictionResult | FailedThreadPredictionResult + + +class ThreadPredictionUpdatedNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + result: ThreadPredictionResult + source_turn_id: Annotated[str, Field(alias="sourceTurnId")] + thread_id: Annotated[str, Field(alias="threadId")] + + class ThreadProjectUpdatedNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -9178,6 +9211,24 @@ class ThreadAttachmentUpdatedServerNotification(BaseModel): params: ThreadAttachmentUpdatedNotification +class ThreadPredictionUpdatedServerNotification(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + emitted_at_ms: Annotated[ + int | None, + Field( + alias="emittedAtMs", + description="Unix timestamp (in milliseconds) when app-server emitted this notification.", + ), + ] = None + method: Annotated[ + Literal["thread/prediction/updated"], + Field(title="Thread/prediction/updatedNotificationMethod"), + ] + params: ThreadPredictionUpdatedNotification + + class ThreadGoalClearedServerNotification(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -12859,6 +12910,7 @@ class ServerNotification( | ThreadNameUpdatedServerNotification | ThreadAttachmentUpdatedServerNotification | ThreadGoalUpdatedServerNotification + | ThreadPredictionUpdatedServerNotification | ThreadGoalClearedServerNotification | ThreadQueueChangedServerNotification | ProjectChangedServerNotification @@ -12948,6 +13000,7 @@ class ServerNotification( | ThreadNameUpdatedServerNotification | ThreadAttachmentUpdatedServerNotification | ThreadGoalUpdatedServerNotification + | ThreadPredictionUpdatedServerNotification | ThreadGoalClearedServerNotification | ThreadQueueChangedServerNotification | ProjectChangedServerNotification From bcd6d9ab6b9f26f85d76d0c680b3f88b367bffa0 Mon Sep 17 00:00:00 2001 From: "Adam Perry @ OpenAI" Date: Wed, 30 Sep 2026 05:11:38 +0000 Subject: [PATCH 10/11] Add regression coverage for account switches between analytics batches (#49489) ## What changed Add a debug-only analytics test that switches accounts after the first isolated event request. Assert that only the first request reaches the server and carries the original account's credentials, so subsequent batches do not send stale credentials after the switch. Remove an unused `ToolCallSource` import. GitOrigin-RevId: e66904c7a7176f1eaa37662b836132586328884a --- codex-rs/analytics/src/client_tests.rs | 108 ++++++++++++++++++++++++ codex-rs/core/src/tools/registry.rs | 1 - codex-rs/login/src/internal_identity.rs | 1 - 3 files changed, 108 insertions(+), 2 deletions(-) delete mode 100644 codex-rs/login/src/internal_identity.rs diff --git a/codex-rs/analytics/src/client_tests.rs b/codex-rs/analytics/src/client_tests.rs index b4fdf1066b5e..79f8a28697d4 100644 --- a/codex-rs/analytics/src/client_tests.rs +++ b/codex-rs/analytics/src/client_tests.rs @@ -1075,3 +1075,111 @@ fn track_event_request_batches_only_isolates_accepted_line_fingerprint_events() assert!(batches[1][0].should_send_in_isolated_request()); assert!(batches[2][0].should_send_in_isolated_request()); } + +#[cfg(debug_assertions)] +#[tokio::test] +async fn account_switch_between_batches_does_not_send_old_credentials() { + use codex_http_client::DestinationPolicy; + use codex_http_client::NetworkPolicyController; + use codex_login::AuthCredentialsStoreMode as Store; + use tokio::io::AsyncReadExt; + use tokio::io::AsyncWriteExt; + + let home = unique_capture_path("batch-account-switch"); + fs::create_dir_all(&home).unwrap(); + let mut stored: codex_login::AuthDotJson = serde_json::from_value(serde_json::json!({ + "auth_mode": "chatgptAuthTokens", + "tokens": { + "id_token": "e30.e30.sig", + "access_token": "test-access-token-a", + "refresh_token": "", + "account_id": "account-a", + }, + })) + .unwrap(); + stored.last_refresh = Some(SystemTime::now().into()); + codex_login::save_auth(&home, &stored, Store::File, Default::default()).unwrap(); + let controller = NetworkPolicyController::default(); + let policy = controller.policy(); + let manager = Arc::new( + codex_login::AuthManager::new( + home.clone(), + /*enable_codex_api_key_env*/ false, + Store::File, + /*forced_chatgpt_workspace_id*/ None, + /*chatgpt_base_url*/ None, + Default::default(), + codex_login::AuthRouteConfig::from_http_client_factory( + HttpClientFactory::new(OutboundProxyPolicy::ReqwestDefault) + .with_network_policy(policy.clone()), + ), + ) + .await, + ); + assert!(controller.publish(policy.revision(), DestinationPolicy::Unrestricted)); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let destination = AnalyticsEventsDestination::Http { + url: format!("http://{}/events", listener.local_addr().unwrap()), + }; + let requests = Arc::new(Mutex::new(Vec::new())); + let captured = Arc::clone(&requests); + let server_manager = Arc::clone(&manager); + let server_home = home.clone(); + let server = tokio::spawn(async move { + loop { + let (mut stream, _) = listener.accept().await.unwrap(); + let mut request = Vec::new(); + loop { + let mut buffer = [0; 4096]; + let count = stream.read(&mut buffer).await.unwrap(); + assert!(count > 0); + request.extend_from_slice(&buffer[..count]); + if let Some(end) = request.windows(4).position(|part| part == b"\r\n\r\n") { + let headers = String::from_utf8_lossy(&request[..end]).to_lowercase(); + let length: usize = headers + .lines() + .find_map(|line| line.strip_prefix("content-length: ")) + .unwrap() + .parse() + .unwrap(); + if request.len() >= end + 4 + length { + break; + } + } + } + let first = { + let mut requests = captured.lock().unwrap(); + requests.push(String::from_utf8(request).unwrap()); + requests.len() == 1 + }; + if first { + let tokens = stored.tokens.as_mut().unwrap(); + tokens.account_id = Some("account-b".to_string()); + tokens.access_token = "test-access-token-b".to_string(); + codex_login::save_auth(&server_home, &stored, Store::File, Default::default()) + .unwrap(); + server_manager.reload().await; + assert!(controller.publish(policy.revision(), DestinationPolicy::Unrestricted)); + } + let _ = stream + .write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: close\r\n\r\n") + .await; + } + }); + let events = vec![ + sample_accepted_line_fingerprint_event("one"), + sample_accepted_line_fingerprint_event("two"), + ]; + send_track_events(&manager, &destination, events, &ThreadProducts::default()).await; + server.abort(); + let _ = server.await; + let requests = requests.lock().unwrap(); + assert_eq!(requests.len(), 1); + assert!( + requests[0] + .to_lowercase() + .contains("chatgpt-account-id: account-a") + ); + assert!(requests[0].contains("test-access-token-a")); + fs::remove_dir_all(home).unwrap(); +} diff --git a/codex-rs/core/src/tools/registry.rs b/codex-rs/core/src/tools/registry.rs index 7d88650f59d9..9ac7b76ebd05 100644 --- a/codex-rs/core/src/tools/registry.rs +++ b/codex-rs/core/src/tools/registry.rs @@ -13,7 +13,6 @@ use crate::memory_usage::shell_script_for_invocation; use crate::session::session::Session; use crate::session::turn_context::TurnContext; use crate::tools::context::FunctionToolOutput; -use crate::tools::context::ToolCallSource; use crate::tools::context::ToolCallState; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolOutput; diff --git a/codex-rs/login/src/internal_identity.rs b/codex-rs/login/src/internal_identity.rs deleted file mode 100644 index 95ac0cc959fc..000000000000 --- a/codex-rs/login/src/internal_identity.rs +++ /dev/null @@ -1 +0,0 @@ -//! Authentication identity helpers for optional diagnostics. From d42056091aded7feb1d88ac7e83972108b2aa478 Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Wed, 30 Sep 2026 07:05:37 +0000 Subject: [PATCH 11/11] Add a fork shortcut to the TUI command center (#49517) ## What changed - Fork the selected conversation and open the new session with `f`, configurable through `agents.fork` in the TUI keymap. - Move the default search shortcuts to `F3` and `/`, preserving unshadowed defaults when custom bindings conflict. - Keep queued input on the source conversation while attaching and forking, and require closing an open side conversation before forking another task. - Expose the fork action in command-center help and the keymap picker. ## Testing Add regression coverage for queued-input preservation, side-conversation protection, configurable fork shortcuts, metadata editing, disconnected actions, and search fallback bindings. Update help and keymap snapshots. GitOrigin-RevId: b11ae21ef6a2053609b31ce97c646104f18806a3 --- codex-rs/config/src/tui_keymap.rs | 2 + codex-rs/core/config.schema.json | 10 ++ codex-rs/tui/src/app/agent_center/hints.rs | 2 + codex-rs/tui/src/app/agent_center_tests.rs | 30 ++-- codex-rs/tui/src/app/agents_overview.rs | 2 +- .../src/app/agents_overview_actions_tests.rs | 34 +++- codex-rs/tui/src/app/agents_overview_tests.rs | 158 +++++++++++++++++- codex-rs/tui/src/app/agents_overview_view.rs | 8 + codex-rs/tui/src/app/event_dispatch.rs | 53 +++++- codex-rs/tui/src/app/session_lifecycle.rs | 1 + ...mmand_center__live_center_custom_help.snap | 10 +- ...d_center__live_center_help_one_column.snap | 4 +- ...enter__live_center_help_three_columns.snap | 10 +- ..._center__live_center_help_two_columns.snap | 10 +- ..._center_navigation_and_complete_hints.snap | 2 +- ...k_preserves_an_open_side_conversation.snap | 12 ++ .../tui/src/app/tests/disconnect_tests.rs | 10 +- codex-rs/tui/src/app/tests/key_chords.rs | 2 +- codex-rs/tui/src/app_event.rs | 8 + codex-rs/tui/src/chatwidget/input_flow.rs | 1 + codex-rs/tui/src/keymap.rs | 57 ++++--- codex-rs/tui/src/keymap/bindings.rs | 1 + codex-rs/tui/src/keymap/conflict_tests.rs | 16 ++ codex-rs/tui/src/keymap_setup/actions.rs | 2 + ...__tests__keymap_picker_agents_actions.snap | 3 +- ...ap_setup__tests__keymap_picker_custom.snap | 2 +- ...ests__keymap_picker_fast_mode_enabled.snap | 2 +- ...p__tests__keymap_picker_first_actions.snap | 4 +- ...up__tests__keymap_picker_global_chord.snap | 2 +- ...ap_setup__tests__keymap_picker_narrow.snap | 2 +- ...ymap_setup__tests__keymap_picker_wide.snap | 2 +- ...setup__tests__keymap_question_actions.snap | 2 +- 32 files changed, 378 insertions(+), 86 deletions(-) create mode 100644 codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__overview_fork_preserves_an_open_side_conversation.snap diff --git a/codex-rs/config/src/tui_keymap.rs b/codex-rs/config/src/tui_keymap.rs index 674b38770257..d84096785210 100644 --- a/codex-rs/config/src/tui_keymap.rs +++ b/codex-rs/config/src/tui_keymap.rs @@ -449,6 +449,8 @@ pub struct TuiAgentsKeymap { pub new_task: Option, /// Open a new session in a worktree from the project default branch. pub new_worktree: Option, + /// Fork the selected conversation and open the new session. + pub fork: Option, /// Rename the selected task. pub rename: Option, /// Stop the selected running task. diff --git a/codex-rs/core/config.schema.json b/codex-rs/core/config.schema.json index 6aaa39c3f540..bcc4a8ecceb2 100644 --- a/codex-rs/core/config.schema.json +++ b/codex-rs/core/config.schema.json @@ -4435,6 +4435,7 @@ "agents": { "archive": null, "delete": null, + "fork": null, "hide": null, "new_task": null, "new_worktree": null, @@ -4789,6 +4790,14 @@ ], "description": "Permanently delete the selected task and its child agents after confirmation." }, + "fork": { + "allOf": [ + { + "$ref": "#/definitions/KeybindingsSpec" + } + ], + "description": "Fork the selected conversation and open the new session." + }, "hide": { "allOf": [ { @@ -5373,6 +5382,7 @@ "default": { "archive": null, "delete": null, + "fork": null, "hide": null, "new_task": null, "new_worktree": null, diff --git a/codex-rs/tui/src/app/agent_center/hints.rs b/codex-rs/tui/src/app/agent_center/hints.rs index 3a26f5474687..5a4437dab992 100644 --- a/codex-rs/tui/src/app/agent_center/hints.rs +++ b/codex-rs/tui/src/app/agent_center/hints.rs @@ -29,6 +29,7 @@ impl AgentsOverviewView { &self.agents_keymap.search, &self.agents_keymap.new_task, &self.agents_keymap.new_worktree, + &self.agents_keymap.fork, &self.agents_keymap.rename, &self.agents_keymap.stop, &self.agents_keymap.archive, @@ -82,6 +83,7 @@ impl AgentsOverviewView { "New worktree", ), ("resume", &self.agents_keymap.resume, "Resume"), + ("fork", &self.agents_keymap.fork, "Fork"), ("rename", &self.agents_keymap.rename, "Rename"), ("stop", &self.agents_keymap.stop, "Stop"), ("archive", &self.agents_keymap.archive, "Archive"), diff --git a/codex-rs/tui/src/app/agent_center_tests.rs b/codex-rs/tui/src/app/agent_center_tests.rs index 3026c160cc98..67e36e46683c 100644 --- a/codex-rs/tui/src/app/agent_center_tests.rs +++ b/codex-rs/tui/src/app/agent_center_tests.rs @@ -137,7 +137,7 @@ async fn live_center_pages_visible_rows_without_wrapping() { .lock() .unwrap() .connection_notice = Some("Reconnecting…"); - view.handle_key_event(KeyCode::Char('f').into()); + view.handle_key_event(KeyCode::Char('/').into()); view.handle_paste("Paging".into()); } screen(&view, /*width*/ 110, /*height*/ 18); @@ -185,7 +185,7 @@ async fn live_center_metadata_clips_at_grapheme_boundaries() { /*selected_thread_id*/ None, ); let input = format!("{}日本語 e\u{301} 👩\u{200d}💻", "界".repeat(/*n*/ 100_000)); - for (key, label) in [('r', "Rename › "), ('f', "Search › ")] { + for (key, label) in [('r', "Rename › "), ('/', "Search › ")] { view.handle_key_event(KeyCode::Char(key).into()); view.handle_paste(input.clone()); let rendered = screen(&view, /*width*/ 40, /*height*/ 18); @@ -340,7 +340,7 @@ async fn live_center_fixed_shortcuts_yield_to_configured_actions() { let mut app = make_test_app().await; let config: TuiKeymap = toml::from_str("[list]\ncancel = 'q'").unwrap(); app.keymap = RuntimeKeymap::from_config(&config).unwrap(); - for editor_key in ['f', 'r'] { + for editor_key in ['/', 'r'] { let mut view = app.agents_overview_view( vec![overview_thread( ThreadId::from_u128(/*value*/ 42), @@ -411,7 +411,7 @@ async fn live_center_fixed_shortcuts_yield_to_configured_actions() { .lock() .unwrap() .server_version_notice = None; - view.handle_key_event(KeyCode::Char('f').into()); + view.handle_key_event(KeyCode::Char('/').into()); assert!(!screen(&view, /*width*/ 100, /*height*/ 24).contains("enter open")); } view.handle_key_event(key); @@ -479,14 +479,16 @@ async fn live_center_search_row_appears_only_while_editing() { ["Tasks", "Status", "Updated"].map(|label| header[text.find(label).unwrap()].style()); assert_eq!(styles, [styles[0]; 3]); let idle = screen(&view, area.width, area.height); - view.handle_key_event(KeyCode::Char('f').into()); - view.handle_paste("find".into()); - insta::assert_snapshot!( - "live_center_search_active", - screen(&view, area.width, area.height) - ); - view.handle_key_event(KeyCode::Esc.into()); - assert_eq!(screen(&view, area.width, area.height), idle); + for key in [KeyCode::Char('/'), KeyCode::F(3)] { + view.handle_key_event(key.into()); + view.handle_paste("find".into()); + insta::assert_snapshot!( + "live_center_search_active", + screen(&view, area.width, area.height) + ); + view.handle_key_event(KeyCode::Esc.into()); + assert_eq!(screen(&view, area.width, area.height), idle); + } } #[tokio::test] @@ -503,7 +505,7 @@ async fn backspace_edits_search_and_rename_without_deleting_tasks() { )], /*selected_thread_id*/ None, ); - for key in ['f', 'r'] { + for key in ['/', 'r'] { view.handle_key_event(KeyCode::Char(key).into()); let initial = screen(&view, /*width*/ 88, /*height*/ 16); view.handle_paste("!".into()); @@ -583,7 +585,7 @@ async fn live_center_show_more_navigation_search_and_loading() { state.loading = false; state.refresh_failed = true; } - view.handle_key_event(KeyCode::Char('f').into()); + view.handle_key_event(KeyCode::Char('/').into()); view.handle_paste("Older task".into()); insta::assert_snapshot!( "live_center_show_more_search_retry", diff --git a/codex-rs/tui/src/app/agents_overview.rs b/codex-rs/tui/src/app/agents_overview.rs index 6d6f80c9236b..f7639dd86b1c 100644 --- a/codex-rs/tui/src/app/agents_overview.rs +++ b/codex-rs/tui/src/app/agents_overview.rs @@ -862,7 +862,7 @@ impl App { self.chat_widget.maybe_send_next_queued_input(); } } - if !read_only && !is_new_session { + if !read_only && !is_new_session && !self.chat_widget.fork_in_progress { self.maybe_prompt_resume_paused_goal_after_resume(app_server, root_thread_id) .await; } diff --git a/codex-rs/tui/src/app/agents_overview_actions_tests.rs b/codex-rs/tui/src/app/agents_overview_actions_tests.rs index f7269edccce8..c0f4d992c72e 100644 --- a/codex-rs/tui/src/app/agents_overview_actions_tests.rs +++ b/codex-rs/tui/src/app/agents_overview_actions_tests.rs @@ -60,6 +60,7 @@ async fn lifecycle_shortcuts_target_filtered_task_in_any_state() { keymap.agents.archive = Some(KeybindingsSpec::One(KeybindingSpec("f5".into()))); keymap.agents.delete = Some(KeybindingsSpec::One(KeybindingSpec("f6".into()))); keymap.agents.hide = Some(KeybindingsSpec::One(KeybindingSpec("f7".into()))); + keymap.agents.fork = Some(KeybindingsSpec::One(KeybindingSpec("f8".into()))); app.keymap = RuntimeKeymap::from_config(&keymap).unwrap(); let (tx, mut rx) = tokio::sync::mpsc::unbounded_channel(); app.app_event_tx = AppEventSender::new(tx); @@ -84,7 +85,7 @@ async fn lifecycle_shortcuts_target_filtered_task_in_any_state() { Some(target), ); view.handle_key_event(KeyCode::Esc.into()); - view.handle_key_event(KeyEvent::new(KeyCode::Char('f'), KeyModifiers::NONE)); + view.handle_key_event(KeyEvent::new(KeyCode::Char('/'), KeyModifiers::NONE)); for character in "Target".chars() { view.handle_key_event(KeyCode::Char(character).into()); } @@ -99,6 +100,10 @@ async fn lifecycle_shortcuts_target_filtered_task_in_any_state() { "unexpected event: {event:?}" ); } + view.handle_key_event(KeyCode::F(8).into()); + assert!( + matches!(rx.try_recv(), Ok(AppEvent::ForkAgentsOverviewThread { thread_id }) if thread_id == target) + ); view.handle_key_event(KeyCode::F(7).into()); assert!( matches!(rx.try_recv(), Ok(AppEvent::HideAgentsOverviewThread { thread_id }) if thread_id == target) @@ -163,7 +168,7 @@ async fn hiding_tasks_keeps_selection_adjacent_in_display_order() -> Result<()> // Clear retained search without dismissing the command center. view.on_ctrl_c(); if filtered { - view.handle_key_event(KeyCode::Char('f').into()); + view.handle_key_event(KeyCode::Char('/').into()); view.handle_paste("Task".into()); // Search selects the first match; move back to Task 3. view.handle_key_event(KeyCode::Down.into()); @@ -753,3 +758,28 @@ async fn lifecycle_removes_background_and_current_tasks_without_losing_the_dashb } Ok(()) } + +#[tokio::test] +async fn fork_shortcut_respects_metadata_editing() { + let (app, mut rx, _) = crate::app::tests::make_test_app_with_channels().await; + let target = ThreadId::new(); + let mut view = app.agents_overview_view( + vec![overview_thread( + target, + /*parent_thread_id*/ None, + "Target", + ThreadStatus::Idle, + )], + Some(target), + ); + for editor in ['r', '/'] { + view.handle_key_event(KeyCode::Char(editor).into()); + view.handle_key_event(KeyCode::Char('f').into()); + assert!(rx.try_recv().is_err()); + view.handle_key_event(KeyCode::Esc.into()); + } + view.handle_key_event(KeyCode::Char('f').into()); + assert!( + matches!(rx.try_recv(), Ok(AppEvent::ForkAgentsOverviewThread { thread_id }) if thread_id == target) + ); +} diff --git a/codex-rs/tui/src/app/agents_overview_tests.rs b/codex-rs/tui/src/app/agents_overview_tests.rs index c4b6bd350263..125a1366c2bf 100644 --- a/codex-rs/tui/src/app/agents_overview_tests.rs +++ b/codex-rs/tui/src/app/agents_overview_tests.rs @@ -6,6 +6,7 @@ mod command_center; use super::super::agents_overview_view::AgentsOverviewGrouping; use super::*; +use crate::app::tests::make_test_app_with_channels; use crate::chatwidget::tests::helpers::normalize_agent_center_snapshot; #[tokio::test] @@ -1263,7 +1264,7 @@ async fn shared_overview_shows_only_root_sessions() { state.lock().unwrap().grouping, AgentsOverviewGrouping::Project ); - action_view.handle_key_event(KeyCode::Char('f').into()); + action_view.handle_key_event(KeyCode::Char('/').into()); assert!(action_view.handle_paste("Repair authentication".into())); action_view.handle_key_event(KeyCode::Enter.into()); assert!( @@ -2088,7 +2089,7 @@ async fn cancelling_resume_picker_preserves_command_center_state() -> Result<()> app.chat_widget.show_bottom_pane_view(Box::new(view)); for key in [ KeyEvent::new(KeyCode::Char('g'), KeyModifiers::NONE), - KeyEvent::new(KeyCode::Char('f'), KeyModifiers::NONE), + KeyEvent::new(KeyCode::Char('/'), KeyModifiers::NONE), KeyEvent::new(KeyCode::Char('S'), KeyModifiers::NONE), KeyCode::Esc.into(), ] { @@ -2139,7 +2140,7 @@ async fn command_center_cursor_tracks_fixed_footer() { )], /*selected_thread_id*/ None, ); - for (key, label) in [('f', "Search ›"), ('r', "Rename ›")] { + for (key, label) in [('/', "Search ›"), ('r', "Rename ›")] { view.handle_key_event(KeyCode::Esc.into()); view.handle_key_event(KeyEvent::new(KeyCode::Char(key), KeyModifiers::NONE)); for width in [48, 96, 120] { @@ -2620,7 +2621,7 @@ async fn command_center_refresh_failure_is_inline_and_clears_on_success() -> Res let mut app = make_test_app().await; let server = Box::pin(crate::start_embedded_app_server_for_picker(&app.config)).await?; let mut view = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); - view.handle_key_event(KeyCode::Char('f').into()); + view.handle_key_event(KeyCode::Char('/').into()); view.handle_paste("Keep searching".into()); app.chat_widget.show_bottom_pane_view(Box::new(view)); let before = render_bottom_popup(&app.chat_widget, /*width*/ 48); @@ -2720,6 +2721,155 @@ async fn command_center_action_failures_remain_visible() -> Result<()> { #[path = "agents_overview_actions_tests.rs"] mod actions; +#[tokio::test] +async fn overview_fork_preserves_an_open_side_conversation() -> Result<()> { + let mut app = Box::pin(make_test_app()).await; + let side = ThreadId::new(); + app.active_thread_id = Some(side); + app.side_threads.insert( + side, + super::super::side::SideThreadState::new(ThreadId::new()), + ); + let view = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); + app.chat_widget.show_bottom_pane_view(Box::new(view)); + let mut tui = crate::tui::test_support::make_test_tui()?; + let mut server = Box::pin(crate::start_embedded_app_server_for_picker(&app.config)).await?; + let RequestId::Integer(request) = server.next_request_id() else { + panic!("integer request ID") + }; + Box::pin(app.handle_event( + &mut tui, + &mut server, + AppEvent::ForkAgentsOverviewThread { + thread_id: ThreadId::new(), + }, + )) + .await?; + assert_eq!(app.current_displayed_thread_id(), Some(side)); + assert!(app.side_threads.contains_key(&side)); + assert!(!app.chat_widget.fork_in_progress); + assert_eq!(server.next_request_id(), RequestId::Integer(request + 1)); + insta::assert_snapshot!(render_bottom_popup(&app.chat_widget, /*width*/ 80)); + server.shutdown().await?; + Ok(()) +} + +#[tokio::test] +async fn overview_fork_keeps_idle_source_input_queued() -> Result<()> { + for cached_primary in [false, true] { + let (app, mut events, _) = make_test_app_with_channels().await; + let mut app = Box::pin(app); + trust_fixture_folders(&mut app); + std::fs::write( + app.config.codex_home.join("config.toml"), + "[tui]\nresume_cwd = \"session\"\n", + )?; + let source = ThreadId::from_string( + &app_test_support::create_fake_rollout( + app.config.codex_home.as_path(), + "2025-01-05T12-00-00", + "2025-01-05T12:00:00Z", + "Source task", + Some(&app.config.model_provider_id), + /*git_info*/ None, + ) + .expect("saved rollout"), + )?; + let mut tui = crate::tui::test_support::make_test_tui()?; + let mut server = Box::pin(crate::start_embedded_app_server_for_picker(&app.config)).await?; + if cached_primary { + Box::pin(app.select_agents_overview_thread(&mut tui, &mut server, source)).await?; + assert_eq!(app.current_displayed_thread_id(), Some(source)); + app.store_active_thread_receiver().await; + } + app.chat_widget + .set_queue_autosend_suppressed(/*suppressed*/ true); + app.chat_widget.queue_user_message_with_options( + "Keep this on the source".into(), + crate::bottom_pane::QueuedInputAction::Plain, + Vec::new(), + ); + let input = app.chat_widget.capture_thread_input_state().unwrap(); + app.agents_overview + .input_states + .insert(source, input.clone()); + if cached_primary { + app.ensure_thread_channel(source) + .store + .lock() + .await + .input_state = Some(input); + let child = ThreadId::new(); + app.active_thread_id = Some(child); + let mut session = app + .ensure_thread_channel(source) + .store + .lock() + .await + .session + .clone() + .unwrap(); + session.thread_id = child; + app.chat_widget.handle_thread_session(session); + } + while events.try_recv().is_ok() {} + Box::pin(app.handle_event( + &mut tui, + &mut server, + AppEvent::ForkAgentsOverviewThread { thread_id: source }, + )) + .await?; + assert_eq!( + app.current_displayed_thread_id(), + Some(source), + "{}", + render_bottom_popup(&app.chat_widget, /*width*/ 96) + ); + assert_eq!( + app.chat_widget.queued_user_message_texts(), + vec!["Keep this on the source"] + ); + let retained = app.agents_overview.input_states[&source].clone(); + let mut ready = None; + while let Ok(event) = events.try_recv() { + assert!(!matches!( + event, + AppEvent::CodexOp(AppCommand::UserTurn { .. }) + )); + if matches!(event, AppEvent::ForkAgentsOverviewThreadReady { .. }) { + ready = Some(event); + } + } + // Failed reattachment can leave the source displayed as a saved replay. + app.app_server_target = AppServerTarget::LocalDaemon { + allow_embedded_fallback: true, + endpoint: crate::resolve_remote_addr("ws://127.0.0.1:4500")?, + }; + app.ensure_thread_channel(source).mark_replay_only(); + let RequestId::Integer(request) = server.next_request_id() else { + panic!("integer request ID") + }; + Box::pin(app.handle_event( + &mut tui, + &mut server, + AppEvent::ForkAgentsOverviewThreadReady { thread_id: source }, + )) + .await?; + assert_eq!(app.current_displayed_thread_id(), Some(source)); + assert_eq!(server.next_request_id(), RequestId::Integer(request + 1)); + assert!(!app.chat_widget.fork_in_progress); + app.app_server_target = AppServerTarget::Embedded; + Box::pin(app.handle_event(&mut tui, &mut server, ready.expect("fork continuation"))) + .await?; + assert_ne!(app.current_displayed_thread_id(), Some(source)); + assert_eq!(app.agents_overview.input_states[&source], retained); + assert!(app.chat_widget.queued_user_message_texts().is_empty()); + assert!(!app.chat_widget.fork_in_progress); + server.shutdown().await?; + } + Ok(()) +} + fn trust_fixture_folders(app: &mut App) { let projects = serde_json::json!({ test_path_buf("/").display().to_string(): {"trust_level": "trusted"}, diff --git a/codex-rs/tui/src/app/agents_overview_view.rs b/codex-rs/tui/src/app/agents_overview_view.rs index 27ca540c3fb2..e3693176e1a8 100644 --- a/codex-rs/tui/src/app/agents_overview_view.rs +++ b/codex-rs/tui/src/app/agents_overview_view.rs @@ -600,6 +600,14 @@ impl BottomPaneView for AgentsOverviewView { } return; } + if self.agents_keymap.fork.is_pressed(key) { + if let Some(row) = self.selected_row() { + self.app_event_tx.send(AppEvent::ForkAgentsOverviewThread { + thread_id: row.thread_id, + }); + } + return; + } if self.agents_keymap.rename.is_pressed(key) { if let Some(row) = self.selected_row() { let mut state = self.state(); diff --git a/codex-rs/tui/src/app/event_dispatch.rs b/codex-rs/tui/src/app/event_dispatch.rs index 01c9626029b6..38669630645f 100644 --- a/codex-rs/tui/src/app/event_dispatch.rs +++ b/codex-rs/tui/src/app/event_dispatch.rs @@ -31,6 +31,19 @@ impl App { app_server: &mut AppServerSession, event: AppEvent, ) -> Result { + let from_agents_overview = matches!(event, AppEvent::ForkAgentsOverviewThreadReady { .. }); + let event = if let AppEvent::ForkAgentsOverviewThreadReady { thread_id } = event { + if self.current_displayed_thread_id() != Some(thread_id) + || (self.thread_unavailable(thread_id) + && !self.chat_widget.is_external_writer_view()) + { + self.chat_widget.fork_in_progress = false; + return Ok(AppRunControl::Continue); + } + AppEvent::ForkCurrentSession { name: None } + } else { + event + }; // Release the shortcut's input guard even when a fork is rejected below. if matches!(event, AppEvent::ForkCurrentSession { .. }) { self.chat_widget.fork_in_progress = false; @@ -496,7 +509,9 @@ impl App { } AppEvent::ForkCurrentSession { name } => { let from_locked_thread = self.chat_widget.is_external_writer_view(); - let source = if from_locked_thread { + let source = if from_agents_overview { + "agents_overview_shortcut" + } else if from_locked_thread { "locked_thread_shortcut" } else { "slash_command" @@ -600,8 +615,8 @@ impl App { )); } } - if from_locked_thread { - // Repeated locked-view shortcuts must not act on the resulting view. + if from_locked_thread || from_agents_overview { + // Repeated fork shortcuts must not act on the resulting view. if let Err(err) = tui.discard_pending_input_before_interactive_screen() { tracing::warn!(%err, "failed to discard input after forking"); } @@ -615,7 +630,9 @@ impl App { } self.chat_widget.fork_in_progress = false; - self.chat_widget.maybe_send_next_queued_input(); + if !from_agents_overview { + self.chat_widget.maybe_send_next_queued_input(); + } tui.frame_requester().schedule_frame(); } AppEvent::RevertSessionForPromptEdit { @@ -2709,6 +2726,34 @@ impl App { AppRunControl::Exit(reason) => return Ok(AppRunControl::Exit(reason)), } } + AppEvent::ForkAgentsOverviewThread { thread_id } => { + if self.reconnect.offline { + return Ok(AppRunControl::Continue); + } + if !self.side_threads.is_empty() + && self.current_displayed_thread_id() != Some(thread_id) + { + self.add_agents_overview_error( + "Close the side conversation before forking another task.".into(), + ); + return Ok(AppRunControl::Continue); + } + // Attachment replay must not submit queued input on the source task. + self.chat_widget.fork_in_progress = true; + let control = self.select_agents_overview_thread(tui, app_server, thread_id).await; + if matches!(&control, Ok(AppRunControl::Continue)) + && self.current_displayed_thread_id() == Some(thread_id) + { + if let Some(input) = self.chat_widget.capture_thread_input_state() { + self.agents_overview.input_states.insert(thread_id, input); + } + self.app_event_tx.send(AppEvent::ForkAgentsOverviewThreadReady { thread_id }); + } else { + self.chat_widget.fork_in_progress = false; + } + return control; + } + AppEvent::ForkAgentsOverviewThreadReady { .. } => unreachable!("normalized above"), AppEvent::NewAgentsOverviewWorktree { cwd } => { Box::pin(self.new_agents_overview_worktree(tui, app_server, cwd)).await; } diff --git a/codex-rs/tui/src/app/session_lifecycle.rs b/codex-rs/tui/src/app/session_lifecycle.rs index 1516cba09856..9cc9a84a0fbd 100644 --- a/codex-rs/tui/src/app/session_lifecycle.rs +++ b/codex-rs/tui/src/app/session_lifecycle.rs @@ -490,6 +490,7 @@ impl App { /// This helper copies every known nickname/role from `AgentNavigationState` into the /// replacement widget so that replayed collab items render agent names immediately. pub(super) fn replace_chat_widget(&mut self, mut chat_widget: ChatWidget) { + chat_widget.fork_in_progress = self.chat_widget.fork_in_progress; self.pending_right_click_paste = None; if !self.chat_widget.realtime_conversation_is_running() { self.retain_realtime_replay_state_before_replace(); diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap index c7c1e2b87ed1..6792b3390b9b 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap @@ -9,10 +9,11 @@ expression: "screen(&view, 100, 24)" Navigate Tasks View k Up n New tab/shift+tab Filter - j Down o Resume f Search - enter Open z r Rename g Group - pgdn Page down x Stop - ctrl+c Quit h Hide + j Down o Resume f3 Search + enter Open f Fork g Group + pgdn Page down z r Rename + ctrl+c Quit x Stop + h Hide backspace Delete @@ -24,5 +25,4 @@ expression: "screen(&view, 100, 24)" - esc back diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap index 992eaa37b877..b77c12819ba6 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap @@ -19,6 +19,7 @@ expression: "screen(&view, width, height)" n New w New worktree o Resume + f Fork r Rename x Stop a Archive @@ -27,10 +28,9 @@ expression: "screen(&view, width, height)" View tab/shift+tab Filter - f Search + f3 Search g Group - esc back diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap index 0e3d195eccaa..7a120b8f04c2 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap @@ -9,11 +9,12 @@ expression: "screen(&view, width, height)" Navigate Tasks View ↑ Up n New tab/shift+tab Filter - ↓ Down w New worktree f Search + ↓ Down w New worktree f3 Search enter Open o Resume g Group - pgup Page up r Rename - pgdn Page down x Stop - ctrl+c Quit a Archive + pgup Page up f Fork + pgdn Page down r Rename + ctrl+c Quit x Stop + a Archive h Hide backspace Delete @@ -24,5 +25,4 @@ expression: "screen(&view, width, height)" - esc back diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap index 293f549dbc4d..b74828772379 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap @@ -11,18 +11,18 @@ expression: "screen(&view, width, height)" ↑ Up n New ↓ Down w New worktree enter Open o Resume - pgup Page up r Rename - pgdn Page down x Stop - ctrl+c Quit a Archive + pgup Page up f Fork + pgdn Page down r Rename + ctrl+c Quit x Stop + a Archive h Hide backspace Delete View tab/shift+tab Filter - f Search + f3 Search g Group - esc back diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap index bf6297ac4514..a51731cbb79b 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap @@ -19,10 +19,10 @@ expression: "screen(&view, width, height)" n New w New worktree o Resume + f Fork r Rename x Stop a Archive h Hide - backspace Delete … resize to see all esc back diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__overview_fork_preserves_an_open_side_conversation.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__overview_fork_preserves_an_open_side_conversation.snap new file mode 100644 index 000000000000..c2af2c82bdf4 --- /dev/null +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__overview_fork_preserves_an_open_side_conversation.snap @@ -0,0 +1,12 @@ +--- +source: tui/src/app/agents_overview_tests.rs +assertion_line: 2740 +expression: "render_bottom_popup(&app.chat_widget, 80)" +--- + Unable to complete action + Close the side conversation before forking another task. + + +› 1. Return to command center + + enter select · esc back diff --git a/codex-rs/tui/src/app/tests/disconnect_tests.rs b/codex-rs/tui/src/app/tests/disconnect_tests.rs index b7150740b255..2cdaea45e399 100644 --- a/codex-rs/tui/src/app/tests/disconnect_tests.rs +++ b/codex-rs/tui/src/app/tests/disconnect_tests.rs @@ -201,12 +201,8 @@ async fn disconnected_command_center_keeps_input_and_blocks_actions() -> Result< let view = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); app.chat_widget.show_bottom_pane_view(Box::new(view)); let mut tui = crate::tui::test_support::make_test_tui()?; - app.handle_tui_event( - &mut tui, - &mut session, - TuiEvent::Key(KeyEvent::new(KeyCode::Char('f'), KeyModifiers::NONE)), - ) - .await?; + app.handle_tui_event(&mut tui, &mut session, TuiEvent::Key(KeyCode::F(3).into())) + .await?; app.handle_tui_event( &mut tui, &mut session, @@ -224,6 +220,7 @@ async fn disconnected_command_center_keeps_input_and_blocks_actions() -> Result< KeyEvent::new(KeyCode::Char('n'), KeyModifiers::NONE), KeyEvent::new(KeyCode::Char('w'), KeyModifiers::NONE), KeyEvent::new(KeyCode::Char('o'), KeyModifiers::NONE), + KeyEvent::new(KeyCode::Char('f'), KeyModifiers::NONE), ] { app.handle_tui_event(&mut tui, &mut session, TuiEvent::Key(key)) .await?; @@ -240,6 +237,7 @@ async fn disconnected_command_center_keeps_input_and_blocks_actions() -> Result< AppEvent::NewAgentsOverviewSession { .. } | AppEvent::NewAgentsOverviewWorktree { .. } | AppEvent::OpenResumePicker + | AppEvent::ForkAgentsOverviewThread { .. } )) ); assert!(app.chat_widget.has_active_view()); diff --git a/codex-rs/tui/src/app/tests/key_chords.rs b/codex-rs/tui/src/app/tests/key_chords.rs index 2143be940162..95fcee0a52de 100644 --- a/codex-rs/tui/src/app/tests/key_chords.rs +++ b/codex-rs/tui/src/app/tests/key_chords.rs @@ -713,7 +713,7 @@ async fn command_center_chords_do_not_capture_search_text() -> Result<()> { let mut tui = crate::tui::test_support::make_test_tui()?; let view = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); app.chat_widget.show_bottom_pane_view(Box::new(view)); - app.chat_widget.handle_key_event(KeyCode::Char('f').into()); + app.chat_widget.handle_key_event(KeyCode::Char('/').into()); for key in "new".chars() { let event = KeyCode::Char(key).into(); assert_eq!(app.route_key_chord_event(&mut tui, event), Some(event)); diff --git a/codex-rs/tui/src/app_event.rs b/codex-rs/tui/src/app_event.rs index dfedc7973384..c77c55841d79 100644 --- a/codex-rs/tui/src/app_event.rs +++ b/codex-rs/tui/src/app_event.rs @@ -306,6 +306,14 @@ pub(crate) enum AppEvent { cwd: Option, }, AgentsOverviewWorktreeCreated(Result), + /// Fork the selected dashboard conversation and open the new session. + ForkAgentsOverviewThread { + thread_id: ThreadId, + }, + /// Run the existing fork action after selection events have been processed. + ForkAgentsOverviewThreadReady { + thread_id: ThreadId, + }, /// Rename a task directly from the shared dashboard. RenameAgentsOverviewThread { thread_id: ThreadId, diff --git a/codex-rs/tui/src/chatwidget/input_flow.rs b/codex-rs/tui/src/chatwidget/input_flow.rs index b4d45daf13d4..7b841baf6479 100644 --- a/codex-rs/tui/src/chatwidget/input_flow.rs +++ b/codex-rs/tui/src/chatwidget/input_flow.rs @@ -235,6 +235,7 @@ impl ChatWidget { /// If idle and there are queued inputs, submit exactly one to start the next turn. pub(crate) fn maybe_send_next_queued_input(&mut self) -> bool { if !self.is_session_configured() + || self.fork_in_progress || self.has_misalignment_policy_violation() || self.input_queue.suppress_queue_autosend || self.input_queue.rate_limit_recovery_pending diff --git a/codex-rs/tui/src/keymap.rs b/codex-rs/tui/src/keymap.rs index 2ff06d2296dd..3628773dd5ed 100644 --- a/codex-rs/tui/src/keymap.rs +++ b/codex-rs/tui/src/keymap.rs @@ -425,6 +425,7 @@ pub(crate) struct AgentsKeymap { pub(crate) search: Vec, pub(crate) new_task: Vec, pub(crate) new_worktree: Vec, + pub(crate) fork: Vec, pub(crate) rename: Vec, pub(crate) stop: Vec, pub(crate) archive: Vec, @@ -1353,6 +1354,7 @@ impl RuntimeKeymap { search: resolve_local!(keymap, defaults, agents, search), new_task: resolve_local!(keymap, defaults, agents, new_task), new_worktree: resolve_local!(keymap, defaults, agents, new_worktree), + fork: resolve_local!(keymap, defaults, agents, fork), rename: resolve_local!(keymap, defaults, agents, rename), stop: resolve_local!(keymap, defaults, agents, stop), archive: resolve_local!(keymap, defaults, agents, archive), @@ -1363,40 +1365,35 @@ impl RuntimeKeymap { }; // New defaults yield to explicit bindings, including existing list shortcuts. - for (configured, bindings, alias) in [ - (keymap.agents.resume.as_ref(), &mut agents.resume, "o"), - (keymap.agents.search.as_ref(), &mut agents.search, "f"), - (keymap.agents.new_task.as_ref(), &mut agents.new_task, "n"), + for (configured, bindings) in [ + (keymap.agents.resume.as_ref(), &mut agents.resume), + (keymap.agents.search.as_ref(), &mut agents.search), + (keymap.agents.new_task.as_ref(), &mut agents.new_task), ( keymap.agents.new_worktree.as_ref(), &mut agents.new_worktree, - "w", - ), - (keymap.agents.rename.as_ref(), &mut agents.rename, "r"), - (keymap.agents.stop.as_ref(), &mut agents.stop, "x"), - (keymap.agents.archive.as_ref(), &mut agents.archive, "a"), - ( - keymap.agents.delete.as_ref(), - &mut agents.delete, - "backspace", ), - (keymap.agents.hide.as_ref(), &mut agents.hide, "h"), + (keymap.agents.fork.as_ref(), &mut agents.fork), + (keymap.agents.rename.as_ref(), &mut agents.rename), + (keymap.agents.stop.as_ref(), &mut agents.stop), + (keymap.agents.archive.as_ref(), &mut agents.archive), + (keymap.agents.delete.as_ref(), &mut agents.delete), + (keymap.agents.hide.as_ref(), &mut agents.hide), ( keymap.agents.toggle_grouping.as_ref(), &mut agents.toggle_grouping, - "g", ), ] { - if configured.is_none() - && (configured_context_alias_is_used(&keymap.agents, alias) - || configured_context_alias_is_used(&keymap.list, alias) - || configured_context_alias_is_used(&keymap.global, alias) - || chords.bindings.iter().any(|chord| { - chord.action.context.overlaps(KeymapContext::Agents) - && bindings.contains(&chord.chord.prefix) - })) - { - bindings.clear(); + if configured.is_none() { + bindings.retain(|binding| { + !configured_context_binding_is_used(&keymap.agents, *binding) + && !configured_context_binding_is_used(&keymap.list, *binding) + && !configured_context_binding_is_used(&keymap.global, *binding) + && !chords.bindings.iter().any(|chord| { + chord.action.context.overlaps(KeymapContext::Agents) + && chord.chord.prefix == *binding + }) + }); } } @@ -1542,6 +1539,7 @@ impl RuntimeKeymap { keymap.agents.new_worktree.as_ref(), &mut agents.new_worktree, ), + (keymap.agents.fork.as_ref(), &mut agents.fork), (keymap.agents.rename.as_ref(), &mut agents.rename), (keymap.agents.stop.as_ref(), &mut agents.stop), (keymap.agents.archive.as_ref(), &mut agents.archive), @@ -1912,9 +1910,10 @@ impl RuntimeKeymap { }, agents: AgentsKeymap { resume: default_bindings![plain(KeyCode::Char('o'))], - search: default_bindings![plain(KeyCode::Char('f'))], + search: default_bindings![plain(KeyCode::F(3)), plain(KeyCode::Char('/'))], new_task: default_bindings![plain(KeyCode::Char('n'))], new_worktree: default_bindings![plain(KeyCode::Char('w'))], + fork: default_bindings![plain(KeyCode::Char('f'))], rename: default_bindings![plain(KeyCode::Char('r'))], stop: default_bindings![plain(KeyCode::Char('x'))], archive: default_bindings![plain(KeyCode::Char('a'))], @@ -2312,7 +2311,11 @@ impl RuntimeKeymap { "agents", context_bindings(KeymapContext::Agents), MAIN_RESERVED_BINDINGS, - [], + [( + "search", + "fixed.slash_command", + key_hint::plain(KeyCode::Char('/')), + )], )?; for (action, bindings) in context_bindings(KeymapContext::Agents) { #[cfg(unix)] diff --git a/codex-rs/tui/src/keymap/bindings.rs b/codex-rs/tui/src/keymap/bindings.rs index 3f521a4c3dec..0613f0d1fa84 100644 --- a/codex-rs/tui/src/keymap/bindings.rs +++ b/codex-rs/tui/src/keymap/bindings.rs @@ -422,6 +422,7 @@ define_runtime_action_bindings! { search, new_task, new_worktree, + fork, rename, stop, archive, diff --git a/codex-rs/tui/src/keymap/conflict_tests.rs b/codex-rs/tui/src/keymap/conflict_tests.rs index 583e99e4be32..c927337523ad 100644 --- a/codex-rs/tui/src/keymap/conflict_tests.rs +++ b/codex-rs/tui/src/keymap/conflict_tests.rs @@ -45,9 +45,11 @@ fn new_agents_defaults_preserve_existing_custom_bindings() { ("delete", "backspace"), ("hide", "h"), ("new_worktree", "w"), + ("fork", "f"), ] { for (context, existing, suffix) in [ ("agents", "stop", ""), + ("agents", "search", ""), ("list", "move_down", ""), ("global", "copy", ""), ("agents", "stop", " f12"), @@ -74,6 +76,7 @@ fn new_agents_defaults_preserve_existing_custom_bindings() { "delete" => &runtime.agents.delete, "hide" => &runtime.agents.hide, "new_worktree" => &runtime.agents.new_worktree, + "fork" => &runtime.agents.fork, _ => unreachable!(), }; assert!( @@ -150,3 +153,16 @@ fn warnings_defaults_preserve_custom_keys_and_chord_prefixes() { assert!(runtime.app.open_warnings.is_empty()); } } + +#[test] +fn agents_search_keeps_unshadowed_fallbacks() { + use crate::key_hint; + use crossterm::event::KeyCode; + + for (configured, remaining) in [("/", KeyCode::F(3)), ("f3", KeyCode::Char('/'))] { + let keymap: TuiKeymap = + serde_json::from_value(json!({"list": {"move_up": configured}})).unwrap(); + let runtime = RuntimeKeymap::from_config(&keymap).unwrap(); + assert_eq!(runtime.agents.search, vec![key_hint::plain(remaining)]); + } +} diff --git a/codex-rs/tui/src/keymap_setup/actions.rs b/codex-rs/tui/src/keymap_setup/actions.rs index 6359ecac8aad..46ec0ac847a7 100644 --- a/codex-rs/tui/src/keymap_setup/actions.rs +++ b/codex-rs/tui/src/keymap_setup/actions.rs @@ -223,6 +223,7 @@ pub(super) const KEYMAP_ACTIONS: &[KeymapActionDescriptor] = &[ action("agents", "Agents", "search", "Search the available agent tasks."), action("agents", "Agents", "new_task", "Open a new session in the selected checkout."), action("agents", "Agents", "new_worktree", "Open a new session in a worktree from the project default branch."), + action("agents", "Agents", "fork", "Fork the selected conversation and open the new session."), action("agents", "Agents", "rename", "Rename the selected task."), action("agents", "Agents", "stop", "Stop the selected running task."), action("agents", "Agents", "archive", "Archive the selected task and its child agents."), @@ -408,6 +409,7 @@ pub(super) fn binding_slot<'a>( ("agents", "search") => Some(&mut keymap.agents.search), ("agents", "new_task") => Some(&mut keymap.agents.new_task), ("agents", "new_worktree") => Some(&mut keymap.agents.new_worktree), + ("agents", "fork") => Some(&mut keymap.agents.fork), ("agents", "rename") => Some(&mut keymap.agents.rename), ("agents", "stop") => Some(&mut keymap.agents.stop), ("agents", "archive") => Some(&mut keymap.agents.archive), diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_agents_actions.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_agents_actions.snap index ea2df0d0ccba..eb1c30444b4d 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_agents_actions.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_agents_actions.snap @@ -3,9 +3,10 @@ source: tui/src/keymap_setup.rs expression: agents --- Resume | o | Agents resume Resume Open the session resume picker. o Default -Search | f | Agents search Search Search the available agent tasks. f Default +Search | f3, / | Agents search Search Search the available agent tasks. f3, / Default New Task | n | Agents new_task New Task Open a new session in the selected checkout. n Default New Worktree | w | Agents new_worktree New Worktree Open a new session in a worktree from the project default branch. w Default +Fork | f | Agents fork Fork Fork the selected conversation and open the new session. f Default Rename | r | Agents rename Rename Rename the selected task. r Default Stop | x | Agents stop Stop Stop the selected running task. x Default Archive | a | Agents archive Archive Archive the selected task and its child agents. a Default diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_custom.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_custom.snap index 07cd8e07f13c..0e761ed368eb 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_custom.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_custom.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 120)" Keymap All configurable shortcuts. - 150 actions, 1 customized, 5 unbound. + 151 actions, 1 customized, 5 unbound. All Common Customized (1) Unbound (5) App Composer Editor Vim Navigation Agents Approval › diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_fast_mode_enabled.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_fast_mode_enabled.snap index 9ed6743cbd9b..ba5ba367003f 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_fast_mode_enabled.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_fast_mode_enabled.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 120)" Keymap All configurable shortcuts. - 151 actions, 0 customized, 6 unbound. + 152 actions, 0 customized, 6 unbound. All Common Customized (0) Unbound (6) App Composer Editor Vim Navigation Agents Approval › diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_first_actions.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_first_actions.snap index 9b9e267b4b46..19f0e027b3fd 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_first_actions.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_first_actions.snap @@ -2,7 +2,7 @@ source: tui/src/keymap_setup.rs expression: snapshot --- -tab: All (150 selectable) +tab: All (151 selectable) tab: Common (20 selectable) tab: Customized (0) (0 selectable) tab: Unbound (5) (5 selectable) @@ -11,7 +11,7 @@ tab: Composer (5 selectable) tab: Editor (17 selectable) tab: Vim (69 selectable) tab: Navigation (21 selectable) -tab: Agents (10 selectable) +tab: Agents (11 selectable) tab: Approval (8 selectable) tab: Debug (1 selectable) Open Agents | unbound | Global open_agents Open Agents Open the shared agent-session overview. unbound Default diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_global_chord.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_global_chord.snap index e5e27f4066e4..cc3222de83c4 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_global_chord.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_global_chord.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 120)" Keymap All configurable shortcuts. - 150 actions, 1 customized, 6 unbound. + 151 actions, 1 customized, 6 unbound. All Common Customized (1) Unbound (6) App Composer Editor Vim Navigation Agents Approval › diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_narrow.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_narrow.snap index 32f1127699e4..953b11dfffba 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_narrow.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_narrow.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 78)" Keymap All configurable shortcuts. - 150 actions, 0 customized, 5 unbound. + 151 actions, 0 customized, 5 unbound. All Common Customized (0) Unbound (5) App Composer Editor › diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_wide.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_wide.snap index a3ecd774194c..2296ebc6185b 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_wide.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_wide.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 120)" Keymap All configurable shortcuts. - 150 actions, 0 customized, 5 unbound. + 151 actions, 0 customized, 5 unbound. All Common Customized (0) Unbound (5) App Composer Editor Vim Navigation Agents Approval › diff --git a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_question_actions.snap b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_question_actions.snap index 459e314dc20f..3785b7bf0f06 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_question_actions.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_question_actions.snap @@ -5,7 +5,7 @@ expression: "render_picker(params, 120)" Keymap All configurable shortcuts. - 150 actions, 0 customized, 5 unbound. + 151 actions, 0 customized, 5 unbound. All Common Customized (0) Unbound (5) App Composer Editor Vim Navigation Agents Approval ›