diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index b9d668cddd..11102db6ed 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -3418,25 +3418,12 @@ mod handlers { // Attempt to inject input into current task. if let Err(SteerInputError::NoActiveTurn(items)) = sess.steer_input(items, None).await { sess.seed_initial_context_if_needed(¤t_context).await; - let previous_model = sess.previous_model().await; - let previous_context_item = sess.previous_context_item().await; - let update_items = sess.build_settings_update_items( - previous_context_item.as_ref(), - previous_model.as_deref(), - ¤t_context, - ); - if !update_items.is_empty() { - sess.record_conversation_items(¤t_context, &update_items) - .await; - } sess.refresh_mcp_servers_if_requested(¤t_context) .await; let regular_task = sess.take_startup_regular_task().await.unwrap_or_default(); sess.spawn_task(Arc::clone(¤t_context), items, regular_task) .await; - sess.set_previous_context_item(Some(current_context.to_turn_context_item())) - .await; } } @@ -4282,6 +4269,19 @@ pub(crate) async fn run_turn( error!("Failed to run pre-sampling compact"); return None; } + let previous_model = sess.previous_model().await; + let previous_context_item = sess.previous_context_item().await; + let update_items = sess.build_settings_update_items( + previous_context_item.as_ref(), + previous_model.as_deref(), + turn_context.as_ref(), + ); + if !update_items.is_empty() { + sess.record_conversation_items(turn_context.as_ref(), &update_items) + .await; + } + sess.set_previous_context_item(Some(turn_context.to_turn_context_item())) + .await; let skills_outcome = Some( sess.services diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 08850ec38f..3a86c9d31f 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -3007,7 +3007,7 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess insta::assert_snapshot!( "pre_turn_compaction_including_incoming_shapes", format_labeled_requests_snapshot( - "Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded.", + "Pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction.", &[ ("Local Compaction Request", &requests[2]), ("Local Post-Compaction History Layout", &requests[3]), @@ -3021,11 +3021,21 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess .any(|text| text == "USER_THREE"), "current behavior excludes incoming user message from pre-turn compaction input" ); + let compact_body = requests[2].body_json().to_string(); + assert!( + !compact_body.contains(PRETURN_CONTEXT_DIFF_CWD), + "pre-turn compaction request should exclude incoming context diff items" + ); let follow_up_user_texts = requests[3].message_input_texts("user"); assert!( follow_up_user_texts.iter().any(|text| text == "USER_THREE"), "expected post-compaction follow-up request to keep incoming user text" ); + let follow_up_body = requests[3].body_json().to_string(); + assert!( + follow_up_body.contains(PRETURN_CONTEXT_DIFF_CWD), + "post-compaction follow-up request should include the incoming context diff items" + ); let follow_up_user_images = requests[3].message_input_image_urls("user"); assert!( follow_up_user_images diff --git a/codex-rs/core/tests/suite/compact_remote.rs b/codex-rs/core/tests/suite/compact_remote.rs index c9acde41ab..a3059f16a7 100644 --- a/codex-rs/core/tests/suite/compact_remote.rs +++ b/codex-rs/core/tests/suite/compact_remote.rs @@ -1390,13 +1390,27 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_including_incoming_us insta::assert_snapshot!( "remote_pre_turn_compaction_including_incoming_shapes", format_labeled_requests_snapshot( - "Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message.", + "Remote pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction.", &[ ("Remote Compaction Request", &compact_request), ("Remote Post-Compaction History Layout", &requests[2]), ] ) ); + assert!( + !compact_request + .body_json() + .to_string() + .contains(PRETURN_CONTEXT_DIFF_CWD), + "pre-turn remote compaction request should exclude incoming context diff items" + ); + assert!( + requests[2] + .body_json() + .to_string() + .contains(PRETURN_CONTEXT_DIFF_CWD), + "post-compaction remote request should include incoming context diff items" + ); assert_eq!( requests[2] .message_input_texts("user") diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap index e586c8521a..6752d240fd 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap @@ -1,8 +1,8 @@ --- source: core/tests/suite/compact.rs -expression: "format_labeled_requests_snapshot(\"Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded.\",\n&[(\"Local Compaction Request\", &requests[2]),\n(\"Local Post-Compaction History Layout\", &requests[3]),])" +expression: "format_labeled_requests_snapshot(\"Pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction.\",\n&[(\"Local Compaction Request\", &requests[2]),\n(\"Local Post-Compaction History Layout\", &requests[3]),])" --- -Scenario: Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded. +Scenario: Pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction. ## Local Compaction Request 00:message/developer: @@ -12,8 +12,7 @@ Scenario: Pre-turn auto-compaction with a context override emits the context dif 04:message/assistant:FIRST_REPLY 05:message/user:USER_TWO 06:message/assistant:SECOND_REPLY -07:message/user: -08:message/user: +07:message/user: ## Local Post-Compaction History Layout 00:message/developer: @@ -22,4 +21,5 @@ Scenario: Pre-turn auto-compaction with a context override emits the context dif 03:message/user:USER_ONE 04:message/user:USER_TWO 05:message/user:\nPRE_TURN_SUMMARY -06:message/user: | | | USER_THREE +06:message/user: +07:message/user: | | | USER_THREE diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap index 00aaaeaa92..47407d20c9 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap @@ -1,8 +1,8 @@ --- source: core/tests/suite/compact_remote.rs -expression: "format_labeled_requests_snapshot(\"Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[2]),])" +expression: "format_labeled_requests_snapshot(\"Remote pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[2]),])" --- -Scenario: Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message. +Scenario: Remote pre-turn auto-compaction with a context override excludes incoming-turn context diffs from the compact request, then appends those diffs immediately before the incoming user message after compaction. ## Remote Compaction Request 00:message/developer: @@ -12,7 +12,6 @@ Scenario: Remote pre-turn auto-compaction with a context override emits the cont 04:message/assistant:REMOTE_FIRST_REPLY 05:message/user:USER_TWO 06:message/assistant:REMOTE_SECOND_REPLY -07:message/user: ## Remote Post-Compaction History Layout 00:message/user:USER_ONE @@ -21,4 +20,5 @@ Scenario: Remote pre-turn auto-compaction with a context override emits the cont 03:message/user: 04:message/user: 05:message/user:\nREMOTE_PRE_TURN_SUMMARY -06:message/user:USER_THREE +06:message/user: +07:message/user:USER_THREE