diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index 49889b2052..c785ea9b88 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -442,7 +442,7 @@ impl Codex { async fn spawn_internal(args: CodexSpawnArgs) -> CodexResult { let CodexSpawnArgs { - config, + mut config, auth_manager, models_manager, environment_manager, diff --git a/codex-rs/core/src/session/session.rs b/codex-rs/core/src/session/session.rs index be2104f161..8001670315 100644 --- a/codex-rs/core/src/session/session.rs +++ b/codex-rs/core/src/session/session.rs @@ -208,13 +208,6 @@ impl SessionConfiguration { let cwd_changed = absolute_cwd.as_path() != self.cwd.as_path(); next_configuration.cwd = absolute_cwd.clone(); - if updates.environments.is_none() - && cwd_changed - && next_configuration.environments.len() == 1 - && let Some(turn_environment) = next_configuration.environments.first_mut() - { - turn_environment.cwd = absolute_cwd; - } if let Some(permission_profile) = updates.permission_profile.clone() { let active_permission_profile = @@ -915,6 +908,7 @@ impl Session { .map(|(name, _)| name.clone()) .collect(); required_mcp_servers.sort(); + let enabled_mcp_server_count = mcp_servers.values().filter(|server| server.enabled).count(); let required_mcp_server_count = required_mcp_servers.len(); let tool_plugin_provenance = mcp_manager.tool_plugin_provenance(config.as_ref()).await; { diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 2ffc1ddc94..c1c02886f6 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -3330,6 +3330,38 @@ async fn relative_cwd_update_without_environments_resolves_under_session_cwd() { assert!(state.session_configuration.environments.is_empty()); } +#[tokio::test] +async fn cwd_update_does_not_rewrite_sticky_environment_cwd() { + let (session, _turn_context) = make_session_and_context().await; + let (original_cwd, environment_cwd) = { + let mut state = session.state.lock().await; + let original_cwd = state.session_configuration.cwd.clone(); + let environment_cwd = original_cwd.join("environment"); + state.session_configuration.environments = vec![TurnEnvironmentSelection { + environment_id: codex_exec_server::LOCAL_ENVIRONMENT_ID.to_string(), + cwd: environment_cwd.clone(), + }]; + (original_cwd, environment_cwd) + }; + let updated_cwd = original_cwd.join("project"); + std::fs::create_dir_all(updated_cwd.as_path()).expect("create project dir"); + + session + .update_settings(SessionSettingsUpdate { + cwd: Some(PathBuf::from("project")), + ..Default::default() + }) + .await + .expect("cwd update should succeed"); + + let state = session.state.lock().await; + assert_eq!(state.session_configuration.cwd, updated_cwd); + assert_eq!( + state.session_configuration.environments[0].cwd, + environment_cwd + ); +} + #[tokio::test] async fn absolute_cwd_update_with_turn_environment_is_allowed() { let (session, _turn_context, _rx) = make_session_and_context_with_rx().await;