From cd1f0fd41bfc5a78d943448bcf4487b8ff05bfdd Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Sun, 12 Apr 2026 13:27:53 -0700 Subject: [PATCH] codex: address injected message review feedback --- codex-rs/core/src/codex_tests.rs | 45 -------------------------------- codex-rs/core/src/messages.rs | 9 ++++++- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/codex-rs/core/src/codex_tests.rs b/codex-rs/core/src/codex_tests.rs index 252a692815..074de11ba4 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -74,7 +74,6 @@ use codex_protocol::protocol::ConversationAudioParams; use codex_protocol::protocol::CreditsSnapshot; use codex_protocol::protocol::GranularApprovalConfig; use codex_protocol::protocol::InitialHistory; -use codex_protocol::protocol::InjectedMessageEvent; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::NetworkApprovalProtocol; use codex_protocol::protocol::RateLimitSnapshot; @@ -5060,50 +5059,6 @@ async fn queued_response_items_for_next_turn_move_into_next_active_turn() { assert_eq!(sess.get_pending_input().await, vec![queued_item]); } -#[tokio::test] -async fn generated_message_records_raw_item_and_emits_injected_event() { - let (sess, tc, rx) = make_session_and_context_with_rx().await; - let response_item = ResponseItem::Message { - id: None, - role: "user".to_string(), - content: vec![ContentItem::InputText { - text: "hidden wrapper" - .to_string(), - }], - end_turn: None, - phase: None, - }; - let injected_event = InjectedMessageEvent { - content: "Visible message".to_string(), - source: "external".to_string(), - }; - - sess.record_generated_message_and_emit_display(tc.as_ref(), response_item, injected_event) - .await; - - let raw = rx.recv().await.expect("raw response item event"); - assert!(matches!(raw.msg, EventMsg::RawResponseItem(_))); - - let injected = rx.recv().await.expect("injected message event"); - let EventMsg::InjectedMessage(injected) = injected.msg else { - panic!("expected InjectedMessage event"); - }; - assert_eq!( - injected, - InjectedMessageEvent { - content: "Visible message".to_string(), - source: "external".to_string(), - } - ); - - let no_legacy_user_message = - tokio::time::timeout(std::time::Duration::from_millis(10), rx.recv()).await; - assert!( - no_legacy_user_message.is_err(), - "generated messages should not emit a legacy UserMessageEvent" - ); -} - #[tokio::test] async fn queue_only_mailbox_mail_waits_for_next_turn_after_answer_boundary() { let (sess, tc, _rx) = make_session_and_context_with_rx().await; diff --git a/codex-rs/core/src/messages.rs b/codex-rs/core/src/messages.rs index 6a20fcba11..a9d70f91ee 100644 --- a/codex-rs/core/src/messages.rs +++ b/codex-rs/core/src/messages.rs @@ -1,4 +1,11 @@ -//! Queued thread messages and model-visible message envelopes. +//! Generated user-message payloads and model-visible XML envelopes. +//! +//! This module owns the shared representation for messages that are delivered +//! into a thread by the harness rather than typed directly by the user. Today +//! that includes external queued messages and timer-generated messages. The +//! state database keeps the richer persisted payload, while this module renders +//! the smaller XML envelope that is recorded in model history and builds the +//! structured display event that clients can render without parsing that XML. use crate::timers::TimerDelivery; use codex_protocol::models::ContentItem;