Render delegated thread messages as Markdown in the TUI (#59789)

## Why

Incoming delegated messages were rendered as plain text, leaving Markdown formatting visible and links without hyperlink metadata.

## What changed

Use a dedicated history cell to render the message body as Markdown while keeping the source task attribution literal. Preserve hyperlinks and wrapping, and apply the appropriate list spacing for scrollback and the redrawable transcript.

Use the same rendering for live messages, resumed history, and transcript projection.

## Testing

Extend replay coverage to check matching live and replayed output, transcript rendering, hyperlink destinations, and shared source text across wrapped rows. Add a snapshot covering list spacing in scrollback and the redrawable transcript.

GitOrigin-RevId: e9864c7721fa1afa2d3662ab9f57122ab696a51e
This commit is contained in:
Benjamin Carlsson
2026-11-06 02:01:43 +00:00
committed by copyberry
parent b1263c593d
commit 3cf4899cb5
11 changed files with 202 additions and 22 deletions
+4 -5
View File
@@ -8,9 +8,9 @@ use crate::app_server_session::AppServerSession;
use crate::app_server_session::HistoryHydrationScope;
use crate::git_action_directives::parse_assistant_markdown;
use crate::history_cell::AgentMarkdownCell;
use crate::history_cell::DelegatedMessageCell;
use crate::history_cell::HistoryCell;
use crate::history_cell::PlainHistoryCell;
use crate::history_cell::PrefixedWrappedHistoryCell;
use crate::history_cell::ReasoningSummaryCell;
use crate::history_cell::split_reasoning_summary_parts;
use crate::inline_visualization::InlineVisualizationContext;
@@ -302,10 +302,9 @@ fn item_to_cells(
&output,
)
{
cells.push(Arc::new(PrefixedWrappedHistoryCell::new(
format!("Sent by Codex from task {source_thread_id}\n{prompt}"),
"• ".dim(),
" ",
cells.push(Arc::new(DelegatedMessageCell::new(
&source_thread_id,
prompt,
)));
}
}