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
This commit is contained in:
Charlie Marsh
2026-10-14 21:05:41 +00:00
committed by copyberry
parent bc13ff239c
commit f10ec115b7
3 changed files with 34 additions and 26 deletions
+4 -3
View File
@@ -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);
@@ -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::<String>();
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::<Vec<_>>()
.join("\n")
.replace(CODEX_CLI_VERSION, "<VERSION>")
.replace(
&test_path_display("/home/user/project"),
"/home/user/project",
);
insta::assert_snapshot!("resumed_daybreak_banner", history);
}
#[tokio::test]
@@ -1,5 +1,16 @@
---
source: tui/src/chatwidget/tests/history_replay.rs
expression: "merged_lines[0]"
assertion_line: 111
expression: history
---
>_ OpenAI Codex (v<VERSION>)
/home/user/project
• Daybreak is on for new turns.
› hello from user
• assistant reply