Skip to content

Commit 5e21fab

Browse files
authored
Merge branch 'main' into cursor/SOU-562-askgithub-update-toast-f23f
2 parents 59371fc + b4d7721 commit 5e21fab

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
@@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### Changed
1515
- Hide version upgrade toast for askgithub deployment (`EXPERIMENT_ASK_GH_ENABLED`).
1616

17+
### Fixed
18+
- 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)
19+
1720
## [4.11.7] - 2026-02-23
1821

1922
### 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)