From 0dbda0e71ba518032115def28f7e23044f6452f1 Mon Sep 17 00:00:00 2001 From: Michael Fan Date: Wed, 25 Mar 2026 12:33:25 -0400 Subject: [PATCH] codex: reorganize api provision modules Move the TUI slash command into the chatwidget module and rename the login helper module to match API provisioning behavior. Co-authored-by: Codex --- ...board_oauth_helper.rs => api_provision.rs} | 4 ++-- ...helper_tests.rs => api_provision_tests.rs} | 0 .../bin/get_sensitive_id_via_codex_oauth.rs | 2 +- codex-rs/login/src/lib.rs | 16 +++++++------ codex-rs/tui/src/chatwidget.rs | 18 ++------------- .../tui/src/{ => chatwidget}/api_provision.rs | 23 ++++++++++++++++++- ...continue_in_browser_message_snapshot.snap} | 2 +- ...vision__tests__success_cell_snapshot.snap} | 3 +-- ..._snapshot_when_live_apply_is_skipped.snap} | 3 +-- codex-rs/tui/src/lib.rs | 1 - 10 files changed, 39 insertions(+), 33 deletions(-) rename codex-rs/login/src/{onboard_oauth_helper.rs => api_provision.rs} (99%) rename codex-rs/login/src/{onboard_oauth_helper_tests.rs => api_provision_tests.rs} (100%) rename codex-rs/tui/src/{ => chatwidget}/api_provision.rs (94%) rename codex-rs/tui/src/{snapshots/codex_tui__api_provision__tests__continue_in_browser_message_snapshot.snap => chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__continue_in_browser_message_snapshot.snap} (91%) rename codex-rs/tui/src/{snapshots/codex_tui__api_provision__tests__success_cell_snapshot.snap => chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot.snap} (81%) rename codex-rs/tui/src/{snapshots/codex_tui__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap => chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap} (83%) diff --git a/codex-rs/login/src/onboard_oauth_helper.rs b/codex-rs/login/src/api_provision.rs similarity index 99% rename from codex-rs/login/src/onboard_oauth_helper.rs rename to codex-rs/login/src/api_provision.rs index f2cad5cf93..88fe5fdda2 100644 --- a/codex-rs/login/src/onboard_oauth_helper.rs +++ b/codex-rs/login/src/api_provision.rs @@ -1,4 +1,4 @@ -//! Browser-based helper for onboarding login and Codex auth provisioning. +//! Browser-based OAuth flow for provisioning OpenAI project API keys. use std::fs::OpenOptions; use std::io::Write; @@ -851,5 +851,5 @@ impl std::fmt::Display for HelperError { impl std::error::Error for HelperError {} #[cfg(test)] -#[path = "onboard_oauth_helper_tests.rs"] +#[path = "api_provision_tests.rs"] mod tests; diff --git a/codex-rs/login/src/onboard_oauth_helper_tests.rs b/codex-rs/login/src/api_provision_tests.rs similarity index 100% rename from codex-rs/login/src/onboard_oauth_helper_tests.rs rename to codex-rs/login/src/api_provision_tests.rs diff --git a/codex-rs/login/src/bin/get_sensitive_id_via_codex_oauth.rs b/codex-rs/login/src/bin/get_sensitive_id_via_codex_oauth.rs index e2d1fe5c0c..a258053b57 100644 --- a/codex-rs/login/src/bin/get_sensitive_id_via_codex_oauth.rs +++ b/codex-rs/login/src/bin/get_sensitive_id_via_codex_oauth.rs @@ -1,6 +1,6 @@ #[tokio::main] async fn main() { - if let Err(err) = codex_login::run_onboard_oauth_helper_from_env().await { + if let Err(err) = codex_login::run_api_provision_helper_from_env().await { eprintln!("{err}"); if let Some(body) = err.body() && !body.is_empty() diff --git a/codex-rs/login/src/lib.rs b/codex-rs/login/src/lib.rs index f0e16d4447..ada4137acc 100644 --- a/codex-rs/login/src/lib.rs +++ b/codex-rs/login/src/lib.rs @@ -1,9 +1,9 @@ pub mod auth; pub mod token_data; +mod api_provision; mod device_code_auth; mod dotenv_api_key; -mod onboard_oauth_helper; mod pkce; mod server; @@ -17,6 +17,13 @@ pub use server::ServerOptions; pub use server::ShutdownHandle; pub use server::run_login_server; +pub use ApiProvisionError as OnboardOauthHelperError; +pub use api_provision::ApiProvisionOptions; +pub use api_provision::HelperError as ApiProvisionError; +pub use api_provision::PendingApiProvisioning; +pub use api_provision::ProvisionedApiKey; +pub use api_provision::run_from_env as run_api_provision_helper_from_env; +pub use api_provision::start_api_provisioning; pub use auth::AuthConfig; pub use auth::AuthCredentialsStoreMode; pub use auth::AuthDotJson; @@ -38,10 +45,5 @@ pub use auth::save_auth; pub use codex_app_server_protocol::AuthMode; pub use dotenv_api_key::upsert_dotenv_api_key; pub use dotenv_api_key::validate_dotenv_target; -pub use onboard_oauth_helper::ApiProvisionOptions; -pub use onboard_oauth_helper::HelperError as OnboardOauthHelperError; -pub use onboard_oauth_helper::PendingApiProvisioning; -pub use onboard_oauth_helper::ProvisionedApiKey; -pub use onboard_oauth_helper::run_from_env as run_onboard_oauth_helper_from_env; -pub use onboard_oauth_helper::start_api_provisioning; +pub use run_api_provision_helper_from_env as run_onboard_oauth_helper_from_env; pub use token_data::TokenData; diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index eae30d528a..49659c5794 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -291,6 +291,7 @@ use crate::status_indicator_widget::STATUS_DETAILS_DEFAULT_MAX_LINES; use crate::status_indicator_widget::StatusDetailsCapitalization; use crate::text_formatting::truncate_text; use crate::tui::FrameRequester; +mod api_provision; mod interrupts; use self::interrupts::InterruptManager; mod agent; @@ -4734,22 +4735,7 @@ impl ChatWidget { }); } SlashCommand::ApiProvision => { - let cwd = self.status_line_cwd().to_path_buf(); - match crate::api_provision::start_command( - self.app_event_tx.clone(), - self.auth_manager.clone(), - self.config.codex_home.clone(), - cwd, - self.config.forced_login_method, - ) { - Ok(start_message) => { - self.add_boxed_history(Box::new(start_message)); - self.request_redraw(); - } - Err(err) => { - self.add_error_message(err); - } - } + self.start_api_provision(); } SlashCommand::Copy => { let Some(text) = self.last_copyable_output.as_deref() else { diff --git a/codex-rs/tui/src/api_provision.rs b/codex-rs/tui/src/chatwidget/api_provision.rs similarity index 94% rename from codex-rs/tui/src/api_provision.rs rename to codex-rs/tui/src/chatwidget/api_provision.rs index 8ab6be41eb..9c680df4d5 100644 --- a/codex-rs/tui/src/api_provision.rs +++ b/codex-rs/tui/src/chatwidget/api_provision.rs @@ -17,12 +17,33 @@ use codex_protocol::config_types::ForcedLoginMethod; use ratatui::style::Stylize; use ratatui::text::Line; +use super::ChatWidget; use crate::app_event::AppEvent; use crate::app_event_sender::AppEventSender; use crate::history_cell; use crate::history_cell::PlainHistoryCell; -pub(crate) fn start_command( +impl ChatWidget { + pub(crate) fn start_api_provision(&mut self) { + match start_api_provision( + self.app_event_tx.clone(), + self.auth_manager.clone(), + self.config.codex_home.clone(), + self.status_line_cwd().to_path_buf(), + self.config.forced_login_method, + ) { + Ok(start_message) => { + self.add_to_history(start_message); + self.request_redraw(); + } + Err(err) => { + self.add_error_message(err); + } + } + } +} + +fn start_api_provision( app_event_tx: AppEventSender, auth_manager: Arc, codex_home: PathBuf, diff --git a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__continue_in_browser_message_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__continue_in_browser_message_snapshot.snap similarity index 91% rename from codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__continue_in_browser_message_snapshot.snap rename to codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__continue_in_browser_message_snapshot.snap index f95c5ca1df..1ab919ec98 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__continue_in_browser_message_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__continue_in_browser_message_snapshot.snap @@ -1,5 +1,5 @@ --- -source: tui/src/api_provision.rs +source: tui/src/chatwidget/api_provision.rs expression: render_cell(&cell) --- • Finish API provisioning via your browser. diff --git a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot.snap similarity index 81% rename from codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot.snap rename to codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot.snap index a756441d7b..ec41ee20d1 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot.snap @@ -1,6 +1,5 @@ --- -source: tui/src/api_provision.rs -assertion_line: 192 +source: tui/src/chatwidget/api_provision.rs expression: render_cell(&cell) --- • Provisioned an API key for Default Org / Default Project and saved OPENAI_API_KEY to /tmp/workspace/.env.local. Updated this session to use the newly provisioned API key without touching auth.json. diff --git a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap similarity index 83% rename from codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap rename to codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap index a8fbcfb28c..bd4f40ed6d 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__api_provision__tests__success_cell_snapshot_when_live_apply_is_skipped.snap @@ -1,6 +1,5 @@ --- -source: tui/src/api_provision.rs -assertion_line: 214 +source: tui/src/chatwidget/api_provision.rs expression: render_cell(&cell) --- • Provisioned an API key for org-default / proj-default and saved OPENAI_API_KEY to /tmp/workspace/.env.local. Saved OPENAI_API_KEY to .env.local, but left this session unchanged because ChatGPT login is required here. diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index d15d31c54e..e291480d0b 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -61,7 +61,6 @@ use tracing_subscriber::prelude::*; use uuid::Uuid; mod additional_dirs; -mod api_provision; mod app; mod app_backtrack; mod app_event;