From 00b383741143e3228149eaffc31fd4c6a9148632 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 20 Feb 2026 10:37:33 +0530 Subject: [PATCH] fix: clean telegram draft preview on dispatch errors --- src/telegram/bot-message-dispatch.test.ts | 14 ++++++++++++++ src/telegram/bot-message-dispatch.ts | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/src/telegram/bot-message-dispatch.test.ts b/src/telegram/bot-message-dispatch.test.ts index e10fe0af13a..8f47ce636b9 100644 --- a/src/telegram/bot-message-dispatch.test.ts +++ b/src/telegram/bot-message-dispatch.test.ts @@ -687,6 +687,20 @@ describe("dispatchTelegramMessage draft streaming", () => { expect(draftStream.clear).toHaveBeenCalledTimes(1); }); + it("clears preview when dispatcher throws before fallback phase", async () => { + const draftStream = createDraftStream(999); + createTelegramDraftStream.mockReturnValue(draftStream); + dispatchReplyWithBufferedBlockDispatcher.mockRejectedValue(new Error("dispatcher exploded")); + + await expect(dispatchWithContext({ context: createContext() })).rejects.toThrow( + "dispatcher exploded", + ); + + expect(draftStream.stop).toHaveBeenCalledTimes(1); + expect(draftStream.clear).toHaveBeenCalledTimes(1); + expect(deliverReplies).not.toHaveBeenCalled(); + }); + it("supports concurrent dispatches with independent previews", async () => { const draftA = createDraftStream(11); const draftB = createDraftStream(22); diff --git a/src/telegram/bot-message-dispatch.ts b/src/telegram/bot-message-dispatch.ts index 90aae566d55..ad62cf54a0b 100644 --- a/src/telegram/bot-message-dispatch.ts +++ b/src/telegram/bot-message-dispatch.ts @@ -312,6 +312,7 @@ export const dispatchTelegramMessage = async ({ }; let queuedFinal = false; + let dispatchError: unknown; try { ({ queuedFinal } = await dispatchReplyWithBufferedBlockDispatcher({ ctx: ctxPayload, @@ -487,12 +488,15 @@ export const dispatchTelegramMessage = async ({ onModelSelected, }, })); + } catch (err) { + dispatchError = err; } finally { await draftStream?.stop(); } let sentFallback = false; try { if ( + !dispatchError && !deliveryState.delivered && (deliveryState.skippedNonSilent > 0 || deliveryState.failedDeliveries > 0) ) { @@ -505,6 +509,9 @@ export const dispatchTelegramMessage = async ({ } finally { await clearDraftPreviewIfNeeded(); } + if (dispatchError) { + throw dispatchError; + } const hasFinalResponse = queuedFinal || sentFallback; if (!hasFinalResponse) {