Keep cwd updates from rewriting environments

Preserve environment cwd as an explicit environment-selection value, and keep session cwd updates scoped to session configuration only.

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
starr-openai
2026-04-30 18:16:47 -07:00
co-authored by Codex
parent 5d0e227315
commit 4bfd313759
3 changed files with 34 additions and 8 deletions
+1 -1
View File
@@ -442,7 +442,7 @@ impl Codex {
async fn spawn_internal(args: CodexSpawnArgs) -> CodexResult<CodexSpawnOk> {
let CodexSpawnArgs {
config,
mut config,
auth_manager,
models_manager,
environment_manager,
+1 -7
View File
@@ -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;
{
+32
View File
@@ -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;