From 569342b3c2073ea93d42d14395181c2123949792 Mon Sep 17 00:00:00 2001 From: bashrusakh <127580858+bashrusakh@users.noreply.github.com> Date: Thu, 25 Jun 2026 02:33:50 +1100 Subject: [PATCH] fix(markdown): preserve user code block characters (#1750) Co-authored-by: Leonid Skorobogatyy --- .../chat/message/parts/UserTextPart.test.ts | 52 ++++++++++++++++++ .../chat/message/parts/UserTextPart.tsx | 47 ++-------------- .../chat/message/parts/userTextPartContent.ts | 55 +++++++++++++++++++ 3 files changed, 112 insertions(+), 42 deletions(-) create mode 100644 packages/ui/src/components/chat/message/parts/UserTextPart.test.ts create mode 100644 packages/ui/src/components/chat/message/parts/userTextPartContent.ts diff --git a/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts b/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts new file mode 100644 index 00000000..04f72729 --- /dev/null +++ b/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, test } from 'bun:test'; + +import { prepareUserMarkdownContent } from './userTextPartContent'; + +describe('prepareUserMarkdownContent', () => { + test('keeps fenced code < and -> unescaped for the markdown renderer', () => { + const content = prepareUserMarkdownContent({ + textContent: '```rust\nlet values: Vec = vec![];\nlet next = old -> new;\n```', + skillNames: new Set(), + }); + + expect(content).toContain('Vec'); + expect(content).toContain('old -> new'); + expect(content).not.toContain('<'); + expect(content).not.toContain('->'); + }); + + test('escapes raw HTML outside fences so tags display as text', () => { + const content = prepareUserMarkdownContent({ + textContent: 'Use bold and ', + skillNames: new Set(), + }); + + expect(content).toContain('<b>bold</b>'); + expect(content).toContain('<script>alert("x")</script>'); + expect(content).not.toContain('bold'); + expect(content).not.toContain('