Normalize whitespace-only lines in agent messages (#34772)

## What changed

Apply the existing whitespace-only line normalization to both streaming and
finalized agent Markdown. Blank lines now discard indentation and stale
hyperlinks while preserving their line style.

GitOrigin-RevId: f6150190b02f8cd8c853220cae1a2dcd2f4578a5
This commit is contained in:
Eric Traut
2026-07-22 15:34:11 +00:00
committed by copyberry
parent 9ee63da142
commit c00e2e851c
6 changed files with 33 additions and 26 deletions
@@ -5,7 +5,7 @@ expression: "rendered.lines.iter().map(rendered_line_text).collect::<Vec<_>>().j
latest user question
• Final answer:
Pattern Outcome
━━━━━━━━━━━━ ━━━━━━━━━━━
Table tail Preserved
@@ -5,7 +5,7 @@ expression: "rendered.lines.iter().map(rendered_line_text).collect::<Vec<_>>().j
latest user question
• Final answer:
Pattern Outcome
━━━━━━━━━━━━ ━━━━━━━━━━━
Table tail Preserved
+22 -15
View File
@@ -407,6 +407,21 @@ impl AgentMarkdownCell {
}
}
fn normalize_whitespace_only_hyperlink_lines(mut lines: Vec<HyperlinkLine>) -> Vec<HyperlinkLine> {
for line in &mut lines {
if line
.line
.spans
.iter()
.all(|span| span.content.chars().all(char::is_whitespace))
{
line.line = Line::default().style(line.line.style);
line.hyperlinks.clear();
}
}
lines
}
impl HistoryCell for AgentMarkdownCell {
fn display_lines(&self, width: u16) -> Vec<Line<'static>> {
visible_lines(self.display_hyperlink_lines(width))
@@ -432,7 +447,11 @@ impl HistoryCell for AgentMarkdownCell {
Some(self.cwd.as_path()),
self.inline_visualization_context.as_ref(),
);
prefix_hyperlink_lines(lines, "• ".dim(), " ".into())
normalize_whitespace_only_hyperlink_lines(prefix_hyperlink_lines(
lines,
"• ".dim(),
" ".into(),
))
};
if let Some(rendered_lines) = &self.rendered_lines {
@@ -487,7 +506,7 @@ impl HistoryCell for StreamingAgentTailCell {
fn display_hyperlink_lines(&self, _width: u16) -> Vec<HyperlinkLine> {
// Tail lines are already rendered at the controller's current stream width.
// Re-wrapping them here can split table borders and produce malformed in-flight rows.
let mut lines = prefix_hyperlink_lines(
normalize_whitespace_only_hyperlink_lines(prefix_hyperlink_lines(
self.lines.clone(),
if self.is_first_line {
"• ".dim()
@@ -495,19 +514,7 @@ impl HistoryCell for StreamingAgentTailCell {
" ".into()
},
" ".into(),
);
for line in &mut lines {
if line
.line
.spans
.iter()
.all(|span| span.content.chars().all(char::is_whitespace))
{
line.line = Line::default().style(line.line.style);
line.hyperlinks.clear();
}
}
lines
))
}
fn transcript_hyperlink_lines(&self, width: u16) -> Vec<HyperlinkLine> {
@@ -9,11 +9,11 @@ rich before:
• - first item
- second item
Col Value
━━━━━━ ━━━━━━━
code x = 1
copy me
• Called
└ workspace.inspect({"path":"README.md
@@ -45,11 +45,11 @@ rich after:
• - first item
- second item
Col Value
━━━━━━ ━━━━━━━
code x = 1
copy me
• Called
└ workspace.inspect({"path":"README.md
@@ -3,9 +3,9 @@ source: tui/src/inline_visualization_tests.rs
expression: text
---
• Fenced:
::codex-inline-vis{file="chart.html"}
Indented:
::codex-inline-vis{file="chart.html"}
@@ -3,8 +3,8 @@ source: tui/src/inline_visualization_tests.rs
expression: snapshot_text
---
• Before
Open chart visualization in the browser
file://<viewer-path>
After