From 463493aa283422e865b9f69b0e8d5ab5a8a34c87 Mon Sep 17 00:00:00 2001 From: chinar-amrutkar Date: Sun, 3 May 2026 16:16:19 +0100 Subject: [PATCH] fix(telegram): suppress stale replies when dispatch is superseded When a newer inbound message arrives while an older dispatch is still processing, buffered final answers from the old dispatch could be delivered into the new message's thread. Add `bufferedGeneration` to `BufferedFinalAnswer` to track which abort fence generation buffered the answer. `takeBufferedFinalAnswer` now rejects buffered answers whose generation doesn't match the current dispatch's generation, preventing stale content delivery. Fixes #76642 --- extensions/telegram/src/bot-message-dispatch.ts | 3 ++- .../telegram/src/reasoning-lane-coordinator.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/extensions/telegram/src/bot-message-dispatch.ts b/extensions/telegram/src/bot-message-dispatch.ts index ac7c1b1aa7c..2c988229c6c 100644 --- a/extensions/telegram/src/bot-message-dispatch.ts +++ b/extensions/telegram/src/bot-message-dispatch.ts @@ -907,7 +907,7 @@ export const dispatchTelegramMessage = async ({ const _hasMedia = reply.hasMedia; const flushBufferedFinalAnswer = async () => { - const buffered = reasoningStepState.takeBufferedFinalAnswer(); + const buffered = reasoningStepState.takeBufferedFinalAnswer(abortFenceGeneration); if (!buffered) { return; } @@ -935,6 +935,7 @@ export const dispatchTelegramMessage = async ({ reasoningStepState.bufferFinalAnswer({ payload, text: segment.text, + bufferedGeneration: abortFenceGeneration, }); continue; } diff --git a/extensions/telegram/src/reasoning-lane-coordinator.ts b/extensions/telegram/src/reasoning-lane-coordinator.ts index 447b60dd1d0..182de6202cd 100644 --- a/extensions/telegram/src/reasoning-lane-coordinator.ts +++ b/extensions/telegram/src/reasoning-lane-coordinator.ts @@ -93,6 +93,7 @@ export function splitTelegramReasoningText(text?: string): TelegramReasoningSpli type BufferedFinalAnswer = { payload: ReplyPayload; text: string; + bufferedGeneration?: number; }; export function createTelegramReasoningStepState() { @@ -117,7 +118,16 @@ export function createTelegramReasoningStepState() { bufferedFinalAnswer = value; }; - const takeBufferedFinalAnswer = (): BufferedFinalAnswer | undefined => { + const takeBufferedFinalAnswer = ( + currentGeneration?: number, + ): BufferedFinalAnswer | undefined => { + if ( + currentGeneration !== undefined && + bufferedFinalAnswer?.bufferedGeneration !== undefined && + bufferedFinalAnswer.bufferedGeneration !== currentGeneration + ) { + return undefined; + } const value = bufferedFinalAnswer; bufferedFinalAnswer = undefined; return value;