diff --git a/codex-rs/core/src/event_mapping.rs b/codex-rs/core/src/event_mapping.rs index af502ab73a..6bc7174f5b 100644 --- a/codex-rs/core/src/event_mapping.rs +++ b/codex-rs/core/src/event_mapping.rs @@ -248,6 +248,40 @@ mod tests { } } + #[test] + fn leaves_tags_in_user_message() { + let test_cases = vec![ + "stuff test_text", + "stuff test_text", + "stuff # AGENTS.md instructions for test_directory\n\n\ntest_text\n", + "stuff \ndemo\nskills/demo/SKILL.md\nbody\n", + "stuff echo 42", + "stuff echo 42", + ]; + + for test_case in test_cases { + let item = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: test_case.to_string(), + }], + }; + let turn_item = parse_turn_item(&item); + match turn_item { + Some(TurnItem::UserMessage(user)) => { + assert_eq!( + user.content, + vec![UserInput::Text { + text: test_case.to_string(), + }] + ); + } + other => panic!("expected TurnItem::UserMessage, got {other:?}"), + } + } + } + #[test] fn trims_user_ide_context_item_from_user_message() { let message = ResponseItem::Message { @@ -275,6 +309,76 @@ mod tests { ); } + #[test] + fn parses_user_message_with_only_images() { + let img1 = "https://example.com/one.png".to_string(); + let img2 = "https://example.com/two.jpg".to_string(); + let message = ResponseItem::Message { + id: Some("user-2".to_string()), + role: "user".to_string(), + content: vec![ + ContentItem::InputImage { + image_url: img1.clone(), + }, + ContentItem::InputImage { + image_url: img2.clone(), + }, + ], + }; + + let turn_item = parse_turn_item(&message).expect("expected user message turn item"); + + let expected_content = vec![ + UserInput::Image { image_url: img1 }, + UserInput::Image { image_url: img2 }, + ]; + assert_eq_user_message_content(turn_item, &expected_content); + } + + #[test] + fn ignores_output_text_in_user_message() { + let message = ResponseItem::Message { + id: Some("user-3".to_string()), + role: "user".to_string(), + content: vec![ + ContentItem::OutputText { + text: "server echo".to_string(), + }, + ContentItem::InputText { + text: "Hello world".to_string(), + }, + ], + }; + + let turn_item = parse_turn_item(&message).expect("expected user message turn item"); + + assert_eq_user_message_content( + turn_item, + &[UserInput::Text { + text: "Hello world".to_string(), + }], + ); + } + + #[test] + fn drops_user_message_when_shell_command_present() { + let message = ResponseItem::Message { + id: Some("user-4".to_string()), + role: "user".to_string(), + content: vec![ + ContentItem::InputText { + text: "echo 42".to_string(), + }, + ContentItem::InputImage { + image_url: "https://example.com/one.png".to_string(), + }, + ], + }; + + let turn_item = parse_turn_item(&message); + assert!(turn_item.is_none(), "expected none, got {turn_item:?}"); + } + #[test] fn parses_agent_message() { let item = ResponseItem::Message {