mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 07:50:43 +00:00
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:
committed by
Peter Steinberger
parent
7b5a18ae7a
commit
463493aa28
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user