use crate::session::tests::make_session_and_context_with_rx; use codex_features::Feature; use codex_history::CodexHarnessMetadata; use codex_history::ResponseItemEnvelope; use codex_history::RolloutItem; use codex_protocol::models::ConfigurationReasoning; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::EventMsg; use pretty_assertions::assert_eq; #[tokio::test] async fn harness_authored_configuration_updates_preserve_metadata_and_resume() { let (session, turn_context, rx_event) = make_session_and_context_with_rx().await; assert!(!session.enabled(Feature::RetainClientDeveloperMessages)); let expected = ResponseItemEnvelope { item: ResponseItem::ConfigurationUpdate { reasoning: ConfigurationReasoning { effort: ReasoningEffort::High, }, }, metadata: Some(CodexHarnessMetadata { harness_authored_configuration: true, ..Default::default() }), }; session .record_annotated_conversation_items( &turn_context, turn_context.model_info(), vec![expected.clone()], ) .await; let recorded = session.clone_history().await.into_annotated_items(); assert_eq!(recorded, vec![expected.clone()]); let mut raw_items = Vec::new(); while let Ok(event) = rx_event.try_recv() { if let EventMsg::RawResponseItem(event) = event.msg { raw_items.push(event.item); } } assert_eq!(raw_items, vec![expected.item]); let rollout_items = recorded .iter() .cloned() .map(RolloutItem::ResponseItem) .collect::>(); let reconstructed = session .reconstruct_history_from_rollout(&turn_context, &rollout_items) .await; assert_eq!(reconstructed.history, recorded); }