From f10ec115b73ef7d153deb986b347f6ab4a170241 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 14 Oct 2026 20:55:24 +0000 Subject: [PATCH] Show Daybreak notices after the session header (#54097) ## What changed Emit the Daybreak notice after replacing or removing the placeholder session header so the notice follows the configured header. ## Testing Extend the resumed-history snapshot test to start with a placeholder header and verify the full transcript order: session header, Daybreak notice, and replayed user and assistant messages. GitOrigin-RevId: 536f717b2859d2fe319756f52123b4cd0407cb66 --- codex-rs/tui/src/chatwidget/session_flow.rs | 7 ++-- .../src/chatwidget/tests/history_replay.rs | 40 +++++++++---------- ...story_replay__resumed_daybreak_banner.snap | 13 +++++- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/codex-rs/tui/src/chatwidget/session_flow.rs b/codex-rs/tui/src/chatwidget/session_flow.rs index 2d39a08d0c..3c83e2b951 100644 --- a/codex-rs/tui/src/chatwidget/session_flow.rs +++ b/codex-rs/tui/src/chatwidget/session_flow.rs @@ -118,9 +118,6 @@ impl ChatWidget { self.config.cwd = session.cwd.clone(); self.config.model_provider_id = session.model_provider_id.clone(); self.set_daybreak_enabled(self.daybreak_enabled); - if self.daybreak_enabled && previous_thread_id != self.thread_id { - self.add_info_message("Daybreak is on for new turns.".into(), /*hint*/ None); - } if connector_scope_changed { self.invalidate_connector_scope(); } @@ -235,6 +232,10 @@ impl ChatWidget { self.transcript.active_cell = None; self.bump_active_cell_revision(); } + // Emit notices after replacing or removing the placeholder header. + if self.daybreak_enabled && previous_thread_id != self.thread_id { + self.add_info_message("Daybreak is on for new turns.".into(), /*hint*/ None); + } self.transcript.saw_copy_source_this_turn = false; self.refresh_skills_for_current_cwd(/*force_reload*/ true); self.refresh_connector_mentions(/*force_refresh*/ false); diff --git a/codex-rs/tui/src/chatwidget/tests/history_replay.rs b/codex-rs/tui/src/chatwidget/tests/history_replay.rs index 9655f96ff6..e1b6cc0f22 100644 --- a/codex-rs/tui/src/chatwidget/tests/history_replay.rs +++ b/codex-rs/tui/src/chatwidget/tests/history_replay.rs @@ -70,7 +70,12 @@ async fn resumed_initial_messages_render_history() { ); // Session hydration can precede the account update on ChatGPT sign-in. - chat.status_account_display = None; + let (mut chat, mut rx, _ops) = make_chatwidget_manual(/*model_override*/ None).await; + chat.set_feature_enabled(Feature::CliDaybreak, /*enabled*/ true); + chat.show_welcome_banner = false; + chat.local_settings.tui.show_tooltips = false; + chat.config.cwd = configured.cwd.clone(); + chat.transcript.active_cell = Some(ChatWidget::placeholder_session_header_cell(&chat.config)); configured.thread_id = ThreadId::new(); chat.handle_thread_session(configured); assert!(chat.daybreak_enabled); @@ -92,27 +97,18 @@ async fn resumed_initial_messages_render_history() { ReplayKind::ResumeInitialMessages, ); - let cells = drain_insert_history(&mut rx); - let mut merged_lines = Vec::new(); - for lines in cells { - let text = lines - .iter() - .flat_map(|line| line.spans.iter()) - .map(|span| span.content.clone()) - .collect::(); - merged_lines.push(text); - } - - let text_blob = merged_lines.join("\n"); - assert!( - text_blob.contains("hello from user"), - "expected replayed user message", - ); - assert!( - text_blob.contains("assistant reply"), - "expected replayed agent message", - ); - insta::assert_snapshot!("resumed_daybreak_banner", merged_lines[0]); + let history = drain_insert_history(&mut rx) + .iter() + .flatten() + .map(ToString::to_string) + .collect::>() + .join("\n") + .replace(CODEX_CLI_VERSION, "") + .replace( + &test_path_display("/home/user/project"), + "/home/user/project", + ); + insta::assert_snapshot!("resumed_daybreak_banner", history); } #[tokio::test] diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__history_replay__resumed_daybreak_banner.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__history_replay__resumed_daybreak_banner.snap index c20749ddd6..5e78664e4a 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__history_replay__resumed_daybreak_banner.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__history_replay__resumed_daybreak_banner.snap @@ -1,5 +1,16 @@ --- source: tui/src/chatwidget/tests/history_replay.rs -expression: "merged_lines[0]" +assertion_line: 111 +expression: history --- + + >_ OpenAI Codex (v) + /home/user/project + • Daybreak is on for new turns. + + +› hello from user + + +• assistant reply