diff --git a/src/telegram/bot-message-dispatch.test.ts b/src/telegram/bot-message-dispatch.test.ts index c5c98f3e006..eb04c8e5803 100644 --- a/src/telegram/bot-message-dispatch.test.ts +++ b/src/telegram/bot-message-dispatch.test.ts @@ -259,4 +259,44 @@ describe("dispatchTelegramMessage draft streaming", () => { }), ); }); + + it("does not overwrite preview with subsequent final payloads", async () => { + const draftStream = createDraftStream(999); + createTelegramDraftStream.mockReturnValue(draftStream); + dispatchReplyWithBufferedBlockDispatcher.mockImplementation( + async ({ dispatcherOptions, replyOptions }) => { + await replyOptions?.onPartialReply?.({ text: "Checking..." }); + // First final payload: model text → edits the preview. + await dispatcherOptions.deliver({ text: "Here are your results" }, { kind: "final" }); + // Second final payload: tool error warning → should NOT overwrite the preview. + await dispatcherOptions.deliver( + { text: "⚠️ 🛠️ Exec: cmd failed: error" }, + { kind: "final" }, + ); + return { queuedFinal: true }; + }, + ); + deliverReplies.mockResolvedValue({ delivered: true }); + editMessageTelegram.mockResolvedValue({ ok: true, chatId: "123", messageId: "999" }); + + await dispatchWithContext({ context: createContext() }); + + // Preview should be edited only once with the first final payload. + expect(editMessageTelegram).toHaveBeenCalledTimes(1); + expect(editMessageTelegram).toHaveBeenCalledWith( + 123, + 999, + "Here are your results", + expect.any(Object), + ); + // Second final payload should fall through to deliverReplies as a new message. + expect(deliverReplies).toHaveBeenCalledTimes(1); + expect(deliverReplies).toHaveBeenCalledWith( + expect.objectContaining({ + replies: [expect.objectContaining({ text: "⚠️ 🛠️ Exec: cmd failed: error" })], + }), + ); + // Preview should NOT be cleared since it was finalized via edit. + expect(draftStream.clear).not.toHaveBeenCalled(); + }); }); diff --git a/src/telegram/bot-message-dispatch.ts b/src/telegram/bot-message-dispatch.ts index 361a897185c..e34a245a346 100644 --- a/src/telegram/bot-message-dispatch.ts +++ b/src/telegram/bot-message-dispatch.ts @@ -287,7 +287,12 @@ export const dispatchTelegramMessage = async ({ | undefined )?.buttons; let draftStoppedForPreviewEdit = false; - if (!hasMedia && payload.text && typeof previewMessageId === "number") { + if ( + !finalizedViaPreviewMessage && + !hasMedia && + payload.text && + typeof previewMessageId === "number" + ) { const canFinalizeViaPreviewEdit = payload.text.length <= draftMaxChars; if (canFinalizeViaPreviewEdit) { draftStream?.stop();