From 3a04f2c6895d2d32a995f2a6b3521fd1f54ba640 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Sun, 15 Feb 2026 17:31:24 -0800 Subject: [PATCH] Use explicit user-message predicate for compaction filtering --- codex-rs/core/src/compact.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/codex-rs/core/src/compact.rs b/codex-rs/core/src/compact.rs index 40de1b5ec4..9d8cbede59 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -286,7 +286,7 @@ async fn run_compact_task_inner( let incoming_user_items = match incoming_items.as_ref() { Some(items) => items .iter() - .filter(|item| real_user_message_text(item).is_some()) + .filter(|item| is_non_summary_user_message(item)) .cloned() .collect(), None => Vec::new(), @@ -391,7 +391,7 @@ pub(crate) fn process_compacted_history( // user input rather than an earlier turn. if let Some(insertion_index) = compacted_history .iter() - .rposition(|item| real_user_message_text(item).is_some()) + .rposition(is_non_summary_user_message) { compacted_history .splice(insertion_index..insertion_index, initial_context.to_vec()); @@ -403,13 +403,13 @@ pub(crate) fn process_compacted_history( compacted_history } -fn real_user_message_text(item: &ResponseItem) -> Option { +fn is_non_summary_user_message(item: &ResponseItem) -> bool { match crate::event_mapping::parse_turn_item(item) { Some(TurnItem::UserMessage(user_message)) => { let message = user_message.message(); - (!is_summary_message(&message)).then_some(message) + !is_summary_message(&message) } - _ => None, + _ => false, } } @@ -874,6 +874,21 @@ do things assert_eq!(history, expected); } + #[test] + fn non_summary_user_message_includes_image_only_user_messages() { + let image_only_user = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputImage { + image_url: "data:image/png;base64,AAAA".to_string(), + }], + end_turn: None, + phase: None, + }; + + assert!(super::is_non_summary_user_message(&image_only_user)); + } + #[test] fn process_compacted_history_replaces_developer_messages() { let compacted_history = vec![