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
This commit is contained in:
chinar-amrutkar
2026-05-03 16:16:19 +01:00
committed by Peter Steinberger
parent 7b5a18ae7a
commit 463493aa28
2 changed files with 13 additions and 2 deletions

View File

@@ -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;
}

View File

@@ -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;