From ef04174194629aa833bb56a4c5326fae860b7113 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Apr 2026 09:41:28 +0800 Subject: [PATCH] Fix invalid HTML nesting in reasoning trigger during complex task rendering (#2382) * Initial plan * fix(frontend): avoid invalid paragraph nesting in reasoning trigger Agent-Logs-Url: https://github.com/bytedance/deer-flow/sessions/4c9eb0c2-ff29-4629-a61c-4e33d736d918 Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com> * test(frontend): strengthen reasoning trigger DOM nesting assertion Agent-Logs-Url: https://github.com/bytedance/deer-flow/sessions/4c9eb0c2-ff29-4629-a61c-4e33d736d918 Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com> --- .../src/components/ai-elements/reasoning.tsx | 4 +-- .../tests/unit/core/reasoning-trigger.test.ts | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 frontend/tests/unit/core/reasoning-trigger.test.ts diff --git a/frontend/src/components/ai-elements/reasoning.tsx b/frontend/src/components/ai-elements/reasoning.tsx index 5f1d2321e..b8e0bfcbc 100644 --- a/frontend/src/components/ai-elements/reasoning.tsx +++ b/frontend/src/components/ai-elements/reasoning.tsx @@ -123,9 +123,9 @@ const defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => { return Thinking...; } if (duration === undefined) { - return

Thought for a few seconds

; + return Thought for a few seconds; } - return

Thought for {duration} seconds

; + return Thought for {duration} seconds; }; export const ReasoningTrigger = memo( diff --git a/frontend/tests/unit/core/reasoning-trigger.test.ts b/frontend/tests/unit/core/reasoning-trigger.test.ts new file mode 100644 index 000000000..2fbe97977 --- /dev/null +++ b/frontend/tests/unit/core/reasoning-trigger.test.ts @@ -0,0 +1,28 @@ +import { createElement } from "react"; +import { renderToStaticMarkup } from "react-dom/server"; +import { expect, test, vi } from "vitest"; + +vi.mock("streamdown", () => ({ + Streamdown: ({ children }: { children: string }) => + createElement("div", null, children), +})); + +import { + Reasoning, + ReasoningContent, + ReasoningTrigger, +} from "@/components/ai-elements/reasoning"; + +test("ReasoningTrigger default message uses phrasing content", () => { + const html = renderToStaticMarkup( + createElement( + Reasoning, + { isStreaming: false, defaultOpen: false }, + createElement(ReasoningTrigger, null), + createElement(ReasoningContent, null, "test"), + ), + ); + + expect(html).toContain("Thought for a few seconds"); + expect(html).not.toMatch(/]*>[\s\S]*?