From 6663b690b7deddf16e25e32c8f589a531e003eb4 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Tue, 17 Feb 2026 19:23:53 -0800 Subject: [PATCH] Restrict compacted-history keep set to user and compaction items --- codex-rs/core/src/compact.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/codex-rs/core/src/compact.rs b/codex-rs/core/src/compact.rs index bf4ad646a6..4b18c9de2c 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -466,9 +466,10 @@ fn is_user_shell_command_record(item: &ResponseItem) -> bool { /// instruction content. /// - non-user-content `user` messages (session prefix/instruction wrappers), /// keeping only real user messages as parsed by `parse_turn_item`. +/// - all non-user transcript items except compaction records. /// -/// This intentionally keeps `user`-role warnings and compaction-generated -/// summary messages because they parse as `TurnItem::UserMessage`. +/// This intentionally keeps compaction-generated summary messages because they +/// parse as `TurnItem::UserMessage`. fn should_keep_compacted_history_item(item: &ResponseItem) -> bool { match item { ResponseItem::Message { role, .. } => { @@ -476,7 +477,7 @@ fn should_keep_compacted_history_item(item: &ResponseItem) -> bool { return false; } if role != "user" { - return true; + return false; } matches!( @@ -484,6 +485,7 @@ fn should_keep_compacted_history_item(item: &ResponseItem) -> bool { Some(TurnItem::UserMessage(_)) ) } + ResponseItem::Compaction { .. } => true, ResponseItem::Reasoning { .. } | ResponseItem::LocalShellCall { .. } | ResponseItem::FunctionCall { .. } @@ -492,8 +494,7 @@ fn should_keep_compacted_history_item(item: &ResponseItem) -> bool { | ResponseItem::CustomToolCallOutput { .. } | ResponseItem::WebSearchCall { .. } | ResponseItem::GhostSnapshot { .. } - | ResponseItem::Compaction { .. } - | ResponseItem::Other => true, + | ResponseItem::Other => false, } } @@ -1080,6 +1081,15 @@ do things )); } + #[test] + fn should_keep_compacted_history_item_keeps_compaction_item() { + let compaction = ResponseItem::Compaction { + encrypted_content: "abc123".to_string(), + }; + + assert!(super::should_keep_compacted_history_item(&compaction)); + } + #[test] fn process_compacted_history_replaces_developer_messages() { let compacted_history = vec![ @@ -1671,15 +1681,6 @@ keep me updated end_turn: None, phase: None, }, - ResponseItem::Message { - id: None, - role: "assistant".to_string(), - content: vec![ContentItem::OutputText { - text: "assistant after latest summary".to_string(), - }], - end_turn: None, - phase: None, - }, ]; assert_eq!(refreshed, expected); }