Remove core OverrideTurnContext op

This commit is contained in:
Eric Traut
2026-05-14 12:43:40 -07:00
parent c9e66ab179
commit 97e0faec54
19 changed files with 102 additions and 208 deletions
-57
View File
@@ -83,19 +83,6 @@ pub async fn realtime_conversation_list_voices(sess: &Session, sub_id: String) {
.await;
}
pub async fn override_turn_context(sess: &Session, sub_id: String, updates: SessionSettingsUpdate) {
if let Err(err) = sess.update_settings(updates).await {
sess.send_event_raw(Event {
id: sub_id,
msg: EventMsg::Error(ErrorEvent {
message: err.to_string(),
codex_error_info: Some(CodexErrorInfo::BadRequest),
}),
})
.await;
}
}
pub async fn user_input_or_turn(sess: &Arc<Session>, sub_id: String, op: Op) {
user_input_or_turn_inner(
sess,
@@ -775,50 +762,6 @@ pub(super) async fn submission_loop(
realtime_conversation_list_voices(&sess, sub.id.clone()).await;
false
}
Op::OverrideTurnContext {
cwd,
approval_policy,
approvals_reviewer,
sandbox_policy,
permission_profile,
windows_sandbox_level,
model,
effort,
summary,
service_tier,
collaboration_mode,
personality,
} => {
let collaboration_mode = if let Some(collab_mode) = collaboration_mode {
collab_mode
} else {
let state = sess.state.lock().await;
state.session_configuration.collaboration_mode.with_updates(
model.clone(),
effort,
/*developer_instructions*/ None,
)
};
override_turn_context(
&sess,
sub.id.clone(),
SessionSettingsUpdate {
cwd,
approval_policy,
approvals_reviewer,
sandbox_policy,
permission_profile,
windows_sandbox_level,
collaboration_mode: Some(collaboration_mode),
reasoning_summary: summary,
service_tier,
personality,
..Default::default()
},
)
.await;
false
}
Op::UserInput { .. }
| Op::UserInputWithTurnContext { .. }
| Op::UserTurn { .. } => {
+14 -37
View File
@@ -2221,25 +2221,7 @@ async fn fork_startup_context_then_first_turn_diff_snapshot() -> anyhow::Result<
};
forked
.thread
.submit(Op::OverrideTurnContext {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
summary: None,
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
})
.await?;
forked
.thread
.submit(Op::UserInput {
.submit(Op::UserInputWithTurnContext {
environments: None,
items: vec![UserInput::Text {
text: "after fork".into(),
@@ -2247,6 +2229,19 @@ async fn fork_startup_context_then_first_turn_diff_snapshot() -> anyhow::Result<
}],
final_output_json_schema: None,
responsesapi_client_metadata: None,
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
summary: None,
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
})
.await?;
wait_for_event(&forked.thread, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -5056,24 +5051,6 @@ fn submission_dispatch_span_uses_debug_for_realtime_audio() {
#[test]
fn op_kind_distinguishes_turn_ops() {
assert_eq!(
Op::OverrideTurnContext {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
summary: None,
service_tier: None,
collaboration_mode: None,
personality: None,
}
.kind(),
"override_turn_context"
);
assert_eq!(
Op::UserInput {
environments: None,
@@ -123,12 +123,13 @@ async fn user_input_includes_collaboration_instructions_after_override() -> Resu
let collab_text = "collab instructions";
let collaboration_mode = collab_mode_with_instructions(Some(collab_text));
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -280,12 +281,13 @@ async fn override_then_next_turn_uses_updated_collaboration_instructions() -> Re
let collaboration_mode = collab_mode_with_instructions(Some(collab_text));
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -335,12 +337,13 @@ async fn user_turn_overrides_collaboration_instructions_after_override() -> Resu
let turn_mode = collab_mode_with_instructions(Some(turn_text));
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -409,12 +412,13 @@ async fn collaboration_mode_update_emits_new_instruction_message() -> Result<()>
let second_text = "second instructions";
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -439,12 +443,13 @@ async fn collaboration_mode_update_emits_new_instruction_message() -> Result<()>
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -498,12 +503,13 @@ async fn collaboration_mode_update_noop_does_not_append() -> Result<()> {
let collab_text = "same instructions";
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -528,12 +534,13 @@ async fn collaboration_mode_update_noop_does_not_append() -> Result<()> {
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -586,12 +593,13 @@ async fn collaboration_mode_update_emits_new_instruction_message_when_mode_chang
let plan_text = "plan mode instructions";
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -619,12 +627,13 @@ async fn collaboration_mode_update_emits_new_instruction_message_when_mode_chang
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -681,12 +690,13 @@ async fn collaboration_mode_update_noop_does_not_append_when_mode_is_unchanged()
let collab_text = "mode-stable instructions";
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -714,12 +724,13 @@ async fn collaboration_mode_update_noop_does_not_append_when_mode_is_unchanged()
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -782,12 +793,13 @@ async fn resume_replays_collaboration_instructions() -> Result<()> {
let collab_text = "resume instructions";
initial
.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -850,12 +862,13 @@ async fn empty_collaboration_instructions_are_ignored() -> Result<()> {
let current_model = test.session_configured.model.clone();
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+2 -1
View File
@@ -3248,12 +3248,13 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
}
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(PathBuf::from(PRETURN_CONTEXT_DIFF_CWD)),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+4 -2
View File
@@ -2729,12 +2729,13 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_including_incoming_us
for user in ["USER_ONE", "USER_TWO", "USER_THREE"] {
if user == "USER_THREE" {
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(PathBuf::from(PRETURN_CONTEXT_DIFF_CWD)),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -2845,12 +2846,13 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_strips_incoming_model
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(next_model.to_string()),
effort: None,
@@ -548,12 +548,13 @@ async fn snapshot_rollback_followup_turn_trims_context_updates() -> Result<()> {
let override_cwd = config.cwd.join(PRETURN_CONTEXT_DIFF_CWD);
std::fs::create_dir_all(&override_cwd)?;
conversation
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(override_cwd.to_path_buf()),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+6 -4
View File
@@ -9,7 +9,7 @@ use pretty_assertions::assert_eq;
const CONFIG_TOML: &str = "config.toml";
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn override_turn_context_does_not_persist_when_config_exists() {
async fn turn_context_update_does_not_persist_when_config_exists() {
let server = start_mock_server().await;
let initial_contents = "model = \"gpt-4o\"\n";
let mut builder = test_codex()
@@ -25,12 +25,13 @@ async fn override_turn_context_does_not_persist_when_config_exists() {
let config_path = test.home.path().join(CONFIG_TOML);
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some("o3".to_string()),
effort: Some(Some(ReasoningEffort::High)),
@@ -52,7 +53,7 @@ async fn override_turn_context_does_not_persist_when_config_exists() {
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn override_turn_context_does_not_create_config_file() {
async fn turn_context_update_does_not_create_config_file() {
let server = start_mock_server().await;
let mut builder = test_codex();
let test = builder.build(&server).await.expect("create conversation");
@@ -64,12 +65,13 @@ async fn override_turn_context_does_not_create_config_file() {
);
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some("o3".to_string()),
effort: Some(Some(ReasoningEffort::Medium)),
+6 -3
View File
@@ -157,12 +157,13 @@ async fn model_change_appends_model_instructions_developer_message() -> Result<(
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(next_model.to_string()),
effort: None,
@@ -237,12 +238,13 @@ async fn model_and_personality_change_only_appends_model_instructions() -> Resul
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(next_model.to_string()),
effort: None,
@@ -983,12 +985,13 @@ async fn model_switch_to_smaller_model_updates_token_context_window() -> Result<
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(smaller_model_slug.to_string()),
effort: None,
@@ -474,12 +474,13 @@ async fn snapshot_model_visible_layout_resume_override_matches_rollout_model() -
fs::create_dir_all(&resume_override_cwd)?;
resumed
.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(resume_override_cwd),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some("gpt-5.2".to_string()),
effort: None,
@@ -24,8 +24,7 @@ fn collab_mode_with_instructions(instructions: Option<&str>) -> CollaborationMod
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn override_turn_context_without_user_turn_does_not_record_permissions_update() -> Result<()>
{
async fn turn_context_update_without_user_turn_does_not_record_permissions_update() -> Result<()> {
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
@@ -35,12 +34,13 @@ async fn override_turn_context_without_user_turn_does_not_record_permissions_upd
let test = builder.build(&server).await?;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -64,8 +64,7 @@ async fn override_turn_context_without_user_turn_does_not_record_permissions_upd
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn override_turn_context_without_user_turn_does_not_record_environment_update() -> Result<()>
{
async fn turn_context_update_without_user_turn_does_not_record_environment_update() -> Result<()> {
skip_if_no_network!(Ok(()));
let server = start_mock_server().await;
@@ -73,12 +72,13 @@ async fn override_turn_context_without_user_turn_does_not_record_environment_upd
let new_cwd = TempDir::new()?;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(new_cwd.path().to_path_buf()),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -102,7 +102,7 @@ async fn override_turn_context_without_user_turn_does_not_record_environment_upd
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn override_turn_context_without_user_turn_does_not_record_collaboration_update() -> Result<()>
async fn turn_context_update_without_user_turn_does_not_record_collaboration_update() -> Result<()>
{
skip_if_no_network!(Ok(()));
@@ -112,12 +112,13 @@ async fn override_turn_context_without_user_turn_does_not_record_collaboration_u
let collaboration_mode = collab_mode_with_instructions(Some(collab_text));
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -102,12 +102,13 @@ async fn permissions_message_added_on_override_change() -> Result<()> {
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -235,12 +236,13 @@ async fn permissions_message_omitted_when_disabled() -> Result<()> {
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -324,12 +326,13 @@ async fn resume_replays_permissions_messages() -> Result<()> {
initial
.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -430,12 +433,13 @@ async fn resume_and_fork_append_permissions_messages() -> Result<()> {
initial
.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+8 -4
View File
@@ -328,12 +328,13 @@ async fn user_turn_personality_some_adds_update_message() -> anyhow::Result<()>
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -412,12 +413,13 @@ async fn user_turn_personality_same_value_does_not_add_update_message() -> anyho
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -509,12 +511,13 @@ async fn user_turn_personality_skips_if_feature_disabled() -> anyhow::Result<()>
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
@@ -758,12 +761,13 @@ async fn user_turn_personality_remote_model_template_includes_update_message() -
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+4 -2
View File
@@ -440,12 +440,13 @@ async fn overrides_turn_context_but_keeps_cached_prefix_and_key_constant() -> an
.to_legacy_sandbox_policy(config.cwd.as_path())
.expect("workspace profile should have legacy projection");
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: Some(sandbox_policy),
permission_profile: Some(permission_profile),
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: Some(Some(ReasoningEffort::High)),
@@ -526,12 +527,13 @@ async fn override_before_first_turn_emits_environment_context() -> anyhow::Resul
};
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: Some(AskForApproval::Never),
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some("gpt-5.4".to_string()),
effort: Some(Some(ReasoningEffort::Low)),
+4 -2
View File
@@ -594,12 +594,13 @@ async fn remote_models_remote_model_uses_unified_exec() -> Result<()> {
assert_eq!(model_info.shell_type, ConfigShellToolType::UnifiedExec);
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(REMOTE_MODEL_SLUG.to_string()),
effort: None,
@@ -845,12 +846,13 @@ async fn remote_models_apply_remote_base_instructions() -> Result<()> {
wait_for_model_available(&models_manager, model).await;
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some(model.to_string()),
effort: None,
+2 -1
View File
@@ -419,12 +419,13 @@ async fn resume_model_switch_is_not_duplicated_after_pre_turn_override() -> Resu
let resumed = resume_builder.resume(&server, home, rollout_path).await?;
resumed
.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: Some("gpt-5.4".to_string()),
effort: None,
+2 -1
View File
@@ -828,12 +828,13 @@ async fn review_uses_overridden_cwd_for_base_branch_merge_base() {
.await;
codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: Some(repo_path.to_path_buf()),
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
+1 -1
View File
@@ -70,7 +70,7 @@ For complete documentation of the `Op` and `EventMsg` variants, refer to [protoc
- `Op::Interrupt` – Interrupts a running turn
- `Op::ExecApproval` – Approve or deny code execution
- `Op::UserInputAnswer` – Provide answers for a `request_user_input` tool call
- `Op::UserTurn` and `Op::OverrideTurnContext` accept an optional `personality` override that updates the model’s communication style
- `Op::UserTurn` and `Op::UserInputWithTurnContext` accept an optional `personality` override that updates the model’s communication style
Valid `personality` values are `friendly`, `pragmatic`, and `none`. When `none` is selected, the personality placeholder is replaced with an empty string.
+2 -1
View File
@@ -243,12 +243,13 @@ async fn memories_startup_phase1_uses_live_thread_service_tier() -> anyhow::Resu
assert_eq!(test.config.service_tier, None);
test.codex
.submit(Op::OverrideTurnContext {
.update_turn_context_overrides(codex_core::CodexThreadTurnContextOverrides {
cwd: None,
approval_policy: None,
approvals_reviewer: None,
sandbox_policy: None,
permission_profile: None,
active_permission_profile: None,
windows_sandbox_level: None,
model: None,
effort: None,
-65
View File
@@ -595,70 +595,6 @@ pub enum Op {
communication: InterAgentCommunication,
},
/// Override parts of the persistent turn context for subsequent turns.
///
/// All fields are optional; when omitted, the existing value is preserved.
/// This does not enqueue any input – it only updates defaults used for
/// turns that rely on persistent session-level context (for example,
/// [`Op::UserInput`]).
OverrideTurnContext {
/// Updated `cwd` for sandbox/tool calls.
#[serde(skip_serializing_if = "Option::is_none")]
cwd: Option<PathBuf>,
/// Updated command approval policy.
#[serde(skip_serializing_if = "Option::is_none")]
approval_policy: Option<AskForApproval>,
/// Updated approval reviewer for future approval prompts.
#[serde(skip_serializing_if = "Option::is_none")]
approvals_reviewer: Option<ApprovalsReviewer>,
/// Updated sandbox policy for tool calls.
#[serde(skip_serializing_if = "Option::is_none")]
sandbox_policy: Option<SandboxPolicy>,
/// Updated permissions profile for tool calls.
#[serde(skip_serializing_if = "Option::is_none")]
permission_profile: Option<PermissionProfile>,
/// Updated Windows sandbox mode for tool execution.
#[serde(skip_serializing_if = "Option::is_none")]
windows_sandbox_level: Option<WindowsSandboxLevel>,
/// Updated model slug. When set, the model info is derived
/// automatically.
#[serde(skip_serializing_if = "Option::is_none")]
model: Option<String>,
/// Updated reasoning effort (honored only for reasoning-capable models).
///
/// Use `Some(Some(_))` to set a specific effort, `Some(None)` to clear
/// the effort, or `None` to leave the existing value unchanged.
#[serde(skip_serializing_if = "Option::is_none")]
effort: Option<Option<ReasoningEffortConfig>>,
/// Updated reasoning summary preference (honored only for reasoning-capable models).
#[serde(skip_serializing_if = "Option::is_none")]
summary: Option<ReasoningSummaryConfig>,
/// Updated service tier preference for future turns.
///
/// Use `Some(Some(_))` to set a specific tier, `Some(None)` to clear the
/// preference, or `None` to leave the existing value unchanged.
#[serde(skip_serializing_if = "Option::is_none")]
service_tier: Option<Option<String>>,
/// EXPERIMENTAL - set a pre-set collaboration mode.
/// Takes precedence over model, effort, and developer instructions if set.
#[serde(skip_serializing_if = "Option::is_none")]
collaboration_mode: Option<CollaborationMode>,
/// Updated personality preference.
#[serde(skip_serializing_if = "Option::is_none")]
personality: Option<Personality>,
},
/// Approve a command execution
ExecApproval {
/// The id of the submission we are approving
@@ -848,7 +784,6 @@ impl Op {
Self::UserInputWithTurnContext { .. } => "user_input_with_turn_context",
Self::UserTurn { .. } => "user_turn",
Self::InterAgentCommunication { .. } => "inter_agent_communication",
Self::OverrideTurnContext { .. } => "override_turn_context",
Self::ExecApproval { .. } => "exec_approval",
Self::PatchApproval { .. } => "patch_approval",
Self::ResolveElicitation { .. } => "resolve_elicitation",