diff --git a/web/src/components/assistant-ui/markdown-text.tsx b/web/src/components/assistant-ui/markdown-text.tsx index 199067890..2f61a17a4 100644 --- a/web/src/components/assistant-ui/markdown-text.tsx +++ b/web/src/components/assistant-ui/markdown-text.tsx @@ -6,12 +6,13 @@ import { type CodeHeaderProps, } from '@assistant-ui/react-markdown' import remarkGfm from 'remark-gfm' +import remarkDisableIndentedCode from '@/lib/remark-disable-indented-code' import { cn } from '@/lib/utils' import { SyntaxHighlighter } from '@/components/assistant-ui/shiki-highlighter' import { useCopyToClipboard } from '@/hooks/useCopyToClipboard' import { CopyIcon, CheckIcon } from '@/components/icons' -export const MARKDOWN_PLUGINS = [remarkGfm] +export const MARKDOWN_PLUGINS = [remarkGfm, remarkDisableIndentedCode] function CodeHeader(props: CodeHeaderProps) { const { copied, copy } = useCopyToClipboard() diff --git a/web/src/lib/remark-disable-indented-code.ts b/web/src/lib/remark-disable-indented-code.ts new file mode 100644 index 000000000..833a5cd99 --- /dev/null +++ b/web/src/lib/remark-disable-indented-code.ts @@ -0,0 +1,14 @@ +/** + * Remark plugin that disables indented code blocks (4-space indent). + * + * In CommonMark, text indented by 4+ spaces becomes a code block. This + * frequently misparses LLM output where numbered-list items with nested + * content or quoted text are indented. Fenced code blocks (``` … ```) + * still work normally. + */ +export default function remarkDisableIndentedCode(this: unknown) { + const processor = this as { data(key: string, value?: unknown): unknown } + const micromarkExtensions = (processor.data('micromarkExtensions') ?? []) as unknown[] + micromarkExtensions.push({ disable: { null: ['codeIndented'] } }) + processor.data('micromarkExtensions', micromarkExtensions) +}