Render assistant file citations as local links (#42650)

## What changed

- Convert `codex-file-citation` directives in assistant Markdown into local-file links while preserving paths with Markdown-significant characters, Unicode, Windows separators, and location suffixes.
- Apply citation rendering consistently to streaming output, finalized messages and plans, and resume-picker transcript previews.
- Keep directives literal in code, HTML, existing links, reference definitions, escaped text, and generic Markdown rendering.
- Bound repeated parsing work for malformed directive candidates without limiting valid citations.

## Testing

- Add coverage for citation parsing and rendering across finalized, streaming, and resume-preview output, including malformed input and path edge cases.

GitOrigin-RevId: 5a0bfb3fc7ac21b7e8846fd170a349fb2d2d5e85
This commit is contained in:
Ian MacLeod
2026-09-04 01:46:55 +00:00
committed by copyberry
parent 956aa3f637
commit f46671b14a
13 changed files with 635 additions and 22 deletions
+7 -7
View File
@@ -98,13 +98,13 @@ pub(crate) fn render_markdown_agent_with_links_cwd_and_visualizations(
rewritten.trusted_file_links.contains_key(destination)
|| crate::markdown_render::hide_web_link_destination(destination)
};
let mut lines =
crate::markdown_render::render_markdown_lines_with_width_cwd_and_hidden_link_destinations(
&normalized,
width,
cwd,
&is_hidden_link_destination,
);
let mut lines = crate::markdown_render::render_streaming_markdown_lines_with_width_and_cwd(
&normalized,
width,
cwd,
&is_hidden_link_destination,
)
.lines;
for hyperlink in lines.iter_mut().flat_map(|line| &mut line.hyperlinks) {
if let Some(link) = rewritten.trusted_file_links.get(&hyperlink.destination) {
hyperlink.retarget_to_trusted_file(&link.destination);