From e75cb04ef040b5020045059c0db62d653d083614 Mon Sep 17 00:00:00 2001 From: hougangdev Date: Tue, 10 Mar 2026 23:58:33 +0800 Subject: [PATCH] fix(telegram): gate sendMayHaveLanded retention to final context only In update context, the caller doesn't treat 'retained' as success and falls through to sendPayload. Calling markDelivered() prematurely in update context can leave delivery state inconsistent. --- src/telegram/lane-delivery-text-deliverer.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/telegram/lane-delivery-text-deliverer.ts b/src/telegram/lane-delivery-text-deliverer.ts index 4bb0392d330..8c4b4480a69 100644 --- a/src/telegram/lane-delivery-text-deliverer.ts +++ b/src/telegram/lane-delivery-text-deliverer.ts @@ -382,9 +382,11 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { context, }); if (typeof previewTargetAfterStop.previewMessageId !== "number") { - // Only retain when a prior preview is already visible to the user — - // otherwise falling back is safer than silence. - if (lane.hasStreamedMessage && lane.stream?.sendMayHaveLanded?.()) { + // Only retain for final delivery when a prior preview is already visible + // to the user — otherwise falling back is safer than silence. For updates, + // always fall back so the caller can attempt sendPayload without stale + // markDelivered() state. + if (context === "final" && lane.hasStreamedMessage && lane.stream?.sendMayHaveLanded?.()) { params.log( `telegram: ${laneName} preview send may have landed despite missing message id; keeping to avoid duplicate`, );