Skip to content

🤖 fix: preserve JSX-like tags in markdown#3256

Merged
coadler merged 1 commit into
mainfrom
fix-preserve-jsx-markdown-tags
May 11, 2026
Merged

🤖 fix: preserve JSX-like tags in markdown#3256
coadler merged 1 commit into
mainfrom
fix-preserve-jsx-markdown-tags

Conversation

@coadler
Copy link
Copy Markdown
Collaborator

@coadler coadler commented May 8, 2026

Summary

Preserves JSX-like component names in chat markdown so pasted errors like <SignOutButton/> remain visible in message history instead of being parsed as unknown HTML and stripped by sanitization.

Background

Markdown rendering intentionally supports sanitized raw HTML for cases like collapsible <details> blocks. That same raw HTML path caused copied React/JSX component names in error text to be parsed as HTML elements and removed by rehype-sanitize.

Implementation

Adds a pre-rehypeRaw plugin that converts raw HTML containing tags outside the sanitize allowlist into text. Allowed sanitized HTML still flows through rehypeRaw, rehype-sanitize, and rehype-harden unchanged.

Validation

  • bun test src/browser/features/Messages/MarkdownRenderer.raw-html.test.tsx
  • bun test src/browser/features/Messages/InlineSkillMarkdown.test.tsx src/browser/features/Messages/TypewriterMarkdown.test.tsx src/browser/features/Messages/MarkdownComponents.test.tsx
  • bun x eslint --max-warnings 0 src/browser/features/Messages/MarkdownCore.tsx src/browser/features/Messages/MarkdownRenderer.raw-html.test.tsx
  • bun x prettier --check src/browser/features/Messages/MarkdownCore.tsx src/browser/features/Messages/MarkdownRenderer.raw-html.test.tsx
  • nix shell nixpkgs#shfmt nixpkgs#hadolint -c make static-check

Risks

Low. The change is limited to raw HTML markdown nodes before sanitization. Unknown tags become escaped text, while supported sanitized HTML remains available.


Generated with mux • Model: openai:gpt-5.5 • Thinking: xhigh • Cost: 2394133{MUX_COSTS_USD:-0.00}

@coadler
Copy link
Copy Markdown
Collaborator Author

coadler commented May 8, 2026

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Keep pasted component names visible in chat history by treating unknown raw HTML as literal text before rehype parses and sanitizes markdown content. Supported sanitized HTML, such as details/summary blocks, still renders normally.

---

_Generated with `mux` • Model: `openai:gpt-5.5` • Thinking: `xhigh` • Cost: `2393140{MUX_COSTS_USD:-0.00}`_

<!-- mux-attribution: model=openai:gpt-5.5 thinking=xhigh costs=0.00 -->

Co-authored-by: Mux <noreply@coder.com>
@coadler coadler force-pushed the fix-preserve-jsx-markdown-tags branch from 2417c04 to 39efa44 Compare May 8, 2026 22:19
@coadler
Copy link
Copy Markdown
Collaborator Author

coadler commented May 8, 2026

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep it up!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@coadler coadler added this pull request to the merge queue May 11, 2026
Merged via the queue into main with commit bd02fc9 May 11, 2026
24 checks passed
@coadler coadler deleted the fix-preserve-jsx-markdown-tags branch May 11, 2026 16:23
mux-bot Bot added a commit that referenced this pull request May 11, 2026
sanitizeSchema.tagNames is built locally with a concrete array literal —
`{ ...defaultSchema, tagNames: [...] }` — so after the spread it is always
defined. The `?? []` fallback that landed alongside the JSX-tag preservation
plugin (#3256) is dead defensive code: the inner spread `...(defaultSchema.tagNames ?? [])`
still guards the library type, but the outer `(sanitizeSchema.tagNames ?? [])`
on the `ALLOWED_RAW_HTML_TAG_NAMES` Set construction can never be undefined.

Drop the fallback and add a comment explaining the invariant so a future
refactor doesn't reintroduce it. Pure refactor — emitted JS, the
`rehypePreserveUnknownRawHtml` plugin, the unknown-tag preservation behavior
added in #3256, and the existing `MarkdownRenderer.raw-html` test suite are
all unchanged.

Co-authored-by: Mux <noreply@coder.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant