Skip to content

Commit b4d7721

Browse files
Prompt angle bracket visibility (#929)
* fix(web): prevent angle bracket text from being hidden in chat prompts Add disableRawHtml prop to MarkdownRenderer to prevent text like <id> from being interpreted as HTML tags. This is enabled for user questions in chat, which should not contain embedded HTML. Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com> * docs: add changelog entry for angle bracket visibility fix Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com> * docs: add PR link to changelog entry Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
1 parent 8d171f6 commit b4d7721

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
- Added PostHog events for chat UI interactions (details card expand/collapse, copy answer, table of contents toggle) and repo tracking in `wa_chat_message_sent`. [#922](https://github.com/sourcebot-dev/sourcebot/pull/922)
1212
- Added Bitbucket Cloud OAuth identity provider support (`provider: "bitbucket-cloud"`) for SSO and account-linked permission syncing. [#924](https://github.com/sourcebot-dev/sourcebot/pull/924)
1313

14+
### Fixed
15+
- Fixed text inside angle brackets (e.g., `<id>`) being hidden in chat prompt display due to HTML parsing. [#929](https://github.com/sourcebot-dev/sourcebot/pull/929)
16+
1417
## [4.11.7] - 2026-02-23
1518

1619
### Changed

packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ const ChatThreadListItemComponent = forwardRef<HTMLDivElement, ChatThreadListIte
334334
<MarkdownRenderer
335335
content={userQuestion.trim()}
336336
className="prose-p:m-0"
337+
disableRawHtml={true}
337338
/>
338339
</div>
339340

packages/web/src/features/chat/components/chatThread/markdownRenderer.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,15 @@ const remarkTocExtractor = () => {
101101
interface MarkdownRendererProps {
102102
content: string;
103103
className?: string;
104+
/**
105+
* When true, disables raw HTML parsing. This prevents text like `<id>` from
106+
* being interpreted as HTML tags. Use this for user-provided content that
107+
* shouldn't contain embedded HTML.
108+
*/
109+
disableRawHtml?: boolean;
104110
}
105111

106-
const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererProps>(({ content, className }, ref) => {
112+
const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererProps>(({ content, className, disableRawHtml = false }, ref) => {
107113
const router = useRouter();
108114

109115
const remarkPlugins = useMemo((): PluggableList => {
@@ -115,8 +121,13 @@ const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererPro
115121
}, []);
116122

117123
const rehypePlugins = useMemo((): PluggableList => {
118-
return [
119-
rehypeRaw,
124+
const plugins: PluggableList = [];
125+
126+
if (!disableRawHtml) {
127+
plugins.push(rehypeRaw);
128+
}
129+
130+
plugins.push(
120131
[
121132
rehypeSanitize,
122133
{
@@ -129,8 +140,10 @@ const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererPro
129140
} satisfies SanitizeSchema,
130141
],
131142
annotateCodeBlocks,
132-
];
133-
}, []);
143+
);
144+
145+
return plugins;
146+
}, [disableRawHtml]);
134147

135148
const renderPre = useCallback(({ children, node, ...rest }: React.JSX.IntrinsicElements['pre'] & { node?: Element }) => {
136149
if (node?.properties && node.properties.isBlock === true) {

0 commit comments

Comments
 (0)