












@@ -1028,6 +1028,61 @@ describe("chat directive tag stripping for non-streaming final payloads", () =>
10281028expect(assistantEntries).toStrictEqual([]);
10291029});
103010301031+it("does not duplicate media-bearing internal-ui source replies in the transcript", async () => {
1032+createTranscriptFixture("openclaw-chat-send-agent-source-reply-media-");
1033+mockState.triggerAgentRunStart = true;
1034+const sourceReply = setReplyPayloadMetadata(
1035+{
1036+text: "Codex source reply with media",
1037+mediaUrls: ["https://example.com/chart.png"],
1038+},
1039+{
1040+sourceReplyTranscriptMirror: {
1041+sessionKey: "main",
1042+text: "Codex source reply with media",
1043+mediaUrls: ["https://example.com/chart.png"],
1044+idempotencyKey: "idem-agent-source-reply-media:internal-source-reply:0",
1045+},
1046+},
1047+);
1048+mockState.dispatchedReplies = [
1049+{
1050+kind: "final",
1051+payload: sourceReply,
1052+},
1053+];
1054+const respond = vi.fn();
1055+const context = createChatContext();
1056+1057+const broadcast = await runNonStreamingChatSend({
1058+ context,
1059+ respond,
1060+idempotencyKey: "idem-agent-source-reply-media",
1061+message: "hello from codex",
1062+});
1063+1064+expect(broadcast).toMatchObject({
1065+runId: "idem-agent-source-reply-media",
1066+sessionKey: "main",
1067+state: "final",
1068+});
1069+expect(extractFirstTextBlock(broadcast)).toBe("Codex source reply with media");
1070+const assistantUpdates = mockState.emittedTranscriptUpdates.filter(
1071+(update) =>
1072+typeof update.message === "object" &&
1073+update.message !== null &&
1074+(update.message as { role?: unknown }).role === "assistant",
1075+);
1076+expect(assistantUpdates).toStrictEqual([]);
1077+const transcriptLines = readTranscriptJsonLines(mockState.transcriptPath);
1078+const assistantEntries = transcriptLines.filter(
1079+(entry) =>
1080+(entry as { message?: { role?: string } }).message?.role === "assistant" ||
1081+(entry as { role?: string }).role === "assistant",
1082+);
1083+expect(assistantEntries).toStrictEqual([]);
1084+});
1085+10311086it("does not broadcast an error terminal after an internal-ui source reply final", async () => {
10321087createTranscriptFixture("openclaw-chat-send-agent-source-reply-error-");
10331088mockState.triggerAgentRunStart = true;
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。