diff --git a/codex-rs/app-server/tests/suite/v2/account.rs b/codex-rs/app-server/tests/suite/v2/account.rs index 3c88bcb7a43..f7981226351 100644 --- a/codex-rs/app-server/tests/suite/v2/account.rs +++ b/codex-rs/app-server/tests/suite/v2/account.rs @@ -45,7 +45,9 @@ use wiremock::ResponseTemplate; use wiremock::matchers::method; use wiremock::matchers::path; -const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10); +// Account tests spin up fresh app-server processes repeatedly, which can take +// longer on slower Bazel macOS runners once the suite is already warm. +const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(20); const LOGIN_ISSUER_ENV_VAR: &str = "CODEX_APP_SERVER_LOGIN_ISSUER"; // Helper to create a minimal config.toml for the app server diff --git a/codex-rs/core/config.schema.json b/codex-rs/core/config.schema.json index 3fba1d7217a..bd74c46595e 100644 --- a/codex-rs/core/config.schema.json +++ b/codex-rs/core/config.schema.json @@ -503,6 +503,9 @@ "unified_exec": { "type": "boolean" }, + "use_agent_identity": { + "type": "boolean" + }, "use_legacy_landlock": { "type": "boolean" }, @@ -2349,6 +2352,9 @@ "unified_exec": { "type": "boolean" }, + "use_agent_identity": { + "type": "boolean" + }, "use_legacy_landlock": { "type": "boolean" }, diff --git a/codex-rs/exec-server/src/server/handler/tests.rs b/codex-rs/exec-server/src/server/handler/tests.rs index 17867bbb04e..c0b20172caf 100644 --- a/codex-rs/exec-server/src/server/handler/tests.rs +++ b/codex-rs/exec-server/src/server/handler/tests.rs @@ -275,7 +275,8 @@ async fn output_and_exit_are_retained_after_notification_receiver_closes() { process_id.as_str(), shell_argv( "sleep 0.05; printf 'first\\n'; sleep 0.05; printf 'second\\n'", - "echo first&& ping -n 2 127.0.0.1 >NUL&& echo second", + // `cmd.exe` retains the space before `&&` in `echo first && ...`. + "(echo first) && ping -n 2 127.0.0.1 >NUL && (echo second)", ), )) .await diff --git a/codex-rs/features/src/lib.rs b/codex-rs/features/src/lib.rs index 590a1ff69f9..10d5fdf884d 100644 --- a/codex-rs/features/src/lib.rs +++ b/codex-rs/features/src/lib.rs @@ -186,6 +186,8 @@ pub enum Feature { ResponsesWebsockets, /// Legacy rollout flag for Responses API WebSocket transport v2 experiments. ResponsesWebsocketsV2, + /// Use the agent identity registration flow for ChatGPT-authenticated sessions. + UseAgentIdentity, } impl Feature { @@ -909,6 +911,12 @@ pub const FEATURES: &[FeatureSpec] = &[ stage: Stage::Removed, default_enabled: false, }, + FeatureSpec { + id: Feature::UseAgentIdentity, + key: "use_agent_identity", + stage: Stage::UnderDevelopment, + default_enabled: false, + }, ]; pub fn unstable_features_warning_event( diff --git a/codex-rs/features/src/tests.rs b/codex-rs/features/src/tests.rs index 40009dd884a..bc357a7fb4a 100644 --- a/codex-rs/features/src/tests.rs +++ b/codex-rs/features/src/tests.rs @@ -163,6 +163,24 @@ fn remote_control_is_under_development() { assert_eq!(Feature::RemoteControl.default_enabled(), false); } +#[test] +fn use_agent_identity_is_under_development() { + assert_eq!(Feature::UseAgentIdentity.stage(), Stage::UnderDevelopment); + assert_eq!(Feature::UseAgentIdentity.default_enabled(), false); +} + +#[test] +fn image_detail_original_feature_is_experimental_and_user_toggleable() { + let stage = Feature::ImageDetailOriginal.stage(); + + assert!(matches!(stage, Stage::Experimental { .. })); + assert_eq!( + stage.experimental_menu_name(), + Some("Original image detail") + ); + assert_eq!(Feature::ImageDetailOriginal.default_enabled(), false); +} + #[test] fn collab_is_legacy_alias_for_multi_agent() { assert_eq!(feature_for_key("multi_agent"), Some(Feature::Collab));