From 4ffdc2115093431212e69b0f56341b44faeeadd5 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 16 Aug 2026 12:09:47 +0800 Subject: [PATCH 01/14] fix(webview): render expanded task header text as markdown The collapsed task title still shows raw text, but the expanded view rendered the prompt verbatim via , so markdown syntax (bold, code, lists) appeared as literal characters. Render it through MarkdownBlock like other chat messages and drop the now-redundant whitespace-pre-wrap class. --- webview-ui/src/components/chat/TaskHeader.tsx | 6 +++-- .../chat/__tests__/TaskHeader.spec.tsx | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 0941a22e2b..5140e45254 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -29,6 +29,8 @@ import { Mention } from "./Mention" import { TodoListDisplay } from "./TodoListDisplay" import { LucideIconButton } from "./LucideIconButton" +import MarkdownBlock from "../common/MarkdownBlock" + export interface TaskHeaderProps { task: ClineMessage tokensIn: number @@ -324,13 +326,13 @@ const TaskHeader = ({ className="text-vscode-font-size overflow-y-auto break-words break-anywhere relative">
- +
{task.images && task.images.length > 0 && } diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 2a302e6b18..76b9ecedbb 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -329,4 +329,27 @@ describe("TaskHeader", () => { expect(screen.getByText("25%")).toBeInTheDocument() }) }) + + describe("Expanded task text markdown rendering", () => { + it("shows raw source while collapsed and formatted markdown when expanded", async () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "**bold** and `code`", images: [] }, + }) + + // Collapsed state renders the raw task text (no markdown formatting yet). + expect(screen.getByText("**bold** and `code`")).toBeInTheDocument() + expect(container.querySelector("strong")).toBeNull() + + // Expand the header by clicking the collapsed title. + fireEvent.click(screen.getByText("**bold** and `code`")) + + // Expanded state applies markdown: **bold** becomes , `code` becomes . + const bold = await screen.findByText("bold") + expect(bold.tagName).toBe("STRONG") + expect(container.querySelector("code")?.textContent).toBe("code") + + // The raw markdown source must not be displayed verbatim in the expanded view. + expect(screen.queryByText("**bold** and `code`")).not.toBeInTheDocument() + }) + }) }) From dce70f220d9ba8f5bdfbcfa34b12d6c6858909c9 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 16 Aug 2026 12:33:01 +0800 Subject: [PATCH 02/14] fix(webview): use VS Code-style scrollbar for expanded task prompt box The expanded prompt box used a default always-visible Chromium scrollbar while the message list uses the hover-reveal .scrollable style, so two differently-styled scrollbars stacked in the same column. Add the shared .scrollable class so both behave consistently. --- webview-ui/src/components/chat/TaskHeader.tsx | 2 +- .../components/chat/__tests__/TaskHeader.spec.tsx | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 5140e45254..5ff0e801d3 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -326,7 +326,7 @@ const TaskHeader = ({ className="text-vscode-font-size overflow-y-auto break-words break-anywhere relative">
{ // The raw markdown source must not be displayed verbatim in the expanded view. expect(screen.queryByText("**bold** and `code`")).not.toBeInTheDocument() }) + + it("uses the shared scrollable style for the expanded prompt box", () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "prompt", images: [] }, + }) + + // Expand the header. + fireEvent.click(screen.getByText("prompt")) + + // The prompt box must use the VS Code-style .scrollable scrollbar (hover-reveal), + // not a default always-visible Chromium scrollbar, so it matches the message list. + const scrollBox = container.querySelector(".scrollable") + expect(scrollBox).not.toBeNull() + expect(scrollBox?.className).toContain("max-h-80") + }) }) }) From dcf27384834ac6e4d52a7224ce0d98344be0712f Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 16 Aug 2026 12:50:47 +0800 Subject: [PATCH 03/14] fix(webview): keep task header expanded when clicking rendered markdown links MarkdownBlock renders prompt links as elements, which the header click handler did not guard against (only buttons/role=button/img), so clicking a link inside the expanded prompt toggled isTaskExpanded and collapsed the panel. Ignore anchor targets in the toggle handler; add regression tests for link clicks, headings/lists rendering, and empty prompts. --- webview-ui/src/components/chat/TaskHeader.tsx | 4 +- .../chat/__tests__/TaskHeader.spec.tsx | 51 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 5ff0e801d3..b614dbbb92 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -165,7 +165,9 @@ const TaskHeader = ({ e.target.closest('[role="button"]') || e.target.closest("[data-radix-popper-content-wrapper]") || e.target.closest("img") || - e.target.tagName === "IMG") + e.target.tagName === "IMG" || + e.target.closest("a") || + e.target.tagName === "A") ) { return } diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 633aa783d5..4d9bd40656 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -366,5 +366,56 @@ describe("TaskHeader", () => { expect(scrollBox).not.toBeNull() expect(scrollBox?.className).toContain("max-h-80") }) + + it("renders headings and lists in the expanded view", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "# Heading\n- item one\n- item two", + images: [], + }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + const heading = await screen.findByRole("heading") + expect(heading.textContent).toBe("Heading") + expect(container.querySelector("ul li")).not.toBeNull() + }) + + it("does not collapse the panel when a rendered markdown link is clicked", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "**bold** [example](https://example.com)", + images: [], + }, + }) + + // Expand the header. + fireEvent.click(screen.getByText("**bold** [example](https://example.com)")) + const link = await screen.findByRole("link", { name: "example" }) + + // Clicking a rendered link must not toggle isTaskExpanded (the header click + // handler ignores anchor targets), so the expanded content stays visible. + fireEvent.click(link) + expect(container.querySelector("strong")).not.toBeNull() + }) + + it("renders an empty prompt without crashing", () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: undefined as any, images: [] }, + }) + + // No title text to click, so expand via the header container itself. + fireEvent.click(container.querySelector(".cursor-pointer")!) + + // The empty prompt renders nothing but must not crash; the rest of the + // expanded header (cost row) is still present. + expect(screen.getByText("$0.05")).toBeInTheDocument() + }) }) }) From 86f5b2c5c1fb57f9a7483ca15d737044000c620d Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 16 Aug 2026 12:57:43 +0800 Subject: [PATCH 04/14] test(webview): drop as-any cast from empty-prompt TaskHeader fixture ClineMessage.text is optional (z.string().optional()), so the empty-prompt case can omit the property instead of casting undefined through any. --- webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 4d9bd40656..926762e93c 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -407,7 +407,8 @@ describe("TaskHeader", () => { it("renders an empty prompt without crashing", () => { const { container } = renderTaskHeader({ - task: { type: "say", ts: Date.now(), text: undefined as any, images: [] }, + // `text` is optional on ClineMessage; omit it to exercise the empty-prompt path. + task: { type: "say", ts: Date.now(), images: [] }, }) // No title text to click, so expand via the header container itself. From b84fc765f5f65e13a833fb2e136c5079a272dfbe Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Mon, 17 Aug 2026 22:12:02 +0800 Subject: [PATCH 05/14] fix(chat): preserve mentions in expanded task markdown --- .../chat/__tests__/TaskHeader.spec.tsx | 24 ++++ .../src/components/common/MarkdownBlock.tsx | 56 ++++++++- .../common/__tests__/MarkdownBlock.spec.tsx | 106 +++++++++++++++++- 3 files changed, 183 insertions(+), 3 deletions(-) diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 926762e93c..5a5f6055b4 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -405,6 +405,30 @@ describe("TaskHeader", () => { expect(container.querySelector("strong")).not.toBeNull() }) + it("keeps context mentions clickable in the expanded markdown view", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "Inspect @/src/file.ts, @problems, and @terminal.", + images: [], + }, + }) + + // Expand via the header container because the collapsed title contains split mention spans. + fireEvent.click(container.querySelector(".cursor-pointer")!) + await screen.findByText(/Inspect/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(3) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + expect(mentions[2].textContent).toBe("@terminal") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/file.ts" }) + }) + it("renders an empty prompt without crashing", () => { const { container } = renderTaskHeader({ // `text` is optional on ClineMessage; omit it to exercise the empty-prompt path. diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 02f696553f..200e197fbf 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -6,12 +6,66 @@ import rehypeKatex from "rehype-katex" import remarkMath from "remark-math" import remarkGfm from "remark-gfm" +import { mentionRegexGlobal } from "@roo/context-mentions" + import { vscode } from "@src/utils/vscode" import { type AlertType, remarkGithubAlerts } from "@src/utils/markdown" import CodeBlock from "./CodeBlock" import MermaidBlock from "./MermaidBlock" +/** + * Rehype plugin that wraps context mentions (@/path, @problems, @terminal, etc.) + * in clickable spans matching the styling used by the collapsed Mention component. + */ +function rehypeMentions() { + return (tree: any) => { + visit(tree, "text", (node: any, index, parent) => { + if (parent?.tagName === "span" && parent.properties?.className?.includes("mention-context-highlight")) { + return + } + + const originalValue = String(node.value) + const matches = Array.from(originalValue.matchAll(mentionRegexGlobal)) + + if (matches.length === 0) { + return + } + + const children: any[] = [] + let lastIndex = 0 + + for (const match of matches) { + const mentionText = match[0] + const mentionValue = match[1] ?? mentionText.slice(1) // capture group or full mention without @ + const mentionStart = match.index! + + if (mentionStart > lastIndex) { + children.push({ type: "text", value: originalValue.slice(lastIndex, mentionStart) }) + } + + children.push({ + type: "element", + tagName: "span", + properties: { + className: ["mention-context-highlight", "text-[0.9em]", "cursor-pointer"], + onClick: () => vscode.postMessage({ type: "openMention", text: mentionValue }), + }, + children: [{ type: "text", value: mentionText }], + }) + + lastIndex = mentionStart + mentionText.length + } + + if (lastIndex < originalValue.length) { + children.push({ type: "text", value: originalValue.slice(lastIndex) }) + } + + parent.children.splice(index, 1, ...children) + }) + } +} + // Codicon glyphs used as the leading icon for each GitHub-style alert type. const ALERT_ICONS: Record = { note: "codicon-info", @@ -415,7 +469,7 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { } }, ]} - rehypePlugins={[rehypeKatex as any]} + rehypePlugins={[rehypeMentions, rehypeKatex as any]} components={components}> {markdown || ""} diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 2c56fc418a..bdd476ae08 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -1,13 +1,21 @@ -import { render, screen } from "@/utils/test-utils" +import { render, screen, fireEvent } from "@/utils/test-utils" import MarkdownBlock from "../MarkdownBlock" +const { mockPostMessage } = vi.hoisted(() => ({ + mockPostMessage: vi.fn(), +})) + vi.mock("@src/utils/vscode", () => ({ vscode: { - postMessage: vi.fn(), + postMessage: mockPostMessage, }, })) +beforeEach(() => { + mockPostMessage.mockClear() +}) + vi.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: () => ({ theme: "dark", @@ -217,4 +225,98 @@ describe("MarkdownBlock", () => { expect(screen.getByText("Third level ordered")).toBeInTheDocument() expect(screen.getByText("Back to first level")).toBeInTheDocument() }) + + describe("Context mentions (#559)", () => { + it("renders @/path/file.ts as a clickable mention span", async () => { + const markdown = "Check out @/src/components/chat/TaskHeader.tsx for details." + const { container } = render() + + await screen.findByText(/Check out/, { exact: false }) + + // The mention should be wrapped in a span with the mention-context-highlight class. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/components/chat/TaskHeader.tsx") + + // The trailing period must remain outside the mention span. + expect(container.querySelector("p")?.textContent).toBe( + "Check out @/src/components/chat/TaskHeader.tsx for details.", + ) + }) + + it("renders @problems as a clickable mention span", async () => { + const markdown = "Review the issues listed in @problems before proceeding." + const { container } = render() + + await screen.findByText(/Review/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + }) + + it("renders @terminal as a clickable mention span", async () => { + const markdown = "See the output captured in @terminal." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@terminal") + }) + + it("renders multiple mentions in the same paragraph", async () => { + const markdown = "Check @/src/file.ts and @problems, then review @terminal." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(3) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + expect(mentions[2].textContent).toBe("@terminal") + }) + + it("posts openMention message when a mention span is clicked", async () => { + const markdown = "See @/src/components/chat/TaskHeader.tsx." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mentionSpan = container.querySelector("span.mention-context-highlight")! + fireEvent.click(mentionSpan) + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "openMention", + text: "/src/components/chat/TaskHeader.tsx", + }) + }) + + it("does not match @ in the middle of a word or log entry", async () => { + const markdown = "Error: Failed@localhost/status code 404." + const { container } = render() + + await screen.findByText(/Error/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(0) + }) + + it("preserves regular text around mentions", async () => { + const markdown = "Before @problems middle after" + const { container } = render() + + await screen.findByText(/Before/, { exact: false }) + + const paragraph = container.querySelector("p") + expect(paragraph?.textContent).toBe("Before @problems middle after") + + // The mention span should only contain the mention itself. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + }) + }) }) From 37648c4ca1bd81429c6448d27e2282eca134638f Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Wed, 19 Aug 2026 20:15:27 +0800 Subject: [PATCH 06/14] fix(webview): keep expanded task panel open after mention click The mention span handler in MarkdownBlock now stops propagation before posting openMention, so a mention click inside the expanded task header no longer bubbles to the TaskHeader toggle and collapses the panel. Adds a regression assertion that the expanded markdown stays rendered after clicking a mention. Addresses CodeRabbit review comment on PR #1257. --- .../src/components/chat/__tests__/TaskHeader.spec.tsx | 6 ++++++ webview-ui/src/components/common/MarkdownBlock.tsx | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 5a5f6055b4..178a5fc4db 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -427,6 +427,12 @@ describe("TaskHeader", () => { fireEvent.click(mentions[0]) expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/file.ts" }) + + // The mention click must not bubble to the header toggle (the mention handler + // stops propagation), so the expanded markdown stays rendered after the + // mention is opened instead of the panel collapsing. + expect(screen.getByText(/Inspect/, { exact: false })).toBeInTheDocument() + expect(container.querySelectorAll("span.mention-context-highlight")).toHaveLength(3) }) it("renders an empty prompt without crashing", () => { diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 200e197fbf..7cbb0818f8 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -49,7 +49,12 @@ function rehypeMentions() { tagName: "span", properties: { className: ["mention-context-highlight", "text-[0.9em]", "cursor-pointer"], - onClick: () => vscode.postMessage({ type: "openMention", text: mentionValue }), + onClick: (event: React.MouseEvent) => { + // Keep mention clicks from bubbling to the TaskHeader toggle, which + // would collapse the expanded panel right after opening the mention. + event.stopPropagation() + vscode.postMessage({ type: "openMention", text: mentionValue }) + }, }, children: [{ type: "text", value: mentionText }], }) From dd76171c5ed5f57f90ad4d5dbbb0e33515b83dd5 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Wed, 19 Aug 2026 20:46:21 +0800 Subject: [PATCH 07/14] fix(webview): keep mentions literal in code and keyboard accessible Addresses the updated CodeRabbit merge-risk notes on PR #1257: rehypeMentions now skips text inside code elements (mention patterns in code blocks rendered verbatim and no longer vanished from CodeBlock text extraction), and mention spans are keyboard operable via role=button, tabIndex and Enter/Space key handling. Adds regression tests for both behaviors. --- .../src/components/common/MarkdownBlock.tsx | 18 ++++++++ .../common/__tests__/MarkdownBlock.spec.tsx | 44 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 7cbb0818f8..cc6e0bd763 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -25,6 +25,13 @@ function rehypeMentions() { return } + // Code is literal content: never interactive-ify mention patterns inside it. + // Wrapping them would also corrupt the CodeBlock text extraction, which only + // keeps string children (the mention text would silently disappear). + if (parent?.tagName === "code") { + return + } + const originalValue = String(node.value) const matches = Array.from(originalValue.matchAll(mentionRegexGlobal)) @@ -49,12 +56,23 @@ function rehypeMentions() { tagName: "span", properties: { className: ["mention-context-highlight", "text-[0.9em]", "cursor-pointer"], + role: "button", + tabIndex: 0, onClick: (event: React.MouseEvent) => { // Keep mention clicks from bubbling to the TaskHeader toggle, which // would collapse the expanded panel right after opening the mention. event.stopPropagation() vscode.postMessage({ type: "openMention", text: mentionValue }) }, + // Keyboard parity with the click handler (a role=button span is not a + // native button, so Enter/Space must be handled explicitly). + onKeyDown: (event: React.KeyboardEvent) => { + if (event.key !== "Enter" && event.key !== " ") { + return + } + event.stopPropagation() + vscode.postMessage({ type: "openMention", text: mentionValue }) + }, }, children: [{ type: "text", value: mentionText }], }) diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index bdd476ae08..ae4f05b748 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -304,6 +304,50 @@ describe("MarkdownBlock", () => { expect(mentions.length).toBe(0) }) + it("keeps mention patterns literal inside fenced code blocks", async () => { + const markdown = "```bash\necho hello @problems\n```" + const { container } = render() + + await screen.findByText(/echo/, { exact: false }) + + // Code is literal content: the mention must stay plain text, not become a + // clickable span (which would also make the text vanish from CodeBlock). + expect(container.querySelector("code")?.textContent).toBe("echo hello @problems\n") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + }) + + it("keeps mention patterns literal inside inline code", async () => { + const markdown = "Use `@problems` carefully." + const { container } = render() + + await screen.findByText(/Use/, { exact: false }) + + expect(container.querySelector("code")?.textContent).toBe("@problems") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + }) + + it("makes mentions keyboard operable (role=button, tabIndex, Enter/Space)", async () => { + const markdown = "See @terminal." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mention = container.querySelector("span.mention-context-highlight")! + expect(mention.getAttribute("role")).toBe("button") + expect(mention.getAttribute("tabindex")).toBe("0") + + fireEvent.keyDown(mention, { key: "Enter" }) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) + + mockPostMessage.mockClear() + fireEvent.keyDown(mention, { key: " " }) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) + + mockPostMessage.mockClear() + fireEvent.keyDown(mention, { key: "a" }) + expect(mockPostMessage).not.toHaveBeenCalled() + }) + it("preserves regular text around mentions", async () => { const markdown = "Before @problems middle after" const { container } = render() From 005ea494aaf3813ce9b149227cad18de780e060f Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Wed, 19 Aug 2026 21:02:28 +0800 Subject: [PATCH 08/14] test(webview): cover remaining mention-splitter branches Adds a standalone-mention regression test that exercises the no-leading-text and no-trailing-text branches of the rehypeMentions splitter, and drops the unreachable match[1] ?? mentionText.slice(1) fallback (the mention regex has one mandatory capture group, so match[1] is always the non-empty value and identical to match[0].slice(1)). Lifts PR patch coverage of the changed MarkdownBlock lines from ~87.5% to full. --- .../src/components/common/MarkdownBlock.tsx | 4 +++- .../common/__tests__/MarkdownBlock.spec.tsx | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index cc6e0bd763..ad37dfc4ea 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -44,7 +44,9 @@ function rehypeMentions() { for (const match of matches) { const mentionText = match[0] - const mentionValue = match[1] ?? mentionText.slice(1) // capture group or full mention without @ + // mentionRegexGlobal has one mandatory capture group, so match[1] is always + // the non-empty value after "@" (match[0].slice(1) would be identical). + const mentionValue = match[1] const mentionStart = match.index! if (mentionStart > lastIndex) { diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index ae4f05b748..16bac5c88f 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -326,6 +326,22 @@ describe("MarkdownBlock", () => { expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) }) + it("renders a standalone mention with no surrounding text", async () => { + // A mention that both starts and ends the text node exercises the + // no-leading-text and no-trailing-text branches of the splitter. + const markdown = "@problems" + const { container } = render() + + await screen.findByText("@problems") + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + + // No leading/trailing text: the paragraph is exactly the mention. + expect(container.querySelector("p")?.textContent).toBe("@problems") + }) + it("makes mentions keyboard operable (role=button, tabIndex, Enter/Space)", async () => { const markdown = "See @terminal." const { container } = render() From d227f3e04511b62ba676ce3cc9b5c06c6fe61f8f Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Thu, 20 Aug 2026 13:07:30 +0800 Subject: [PATCH 09/14] fix(webview): gate clickable mentions to user-authored task text Addresses edelauna's review on PR #1257: gate the rehypeMentions plugin behind a new MarkdownBlock `mentions` prop (off by default) so assistant messages, reasoning, tool output, and todo lists keep mention patterns as inert text; only the expanded TaskHeader prompt (user-authored) passes it. Also extend the skip guard from `code` to `pre`/`a` so a mention inside link text no longer becomes a nested role=button span (invalid per WHATWG) that blocks the anchor's openFile handler. Adds regression tests for both behaviors. --- webview-ui/src/components/chat/TaskHeader.tsx | 2 +- .../src/components/common/MarkdownBlock.tsx | 23 +++++--- .../common/__tests__/MarkdownBlock.spec.tsx | 52 +++++++++++++++---- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index b614dbbb92..92dd3572bc 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -334,7 +334,7 @@ const TaskHeader = ({ WebkitLineClamp: "unset", WebkitBoxOrient: "vertical", }}> - +
{task.images && task.images.length > 0 && } diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index ad37dfc4ea..1e50279b47 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -25,10 +25,13 @@ function rehypeMentions() { return } - // Code is literal content: never interactive-ify mention patterns inside it. - // Wrapping them would also corrupt the CodeBlock text extraction, which only - // keeps string children (the mention text would silently disappear). - if (parent?.tagName === "code") { + // Code and links are literal or already-interactive content: never + // interactive-ify mention patterns inside them. Inside a role=button + // span would be invalid nested interactive content (WHATWG) and its + // stopPropagation would block the anchor's own openFile handler; inside + // code it would corrupt the CodeBlock text extraction, which only keeps + // string children (the mention text would silently disappear). + if (parent?.tagName === "code" || parent?.tagName === "pre" || parent?.tagName === "a") { return } @@ -111,6 +114,14 @@ const ALERT_LABELS: Record = { interface MarkdownBlockProps { markdown?: string + /** + * Render context mentions (@/path, @problems, @terminal, ...) as clickable + * spans that post `openMention`. Off by default: mentions are only + * actionable where the text is user-authored (the expanded task prompt). + * Assistant-generated content (messages, reasoning, tool output, todos) + * keeps mention patterns as inert text. + */ + mentions?: boolean } const StyledMarkdown = styled.div` @@ -352,7 +363,7 @@ const StyledMarkdown = styled.div` } ` -const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { +const MarkdownBlock = memo(({ markdown, mentions = false }: MarkdownBlockProps) => { const components = useMemo( () => ({ table: ({ children, ...props }: any) => { @@ -494,7 +505,7 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { } }, ]} - rehypePlugins={[rehypeMentions, rehypeKatex as any]} + rehypePlugins={[...(mentions ? [rehypeMentions] : []), rehypeKatex as any]} components={components}> {markdown || ""} diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 16bac5c88f..5c3035f28c 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -227,9 +227,22 @@ describe("MarkdownBlock", () => { }) describe("Context mentions (#559)", () => { + it("keeps mention patterns inert when the mentions prop is not set", async () => { + // Mentions are only actionable where text is user-authored. Assistant + // content rendered through the default MarkdownBlock must keep mention + // patterns as plain, non-interactive text. + const markdown = "Check @/src/file.ts and @problems." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.querySelector("p")?.textContent).toBe("Check @/src/file.ts and @problems.") + }) + it("renders @/path/file.ts as a clickable mention span", async () => { const markdown = "Check out @/src/components/chat/TaskHeader.tsx for details." - const { container } = render() + const { container } = render() await screen.findByText(/Check out/, { exact: false }) @@ -246,7 +259,7 @@ describe("MarkdownBlock", () => { it("renders @problems as a clickable mention span", async () => { const markdown = "Review the issues listed in @problems before proceeding." - const { container } = render() + const { container } = render() await screen.findByText(/Review/, { exact: false }) @@ -257,7 +270,7 @@ describe("MarkdownBlock", () => { it("renders @terminal as a clickable mention span", async () => { const markdown = "See the output captured in @terminal." - const { container } = render() + const { container } = render() await screen.findByText(/See/, { exact: false }) @@ -268,7 +281,7 @@ describe("MarkdownBlock", () => { it("renders multiple mentions in the same paragraph", async () => { const markdown = "Check @/src/file.ts and @problems, then review @terminal." - const { container } = render() + const { container } = render() await screen.findByText(/Check/, { exact: false }) @@ -281,7 +294,7 @@ describe("MarkdownBlock", () => { it("posts openMention message when a mention span is clicked", async () => { const markdown = "See @/src/components/chat/TaskHeader.tsx." - const { container } = render() + const { container } = render() await screen.findByText(/See/, { exact: false }) @@ -306,7 +319,7 @@ describe("MarkdownBlock", () => { it("keeps mention patterns literal inside fenced code blocks", async () => { const markdown = "```bash\necho hello @problems\n```" - const { container } = render() + const { container } = render() await screen.findByText(/echo/, { exact: false }) @@ -318,7 +331,7 @@ describe("MarkdownBlock", () => { it("keeps mention patterns literal inside inline code", async () => { const markdown = "Use `@problems` carefully." - const { container } = render() + const { container } = render() await screen.findByText(/Use/, { exact: false }) @@ -326,11 +339,30 @@ describe("MarkdownBlock", () => { expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) }) + it("keeps mention patterns literal inside link text even when enabled", async () => { + // A mention inside must not become a nested role=button span: that + // is invalid interactive content (WHATWG) and would block the anchor's + // own openFile handler via stopPropagation. + const markdown = "see [open @/src/main.ts](/src/main.ts) please" + const { container } = render() + + await screen.findByText(/please/, { exact: false }) + + const anchor = container.querySelector("a")! + expect(container.querySelectorAll("a span.mention-context-highlight").length).toBe(0) + expect(anchor.textContent).toBe("open @/src/main.ts") + + // The anchor's own handler still fires (nothing swallows the click). + fireEvent.click(anchor) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openFile", text: "/src/main.ts" }) + expect(mockPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "openMention" })) + }) + it("renders a standalone mention with no surrounding text", async () => { // A mention that both starts and ends the text node exercises the // no-leading-text and no-trailing-text branches of the splitter. const markdown = "@problems" - const { container } = render() + const { container } = render() await screen.findByText("@problems") @@ -344,7 +376,7 @@ describe("MarkdownBlock", () => { it("makes mentions keyboard operable (role=button, tabIndex, Enter/Space)", async () => { const markdown = "See @terminal." - const { container } = render() + const { container } = render() await screen.findByText(/See/, { exact: false }) @@ -366,7 +398,7 @@ describe("MarkdownBlock", () => { it("preserves regular text around mentions", async () => { const markdown = "Before @problems middle after" - const { container } = render() + const { container } = render() await screen.findByText(/Before/, { exact: false }) From 0498c09ded58148272e38fe602695caa0f192425 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sat, 22 Aug 2026 12:43:14 +0800 Subject: [PATCH 10/14] fix(webview): keep newlines and full mention paths in expanded task header Address review feedback on #1257: - Add a `breaks` prop to MarkdownBlock (remark-breaks) so single newlines in user-authored prompts render as a structural
instead of collapsing to spaces per CommonMark. TaskHeader (the expanded prompt) opts in; assistant content keeps the default soft-break behavior. A small rehype plugin drops the stray \n text node mdast-util-to-hast emits after each
, which would otherwise double-break under the webview's white-space: pre-wrap paragraphs. - Match context mentions on the raw markdown string before remark tokenizes it instead of on remark's split text nodes. This restores the collapsed behavior for paths containing markdown-active characters (e.g. @/src/__init__.py), which tokenization previously truncated to @/src/ and posted as the wrong openMention value. Literal/non-text regions (code, links, images, HTML, math) are masked first via a throwaway mdast parse so mentions inside them stay inert. Adds regression tests for both behaviors in MarkdownBlock and TaskHeader. --- pnpm-lock.yaml | 26 +++ webview-ui/package.json | 3 + webview-ui/src/components/chat/TaskHeader.tsx | 2 +- .../chat/__tests__/TaskHeader.spec.tsx | 49 ++++++ .../src/components/common/MarkdownBlock.tsx | 163 ++++++++++++++++-- .../common/__tests__/MarkdownBlock.spec.tsx | 108 ++++++++++++ 6 files changed, 334 insertions(+), 17 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a666502f4e..f6bb9b7e67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -854,12 +854,18 @@ importers: rehype-katex: specifier: ^7.0.1 version: 7.0.1 + remark-breaks: + specifier: ^4.0.0 + version: 4.0.0 remark-gfm: specifier: ^4.0.1 version: 4.0.1 remark-math: specifier: ^6.0.0 version: 6.0.0 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 remove-markdown: specifier: ^0.6.4 version: 0.6.4 @@ -887,6 +893,9 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@4.3.2) + unified: + specifier: ^11.0.5 + version: 11.0.5 unist-util-visit: specifier: ^5.0.0 version: 5.0.0 @@ -6134,6 +6143,9 @@ packages: mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-newline-to-break@2.0.0: + resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -7133,6 +7145,9 @@ packages: rehype-react@6.2.1: resolution: {integrity: sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==} + remark-breaks@4.0.0: + resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -14340,6 +14355,11 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-newline-to-break@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-find-and-replace: 3.0.2 + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -15610,6 +15630,12 @@ snapshots: '@mapbox/hast-util-table-cell-style': 0.2.1 hast-to-hyperscript: 9.0.1 + remark-breaks@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-newline-to-break: 2.0.0 + unified: 11.0.5 + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 diff --git a/webview-ui/package.json b/webview-ui/package.json index 7a42984f77..551a39074e 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -68,8 +68,10 @@ "react-use": "^17.5.1", "react-virtuoso": "^4.7.13", "rehype-katex": "^7.0.1", + "remark-breaks": "^4.0.0", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", "remove-markdown": "^0.6.4", "shell-quote": "^1.8.2", "shiki": "^3.2.1", @@ -79,6 +81,7 @@ "tailwind-merge": "^3.0.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", + "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "use-sound": "^5.0.0", "vscode-material-icons": "^0.1.1", diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 92dd3572bc..098e251981 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -334,7 +334,7 @@ const TaskHeader = ({ WebkitLineClamp: "unset", WebkitBoxOrient: "vertical", }}> - + {task.images && task.images.length > 0 && } diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 178a5fc4db..c3008e2976 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -435,6 +435,55 @@ describe("TaskHeader", () => { expect(container.querySelectorAll("span.mention-context-highlight")).toHaveLength(3) }) + it("keeps single newlines as line breaks in a plain-text prompt", async () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "Fix the login bug\nIt crashes on startup", images: [] }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + // Inexact match: the soft break splits the paragraph into text
text, so no + // single element's full text equals the first line. + await screen.findByText(/Fix the login bug/, { exact: false }) + + // The previous expanded view rendered plain text with whitespace-pre-wrap, so a + // single newline was always a line break. The markdown pipeline collapses soft + // breaks to spaces per CommonMark unless remark-breaks is enabled, so the header + // must keep the newline structural (
) instead of reflowing the prompt into + // one paragraph. + const paragraph = container.querySelector(".scrollable p") + expect(paragraph).not.toBeNull() + expect(paragraph?.querySelector("br")).not.toBeNull() + expect(paragraph?.textContent).toBe("Fix the login bugIt crashes on startup") + }) + + it("still parses markdown headings and lists while keeping newlines inside them", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "# Heading\n- item one\n continued line\n- item two", + images: [], + }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + const heading = await screen.findByRole("heading") + expect(heading.textContent).toBe("Heading") + + // Markdown still parses (the # line is a heading, the - lines are list items)... + const items = container.querySelectorAll(".scrollable li") + expect(items).toHaveLength(2) + + // ...and the soft break inside the first item renders as a line break. + expect(items[0]?.querySelector("br")).not.toBeNull() + expect(items[0]?.textContent).toBe("item onecontinued line") + expect(items[1]?.textContent).toBe("item two") + }) + it("renders an empty prompt without crashing", () => { const { container } = renderTaskHeader({ // `text` is optional on ClineMessage; omit it to exercise the empty-prompt path. diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 1e50279b47..4108a6107f 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -3,8 +3,11 @@ import ReactMarkdown from "react-markdown" import styled from "styled-components" import { visit } from "unist-util-visit" import rehypeKatex from "rehype-katex" -import remarkMath from "remark-math" +import remarkBreaks from "remark-breaks" import remarkGfm from "remark-gfm" +import remarkMath from "remark-math" +import remarkParse from "remark-parse" +import { unified } from "unified" import { mentionRegexGlobal } from "@roo/context-mentions" @@ -14,19 +17,97 @@ import { type AlertType, remarkGithubAlerts } from "@src/utils/markdown" import CodeBlock from "./CodeBlock" import MermaidBlock from "./MermaidBlock" +// Control character that wraps a mention index in the preprocessed markdown. +// It cannot be typed into a prompt and carries no markdown meaning, so remark +// always keeps a whole placeholder inside a single text node. Built via +// `new RegExp` from a string constant (a template literal) so the control +// character does not appear in a regex literal (no-control-regex). +const MENTION_PLACEHOLDER_CHAR = "\u0001" +const MENTION_PLACEHOLDER_REGEX = new RegExp(`${MENTION_PLACEHOLDER_CHAR}(\\d+)${MENTION_PLACEHOLDER_CHAR}`, "g") + +// mdast node types whose raw source regions must never be mention-rewritten: +// code blocks (fenced or indented), inline code, links, images, raw HTML, and +// math all render as literal or non-text content. +const MENTION_MASK_NODE_TYPES = new Set(["code", "inlineCode", "link", "image", "html", "inlineMath", "math"]) + +/** + * Rewrite mention patterns in the RAW markdown string before remark tokenizes + * it, replacing each match with an indexed placeholder. + * + * Matching on remark's tokenized text nodes truncates paths that contain + * markdown-active characters: `@/src/__init__.py` is parsed as + * `@/src/` + init + `.py`, so per-node matching would only + * see `@/src/` and post the wrong path to `openMention`. Raw-string matching + * is also the behavior of the collapsed component, so this restores + * it for the expanded view. + * + * Regions that render as literal content (code, links, images, HTML, math) are + * masked to spaces in a throwaway mdast parse first; using the exact positions + * remark sees guarantees a mention inside such a region is never rewritten. + */ +function prepareMentions(markdown: string): { preparedMarkdown: string; mentions: string[] } { + if (!markdown) { + return { preparedMarkdown: markdown, mentions: [] } + } + + // A throwaway parse with the same extensions as the render pipeline, so the + // reported positions match what remark will tokenize. Mask literal and + // non-text regions to spaces (mdast positions carry absolute source + // offsets): a mention inside any of them must stay inert, because code and + // links render as literal/interactive content, and images, raw HTML, and + // math keep their source text unchanged. + const tree = unified().use(remarkParse).use(remarkGfm).use(remarkMath).parse(markdown) + + const masked = markdown.split("") + visit(tree, (node: any) => { + if (!MENTION_MASK_NODE_TYPES.has(node.type)) { + return + } + const start = node.position?.start?.offset + const end = node.position?.end?.offset + if (typeof start !== "number" || typeof end !== "number") { + return + } + for (let i = start; i < end && i < masked.length; i++) { + masked[i] = " " + } + }) + + const mentions: string[] = [] + let preparedMarkdown = "" + let lastIndex = 0 + for (const match of masked.join("").matchAll(mentionRegexGlobal)) { + const start = match.index! + preparedMarkdown += markdown.slice(lastIndex, start) + mentions.push(markdown.slice(start, start + match[0].length)) + preparedMarkdown += `${MENTION_PLACEHOLDER_CHAR}${mentions.length - 1}${MENTION_PLACEHOLDER_CHAR}` + lastIndex = start + match[0].length + } + preparedMarkdown += markdown.slice(lastIndex) + + return { preparedMarkdown, mentions } +} + /** - * Rehype plugin that wraps context mentions (@/path, @problems, @terminal, etc.) - * in clickable spans matching the styling used by the collapsed Mention component. + * Rehype plugin that replaces the mention placeholders produced by + * prepareMentions with clickable spans matching the styling used by the + * collapsed Mention component. */ -function rehypeMentions() { +function rehypeMentions(mentions: string[]) { return (tree: any) => { - visit(tree, "text", (node: any, index, parent) => { + visit(tree, "text", (node: any, index: number | undefined, parent: any) => { + if (index === undefined || !parent) { + return + } + + // Skip text inside spans we already created (the visitor may revisit + // children inserted during the same pass). if (parent?.tagName === "span" && parent.properties?.className?.includes("mention-context-highlight")) { return } - // Code and links are literal or already-interactive content: never - // interactive-ify mention patterns inside them. Inside
a role=button + // prepareMentions already masks code and link regions, but keep these + // guards so the plugin stays safe on any tree: inside a role=button // span would be invalid nested interactive content (WHATWG) and its // stopPropagation would block the anchor's own openFile handler; inside // code it would corrupt the CodeBlock text extraction, which only keeps @@ -36,20 +117,26 @@ function rehypeMentions() { } const originalValue = String(node.value) - const matches = Array.from(originalValue.matchAll(mentionRegexGlobal)) + const matches = Array.from(originalValue.matchAll(MENTION_PLACEHOLDER_REGEX)) if (matches.length === 0) { return } + // If any placeholder fails to resolve (should not happen), leave the + // text untouched instead of rendering the control characters verbatim. + if (matches.some((match) => mentions[Number(match[1])] === undefined)) { + return + } + const children: any[] = [] let lastIndex = 0 for (const match of matches) { - const mentionText = match[0] - // mentionRegexGlobal has one mandatory capture group, so match[1] is always - // the non-empty value after "@" (match[0].slice(1) would be identical). - const mentionValue = match[1] + const mentionText = mentions[Number(match[1])] + // The raw mention includes the leading "@"; the posted value is the + // full path/word after it, matching the collapsed Mention component. + const mentionValue = mentionText.slice(1) const mentionStart = match.index! if (mentionStart > lastIndex) { @@ -82,7 +169,7 @@ function rehypeMentions() { children: [{ type: "text", value: mentionText }], }) - lastIndex = mentionStart + mentionText.length + lastIndex = mentionStart + match[0].length } if (lastIndex < originalValue.length) { @@ -94,6 +181,30 @@ function rehypeMentions() { } } +/** + * Rehype plugin that drops the lone "\n" text node mdast-util-to-hast emits + * right after every
(its hardBreak handler returns [
, "\n"]). + * + * The paragraph styling in this webview uses `white-space: pre-wrap`, where a + * literal newline is significant. Without this, every remark-breaks
would + * be followed by an extra pre-wrap line break, inserting a blank line between + * each soft-broken line. Removing the node leaves exactly one line break per + * soft break, independent of CSS white-space handling. + */ +function rehypeStripBreakNewlines() { + return (tree: any) => { + visit(tree, "element", (node: any, index: number | undefined, parent: any) => { + if (node.tagName !== "br" || index === undefined || !parent) { + return + } + const next = parent.children[index + 1] + if (next?.type === "text" && next.value === "\n") { + parent.children.splice(index + 1, 1) + } + }) + } +} + // Codicon glyphs used as the leading icon for each GitHub-style alert type. const ALERT_ICONS: Record = { note: "codicon-info", @@ -122,6 +233,14 @@ interface MarkdownBlockProps { * keeps mention patterns as inert text. */ mentions?: boolean + /** + * Render single newlines as
(remark-breaks) instead of collapsing them + * to spaces per CommonMark. Off by default so the shared pipeline keeps its + * CommonMark soft-break behavior for assistant-generated content. The + * expanded task prompt (user-authored text) enables it so plain multi-line + * prompts keep their line breaks while markdown still parses. + */ + breaks?: boolean } const StyledMarkdown = styled.div` @@ -363,7 +482,7 @@ const StyledMarkdown = styled.div` } ` -const MarkdownBlock = memo(({ markdown, mentions = false }: MarkdownBlockProps) => { +const MarkdownBlock = memo(({ markdown, mentions = false, breaks = false }: MarkdownBlockProps) => { const components = useMemo( () => ({ table: ({ children, ...props }: any) => { @@ -484,6 +603,13 @@ const MarkdownBlock = memo(({ markdown, mentions = false }: MarkdownBlockProps) [], ) + // When mentions are actionable, rewrite the raw markdown before parsing so + // mention matching runs on the untokenized string (see prepareMentions). + const { preparedMarkdown, mentions: mentionList } = useMemo( + () => (mentions ? prepareMentions(markdown || "") : { preparedMarkdown: markdown || "", mentions: [] }), + [markdown, mentions], + ) + return ( { return (tree: any) => { visit(tree, "code", (node: any) => { @@ -505,9 +632,13 @@ const MarkdownBlock = memo(({ markdown, mentions = false }: MarkdownBlockProps) } }, ]} - rehypePlugins={[...(mentions ? [rehypeMentions] : []), rehypeKatex as any]} + rehypePlugins={[ + ...(mentions ? [[rehypeMentions, mentionList] as const] : []), + ...(breaks ? [rehypeStripBreakNewlines] : []), + rehypeKatex as any, + ]} components={components}> - {markdown || ""} + {preparedMarkdown} ) diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 5c3035f28c..6046e3ccf4 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -410,5 +410,113 @@ describe("MarkdownBlock", () => { expect(mentions.length).toBe(1) expect(mentions[0].textContent).toBe("@problems") }) + + it("matches the full mention path when it contains markdown-active characters", async () => { + // remark tokenizes `@/src/__init__.py` as `@/src/` + init + `.py`, + // so matching on tokenized text nodes would truncate the mention to `@/src/` and + // post the wrong path. Mention matching must run on the raw string instead. + const markdown = "Run the tests for @/src/__init__.py now." + const { container } = render() + + await screen.findByText(/Run the tests/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/__init__.py") + + // No stray for the `__init__` part: the whole path is one mention. + expect(container.querySelector("p")?.querySelector("strong")).toBeNull() + + // Clicking must post the FULL path, not the truncated `@/src/` prefix. + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/__init__.py" }) + }) + + it("matches mentions containing asterisks on the raw string", async () => { + // `*files*` would tokenize as emphasis, splitting the path across text nodes. + const markdown = "Check @/src/*files* before shipping." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/*files*") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/*files*" }) + }) + + it("resolves mentions and line breaks together in the same prompt", async () => { + // The raw-string mention preprocessing and remark-breaks both rewrite the + // paragraph; they must compose: the mention stays a single span and the + // soft break between the lines renders as one
. + const markdown = "Check @/src/file.ts\nthen review @problems" + const { container } = render() + + await screen.findByText(/then review/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(2) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + + const paragraph = container.querySelector("p") + expect(paragraph?.querySelectorAll("br")).toHaveLength(1) + expect(paragraph?.textContent).toBe("Check @/src/file.tsthen review @problems") + }) + + it("keeps placeholder-free output when the prompt contains no mentions", async () => { + // Preprocessing must not leak placeholder control characters into rendered + // text when the (raw) text happens to contain mention-like patterns that do + // not match (e.g. @ not preceded by whitespace). + const markdown = "Failed@localhost/status code 404." + const { container } = render() + + await screen.findByText(/Failed/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.querySelector("p")?.textContent).toBe("Failed@localhost/status code 404.") + }) + }) + + describe("line breaks (breaks prop)", () => { + it("renders a soft line break as
when breaks is set", async () => { + const markdown = "line one\nline two" + const { container } = render() + + await screen.findByText(/line one/) + + const paragraph = container.querySelector("p") + expect(paragraph).not.toBeNull() + // remark-breaks turns the single newline into a real
so the line + // break is structural instead of relying on CSS white-space. + expect(paragraph?.querySelector("br")).not.toBeNull() + expect(paragraph?.textContent).toBe("line oneline two") + }) + + it("keeps soft line breaks as text by default", async () => { + const markdown = "line one\nline two" + const { container } = render() + + // The text matcher must be inexact: by default the newline stays inside + // the single text node, so "line one" is not a standalone node. + await screen.findByText(/line one/, { exact: false }) + + const paragraph = container.querySelector("p") + expect(paragraph?.querySelector("br")).toBeNull() + expect(paragraph?.textContent).toBe("line one\nline two") + }) + + it("keeps blank lines as paragraph breaks when breaks is set", async () => { + const markdown = "first paragraph\n\nsecond paragraph" + const { container } = render() + + await screen.findByText("first paragraph") + + // Two separate paragraphs (the blank line is a hard break, not a soft one). + expect(container.querySelectorAll("p")).toHaveLength(2) + expect(container.querySelector("p")?.querySelector("br")).toBeNull() + }) }) }) From f75fa94b7be384b98d51513d81dc618fb3f2ac53 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sat, 22 Aug 2026 14:21:19 +0800 Subject: [PATCH 11/14] fix(webview): respect mention boundaries and prevent Space scroll on activation Address CodeRabbit findings on #1257: - Match mentions on the raw markdown string and discard a match only when its range intersects a masked literal region, instead of matching a space-masked copy. Masking turned a preceding `)` or backtick into whitespace, which made a non-mention like `[file](/src/a.ts)`@problems` actionable even though the shared regex's start boundary rejects it in the raw text. Adding regression tests for a mention directly after a link/inline code (inert) and one separated by a space (actionable). - Call event.preventDefault() in the mention span's Enter/Space keydown handler so Space does not also scroll the expanded task panel while a mention has focus. The keyboard test now asserts both keys are default-prevented and an unrelated key is not. --- .../src/components/common/MarkdownBlock.tsx | 44 +++++++++++------ .../common/__tests__/MarkdownBlock.spec.tsx | 47 +++++++++++++++++-- 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 4108a6107f..b728ac72ea 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -41,9 +41,13 @@ const MENTION_MASK_NODE_TYPES = new Set(["code", "inlineCode", "link", "image", * is also the behavior of the collapsed component, so this restores * it for the expanded view. * - * Regions that render as literal content (code, links, images, HTML, math) are - * masked to spaces in a throwaway mdast parse first; using the exact positions - * remark sees guarantees a mention inside such a region is never rewritten. + * Matching runs on the raw string so the shared regex's boundary rules apply + * unchanged (replacing literal regions with spaces would turn a preceding `)` + * or backtick into whitespace and make non-mentions actionable). Literal / non- + * text regions (code, links, images, HTML, math) are marked via a throwaway + * mdast parse with the exact positions remark sees, and a match whose range + * intersects one of them is discarded so mentions inside such regions stay + * inert. */ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions: string[] } { if (!markdown) { @@ -51,14 +55,14 @@ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions } // A throwaway parse with the same extensions as the render pipeline, so the - // reported positions match what remark will tokenize. Mask literal and - // non-text regions to spaces (mdast positions carry absolute source - // offsets): a mention inside any of them must stay inert, because code and - // links render as literal/interactive content, and images, raw HTML, and - // math keep their source text unchanged. + // reported positions match what remark will tokenize. Mark literal and + // non-text regions (mdast positions carry absolute source offsets): a + // mention inside any of them must stay inert, because code and links render + // as literal/interactive content, and images, raw HTML, and math keep their + // source text unchanged. const tree = unified().use(remarkParse).use(remarkGfm).use(remarkMath).parse(markdown) - const masked = markdown.split("") + const isMasked = new Array(markdown.length).fill(false) visit(tree, (node: any) => { if (!MENTION_MASK_NODE_TYPES.has(node.type)) { return @@ -68,20 +72,28 @@ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions if (typeof start !== "number" || typeof end !== "number") { return } - for (let i = start; i < end && i < masked.length; i++) { - masked[i] = " " + for (let i = start; i < end && i < isMasked.length; i++) { + isMasked[i] = true } }) const mentions: string[] = [] let preparedMarkdown = "" let lastIndex = 0 - for (const match of masked.join("").matchAll(mentionRegexGlobal)) { + for (const match of markdown.matchAll(mentionRegexGlobal)) { const start = match.index! + const end = start + match[0].length + // The raw string (not a masked copy) is what the shared regex's boundary + // rules must see: masking would turn a preceding `)` or backtick into a + // space and make a non-mention actionable (e.g. `[file](/src/a.ts)`@problems``). + // Discard a match only when its range lands inside a masked literal region. + if (isMasked.slice(start, end).some(Boolean)) { + continue + } preparedMarkdown += markdown.slice(lastIndex, start) - mentions.push(markdown.slice(start, start + match[0].length)) + mentions.push(markdown.slice(start, end)) preparedMarkdown += `${MENTION_PLACEHOLDER_CHAR}${mentions.length - 1}${MENTION_PLACEHOLDER_CHAR}` - lastIndex = start + match[0].length + lastIndex = end } preparedMarkdown += markdown.slice(lastIndex) @@ -158,10 +170,14 @@ function rehypeMentions(mentions: string[]) { }, // Keyboard parity with the click handler (a role=button span is not a // native button, so Enter/Space must be handled explicitly). + // preventDefault keeps Space from also scrolling the expanded task panel, + // which otherwise receives the key's default action when a mention has + // focus. onKeyDown: (event: React.KeyboardEvent) => { if (event.key !== "Enter" && event.key !== " ") { return } + event.preventDefault() event.stopPropagation() vscode.postMessage({ type: "openMention", text: mentionValue }) }, diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 6046e3ccf4..d887db3037 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -358,6 +358,42 @@ describe("MarkdownBlock", () => { expect(mockPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "openMention" })) }) + it("keeps the shared regex boundary rules when a mention directly follows a link or inline code", async () => { + // Matching must run on the raw string so the shared regex's start boundary + // sees the real characters: with no whitespace after a closing `)` or a + // backtick, `@problems` is not a mention (the collapsed + // component rejects it too). Replacing the literal regions with spaces + // before matching would make them actionable. + const markdown = "[file](/src/a.ts)@problems and `x`@problems" + const { container } = render() + + // The anchor text is a stable, unique wait target. + await screen.findByText("file") + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + // The text still renders verbatim (link + plain text, no spans). + expect(container.querySelector("p")?.textContent).toBe("file@problems and x@problems") + }) + + it("keeps a whitespace-separated mention after a link or inline code actionable", async () => { + // The space is a legitimate boundary for the shared regex, so these + // mentions stay clickable: the masked regions end before the spaces and + // the match ranges do not intersect them. + const markdown = "[file](/src/a.ts) @problems and `x` @problems" + const { container } = render() + + // The anchor text is a stable, unique wait target. + await screen.findByText("file") + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(2) + expect(mentions[0].textContent).toBe("@problems") + expect(mentions[1].textContent).toBe("@problems") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "problems" }) + }) + it("renders a standalone mention with no surrounding text", async () => { // A mention that both starts and ends the text node exercises the // no-leading-text and no-trailing-text branches of the splitter. @@ -384,15 +420,20 @@ describe("MarkdownBlock", () => { expect(mention.getAttribute("role")).toBe("button") expect(mention.getAttribute("tabindex")).toBe("0") - fireEvent.keyDown(mention, { key: "Enter" }) + // Enter/Space must both post and be default-prevented: dispatching a + // cancelable event returns false once preventDefault has run, and Space's + // default action would otherwise scroll the expanded task panel while a + // mention has focus. + expect(fireEvent.keyDown(mention, { key: "Enter" })).toBe(false) expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) mockPostMessage.mockClear() - fireEvent.keyDown(mention, { key: " " }) + expect(fireEvent.keyDown(mention, { key: " " })).toBe(false) expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) mockPostMessage.mockClear() - fireEvent.keyDown(mention, { key: "a" }) + // An unrelated key neither posts nor prevents the default action. + expect(fireEvent.keyDown(mention, { key: "a" })).toBe(true) expect(mockPostMessage).not.toHaveBeenCalled() }) From 9fa1a40f014d6cae67a07d2b2cee0e5aabc07824 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 23 Aug 2026 17:22:55 +0800 Subject: [PATCH 12/14] fix(webview): mask reference link definitions before mention rewriting Address CodeRabbit finding on #1257: - Add definition to MENTION_MASK_NODE_TYPES so a reference link destination (e.g. [docs]: @/docs/readme.md) is masked before prepareMentions() runs. Without it, the destination was rewritten to a mention placeholder and that placeholder became the reference link's href, corrupting the href with control characters instead of rendering a mention span. - Regression test: the reference link keeps its original href, the destination never becomes a mention span, a real mention in the body stays actionable, and no placeholder control characters leak into the output. --- .../src/components/common/MarkdownBlock.tsx | 30 +++++++++++++------ .../common/__tests__/MarkdownBlock.spec.tsx | 27 +++++++++++++++++ 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index b728ac72ea..78a57958b0 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -26,9 +26,20 @@ const MENTION_PLACEHOLDER_CHAR = "\u0001" const MENTION_PLACEHOLDER_REGEX = new RegExp(`${MENTION_PLACEHOLDER_CHAR}(\\d+)${MENTION_PLACEHOLDER_CHAR}`, "g") // mdast node types whose raw source regions must never be mention-rewritten: -// code blocks (fenced or indented), inline code, links, images, raw HTML, and -// math all render as literal or non-text content. -const MENTION_MASK_NODE_TYPES = new Set(["code", "inlineCode", "link", "image", "html", "inlineMath", "math"]) +// code blocks (fenced or indented), inline code, links, images, raw HTML, math, +// and reference link definitions all render as literal or non-text content +// (rewriting a definition's destination would corrupt the reference link's +// href instead of producing a mention span). +const MENTION_MASK_NODE_TYPES = new Set([ + "code", + "inlineCode", + "link", + "image", + "html", + "inlineMath", + "math", + "definition", +]) /** * Rewrite mention patterns in the RAW markdown string before remark tokenizes @@ -44,10 +55,10 @@ const MENTION_MASK_NODE_TYPES = new Set(["code", "inlineCode", "link", "image", * Matching runs on the raw string so the shared regex's boundary rules apply * unchanged (replacing literal regions with spaces would turn a preceding `)` * or backtick into whitespace and make non-mentions actionable). Literal / non- - * text regions (code, links, images, HTML, math) are marked via a throwaway - * mdast parse with the exact positions remark sees, and a match whose range - * intersects one of them is discarded so mentions inside such regions stay - * inert. + * text regions (code, links, images, HTML, math, reference link definitions) + * are marked via a throwaway mdast parse with the exact positions remark sees, + * and a match whose range intersects one of them is discarded so mentions + * inside such regions stay inert. */ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions: string[] } { if (!markdown) { @@ -58,8 +69,9 @@ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions // reported positions match what remark will tokenize. Mark literal and // non-text regions (mdast positions carry absolute source offsets): a // mention inside any of them must stay inert, because code and links render - // as literal/interactive content, and images, raw HTML, and math keep their - // source text unchanged. + // as literal/interactive content, images, raw HTML, and math keep their + // source text unchanged, and a reference link definition's destination + // becomes the link's href (rewriting it would corrupt the href). const tree = unified().use(remarkParse).use(remarkGfm).use(remarkMath).parse(markdown) const isMasked = new Array(markdown.length).fill(false) diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index d887db3037..ee17150567 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -358,6 +358,33 @@ describe("MarkdownBlock", () => { expect(mockPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "openMention" })) }) + it("keeps reference link destinations inert and preserves the original href", async () => { + // A reference definition's destination renders as the reference link's + // href, so rewriting it to a mention placeholder would corrupt the href + // (control characters instead of the original path) rather than produce + // a mention span. The whole definition region must stay masked. + const markdown = "[docs]: @/docs/readme.md\n\nSee [docs] and @problems." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + // The reference link keeps its original href, untouched by mention + // preprocessing, and the destination never becomes a mention span. + const anchor = container.querySelector("a")! + expect(anchor).toHaveAttribute("href", "@/docs/readme.md") + expect(anchor.textContent).toBe("docs") + expect(container.querySelectorAll("a span.mention-context-highlight").length).toBe(0) + + // Masking the definition must not affect a real mention in the body. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + + // No placeholder control characters leak into the rendered output. + expect(container.textContent).not.toContain("\u0001") + expect(anchor.getAttribute("href")).not.toContain("\u0001") + }) + it("keeps the shared regex boundary rules when a mention directly follows a link or inline code", async () => { // Matching must run on the raw string so the shared regex's start boundary // sees the real characters: with no whitespace after a closing `)` or a From 0b30b0c6348169554139c2f3c5836d9c8f1bb4d3 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 23 Aug 2026 18:39:38 +0800 Subject: [PATCH 13/14] fix(webview): mask reference links and image references before mention rewriting Address CodeRabbit finding on #1257: - Add linkReference and imageReference to MENTION_MASK_NODE_TYPES so a reference link's label and an image reference's alt are masked before prepareMentions() runs. Without it, a mention pattern inside such a label (e.g. [the @problems summary][docs]) was rewritten to an indexed placeholder that remark kept inside the label; since rehypeMentions() skips anchors, the raw placeholder (control character plus index) rendered verbatim inside the link text. Image references corrupted the alt attribute the same way. - Regression tests: a mention inside a reference link label and inside an image reference alt both stay inert, the label text and alt attribute are preserved verbatim, no mention span is rendered, and no placeholder control characters leak into the output. --- .../src/components/common/MarkdownBlock.tsx | 24 +++++++----- .../common/__tests__/MarkdownBlock.spec.tsx | 37 +++++++++++++++++++ 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 78a57958b0..76c93422ba 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -27,9 +27,11 @@ const MENTION_PLACEHOLDER_REGEX = new RegExp(`${MENTION_PLACEHOLDER_CHAR}(\\d+)$ // mdast node types whose raw source regions must never be mention-rewritten: // code blocks (fenced or indented), inline code, links, images, raw HTML, math, -// and reference link definitions all render as literal or non-text content -// (rewriting a definition's destination would corrupt the reference link's -// href instead of producing a mention span). +// reference link definitions, and reference links/images all render as literal +// or non-text content. Rewriting a definition's destination would corrupt the +// reference link's href; rewriting a reference label or alt would leak the raw +// placeholder into the anchor text or img alt (rehypeMentions skips anchors), +// instead of producing a mention span. const MENTION_MASK_NODE_TYPES = new Set([ "code", "inlineCode", @@ -39,6 +41,8 @@ const MENTION_MASK_NODE_TYPES = new Set([ "inlineMath", "math", "definition", + "linkReference", + "imageReference", ]) /** @@ -55,10 +59,10 @@ const MENTION_MASK_NODE_TYPES = new Set([ * Matching runs on the raw string so the shared regex's boundary rules apply * unchanged (replacing literal regions with spaces would turn a preceding `)` * or backtick into whitespace and make non-mentions actionable). Literal / non- - * text regions (code, links, images, HTML, math, reference link definitions) - * are marked via a throwaway mdast parse with the exact positions remark sees, - * and a match whose range intersects one of them is discarded so mentions - * inside such regions stay inert. + * text regions (code, links, images, HTML, math, reference link definitions, + * and reference links/images) are marked via a throwaway mdast parse with the + * exact positions remark sees, and a match whose range intersects one of them + * is discarded so mentions inside such regions stay inert. */ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions: string[] } { if (!markdown) { @@ -70,8 +74,10 @@ function prepareMentions(markdown: string): { preparedMarkdown: string; mentions // non-text regions (mdast positions carry absolute source offsets): a // mention inside any of them must stay inert, because code and links render // as literal/interactive content, images, raw HTML, and math keep their - // source text unchanged, and a reference link definition's destination - // becomes the link's href (rewriting it would corrupt the href). + // source text unchanged, a reference link definition's destination becomes + // the link's href, and a reference link/image label or alt renders as the + // anchor text or img alt (rewriting any of them would corrupt the href/alt + // or leak the raw placeholder into the rendered output). const tree = unified().use(remarkParse).use(remarkGfm).use(remarkMath).parse(markdown) const isMasked = new Array(markdown.length).fill(false) diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index ee17150567..5091f20d6d 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -385,6 +385,43 @@ describe("MarkdownBlock", () => { expect(anchor.getAttribute("href")).not.toContain("\u0001") }) + it("keeps reference link labels inert and preserves the label text", async () => { + // A mention inside a reference link's label renders as the anchor's + // text. Rewriting it to a mention placeholder would leak the raw + // placeholder (rehypeMentions skips anchors, so the control characters + // would render verbatim inside the link) and a role=button span inside + //
would be invalid nested interactive content. The whole reference + // region must stay masked. + const markdown = "See [the @problems summary][docs] now.\n\n[docs]: https://example.com/problems" + const { container } = render() + + await screen.findByText(/now/, { exact: false }) + + const anchor = container.querySelector("a")! + expect(anchor).toHaveAttribute("href", "https://example.com/problems") + expect(anchor.textContent).toBe("the @problems summary") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + + // No placeholder control characters leak into the rendered output. + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps image reference alt text inert and preserves the alt attribute", async () => { + // An image reference's alt renders as the img's alt attribute. Rewriting + // it to a mention placeholder would corrupt the alt instead of producing + // a mention span. The whole reference region must stay masked. + const markdown = "See ![a @problems screenshot][docs] now.\n\n[docs]: https://example.com/problems.png" + const { container } = render() + + await screen.findByText(/now/, { exact: false }) + + const img = container.querySelector("img")! + expect(img).toHaveAttribute("src", "https://example.com/problems.png") + expect(img).toHaveAttribute("alt", "a @problems screenshot") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.textContent).not.toContain("\u0001") + }) + it("keeps the shared regex boundary rules when a mention directly follows a link or inline code", async () => { // Matching must run on the raw string so the shared regex's start boundary // sees the real characters: with no whitespace after a closing `)` or a From 62e7e93c8b70523f914ada97ace073d64baad453 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 30 Aug 2026 21:00:47 +0800 Subject: [PATCH 14/14] test(webview): add Story Gallery visual case for expanded TaskHeader markdown Per webview-ui/AGENTS.md, this PR changes user-visible markdown rendering, spacing, and overflow styling, so it needs a pixel receipt: - Add a task-header-markdown story to the shared gallery harness (#1446): an expanded TaskHeader with representative user-authored markdown (heading, bold, inline code, bullets, external link, soft breaks, and path/@problems/@terminal mentions) plus enough content to overflow the max-h-80 prompt box. - Add TaskHeader.visual.tsx: asserts the deterministic expanded state (heading, list items, mention spans, br soft breaks, actual overflow) and snapshots all four VS Code themes. - Baselines generated in the pinned Docker Playwright container (task-header-markdown-{dark,light,high-contrast,high-contrast-light}.png). Existing Vitest coverage (semantic behavior) is unchanged. --- webview-ui/playwright/gallery/stories.tsx | 60 ++++++++++++++++++ .../chat/__tests__/TaskHeader.visual.tsx | 43 +++++++++++++ .../task-header-markdown-dark.png | Bin 0 -> 47521 bytes ...sk-header-markdown-high-contrast-light.png | Bin 0 -> 45894 bytes .../task-header-markdown-high-contrast.png | Bin 0 -> 45497 bytes .../task-header-markdown-light.png | Bin 0 -> 47326 bytes 6 files changed, 103 insertions(+) create mode 100644 webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-light.png diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 1aa4f034df..f517b9a184 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -153,6 +153,66 @@ export const stories: Record = { ) }, + "task-header-markdown": async () => { + const [{ AppProviders }, { default: TaskHeader }] = await Promise.all([ + import("../AppProviders"), + import("@/components/chat/TaskHeader"), + ]) + // Representative user-authored prompt: heading, bold, inline code, a + // bullet list, an external link, soft breaks (single newlines), and the + // three mention kinds (path, @problems, @terminal). The length keeps the + // expanded prompt box (max-h-80) overflowing so the scrollbar surface is + // captured by the snapshot. + const prompt = [ + "# Refactor the billing module", + "", + "Update the invoice total in `src/billing/invoice.ts` so that", + "refunds apply before tax. Keep the **public API** stable while", + "moving the rounding logic into a shared helper.", + "", + "- Recalculate totals in `calculateInvoiceTotal`", + "- Emit the warning listed in @problems after the first failing assertion", + "- Re-run the demo script with @terminal", + "- Keep the behavior documented in the [billing design notes](https://example.com/docs/billing)", + "", + "Watch the edge cases in @/src/billing/invoice.ts, especially", + "the package-style exports and the cached total memo.", + "", + "The refactor should ship behind a feature flag and the", + "rollback path must stay one command away.", + ].join("\n") + const ts = 1755000000000 + return ( + +
+ undefined} + /> +
+
+ ) + }, "ui-settings": async () => { const { UISettingsStory } = await import("@/components/settings/__tests__/UISettings.visual.fixture") return diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx new file mode 100644 index 0000000000..50cf62c416 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx @@ -0,0 +1,43 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +// Pixel receipts for the expanded TaskHeader markdown surface (PR #1257): +// markdown formatting, clickable mentions, soft breaks, and the consistent +// .scrollable overflow box. Semantic behavior (toggle guards, openMention +// posts, boundary rules) stays covered by TaskHeader.spec.tsx. +for (const theme of visualThemes) { + test(`renders the expanded TaskHeader prompt as markdown in the ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("task-header-markdown")) + await applyVisualTheme(page, theme) + + // Establish the expanded state deterministically through the header + // toggle (lucide chevron-down while collapsed). + await component.locator("button:has(svg.lucide-chevron-down)").click() + + // The expanded view applies markdown: heading, list, mentions, and + // soft breaks rendered as
. + await expect(component.getByRole("heading", { name: "Refactor the billing module" })).toBeVisible() + expect(await component.locator("ul li").count()).toBe(4) + const mentions = component.locator('span.mention-context-highlight[role="button"]') + expect(await mentions.count()).toBe(3) + await expect(mentions.nth(0)).toHaveText("@problems") + await expect(mentions.nth(1)).toHaveText("@terminal") + await expect(mentions.nth(2)).toHaveText("@/src/billing/invoice.ts") + expect(await component.locator("p br").count()).toBeGreaterThan(0) + + // The prompt overflows the max-h-80 box, so the snapshot captures the + // clipped, scrollable region using the shared .scrollable (VS Code-style + // scrollbar) surface. + const scrollBox = component.locator(".scrollable") + expect(await scrollBox.count()).toBe(1) + await expect(scrollBox).toHaveClass(/max-h-80/) + const { scrollHeight, clientHeight } = await scrollBox.evaluate((el) => ({ + scrollHeight: el.scrollHeight, + clientHeight: el.clientHeight, + })) + expect(scrollHeight).toBeGreaterThan(clientHeight) + + await expect(component).toHaveScreenshot(`task-header-markdown-${theme.name}.png`) + }) +} diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b30e104b865e95c9405dd2225cae369024078a9c GIT binary patch literal 47521 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 Lqn3ZnD(HU!v2AeY literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png b/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png new file mode 100644 index 0000000000000000000000000000000000000000..124f5d47e4347197b3de41155ba5bd732162af7b GIT binary patch literal 45894 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 _Rm@B`d(KJol~hlBTJcgUt6W6J0nilT*7H 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

QrEc2zyr1qiyMM6lH+bG(j-~O;Ui5^Z|6 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 literal 0 HcmV?d00001