From 0abf5aaff0e6182d5a24af3e58763c182d0cd940 Mon Sep 17 00:00:00 2001 From: MT-Mint <798521692@qq.com> Date: Fri, 24 Apr 2026 10:27:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8D=95=E4=B8=AA\n?= =?UTF-8?q?=E8=BE=93=E5=85=A5=EF=BC=8C=E6=B8=B2=E6=9F=93=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E6=8D=A2=E8=A1=8C=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspace/messages/message-list-item.tsx | 9 ++++++--- frontend/src/core/messages/utils.ts | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/workspace/messages/message-list-item.tsx b/frontend/src/components/workspace/messages/message-list-item.tsx index 52c4fa0d..7cc04ea2 100644 --- a/frontend/src/components/workspace/messages/message-list-item.tsx +++ b/frontend/src/components/workspace/messages/message-list-item.tsx @@ -28,6 +28,7 @@ import { resolveArtifactURL } from "@/core/artifacts/utils"; import { useI18n } from "@/core/i18n/hooks"; import { extractContentFromMessage, + normalizeHumanMessageDisplayText, extractReasoningContentFromMessage, parseUploadedFiles, stripPriorityHintSuffix, @@ -167,9 +168,11 @@ function MessageContent_({ const contentToDisplay = useMemo(() => { if (isHuman) { - return rawContent - ? stripPriorityHintSuffix(stripUploadedFilesTag(rawContent)) - : ""; + if (!rawContent) { + return ""; + } + const cleaned = stripPriorityHintSuffix(stripUploadedFilesTag(rawContent)); + return normalizeHumanMessageDisplayText(cleaned); } return rawContent ?? ""; }, [rawContent, isHuman]); diff --git a/frontend/src/core/messages/utils.ts b/frontend/src/core/messages/utils.ts index fe174166..37c89480 100644 --- a/frontend/src/core/messages/utils.ts +++ b/frontend/src/core/messages/utils.ts @@ -364,6 +364,20 @@ export function stripPriorityHintSuffix(content: string): string { .trim(); } +/** + * Normalize human-authored message text for markdown rendering. + * - Decode literal "\n" into real line breaks. + * - Split Chinese-numbered items (e.g. "1)...") into separate paragraphs. + */ +export function normalizeHumanMessageDisplayText(content: string): string { + return content + .replace(/\\n/g, "\n") + .replace(/\r\n?/g, "\n") + .replace(/\n(?=\d+[))]\s*)/g, "\n\n") + .replace(/\n{3,}/g, "\n\n") + .trim(); +} + export function parseUploadedFiles(content: string): FileInMessage[] { // Match ... tag const uploadedFilesRegex = /([\s\S]*?)<\/uploaded_files>/;