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>
This commit is contained in:
Copilot 2026-04-21 09:41:28 +08:00 committed by GitHub
parent 6dce26a52e
commit ef04174194
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 2 deletions

View File

@ -123,9 +123,9 @@ const defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => {
return <Shimmer duration={1}>Thinking...</Shimmer>;
}
if (duration === undefined) {
return <p>Thought for a few seconds</p>;
return <span>Thought for a few seconds</span>;
}
return <p>Thought for {duration} seconds</p>;
return <span>Thought for {duration} seconds</span>;
};
export const ReasoningTrigger = memo(

View File

@ -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(/<button\b[^>]*>[\s\S]*?<p\b/i);
});