



















@@ -26,6 +26,7 @@ const mockState = vi.hoisted(() => ({
2626sensitiveMedia?: boolean;
2727replyToId?: string;
2828replyToCurrent?: boolean;
29+isReasoning?: boolean;
2930} | null,
3031dispatchedReplies: [] as Array<{
3132kind: "tool" | "block" | "final";
@@ -36,6 +37,7 @@ const mockState = vi.hoisted(() => ({
3637trustedLocalMedia?: boolean;
3738replyToId?: string;
3839replyToCurrent?: boolean;
40+isReasoning?: boolean;
3941};
4042}>,
4143dispatchError: null as Error | null,
@@ -114,6 +116,7 @@ vi.mock("../../auto-reply/dispatch.js", () => ({
114116sensitiveMedia?: boolean;
115117replyToId?: string;
116118replyToCurrent?: boolean;
119+isReasoning?: boolean;
117120}) => boolean;
118121sendBlockReply: (payload: {
119122text?: string;
@@ -122,6 +125,7 @@ vi.mock("../../auto-reply/dispatch.js", () => ({
122125trustedLocalMedia?: boolean;
123126replyToId?: string;
124127replyToCurrent?: boolean;
128+isReasoning?: boolean;
125129}) => boolean;
126130sendToolResult: (payload: {
127131text?: string;
@@ -130,6 +134,7 @@ vi.mock("../../auto-reply/dispatch.js", () => ({
130134trustedLocalMedia?: boolean;
131135replyToId?: string;
132136replyToCurrent?: boolean;
137+isReasoning?: boolean;
133138}) => boolean;
134139markComplete: () => void;
135140waitForIdle: () => Promise<void>;
@@ -599,6 +604,31 @@ describe("chat directive tag stripping for non-streaming final payloads", () =>
599604expect(JSON.stringify(payload?.message)).not.toContain("MEDIA:data:image/png;base64,cG5n");
600605});
601606607+it("suppresses reasoning payloads from webchat transcript replies", async () => {
608+createTranscriptFixture("openclaw-chat-send-reasoning-hidden-");
609+mockState.dispatchedReplies = [
610+{
611+kind: "final",
612+payload: { text: "Reasoning:\n_step_", isReasoning: true },
613+},
614+{
615+kind: "final",
616+payload: { text: "final answer" },
617+},
618+];
619+const respond = vi.fn();
620+const context = createChatContext();
621+622+const payload = await runNonStreamingChatSend({
623+ context,
624+ respond,
625+idempotencyKey: "idem-reasoning-hidden",
626+});
627+628+expect(JSON.stringify(payload?.message)).toContain("final answer");
629+expect(JSON.stringify(payload?.message)).not.toContain("Reasoning");
630+});
631+602632it("chat.inject keeps message defined when directive tag is the only content", async () => {
603633createTranscriptFixture("openclaw-chat-inject-directive-only-");
604634const respond = vi.fn();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。